From 22cb7fb6b772a2adbe82dd08d07ff970bfea8196 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 31 May 2026 23:06:03 +0100 Subject: [PATCH] chore(lint): enable no-promise-executor-return --- .oxlintrc.json | 1 + extensions/acpx/src/process-reaper.ts | 7 +- extensions/active-memory/index.test.ts | 16 +- .../src/browser/cdp.helpers.internal.test.ts | 16 +- extensions/browser/src/browser/cdp.helpers.ts | 4 +- .../browser/src/browser/cdp.internal.test.ts | 24 ++- extensions/browser/src/browser/cdp.test.ts | 34 +++- .../src/browser/chrome.internal.test.ts | 40 +++- .../chrome.loopback-ssrf.integration.test.ts | 14 +- extensions/browser/src/browser/chrome.test.ts | 36 +++- extensions/browser/src/browser/chrome.ts | 16 +- .../client-fetch.attach-only.e2e.test.ts | 8 +- .../browser/src/browser/pw-session.test.ts | 4 +- extensions/browser/src/browser/pw-session.ts | 4 +- .../src/browser/pw-tools-core.interactions.ts | 4 +- .../browser/src/browser/routes/agent.act.ts | 4 +- .../browser/routes/agent.snapshot-target.ts | 4 +- .../browser/server-context.availability.ts | 8 +- .../src/browser/server-context.tab-ops.ts | 4 +- .../server.agent-contract.test-harness.ts | 4 +- .../server.auth-token-gates-http.test.ts | 4 +- extensions/canvas/src/host/server.ts | 10 +- extensions/clickclack/src/gateway.test.ts | 4 +- extensions/clickclack/src/gateway.ts | 4 +- .../codex-supervisor/src/supervisor.test.ts | 16 +- .../src/app-server/attempt-timeouts.test.ts | 4 +- .../codex/src/app-server/client.test.ts | 2 +- .../app-server/dynamic-tool-execution.test.ts | 4 +- .../src/app-server/event-projector.test.ts | 4 +- .../app-server/run-attempt-test-harness.ts | 4 +- .../src/app-server/run-attempt.hooks.test.ts | 4 +- .../codex/src/app-server/run-attempt.test.ts | 94 +++++++--- .../run-attempt.turn-watches.test.ts | 142 ++++++++++---- .../sandbox-exec-server.test-helpers.ts | 4 +- .../src/app-server/shared-client.test.ts | 10 +- .../src/app-server/side-question.test.ts | 4 +- .../app-server/transport-websocket.test.ts | 18 +- .../codex/src/conversation-binding.test.ts | 4 +- extensions/codex/src/migration/apply.ts | 4 +- extensions/comfy/workflow-runtime.ts | 8 +- extensions/copilot/harness.test.ts | 4 +- extensions/copilot/src/attempt.test.ts | 4 +- .../diagnostics-otel/src/service.test.ts | 36 ++-- .../monitor/message-handler.process.test.ts | 16 +- .../native-command-model-picker-apply.ts | 12 +- .../src/monitor/provider.proxy.test.ts | 4 +- .../discord/src/voice/manager.e2e.test.ts | 16 +- extensions/fal/video-generation-provider.ts | 4 +- extensions/feishu/src/app-registration.ts | 4 +- extensions/feishu/src/monitor.comment.ts | 4 +- .../src/monitor.webhook.test-helpers.ts | 16 +- .../feishu/src/reply-dispatcher.test.ts | 4 +- .../feishu/src/sequential-queue.test.ts | 4 +- extensions/feishu/src/setup-surface.ts | 4 +- extensions/github-copilot/login.ts | 4 +- extensions/google-meet/src/realtime-node.ts | 4 +- .../google-meet/src/transports/chrome.ts | 4 +- extensions/google/embedding-batch.ts | 4 +- extensions/google/oauth.project.ts | 4 +- ...nitor.shutdown.unhandled-rejection.test.ts | 4 +- extensions/line/src/monitor.lifecycle.test.ts | 4 +- .../src/matrix/actions/verification.test.ts | 2 +- .../src/matrix/monitor/verification-events.ts | 6 +- extensions/matrix/src/matrix/sdk.test.ts | 6 +- .../src/memory/manager-embedding-ops.ts | 4 +- .../src/memory/qmd-manager.test.ts | 8 +- .../memory-core/src/memory/qmd-manager.ts | 8 +- .../memory-core/src/tools.citations.test.ts | 4 +- extensions/memory-core/src/tools.test.ts | 4 +- extensions/memory-lancedb/index.test.ts | 2 +- extensions/memory-wiki/src/compile.test.ts | 4 +- extensions/minimax/oauth.ts | 4 +- .../msteams/src/monitor.lifecycle.test.ts | 4 +- extensions/ollama/src/stream-runtime.test.ts | 4 +- extensions/openai/embedding-batch.ts | 4 +- .../openai/openai-chatgpt-device-code.ts | 6 +- .../openai/openai-chatgpt-oauth.runtime.ts | 2 +- extensions/openai/openai.live.test.ts | 4 +- extensions/openai/realtime-voice-provider.ts | 4 +- extensions/openrouter/openrouter.live.test.ts | 4 +- extensions/openshell/src/backend.e2e.test.ts | 4 +- extensions/qa-lab/src/bus-state.test.ts | 4 +- extensions/qa-lab/src/cli.runtime.ts | 2 +- .../qa-lab/src/docker-up.runtime.test.ts | 6 +- extensions/qa-lab/src/gateway-child.ts | 4 +- .../qa-lab/src/lab-server-capture.test.ts | 6 +- extensions/qa-lab/src/lab-server.test.ts | 6 +- .../discord/discord-live.runtime.ts | 24 ++- .../shared/credential-lease.runtime.ts | 6 +- .../slack/slack-live.runtime.ts | 34 +++- .../telegram/telegram-live.runtime.ts | 8 +- .../whatsapp/whatsapp-live.runtime.ts | 28 ++- extensions/qa-lab/src/suite-planning.ts | 6 +- .../qa-lab/src/suite-runtime-agent-media.ts | 4 +- .../qa-lab/src/suite-runtime-agent-process.ts | 4 +- .../runners/contract/scenario-runtime-cli.ts | 4 +- .../qqbot/src/engine/api/media-chunked.ts | 4 +- extensions/qqbot/src/engine/api/retry.ts | 4 +- .../engine/gateway/outbound-dispatch.test.ts | 4 +- .../src/engine/gateway/outbound-dispatch.ts | 6 +- .../src/engine/messaging/outbound-deliver.ts | 6 +- .../src/engine/messaging/streaming-c2c.ts | 4 +- .../engine/messaging/streaming-media-send.ts | 6 +- extensions/qqbot/src/engine/utils/audio.ts | 4 +- extensions/signal/src/client-adapter.test.ts | 5 +- extensions/slack/src/monitor.test-helpers.ts | 5 +- extensions/slack/src/send.ts | 6 +- .../synology-chat/src/webhook-handler.ts | 6 +- .../telegram/src/message-dispatch-dedupe.ts | 4 +- extensions/telegram/src/probe.ts | 4 +- .../src/telegram-ingress-worker.runtime.ts | 4 +- .../telegram/src/thread-bindings.test.ts | 8 +- .../telegram/src/update-offset-store.test.ts | 4 +- extensions/telegram/src/webhook.test.ts | 4 +- extensions/tlon/src/urbit/sse-client.ts | 8 +- extensions/twitch/src/plugin.live.test.ts | 4 +- .../voice-call/src/manager.notify.test.ts | 4 +- .../voice-call/src/media-stream.test.ts | 12 +- extensions/voice-call/src/providers/twilio.ts | 4 +- extensions/voice-call/src/tunnel.test.ts | 4 +- .../src/webhook/realtime-handler.ts | 6 +- extensions/voyage/embedding-batch.ts | 5 +- .../whatsapp/src/auto-reply.test-harness.ts | 4 +- ...o-reply.connection-and-logging.e2e.test.ts | 4 +- .../auto-reply/monitor/inbound-dispatch.ts | 12 +- .../src/auto-reply/monitor/last-route.test.ts | 4 +- extensions/whatsapp/src/login-qr.test.ts | 9 +- extensions/whatsapp/src/login-qr.ts | 10 +- .../src/monitor-inbox.test-harness.ts | 8 +- extensions/whatsapp/src/session.test.ts | 4 +- extensions/workboard/src/store.test.ts | 4 +- .../realtime-transcription-provider.test.ts | 12 +- extensions/xai/xai-oauth.ts | 12 +- extensions/zalo/src/monitor.lifecycle.test.ts | 4 +- extensions/zalo/src/monitor.ts | 4 +- .../test-support/lifecycle-test-support.ts | 4 +- extensions/zalouser/src/probe.test.ts | 4 +- extensions/zalouser/src/probe.ts | 6 +- .../zalouser/src/zalo-js.credentials.test.ts | 2 +- .../src/client.watchdog.test.ts | 8 +- packages/llm-core/src/utils/event-stream.ts | 6 +- .../src/read-response-with-limit.test.ts | 6 +- .../src/host/embeddings.test.ts | 4 +- .../memory-host-sdk/src/host/retry-utils.ts | 4 +- packages/sdk/src/index.e2e.test.ts | 8 +- scripts/anthropic-prompt-probe.ts | 8 +- scripts/check-gateway-watch-regression.mjs | 4 +- scripts/check-memory-fd-repro.mjs | 4 +- scripts/control-ui-i18n.ts | 4 +- .../dev/discord-acp-plain-language-smoke.ts | 4 +- scripts/dev/ios-node-e2e.ts | 4 +- scripts/dev/tui-pty-test-watch.ts | 4 +- scripts/e2e/kitchen-sink-rpc-walk.mjs | 4 +- scripts/e2e/lib/config-reload/assert-log.mjs | 5 +- scripts/e2e/lib/gateway-network/client.mjs | 9 +- scripts/e2e/lib/plugin-update/probe.mjs | 9 +- .../lib/release-user-journey/assertions.mjs | 8 +- .../lib/upgrade-survivor/probe-gateway.mjs | 4 +- scripts/e2e/npm-telegram-rtt-credentials.mjs | 8 +- scripts/e2e/npm-telegram-rtt-driver.mjs | 4 +- scripts/e2e/parallels/guest-transports.ts | 4 +- scripts/e2e/parallels/host-server.ts | 8 +- scripts/e2e/parallels/npm-update-smoke.ts | 4 +- scripts/e2e/parallels/package-artifact.ts | 4 +- scripts/e2e/secret-provider-integrations.mjs | 54 ++---- scripts/e2e/telegram-user-crabbox-proof.ts | 16 +- scripts/embedded-run-abort-leak.ts | 8 +- scripts/lib/gateway-bench-child.ts | 8 +- scripts/lib/release-beta-verifier.ts | 4 +- scripts/openclaw-cross-os-release-checks.ts | 4 +- scripts/qa-otel-smoke.ts | 8 +- scripts/release-beta-smoke.ts | 10 +- scripts/release-candidate-checklist.mjs | 4 +- scripts/run-node.mjs | 5 +- .../verify-plugin-npm-published-runtime.mjs | 4 +- scripts/watch-node.mjs | 5 +- scripts/write-cli-compat.ts | 8 +- .../manager.turn-results.test.ts | 8 +- src/agents/agent-bundle-mcp-runtime.test.ts | 15 +- .../agent-tools.before-tool-call.e2e.test.ts | 10 +- .../oauth.concurrent-agents.test.ts | 4 +- ...sh-tools.exec-runtime.pty-fallback.test.ts | 4 +- src/agents/bash-tools.exec-runtime.test.ts | 4 +- .../bash-tools.exec.background-abort.test.ts | 4 +- src/agents/bash-tools.test.ts | 10 +- src/agents/cli-runner.ts | 8 +- .../cli-runner/bundle-mcp.gemini.live.test.ts | 6 +- src/agents/code-mode.test.ts | 4 +- src/agents/context.lookup.test.ts | 4 +- ...t-runner.compaction-safety-timeout.test.ts | 5 +- .../context-engine-maintenance.test.ts | 4 +- .../attempt.model-diagnostic-events.test.ts | 12 +- .../run/attempt.session-lock.test.ts | 4 +- .../run/llm-idle-timeout.test.ts | 4 +- src/agents/embedded-agent-runner/runs.ts | 4 +- ...t-subscribe.block-reply-rejections.test.ts | 4 +- ...agent-subscribe.compaction-test-helpers.ts | 4 +- ...oes-not-append-text-end-content-is.test.ts | 4 +- src/agents/harness/native-hook-relay.test.ts | 12 +- src/agents/harness/native-hook-relay.ts | 4 +- src/agents/harness/v2.test.ts | 4 +- src/agents/model-catalog-browse.test.ts | 2 +- src/agents/model-provider-auth.test.ts | 4 +- src/agents/model-provider-auth.ts | 4 +- src/agents/moonshot.live.test.ts | 4 +- src/agents/openai-transport-stream.test.ts | 18 +- src/agents/openclaw-tools.sessions.test.ts | 4 +- src/agents/sandbox/browser.ts | 4 +- src/agents/session-write-lock.ts | 4 +- src/agents/subagent-announce-capture.ts | 4 +- src/agents/subagent-announce-delivery.ts | 4 +- src/agents/subagent-announce-output.ts | 4 +- src/agents/subagent-announce.live.test.ts | 4 +- .../subagent-registry.steer-restart.test.ts | 4 +- src/agents/tool-search.test.ts | 4 +- src/agents/tools/transcripts-tool.test.ts | 4 +- src/agents/tools/web-tools.fetch.test.ts | 8 +- src/auto-reply/inbound.test.ts | 4 +- .../reply/agent-runner-execution.test.ts | 32 +++- .../agent-runner.runreplyagent.e2e.test.ts | 4 +- src/auto-reply/reply/commands-models.test.ts | 2 +- .../dispatch-from-config.acp-abort.test.ts | 4 +- .../reply/dispatch-from-config.test.ts | 8 +- src/auto-reply/reply/followup-runner.test.ts | 8 +- src/auto-reply/reply/queue.collect.test.ts | 12 +- src/auto-reply/reply/queue.dedupe.test.ts | 4 +- .../reply/queue.drain-restart.test.ts | 36 +++- .../reply/queue/drain.identity-guard.test.ts | 4 +- src/cli/cron-cli/register.cron-simple.ts | 4 +- src/cli/gateway-cli/run-loop.test.ts | 176 +++++++++++++----- src/cli/gateway-cli/run.ts | 6 +- src/cli/program/message/helpers.test.ts | 2 +- src/cli/prompt.test.ts | 2 +- src/cli/proxy-cli.runtime.ts | 2 +- src/commands/agent-via-gateway.test.ts | 8 +- .../doctor-whatsapp-responsiveness.ts | 4 +- src/commands/gateway-readiness.ts | 4 +- src/commands/sessions-tail.test.ts | 4 +- src/config/io.clobber-snapshot.ts | 4 +- src/config/sessions/store.ts | 4 +- src/config/sessions/transcript-append.ts | 4 +- src/cron/isolated-agent/subagent-followup.ts | 4 +- src/cron/service/timer.ts | 4 +- src/docker-setup.e2e.test.ts | 4 +- src/gateway/agent-command.test-helpers.ts | 5 +- src/gateway/client.watchdog.test.ts | 4 +- ...drain-active-sessions-for-shutdown.test.ts | 2 +- .../gateway-cli-backend.connect.test.ts | 4 +- .../gateway-cli-backend.live-helpers.ts | 4 +- .../gateway-cli-backend.live-probe-helpers.ts | 4 +- src/gateway/gateway-cli-backend.live.test.ts | 4 +- .../gateway-models.profiles.live.test.ts | 8 +- .../gateway-trajectory-export.live.test.ts | 4 +- src/gateway/managed-image-attachments.test.ts | 30 +-- src/gateway/probe.close-drain.test.ts | 4 +- src/gateway/server-close.test.ts | 16 +- src/gateway/server-close.ts | 10 +- src/gateway/server-http.request-trace.test.ts | 6 +- src/gateway/server-http.test-harness.ts | 5 +- src/gateway/server-methods/agent.test.ts | 8 +- .../server-methods/channels.status.test.ts | 2 +- .../chat.directive-tags.test.ts | 6 +- .../server-methods/config.test-helpers.ts | 4 +- src/gateway/server-methods/nodes.ts | 4 +- .../server-methods/tools-effective.test.ts | 4 +- src/gateway/server-reload-handlers.test.ts | 4 +- .../server-startup-post-attach.test.ts | 8 +- src/gateway/server-startup-post-attach.ts | 4 +- ...erver.agent.gateway-server-agent-b.test.ts | 8 +- .../server.auth.browser-hardening.test.ts | 4 +- src/gateway/server.auth.control-ui.suite.ts | 8 +- .../server.auth.default-token.suite.ts | 24 ++- src/gateway/server.auth.shared.ts | 8 +- .../server.chat.gateway-server-chat.test.ts | 16 +- .../server.device-token-rotate-authz.test.ts | 8 +- src/gateway/server.e2e-ws-harness.ts | 4 +- .../server.models-voicewake-misc.test.ts | 14 +- ...server.node-invoke-approval-bypass.test.ts | 16 +- ...server.plugin-node-capability-auth.test.ts | 18 +- ...preauth-bootstrap-token-rate-limit.test.ts | 4 +- src/gateway/server.preauth-hardening.test.ts | 10 +- .../server.sessions.permissions-hooks.test.ts | 12 +- .../server.sessions.reset-cleanup.test.ts | 4 +- .../server.shared-auth-rotation.test.ts | 4 +- .../server/ws-connection/auth-context.test.ts | 4 +- ...essage-handler.post-connect-health.test.ts | 4 +- src/gateway/session-transcript-index.fs.ts | 4 +- src/gateway/session-utils.fs.ts | 4 +- src/gateway/session-utils.ts | 4 +- src/gateway/test-helpers.e2e.ts | 4 +- src/gateway/test-helpers.mocks.ts | 4 +- src/gateway/test-helpers.server.ts | 4 +- src/gateway/test-helpers.speech.ts | 6 +- .../tools-invoke-http.cron-regression.test.ts | 4 +- src/gateway/tools-invoke-http.test.ts | 4 +- src/infra/approval-handler-bootstrap.test.ts | 4 +- src/infra/approval-handler-runtime.test.ts | 24 ++- src/infra/archive-helpers.test.ts | 4 +- src/infra/backup-create.ts | 4 +- src/infra/diagnostic-events.test.ts | 36 +++- src/infra/diagnostic-events.ts | 4 +- src/infra/fetch.test.ts | 4 +- src/infra/gateway-lock.ts | 6 +- src/infra/http-body.test.ts | 4 +- src/infra/net/http-connect-tunnel.test.ts | 4 +- src/infra/outbound/deliver.test.ts | 4 +- src/infra/package-dist-inventory.ts | 4 +- src/infra/ports-probe.test.ts | 4 +- src/infra/ports.test.ts | 12 +- src/infra/provider-usage.shared.test.ts | 4 +- src/infra/session-cost-usage.test.ts | 4 +- src/infra/ssh-tunnel.ts | 4 +- src/infra/tailscale.ts | 4 +- src/infra/warning-filter.test.ts | 4 +- src/infra/watch-node.test.ts | 48 +++-- src/logging/diagnostic-log-events.test.ts | 4 +- src/logging/diagnostic-stability.test.ts | 16 +- ...stuck-session-recovery.integration.test.ts | 4 +- src/logging/diagnostic.test.ts | 4 +- .../test-helpers/diagnostic-log-capture.ts | 4 +- ...erver.shutdown-unhandled-rejection.test.ts | 4 +- src/media-understanding/shared.ts | 8 +- src/media/input-files.fetch-guard.test.ts | 4 +- src/plugin-sdk/keyed-async-queue.test.ts | 4 +- src/plugin-sdk/provider-stream-shared.test.ts | 4 +- src/plugin-sdk/provider-stream.test.ts | 4 +- .../test-helpers/http-test-server.ts | 4 +- src/plugin-sdk/test-helpers/stt-live-audio.ts | 8 +- .../contracts/host-hooks.contract.test.ts | 4 +- .../run-context-lifecycle.contract.test.ts | 12 +- src/plugins/conversation-binding.test.ts | 4 +- .../hooks.model-override-wiring.test.ts | 6 +- src/plugins/install.npm-spec.e2e.test.ts | 12 +- .../proxy-server.managed-proxy.test.ts | 12 +- src/proxy-capture/runtime.test.ts | 12 +- .../websocket-session.test.ts | 12 +- .../websocket-session.ts | 4 +- src/security/audit-sandbox-browser.test.ts | 12 +- src/skills/lifecycle/upload-store.test.ts | 8 +- src/talk/diagnostics.test.ts | 4 +- src/talk/logging.test.ts | 4 +- src/tasks/task-registry.maintenance.ts | 4 +- src/tui/gateway-chat.ts | 4 +- src/tui/tui-command-handlers.test.ts | 4 +- src/tui/tui-pty-test-support.ts | 4 +- src/tui/tui-session-actions.test.ts | 16 +- src/utils.ts | 4 +- test/helpers/openclaw-test-instance.ts | 11 +- test/openclaw-launcher.e2e.test.ts | 4 +- test/scripts/e2e-websocket-open.test.ts | 4 +- test/scripts/kitchen-sink-rpc-walk.test.ts | 2 +- test/scripts/mcp-connect-timeout.test.ts | 6 +- test/scripts/mcp-websocket-open.test.ts | 4 +- .../openclaw-cross-os-release-checks.test.ts | 4 +- .../package-openclaw-for-docker.test.ts | 4 +- test/scripts/parallels-smoke-model.test.ts | 10 +- .../parallels-update-job-timeout.test.ts | 7 +- test/scripts/plugin-gateway-gauntlet.test.ts | 4 +- .../release-user-journey-assertions.test.ts | 10 +- test/scripts/source-file-scan-cache.test.ts | 4 +- test/scripts/test-extension.test.ts | 4 +- .../write-cli-startup-metadata.test.ts | 4 +- ui/src/ui/app-chat.test.ts | 30 +-- ui/src/ui/app-gateway.node.test.ts | 2 +- ...p-settings.refresh-active-tab.node.test.ts | 4 +- ui/src/ui/controllers/channels.ts | 4 +- ui/src/ui/controllers/chat.ts | 4 +- ui/src/ui/e2e/chat-flow.e2e.test.ts | 4 +- .../ui/e2e/chat-picker-pagination.e2e.test.ts | 4 +- ui/src/ui/e2e/cron-filters.e2e.test.ts | 4 +- ui/src/ui/push-subscription.ts | 6 +- ui/src/ui/realtime-talk-consult.test.ts | 2 +- ui/src/ui/realtime-talk-webrtc.test.ts | 4 +- ui/src/ui/test-helpers/app-mount.ts | 9 +- ...agents-panels-tools-skills.browser.test.ts | 4 +- 375 files changed, 2134 insertions(+), 884 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 331ad823670..ef2a2311347 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -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", diff --git a/extensions/acpx/src/process-reaper.ts b/extensions/acpx/src/process-reaper.ts index 9297f54d9cc..dd598731b4e 100644 --- a/extensions/acpx/src/process-reaper.ts +++ b/extensions/acpx/src/process-reaper.ts @@ -262,7 +262,12 @@ async function terminatePids( deps: AcpxProcessCleanupDeps | undefined, ): Promise { const killProcess = deps?.killProcess ?? ((pid, signal) => process.kill(pid, signal)); - const sleep = deps?.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms))); + const sleep = + deps?.sleep ?? + ((ms) => + new Promise((resolve) => { + setTimeout(resolve, ms); + })); const terminated: number[] = []; for (const pid of pids) { diff --git a/extensions/active-memory/index.test.ts b/extensions/active-memory/index.test.ts index 51b7687b538..348a42ba8bc 100644 --- a/extensions/active-memory/index.test.ts +++ b/extensions/active-memory/index.test.ts @@ -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." }] }; }); diff --git a/extensions/browser/src/browser/cdp.helpers.internal.test.ts b/extensions/browser/src/browser/cdp.helpers.internal.test.ts index f1b1cf06946..52f8dc6ea43 100644 --- a/extensions/browser/src/browser/cdp.helpers.internal.test.ts +++ b/extensions/browser/src/browser/cdp.helpers.internal.test.ts @@ -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((resolve) => wss.once("listening", () => resolve())); + await new Promise((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((resolve) => wss?.close(() => resolve())); + await new Promise((resolve) => { + wss?.close(() => resolve()); + }); wss = null; } }); @@ -307,7 +311,9 @@ describe("cdp.helpers internal", () => { cb(true); }, }); - await new Promise((resolve) => wss?.once("listening", () => resolve())); + await new Promise((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((resolve) => wss?.once("listening", () => resolve())); + await new Promise((resolve) => { + wss?.once("listening", () => resolve()); + }); const port = (wss.address() as { port: number }).port; await expect( diff --git a/extensions/browser/src/browser/cdp.helpers.ts b/extensions/browser/src/browser/cdp.helpers.ts index d6796a76fab..5383704ad8a 100644 --- a/extensions/browser/src/browser/cdp.helpers.ts +++ b/extensions/browser/src/browser/cdp.helpers.ts @@ -397,7 +397,9 @@ type CdpSocketOptions = { }; function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function normalizeRetryCount(value: number | undefined, fallback: number): number { diff --git a/extensions/browser/src/browser/cdp.internal.test.ts b/extensions/browser/src/browser/cdp.internal.test.ts index 651e9b68c52..1e68e7c6378 100644 --- a/extensions/browser/src/browser/cdp.internal.test.ts +++ b/extensions/browser/src/browser/cdp.internal.test.ts @@ -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((resolve) => wss.once("listening", () => resolve())); + await new Promise((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((resolve) => wss?.close(() => resolve())); + await new Promise((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((resolve) => wsServer.once("listening", () => resolve())); + await new Promise((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((resolve) => httpServer.listen(0, "127.0.0.1", () => resolve())); + await new Promise((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((resolve) => wsServer.close(() => resolve())); - await new Promise((resolve) => httpServer.close(() => resolve())); + await new Promise((resolve) => { + wsServer.close(() => resolve()); + }); + await new Promise((resolve) => { + httpServer.close(() => resolve()); + }); } }); diff --git a/extensions/browser/src/browser/cdp.test.ts b/extensions/browser/src/browser/cdp.test.ts index 5bde17adf6f..03ff63e3a5b 100644 --- a/extensions/browser/src/browser/cdp.test.ts +++ b/extensions/browser/src/browser/cdp.test.ts @@ -27,7 +27,9 @@ describe("cdp", () => { const startWsServer = async () => { wsServer = new WebSocketServer({ port: 0, host: "127.0.0.1" }); - await new Promise((resolve) => wsServer?.once("listening", resolve)); + await new Promise((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((resolve) => httpServer?.listen(0, "127.0.0.1", resolve)); + await new Promise((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((resolve) => { if (!httpServer) { - return resolve(); + resolve(); + return; } httpServer.close(() => resolve()); httpServer = null; }); await new Promise((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((resolve) => httpServer?.listen(0, "127.0.0.1", resolve)); + await new Promise((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((resolve) => httpServer?.listen(0, "127.0.0.1", resolve)); + await new Promise((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((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((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((resolve) => wss.close(() => resolve())); - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } }); diff --git a/extensions/browser/src/browser/chrome.internal.test.ts b/extensions/browser/src/browser/chrome.internal.test.ts index ac46ce2ba71..37b546a6df2 100644 --- a/extensions/browser/src/browser/chrome.internal.test.ts +++ b/extensions/browser/src/browser/chrome.internal.test.ts @@ -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((resolve) => wss.close(() => resolve())); - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); + await new Promise((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((resolve) => wss.once("listening", () => resolve())); + await new Promise((resolve) => { + wss.once("listening", () => resolve()); + }); const port = (wss.address() as { port: number }).port; - await new Promise((resolve) => wss.close(() => resolve())); + await new Promise((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((resolve) => wss.once("listening", () => resolve())); + await new Promise((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((resolve) => wss.close(() => resolve())); + await new Promise((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((resolve) => dead.once("listening", () => resolve())); + await new Promise((resolve) => { + dead.once("listening", () => resolve()); + }); const deadPort = (dead.address() as { port: number }).port; - await new Promise((resolve) => dead.close(() => resolve())); + await new Promise((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((resolve) => server.listen(0, "127.0.0.1", () => resolve())); + await new Promise((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((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } }); diff --git a/extensions/browser/src/browser/chrome.loopback-ssrf.integration.test.ts b/extensions/browser/src/browser/chrome.loopback-ssrf.integration.test.ts index 3ad6966959c..4f72fa4ff51 100644 --- a/extensions/browser/src/browser/chrome.loopback-ssrf.integration.test.ts +++ b/extensions/browser/src/browser/chrome.loopback-ssrf.integration.test.ts @@ -42,14 +42,12 @@ async function startLoopbackCdpServer(): Promise { afterEach(async () => { await Promise.all( - runningServers - .splice(0) - .map( - (server) => - new Promise((resolve, reject) => - server.close((err) => (err ? reject(err) : resolve())), - ), - ), + runningServers.splice(0).map( + (server) => + new Promise((resolve, reject) => { + server.close((err) => (err ? reject(err) : resolve())); + }), + ), ); }); diff --git a/extensions/browser/src/browser/chrome.test.ts b/extensions/browser/src/browser/chrome.test.ts index 869b956e5a3..15a4ce522f8 100644 --- a/extensions/browser/src/browser/chrome.test.ts +++ b/extensions/browser/src/browser/chrome.test.ts @@ -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((resolve) => wss.close(() => resolve())); - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } } @@ -549,7 +553,9 @@ describe("browser chrome helpers", () => { }), ).rejects.toBeInstanceOf(BrowserCdpEndpointBlockedError); } finally { - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((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((resolve) => wss.close(() => resolve())); - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); + await new Promise((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((resolve) => wss.once("listening", () => resolve())); + await new Promise((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((resolve) => wss.close(() => resolve())); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); } }); @@ -811,7 +825,9 @@ describe("browser chrome helpers", () => { } }); }); - await new Promise((resolve) => wss.once("listening", () => resolve())); + await new Promise((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((resolve) => wss.close(() => resolve())); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); } }); diff --git a/extensions/browser/src/browser/chrome.ts b/extensions/browser/src/browser/chrome.ts index 102da48a718..46cb8a0241a 100644 --- a/extensions/browser/src/browser/chrome.ts +++ b/extensions/browser/src/browser/chrome.ts @@ -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 { diff --git a/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts b/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts index 4121bd60393..bf6ed48411d 100644 --- a/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts +++ b/extensions/browser/src/browser/client-fetch.attach-only.e2e.test.ts @@ -37,7 +37,9 @@ describe("browser client fetch attachOnly diagnostics", () => { socket.on("close", () => sockets.delete(socket)); socket.on("error", () => {}); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((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((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } }); }); diff --git a/extensions/browser/src/browser/pw-session.test.ts b/extensions/browser/src/browser/pw-session.test.ts index 0d39e2ddb16..ccf276db577 100644 --- a/extensions/browser/src/browser/pw-session.test.ts +++ b/extensions/browser/src/browser/pw-session.test.ts @@ -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"); diff --git a/extensions/browser/src/browser/pw-session.ts b/extensions/browser/src/browser/pw-session.ts index 5b19fb2adf2..dfa54e1bac2 100644 --- a/extensions/browser/src/browser/pw-session.ts +++ b/extensions/browser/src/browser/pw-session.ts @@ -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) { diff --git a/extensions/browser/src/browser/pw-tools-core.interactions.ts b/extensions/browser/src/browser/pw-tools-core.interactions.ts index 4c742a87c1b..12c7baab57d 100644 --- a/extensions/browser/src/browser/pw-tools-core.interactions.ts +++ b/extensions/browser/src/browser/pw-tools-core.interactions.ts @@ -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( diff --git a/extensions/browser/src/browser/routes/agent.act.ts b/extensions/browser/src/browser/routes/agent.act.ts index 81655b44d9d..819f0402134 100644 --- a/extensions/browser/src/browser/routes/agent.act.ts +++ b/extensions/browser/src/browser/routes/agent.act.ts @@ -45,7 +45,9 @@ import type { BrowserRouteRegistrar } from "./types.js"; import { asyncBrowserRoute, jsonError, toStringOrEmpty } from "./utils.js"; function sleep(ms: number): Promise { - 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; diff --git a/extensions/browser/src/browser/routes/agent.snapshot-target.ts b/extensions/browser/src/browser/routes/agent.snapshot-target.ts index dd61efcc004..1036ffd6162 100644 --- a/extensions/browser/src/browser/routes/agent.snapshot-target.ts +++ b/extensions/browser/src/browser/routes/agent.snapshot-target.ts @@ -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; diff --git a/extensions/browser/src/browser/server-context.availability.ts b/extensions/browser/src/browser/server-context.availability.ts index c7d13eb94b4..d65bdbf1c0c 100644 --- a/extensions/browser/src/browser/server-context.availability.ts +++ b/extensions/browser/src/browser/server-context.availability.ts @@ -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)); }; diff --git a/extensions/browser/src/browser/server-context.tab-ops.ts b/extensions/browser/src/browser/server-context.tab-ops.ts index 114a39f059d..096d8e9549a 100644 --- a/extensions/browser/src/browser/server-context.tab-ops.ts +++ b/extensions/browser/src/browser/server-context.tab-ops.ts @@ -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({ diff --git a/extensions/browser/src/browser/server.agent-contract.test-harness.ts b/extensions/browser/src/browser/server.agent-contract.test-harness.ts index eb93fd87237..22bbc53f17d 100644 --- a/extensions/browser/src/browser/server.agent-contract.test-harness.ts +++ b/extensions/browser/src/browser/server.agent-contract.test-harness.ts @@ -21,7 +21,9 @@ function isTransientStartupFetchError(error: unknown): boolean { } async function sleep(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } async function postStartWithRetry(params: { diff --git a/extensions/browser/src/browser/server.auth-token-gates-http.test.ts b/extensions/browser/src/browser/server.auth-token-gates-http.test.ts index 8f5af493352..a3656d53807 100644 --- a/extensions/browser/src/browser/server.auth-token-gates-http.test.ts +++ b/extensions/browser/src/browser/server.auth-token-gates-http.test.ts @@ -41,7 +41,9 @@ describe("browser control HTTP auth", () => { if (!current) { return; } - await new Promise((resolve) => current.close(() => resolve())); + await new Promise((resolve) => { + current.close(() => resolve()); + }); }); it("requires bearer auth for standalone browser HTTP routes", async () => { diff --git a/extensions/canvas/src/host/server.ts b/extensions/canvas/src/host/server.ts index ad4b0bd7f77..adaf397351a 100644 --- a/extensions/canvas/src/host/server.ts +++ b/extensions/canvas/src/host/server.ts @@ -443,7 +443,9 @@ export async function createCanvasHostHandler( } } if (wss) { - await new Promise((resolve) => wss.close(() => resolve())); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); } }, }; @@ -528,9 +530,9 @@ export async function startCanvasHost(opts: CanvasHostServerOpts): Promise((resolve, reject) => - server.close((err) => (err ? reject(err) : resolve())), - ); + await new Promise((resolve, reject) => { + server.close((err) => (err ? reject(err) : resolve())); + }); }, }; } diff --git a/extensions/clickclack/src/gateway.test.ts b/extensions/clickclack/src/gateway.test.ts index 594df75fe29..f009c7cb25d 100644 --- a/extensions/clickclack/src/gateway.test.ts +++ b/extensions/clickclack/src/gateway.test.ts @@ -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", diff --git a/extensions/clickclack/src/gateway.ts b/extensions/clickclack/src/gateway.ts index 2517477a1f6..eea2f57a11c 100644 --- a/extensions/clickclack/src/gateway.ts +++ b/extensions/clickclack/src/gateway.ts @@ -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 }); diff --git a/extensions/codex-supervisor/src/supervisor.test.ts b/extensions/codex-supervisor/src/supervisor.test.ts index 5f5bebad1c8..da164f21ef0 100644 --- a/extensions/codex-supervisor/src/supervisor.test.ts +++ b/extensions/codex-supervisor/src/supervisor.test.ts @@ -790,7 +790,9 @@ async function waitForFile(filePath: string): Promise { 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((resolve) => server.close(() => resolve())); + await new Promise((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", diff --git a/extensions/codex/src/app-server/attempt-timeouts.test.ts b/extensions/codex/src/app-server/attempt-timeouts.test.ts index b7dbb5cfffd..c8f07496b4d 100644 --- a/extensions/codex/src/app-server/attempt-timeouts.test.ts +++ b/extensions/codex/src/app-server/attempt-timeouts.test.ts @@ -147,7 +147,7 @@ describe("Codex app-server attempt timeouts", () => { }, 5); }); }, - operation: async () => new Promise(() => undefined), + operation: async () => new Promise(() => {}), }); 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(() => undefined), + operation: async () => new Promise(() => {}), }); const rejected = expect(run).rejects.toThrow("codex app-server startup aborted"); diff --git a/extensions/codex/src/app-server/client.test.ts b/extensions/codex/src/app-server/client.test.ts index d71542227e0..b5b15229e40 100644 --- a/extensions/codex/src/app-server/client.test.ts +++ b/extensions/codex/src/app-server/client.test.ts @@ -486,7 +486,7 @@ describe("CodexAppServerClient", () => { clients.push(harness.client); harness.client.addRequestHandler((request) => { if (request.method === "item/tool/call") { - return new Promise(() => undefined); + return new Promise(() => {}); } return undefined; }); diff --git a/extensions/codex/src/app-server/dynamic-tool-execution.test.ts b/extensions/codex/src/app-server/dynamic-tool-execution.test.ts index 80462c27386..1539148060a 100644 --- a/extensions/codex/src/app-server/dynamic-tool-execution.test.ts +++ b/extensions/codex/src/app-server/dynamic-tool-execution.test.ts @@ -194,7 +194,7 @@ describe("dynamic tool execution helpers", () => { toolBridge: { handleToolCall: vi.fn((_call, options) => { capturedSignal = options?.signal; - return new Promise(() => undefined); + return new Promise(() => {}); }), }, 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(() => undefined)), + handleToolCall: vi.fn(() => new Promise(() => {})), }, signal: new AbortController().signal, timeoutMs: 1, diff --git a/extensions/codex/src/app-server/event-projector.test.ts b/extensions/codex/src/app-server/event-projector.test.ts index f95ea8a8176..4bf004b1ed3 100644 --- a/extensions/codex/src/app-server/event-projector.test.ts +++ b/extensions/codex/src/app-server/event-projector.test.ts @@ -35,7 +35,9 @@ const tinyPngBase64 = type ProjectorNotification = Parameters[0]; function flushDiagnosticEvents() { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } function assistantMessage(text: string, timestamp: number) { diff --git a/extensions/codex/src/app-server/run-attempt-test-harness.ts b/extensions/codex/src/app-server/run-attempt-test-harness.ts index 2cd5d94b8d2..4e952fd5d23 100644 --- a/extensions/codex/src/app-server/run-attempt-test-harness.ts +++ b/extensions/codex/src/app-server/run-attempt-test-harness.ts @@ -85,7 +85,9 @@ async function drainActiveAppServerAttemptsForTest(): Promise { } await Promise.race([ Promise.allSettled(attempts.map((attempt) => attempt.promise)), - new Promise((resolve) => setTimeout(resolve, 5_000)), + new Promise((resolve) => { + setTimeout(resolve, 5_000); + }), ]); } diff --git a/extensions/codex/src/app-server/run-attempt.hooks.test.ts b/extensions/codex/src/app-server/run-attempt.hooks.test.ts index 886f7649357..bfb6f2e9b58 100644 --- a/extensions/codex/src/app-server/run-attempt.hooks.test.ts +++ b/extensions/codex/src/app-server/run-attempt.hooks.test.ts @@ -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((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const [llmInputPayload, llmInputContext] = mockCall(llmInput, "llm_input") as [ { diff --git a/extensions/codex/src/app-server/run-attempt.test.ts b/extensions/codex/src/app-server/run-attempt.test.ts index a8cdedf249e..97e9c81ba9e 100644 --- a/extensions/codex/src/app-server/run-attempt.test.ts +++ b/extensions/codex/src/app-server/run-attempt.test.ts @@ -817,7 +817,7 @@ describe("runCodexAppServerAttempt", () => { onTimeout: async () => { await releaseCodexSandboxExecServerEnvironment(sandbox); }, - operation: async () => new Promise(() => undefined), + operation: async () => new Promise(() => {}), }), ).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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(resolved).toBe(false); await harness.notify({ @@ -3120,7 +3158,9 @@ describe("runCodexAppServerAttempt", () => { }, }, }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((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(() => undefined)); + setCodexAppServerClientFactoryForTest(() => new Promise(() => {})); 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((resolve) => setImmediate(resolve)); + await new Promise((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(() => undefined); + return await new Promise(() => {}); } return {}; }), @@ -4502,7 +4544,9 @@ describe("runCodexAppServerAttempt", () => { interval: 1, }); await waitForMethod("turn/start"); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); await completeTurn({ threadId: "thread-existing", turnId: "turn-1" }); await run; diff --git a/extensions/codex/src/app-server/run-attempt.turn-watches.test.ts b/extensions/codex/src/app-server/run-attempt.turn-watches.test.ts index bea51a989e6..3c2e0a94a67 100644 --- a/extensions/codex/src/app-server/run-attempt.turn-watches.test.ts +++ b/extensions/codex/src/app-server/run-attempt.turn-watches.test.ts @@ -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(() => undefined); + return new Promise(() => {}); } 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((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); harness.close(); const result = await run; @@ -3745,7 +3813,9 @@ describe("runCodexAppServerAttempt turn watches", () => { }, }, }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(resolved).toBe(false); await harness.notify({ diff --git a/extensions/codex/src/app-server/sandbox-exec-server.test-helpers.ts b/extensions/codex/src/app-server/sandbox-exec-server.test-helpers.ts index 3f0b3d49405..88b4d42efa8 100644 --- a/extensions/codex/src/app-server/sandbox-exec-server.test-helpers.ts +++ b/extensions/codex/src/app-server/sandbox-exec-server.test-helpers.ts @@ -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`); } diff --git a/extensions/codex/src/app-server/shared-client.test.ts b/extensions/codex/src/app-server/shared-client.test.ts index ee64d8476cc..d04178c668a 100644 --- a/extensions/codex/src/app-server/shared-client.test.ts +++ b/extensions/codex/src/app-server/shared-client.test.ts @@ -704,7 +704,9 @@ describe("shared Codex app-server client", () => { }); try { - await new Promise((resolve) => server.once("listening", resolve)); + await new Promise((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((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ); + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); } }); }); diff --git a/extensions/codex/src/app-server/side-question.test.ts b/extensions/codex/src/app-server/side-question.test.ts index 568e8e58b54..f0fe5958308 100644 --- a/extensions/codex/src/app-server/side-question.test.ts +++ b/extensions/codex/src/app-server/side-question.test.ts @@ -141,7 +141,9 @@ function mockCall(mock: ReturnType, index = 0): unknown[] { } function flushDiagnosticEvents() { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } function activeDiagnosticToolKeys(events: DiagnosticEventPayload[]): Set { diff --git a/extensions/codex/src/app-server/transport-websocket.test.ts b/extensions/codex/src/app-server/transport-websocket.test.ts index 616b33d3b9f..aac0483fb26 100644 --- a/extensions/codex/src/app-server/transport-websocket.test.ts +++ b/extensions/codex/src/app-server/transport-websocket.test.ts @@ -12,14 +12,12 @@ describe("Codex app-server websocket transport", () => { } clients.length = 0; await Promise.all( - servers - .splice(0) - .map( - (server) => - new Promise((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ), - ), + servers.splice(0).map( + (server) => + new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }), + ), ); }); @@ -42,7 +40,9 @@ describe("Codex app-server websocket transport", () => { } }); }); - await new Promise((resolve) => server.once("listening", resolve)); + await new Promise((resolve) => { + server.once("listening", resolve); + }); const address = server.address(); if (!address || typeof address === "string") { throw new Error("expected websocket test server port"); diff --git a/extensions/codex/src/conversation-binding.test.ts b/extensions/codex/src/conversation-binding.test.ts index 48619b52701..0b8e3138caa 100644 --- a/extensions/codex/src/conversation-binding.test.ts +++ b/extensions/codex/src/conversation-binding.test.ts @@ -1096,7 +1096,9 @@ describe("codex conversation binding", () => { }, { timeoutMs: 50 }, ); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(result).toEqual({ handled: true, diff --git a/extensions/codex/src/migration/apply.ts b/extensions/codex/src/migration/apply.ts index 1fb473a46ee..3950033454a 100644 --- a/extensions/codex/src/migration/apply.ts +++ b/extensions/codex/src/migration/apply.ts @@ -387,7 +387,9 @@ function isCodexPluginLoadWarningItem(item: MigrationItem): boolean { } async function sleep(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } async function buildTargetCodexPluginAppCacheKey(ctx: MigrationProviderContext): Promise { diff --git a/extensions/comfy/workflow-runtime.ts b/extensions/comfy/workflow-runtime.ts index a51020f8c3a..aad0ae699df 100644 --- a/extensions/comfy/workflow-runtime.ts +++ b/extensions/comfy/workflow-runtime.ts @@ -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); + }); } } diff --git a/extensions/copilot/harness.test.ts b/extensions/copilot/harness.test.ts index f5c97a1ba9b..9e1a7503ba6 100644 --- a/extensions/copilot/harness.test.ts +++ b/extensions/copilot/harness.test.ts @@ -55,7 +55,9 @@ function createDeferred() { } async function flushAsyncWork() { - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); } describe("createCopilotAgentHarness", () => { diff --git a/extensions/copilot/src/attempt.test.ts b/extensions/copilot/src/attempt.test.ts index 697f28f5a0a..5b7dac9e2ba 100644 --- a/extensions/copilot/src/attempt.test.ts +++ b/extensions/copilot/src/attempt.test.ts @@ -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); diff --git a/extensions/diagnostics-otel/src/service.test.ts b/extensions/diagnostics-otel/src/service.test.ts index 3a72db222e1..48b3d409d74 100644 --- a/extensions/diagnostics-otel/src/service.test.ts +++ b/extensions/diagnostics-otel/src/service.test.ts @@ -346,7 +346,9 @@ async function emitAndCaptureLog( } function flushDiagnosticEvents() { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((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(); diff --git a/extensions/discord/src/monitor/message-handler.process.test.ts b/extensions/discord/src/monitor/message-handler.process.test.ts index 8fd953a5ab3..b3dd1ab73fe 100644 --- a/extensions/discord/src/monitor/message-handler.process.test.ts +++ b/extensions/discord/src/monitor/message-handler.process.test.ts @@ -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({ diff --git a/extensions/discord/src/monitor/native-command-model-picker-apply.ts b/extensions/discord/src/monitor/native-command-model-picker-apply.ts index 086d90dd481..491c0809204 100644 --- a/extensions/discord/src/monitor/native-command-model-picker-apply.ts +++ b/extensions/discord/src/monitor/native-command-model-picker-apply.ts @@ -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) { diff --git a/extensions/discord/src/monitor/provider.proxy.test.ts b/extensions/discord/src/monitor/provider.proxy.test.ts index e83d5c733f1..d64a4b40dfc 100644 --- a/extensions/discord/src/monitor/provider.proxy.test.ts +++ b/extensions/discord/src/monitor/provider.proxy.test.ts @@ -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); diff --git a/extensions/discord/src/voice/manager.e2e.test.ts b/extensions/discord/src/voice/manager.e2e.test.ts index f6a066767d8..459653ba644 100644 --- a/extensions/discord/src/voice/manager.e2e.test.ts +++ b/extensions/discord/src/voice/manager.e2e.test.ts @@ -3865,14 +3865,18 @@ describe("DiscordVoiceManager", () => { resolveSecond?.({ payloads: [{ text: "second answer" }] }); resolveThird?.({ payloads: [{ text: "third answer" }] }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((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((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expectUserMessageNotIncludes("second answer"); const idleHandler = player.on.mock.calls.find(([event]) => event === "idle")?.[1] as diff --git a/extensions/fal/video-generation-provider.ts b/extensions/fal/video-generation-provider.ts index 488500cb4ec..f5f3fc6b47c 100644 --- a/extensions/fal/video-generation-provider.ts +++ b/extensions/fal/video-generation-provider.ts @@ -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); + }); } } diff --git a/extensions/feishu/src/app-registration.ts b/extensions/feishu/src/app-registration.ts index b210455d0c5..ef0535111c0 100644 --- a/extensions/feishu/src/app-registration.ts +++ b/extensions/feishu/src/app-registration.ts @@ -340,7 +340,9 @@ export async function getAppOwnerOpenId(params: { } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function sleepRegistrationPollInterval(intervalSeconds: number): Promise { diff --git a/extensions/feishu/src/monitor.comment.ts b/extensions/feishu/src/monitor.comment.ts index 6b802342722..05f0ef9215b 100644 --- a/extensions/feishu/src/monitor.comment.ts +++ b/extensions/feishu/src/monitor.comment.ts @@ -361,7 +361,9 @@ async function resolveParsedCommentContent(params: { } async function delayMs(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function buildDriveCommentTargetUrl(params: { diff --git a/extensions/feishu/src/monitor.webhook.test-helpers.ts b/extensions/feishu/src/monitor.webhook.test-helpers.ts index d36eb582c94..c98d751012a 100644 --- a/extensions/feishu/src/monitor.webhook.test-helpers.ts +++ b/extensions/feishu/src/monitor.webhook.test-helpers.ts @@ -10,12 +10,16 @@ const WEBHOOK_MONITOR_START_MAX_ATTEMPTS = 4; export async function getFreePort(): Promise { const server = createServer(); - await new Promise((resolve) => server.listen(0, "127.0.0.1", () => resolve())); + await new Promise((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((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); return address.port; } @@ -29,7 +33,9 @@ async function waitUntilServerReady(url: string): Promise { } 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); + }); } } } diff --git a/extensions/feishu/src/reply-dispatcher.test.ts b/extensions/feishu/src/reply-dispatcher.test.ts index dd85e025cc7..228dd46905e 100644 --- a/extensions/feishu/src/reply-dispatcher.test.ts +++ b/extensions/feishu/src/reply-dispatcher.test.ts @@ -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(); diff --git a/extensions/feishu/src/sequential-queue.test.ts b/extensions/feishu/src/sequential-queue.test.ts index 3916cde2ead..cf487b50bb2 100644 --- a/extensions/feishu/src/sequential-queue.test.ts +++ b/extensions/feishu/src/sequential-queue.test.ts @@ -85,7 +85,9 @@ describe("createSequentialQueue", () => { }), ).rejects.toThrow("boom"); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(unhandled).toStrictEqual([]); await expect(enqueue("feishu:default:chat-1", async () => {})).resolves.toBeUndefined(); diff --git a/extensions/feishu/src/setup-surface.ts b/extensions/feishu/src/setup-surface.ts index d4c3c711c1d..713830d9837 100644 --- a/extensions/feishu/src/setup-surface.ts +++ b/extensions/feishu/src/setup-surface.ts @@ -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, { diff --git a/extensions/github-copilot/login.ts b/extensions/github-copilot/login.ts index b6688ba8c52..bbaba15fe85 100644 --- a/extensions/github-copilot/login.ts +++ b/extensions/github-copilot/login.ts @@ -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)); + }); } } diff --git a/extensions/google-meet/src/realtime-node.ts b/extensions/google-meet/src/realtime-node.ts index a6cc28dbaa7..69343aee75f 100644 --- a/extensions/google-meet/src/realtime-node.ts +++ b/extensions/google-meet/src/realtime-node.ts @@ -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); + }); } } } diff --git a/extensions/google-meet/src/transports/chrome.ts b/extensions/google-meet/src/transports/chrome.ts index d56e34bb97c..49a810e5a6b 100644 --- a/extensions/google-meet/src/transports/chrome.ts +++ b/extensions/google-meet/src/transports/chrome.ts @@ -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 }; diff --git a/extensions/google/embedding-batch.ts b/extensions/google/embedding-batch.ts index 5aa5ab729d1..3ceed4eb2c1 100644 --- a/extensions/google/embedding-batch.ts +++ b/extensions/google/embedding-batch.ts @@ -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; } } diff --git a/extensions/google/oauth.project.ts b/extensions/google/oauth.project.ts index ec57c4e4250..b068876c31a 100644 --- a/extensions/google/oauth.project.ts +++ b/extensions/google/oauth.project.ts @@ -64,7 +64,9 @@ async function pollOperation( headers: Record, ): 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, }); diff --git a/extensions/imessage/src/monitor.shutdown.unhandled-rejection.test.ts b/extensions/imessage/src/monitor.shutdown.unhandled-rejection.test.ts index 3f5f1765ebb..5816118a363 100644 --- a/extensions/imessage/src/monitor.shutdown.unhandled-rejection.test.ts +++ b/extensions/imessage/src/monitor.shutdown.unhandled-rejection.test.ts @@ -30,7 +30,9 @@ describe("monitorIMessageProvider", () => { }); abortController.abort(); // Give the event loop a turn to surface any unhandledRejection, if present. - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); detach(); } finally { process.off("unhandledRejection", onUnhandled); diff --git a/extensions/line/src/monitor.lifecycle.test.ts b/extensions/line/src/monitor.lifecycle.test.ts index 52b14038975..f30469acb17 100644 --- a/extensions/line/src/monitor.lifecycle.test.ts +++ b/extensions/line/src/monitor.lifecycle.test.ts @@ -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); diff --git a/extensions/matrix/src/matrix/actions/verification.test.ts b/extensions/matrix/src/matrix/actions/verification.test.ts index a7aac1991f7..d4f76048a34 100644 --- a/extensions/matrix/src/matrix/actions/verification.test.ts +++ b/extensions/matrix/src/matrix/actions/verification.test.ts @@ -589,7 +589,7 @@ describe("matrix verification actions", () => { startVerification: vi.fn(async () => sas), }; const getOwnDeviceIdentityVerificationStatus = vi.fn( - async () => await new Promise(() => undefined), + async () => await new Promise(() => {}), ); const getOwnDeviceVerificationStatus = vi.fn(async () => mockVerifiedOwnerStatus()); const getOwnCrossSigningPublicationStatus = vi.fn(async () => diff --git a/extensions/matrix/src/matrix/monitor/verification-events.ts b/extensions/matrix/src/matrix/monitor/verification-events.ts index 1af9b738c42..f41b9cbaa98 100644 --- a/extensions/matrix/src/matrix/monitor/verification-events.ts +++ b/extensions/matrix/src/matrix/monitor/verification-events.ts @@ -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, diff --git a/extensions/matrix/src/matrix/sdk.test.ts b/extensions/matrix/src/matrix/sdk.test.ts index 08671cccd57..2c74dda1ce5 100644 --- a/extensions/matrix/src/matrix/sdk.test.ts +++ b/extensions/matrix/src/matrix/sdk.test.ts @@ -1848,13 +1848,13 @@ describe("MatrixClient crypto bootstrapping", () => { localTimeoutMs: 1, }); vi.spyOn(client, "getRoomKeyBackupStatus").mockImplementation( - async () => await new Promise(() => undefined), + async () => await new Promise(() => {}), ); vi.spyOn(client, "getDeviceVerificationStatus").mockImplementation( - async () => await new Promise(() => undefined), + async () => await new Promise(() => {}), ); vi.spyOn(client, "listOwnDevices").mockImplementation( - async () => await new Promise(() => undefined), + async () => await new Promise(() => {}), ); const status = await client.getOwnDeviceVerificationStatus(); diff --git a/extensions/memory-core/src/memory/manager-embedding-ops.ts b/extensions/memory-core/src/memory/manager-embedding-ops.ts index e01e0cca56e..150e328b455 100644 --- a/extensions/memory-core/src/memory/manager-embedding-ops.ts +++ b/extensions/memory-core/src/memory/manager-embedding-ops.ts @@ -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 { diff --git a/extensions/memory-core/src/memory/qmd-manager.test.ts b/extensions/memory-core/src/memory/qmd-manager.test.ts index 37f348370c5..0c9e6b121b6 100644 --- a/extensions/memory-core/src/memory/qmd-manager.test.ts +++ b/extensions/memory-core/src/memory/qmd-manager.test.ts @@ -97,7 +97,9 @@ async function waitUntil(predicate: () => boolean, timeoutMs = 1_000): Promise 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((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(created).toBe(false); (releaseUpdate as (() => void) | null)?.(); const manager = await createPromise; diff --git a/extensions/memory-core/src/memory/qmd-manager.ts b/extensions/memory-core/src/memory/qmd-manager.ts index 1c92ce1365d..d1d80bb354b 100644 --- a/extensions/memory-core/src/memory/qmd-manager.ts +++ b/extensions/memory-core/src/memory/qmd-manager.ts @@ -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((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); } } } @@ -3049,7 +3051,9 @@ export class QmdMemoryManager implements MemorySearchManager { } await Promise.race([ pending.catch(() => undefined), - new Promise((resolve) => setTimeout(resolve, SEARCH_PENDING_UPDATE_WAIT_MS)), + new Promise((resolve) => { + setTimeout(resolve, SEARCH_PENDING_UPDATE_WAIT_MS); + }), ]); } diff --git a/extensions/memory-core/src/tools.citations.test.ts b/extensions/memory-core/src/tools.citations.test.ts index 4400df1a79c..26e3bd6fbf3 100644 --- a/extensions/memory-core/src/tools.citations.test.ts +++ b/extensions/memory-core/src/tools.citations.test.ts @@ -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 () => [ diff --git a/extensions/memory-core/src/tools.test.ts b/extensions/memory-core/src/tools.test.ts index 60f68437b30..d4c2df9d7ce 100644 --- a/extensions/memory-core/src/tools.test.ts +++ b/extensions/memory-core/src/tools.test.ts @@ -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(); diff --git a/extensions/memory-lancedb/index.test.ts b/extensions/memory-lancedb/index.test.ts index 75e17107bdf..d287447ba36 100644 --- a/extensions/memory-lancedb/index.test.ts +++ b/extensions/memory-lancedb/index.test.ts @@ -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"]), diff --git a/extensions/memory-wiki/src/compile.test.ts b/extensions/memory-wiki/src/compile.test.ts index 8eaef951aa8..d812fffd2d6 100644 --- a/extensions/memory-wiki/src/compile.test.ts +++ b/extensions/memory-wiki/src/compile.test.ts @@ -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; diff --git a/extensions/minimax/oauth.ts b/extensions/minimax/oauth.ts index 7870b11bc44..48a87624ec7 100644 --- a/extensions/minimax/oauth.ts +++ b/extensions/minimax/oauth.ts @@ -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); } diff --git a/extensions/msteams/src/monitor.lifecycle.test.ts b/extensions/msteams/src/monitor.lifecycle.test.ts index 1e101995ba6..93827c7417d 100644 --- a/extensions/msteams/src/monitor.lifecycle.test.ts +++ b/extensions/msteams/src/monitor.lifecycle.test.ts @@ -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"); diff --git a/extensions/ollama/src/stream-runtime.test.ts b/extensions/ollama/src/stream-runtime.test.ts index e6bbe537fa5..72ccf1e2844 100644 --- a/extensions/ollama/src/stream-runtime.test.ts +++ b/extensions/ollama/src/stream-runtime.test.ts @@ -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"); diff --git a/extensions/openai/embedding-batch.ts b/extensions/openai/embedding-batch.ts index c8d185978c9..6c1e136ea2a 100644 --- a/extensions/openai/embedding-batch.ts +++ b/extensions/openai/embedding-batch.ts @@ -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; } } diff --git a/extensions/openai/openai-chatgpt-device-code.ts b/extensions/openai/openai-chatgpt-device-code.ts index fa7cabaf408..095f73f5b99 100644 --- a/extensions/openai/openai-chatgpt-device-code.ts +++ b/extensions/openai/openai-chatgpt-device-code.ts @@ -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; } diff --git a/extensions/openai/openai-chatgpt-oauth.runtime.ts b/extensions/openai/openai-chatgpt-oauth.runtime.ts index 97551c25895..04f8b2205c2 100644 --- a/extensions/openai/openai-chatgpt-oauth.runtime.ts +++ b/extensions/openai/openai-chatgpt-oauth.runtime.ts @@ -163,7 +163,7 @@ function settleAfterDelay(params: { } function waitForeverForPromptInput(): Promise { - return new Promise(() => undefined); + return new Promise(() => {}); } function createOpenAICodexOAuthError( diff --git a/extensions/openai/openai.live.test.ts b/extensions/openai/openai.live.test.ts index b239ae5ad45..a123d583429 100644 --- a/extensions/openai/openai.live.test.ts +++ b/extensions/openai/openai.live.test.ts @@ -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 { diff --git a/extensions/openai/realtime-voice-provider.ts b/extensions/openai/realtime-voice-provider.ts index 449a1845da4..9bce483ee01 100644 --- a/extensions/openai/realtime-voice-provider.ts +++ b/extensions/openai/realtime-voice-provider.ts @@ -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; } diff --git a/extensions/openrouter/openrouter.live.test.ts b/extensions/openrouter/openrouter.live.test.ts index 4ae798bd9fb..aff58f5680f 100644 --- a/extensions/openrouter/openrouter.live.test.ts +++ b/extensions/openrouter/openrouter.live.test.ts @@ -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; diff --git a/extensions/openshell/src/backend.e2e.test.ts b/extensions/openshell/src/backend.e2e.test.ts index 1b215d53b43..57aa886a10b 100644 --- a/extensions/openshell/src/backend.e2e.test.ts +++ b/extensions/openshell/src/backend.e2e.test.ts @@ -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({ diff --git a/extensions/qa-lab/src/bus-state.test.ts b/extensions/qa-lab/src/bus-state.test.ts index 17292a587a5..36616ebeace 100644 --- a/extensions/qa-lab/src/bus-state.test.ts +++ b/extensions/qa-lab/src/bus-state.test.ts @@ -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"); diff --git a/extensions/qa-lab/src/cli.runtime.ts b/extensions/qa-lab/src/cli.runtime.ts index 5a2359ef722..f6b5b54b189 100644 --- a/extensions/qa-lab/src/cli.runtime.ts +++ b/extensions/qa-lab/src/cli.runtime.ts @@ -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) { diff --git a/extensions/qa-lab/src/docker-up.runtime.test.ts b/extensions/qa-lab/src/docker-up.runtime.test.ts index 3c1f506784e..4e9cb8eed95 100644 --- a/extensions/qa-lab/src/docker-up.runtime.test.ts +++ b/extensions/qa-lab/src/docker-up.runtime.test.ts @@ -25,9 +25,9 @@ async function occupyPortOrAcceptExisting(port: number): Promise<{ close: () => if (!listening) { return; } - await new Promise((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ); + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); }, }; } diff --git a/extensions/qa-lab/src/gateway-child.ts b/extensions/qa-lab/src/gateway-child.ts index ac3397c05dd..1fdd8b4813a 100644 --- a/extensions/qa-lab/src/gateway-child.ts +++ b/extensions/qa-lab/src/gateway-child.ts @@ -376,7 +376,9 @@ async function waitForQaGatewayChildExit(child: ChildProcess, timeoutMs: number) return true; } return await Promise.race([ - new Promise((resolve) => child.once("exit", () => resolve(true))), + new Promise((resolve) => { + child.once("exit", () => resolve(true)); + }), sleep(timeoutMs).then(() => false), ]); } diff --git a/extensions/qa-lab/src/lab-server-capture.test.ts b/extensions/qa-lab/src/lab-server-capture.test.ts index ea0b04642e4..aae9e535b50 100644 --- a/extensions/qa-lab/src/lab-server-capture.test.ts +++ b/extensions/qa-lab/src/lab-server-capture.test.ts @@ -41,9 +41,9 @@ describe("qa-lab server capture helpers", () => { }); cleanups.push( async () => - await new Promise((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ), + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }), ); const address = server.address(); diff --git a/extensions/qa-lab/src/lab-server.test.ts b/extensions/qa-lab/src/lab-server.test.ts index 08119b63c55..79854513093 100644 --- a/extensions/qa-lab/src/lab-server.test.ts +++ b/extensions/qa-lab/src/lab-server.test.ts @@ -480,9 +480,9 @@ describe("qa-lab server", () => { }); cleanups.push( async () => - await new Promise((resolve, reject) => - upstream.close((error) => (error ? reject(error) : resolve())), - ), + await new Promise((resolve, reject) => { + upstream.close((error) => (error ? reject(error) : resolve())); + }), ); const address = upstream.address(); diff --git a/extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts b/extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts index faaee444902..29e17596330 100644 --- a/extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts +++ b/extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts @@ -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 diff --git a/extensions/qa-lab/src/live-transports/shared/credential-lease.runtime.ts b/extensions/qa-lab/src/live-transports/shared/credential-lease.runtime.ts index 5aa4060f248..762374f4fa3 100644 --- a/extensions/qa-lab/src/live-transports/shared/credential-lease.runtime.ts +++ b/extensions/qa-lab/src/live-transports/shared/credential-lease.runtime.ts @@ -388,7 +388,11 @@ export async function acquireQaCredentialLease( }); 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(); diff --git a/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts b/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts index 54394f5356c..02fa3a422bd 100644 --- a/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts +++ b/extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts @@ -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) { diff --git a/extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts b/extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts index 6f0b0ed34f7..e9048255961 100644 --- a/extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts +++ b/extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts @@ -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`); } diff --git a/extensions/qa-lab/src/live-transports/whatsapp/whatsapp-live.runtime.ts b/extensions/qa-lab/src/live-transports/whatsapp/whatsapp-live.runtime.ts index f8c5f608336..3f79c2e481d 100644 --- a/extensions/qa-lab/src/live-transports/whatsapp/whatsapp-live.runtime.ts +++ b/extensions/qa-lab/src/live-transports/whatsapp/whatsapp-live.runtime.ts @@ -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, diff --git a/extensions/qa-lab/src/suite-planning.ts b/extensions/qa-lab/src/suite-planning.ts index b270a3faaf4..dbd0507e27e 100644 --- a/extensions/qa-lab/src/suite-planning.ts +++ b/extensions/qa-lab/src/suite-planning.ts @@ -198,7 +198,11 @@ async function mapQaSuiteWithConcurrency( 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((resolve) => setTimeout(resolve, ms))); + opts?.sleepImpl ?? + ((ms: number) => + new Promise((resolve) => { + setTimeout(resolve, ms); + })); async function waitForStartSlot(shouldReleaseNextSlot: boolean) { const currentGate = nextStartGate; let releaseNextSlot: (() => void) | undefined; diff --git a/extensions/qa-lab/src/suite-runtime-agent-media.ts b/extensions/qa-lab/src/suite-runtime-agent-media.ts index c4ad7c80947..b9eb3067461 100644 --- a/extensions/qa-lab/src/suite-runtime-agent-media.ts +++ b/extensions/qa-lab/src/suite-runtime-agent-media.ts @@ -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`); } diff --git a/extensions/qa-lab/src/suite-runtime-agent-process.ts b/extensions/qa-lab/src/suite-runtime-agent-process.ts index 486d3d3e52b..cb521680715 100644 --- a/extensions/qa-lab/src/suite-runtime-agent-process.ts +++ b/extensions/qa-lab/src/suite-runtime-agent-process.ts @@ -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}`); } diff --git a/extensions/qa-matrix/src/runners/contract/scenario-runtime-cli.ts b/extensions/qa-matrix/src/runners/contract/scenario-runtime-cli.ts index 56066fb1fb1..38435b060b7 100644 --- a/extensions/qa-matrix/src/runners/contract/scenario-runtime-cli.ts +++ b/extensions/qa-matrix/src/runners/contract/scenario-runtime-cli.ts @@ -280,7 +280,9 @@ export function startMatrixQaOpenClawCli(params: { }, writeStdin: async (text) => { if (!child.stdin.write(text)) { - await new Promise((resolve) => child.stdin.once("drain", resolve)); + await new Promise((resolve) => { + child.stdin.once("drain", resolve); + }); } }, kill: () => { diff --git a/extensions/qqbot/src/engine/api/media-chunked.ts b/extensions/qqbot/src/engine/api/media-chunked.ts index cfd57955567..31bd68f8d0d 100644 --- a/extensions/qqbot/src/engine/api/media-chunked.ts +++ b/extensions/qqbot/src/engine/api/media-chunked.ts @@ -641,5 +641,7 @@ async function runWithConcurrency( } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } diff --git a/extensions/qqbot/src/engine/api/retry.ts b/extensions/qqbot/src/engine/api/retry.ts index cc159a75f72..9c20366110d 100644 --- a/extensions/qqbot/src/engine/api/retry.ts +++ b/extensions/qqbot/src/engine/api/retry.ts @@ -147,7 +147,9 @@ async function persistentRetryLoop( } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } // ============ Pre-built Retry Policies ============ diff --git a/extensions/qqbot/src/engine/gateway/outbound-dispatch.test.ts b/extensions/qqbot/src/engine/gateway/outbound-dispatch.test.ts index 884d620eb34..3d26d626361 100644 --- a/extensions/qqbot/src/engine/gateway/outbound-dispatch.test.ts +++ b/extensions/qqbot/src/engine/gateway/outbound-dispatch.test.ts @@ -188,7 +188,9 @@ describe("dispatchOutbound", () => { try { const runtime = makeRuntime({ onDeliver: async (deliver) => { - await new Promise((resolve) => setTimeout(resolve, 301_000)); + await new Promise((resolve) => { + setTimeout(resolve, 301_000); + }); await deliver({ text: "late answer" }, { kind: "block" }); }, }); diff --git a/extensions/qqbot/src/engine/gateway/outbound-dispatch.ts b/extensions/qqbot/src/engine/gateway/outbound-dispatch.ts index 3a0f27d5699..2accf2483bc 100644 --- a/extensions/qqbot/src/engine/gateway/outbound-dispatch.ts +++ b/extensions/qqbot/src/engine/gateway/outbound-dispatch.ts @@ -161,12 +161,12 @@ export async function dispatchOutbound( } return r; }), - new Promise((resolve) => + new Promise((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}`); diff --git a/extensions/qqbot/src/engine/messaging/outbound-deliver.ts b/extensions/qqbot/src/engine/messaging/outbound-deliver.ts index 0973d94d574..bf8150624fd 100644 --- a/extensions/qqbot/src/engine/messaging/outbound-deliver.ts +++ b/extensions/qqbot/src/engine/messaging/outbound-deliver.ts @@ -341,12 +341,12 @@ async function sendVoiceWithTimeout( } return r; }), - new Promise<{ channel: string; error: string }>((resolve) => + new Promise<{ channel: string; error: string }>((resolve) => { setTimeout(() => { ac.abort(); resolve({ channel: "qqbot", error: "Voice send timed out and was skipped" }); - }, voiceTimeout), - ), + }, voiceTimeout); + }), ]); if (result.error) { log?.error(`sendVoice error: ${result.error}`); diff --git a/extensions/qqbot/src/engine/messaging/streaming-c2c.ts b/extensions/qqbot/src/engine/messaging/streaming-c2c.ts index 8e2af290bfe..92232843a53 100644 --- a/extensions/qqbot/src/engine/messaging/streaming-c2c.ts +++ b/extensions/qqbot/src/engine/messaging/streaming-c2c.ts @@ -103,7 +103,9 @@ class FlushController { if (!this.flushInProgress) { return Promise.resolve(); } - return new Promise((resolve) => this.flushResolvers.push(resolve)); + return new Promise((resolve) => { + this.flushResolvers.push(resolve); + }); } /** 取消所有 pending timer + 等待正在执行的 flush 完成,确保 flush 活动彻底停止 */ diff --git a/extensions/qqbot/src/engine/messaging/streaming-media-send.ts b/extensions/qqbot/src/engine/messaging/streaming-media-send.ts index 111c1ca7da4..31088c037b3 100644 --- a/extensions/qqbot/src/engine/messaging/streaming-media-send.ts +++ b/extensions/qqbot/src/engine/messaging/streaming-media-send.ts @@ -303,12 +303,12 @@ export async function executeSendQueue( try { const result = await Promise.race([ sendVoice(mediaTarget, item.content, uploadFormats, transcodeEnabled), - new Promise<{ channel: string; error: string }>((resolve) => + new Promise<{ channel: string; error: string }>((resolve) => { setTimeout( () => resolve({ channel: "qqbot", error: "语音发送超时,已跳过" }), voiceTimeout, - ), - ), + ); + }), ]); if (result.error) { log?.error(`${prefix} sendVoice error: ${result.error}`); diff --git a/extensions/qqbot/src/engine/utils/audio.ts b/extensions/qqbot/src/engine/utils/audio.ts index 90f2232bdb9..c449a4ed473 100644 --- a/extensions/qqbot/src/engine/utils/audio.ts +++ b/extensions/qqbot/src/engine/utils/audio.ts @@ -326,7 +326,9 @@ export async function waitForFile( return 0; } } - await new Promise((r) => setTimeout(r, pollMs)); + await new Promise((r) => { + setTimeout(r, pollMs); + }); } try { diff --git a/extensions/signal/src/client-adapter.test.ts b/extensions/signal/src/client-adapter.test.ts index b14e71106eb..08fbaba044e 100644 --- a/extensions/signal/src/client-adapter.test.ts +++ b/extensions/signal/src/client-adapter.test.ts @@ -162,7 +162,10 @@ describe("detectSignalApiMode", () => { it("prefers native even when the container probe resolves first", async () => { mockNativeCheck.mockImplementation( - () => new Promise((resolve) => setTimeout(() => resolve({ ok: true, status: 200 }), 1)), + () => + new Promise((resolve) => { + setTimeout(() => resolve({ ok: true, status: 200 }), 1); + }), ); mockContainerCheck.mockResolvedValue({ ok: true, status: 200 }); diff --git a/extensions/slack/src/monitor.test-helpers.ts b/extensions/slack/src/monitor.test-helpers.ts index 1228f0f1aa0..60a7ec3d4ce 100644 --- a/extensions/slack/src/monitor.test-helpers.ts +++ b/extensions/slack/src/monitor.test-helpers.ts @@ -117,7 +117,10 @@ function ensureSlackTestRuntime(): { }; } -export const flush = () => new Promise((resolve) => setTimeout(resolve, 0)); +export const flush = () => + new Promise((resolve) => { + setTimeout(resolve, 0); + }); async function waitForSlackEvent(name: string) { for (let i = 0; i < 10; i += 1) { diff --git a/extensions/slack/src/send.ts b/extensions/slack/src/send.ts index 0abac094363..c6a4b5a8d2d 100644 --- a/extensions/slack/src/send.ts +++ b/extensions/slack/src/send.ts @@ -270,9 +270,9 @@ function hasSlackDnsRequestSignal(err: unknown): boolean { } function delaySlackDnsRetry(attempt: number): Promise { - return new Promise((resolve) => - setTimeout(resolve, SLACK_DNS_RETRY_BASE_DELAY_MS * Math.max(1, attempt)), - ); + return new Promise((resolve) => { + setTimeout(resolve, SLACK_DNS_RETRY_BASE_DELAY_MS * Math.max(1, attempt)); + }); } async function withSlackDnsRequestRetry(operation: string, fn: () => Promise): Promise { diff --git a/extensions/synology-chat/src/webhook-handler.ts b/extensions/synology-chat/src/webhook-handler.ts index b851ed29f40..c445d3bee4e 100644 --- a/extensions/synology-chat/src/webhook-handler.ts +++ b/extensions/synology-chat/src/webhook-handler.ts @@ -564,9 +564,9 @@ async function processAuthorizedSynologyWebhook(params: { commandAuthorized: params.message.commandAuthorized, chatUserId: deliveryUserId, }); - const timeoutPromise = new Promise((_, reject) => - setTimeout(() => reject(new Error("Agent response timeout (120s)")), 120_000), - ); + const timeoutPromise = new Promise((_, reject) => { + setTimeout(() => reject(new Error("Agent response timeout (120s)")), 120_000); + }); const reply = await Promise.race([deliverPromise, timeoutPromise]); if (!reply) { return; diff --git a/extensions/telegram/src/message-dispatch-dedupe.ts b/extensions/telegram/src/message-dispatch-dedupe.ts index 20ce4db8b63..87a35528ca0 100644 --- a/extensions/telegram/src/message-dispatch-dedupe.ts +++ b/extensions/telegram/src/message-dispatch-dedupe.ts @@ -106,7 +106,9 @@ function dedupeBucketLockKey(bucketKey: string): string { } async function sleep(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function pruneDedupeBucketEntries(entries: Record, now: number): void { diff --git a/extensions/telegram/src/probe.ts b/extensions/telegram/src/probe.ts index 6a674ba9da1..4fe994d7dfc 100644 --- a/extensions/telegram/src/probe.ts +++ b/extensions/telegram/src/probe.ts @@ -169,7 +169,9 @@ export async function probeTelegram( } const delayMs = Math.min(retryDelayMs, remainingAfterAttemptMs); if (delayMs > 0) { - await new Promise((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); } } } diff --git a/extensions/telegram/src/telegram-ingress-worker.runtime.ts b/extensions/telegram/src/telegram-ingress-worker.runtime.ts index 3f67366720a..7b2e523e868 100644 --- a/extensions/telegram/src/telegram-ingress-worker.runtime.ts +++ b/extensions/telegram/src/telegram-ingress-worker.runtime.ts @@ -38,7 +38,9 @@ function post(message: TelegramIngressWorkerMessage): void { } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function formatErrorMessage(err: unknown): string { diff --git a/extensions/telegram/src/thread-bindings.test.ts b/extensions/telegram/src/thread-bindings.test.ts index 9a62fe8c2cd..d5ee7ee7d73 100644 --- a/extensions/telegram/src/thread-bindings.test.ts +++ b/extensions/telegram/src/thread-bindings.test.ts @@ -61,8 +61,12 @@ function createTelegramThreadBindingManager( async function flushMicrotasks(): Promise { await Promise.resolve(); - await new Promise((resolve) => queueMicrotask(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + queueMicrotask(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); } describe("telegram thread bindings", () => { diff --git a/extensions/telegram/src/update-offset-store.test.ts b/extensions/telegram/src/update-offset-store.test.ts index 876f5ef4935..93186aa7917 100644 --- a/extensions/telegram/src/update-offset-store.test.ts +++ b/extensions/telegram/src/update-offset-store.test.ts @@ -319,7 +319,9 @@ describe("deleteTelegramUpdateOffset", () => { accountId: "default", botToken: "111111:rotated", onRotationDetected: async () => { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); cleaned = true; }, }); diff --git a/extensions/telegram/src/webhook.test.ts b/extensions/telegram/src/webhook.test.ts index 896407644d5..7039df8edbe 100644 --- a/extensions/telegram/src/webhook.test.ts +++ b/extensions/telegram/src/webhook.test.ts @@ -27,7 +27,9 @@ const WEBHOOK_DRAIN_GUARD_MS = 5; const TELEGRAM_WEBHOOK_RATE_LIMIT_BURST = WEBHOOK_RATE_LIMIT_DEFAULTS.maxRequests + 10; async function yieldWebhookTask(): Promise { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } function collectResponseBody( diff --git a/extensions/tlon/src/urbit/sse-client.ts b/extensions/tlon/src/urbit/sse-client.ts index ad801b3f445..9ee960f7263 100644 --- a/extensions/tlon/src/urbit/sse-client.ts +++ b/extensions/tlon/src/urbit/sse-client.ts @@ -387,7 +387,9 @@ export class UrbitSSEClient { ); // Wait 10 seconds before resetting and trying again const extendedBackoff = 10000; // 10 seconds - await new Promise((resolve) => setTimeout(resolve, extendedBackoff)); + await new Promise((resolve) => { + setTimeout(resolve, extendedBackoff); + }); this.reconnectAttempts = 0; // Reset counter to continue trying this.logger.log?.("[SSE] Reconnection attempts reset, resuming reconnection..."); } @@ -402,7 +404,9 @@ export class UrbitSSEClient { `[SSE] Reconnection attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts} in ${delay}ms...`, ); - await new Promise((resolve) => setTimeout(resolve, delay)); + await new Promise((resolve) => { + setTimeout(resolve, delay); + }); try { this.channelId = `${Math.floor(Date.now() / 1000)}-${randomUUID()}`; diff --git a/extensions/twitch/src/plugin.live.test.ts b/extensions/twitch/src/plugin.live.test.ts index 6b3b2c74247..5f670c7a3de 100644 --- a/extensions/twitch/src/plugin.live.test.ts +++ b/extensions/twitch/src/plugin.live.test.ts @@ -100,7 +100,9 @@ maybeDescribe("twitch live IRC lifecycle (skipped unless TWITCH_LIVE_TEST=1)", ( // Wait long enough that the original bug would have manifested. // The reported time-to-restart in #60071 is ~2ms after connect. const WATCH_MS = 15_000; - await new Promise((resolve) => setTimeout(resolve, WATCH_MS)); + await new Promise((resolve) => { + setTimeout(resolve, WATCH_MS); + }); expect(connectedAt, "expected onConnect within the watch window").not.toBeNull(); expect(settled, "task must not have settled before abort").toBe(false); diff --git a/extensions/voice-call/src/manager.notify.test.ts b/extensions/voice-call/src/manager.notify.test.ts index eb61ecee09f..57d594faeb8 100644 --- a/extensions/voice-call/src/manager.notify.test.ts +++ b/extensions/voice-call/src/manager.notify.test.ts @@ -99,7 +99,9 @@ function requireFirstMockCall(calls: readonly unknown[][], label: string): unkno type HarnessManager = Awaited>["manager"]; async function waitForPlaybackDispatch() { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } async function initiateCallWithMessage( diff --git a/extensions/voice-call/src/media-stream.test.ts b/extensions/voice-call/src/media-stream.test.ts index 1cefd107bb0..ff59c8ba92d 100644 --- a/extensions/voice-call/src/media-stream.test.ts +++ b/extensions/voice-call/src/media-stream.test.ts @@ -501,12 +501,20 @@ describe("MediaStreamHandler security hardening", () => { const first = new WebSocket(server.url, { headers: { "x-forwarded-for": "198.51.100.10" }, }); - await withTimeout(new Promise((resolve) => first.once("open", resolve))); + await withTimeout( + new Promise((resolve) => { + first.once("open", resolve); + }), + ); const second = new WebSocket(server.url, { headers: { "x-forwarded-for": "203.0.113.20" }, }); - await withTimeout(new Promise((resolve) => second.once("open", resolve))); + await withTimeout( + new Promise((resolve) => { + second.once("open", resolve); + }), + ); expect(first.readyState).toBe(WebSocket.OPEN); expect(second.readyState).toBe(WebSocket.OPEN); diff --git a/extensions/voice-call/src/providers/twilio.ts b/extensions/voice-call/src/providers/twilio.ts index cd11c9eb5ac..070b80c3793 100644 --- a/extensions/voice-call/src/providers/twilio.ts +++ b/extensions/voice-call/src/providers/twilio.ts @@ -768,7 +768,9 @@ export class TwilioProvider implements VoiceCallProvider { // Drift-corrected pacing: schedule against an absolute clock to avoid cumulative delay. const waitMs = nextChunkDueAt - Date.now(); if (waitMs > 0) { - await new Promise((resolve) => setTimeout(resolve, Math.ceil(waitMs))); + await new Promise((resolve) => { + setTimeout(resolve, Math.ceil(waitMs)); + }); } nextChunkDueAt += CHUNK_DELAY_MS; if (signal.aborted) { diff --git a/extensions/voice-call/src/tunnel.test.ts b/extensions/voice-call/src/tunnel.test.ts index 6239c8599bc..f2d2d1c14fd 100644 --- a/extensions/voice-call/src/tunnel.test.ts +++ b/extensions/voice-call/src/tunnel.test.ts @@ -103,7 +103,9 @@ describe("voice-call tunnels", () => { const settled = await Promise.race([ result.then(() => true), - new Promise((resolve) => setTimeout(() => resolve(false), 20)), + new Promise((resolve) => { + setTimeout(() => resolve(false), 20); + }), ]); expect(settled).toBe(true); diff --git a/extensions/voice-call/src/webhook/realtime-handler.ts b/extensions/voice-call/src/webhook/realtime-handler.ts index fb559b46e46..fbd32210a35 100644 --- a/extensions/voice-call/src/webhook/realtime-handler.ts +++ b/extensions/voice-call/src/webhook/realtime-handler.ts @@ -999,9 +999,9 @@ export class RealtimeCallHandler { if (quietFor >= CONSULT_TRANSCRIPT_SETTLE_MS || now >= deadline) { return; } - await new Promise((resolve) => - setTimeout(resolve, Math.min(CONSULT_TRANSCRIPT_SETTLE_MS - quietFor, deadline - now)), - ); + await new Promise((resolve) => { + setTimeout(resolve, Math.min(CONSULT_TRANSCRIPT_SETTLE_MS - quietFor, deadline - now)); + }); } } diff --git a/extensions/voyage/embedding-batch.ts b/extensions/voyage/embedding-batch.ts index 274dbb7d744..6e532251ae1 100644 --- a/extensions/voyage/embedding-batch.ts +++ b/extensions/voyage/embedding-batch.ts @@ -54,7 +54,10 @@ function resolveVoyageBatchDeps(overrides: Partial | undefined) now: overrides?.now ?? Date.now, sleep: overrides?.sleep ?? - (async (ms: number) => await new Promise((resolve) => setTimeout(resolve, ms))), + (async (ms: number) => + await new Promise((resolve) => { + setTimeout(resolve, ms); + })), postJsonWithRetry: overrides?.postJsonWithRetry ?? postJsonWithRetry, uploadBatchJsonlFile: overrides?.uploadBatchJsonlFile ?? uploadBatchJsonlFile, withRemoteHttpResponse: overrides?.withRemoteHttpResponse ?? withRemoteHttpResponse, diff --git a/extensions/whatsapp/src/auto-reply.test-harness.ts b/extensions/whatsapp/src/auto-reply.test-harness.ts index 3a4ddda171b..07b45dd9011 100644 --- a/extensions/whatsapp/src/auto-reply.test-harness.ts +++ b/extensions/whatsapp/src/auto-reply.test-harness.ts @@ -148,7 +148,9 @@ async function rmDirWithRetries( ? String((retryErr as { code?: unknown }).code) : null; if (code === "ENOTEMPTY" || code === "EBUSY" || code === "EPERM") { - await new Promise((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); continue; } throw retryErr; diff --git a/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts b/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts index 27923c93a5c..54a3acfcd9a 100644 --- a/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts +++ b/extensions/whatsapp/src/auto-reply.web-auto-reply.connection-and-logging.e2e.test.ts @@ -362,7 +362,9 @@ describe("web auto-reply connection", () => { const completedQuickly = await Promise.race([ run.then(() => true), - new Promise((resolve) => setTimeout(() => resolve(false), 60)), + new Promise((resolve) => { + setTimeout(() => resolve(false), 60); + }), ]); if (!completedQuickly) { diff --git a/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts b/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts index 5bad0857e6d..4faa03bf7cb 100644 --- a/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts +++ b/extensions/whatsapp/src/auto-reply/monitor/inbound-dispatch.ts @@ -843,7 +843,9 @@ async function finalizeWhatsAppStatusReaction(params: { if (params.outcome === "done") { await params.controller.setDone(); if (params.removeAckAfterReply) { - await new Promise((resolve) => setTimeout(resolve, params.timing.doneHoldMs)); + await new Promise((resolve) => { + setTimeout(resolve, params.timing.doneHoldMs); + }); await params.controller.clear(); } else { await params.controller.restoreInitial(); @@ -853,7 +855,9 @@ async function finalizeWhatsAppStatusReaction(params: { await params.controller.setError(); if (params.hasFinalResponse) { if (params.removeAckAfterReply) { - await new Promise((resolve) => setTimeout(resolve, params.timing.errorHoldMs)); + await new Promise((resolve) => { + setTimeout(resolve, params.timing.errorHoldMs); + }); await params.controller.clear(); } else { await params.controller.restoreInitial(); @@ -861,7 +865,9 @@ async function finalizeWhatsAppStatusReaction(params: { return; } if (params.removeAckAfterReply) { - await new Promise((resolve) => setTimeout(resolve, params.timing.errorHoldMs)); + await new Promise((resolve) => { + setTimeout(resolve, params.timing.errorHoldMs); + }); } await params.controller.restoreInitial(); } diff --git a/extensions/whatsapp/src/auto-reply/monitor/last-route.test.ts b/extensions/whatsapp/src/auto-reply/monitor/last-route.test.ts index 387aa8e6138..933e9d808b8 100644 --- a/extensions/whatsapp/src/auto-reply/monitor/last-route.test.ts +++ b/extensions/whatsapp/src/auto-reply/monitor/last-route.test.ts @@ -3,7 +3,9 @@ import { trackBackgroundTask } from "./last-route.js"; const waitForTaskCleanup = async (task: Promise) => { await Promise.allSettled([task]); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); }; describe("trackBackgroundTask", () => { diff --git a/extensions/whatsapp/src/login-qr.test.ts b/extensions/whatsapp/src/login-qr.test.ts index 0b54c5f630a..fbaeb5c9b93 100644 --- a/extensions/whatsapp/src/login-qr.test.ts +++ b/extensions/whatsapp/src/login-qr.test.ts @@ -58,7 +58,9 @@ async function flushTasks() { } async function waitMs(ms: number) { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } async function waitForQrRenderCallCount(count: number) { @@ -302,7 +304,10 @@ describe("login-qr", () => { it("does not short-circuit on an existing QR when the waiter has no current QR image", async () => { const accountId = "wait-without-current-qr"; waitForWaConnectionMock.mockImplementationOnce( - () => new Promise((resolve) => setTimeout(() => resolve(undefined), 20)), + () => + new Promise((resolve) => { + setTimeout(() => resolve(undefined), 20); + }), ); const start = await startWebLoginWithQr({ diff --git a/extensions/whatsapp/src/login-qr.ts b/extensions/whatsapp/src/login-qr.ts index 08025692f53..a5583179b18 100644 --- a/extensions/whatsapp/src/login-qr.ts +++ b/extensions/whatsapp/src/login-qr.ts @@ -56,7 +56,9 @@ type LoginQrRaceResult = | { outcome: "failed"; message: string }; function waitForNextTask(): Promise { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } const ACTIVE_LOGIN_TTL_MS = 3 * 60_000; @@ -541,9 +543,9 @@ export async function waitForWebLogin( message: "Still waiting for the QR scan. Let me know when you’ve scanned it.", }; } - const timeout = new Promise<"timeout">((resolve) => - setTimeout(() => resolve("timeout"), remaining), - ); + const timeout = new Promise<"timeout">((resolve) => { + setTimeout(() => resolve("timeout"), remaining); + }); const result = await Promise.race([ login.waitPromise.then(() => "done" as const), login.qrUpdatePromise.then(() => "qr-update" as const), diff --git a/extensions/whatsapp/src/monitor-inbox.test-harness.ts b/extensions/whatsapp/src/monitor-inbox.test-harness.ts index 98a8fac68a9..f3e05096897 100644 --- a/extensions/whatsapp/src/monitor-inbox.test-harness.ts +++ b/extensions/whatsapp/src/monitor-inbox.test-harness.ts @@ -293,8 +293,12 @@ export function getMonitorWebInbox(): MonitorWebInbox { } export async function settleInboundWork() { - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); } export function resetWebInboundDedupeForTests() { diff --git a/extensions/whatsapp/src/session.test.ts b/extensions/whatsapp/src/session.test.ts index 14bac093b88..de67e56dadb 100644 --- a/extensions/whatsapp/src/session.test.ts +++ b/extensions/whatsapp/src/session.test.ts @@ -47,7 +47,9 @@ let writeCredsJsonAtomically: typeof import("./session.js").writeCredsJsonAtomic let DEFAULT_WHATSAPP_SOCKET_TIMING: typeof import("./socket-timing.js").DEFAULT_WHATSAPP_SOCKET_TIMING; async function flushCredsUpdate() { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } async function emitCredsUpdate(authDir?: string) { diff --git a/extensions/workboard/src/store.test.ts b/extensions/workboard/src/store.test.ts index b38f7d8bf38..520db0eaddf 100644 --- a/extensions/workboard/src/store.test.ts +++ b/extensions/workboard/src/store.test.ts @@ -1642,7 +1642,9 @@ describe("WorkboardStore", () => { } triggered = true; proofPromise = store.addProof(value.card.id, { status: "passed", label: "CI" }); - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); }, }); const store: WorkboardStore = new WorkboardStore(keyed); diff --git a/extensions/xai/realtime-transcription-provider.test.ts b/extensions/xai/realtime-transcription-provider.test.ts index f817222b5b1..f1e611907b0 100644 --- a/extensions/xai/realtime-transcription-provider.test.ts +++ b/extensions/xai/realtime-transcription-provider.test.ts @@ -90,14 +90,20 @@ async function createRealtimeSttServer(params?: { }); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); const port = (server.address() as AddressInfo).port; cleanup = async () => { for (const ws of clients) { ws.terminate(); } - await new Promise((resolve) => wss.close(() => resolve())); - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); + await new Promise((resolve) => { + server.close(() => resolve()); + }); }; return { baseUrl: `http://127.0.0.1:${port}/v1`, done, donePromise }; } diff --git a/extensions/xai/xai-oauth.ts b/extensions/xai/xai-oauth.ts index a3ecda5738b..3ebf6efdb1d 100644 --- a/extensions/xai/xai-oauth.ts +++ b/extensions/xai/xai-oauth.ts @@ -425,16 +425,16 @@ async function pollXaiDeviceCodeToken( const error = parseXaiOAuthErrorResponse(body).error; if (error === "authorization_pending") { - await new Promise((resolve) => - setTimeout(resolve, resolveNextXaiDeviceCodePollDelayMs(intervalMs, deadlineMs)), - ); + await new Promise((resolve) => { + setTimeout(resolve, resolveNextXaiDeviceCodePollDelayMs(intervalMs, deadlineMs)); + }); continue; } if (error === "slow_down") { intervalMs += XAI_DEVICE_CODE_SLOW_DOWN_INCREMENT_MS; - await new Promise((resolve) => - setTimeout(resolve, resolveNextXaiDeviceCodePollDelayMs(intervalMs, deadlineMs)), - ); + await new Promise((resolve) => { + setTimeout(resolve, resolveNextXaiDeviceCodePollDelayMs(intervalMs, deadlineMs)); + }); continue; } if (error === "access_denied" || error === "authorization_denied") { diff --git a/extensions/zalo/src/monitor.lifecycle.test.ts b/extensions/zalo/src/monitor.lifecycle.test.ts index b4573d088b7..98102e50162 100644 --- a/extensions/zalo/src/monitor.lifecycle.test.ts +++ b/extensions/zalo/src/monitor.lifecycle.test.ts @@ -41,7 +41,9 @@ const TEST_CONFIG = {} as OpenClawConfig; async function settleLifecycleWork(): Promise { for (let i = 0; i < 6; i += 1) { await Promise.resolve(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } } diff --git a/extensions/zalo/src/monitor.ts b/extensions/zalo/src/monitor.ts index 806f3f4a749..03ecb66c245 100644 --- a/extensions/zalo/src/monitor.ts +++ b/extensions/zalo/src/monitor.ts @@ -282,7 +282,9 @@ function startPollingLoop(params: ZaloPollingLoopParams) { // no updates } else if (!isStopped() && !abortSignal.aborted) { runtime.error?.(`[${account.accountId}] Zalo polling error: ${formatZaloError(err)}`); - await new Promise((resolve) => setTimeout(resolve, 5000)); + await new Promise((resolve) => { + setTimeout(resolve, 5000); + }); } } diff --git a/extensions/zalo/src/test-support/lifecycle-test-support.ts b/extensions/zalo/src/test-support/lifecycle-test-support.ts index 471220905c3..e0976eb85b0 100644 --- a/extensions/zalo/src/test-support/lifecycle-test-support.ts +++ b/extensions/zalo/src/test-support/lifecycle-test-support.ts @@ -398,7 +398,9 @@ export function expectImageLifecycleDelivery(params: { export async function settleAsyncWork(): Promise { for (let i = 0; i < 6; i += 1) { await Promise.resolve(); - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); } } diff --git a/extensions/zalouser/src/probe.test.ts b/extensions/zalouser/src/probe.test.ts index 1998abf1eae..46703be514f 100644 --- a/extensions/zalouser/src/probe.test.ts +++ b/extensions/zalouser/src/probe.test.ts @@ -48,7 +48,7 @@ describe("probeZalouser", () => { it("times out when lookup takes too long", async () => { vi.useFakeTimers(); - mockGetUserInfo.mockReturnValueOnce(new Promise(() => undefined)); + mockGetUserInfo.mockReturnValueOnce(new Promise(() => {})); const pending = probeZalouser("default", 10); await vi.advanceTimersByTimeAsync(1000); @@ -61,7 +61,7 @@ describe("probeZalouser", () => { it("caps oversized lookup timeout before scheduling", async () => { vi.useFakeTimers(); - mockGetUserInfo.mockReturnValueOnce(new Promise(() => undefined)); + mockGetUserInfo.mockReturnValueOnce(new Promise(() => {})); const timeoutSpy = vi.spyOn(globalThis, "setTimeout"); void probeZalouser("default", Number.MAX_SAFE_INTEGER); diff --git a/extensions/zalouser/src/probe.ts b/extensions/zalouser/src/probe.ts index 95cc13a7690..d76b78fd37b 100644 --- a/extensions/zalouser/src/probe.ts +++ b/extensions/zalouser/src/probe.ts @@ -16,9 +16,9 @@ export async function probeZalouser( const user = timeoutMs ? await Promise.race([ getZaloUserInfo(profile), - new Promise((resolve) => - setTimeout(() => resolve(null), resolveTimerTimeoutMs(timeoutMs, 1000, 1000)), - ), + new Promise((resolve) => { + setTimeout(() => resolve(null), resolveTimerTimeoutMs(timeoutMs, 1000, 1000)); + }), ]) : await getZaloUserInfo(profile); diff --git a/extensions/zalouser/src/zalo-js.credentials.test.ts b/extensions/zalouser/src/zalo-js.credentials.test.ts index 0a6fc77a0d2..30b0a7b812a 100644 --- a/extensions/zalouser/src/zalo-js.credentials.test.ts +++ b/extensions/zalouser/src/zalo-js.credentials.test.ts @@ -160,7 +160,7 @@ describe("zalouser credential persistence", () => { it("caps oversized QR start timeout before computing the polling deadline", async () => { createZaloMock.mockResolvedValueOnce({ - loginQR: async () => new Promise(() => undefined), + loginQR: async () => new Promise(() => {}), }); const nowSpy = vi.spyOn(Date, "now"); nowSpy diff --git a/packages/gateway-client/src/client.watchdog.test.ts b/packages/gateway-client/src/client.watchdog.test.ts index f8adc465793..4ce20ca594c 100644 --- a/packages/gateway-client/src/client.watchdog.test.ts +++ b/packages/gateway-client/src/client.watchdog.test.ts @@ -82,13 +82,17 @@ describe("GatewayClient", () => { for (const client of wss.clients) { client.terminate(); } - await new Promise((resolve) => wss?.close(() => resolve())); + await new Promise((resolve) => { + wss?.close(() => resolve()); + }); wss = null; } if (httpsServer) { httpsServer.closeAllConnections?.(); httpsServer.closeIdleConnections?.(); - await new Promise((resolve) => httpsServer?.close(() => resolve())); + await new Promise((resolve) => { + httpsServer?.close(() => resolve()); + }); httpsServer = null; } }); diff --git a/packages/llm-core/src/utils/event-stream.ts b/packages/llm-core/src/utils/event-stream.ts index d4473035b63..e364b9d99e1 100644 --- a/packages/llm-core/src/utils/event-stream.ts +++ b/packages/llm-core/src/utils/event-stream.ts @@ -60,9 +60,9 @@ export class EventStream implements AsyncIterable { } else if (this.done) { return; } else { - const result = await new Promise>((resolve) => - this.waiting.push(resolve), - ); + const result = await new Promise>((resolve) => { + this.waiting.push(resolve); + }); if (result.done) { return; } diff --git a/packages/media-core/src/read-response-with-limit.test.ts b/packages/media-core/src/read-response-with-limit.test.ts index 59ff58732a6..ccbba435cce 100644 --- a/packages/media-core/src/read-response-with-limit.test.ts +++ b/packages/media-core/src/read-response-with-limit.test.ts @@ -1,5 +1,5 @@ -import { beforeEach, describe, expect, it, vi } from "vitest"; import { MAX_TIMER_TIMEOUT_MS } from "@openclaw/normalization-core/number-coercion"; +import { beforeEach, describe, expect, it, vi } from "vitest"; import { readResponseTextSnippet, readResponseWithLimit } from "./read-response-with-limit.js"; function makeStream(chunks: Uint8Array[], delayMs?: number) { @@ -7,7 +7,9 @@ function makeStream(chunks: Uint8Array[], delayMs?: number) { async start(controller) { for (const chunk of chunks) { if (delayMs) { - await new Promise((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); } controller.enqueue(chunk); } diff --git a/packages/memory-host-sdk/src/host/embeddings.test.ts b/packages/memory-host-sdk/src/host/embeddings.test.ts index 8b21a567bf2..da3be944e27 100644 --- a/packages/memory-host-sdk/src/host/embeddings.test.ts +++ b/packages/memory-host-sdk/src/host/embeddings.test.ts @@ -430,7 +430,9 @@ process.on("message", (message) => { const closePromise = provider.close?.() ?? Promise.resolve(); const closeResult = await Promise.race([ closePromise.then(() => "closed" as const), - new Promise<"timeout">((resolve) => setTimeout(() => resolve("timeout"), 1_000)), + new Promise<"timeout">((resolve) => { + setTimeout(() => resolve("timeout"), 1_000); + }), ]); expect(closeResult).toBe("closed"); diff --git a/packages/memory-host-sdk/src/host/retry-utils.ts b/packages/memory-host-sdk/src/host/retry-utils.ts index ff632f15178..4e91a9931f5 100644 --- a/packages/memory-host-sdk/src/host/retry-utils.ts +++ b/packages/memory-host-sdk/src/host/retry-utils.ts @@ -30,7 +30,9 @@ const DEFAULT_RETRY_CONFIG = { }; function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function asFiniteNumber(value: unknown): number | undefined { diff --git a/packages/sdk/src/index.e2e.test.ts b/packages/sdk/src/index.e2e.test.ts index cb216811650..2e2ac56aef3 100644 --- a/packages/sdk/src/index.e2e.test.ts +++ b/packages/sdk/src/index.e2e.test.ts @@ -44,7 +44,9 @@ function readRawMessage(raw: RawData): string { async function reservePort(): Promise { const server = net.createServer(); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); const { port } = server.address() as AddressInfo; await new Promise((resolve, reject) => { server.close((error) => (error ? reject(error) : resolve())); @@ -71,7 +73,9 @@ async function withTimeout(promise: Promise, timeoutMs: number, message: s async function createFakeGateway(port = 0): Promise { const server = new WebSocketServer({ host: "127.0.0.1", port }); servers.push(server); - await new Promise((resolve) => server.once("listening", resolve)); + await new Promise((resolve) => { + server.once("listening", resolve); + }); let seq = 1; const requests: FakeGatewayRequest[] = []; const sockets = new Set(); diff --git a/scripts/anthropic-prompt-probe.ts b/scripts/anthropic-prompt-probe.ts index 0345754d601..13afd077b58 100644 --- a/scripts/anthropic-prompt-probe.ts +++ b/scripts/anthropic-prompt-probe.ts @@ -242,7 +242,9 @@ function resolveSetupTokenSource(): TokenSource { } async function sleep(ms: number): Promise { - return await new Promise((resolve) => setTimeout(resolve, ms)); + return await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } async function withTimeout( @@ -493,7 +495,9 @@ async function startGatewayProcess(params: { child.kill("SIGINT"); } const exited = await withTimeout( - new Promise((resolve) => child.once("exit", () => resolve(true))), + new Promise((resolve) => { + child.once("exit", () => resolve(true)); + }), 1_500, () => false, ); diff --git a/scripts/check-gateway-watch-regression.mjs b/scripts/check-gateway-watch-regression.mjs index 202a48dc585..e7a67d37dc7 100644 --- a/scripts/check-gateway-watch-regression.mjs +++ b/scripts/check-gateway-watch-regression.mjs @@ -298,7 +298,9 @@ function runCheckedCommand(command, args) { } function sleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function parsePsCpuTimeMs(timeText) { diff --git a/scripts/check-memory-fd-repro.mjs b/scripts/check-memory-fd-repro.mjs index ef3d399df75..3202f6df21f 100644 --- a/scripts/check-memory-fd-repro.mjs +++ b/scripts/check-memory-fd-repro.mjs @@ -222,7 +222,9 @@ function logStep(message) { } function sleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } async function getFreePort() { diff --git a/scripts/control-ui-i18n.ts b/scripts/control-ui-i18n.ts index 8639a129111..f1d3cbf66aa 100644 --- a/scripts/control-ui-i18n.ts +++ b/scripts/control-ui-i18n.ts @@ -601,7 +601,9 @@ function buildBatchPrompt(items: readonly TranslationBatchItem[]): string { } function sleep(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function formatDuration(ms: number): string { diff --git a/scripts/dev/discord-acp-plain-language-smoke.ts b/scripts/dev/discord-acp-plain-language-smoke.ts index 39531d9dacb..64d50d95c7c 100644 --- a/scripts/dev/discord-acp-plain-language-smoke.ts +++ b/scripts/dev/discord-acp-plain-language-smoke.ts @@ -140,7 +140,9 @@ const DISCORD_RESPONSE_BODY_MAX_BYTES = 1024 * 1024; const WEBHOOK_CLEANUP_TIMEOUT_MS = 10_000; function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function remainingTimeoutMs(deadlineMs: number, nowMs = Date.now()): number { diff --git a/scripts/dev/ios-node-e2e.ts b/scripts/dev/ios-node-e2e.ts index e6930c4d0f8..16c3d3b2529 100644 --- a/scripts/dev/ios-node-e2e.ts +++ b/scripts/dev/ios-node-e2e.ts @@ -145,7 +145,9 @@ async function main() { const waitSeconds = Number.parseInt(getArg("--wait-seconds") ?? "25", 10); const deadline = Date.now() + Math.max(1, waitSeconds) * 1000; while (!node && Date.now() < deadline) { - await new Promise((r) => setTimeout(r, 1000)); + await new Promise((r) => { + setTimeout(r, 1000); + }); const res = await request("node.list").catch(() => null); if (!res?.ok) { continue; diff --git a/scripts/dev/tui-pty-test-watch.ts b/scripts/dev/tui-pty-test-watch.ts index 08c717bd328..7bf4f37bcbe 100644 --- a/scripts/dev/tui-pty-test-watch.ts +++ b/scripts/dev/tui-pty-test-watch.ts @@ -54,7 +54,9 @@ function parseOptions(args = process.argv.slice(2)): Options { } function delay(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function shouldUseAltScreen(options: Options) { diff --git a/scripts/e2e/kitchen-sink-rpc-walk.mjs b/scripts/e2e/kitchen-sink-rpc-walk.mjs index adbefe6abe9..fe6e55a05d9 100644 --- a/scripts/e2e/kitchen-sink-rpc-walk.mjs +++ b/scripts/e2e/kitchen-sink-rpc-walk.mjs @@ -713,7 +713,9 @@ export async function stopGateway(child, options = {}) { } const teardownGraceMs = Math.max(0, options.teardownGraceMs ?? GATEWAY_TEARDOWN_GRACE_MS); const killGraceMs = Math.max(0, options.killGraceMs ?? GATEWAY_TEARDOWN_KILL_GRACE_MS); - const exited = new Promise((resolve) => child.once("exit", resolve)); + const exited = new Promise((resolve) => { + child.once("exit", resolve); + }); const waitForExit = async (ms) => hasChildExited(child) ? true diff --git a/scripts/e2e/lib/config-reload/assert-log.mjs b/scripts/e2e/lib/config-reload/assert-log.mjs index e5c4b015267..fe60df49006 100644 --- a/scripts/e2e/lib/config-reload/assert-log.mjs +++ b/scripts/e2e/lib/config-reload/assert-log.mjs @@ -5,7 +5,10 @@ const logPath = process.env.OPENCLAW_CONFIG_RELOAD_LOG_PATH ?? "/tmp/config-relo const deadlineMs = Date.now() + readPositiveIntEnv("OPENCLAW_CONFIG_RELOAD_LOG_TIMEOUT_MS", 30_000); const maxReadBytes = readPositiveIntEnv("OPENCLAW_CONFIG_RELOAD_LOG_MAX_READ_BYTES", 256 * 1024); -const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); +const sleep = (ms) => + new Promise((resolve) => { + setTimeout(resolve, ms); + }); const scanner = createConfigReloadLogScanner(logPath, { maxReadBytes, tailLineLimit: 160, diff --git a/scripts/e2e/lib/gateway-network/client.mjs b/scripts/e2e/lib/gateway-network/client.mjs index edfc1af30ec..ecfb4851643 100644 --- a/scripts/e2e/lib/gateway-network/client.mjs +++ b/scripts/e2e/lib/gateway-network/client.mjs @@ -12,7 +12,9 @@ if (!url || !token) { const deadline = Date.now() + readGatewayNetworkClientConnectTimeoutMs(); function delay(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } async function openSocket(timeoutMs = 10_000) { @@ -90,10 +92,7 @@ while (Date.now() < deadline) { } } else { ws.send(JSON.stringify({ type: "req", id: "h1", method: "health" })); - const healthRes = await onceFrame( - ws, - (frame) => frame?.type === "res" && frame?.id === "h1", - ); + const healthRes = await onceFrame(ws, (frame) => frame?.type === "res" && frame?.id === "h1"); if (healthRes.ok) { ws.close(); console.log("ok"); diff --git a/scripts/e2e/lib/plugin-update/probe.mjs b/scripts/e2e/lib/plugin-update/probe.mjs index 4876ca1b8d4..4433ef6871c 100644 --- a/scripts/e2e/lib/plugin-update/probe.mjs +++ b/scripts/e2e/lib/plugin-update/probe.mjs @@ -71,7 +71,9 @@ async function waitRegistry() { if (await registryHealthy()) { return; } - await new Promise((resolve) => setTimeout(resolve, 100)); + await new Promise((resolve) => { + setTimeout(resolve, 100); + }); } throw new Error("Local npm metadata registry failed to start"); } @@ -172,10 +174,7 @@ function assertCorruptPluginDetails(plugins, pluginId) { const evidence = collectPluginEvidence(plugins, pluginId); const outcome = evidence.outcome; const disabledAfterFailure = isCorruptPluginDisabledAfterUpdate(evidence, pluginId); - if ( - !outcome || - (outcome.status !== "error" && !disabledAfterFailure) - ) { + if (!outcome || (outcome.status !== "error" && !disabledAfterFailure)) { throw new Error( `expected error or disabled-after-failure outcome for ${pluginId}, got ${JSON.stringify({ outcomes: plugins.npm?.outcomes ?? [], diff --git a/scripts/e2e/lib/release-user-journey/assertions.mjs b/scripts/e2e/lib/release-user-journey/assertions.mjs index abd93f9cfb1..f51c114cf7b 100644 --- a/scripts/e2e/lib/release-user-journey/assertions.mjs +++ b/scripts/e2e/lib/release-user-journey/assertions.mjs @@ -289,7 +289,9 @@ async function waitClickClackSocket() { return; } } - await new Promise((resolve) => setTimeout(resolve, 250)); + await new Promise((resolve) => { + setTimeout(resolve, 250); + }); } throw new Error(`Timed out waiting for ClickClack websocket connection at ${baseUrl}`); } @@ -315,7 +317,9 @@ async function waitClickClackReply() { return; } } - await new Promise((resolve) => setTimeout(resolve, 250)); + await new Promise((resolve) => { + setTimeout(resolve, 250); + }); } const state = fs.existsSync(statePath) ? fs.readFileSync(statePath, "utf8") : ""; throw new Error(`Timed out waiting for ClickClack reply marker ${marker}. State: ${state}`); diff --git a/scripts/e2e/lib/upgrade-survivor/probe-gateway.mjs b/scripts/e2e/lib/upgrade-survivor/probe-gateway.mjs index a3202262003..01208f01fea 100644 --- a/scripts/e2e/lib/upgrade-survivor/probe-gateway.mjs +++ b/scripts/e2e/lib/upgrade-survivor/probe-gateway.mjs @@ -169,7 +169,9 @@ while (Date.now() - startedAt <= timeoutMs) { } catch (error) { lastError = error instanceof Error ? error.message : String(error); } - await new Promise((resolve) => setTimeout(resolve, 500)); + await new Promise((resolve) => { + setTimeout(resolve, 500); + }); } const suffix = lastResult ? ` (last HTTP ${lastResult.status}: ${lastResult.text})` : ""; diff --git a/scripts/e2e/npm-telegram-rtt-credentials.mjs b/scripts/e2e/npm-telegram-rtt-credentials.mjs index 564146114d3..86278b92323 100755 --- a/scripts/e2e/npm-telegram-rtt-credentials.mjs +++ b/scripts/e2e/npm-telegram-rtt-credentials.mjs @@ -396,7 +396,9 @@ async function acquireWithRetry(config) { "ETIMEDOUT", ); } - await new Promise((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); } } } @@ -451,7 +453,9 @@ async function heartbeat(opts) { config.heartbeatIntervalMs, "heartbeatIntervalMs", ); - await new Promise((resolve) => setTimeout(resolve, intervalMs)); + await new Promise((resolve) => { + setTimeout(resolve, intervalMs); + }); } } diff --git a/scripts/e2e/npm-telegram-rtt-driver.mjs b/scripts/e2e/npm-telegram-rtt-driver.mjs index bfad135d0c7..172777c3b5d 100755 --- a/scripts/e2e/npm-telegram-rtt-driver.mjs +++ b/scripts/e2e/npm-telegram-rtt-driver.mjs @@ -131,7 +131,9 @@ const observedMessages = []; let driverUpdateOffset = 0; function sleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function messageText(message) { diff --git a/scripts/e2e/parallels/guest-transports.ts b/scripts/e2e/parallels/guest-transports.ts index 056cbc21b9f..331a4148571 100644 --- a/scripts/e2e/parallels/guest-transports.ts +++ b/scripts/e2e/parallels/guest-transports.ts @@ -36,7 +36,9 @@ function timeoutBefore(deadline: number, fallbackMs: number): number { } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function throwIfFailed(label: string, result: CommandResult, check: boolean | undefined): void { diff --git a/scripts/e2e/parallels/host-server.ts b/scripts/e2e/parallels/host-server.ts index e1d27f954bb..31ea1946e19 100644 --- a/scripts/e2e/parallels/host-server.ts +++ b/scripts/e2e/parallels/host-server.ts @@ -121,7 +121,9 @@ async function waitForHostServer( if (await canConnect(port)) { return; } - await new Promise((resolve) => setTimeout(resolve, 100)); + await new Promise((resolve) => { + setTimeout(resolve, 100); + }); } child.kill("SIGTERM"); die(`host artifact server did not start on port ${port}: ${stderr.trim()}`); @@ -151,7 +153,9 @@ async function canConnect(port: number): Promise { } async function delay(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } export const testing = { diff --git a/scripts/e2e/parallels/npm-update-smoke.ts b/scripts/e2e/parallels/npm-update-smoke.ts index 09899f64659..c79398d23d3 100755 --- a/scripts/e2e/parallels/npm-update-smoke.ts +++ b/scripts/e2e/parallels/npm-update-smoke.ts @@ -666,7 +666,9 @@ class NpmUpdateSmoke { private async monitorJobs(label: string, jobs: Job[]): Promise { const pending = new Set(jobs.map((job) => job.label)); while (pending.size > 0) { - await new Promise((resolve) => setTimeout(resolve, 15_000)); + await new Promise((resolve) => { + setTimeout(resolve, 15_000); + }); for (const job of jobs) { if (!pending.has(job.label)) { continue; diff --git a/scripts/e2e/parallels/package-artifact.ts b/scripts/e2e/parallels/package-artifact.ts index 6b1748785e5..24fb46ecadc 100644 --- a/scripts/e2e/parallels/package-artifact.ts +++ b/scripts/e2e/parallels/package-artifact.ts @@ -283,5 +283,7 @@ function isErrorCode(error: unknown, code: string): boolean { } async function delay(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } diff --git a/scripts/e2e/secret-provider-integrations.mjs b/scripts/e2e/secret-provider-integrations.mjs index 0158549e13c..f7dfeea287d 100644 --- a/scripts/e2e/secret-provider-integrations.mjs +++ b/scripts/e2e/secret-provider-integrations.mjs @@ -270,9 +270,9 @@ async function allocatePort() { }); const address = server.address(); const port = typeof address === "object" && address ? address.port : 0; - await new Promise((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ); + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); if (!port) { throw new Error("failed to allocate a local port"); } @@ -556,15 +556,7 @@ function serviceManagerEnv(source) { async function startGateway(envCtx, port, token = TOKEN_V1) { const command = await resolveOpenClawCommand( - [ - "gateway", - "run", - "--port", - String(port), - "--bind", - "loopback", - "--allow-unconfigured", - ], + ["gateway", "run", "--port", String(port), "--bind", "loopback", "--allow-unconfigured"], envCtx.env, { detached: process.platform !== "win32", @@ -725,15 +717,7 @@ async function expectReloadMayCloseForAuthChange(env, port, token) { async function expectGatewayStartupFails(envCtx, port, reason) { const command = await resolveOpenClawCommand( - [ - "gateway", - "run", - "--port", - String(port), - "--bind", - "loopback", - "--allow-unconfigured", - ], + ["gateway", "run", "--port", String(port), "--bind", "loopback", "--allow-unconfigured"], envCtx.env, { detached: process.platform !== "win32", @@ -1344,28 +1328,16 @@ async function p12OpenAiLiveProof() { async function runPtySecretsConfigurePreset(envCtx) { const { spawn } = await import("@lydell/node-pty"); const command = await resolveOpenClawCommand( - [ - "secrets", - "configure", - "--providers-only", - "--apply", - "--yes", - "--allow-exec", - "--json", - ], + ["secrets", "configure", "--providers-only", "--apply", "--yes", "--allow-exec", "--json"], envCtx.env, ); - const child = spawn( - command.command, - command.args, - { - name: "xterm-256color", - cols: 100, - rows: 30, - cwd: command.options.cwd ?? process.cwd(), - env: command.options.env ?? envCtx.env, - }, - ); + const child = spawn(command.command, command.args, { + name: "xterm-256color", + cols: 100, + rows: 30, + cwd: command.options.cwd ?? process.cwd(), + env: command.options.env ?? envCtx.env, + }); let output = ""; let phase = "providers-menu"; const sendKeys = (keys) => { diff --git a/scripts/e2e/telegram-user-crabbox-proof.ts b/scripts/e2e/telegram-user-crabbox-proof.ts index 7c8306db3d4..b65c7364370 100644 --- a/scripts/e2e/telegram-user-crabbox-proof.ts +++ b/scripts/e2e/telegram-user-crabbox-proof.ts @@ -786,7 +786,9 @@ export async function waitForLog( if (pattern.test(text)) { return; } - await new Promise((resolve) => setTimeout(resolve, 500)); + await new Promise((resolve) => { + setTimeout(resolve, 500); + }); } const text = readLogTail(logPath); throw new Error(`${label} did not become ready within ${timeoutMs}ms\n${text.slice(-4000)}`); @@ -1220,7 +1222,9 @@ async function runRemoteCommand(params: { if (attempt === 4 || !isTransientSshFailure(error)) { throw error; } - await new Promise((resolve) => setTimeout(resolve, attempt * 3000)); + await new Promise((resolve) => { + setTimeout(resolve, attempt * 3000); + }); } } throw lastError; @@ -2425,9 +2429,13 @@ async function main() { ], { cwd: root, stdio: "inherit" }, ); - await new Promise((resolve) => setTimeout(resolve, 3_000)); + await new Promise((resolve) => { + setTimeout(resolve, 3_000); + }); await sshRun(root, inspect, `bash ${REMOTE_ROOT}/remote-probe.sh`); - const recordCode = await new Promise((resolve) => recording.on("exit", resolve)); + const recordCode = await new Promise((resolve) => { + recording.on("exit", resolve); + }); if (recordCode !== 0) { throw new Error(`Crabbox recording failed with exit code ${recordCode ?? "unknown"}.`); } diff --git a/scripts/embedded-run-abort-leak.ts b/scripts/embedded-run-abort-leak.ts index 88bbba6a7b4..987ec5b31a2 100644 --- a/scripts/embedded-run-abort-leak.ts +++ b/scripts/embedded-run-abort-leak.ts @@ -257,10 +257,14 @@ function runOnce(mode: Mode, scopeBytes: number, iter: number): void { async function settleAndGc(): Promise { for (let i = 0; i < 4; i += 1) { - await new Promise((r) => setImmediate(r)); + await new Promise((r) => { + setImmediate(r); + }); globalThis.gc?.(); } - await new Promise((r) => setTimeout(r, 100)); + await new Promise((r) => { + setTimeout(r, 100); + }); globalThis.gc?.(); } diff --git a/scripts/lib/gateway-bench-child.ts b/scripts/lib/gateway-bench-child.ts index b5ac7387dc5..ce999d1d3d2 100644 --- a/scripts/lib/gateway-bench-child.ts +++ b/scripts/lib/gateway-bench-child.ts @@ -13,7 +13,9 @@ export type StopChildResult = ChildExit & { }; export function delay(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } export async function stopChild( @@ -40,7 +42,9 @@ export async function stopChild( const waitForExit = async (ms: number): Promise => await Promise.race([exited, delay(ms).then(() => null)]); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const queuedExit = observedExit ?? currentExit(); if (queuedExit != null) { return { ...queuedExit, exitedBeforeTeardown: true }; diff --git a/scripts/lib/release-beta-verifier.ts b/scripts/lib/release-beta-verifier.ts index bc1b5c90713..8b3340909cc 100644 --- a/scripts/lib/release-beta-verifier.ts +++ b/scripts/lib/release-beta-verifier.ts @@ -224,7 +224,9 @@ async function fetchWithRetry( lastError = error; } if (attempt < attempts) { - await new Promise((resolveDelay) => setTimeout(resolveDelay, attempt * 1000)); + await new Promise((resolveDelay) => { + setTimeout(resolveDelay, attempt * 1000); + }); } } const message = lastError instanceof Error ? lastError.message : String(lastError); diff --git a/scripts/openclaw-cross-os-release-checks.ts b/scripts/openclaw-cross-os-release-checks.ts index 65e2e0c763b..3e1cb91deb2 100644 --- a/scripts/openclaw-cross-os-release-checks.ts +++ b/scripts/openclaw-cross-os-release-checks.ts @@ -3968,7 +3968,9 @@ function formatError(error) { } function sleep(ms) { - return new Promise((resolvePromise) => setTimeout(resolvePromise, ms)); + return new Promise((resolvePromise) => { + setTimeout(resolvePromise, ms); + }); } async function withAllocatedGatewayPort(lane, callback) { diff --git a/scripts/qa-otel-smoke.ts b/scripts/qa-otel-smoke.ts index cc0448b4efd..bb3fa8f2893 100644 --- a/scripts/qa-otel-smoke.ts +++ b/scripts/qa-otel-smoke.ts @@ -835,7 +835,9 @@ async function waitForLocalPort(port: number, timeoutMs: number, readFailure: () if (failure) { throw new Error(failure); } - await new Promise((resolve) => setTimeout(resolve, 500)); + await new Promise((resolve) => { + setTimeout(resolve, 500); + }); } throw new Error(`timed out waiting for OpenTelemetry Collector on 127.0.0.1:${port}`); } @@ -1045,7 +1047,9 @@ function isLatestGenAiModelCallSpan(span: CapturedSpan): boolean { } async function delay(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function hasRequiredSmokeSignals(receiver: ReturnType): boolean { diff --git a/scripts/release-beta-smoke.ts b/scripts/release-beta-smoke.ts index cb80b5c42c3..be5b8f5efa7 100644 --- a/scripts/release-beta-smoke.ts +++ b/scripts/release-beta-smoke.ts @@ -305,7 +305,9 @@ async function findDispatchedWorkflowRunId(params: { if (runId) { return runId; } - await new Promise((resolve) => setTimeout(resolve, 5_000)); + await new Promise((resolve) => { + setTimeout(resolve, 5_000); + }); } throw new Error(`could not find dispatched run for ${params.workflow}`); } @@ -355,7 +357,11 @@ export async function pollRun( const timeoutMs = Math.max(1, options.timeoutMs ?? TELEGRAM_POLL_TIMEOUT_MS); const pollIntervalMs = Math.max(1, options.pollIntervalMs ?? TELEGRAM_POLL_INTERVAL_MS); const sleep = - options.sleep ?? ((ms: number) => new Promise((resolve) => setTimeout(resolve, ms))); + options.sleep ?? + ((ms: number) => + new Promise((resolve) => { + setTimeout(resolve, ms); + })); const readRun = options.readRun ?? ((currentRepo: string, currentRunId: string) => diff --git a/scripts/release-candidate-checklist.mjs b/scripts/release-candidate-checklist.mjs index 8d6dfcd7f79..479da654533 100644 --- a/scripts/release-candidate-checklist.mjs +++ b/scripts/release-candidate-checklist.mjs @@ -288,7 +288,9 @@ export function parseRunIdFromDispatchOutput(output) { } async function wait(ms) { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } async function findNewRunId(repo, workflowFile, workflowName, beforeIds) { diff --git a/scripts/run-node.mjs b/scripts/run-node.mjs index e7511312c8c..4742e56491c 100644 --- a/scripts/run-node.mjs +++ b/scripts/run-node.mjs @@ -667,7 +667,10 @@ const parsePositiveIntegerEnv = (env, name, fallback) => { return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback; }; -const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); +const sleep = (ms) => + new Promise((resolve) => { + setTimeout(resolve, ms); + }); const resolveRunNodeOutputLogPath = (deps) => { const outputLog = deps.env[RUN_NODE_OUTPUT_LOG_ENV]?.trim(); diff --git a/scripts/verify-plugin-npm-published-runtime.mjs b/scripts/verify-plugin-npm-published-runtime.mjs index eb9cbd64eca..4c9aa9d7de8 100644 --- a/scripts/verify-plugin-npm-published-runtime.mjs +++ b/scripts/verify-plugin-npm-published-runtime.mjs @@ -230,7 +230,9 @@ function npmViewReadme(spec) { } function sleep(ms) { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } export function readPositiveIntEnv(name, fallback, env = process.env) { diff --git a/scripts/watch-node.mjs b/scripts/watch-node.mjs index bed025f9653..ce1b8e08351 100644 --- a/scripts/watch-node.mjs +++ b/scripts/watch-node.mjs @@ -92,7 +92,10 @@ const isProcessAlive = (pid, signalProcess) => { return true; }; -const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); +const sleep = (ms) => + new Promise((resolve) => { + setTimeout(resolve, ms); + }); const createWatchLockKey = (cwd, args) => createHash("sha256").update(cwd).update("\0").update(args.join("\0")).digest("hex").slice(0, 12); diff --git a/scripts/write-cli-compat.ts b/scripts/write-cli-compat.ts index 0ff1ac2ffa7..83c8a0205b8 100644 --- a/scripts/write-cli-compat.ts +++ b/scripts/write-cli-compat.ts @@ -48,12 +48,16 @@ const findRunnerCandidates = () => // Retry briefly to avoid flaky builds. let candidates = findCandidates(); for (let i = 0; i < 10 && candidates.length === 0; i++) { - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => { + setTimeout(resolve, 50); + }); candidates = findCandidates(); } let runnerCandidates = findRunnerCandidates(); for (let i = 0; i < 10 && runnerCandidates.length === 0; i++) { - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => { + setTimeout(resolve, 50); + }); runnerCandidates = findRunnerCandidates(); } diff --git a/src/acp/control-plane/manager.turn-results.test.ts b/src/acp/control-plane/manager.turn-results.test.ts index d20e3205639..e854363028f 100644 --- a/src/acp/control-plane/manager.turn-results.test.ts +++ b/src/acp/control-plane/manager.turn-results.test.ts @@ -593,7 +593,9 @@ describe("AcpSessionManager turn results", () => { if (closed) { return; } - await new Promise((resolve) => setTimeout(resolve, 1)); + await new Promise((resolve) => { + setTimeout(resolve, 1); + }); } })(), result: Promise.resolve({ @@ -766,7 +768,9 @@ describe("AcpSessionManager turn results", () => { if (closed) { return; } - await new Promise((resolve) => setTimeout(resolve, 1)); + await new Promise((resolve) => { + setTimeout(resolve, 1); + }); } })(), result: Promise.resolve({ diff --git a/src/agents/agent-bundle-mcp-runtime.test.ts b/src/agents/agent-bundle-mcp-runtime.test.ts index 88ed9a50cdd..64dd06b6760 100644 --- a/src/agents/agent-bundle-mcp-runtime.test.ts +++ b/src/agents/agent-bundle-mcp-runtime.test.ts @@ -201,7 +201,9 @@ async function waitForFileText( } catch { // The server may not have written the log file yet. } - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); } throw new Error( `Timed out waiting for ${expectedText} in ${filePath}; saw ${JSON.stringify(lastText)}`, @@ -218,7 +220,9 @@ async function waitForPredicate( if (predicate()) { return; } - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); } throw new Error(`Timed out waiting for ${description}`); } @@ -725,7 +729,12 @@ describe("session MCP runtime", () => { } } finally { await runtime.dispose(); - await Promise.race([catalogResult, new Promise((resolve) => setTimeout(resolve, 1000))]); + await Promise.race([ + catalogResult, + new Promise((resolve) => { + setTimeout(resolve, 1000); + }), + ]); await fs.rm(tempDir, { recursive: true, force: true }); } }); diff --git a/src/agents/agent-tools.before-tool-call.e2e.test.ts b/src/agents/agent-tools.before-tool-call.e2e.test.ts index 3c23d8d4070..1e322e12ddf 100644 --- a/src/agents/agent-tools.before-tool-call.e2e.test.ts +++ b/src/agents/agent-tools.before-tool-call.e2e.test.ts @@ -103,7 +103,10 @@ describe("before_tool_call loop detection behavior", () => { emitted.push(evt); } }); - const flush = () => new Promise((resolve) => setImmediate(resolve)); + const flush = () => + new Promise((resolve) => { + setImmediate(resolve); + }); try { await run(emitted, flush); } finally { @@ -118,7 +121,10 @@ describe("before_tool_call loop detection behavior", () => { const stop = onInternalDiagnosticEvent((evt) => { emitted.push(evt); }); - const flush = () => new Promise((resolve) => setImmediate(resolve)); + const flush = () => + new Promise((resolve) => { + setImmediate(resolve); + }); try { await run(emitted, flush); } finally { diff --git a/src/agents/auth-profiles/oauth.concurrent-agents.test.ts b/src/agents/auth-profiles/oauth.concurrent-agents.test.ts index 21a8874fb3d..bf46c311678 100644 --- a/src/agents/auth-profiles/oauth.concurrent-agents.test.ts +++ b/src/agents/auth-profiles/oauth.concurrent-agents.test.ts @@ -85,7 +85,9 @@ async function runConcurrentRefreshCase(): Promise { let callCount = 0; refreshProviderOAuthCredentialWithPluginMock.mockImplementation(async () => { callCount += 1; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); return { type: "oauth", provider, diff --git a/src/agents/bash-tools.exec-runtime.pty-fallback.test.ts b/src/agents/bash-tools.exec-runtime.pty-fallback.test.ts index 3f258af15ab..92495428407 100644 --- a/src/agents/bash-tools.exec-runtime.pty-fallback.test.ts +++ b/src/agents/bash-tools.exec-runtime.pty-fallback.test.ts @@ -115,7 +115,9 @@ test("exec cleans session state when PTY fallback spawn also fails", async () => }); function flushDiagnosticEvents() { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } test("exec emits bounded process diagnostics without command text", async () => { diff --git a/src/agents/bash-tools.exec-runtime.test.ts b/src/agents/bash-tools.exec-runtime.test.ts index d604c755d45..e582980518b 100644 --- a/src/agents/bash-tools.exec-runtime.test.ts +++ b/src/agents/bash-tools.exec-runtime.test.ts @@ -396,7 +396,9 @@ describe("exec notifyOnExit suppression", () => { startedAtMs: Date.now(), pid: 123, wait: async () => { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); return { reason: params.reason, exitCode: null, diff --git a/src/agents/bash-tools.exec.background-abort.test.ts b/src/agents/bash-tools.exec.background-abort.test.ts index 9cdc78037be..a4d78639992 100644 --- a/src/agents/bash-tools.exec.background-abort.test.ts +++ b/src/agents/bash-tools.exec.background-abort.test.ts @@ -159,7 +159,9 @@ async function expectBackgroundSessionSurvivesAbort(params: { abortController.abort(); if (ABORT_SETTLE_MS > 0) { - await new Promise((resolve) => setTimeout(resolve, ABORT_SETTLE_MS)); + await new Promise((resolve) => { + setTimeout(resolve, ABORT_SETTLE_MS); + }); } const running = getSession(sessionId); diff --git a/src/agents/bash-tools.test.ts b/src/agents/bash-tools.test.ts index 9bf7572985a..bcf8d1b7ccd 100644 --- a/src/agents/bash-tools.test.ts +++ b/src/agents/bash-tools.test.ts @@ -103,7 +103,10 @@ vi.mock("../process/supervisor/index.js", () => { onStdout?: (chunk: string) => void; }; - const immediate = () => new Promise((resolve) => setImmediate(resolve)); + const immediate = () => + new Promise((resolve) => { + setImmediate(resolve); + }); const readPathKey = (env?: NodeJS.ProcessEnv) => env && "Path" in env && !("PATH" in env) ? "Path" : "PATH"; const readEnvPath = (env?: NodeJS.ProcessEnv) => env?.[readPathKey(env)] ?? ""; @@ -330,7 +333,10 @@ const readNormalizedTextContent = (content: ToolTextContent) => normalizeText(readTextContent(content)); const readTrimmedLines = (content: ToolTextContent) => (readTextContent(content) ?? "").split("\n").map((line) => line.trim()); -const waitOneTurn = () => new Promise((resolve) => setImmediate(resolve)); +const waitOneTurn = () => + new Promise((resolve) => { + setImmediate(resolve); + }); const readTotalLines = (details: unknown) => (details as { totalLines?: number }).totalLines; const readProcessStatus = (details: unknown) => (details as { status?: string }).status; const readProcessStatusOrRunning = (details: unknown) => diff --git a/src/agents/cli-runner.ts b/src/agents/cli-runner.ts index 3586e8cb3e7..f05c4b7a6fb 100644 --- a/src/agents/cli-runner.ts +++ b/src/agents/cli-runner.ts @@ -38,7 +38,9 @@ const log = createSubsystemLogger("agents/cli-runner"); const cliRunnerDeps = { claudeCliSessionTranscriptHasContent: claudeCliSessionTranscriptHasContentImpl, delay: async (delayMs: number) => { - await new Promise((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); }, }; @@ -49,7 +51,9 @@ export function setCliRunnerTestDeps(overrides: Partial): export function restoreCliRunnerTestDeps(): void { cliRunnerDeps.claudeCliSessionTranscriptHasContent = claudeCliSessionTranscriptHasContentImpl; cliRunnerDeps.delay = async (delayMs: number) => { - await new Promise((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); }; } diff --git a/src/agents/cli-runner/bundle-mcp.gemini.live.test.ts b/src/agents/cli-runner/bundle-mcp.gemini.live.test.ts index 79b867d898e..e86e59ea484 100644 --- a/src/agents/cli-runner/bundle-mcp.gemini.live.test.ts +++ b/src/agents/cli-runner/bundle-mcp.gemini.live.test.ts @@ -51,9 +51,9 @@ async function startLocalStreamableHttpMcpServer(): Promise<{ url: `http://127.0.0.1:${port}/mcp`, close: async () => { await transport.close().catch(() => undefined); - await new Promise((resolve, reject) => - httpServer.close((error) => (error ? reject(error) : resolve())), - ); + await new Promise((resolve, reject) => { + httpServer.close((error) => (error ? reject(error) : resolve())); + }); }, }; } diff --git a/src/agents/code-mode.test.ts b/src/agents/code-mode.test.ts index a44c628376c..a88dffc6014 100644 --- a/src/agents/code-mode.test.ts +++ b/src/agents/code-mode.test.ts @@ -1403,7 +1403,7 @@ describe("Code Mode", () => { pluginToolWithExecute( "fake_slow", "Slow helper", - async () => await new Promise(() => undefined), + async () => await new Promise(() => {}), ), ], config, @@ -1458,7 +1458,7 @@ describe("Code Mode", () => { pluginToolWithExecute( "fake_slow", "Slow helper", - async () => await new Promise(() => undefined), + async () => await new Promise(() => {}), ), ], config, diff --git a/src/agents/context.lookup.test.ts b/src/agents/context.lookup.test.ts index 199c3d3a013..60bacdb93fa 100644 --- a/src/agents/context.lookup.test.ts +++ b/src/agents/context.lookup.test.ts @@ -80,7 +80,9 @@ async function flushAsyncWarmup() { return; } await Promise.resolve(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); await Promise.resolve(); } diff --git a/src/agents/embedded-agent-runner.compaction-safety-timeout.test.ts b/src/agents/embedded-agent-runner.compaction-safety-timeout.test.ts index d986c34a635..2d7d820ec73 100644 --- a/src/agents/embedded-agent-runner.compaction-safety-timeout.test.ts +++ b/src/agents/embedded-agent-runner.compaction-safety-timeout.test.ts @@ -31,7 +31,10 @@ describe("compactWithSafetyTimeout", () => { it("returns result and clears timer when compaction settles first", async () => { vi.useFakeTimers(); const compactPromise = compactWithSafetyTimeout( - () => new Promise((resolve) => setTimeout(() => resolve("ok"), 10)), + () => + new Promise((resolve) => { + setTimeout(() => resolve("ok"), 10); + }), 30, ); diff --git a/src/agents/embedded-agent-runner/context-engine-maintenance.test.ts b/src/agents/embedded-agent-runner/context-engine-maintenance.test.ts index 9a2a997d184..808c1ce2cf0 100644 --- a/src/agents/embedded-agent-runner/context-engine-maintenance.test.ts +++ b/src/agents/embedded-agent-runner/context-engine-maintenance.test.ts @@ -861,7 +861,9 @@ describe("runContextEngineMaintenance", () => { if (Date.now() - startedAt >= 2_000) { throw error; } - await new Promise((resolve) => setTimeout(resolve, 5)); + await new Promise((resolve) => { + setTimeout(resolve, 5); + }); } } }; diff --git a/src/agents/embedded-agent-runner/run/attempt.model-diagnostic-events.test.ts b/src/agents/embedded-agent-runner/run/attempt.model-diagnostic-events.test.ts index a6e980b58af..6d0cd224b24 100644 --- a/src/agents/embedded-agent-runner/run/attempt.model-diagnostic-events.test.ts +++ b/src/agents/embedded-agent-runner/run/attempt.model-diagnostic-events.test.ts @@ -30,7 +30,9 @@ async function collectModelCallEvents(run: () => Promise): Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); return events; } finally { stop(); @@ -54,7 +56,9 @@ async function collectTrustedModelCallEvents(run: () => Promise): Promise< }); try { await run(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); return events; } finally { stop(); @@ -723,7 +727,9 @@ describe("wrapStreamFnWithDiagnosticModelCallEvents", () => { const events = await collectModelCallEvents(async () => { await drain(wrapped({} as never, {} as never, {} as never) as AsyncIterable); }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(events.map((event) => event.type)).toEqual([ "model.call.started", diff --git a/src/agents/embedded-agent-runner/run/attempt.session-lock.test.ts b/src/agents/embedded-agent-runner/run/attempt.session-lock.test.ts index 2debb441dbe..22fc85252d5 100644 --- a/src/agents/embedded-agent-runner/run/attempt.session-lock.test.ts +++ b/src/agents/embedded-agent-runner/run/attempt.session-lock.test.ts @@ -1465,7 +1465,9 @@ describe("embedded attempt session lock lifecycle", () => { }), ); - await new Promise((resolve) => setTimeout(resolve, 25)); + await new Promise((resolve) => { + setTimeout(resolve, 25); + }); releaseHookAppend(); await Promise.all([hookAppend, promptAppend]); diff --git a/src/agents/embedded-agent-runner/run/llm-idle-timeout.test.ts b/src/agents/embedded-agent-runner/run/llm-idle-timeout.test.ts index 93e0393f0ef..02cbb2b003c 100644 --- a/src/agents/embedded-agent-runner/run/llm-idle-timeout.test.ts +++ b/src/agents/embedded-agent-runner/run/llm-idle-timeout.test.ts @@ -427,7 +427,9 @@ describe("streamWithIdleTimeout", () => { return { async next() { if (count < 3) { - await new Promise((r) => setTimeout(r, 10)); // 10ms delay + await new Promise((r) => { + setTimeout(r, 10); + }); // 10ms delay return { done: false, value: { text: String(count++) } }; } return { done: true, value: undefined }; diff --git a/src/agents/embedded-agent-runner/runs.ts b/src/agents/embedded-agent-runner/runs.ts index 446a8aa4409..3646c8e6208 100644 --- a/src/agents/embedded-agent-runner/runs.ts +++ b/src/agents/embedded-agent-runner/runs.ts @@ -638,7 +638,9 @@ export async function waitForActiveEmbeddedRuns( ); return { drained: false }; } - await new Promise((resolve) => setTimeout(resolve, pollMs)); + await new Promise((resolve) => { + setTimeout(resolve, pollMs); + }); } } diff --git a/src/agents/embedded-agent-subscribe.block-reply-rejections.test.ts b/src/agents/embedded-agent-subscribe.block-reply-rejections.test.ts index 43fcde12e8b..336a87bc029 100644 --- a/src/agents/embedded-agent-subscribe.block-reply-rejections.test.ts +++ b/src/agents/embedded-agent-subscribe.block-reply-rejections.test.ts @@ -8,7 +8,9 @@ import { const waitForAsyncCallbacks = async () => { await Promise.resolve(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); }; describe("subscribeEmbeddedAgentSession block reply rejections", () => { diff --git a/src/agents/embedded-agent-subscribe.compaction-test-helpers.ts b/src/agents/embedded-agent-subscribe.compaction-test-helpers.ts index fa1aa50fd86..f98f536a2ef 100644 --- a/src/agents/embedded-agent-subscribe.compaction-test-helpers.ts +++ b/src/agents/embedded-agent-subscribe.compaction-test-helpers.ts @@ -42,7 +42,9 @@ export async function waitForCompactionCount(params: { if ((await readCompactionCount(params.storePath, params.sessionKey)) === params.expected) { return; } - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); } throw new Error(`timed out waiting for compactionCount=${params.expected}`); } diff --git a/src/agents/embedded-agent-subscribe.subscribe-embedded-agent-session.does-not-append-text-end-content-is.test.ts b/src/agents/embedded-agent-subscribe.subscribe-embedded-agent-session.does-not-append-text-end-content-is.test.ts index 132b95baad7..901836b7037 100644 --- a/src/agents/embedded-agent-subscribe.subscribe-embedded-agent-session.does-not-append-text-end-content-is.test.ts +++ b/src/agents/embedded-agent-subscribe.subscribe-embedded-agent-session.does-not-append-text-end-content-is.test.ts @@ -220,7 +220,9 @@ describe("subscribeEmbeddedAgentSession", () => { result: "ok", }); await Promise.resolve(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); emit({ type: "message_start", message: { role: "assistant" } }); emitAssistantTextEnd({ emit, content: "Checking: Fetched prices" }); diff --git a/src/agents/harness/native-hook-relay.test.ts b/src/agents/harness/native-hook-relay.test.ts index 4c090ce05bd..821f38c77d7 100644 --- a/src/agents/harness/native-hook-relay.test.ts +++ b/src/agents/harness/native-hook-relay.test.ts @@ -751,7 +751,9 @@ describe("native hook relay registry", () => { }, }); await staleRequest.connected; - await new Promise((resolve) => setTimeout(resolve, 25)); + await new Promise((resolve) => { + setTimeout(resolve, 25); + }); const second = registerNativeHookRelay({ provider: "codex", @@ -911,7 +913,9 @@ describe("native hook relay registry", () => { allowedEvents: ["pre_tool_use"], generationMismatchGraceMs: 1, }); - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); await expect( invokeNativeHookRelayBridge({ @@ -941,7 +945,9 @@ describe("native hook relay registry", () => { }); const before = await waitForNativeHookRelayBridgeRecord(relay.relayId); - await new Promise((resolve) => setTimeout(resolve, 5)); + await new Promise((resolve) => { + setTimeout(resolve, 5); + }); relay.renew(20_000); const after = await waitForNativeHookRelayBridgeRecord(relay.relayId); diff --git a/src/agents/harness/native-hook-relay.ts b/src/agents/harness/native-hook-relay.ts index 114b4e0cd27..be03bdb0b8c 100644 --- a/src/agents/harness/native-hook-relay.ts +++ b/src/agents/harness/native-hook-relay.ts @@ -1316,7 +1316,9 @@ function nativeHookRelayBridgeKey(relayId: string): string { } function delay(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, Math.max(0, ms))); + return new Promise((resolve) => { + setTimeout(resolve, Math.max(0, ms)); + }); } async function processNativeHookRelayInvocation(params: { diff --git a/src/agents/harness/v2.test.ts b/src/agents/harness/v2.test.ts index 0f89b54ed5f..1d131c6b982 100644 --- a/src/agents/harness/v2.test.ts +++ b/src/agents/harness/v2.test.ts @@ -93,7 +93,9 @@ function createContextEngineRequiringAssembly(): ContextEngine { } async function flushDiagnosticEvents(): Promise { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } function captureDiagnosticEvents(): { diff --git a/src/agents/model-catalog-browse.test.ts b/src/agents/model-catalog-browse.test.ts index 4ca24aa4537..bfeb4141bc3 100644 --- a/src/agents/model-catalog-browse.test.ts +++ b/src/agents/model-catalog-browse.test.ts @@ -87,7 +87,7 @@ describe("loadModelCatalogForBrowse", () => { }) as unknown as typeof globalThis.setTimeout, clearTimeout: clearTimeout as unknown as typeof globalThis.clearTimeout, }); - const loadCatalog = vi.fn(() => new Promise(() => undefined)); + const loadCatalog = vi.fn(() => new Promise(() => {})); const resultPromise = loadModelCatalogForBrowse({ cfg: config(), diff --git a/src/agents/model-provider-auth.test.ts b/src/agents/model-provider-auth.test.ts index da258cbb08d..d2e4c4308cf 100644 --- a/src/agents/model-provider-auth.test.ts +++ b/src/agents/model-provider-auth.test.ts @@ -578,7 +578,9 @@ describe("prepared provider auth state", () => { await Promise.resolve(); cancelled = true; await warmPromise; - await new Promise((resolve) => setTimeout(resolve, 250)); + await new Promise((resolve) => { + setTimeout(resolve, 250); + }); await expect(fs.access(markerPath)).rejects.toMatchObject({ code: "ENOENT" }); } finally { diff --git a/src/agents/model-provider-auth.ts b/src/agents/model-provider-auth.ts index 240f801757b..b555f061f7b 100644 --- a/src/agents/model-provider-auth.ts +++ b/src/agents/model-provider-auth.ts @@ -199,7 +199,9 @@ export async function hasAuthForModelProvider(params: { return preparedAnswer; } } - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); if ( hasRuntimeAvailableProviderAuth({ provider, diff --git a/src/agents/moonshot.live.test.ts b/src/agents/moonshot.live.test.ts index aec925b271a..34ba7247c06 100644 --- a/src/agents/moonshot.live.test.ts +++ b/src/agents/moonshot.live.test.ts @@ -60,7 +60,9 @@ describeLive("moonshot live", () => { if (text.length > 0) { break; } - await new Promise((resolve) => setTimeout(resolve, attempt * 500)); + await new Promise((resolve) => { + setTimeout(resolve, attempt * 500); + }); } if (text.length === 0) { diff --git a/src/agents/openai-transport-stream.test.ts b/src/agents/openai-transport-stream.test.ts index 388add3a699..a14d8cd87b8 100644 --- a/src/agents/openai-transport-stream.test.ts +++ b/src/agents/openai-transport-stream.test.ts @@ -102,7 +102,7 @@ function neverYieldsStream(): AsyncIterable { return { [Symbol.asyncIterator]() { return { - next: async () => await new Promise>(() => undefined), + next: async () => await new Promise>(() => {}), return: async () => ({ done: true, value: undefined }), }; }, @@ -971,7 +971,9 @@ describe("openai transport stream", () => { }); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); try { const address = server.address(); if (!address || typeof address === "string") { @@ -1114,7 +1116,9 @@ describe("openai transport stream", () => { }); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); try { const address = server.address(); if (!address || typeof address === "string") { @@ -1193,7 +1197,9 @@ describe("openai transport stream", () => { }); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); try { const address = server.address(); if (!address || typeof address === "string") { @@ -1271,7 +1277,9 @@ describe("openai transport stream", () => { }); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); try { const address = server.address(); if (!address || typeof address === "string") { diff --git a/src/agents/openclaw-tools.sessions.test.ts b/src/agents/openclaw-tools.sessions.test.ts index 7e5abeab249..3ea858e740e 100644 --- a/src/agents/openclaw-tools.sessions.test.ts +++ b/src/agents/openclaw-tools.sessions.test.ts @@ -1713,7 +1713,9 @@ describe("sessions tools", () => { expect(details.status).toBe("timeout"); expect(details.error).toBe("agent run timed out"); expect(details.sessionKey).toBe(targetKey); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(countMatching(calls, (call) => call.method === "agent")).toBe(1); }); diff --git a/src/agents/sandbox/browser.ts b/src/agents/sandbox/browser.ts index eaf8dacea6f..0d446772349 100644 --- a/src/agents/sandbox/browser.ts +++ b/src/agents/sandbox/browser.ts @@ -103,7 +103,9 @@ async function waitForSandboxCdp(params: { if (remainingMs <= 0) { break; } - await new Promise((r) => setTimeout(r, Math.min(150, remainingMs))); + await new Promise((r) => { + setTimeout(r, Math.min(150, remainingMs)); + }); } return false; } diff --git a/src/agents/session-write-lock.ts b/src/agents/session-write-lock.ts index fb9efeaabdf..1c5caa96edd 100644 --- a/src/agents/session-write-lock.ts +++ b/src/agents/session-write-lock.ts @@ -53,7 +53,9 @@ const REPORT_ONLY_STALE_LOCK_REASONS = new Set(["too-old", "hold-exceeded"]); * while lock contention callbacks run synchronous I/O. */ function yieldEventLoop(): Promise { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } // A payload-less lock can be left behind during the window between open("wx") // and the owner metadata write if the owner is suspended (CPU pressure, diff --git a/src/agents/subagent-announce-capture.ts b/src/agents/subagent-announce-capture.ts index 6fe6b615a82..331a3df2d70 100644 --- a/src/agents/subagent-announce-capture.ts +++ b/src/agents/subagent-announce-capture.ts @@ -18,7 +18,9 @@ export async function readLatestSubagentOutputWithRetryUsing( break; } const sleepMs = Math.min(params.retryIntervalMs, remainingMs); - await new Promise((resolve) => setTimeout(resolve, sleepMs)); + await new Promise((resolve) => { + setTimeout(resolve, sleepMs); + }); waitedMs += sleepMs; } return result; diff --git a/src/agents/subagent-announce-delivery.ts b/src/agents/subagent-announce-delivery.ts index a3fa227da1e..d007c943570 100644 --- a/src/agents/subagent-announce-delivery.ts +++ b/src/agents/subagent-announce-delivery.ts @@ -426,7 +426,9 @@ async function waitForAnnounceRetryDelay(ms: number, signal?: AbortSignal): Prom return; } if (!signal) { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); return; } if (signal.aborted) { diff --git a/src/agents/subagent-announce-output.ts b/src/agents/subagent-announce-output.ts index db0bcca2a2c..95d22fa36cc 100644 --- a/src/agents/subagent-announce-output.ts +++ b/src/agents/subagent-announce-output.ts @@ -535,7 +535,9 @@ export async function buildCompactAnnounceStatsLine(params: { break; } if (!isFastTestMode()) { - await new Promise((resolve) => setTimeout(resolve, 150)); + await new Promise((resolve) => { + setTimeout(resolve, 150); + }); } entry = subagentAnnounceOutputDeps.readSessionEntry(storePath, params.sessionKey); } diff --git a/src/agents/subagent-announce.live.test.ts b/src/agents/subagent-announce.live.test.ts index a3b29b181d8..5c8ceffe2e6 100644 --- a/src/agents/subagent-announce.live.test.ts +++ b/src/agents/subagent-announce.live.test.ts @@ -42,7 +42,9 @@ const REQUEST_TIMEOUT_MS = 8 * 60_000; const WAIT_TIMEOUT_MS = 8 * 60_000; function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } type LiveSubagentModelConfig = { diff --git a/src/agents/subagent-registry.steer-restart.test.ts b/src/agents/subagent-registry.steer-restart.test.ts index 94b121f6a75..eb83eaf5513 100644 --- a/src/agents/subagent-registry.steer-restart.test.ts +++ b/src/agents/subagent-registry.steer-restart.test.ts @@ -186,7 +186,9 @@ describe("subagent registry steer restarts", () => { }); const flushAnnounce = async () => { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); }; const waitForRegistrySideEffect = async (assertion: () => void) => { await vi.waitFor(assertion, { interval: 1, timeout: 1_000 }); diff --git a/src/agents/tool-search.test.ts b/src/agents/tool-search.test.ts index fbe3bd18c39..fa7a6512ce3 100644 --- a/src/agents/tool-search.test.ts +++ b/src/agents/tool-search.test.ts @@ -666,7 +666,9 @@ describe("Tool Search", () => { }); await vi.waitFor(() => expect(target.execute).toHaveBeenCalledTimes(1)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(settled).toBe(false); resolveTool?.(); const result = await resultPromise; diff --git a/src/agents/tools/transcripts-tool.test.ts b/src/agents/tools/transcripts-tool.test.ts index bfdfd52fc86..f7551beaada 100644 --- a/src/agents/tools/transcripts-tool.test.ts +++ b/src/agents/tools/transcripts-tool.test.ts @@ -366,7 +366,9 @@ describe("transcripts tool", () => { service.start(); for (let i = 0; i < 20 && start.mock.calls.length === 0; i += 1) { - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); } expect(getTranscriptSourceProviderMock).toHaveBeenCalledWith( diff --git a/src/agents/tools/web-tools.fetch.test.ts b/src/agents/tools/web-tools.fetch.test.ts index ee22934342e..9bdce183994 100644 --- a/src/agents/tools/web-tools.fetch.test.ts +++ b/src/agents/tools/web-tools.fetch.test.ts @@ -200,7 +200,9 @@ describe("web_fetch extraction fallbacks", () => { vi.useFakeTimers(); try { installMockFetch(async (input: RequestInfo | URL) => { - await new Promise((resolve) => setTimeout(resolve, 6000)); + await new Promise((resolve) => { + setTimeout(resolve, 6000); + }); return textResponse("Loaded page", resolveRequestUrl(input)) as Response; }); const updates: unknown[] = []; @@ -374,7 +376,9 @@ describe("web_fetch extraction fallbacks", () => { vi.useFakeTimers(); try { installMockFetch(async (input: RequestInfo | URL) => { - await new Promise((resolve) => setTimeout(resolve, 6000)); + await new Promise((resolve) => { + setTimeout(resolve, 6000); + }); return textResponse("Loaded page", resolveRequestUrl(input)) as Response; }); const tool = createFetchTool({ firecrawl: { enabled: false } }); diff --git a/src/auto-reply/inbound.test.ts b/src/auto-reply/inbound.test.ts index 1ba528d6701..dfb61f33a4e 100644 --- a/src/auto-reply/inbound.test.ts +++ b/src/auto-reply/inbound.test.ts @@ -697,7 +697,9 @@ describe("createInboundDebouncer", () => { try { await expect(debouncer.enqueue({ key: "a", id: "1" })).resolves.toBeUndefined(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(unhandled).toStrictEqual([]); } finally { process.off("unhandledRejection", onUnhandledRejection); diff --git a/src/auto-reply/reply/agent-runner-execution.test.ts b/src/auto-reply/reply/agent-runner-execution.test.ts index 799a9d18c58..7aa510b1b72 100644 --- a/src/auto-reply/reply/agent-runner-execution.test.ts +++ b/src/auto-reply/reply/agent-runner-execution.test.ts @@ -2269,7 +2269,9 @@ describe("runAgentTurnWithFallback", () => { }); await firstPreviewPromise; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(previewOrder).toEqual(["Hello"]); releaseFirstPreview?.(); @@ -2338,7 +2340,9 @@ describe("runAgentTurnWithFallback", () => { getActiveSessionEntry: () => undefined, resolvedVerboseLevel: "off", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(onToolStart).toHaveBeenCalledTimes(1); const call = onToolStart.mock.calls[0]?.[0]; @@ -2398,7 +2402,9 @@ describe("runAgentTurnWithFallback", () => { getActiveSessionEntry: () => undefined, resolvedVerboseLevel: "off", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(onToolStart).not.toHaveBeenCalled(); }); @@ -2456,7 +2462,9 @@ describe("runAgentTurnWithFallback", () => { getActiveSessionEntry: () => undefined, resolvedVerboseLevel: "off", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(onPartialReply).not.toHaveBeenCalled(); }); @@ -2574,7 +2582,9 @@ describe("runAgentTurnWithFallback", () => { getActiveSessionEntry: () => undefined, resolvedVerboseLevel: "off", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(onReasoningStream).not.toHaveBeenCalled(); }); @@ -2626,7 +2636,9 @@ describe("runAgentTurnWithFallback", () => { getActiveSessionEntry: () => undefined, resolvedVerboseLevel: "off", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(onReasoningStream).not.toHaveBeenCalled(); }); @@ -2682,7 +2694,9 @@ describe("runAgentTurnWithFallback", () => { getActiveSessionEntry: () => undefined, resolvedVerboseLevel: "off", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(onReasoningStream).not.toHaveBeenCalled(); }); @@ -3335,7 +3349,9 @@ describe("runAgentTurnWithFallback", () => { const deliveryOrder: string[] = []; const onToolResult = vi.fn(async (payload: { text?: string }) => { const delay = payload.text === "first" ? 5 : 1; - await new Promise((resolve) => setTimeout(resolve, delay)); + await new Promise((resolve) => { + setTimeout(resolve, delay); + }); deliveryOrder.push(payload.text ?? ""); }); state.runEmbeddedAgentMock.mockImplementationOnce(async (params: EmbeddedAgentParams) => { diff --git a/src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts b/src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts index c1a3cb4bf1f..01ceef546d1 100644 --- a/src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts +++ b/src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts @@ -282,7 +282,9 @@ describe("runReplyAgent heartbeat followup guard", () => { }); const pending = run(); - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); active.updateSessionId("post-compact-session"); sessionStore.main = { sessionId: "post-compact-session", diff --git a/src/auto-reply/reply/commands-models.test.ts b/src/auto-reply/reply/commands-models.test.ts index fa6c1503a62..c460385bc6e 100644 --- a/src/auto-reply/reply/commands-models.test.ts +++ b/src/auto-reply/reply/commands-models.test.ts @@ -279,7 +279,7 @@ describe("handleModelsCommand", () => { it("does not block default browse when read-only catalog loading is slow", async () => { vi.useFakeTimers(); try { - modelCatalogMocks.loadModelCatalog.mockReturnValue(new Promise(() => undefined)); + modelCatalogMocks.loadModelCatalog.mockReturnValue(new Promise(() => {})); const resultPromise = handleModelsCommand(buildParams("/models"), true); await vi.advanceTimersByTimeAsync(750); diff --git a/src/auto-reply/reply/dispatch-from-config.acp-abort.test.ts b/src/auto-reply/reply/dispatch-from-config.acp-abort.test.ts index 1029a0c166d..ebe9e2d565e 100644 --- a/src/auto-reply/reply/dispatch-from-config.acp-abort.test.ts +++ b/src/auto-reply/reply/dispatch-from-config.acp-abort.test.ts @@ -1027,7 +1027,9 @@ describe("dispatchReplyFromConfig ACP abort", () => { expect(dispatcher.sendFinalReply).not.toHaveBeenCalled(); releaseResolver(); - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); expect(dispatcher.sendToolResult).not.toHaveBeenCalled(); expect(dispatcher.sendBlockReply).not.toHaveBeenCalled(); expect(dispatcher.sendFinalReply).not.toHaveBeenCalled(); diff --git a/src/auto-reply/reply/dispatch-from-config.test.ts b/src/auto-reply/reply/dispatch-from-config.test.ts index e2e5ad14c4e..3183b3dcbb5 100644 --- a/src/auto-reply/reply/dispatch-from-config.test.ts +++ b/src/auto-reply/reply/dispatch-from-config.test.ts @@ -1203,7 +1203,9 @@ describe("dispatchReplyFromConfig", () => { const result = await Promise.race([ resultPromise, - new Promise<"timed-out">((resolve) => setTimeout(() => resolve("timed-out"), 1_000)), + new Promise<"timed-out">((resolve) => { + setTimeout(() => resolve("timed-out"), 1_000); + }), ]); if (result === "timed-out") { activeOperation.complete(); @@ -1254,7 +1256,9 @@ describe("dispatchReplyFromConfig", () => { try { const result = await Promise.race([ resultPromise, - new Promise<"blocked">((resolve) => setTimeout(() => resolve("blocked"), 1_000)), + new Promise<"blocked">((resolve) => { + setTimeout(() => resolve("blocked"), 1_000); + }), ]); expect(result).toBe("blocked"); diff --git a/src/auto-reply/reply/followup-runner.test.ts b/src/auto-reply/reply/followup-runner.test.ts index 7fddff99c53..65cbe2cb5ca 100644 --- a/src/auto-reply/reply/followup-runner.test.ts +++ b/src/auto-reply/reply/followup-runner.test.ts @@ -670,7 +670,9 @@ describe("createFollowupRunner reply-lane admission", () => { }, }), ); - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); active.updateSessionId("post-compact-session"); sessionStore.main = { sessionId: "post-compact-session", @@ -733,7 +735,9 @@ describe("createFollowupRunner reply-lane admission", () => { }, }), ); - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); active.updateSessionId("post-compact-session"); active.complete(); await pending; diff --git a/src/auto-reply/reply/queue.collect.test.ts b/src/auto-reply/reply/queue.collect.test.ts index 40b9442231c..015de952178 100644 --- a/src/auto-reply/reply/queue.collect.test.ts +++ b/src/auto-reply/reply/queue.collect.test.ts @@ -1092,7 +1092,9 @@ describe("followup queue collect routing", () => { } calls.push(run); }); - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); expect(calls).toHaveLength(0); expect(cleaned.map((run) => run.prompt)).toEqual(["aborted"]); @@ -1412,7 +1414,9 @@ describe("followup queue collect routing", () => { scheduleFollowupDrain(key, runFollowup); await done.promise; - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); expect(calls).toHaveLength(1); expect(calls[0]?.prompt).toContain("[Queue overflow] Dropped 1 message due to cap."); @@ -1461,7 +1465,9 @@ describe("followup queue collect routing", () => { scheduleFollowupDrain(key, runFollowup); await firstAttempt.promise; - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); expect(onComplete).toHaveBeenCalledTimes(1); expect(getExistingFollowupQueue(key)?.summarySources).toHaveLength(0); diff --git a/src/auto-reply/reply/queue.dedupe.test.ts b/src/auto-reply/reply/queue.dedupe.test.ts index 82019641d4e..e95b2ed83b4 100644 --- a/src/auto-reply/reply/queue.dedupe.test.ts +++ b/src/auto-reply/reply/queue.dedupe.test.ts @@ -186,7 +186,9 @@ describe("followup queue deduplication", () => { scheduleFollowupDrain(key, runFollowup); await done.promise; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect( enqueueB.enqueueFollowupRun( diff --git a/src/auto-reply/reply/queue.drain-restart.test.ts b/src/auto-reply/reply/queue.drain-restart.test.ts index 9ecdc3654d2..a057a492487 100644 --- a/src/auto-reply/reply/queue.drain-restart.test.ts +++ b/src/auto-reply/reply/queue.drain-restart.test.ts @@ -23,7 +23,9 @@ describe("followup queue drain restart after idle window", () => { }); enqueueFollowupRun(key, createRun({ prompt: "after-empty-schedule" }), settings); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(staleCalls).toHaveLength(0); scheduleFollowupDrain(key, async (run) => { @@ -59,7 +61,9 @@ describe("followup queue drain restart after idle window", () => { enqueueFollowupRun(key, createRun({ prompt: "before-idle" }), settings); scheduleFollowupDrain(key, runFollowup); await firstProcessed.promise; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); enqueueFollowupRun( key, @@ -98,7 +102,9 @@ describe("followup queue drain restart after idle window", () => { enqueueFollowupRun(key, createRun({ prompt: "before-idle" }), settings); scheduleFollowupDrain(key, staleFollowup); await firstProcessed.promise; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); enqueueFollowupRun( key, @@ -137,7 +143,9 @@ describe("followup queue drain restart after idle window", () => { false, ); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(freshCalls).toHaveLength(0); scheduleFollowupDrain(key, staleFollowup); @@ -178,7 +186,9 @@ describe("followup queue drain restart after idle window", () => { drainA.scheduleFollowupDrain(key, runFollowup); await firstProcessed.promise; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); enqueueB.enqueueFollowupRun( key, @@ -346,13 +356,17 @@ describe("followup queue drain restart after idle window", () => { enqueueFollowupRun(key, createRun({ prompt: "before-clear" }), settings); scheduleFollowupDrain(key, runFollowup); await firstProcessed.promise; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const { clearSessionQueues } = await import("./queue.js"); clearSessionQueues([key]); enqueueFollowupRun(key, createRun({ prompt: "after-clear" }), settings); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(calls).toHaveLength(1); expect(calls[0]?.prompt).toBe("before-clear"); @@ -372,10 +386,14 @@ describe("followup queue drain restart after idle window", () => { enqueueFollowupRun(key, createRun({ prompt: "before-idle" }), settings); scheduleFollowupDrain(key, runFollowup); await firstProcessed.promise; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); enqueueFollowupRun(key, createRun({ prompt: "after-idle" }), settings); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(calls).toHaveLength(1); expect(calls[0]?.prompt).toBe("before-idle"); diff --git a/src/auto-reply/reply/queue/drain.identity-guard.test.ts b/src/auto-reply/reply/queue/drain.identity-guard.test.ts index a3294f1e83d..e962b1f4c45 100644 --- a/src/auto-reply/reply/queue/drain.identity-guard.test.ts +++ b/src/auto-reply/reply/queue/drain.identity-guard.test.ts @@ -103,7 +103,9 @@ describe("drain finally identity guard — late D1 must not orphan Q2", () => { gate.resolve(); for (let i = 0; i < 20; i++) { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } expect( diff --git a/src/cli/cron-cli/register.cron-simple.ts b/src/cli/cron-cli/register.cron-simple.ts index 217fd0ce862..43e78d3b3d7 100644 --- a/src/cli/cron-cli/register.cron-simple.ts +++ b/src/cli/cron-cli/register.cron-simple.ts @@ -36,7 +36,9 @@ type CronRunLogEntryResult = { }; function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function parseCronRunWaitDuration(raw: unknown, label: string): number { diff --git a/src/cli/gateway-cli/run-loop.test.ts b/src/cli/gateway-cli/run-loop.test.ts index 134941ad904..b7aca7e6e0a 100644 --- a/src/cli/gateway-cli/run-loop.test.ts +++ b/src/cli/gateway-cli/run-loop.test.ts @@ -321,7 +321,9 @@ async function runLoopWithStart(params: { async function waitForStart(started: Promise) { await started; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } async function waitForLoopCondition(predicate: () => boolean, message: string) { @@ -330,7 +332,9 @@ async function waitForLoopCondition(predicate: () => boolean, message: string) { if (predicate()) { return; } - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } throw new Error(message); } @@ -412,13 +416,19 @@ describe("runGatewayLoop", () => { start: start as unknown as Parameters[0]["start"], runtime: runtime as unknown as Parameters[0]["runtime"], }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const sigterm = captureSignal("SIGTERM"); const sigint = captureSignal("SIGINT"); sigterm(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(consumeGatewayRestartIntentPayloadSync).toHaveBeenCalledOnce(); expect(markGatewayDraining).toHaveBeenCalledOnce(); @@ -426,7 +436,9 @@ describe("runGatewayLoop", () => { expectRestartCloseCall(closeFirst, 90_000); await startedSecond; expect(start).toHaveBeenCalledTimes(2); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); sigint(); await expect(exited).resolves.toBe(0); @@ -449,8 +461,12 @@ describe("runGatewayLoop", () => { const sigint = captureSignal("SIGINT"); sigterm(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(waitForActiveTasks).toHaveBeenCalledWith(2_500); expect(waitForActiveEmbeddedRuns).toHaveBeenCalledWith(2_500); @@ -471,8 +487,12 @@ describe("runGatewayLoop", () => { const sigint = captureSignal("SIGINT"); sigterm(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expectRestartCloseCall(close, 15_000); expect(start).toHaveBeenCalledTimes(2); @@ -494,8 +514,12 @@ describe("runGatewayLoop", () => { const sigint = captureSignal("SIGINT"); sigterm(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(waitForActiveEmbeddedRuns).toHaveBeenCalledWith(undefined); expect(abortEmbeddedAgentRun).toHaveBeenCalledWith(undefined, { mode: "compacting" }); @@ -526,8 +550,12 @@ describe("runGatewayLoop", () => { const sigint = captureSignal("SIGINT"); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(waitForActiveEmbeddedRuns).toHaveBeenCalledWith(undefined); expect(abortEmbeddedAgentRun).toHaveBeenCalledWith(undefined, { mode: "compacting" }); @@ -557,8 +585,12 @@ describe("runGatewayLoop", () => { const sigint = captureSignal("SIGINT"); sigterm(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(waitForActiveTasks).toHaveBeenCalledWith(90_000); expect(waitForActiveEmbeddedRuns).toHaveBeenCalledWith(90_000); @@ -606,8 +638,12 @@ describe("runGatewayLoop", () => { const sigint = captureSignal("SIGINT"); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(waitForActiveTasks).not.toHaveBeenCalled(); expect(waitForActiveEmbeddedRuns).not.toHaveBeenCalled(); @@ -661,8 +697,12 @@ describe("runGatewayLoop", () => { const sigint = captureSignal("SIGINT"); sigterm(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(waitForActiveTasks).not.toHaveBeenCalled(); expect(waitForActiveEmbeddedRuns).not.toHaveBeenCalled(); @@ -763,13 +803,17 @@ describe("runGatewayLoop", () => { const sigusr1 = captureSignal("SIGUSR1"); const sigterm = captureSignal("SIGTERM"); expect(start).toHaveBeenCalledTimes(1); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); sigusr1(); await startedSecond; expect(start).toHaveBeenCalledTimes(2); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(abortEmbeddedAgentRun).toHaveBeenCalledWith(undefined, { mode: "compacting" }); expect(waitForActiveTasks).toHaveBeenCalledWith(1_234); @@ -799,7 +843,9 @@ describe("runGatewayLoop", () => { sigusr1(); await startedThird; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expectRestartCloseCall(closeSecond, 1_234); expect(markGatewaySigusr1RestartHandled).toHaveBeenCalledTimes(2); expect(markGatewayDraining).toHaveBeenCalledTimes(2); @@ -863,7 +909,9 @@ describe("runGatewayLoop", () => { start: start as unknown as Parameters[0]["start"], runtime: runtime as unknown as Parameters[0]["runtime"], }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); sigusr1 = captureSignal("SIGUSR1"); const sigterm = captureSignal("SIGTERM"); @@ -950,7 +998,9 @@ describe("runGatewayLoop", () => { start: start as unknown as Parameters[0]["start"], runtime: runtime as unknown as Parameters[0]["runtime"], }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const sigint = captureSignal("SIGINT"); sigint(); @@ -980,7 +1030,9 @@ describe("runGatewayLoop", () => { start: start as unknown as Parameters[0]["start"], runtime: runtime as unknown as Parameters[0]["runtime"], }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const sigusr1 = captureSignal("SIGUSR1"); const sigint = captureSignal("SIGINT"); @@ -1040,7 +1092,9 @@ describe("runGatewayLoop", () => { start: start as unknown as Parameters[0]["start"], runtime: runtime as unknown as Parameters[0]["runtime"], }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); sigusr1 = captureSignal("SIGUSR1"); const sigterm = captureSignal("SIGTERM"); @@ -1098,7 +1152,9 @@ describe("runGatewayLoop", () => { start: start as unknown as Parameters[0]["start"], runtime: runtime as unknown as Parameters[0]["runtime"], }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const sigusr1 = captureSignal("SIGUSR1"); const sigterm = captureSignal("SIGTERM"); @@ -1111,7 +1167,9 @@ describe("runGatewayLoop", () => { ), "expected failed restart startup to be logged", ); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(start).toHaveBeenCalledTimes(2); sigusr1(); @@ -1151,8 +1209,12 @@ describe("runGatewayLoop", () => { const sigusr1 = captureSignal("SIGUSR1"); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(waitForActiveTasks).toHaveBeenCalledWith(DEFAULT_RESTART_DEFERRAL_TIMEOUT_MS); expect(waitForActiveEmbeddedRuns).toHaveBeenCalledWith(DEFAULT_RESTART_DEFERRAL_TIMEOUT_MS); @@ -1171,7 +1233,9 @@ describe("runGatewayLoop", () => { const sigusr1 = captureSignal("SIGUSR1"); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(scheduleGatewaySigusr1Restart).toHaveBeenCalledWith({ delayMs: 0, @@ -1196,7 +1260,9 @@ describe("runGatewayLoop", () => { const sigusr1 = captureSignal("SIGUSR1"); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(markGatewaySigusr1RestartHandled).toHaveBeenCalledTimes(1); expect(scheduleGatewaySigusr1Restart).not.toHaveBeenCalled(); @@ -1238,8 +1304,12 @@ describe("runGatewayLoop", () => { const sigint = captureSignal("SIGINT"); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(consumeGatewaySigusr1RestartAuthorization).toHaveBeenCalledOnce(); expect(markGatewaySigusr1RestartHandled).toHaveBeenCalledOnce(); @@ -1400,15 +1470,21 @@ describe("runGatewayLoop", () => { runtime: runtime as unknown as Parameters[0]["runtime"], lockPort: 18789, }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const sigusr1 = captureSignal("SIGUSR1"); const sigterm = captureSignal("SIGTERM"); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(acquireGatewayLock).toHaveBeenNthCalledWith(1, { port: 18789 }); expect(acquireGatewayLock).toHaveBeenNthCalledWith(2, { port: 18789 }); expect(acquireGatewayLock).toHaveBeenNthCalledWith(3, { port: 18789 }); @@ -1557,12 +1633,16 @@ describe("runGatewayLoop", () => { .mockResolvedValueOnce({ close: closeSecond }); await runLoopWithStart({ start, runtime, lockPort: 18789, waitForHealthyChild }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const sigusr1 = captureSignal("SIGUSR1"); const sigterm = captureSignal("SIGTERM"); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(waitForHealthyChild).toHaveBeenCalledWith(18789, 8888, "127.0.0.1"); expect(kill).toHaveBeenCalledTimes(1); @@ -1613,8 +1693,12 @@ describe("runGatewayLoop", () => { const sigterm = captureSignal("SIGTERM"); sigusr1(); - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(gatewayLog.error).toHaveBeenCalledWith( "SIGUSR1 handler failed: lifecycle module corrupted", @@ -1642,8 +1726,12 @@ describe("runGatewayLoop", () => { sigusr1(); // The catch handler clears the restart token from the eagerly-loaded // lifecycle runtime, so wait for the async signal body to reject. - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(gatewayLog.error).toHaveBeenCalledWith( "SIGUSR1 handler failed: sigusr1 lifecycle import failed", diff --git a/src/cli/gateway-cli/run.ts b/src/cli/gateway-cli/run.ts index 6c4c5d035bc..6fdfa1951f8 100644 --- a/src/cli/gateway-cli/run.ts +++ b/src/cli/gateway-cli/run.ts @@ -417,7 +417,11 @@ async function runGatewayLoopWithSupervisedLockRecovery(params: { const now = params.now ?? Date.now; const sleep = - params.sleep ?? (async (ms: number) => await new Promise((resolve) => setTimeout(resolve, ms))); + params.sleep ?? + (async (ms: number) => + await new Promise((resolve) => { + setTimeout(resolve, ms); + })); const probeHealth = params.probeHealth ?? ((probeParams) => probeGatewayHealthz(probeParams)); const retryMs = params.retryMs ?? SUPERVISED_GATEWAY_LOCK_RETRY_MS; const timeoutMs = params.timeoutMs ?? SUPERVISED_GATEWAY_LOCK_RETRY_TIMEOUT_MS; diff --git a/src/cli/program/message/helpers.test.ts b/src/cli/program/message/helpers.test.ts index f0ec4e2a1d4..46084e2344d 100644 --- a/src/cli/program/message/helpers.test.ts +++ b/src/cli/program/message/helpers.test.ts @@ -445,7 +445,7 @@ describe("runMessageAction", () => { vi.useFakeTimers(); try { hasHooksMock.mockReturnValueOnce(true); - runGatewayStopMock.mockImplementationOnce(() => new Promise(() => undefined)); + runGatewayStopMock.mockImplementationOnce(() => new Promise(() => {})); const runMessageAction = createRunMessageAction(); const pending = expect(runMessageAction("send", baseSendOptions)).rejects.toThrow("exit"); diff --git a/src/cli/prompt.test.ts b/src/cli/prompt.test.ts index efe251e5eb5..8794aa87028 100644 --- a/src/cli/prompt.test.ts +++ b/src/cli/prompt.test.ts @@ -72,7 +72,7 @@ describe("promptYesNo", () => { }); it("rejects when input closes before an answer is received", async () => { - readlineState.question.mockReturnValueOnce(new Promise(() => undefined)); + readlineState.question.mockReturnValueOnce(new Promise(() => {})); const result = promptYesNo("Continue?"); readlineState.emit("close"); diff --git a/src/cli/proxy-cli.runtime.ts b/src/cli/proxy-cli.runtime.ts index 62a03f4f31e..7bbe029052a 100644 --- a/src/cli/proxy-cli.runtime.ts +++ b/src/cli/proxy-cli.runtime.ts @@ -62,7 +62,7 @@ export async function runDebugProxyStartCommand(opts: { host?: string; port?: nu }; process.on("SIGINT", onSignal); process.on("SIGTERM", onSignal); - await new Promise(() => undefined); + await new Promise(() => {}); } export async function runDebugProxyRunCommand(opts: { diff --git a/src/commands/agent-via-gateway.test.ts b/src/commands/agent-via-gateway.test.ts index 844cc396bb6..cfd8429e75d 100644 --- a/src/commands/agent-via-gateway.test.ts +++ b/src/commands/agent-via-gateway.test.ts @@ -159,7 +159,9 @@ async function waitForAgentCommandCall(expectedCalls = 1) { attempt < 50 && agentCommand.mock.calls.length < expectedCalls; attempt += 1 ) { - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); } expect(agentCommand).toHaveBeenCalledTimes(expectedCalls); } @@ -170,7 +172,9 @@ async function waitForGatewayCall(expectedCalls = 1) { attempt < 50 && callGateway.mock.calls.length < expectedCalls; attempt += 1 ) { - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); } expect(callGateway).toHaveBeenCalledTimes(expectedCalls); } diff --git a/src/commands/doctor-whatsapp-responsiveness.ts b/src/commands/doctor-whatsapp-responsiveness.ts index bea7c2d1f75..7d182e44673 100644 --- a/src/commands/doctor-whatsapp-responsiveness.ts +++ b/src/commands/doctor-whatsapp-responsiveness.ts @@ -101,7 +101,9 @@ function isProcessAlive(controller: ProcessController, pid: number): boolean { } async function sleep(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } export async function terminateLocalTuiProcesses(params: { diff --git a/src/commands/gateway-readiness.ts b/src/commands/gateway-readiness.ts index 7f0d1ba6204..88085423660 100644 --- a/src/commands/gateway-readiness.ts +++ b/src/commands/gateway-readiness.ts @@ -185,7 +185,9 @@ async function waitForGatewayReady(params: { !gatewayIsReady(latest, { readyWhenReachable: params.readyWhenReachable }); attempt += 1 ) { - await new Promise((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); latest = await params.gatherStatus(); } return latest; diff --git a/src/commands/sessions-tail.test.ts b/src/commands/sessions-tail.test.ts index 05a522bb10e..dd06a206d8d 100644 --- a/src/commands/sessions-tail.test.ts +++ b/src/commands/sessions-tail.test.ts @@ -65,7 +65,9 @@ async function waitForRuntimeOutput( if (Date.now() - startedAt > timeoutMs) { throw new Error(`Timed out waiting for output containing ${pattern}`); } - await new Promise((resolve) => setTimeout(resolve, 25)); + await new Promise((resolve) => { + setTimeout(resolve, 25); + }); } } diff --git a/src/config/io.clobber-snapshot.ts b/src/config/io.clobber-snapshot.ts index 8078207e52d..011e7551a8f 100644 --- a/src/config/io.clobber-snapshot.ts +++ b/src/config/io.clobber-snapshot.ts @@ -51,7 +51,9 @@ function isFsErrorCode(error: unknown, code: string): boolean { } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function resolveClobberPaths(configPath: string): { diff --git a/src/config/sessions/store.ts b/src/config/sessions/store.ts index 79b1f30c2b9..22f8709a75c 100644 --- a/src/config/sessions/store.ts +++ b/src/config/sessions/store.ts @@ -725,7 +725,9 @@ async function saveSessionStoreUnlocked( return; } if (i < 4) { - await new Promise((r) => setTimeout(r, 50 * (i + 1))); + await new Promise((r) => { + setTimeout(r, 50 * (i + 1)); + }); continue; } // Final attempt failed - skip this save. The writer queue ensures diff --git a/src/config/sessions/transcript-append.ts b/src/config/sessions/transcript-append.ts index d31e7099eee..bfd2bee9aa0 100644 --- a/src/config/sessions/transcript-append.ts +++ b/src/config/sessions/transcript-append.ts @@ -34,7 +34,9 @@ type TranscriptLeafInfo = { }; async function yieldTranscriptAppendScan(): Promise { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } function lineParentLinkedEntryId(line: string): string | undefined { diff --git a/src/cron/isolated-agent/subagent-followup.ts b/src/cron/isolated-agent/subagent-followup.ts index 67e7aa5c8e0..28822a44e16 100644 --- a/src/cron/isolated-agent/subagent-followup.ts +++ b/src/cron/isolated-agent/subagent-followup.ts @@ -137,7 +137,9 @@ export async function waitForDescendantSubagentSummary(params: { if (latest) { return latest; } - await new Promise((resolve) => setTimeout(resolve, timings.gracePollMs)); + await new Promise((resolve) => { + setTimeout(resolve, timings.gracePollMs); + }); } // Final read after grace period expires. diff --git a/src/cron/service/timer.ts b/src/cron/service/timer.ts index 47779777f25..de9dc9f539e 100644 --- a/src/cron/service/timer.ts +++ b/src/cron/service/timer.ts @@ -1329,7 +1329,9 @@ export async function executeJobCore( }); const waitWithAbort = async (ms: number) => { if (!abortSignal) { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); return; } if (abortSignal.aborted) { diff --git a/src/docker-setup.e2e.test.ts b/src/docker-setup.e2e.test.ts index 329c52ed607..f0386dc8b17 100644 --- a/src/docker-setup.e2e.test.ts +++ b/src/docker-setup.e2e.test.ts @@ -225,7 +225,9 @@ async function withUnixSocket(socketPath: string, run: () => Promise): Pro try { return await run(); } finally { - await new Promise((resolveLocal) => server.close(() => resolveLocal())); + await new Promise((resolveLocal) => { + server.close(() => resolveLocal()); + }); await rm(socketPath, { force: true }); } } diff --git a/src/gateway/agent-command.test-helpers.ts b/src/gateway/agent-command.test-helpers.ts index 427fbed7433..295ba8e9607 100644 --- a/src/gateway/agent-command.test-helpers.ts +++ b/src/gateway/agent-command.test-helpers.ts @@ -7,7 +7,10 @@ function agentCommandCalls(): Array<[AgentCommandCall]> { return vi.mocked(agentCommand).mock.calls as unknown as Array<[AgentCommandCall]>; } -const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); +const sleep = (ms: number) => + new Promise((resolve) => { + setTimeout(resolve, ms); + }); export async function waitForAgentCommandCall(runId: string): Promise { for (let elapsed = 0; elapsed <= 2_000; elapsed += 5) { diff --git a/src/gateway/client.watchdog.test.ts b/src/gateway/client.watchdog.test.ts index e5a16bec37d..4b5937d417c 100644 --- a/src/gateway/client.watchdog.test.ts +++ b/src/gateway/client.watchdog.test.ts @@ -68,7 +68,9 @@ describe("GatewayClient OpenClaw wrapper watchdog integration", () => { for (const socket of server.clients) { socket.terminate(); } - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } } }, 5000); diff --git a/src/gateway/drain-active-sessions-for-shutdown.test.ts b/src/gateway/drain-active-sessions-for-shutdown.test.ts index 00e78e1e220..80851872362 100644 --- a/src/gateway/drain-active-sessions-for-shutdown.test.ts +++ b/src/gateway/drain-active-sessions-for-shutdown.test.ts @@ -193,7 +193,7 @@ describe("drainActiveSessionsForShutdown", () => { it("returns timedOut=true while still starting later emissions when one handler hangs", async () => { runSessionEndMock.mockImplementation(async (event: SessionEndHookEvent) => { if (event.sessionId === "sess-A") { - await new Promise(() => undefined); + await new Promise(() => {}); } }); emitGatewaySessionStartPluginHook({ diff --git a/src/gateway/gateway-cli-backend.connect.test.ts b/src/gateway/gateway-cli-backend.connect.test.ts index 38b1d972ebb..6bafe40a8ed 100644 --- a/src/gateway/gateway-cli-backend.connect.test.ts +++ b/src/gateway/gateway-cli-backend.connect.test.ts @@ -80,7 +80,9 @@ async function startMinimalGatewayServer(params: { token: string }) { }); }); - await new Promise((resolve) => httpServer.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + httpServer.listen(0, "127.0.0.1", resolve); + }); const address = httpServer.address() as AddressInfo; return { requests, diff --git a/src/gateway/gateway-cli-backend.live-helpers.ts b/src/gateway/gateway-cli-backend.live-helpers.ts index ee2f2fc821c..bed27ef2d58 100644 --- a/src/gateway/gateway-cli-backend.live-helpers.ts +++ b/src/gateway/gateway-cli-backend.live-helpers.ts @@ -254,7 +254,9 @@ export async function createBootstrapWorkspace( } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } export function shouldRetryCliCronMcpProbeReply(text: string): boolean { diff --git a/src/gateway/gateway-cli-backend.live-probe-helpers.ts b/src/gateway/gateway-cli-backend.live-probe-helpers.ts index cbd17f6592e..69db1696638 100644 --- a/src/gateway/gateway-cli-backend.live-probe-helpers.ts +++ b/src/gateway/gateway-cli-backend.live-probe-helpers.ts @@ -44,7 +44,9 @@ function logCliCronProbe(step: string, details?: Record): void } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } async function pollCliCronJobVisible(params: { diff --git a/src/gateway/gateway-cli-backend.live.test.ts b/src/gateway/gateway-cli-backend.live.test.ts index 776a7aa3b7f..771b734aed7 100644 --- a/src/gateway/gateway-cli-backend.live.test.ts +++ b/src/gateway/gateway-cli-backend.live.test.ts @@ -88,7 +88,9 @@ function logCliBackendLiveStep(step: string, details?: Record): } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function openAiProviderConfigForCodexCli( diff --git a/src/gateway/gateway-models.profiles.live.test.ts b/src/gateway/gateway-models.profiles.live.test.ts index 0b0751b9d11..d565c256e8b 100644 --- a/src/gateway/gateway-models.profiles.live.test.ts +++ b/src/gateway/gateway-models.profiles.live.test.ts @@ -1633,7 +1633,9 @@ async function getFreeGatewayPort(): Promise { } async function sleep(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function sanitizeAuthProfileStoreForLiveGateway(store: AuthProfileStore): AuthProfileStore { @@ -1900,7 +1902,9 @@ async function waitForSessionAssistantText(params: { `${params.context}: waiting for transcript (${Math.max(1, Math.round((Date.now() - startedAt) / 1_000))}s)`, ); } - await new Promise((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); delayMs = Math.min(delayMs * 2, 250); } throw new Error(`${timeoutLabel} timeout after ${timeoutMs}ms (${params.context})`); diff --git a/src/gateway/gateway-trajectory-export.live.test.ts b/src/gateway/gateway-trajectory-export.live.test.ts index f96b04003a2..cc1c8f8460f 100644 --- a/src/gateway/gateway-trajectory-export.live.test.ts +++ b/src/gateway/gateway-trajectory-export.live.test.ts @@ -131,7 +131,9 @@ async function waitForPath(filePath: string, timeoutMs = 60_000): Promise await fs.stat(filePath); return; } catch { - await new Promise((resolve) => setTimeout(resolve, 500)); + await new Promise((resolve) => { + setTimeout(resolve, 500); + }); } } throw new Error(`timed out waiting for ${filePath}`); diff --git a/src/gateway/managed-image-attachments.test.ts b/src/gateway/managed-image-attachments.test.ts index a791dc4bd2a..4816ed03ba4 100644 --- a/src/gateway/managed-image-attachments.test.ts +++ b/src/gateway/managed-image-attachments.test.ts @@ -196,7 +196,9 @@ async function requestManagedImage(params: { })(); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); const address = server.address() as AddressInfo; try { @@ -229,9 +231,9 @@ async function requestManagedImage(params: { return { result, auth }; } finally { - await new Promise((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ); + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); } } @@ -511,7 +513,9 @@ describe("createManagedOutgoingImageBlocks", () => { res.end(imageBuffer); }); - await new Promise((resolve) => upstream.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + upstream.listen(0, "127.0.0.1", resolve); + }); const address = upstream.address() as AddressInfo; setMediaStoreNetworkDepsForTest({ resolvePinnedHostname: async (hostname) => ({ @@ -552,9 +556,9 @@ describe("createManagedOutgoingImageBlocks", () => { expect(await fs.readFile(record.original.path)).toEqual(imageBuffer); } finally { setMediaStoreNetworkDepsForTest(); - await new Promise((resolve, reject) => - upstream.close((error) => (error ? reject(error) : resolve())), - ); + await new Promise((resolve, reject) => { + upstream.close((error) => (error ? reject(error) : resolve())); + }); if (previousStateDir == null) { delete process.env.OPENCLAW_STATE_DIR; } else { @@ -679,7 +683,9 @@ describe("createManagedOutgoingImageBlocks", () => { res.setHeader("content-type", "image/png"); res.end(imageBuffer); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); const address = server.address() as AddressInfo; setMediaStoreNetworkDepsForTest({ resolvePinnedHostname: async (hostname) => ({ @@ -700,9 +706,9 @@ describe("createManagedOutgoingImageBlocks", () => { expect(requireBlock(blocks).type).toBe("image"); } finally { setMediaStoreNetworkDepsForTest(); - await new Promise((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ); + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); if (previousStateDir == null) { delete process.env.OPENCLAW_STATE_DIR; } else { diff --git a/src/gateway/probe.close-drain.test.ts b/src/gateway/probe.close-drain.test.ts index 3165a4c4556..07533de9e98 100644 --- a/src/gateway/probe.close-drain.test.ts +++ b/src/gateway/probe.close-drain.test.ts @@ -93,7 +93,9 @@ describe("probeGateway close drain", () => { }); try { - await new Promise((resolve) => wss.once("listening", resolve)); + await new Promise((resolve) => { + wss.once("listening", resolve); + }); const port = (wss.address() as AddressInfo).port; const result = await probeGateway({ diff --git a/src/gateway/server-close.test.ts b/src/gateway/server-close.test.ts index e3995ddc786..d839034827e 100644 --- a/src/gateway/server-close.test.ts +++ b/src/gateway/server-close.test.ts @@ -326,11 +326,15 @@ describe("createGatewayCloseHandler", () => { process.env.OPENCLAW_GATEWAY_RESTART_TRACE = "1"; startGatewayRestartTrace("restart.signal.received", [["reason", "test restart"]]); - await new Promise((resolve) => setTimeout(resolve, 20)); + await new Promise((resolve) => { + setTimeout(resolve, 20); + }); recordGatewayRestartTraceSpan("restart.ready.runtime.post-attach", 12, 40, [ ["eventLoopMax", "1.0ms"], ]); - await new Promise((resolve) => setTimeout(resolve, 20)); + await new Promise((resolve) => { + setTimeout(resolve, 20); + }); finishGatewayRestartTrace("restart.ready"); const messages = mocks.logInfo.mock.calls.map(([message]) => String(message)); @@ -355,7 +359,7 @@ describe("createGatewayCloseHandler", () => { vi.useFakeTimers(); mocks.triggerInternalHook.mockImplementation((event: InternalHookEvent) => { if (event.action === "shutdown") { - return new Promise(() => undefined); + return new Promise(() => {}); } return Promise.resolve(undefined); }); @@ -666,7 +670,7 @@ describe("createGatewayCloseHandler", () => { vi.useFakeTimers(); mocks.triggerInternalHook.mockImplementation((event: InternalHookEvent) => { if (event.action === "pre-restart") { - return new Promise(() => undefined); + return new Promise(() => {}); } return Promise.resolve(undefined); }); @@ -783,7 +787,7 @@ describe("createGatewayCloseHandler", () => { it("continues shutdown and records a warning when bundle MCP runtime disposal hangs", async () => { vi.useFakeTimers(); - mocks.disposeAllSessionMcpRuntimes.mockReturnValue(new Promise(() => undefined)); + mocks.disposeAllSessionMcpRuntimes.mockReturnValue(new Promise(() => {})); const close = createGatewayCloseHandler(createGatewayCloseTestDeps()); const closePromise = close({ reason: "test shutdown" }); @@ -800,7 +804,7 @@ describe("createGatewayCloseHandler", () => { it("continues shutdown and records a warning when bundle LSP runtime disposal hangs", async () => { vi.useFakeTimers(); - mocks.disposeAllBundleLspRuntimes.mockReturnValue(new Promise(() => undefined)); + mocks.disposeAllBundleLspRuntimes.mockReturnValue(new Promise(() => {})); const close = createGatewayCloseHandler(createGatewayCloseTestDeps()); const closePromise = close({ reason: "test shutdown" }); diff --git a/src/gateway/server-close.ts b/src/gateway/server-close.ts index c4fb7dcb2d2..1009f509e76 100644 --- a/src/gateway/server-close.ts +++ b/src/gateway/server-close.ts @@ -615,7 +615,9 @@ export function createGatewayCloseHandler(params: { params.clients.clear(); await measureCloseStep("websocket-server", async () => { const wsClients = params.wss.clients ?? new Set(); - const closePromise = new Promise((resolve) => params.wss.close(() => resolve())); + const closePromise = new Promise((resolve) => { + params.wss.close(() => resolve()); + }); const websocketGraceTimeout = createTimeoutRace( WEBSOCKET_CLOSE_GRACE_MS, () => false as const, @@ -660,15 +662,15 @@ export function createGatewayCloseHandler(params: { if (typeof httpServer.closeIdleConnections === "function") { httpServer.closeIdleConnections(); } - const closePromise = new Promise((resolve, reject) => + const closePromise = new Promise((resolve, reject) => { httpServer.close((err) => { if (!err || isServerNotRunningError(err)) { resolve(); return; } reject(err); - }), - ); + }); + }); void closePromise.catch(() => undefined); const httpGraceTimeout = createTimeoutRace(HTTP_CLOSE_GRACE_MS, () => false as const); const closedWithinGrace = await Promise.race([ diff --git a/src/gateway/server-http.request-trace.test.ts b/src/gateway/server-http.request-trace.test.ts index b1a7023aefa..98bf76bdfb0 100644 --- a/src/gateway/server-http.request-trace.test.ts +++ b/src/gateway/server-http.request-trace.test.ts @@ -29,9 +29,9 @@ async function listen(server: ReturnType): Promi } async function closeServer(server: ReturnType): Promise { - await new Promise((resolve, reject) => - server.close((err) => (err ? reject(err) : resolve())), - ); + await new Promise((resolve, reject) => { + server.close((err) => (err ? reject(err) : resolve())); + }); } afterEach(() => { diff --git a/src/gateway/server-http.test-harness.ts b/src/gateway/server-http.test-harness.ts index 31a93bad406..70df059fbe0 100644 --- a/src/gateway/server-http.test-harness.ts +++ b/src/gateway/server-http.test-harness.ts @@ -111,7 +111,10 @@ export async function dispatchRequest( server.emit("request", req, res); try { await Promise.race([ - responseEndPromises.get(res) ?? new Promise((resolve) => setImmediate(resolve)), + responseEndPromises.get(res) ?? + new Promise((resolve) => { + setImmediate(resolve); + }), new Promise((_, reject) => { timeout = setTimeout(() => { reject(new Error(`gateway test request timed out: ${req.method ?? "GET"} ${req.url}`)); diff --git a/src/gateway/server-methods/agent.test.ts b/src/gateway/server-methods/agent.test.ts index 88525c7df89..10536b0b2d6 100644 --- a/src/gateway/server-methods/agent.test.ts +++ b/src/gateway/server-methods/agent.test.ts @@ -211,7 +211,9 @@ const realSetTimeout = globalThis.setTimeout.bind(globalThis); let dateOnlyFakeClockActive = false; function waitForRealTimer(ms: number) { - return new Promise((resolve) => realSetTimeout(resolve, ms)); + return new Promise((resolve) => { + realSetTimeout(resolve, ms); + }); } async function waitForAssertion(assertion: () => void, timeoutMs = 2_000, stepMs = 5) { @@ -5149,7 +5151,9 @@ describe("gateway agent handler chat.abort integration", () => { expect(mockCallArg(respond, 0, 3)).toEqual({ runId }); expect(mocks.agentCommand).not.toHaveBeenCalled(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(mocks.agentCommand).not.toHaveBeenCalled(); await waitForAssertion(() => expect(mocks.agentCommand).toHaveBeenCalledTimes(1)); await pending; diff --git a/src/gateway/server-methods/channels.status.test.ts b/src/gateway/server-methods/channels.status.test.ts index 3acf9533073..14a04f22fdd 100644 --- a/src/gateway/server-methods/channels.status.test.ts +++ b/src/gateway/server-methods/channels.status.test.ts @@ -288,7 +288,7 @@ describe("channelsHandlers channels.status", () => { vi.useFakeTimers(); try { const autoEnabledConfig = { autoEnabled: true }; - const probeAccount = vi.fn(() => new Promise(() => undefined)); + const probeAccount = vi.fn(() => new Promise(() => {})); mocks.applyPluginAutoEnable.mockReturnValue({ config: autoEnabledConfig, changes: [] }); mocks.listChannelPlugins.mockReturnValue([ { diff --git a/src/gateway/server-methods/chat.directive-tags.test.ts b/src/gateway/server-methods/chat.directive-tags.test.ts index 83107c87979..e19748a10c9 100644 --- a/src/gateway/server-methods/chat.directive-tags.test.ts +++ b/src/gateway/server-methods/chat.directive-tags.test.ts @@ -4982,9 +4982,9 @@ describe("chat directive tag stripping for non-streaming final payloads", () => it("falls back to gateway user persistence when successful runtime persistence fails", async () => { createTranscriptFixture("openclaw-chat-send-user-transcript-success-runtime-persist-failed-"); mockState.triggerAgentRunStart = true; - mockState.runtimeUserMessagePersistencePending = new Promise((_, reject) => - setTimeout(() => reject(new Error("runtime prompt mirror failed")), 0), - ); + mockState.runtimeUserMessagePersistencePending = new Promise((_, reject) => { + setTimeout(() => reject(new Error("runtime prompt mirror failed")), 0); + }); mockState.finalPayload = { text: "agent still answered" }; const respond = vi.fn(); const context = createChatContext(); diff --git a/src/gateway/server-methods/config.test-helpers.ts b/src/gateway/server-methods/config.test-helpers.ts index 9b151c85d95..d3ee96cc6a9 100644 --- a/src/gateway/server-methods/config.test-helpers.ts +++ b/src/gateway/server-methods/config.test-helpers.ts @@ -77,5 +77,7 @@ export function createConfigHandlerHarness(args?: { } export async function flushConfigHandlerMicrotasks() { - await new Promise((resolve) => queueMicrotask(resolve)); + await new Promise((resolve) => { + queueMicrotask(resolve); + }); } diff --git a/src/gateway/server-methods/nodes.ts b/src/gateway/server-methods/nodes.ts index 962c68a203d..aac5a7b7b19 100644 --- a/src/gateway/server-methods/nodes.ts +++ b/src/gateway/server-methods/nodes.ts @@ -235,7 +235,9 @@ async function clearStaleApnsRegistrationIfNeeded( } async function delayMs(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function isForegroundRestrictedIosCommand(command: string): boolean { diff --git a/src/gateway/server-methods/tools-effective.test.ts b/src/gateway/server-methods/tools-effective.test.ts index 26be797acc6..f62b1e3b805 100644 --- a/src/gateway/server-methods/tools-effective.test.ts +++ b/src/gateway/server-methods/tools-effective.test.ts @@ -401,7 +401,9 @@ describe("tools.effective handler", () => { expect(firstRespondCall(stale.respond)?.[1]).toBe(stalePayload); expect(runtimeMocks.resolveEffectiveToolInventory).toHaveBeenCalledTimes(1); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(runtimeMocks.resolveEffectiveToolInventory).toHaveBeenCalledTimes(2); const fresh = createInvokeParams({ sessionKey: "main:abc" }); diff --git a/src/gateway/server-reload-handlers.test.ts b/src/gateway/server-reload-handlers.test.ts index fb93d804d6a..26838580f8a 100644 --- a/src/gateway/server-reload-handlers.test.ts +++ b/src/gateway/server-reload-handlers.test.ts @@ -1273,7 +1273,9 @@ describe("gateway Gmail hot reload handlers", () => { const stopPromise = reloader.stop(); releaseSecrets?.(); await stopPromise; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(hoisted.stopGmailWatcher).not.toHaveBeenCalled(); expect(hoisted.startGmailWatcherWithLogs).not.toHaveBeenCalled(); diff --git a/src/gateway/server-startup-post-attach.test.ts b/src/gateway/server-startup-post-attach.test.ts index 5ef7f20e423..c634938e322 100644 --- a/src/gateway/server-startup-post-attach.test.ts +++ b/src/gateway/server-startup-post-attach.test.ts @@ -1614,7 +1614,9 @@ describe("startGatewayPostAttachRuntime", () => { expect(result.postReadySidecars).toHaveLength(1); await result.postReadySidecars[0]?.stop(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(hoisted.startGmailWatcherWithLogs).not.toHaveBeenCalled(); }); @@ -1659,7 +1661,9 @@ describe("startGatewayPostAttachRuntime", () => { }); await result.postReadySidecars[0]?.stop(); releaseImport?.(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(hoisted.startGmailWatcherWithLogs).not.toHaveBeenCalled(); } finally { diff --git a/src/gateway/server-startup-post-attach.ts b/src/gateway/server-startup-post-attach.ts index f09a59bdbab..15585035ff2 100644 --- a/src/gateway/server-startup-post-attach.ts +++ b/src/gateway/server-startup-post-attach.ts @@ -1394,7 +1394,9 @@ export async function startGatewayPostAttachRuntime( if (!hasGatewayStartHooks(sidecarsResult.pluginRegistry)) { return; } - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const hookRunner = await runtimeDeps.getGlobalHookRunner(); if (hookRunner?.hasHooks("gateway_start")) { const { withPluginHttpRouteRegistry } = await import("../plugins/http-registry.js"); diff --git a/src/gateway/server.agent.gateway-server-agent-b.test.ts b/src/gateway/server.agent.gateway-server-agent-b.test.ts index 1757aff765f..2326fce15da 100644 --- a/src/gateway/server.agent.gateway-server-agent-b.test.ts +++ b/src/gateway/server.agent.gateway-server-agent-b.test.ts @@ -480,7 +480,9 @@ describe("gateway server agent", () => { const writeWs = new WebSocket(`ws://127.0.0.1:${portValue}`); trackConnectChallengeNonce(writeWs); - await new Promise((resolve) => writeWs.once("open", resolve)); + await new Promise((resolve) => { + writeWs.once("open", resolve); + }); await connectOk(writeWs, { scopes: ["operator.write"] }); const directReset = await rpcReq(writeWs, "sessions.reset", { key: "main" }); @@ -581,7 +583,9 @@ describe("gateway server agent", () => { const dial = async () => { const wsLocal = new WebSocket(`ws://127.0.0.1:${portLocal}`); trackConnectChallengeNonce(wsLocal); - await new Promise((resolve) => wsLocal.once("open", resolve)); + await new Promise((resolve) => { + wsLocal.once("open", resolve); + }); await connectOk(wsLocal); return wsLocal; }; diff --git a/src/gateway/server.auth.browser-hardening.test.ts b/src/gateway/server.auth.browser-hardening.test.ts index 62141e4374a..b80892814a8 100644 --- a/src/gateway/server.auth.browser-hardening.test.ts +++ b/src/gateway/server.auth.browser-hardening.test.ts @@ -48,7 +48,9 @@ const originForPort = (port: number) => `http://127.0.0.1:${port}`; const openWs = async (port: number, headers?: Record) => { const ws = new WebSocket(`ws://127.0.0.1:${port}`, headers ? { headers } : undefined); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); return ws; }; diff --git a/src/gateway/server.auth.control-ui.suite.ts b/src/gateway/server.auth.control-ui.suite.ts index 734880be98a..b7a53dfd922 100644 --- a/src/gateway/server.auth.control-ui.suite.ts +++ b/src/gateway/server.auth.control-ui.suite.ts @@ -582,7 +582,9 @@ export function registerControlUiAndPairingSuite(): void { ws, (o) => o.type === "event" && o.event === "connect.challenge", ); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); const challenge = await challengePromise; const nonce = (challenge.payload as { nonce?: unknown } | undefined)?.nonce; expect(typeof nonce).toBe("string"); @@ -1617,7 +1619,9 @@ export function registerControlUiAndPairingSuite(): void { socket, (o) => o.type === "event" && o.event === "connect.challenge", ); - await new Promise((resolve) => socket.once("open", resolve)); + await new Promise((resolve) => { + socket.once("open", resolve); + }); const challenge = await challengePromise; const nonce = (challenge.payload as { nonce?: unknown } | undefined)?.nonce; expect(typeof nonce).toBe("string"); diff --git a/src/gateway/server.auth.default-token.suite.ts b/src/gateway/server.auth.default-token.suite.ts index 0db438fc9af..570a89f30c9 100644 --- a/src/gateway/server.auth.default-token.suite.ts +++ b/src/gateway/server.auth.default-token.suite.ts @@ -67,7 +67,9 @@ export function registerDefaultAuthTokenSuite(): void { expect(connectRes.error?.message ?? "").toContain(params.expectedMessage); expect(connectRes.error?.details?.code).toBe(params.expectedCode); expect(connectRes.error?.details?.reason).toBe(params.expectedReason); - await new Promise((resolve) => ws.once("close", () => resolve())); + await new Promise((resolve) => { + ws.once("close", () => resolve()); + }); } async function expectStatusMissingScopeButHealthAvailable(ws: WebSocket): Promise { @@ -398,7 +400,9 @@ export function registerDefaultAuthTokenSuite(): void { ConnectErrorDetailCodes.DEVICE_AUTH_SIGNATURE_INVALID, ); expect(connectRes.error?.details?.reason).toBe("device-signature"); - await new Promise((resolve) => ws.once("close", () => resolve())); + await new Promise((resolve) => { + ws.once("close", () => resolve()); + }); }); test("sends connect challenge on open", async () => { @@ -408,7 +412,9 @@ export function registerDefaultAuthTokenSuite(): void { event?: string; payload?: Record | null; }> = onceMessage(ws, (o) => o.type === "event" && o.event === "connect.challenge"); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); const evt = await evtPromise; const nonce = (evt.payload as { nonce?: unknown } | undefined)?.nonce; expect(typeof nonce).toBe("string"); @@ -475,14 +481,18 @@ export function registerDefaultAuthTokenSuite(): void { (o) => o.type === "res" && o.id === "h1", ); expect(res.ok).toBe(false); - await new Promise((resolve) => ws.once("close", () => resolve())); + await new Promise((resolve) => { + ws.once("close", () => resolve()); + }); }); test("requires nonce for device auth", async () => { const ws = new WebSocket(`ws://127.0.0.1:${port}`, { headers: { host: "example.com" }, }); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); const { device } = await createSignedDevice({ token: "secret", @@ -498,7 +508,9 @@ export function registerDefaultAuthTokenSuite(): void { }); expect(res.ok).toBe(false); expect(res.error?.message ?? "").toContain("must have required property 'nonce'"); - await new Promise((resolve) => ws.once("close", () => resolve())); + await new Promise((resolve) => { + ws.once("close", () => resolve()); + }); }); test("returns nonce-required detail code when nonce is blank", async () => { diff --git a/src/gateway/server.auth.shared.ts b/src/gateway/server.auth.shared.ts index b6ae6587215..11a74fae89d 100644 --- a/src/gateway/server.auth.shared.ts +++ b/src/gateway/server.auth.shared.ts @@ -58,7 +58,9 @@ async function waitForWsClose(ws: WebSocket, timeoutMs: number): Promise) => { const ws = new WebSocket(`ws://127.0.0.1:${port}`, headers ? { headers } : undefined); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); return ws; }; @@ -89,7 +91,9 @@ const openTailscaleWs = async (port: number, headers?: Record) = }, }); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); return ws; }; diff --git a/src/gateway/server.chat.gateway-server-chat.test.ts b/src/gateway/server.chat.gateway-server-chat.test.ts index 1d5d9faffb8..99c1044c15f 100644 --- a/src/gateway/server.chat.gateway-server-chat.test.ts +++ b/src/gateway/server.chat.gateway-server-chat.test.ts @@ -442,7 +442,9 @@ describe("gateway server chat", () => { headers: { origin: `http://127.0.0.1:${port}` }, }); trackConnectChallengeNonce(webchatWs); - await new Promise((resolve) => webchatWs?.once("open", resolve)); + await new Promise((resolve) => { + webchatWs?.once("open", resolve); + }); await connectOk(webchatWs, { client: { id: GATEWAY_CLIENT_NAMES.CONTROL_UI, @@ -1350,7 +1352,9 @@ describe("gateway server chat", () => { try { scopedWs = new WebSocket(`ws://127.0.0.1:${portValue}`); trackConnectChallengeNonce(scopedWs); - await new Promise((resolve) => scopedWs?.once("open", resolve)); + await new Promise((resolve) => { + scopedWs?.once("open", resolve); + }); await connectOk(scopedWs, { scopes: ["operator.write"], }); @@ -1395,7 +1399,9 @@ describe("gateway server chat", () => { try { scopedWs = new WebSocket(`ws://127.0.0.1:${portLocal}`); trackConnectChallengeNonce(scopedWs); - await new Promise((resolve) => scopedWs?.once("open", resolve)); + await new Promise((resolve) => { + scopedWs?.once("open", resolve); + }); await connectOk(scopedWs, { scopes: ["operator.write"], }); @@ -1576,7 +1582,9 @@ describe("gateway server chat", () => { headers: { origin: `http://127.0.0.1:${port}` }, }); trackConnectChallengeNonce(webchatWs); - await new Promise((resolve) => webchatWs.once("open", resolve)); + await new Promise((resolve) => { + webchatWs.once("open", resolve); + }); await connectOk(webchatWs, { client: { id: GATEWAY_CLIENT_NAMES.WEBCHAT, diff --git a/src/gateway/server.device-token-rotate-authz.test.ts b/src/gateway/server.device-token-rotate-authz.test.ts index 92c06d9a802..2438df587ea 100644 --- a/src/gateway/server.device-token-rotate-authz.test.ts +++ b/src/gateway/server.device-token-rotate-authz.test.ts @@ -120,8 +120,12 @@ async function getConnectedNodeId(ws: WebSocket): Promise { } async function waitForMacrotasks(): Promise { - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); } async function issuePairingScopedTokenForAdminApprovedDevice(name: string): Promise<{ diff --git a/src/gateway/server.e2e-ws-harness.ts b/src/gateway/server.e2e-ws-harness.ts index c64e5088e9f..902896e96f1 100644 --- a/src/gateway/server.e2e-ws-harness.ts +++ b/src/gateway/server.e2e-ws-harness.ts @@ -32,7 +32,9 @@ export async function startGatewayServerHarness(): Promise const openClient = async (opts?: Parameters[1]): Promise => { const ws = new WebSocket(`ws://127.0.0.1:${port}`); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); const hello = await connectOk(ws, opts); return { ws, hello }; }; diff --git a/src/gateway/server.models-voicewake-misc.test.ts b/src/gateway/server.models-voicewake-misc.test.ts index fff0b447a75..4098a0be6cf 100644 --- a/src/gateway/server.models-voicewake-misc.test.ts +++ b/src/gateway/server.models-voicewake-misc.test.ts @@ -271,7 +271,9 @@ describe("gateway server models + voicewake", () => { await withTempHome(async () => { const nodeWs = new WebSocket(`ws://127.0.0.1:${port}`); trackConnectChallengeNonce(nodeWs); - await new Promise((resolve) => nodeWs.once("open", resolve)); + await new Promise((resolve) => { + nodeWs.once("open", resolve); + }); const firstEventP = onceMessage( nodeWs, (o) => o.type === "event" && o.event === "voicewake.changed", @@ -424,7 +426,9 @@ describe("gateway server models + voicewake", () => { await withTempHome(async () => { const nodeWs = new WebSocket(`ws://127.0.0.1:${port}`); trackConnectChallengeNonce(nodeWs); - await new Promise((resolve) => nodeWs.once("open", resolve)); + await new Promise((resolve) => { + nodeWs.once("open", resolve); + }); const firstEventP = onceMessage<{ type: "event"; event: string; @@ -814,8 +818,8 @@ describe("gateway server misc", () => { probe.listen(releasePort, "127.0.0.1", () => resolve()); }); expect(probe.listening).toBe(true); - await new Promise((resolve, reject) => - probe.close((err) => (err ? reject(err) : resolve())), - ); + await new Promise((resolve, reject) => { + probe.close((err) => (err ? reject(err) : resolve())); + }); }); }); diff --git a/src/gateway/server.node-invoke-approval-bypass.test.ts b/src/gateway/server.node-invoke-approval-bypass.test.ts index 3da824d2d8c..3da255f8240 100644 --- a/src/gateway/server.node-invoke-approval-bypass.test.ts +++ b/src/gateway/server.node-invoke-approval-bypass.test.ts @@ -42,8 +42,12 @@ function createDeviceIdentity(): DeviceIdentity { async function expectNoForwardedInvoke(hasInvoke: () => boolean): Promise { // Yield a couple of macrotasks so any accidental async forwarding would fire. - await new Promise((resolve) => setImmediate(resolve)); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(hasInvoke()).toBe(false); } @@ -238,7 +242,9 @@ describe("node.invoke approval bypass", () => { const challengePromise = resolveDevice ? onceMessage(ws, (o) => o.type === "event" && o.event === "connect.challenge") : null; - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); const nonce = (() => { if (!challengePromise) { return Promise.resolve(""); @@ -279,7 +285,9 @@ describe("node.invoke approval bypass", () => { const connectTrustedBackend = async (scopes: string[]) => { const ws = new WebSocket(`ws://127.0.0.1:${port}`); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); const res = await connectReq(ws, { token: "secret", scopes, diff --git a/src/gateway/server.plugin-node-capability-auth.test.ts b/src/gateway/server.plugin-node-capability-auth.test.ts index 7c00b715eab..ff6bfc3d6db 100644 --- a/src/gateway/server.plugin-node-capability-auth.test.ts +++ b/src/gateway/server.plugin-node-capability-auth.test.ts @@ -82,7 +82,9 @@ async function listen( sockets.delete(socket); }); }); - await new Promise((resolve) => server.listen(0, host, resolve)); + await new Promise((resolve) => { + server.listen(0, host, resolve); + }); const addr = server.address(); const port = typeof addr === "object" && addr ? addr.port : 0; return { @@ -93,9 +95,9 @@ async function listen( socket.destroy(); } await withTimeout( - new Promise((resolve, reject) => - server.close((err) => (err ? reject(err) : resolve())), - ), + new Promise((resolve, reject) => { + server.close((err) => (err ? reject(err) : resolve())); + }), SERVER_CLOSE_TIMEOUT_MS, "gateway test server close", ); @@ -335,8 +337,12 @@ async function withCanvasGatewayHarness(params: { for (const ws of wss.clients) { ws.terminate(); } - await new Promise((resolve) => canvasWss.close(() => resolve())); - await new Promise((resolve) => wss.close(() => resolve())); + await new Promise((resolve) => { + canvasWss.close(() => resolve()); + }); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); await listener.close(); params.rateLimiter?.dispose(); } diff --git a/src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts b/src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts index 6d40ff1f371..e94f0e36ac6 100644 --- a/src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts +++ b/src/gateway/server.preauth-bootstrap-token-rate-limit.test.ts @@ -16,7 +16,9 @@ installGatewayTestHooks({ scope: "suite" }); async function openWs(port: number) { const ws = new WebSocket(`ws://127.0.0.1:${port}`); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); return ws; } diff --git a/src/gateway/server.preauth-hardening.test.ts b/src/gateway/server.preauth-hardening.test.ts index c86958e438c..18f70da399a 100644 --- a/src/gateway/server.preauth-hardening.test.ts +++ b/src/gateway/server.preauth-hardening.test.ts @@ -108,7 +108,9 @@ describe("gateway pre-auth hardening", () => { resolvedAuth, }); - await new Promise((resolve) => httpServer.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + httpServer.listen(0, "127.0.0.1", resolve); + }); const address = httpServer.address(); const port = typeof address === "object" && address ? address.port : 0; @@ -123,9 +125,9 @@ describe("gateway pre-auth hardening", () => { }); } finally { wss.close(); - await new Promise((resolve, reject) => - httpServer.close((err) => (err ? reject(err) : resolve())), - ); + await new Promise((resolve, reject) => { + httpServer.close((err) => (err ? reject(err) : resolve())); + }); } }); diff --git a/src/gateway/server.sessions.permissions-hooks.test.ts b/src/gateway/server.sessions.permissions-hooks.test.ts index 9a5a21a5749..ba957228bf8 100644 --- a/src/gateway/server.sessions.permissions-hooks.test.ts +++ b/src/gateway/server.sessions.permissions-hooks.test.ts @@ -84,7 +84,9 @@ test("webchat clients cannot patch, delete, compact, or restore sessions", async headers: { origin: `http://127.0.0.1:${getHarness().port}` }, }); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); await connectOk(ws, { client: { id: GATEWAY_CLIENT_IDS.WEBCHAT_UI, @@ -179,7 +181,9 @@ test("session:patch hook does not fire for webchat clients", async () => { headers: { origin: `http://127.0.0.1:${getHarness().port}` }, }); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); await connectOk(ws, { client: { id: GATEWAY_CLIENT_IDS.WEBCHAT_UI, @@ -326,7 +330,9 @@ test("control-ui client can delete sessions even in webchat mode", async () => { headers: { origin: `http://127.0.0.1:${getHarness().port}` }, }); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); await connectOk(ws, { client: { id: GATEWAY_CLIENT_IDS.CONTROL_UI, diff --git a/src/gateway/server.sessions.reset-cleanup.test.ts b/src/gateway/server.sessions.reset-cleanup.test.ts index 8c844ae7605..d803f038073 100644 --- a/src/gateway/server.sessions.reset-cleanup.test.ts +++ b/src/gateway/server.sessions.reset-cleanup.test.ts @@ -495,7 +495,9 @@ test("sessions.reset closes child ACP runtimes concurrently so stuck children do if (req?.sessionKey === "agent:main:main") { return; } - await new Promise((resolve) => releaseChildren.push(resolve)); + await new Promise((resolve) => { + releaseChildren.push(resolve); + }); }); try { diff --git a/src/gateway/server.shared-auth-rotation.test.ts b/src/gateway/server.shared-auth-rotation.test.ts index dae75e9dbaa..a97dd6c2da8 100644 --- a/src/gateway/server.shared-auth-rotation.test.ts +++ b/src/gateway/server.shared-auth-rotation.test.ts @@ -106,7 +106,9 @@ async function openDeviceTokenWsWithDetails( params.browserClient ? { headers: { origin: `http://127.0.0.1:${port}` } } : undefined, ); trackConnectChallengeNonce(ws); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); const hello = (await connectOk(ws, { skipDefaultAuth: true, client, diff --git a/src/gateway/server/ws-connection/auth-context.test.ts b/src/gateway/server/ws-connection/auth-context.test.ts index 38fbf6c964b..4a7cae11d14 100644 --- a/src/gateway/server/ws-connection/auth-context.test.ts +++ b/src/gateway/server/ws-connection/auth-context.test.ts @@ -424,7 +424,9 @@ describe("resolveConnectAuthDecision", () => { const verifyBootstrapToken = vi.fn(async () => { activeBootstrapChecks += 1; maxActiveBootstrapChecks = Math.max(maxActiveBootstrapChecks, activeBootstrapChecks); - await new Promise((resolve) => setTimeout(resolve, 5)); + await new Promise((resolve) => { + setTimeout(resolve, 5); + }); activeBootstrapChecks -= 1; return { ok: false, reason: "bootstrap_token_invalid" }; }); diff --git a/src/gateway/server/ws-connection/message-handler.post-connect-health.test.ts b/src/gateway/server/ws-connection/message-handler.post-connect-health.test.ts index 656cd8c5017..f0e8677210f 100644 --- a/src/gateway/server/ws-connection/message-handler.post-connect-health.test.ts +++ b/src/gateway/server/ws-connection/message-handler.post-connect-health.test.ts @@ -494,7 +494,9 @@ describe("attachGatewayWsMessageHandler post-connect health refresh", () => { expect(handleGatewayRequest).toHaveBeenCalledTimes(2); expect(releaseSecondMutation).toBeTypeOf("function"); }); - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); expect(handleGatewayRequest).toHaveBeenCalledTimes(2); releaseSecondMutation?.(); diff --git a/src/gateway/session-transcript-index.fs.ts b/src/gateway/session-transcript-index.fs.ts index 961cf79d494..e2067a5427c 100644 --- a/src/gateway/session-transcript-index.fs.ts +++ b/src/gateway/session-transcript-index.fs.ts @@ -97,7 +97,9 @@ function extractJsonNumberFieldPrefix(prefix: string, field: string): number | u } async function yieldTranscriptIndexScan(): Promise { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } function touchCachedIndex(filePath: string, entry: CacheEntry): SessionTranscriptIndex { diff --git a/src/gateway/session-utils.fs.ts b/src/gateway/session-utils.fs.ts index f92ac7ae3eb..60286a4446b 100644 --- a/src/gateway/session-utils.fs.ts +++ b/src/gateway/session-utils.fs.ts @@ -116,7 +116,9 @@ function setCachedTranscriptMessageCount(filePath: string, stat: fs.Stats, count } async function yieldTranscriptScan(): Promise { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } export function attachOpenClawTranscriptMeta( diff --git a/src/gateway/session-utils.ts b/src/gateway/session-utils.ts index fdeca2a5c73..d64770e56de 100644 --- a/src/gateway/session-utils.ts +++ b/src/gateway/session-utils.ts @@ -2763,7 +2763,9 @@ export async function listSessionsFromStoreAsync(params: { // Yield to the event loop between batches so WebSocket heartbeats, // channel I/O, and concurrent RPC calls are not starved. if ((i + 1) % SESSIONS_LIST_YIELD_BATCH_SIZE === 0 && i + 1 < entries.length) { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } } diff --git a/src/gateway/test-helpers.e2e.ts b/src/gateway/test-helpers.e2e.ts index 12ee34b8d91..e0cba5ed09d 100644 --- a/src/gateway/test-helpers.e2e.ts +++ b/src/gateway/test-helpers.e2e.ts @@ -158,7 +158,9 @@ export async function connectDeviceAuthReq(params: { url: string; token?: string ws.on("message", handler); ws.once("close", closeHandler); }); - await new Promise((resolve) => ws.once("open", resolve)); + await new Promise((resolve) => { + ws.once("open", resolve); + }); const connectNonce = await connectNoncePromise; const identity = loadOrCreateDeviceIdentity(); const signedAtMs = Date.now(); diff --git a/src/gateway/test-helpers.mocks.ts b/src/gateway/test-helpers.mocks.ts index 8c90cc48944..1b265f751b7 100644 --- a/src/gateway/test-helpers.mocks.ts +++ b/src/gateway/test-helpers.mocks.ts @@ -193,7 +193,9 @@ vi.mock("../config/sessions.js", async () => { saveSessionStore: vi.fn(async (storePath: string, store: unknown) => { const delay = sessionStoreSaveDelayMs.value; if (delay > 0) { - await new Promise((resolve) => setTimeout(resolve, delay)); + await new Promise((resolve) => { + setTimeout(resolve, delay); + }); } return actual.saveSessionStore(storePath, store as never); }), diff --git a/src/gateway/test-helpers.server.ts b/src/gateway/test-helpers.server.ts index 15b3d696d71..b7856cbfb8a 100644 --- a/src/gateway/test-helpers.server.ts +++ b/src/gateway/test-helpers.server.ts @@ -1182,7 +1182,9 @@ export async function waitForSystemEvent(timeoutMs = 2000) { return events; } } - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); } throw new Error("timeout waiting for system event"); } diff --git a/src/gateway/test-helpers.speech.ts b/src/gateway/test-helpers.speech.ts index ef22325efc6..c4b41274b4f 100644 --- a/src/gateway/test-helpers.speech.ts +++ b/src/gateway/test-helpers.speech.ts @@ -26,9 +26,9 @@ async function fetchStubSpeechAudio( const withTimeout = async (label: string, run: Promise): Promise => await Promise.race([ run, - new Promise((_, reject) => - setTimeout(() => reject(new Error(`${providerId} stub ${label} timed out`)), 5_000), - ), + new Promise((_, reject) => { + setTimeout(() => reject(new Error(`${providerId} stub ${label} timed out`)), 5_000); + }), ]); const response = await withTimeout("fetch", globalThis.fetch(url, init)); const arrayBuffer = await withTimeout("read", response.arrayBuffer()); diff --git a/src/gateway/tools-invoke-http.cron-regression.test.ts b/src/gateway/tools-invoke-http.cron-regression.test.ts index fe1a8cf51f4..95a0e3b3888 100644 --- a/src/gateway/tools-invoke-http.cron-regression.test.ts +++ b/src/gateway/tools-invoke-http.cron-regression.test.ts @@ -108,7 +108,9 @@ afterAll(async () => { if (!server) { return; } - await new Promise((resolve) => server?.close(() => resolve())); + await new Promise((resolve) => { + server?.close(() => resolve()); + }); server = undefined; }); diff --git a/src/gateway/tools-invoke-http.test.ts b/src/gateway/tools-invoke-http.test.ts index 85ed6967485..88e4488ed55 100644 --- a/src/gateway/tools-invoke-http.test.ts +++ b/src/gateway/tools-invoke-http.test.ts @@ -257,7 +257,9 @@ afterAll(async () => { if (!server) { return; } - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); sharedServer = undefined; }); diff --git a/src/infra/approval-handler-bootstrap.test.ts b/src/infra/approval-handler-bootstrap.test.ts index 0e250c6081c..4e3d848373b 100644 --- a/src/infra/approval-handler-bootstrap.test.ts +++ b/src/infra/approval-handler-bootstrap.test.ts @@ -116,7 +116,9 @@ describe("startChannelApprovalHandlerBootstrap", () => { const result = await Promise.race([ startTestBootstrap({ channelRuntime }).then((cleanup) => ({ cleanup })), - new Promise<"timeout">((resolve) => setTimeout(() => resolve("timeout"), 50)), + new Promise<"timeout">((resolve) => { + setTimeout(() => resolve("timeout"), 50); + }), ]); expect(result).not.toBe("timeout"); diff --git a/src/infra/approval-handler-runtime.test.ts b/src/infra/approval-handler-runtime.test.ts index 95f5bec0d0f..40d8cd9e821 100644 --- a/src/infra/approval-handler-runtime.test.ts +++ b/src/infra/approval-handler-runtime.test.ts @@ -390,8 +390,12 @@ describe("createLazyChannelApprovalNativeRuntimeAdapter", () => { const inflight = approvalRuntime.handleRequested(request); // Flush microtasks so deliverPending resolves and bindPending parks at the gate. - await new Promise((r) => setTimeout(r, 0)); - await new Promise((r) => setTimeout(r, 0)); + await new Promise((r) => { + setTimeout(r, 0); + }); + await new Promise((r) => { + setTimeout(r, 0); + }); // stop() flips the stopped flag while bindPending is parked. await approvalRuntime.stop(); @@ -435,8 +439,12 @@ describe("createLazyChannelApprovalNativeRuntimeAdapter", () => { const inflight = approvalRuntime.handleRequested(request); // Flush microtasks so deliverPending is awaited and parked at the gate. - await new Promise((r) => setTimeout(r, 0)); - await new Promise((r) => setTimeout(r, 0)); + await new Promise((r) => { + setTimeout(r, 0); + }); + await new Promise((r) => { + setTimeout(r, 0); + }); // stop() flips the stopped flag while deliverPending is still pending. await approvalRuntime.stop(); @@ -482,8 +490,12 @@ describe("createLazyChannelApprovalNativeRuntimeAdapter", () => { const inflight = approvalRuntime.handleRequested(request); // Flush microtasks so deliverPending resolves and bindPending awaits the gate. - await new Promise((r) => setTimeout(r, 0)); - await new Promise((r) => setTimeout(r, 0)); + await new Promise((r) => { + setTimeout(r, 0); + }); + await new Promise((r) => { + setTimeout(r, 0); + }); // stop() flips the stopped flag while bindPending is parked; it then resolves to null. await approvalRuntime.stop(); diff --git a/src/infra/archive-helpers.test.ts b/src/infra/archive-helpers.test.ts index 85945f709a1..8e1045fa035 100644 --- a/src/infra/archive-helpers.test.ts +++ b/src/infra/archive-helpers.test.ts @@ -95,7 +95,9 @@ describe("archive helpers", () => { it("rejects when archive work exceeds the timeout", async () => { vi.useFakeTimers(); - const late = new Promise((resolve) => setTimeout(() => resolve("ok"), 50)); + const late = new Promise((resolve) => { + setTimeout(() => resolve("ok"), 50); + }); const result = withTimeout(late, 1, "extract tar"); const pending = expect(result).rejects.toThrow("extract tar timed out after 1ms"); await vi.advanceTimersByTimeAsync(1); diff --git a/src/infra/backup-create.ts b/src/infra/backup-create.ts index 8a67cac2b1b..2d1586e6604 100644 --- a/src/infra/backup-create.ts +++ b/src/infra/backup-create.ts @@ -138,7 +138,9 @@ function isTarEofRaceError(err: unknown): boolean { } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } export type BackupTarRetryLogger = (message: string) => void; diff --git a/src/infra/diagnostic-events.test.ts b/src/infra/diagnostic-events.test.ts index 0175c85b022..cfc594f4220 100644 --- a/src/infra/diagnostic-events.test.ts +++ b/src/infra/diagnostic-events.test.ts @@ -204,7 +204,9 @@ describe("diagnostic-events", () => { model: "gpt-5.4", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(events).toEqual([ { internal: false, metadataTrusted: false, type: "message.queued" }, { internal: true, metadataTrusted: false, type: "webhook.received" }, @@ -275,7 +277,9 @@ describe("diagnostic-events", () => { model: "gpt-5.4", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(events).toEqual([false]); delete globalStore[Symbol.for("openclaw.diagnosticEventsState")]; }); @@ -298,7 +302,9 @@ describe("diagnostic-events", () => { model: "gpt-5.4", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(publicEvents).toStrictEqual([]); expect(internalEvents).toEqual([{ trusted: true, type: "model.call.started" }]); }); @@ -348,7 +354,9 @@ describe("diagnostic-events", () => { trace, }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(seen).toEqual([{ traceId: trace.traceId, trusted: true }]); expectConsoleErrorPrefix( errorSpy, @@ -426,7 +434,9 @@ describe("diagnostic-events", () => { }); expect(events).toStrictEqual([]); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(events).toEqual(["tool.execution.started", "model.call.started"]); }); @@ -447,11 +457,17 @@ describe("diagnostic-events", () => { } expect(events).toStrictEqual([]); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(events).toHaveLength(100); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(events).toHaveLength(200); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(events).toHaveLength(250); }); @@ -698,7 +714,9 @@ describe("diagnostic-events", () => { message: "private log", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(publicEvents).toStrictEqual([]); expect(internalEvents).toEqual(["log.record"]); }); diff --git a/src/infra/diagnostic-events.ts b/src/infra/diagnostic-events.ts index d3430e42eff..3a88dd5b55a 100644 --- a/src/infra/diagnostic-events.ts +++ b/src/infra/diagnostic-events.ts @@ -1027,7 +1027,9 @@ function dispatchAsyncDiagnosticDropSummary(state: DiagnosticEventsGlobalState): export async function waitForDiagnosticEventsDrained(): Promise { const state = getDiagnosticEventsState(); while (state.asyncDrainScheduled || state.asyncQueue.length > 0) { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } } diff --git a/src/infra/fetch.test.ts b/src/infra/fetch.test.ts index ab4d9bb934f..83c1a96d2ba 100644 --- a/src/infra/fetch.test.ts +++ b/src/infra/fetch.test.ts @@ -3,7 +3,9 @@ import { withFetchPreconnect } from "../test-utils/fetch-mock.js"; import { resolveFetch, wrapFetchWithAbortSignal } from "./fetch.js"; async function waitForMicrotaskTurn(): Promise { - await new Promise((resolve) => queueMicrotask(resolve)); + await new Promise((resolve) => { + queueMicrotask(resolve); + }); } function createForeignSignalHarness() { diff --git a/src/infra/gateway-lock.ts b/src/infra/gateway-lock.ts index d58263d15b7..b0acd52d921 100644 --- a/src/infra/gateway-lock.ts +++ b/src/infra/gateway-lock.ts @@ -270,7 +270,11 @@ export async function acquireGatewayLock( const port = opts.port; const now = opts.now ?? Date.now; const sleep = - opts.sleep ?? (async (ms: number) => await new Promise((resolve) => setTimeout(resolve, ms))); + opts.sleep ?? + (async (ms: number) => + await new Promise((resolve) => { + setTimeout(resolve, ms); + })); const { lockPath, configPath } = resolveGatewayLockPath(env, opts.lockDir); await fs.mkdir(path.dirname(lockPath), { recursive: true }); diff --git a/src/infra/http-body.test.ts b/src/infra/http-body.test.ts index 7bf892cb324..dd0a1cd120b 100644 --- a/src/infra/http-body.test.ts +++ b/src/infra/http-body.test.ts @@ -19,7 +19,9 @@ type MockIncomingMessage = IncomingMessage & { }; async function waitForMicrotaskTurn(): Promise { - await new Promise((resolve) => queueMicrotask(resolve)); + await new Promise((resolve) => { + queueMicrotask(resolve); + }); } async function expectRequestBodyLimitError( diff --git a/src/infra/net/http-connect-tunnel.test.ts b/src/infra/net/http-connect-tunnel.test.ts index f4dc750dc63..e687c3fa5b3 100644 --- a/src/infra/net/http-connect-tunnel.test.ts +++ b/src/infra/net/http-connect-tunnel.test.ts @@ -303,7 +303,9 @@ describe("openHttpConnectTunnel", () => { return socket; }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(resolved).toBe(false); targetTlsSocket.emit("secureConnect"); diff --git a/src/infra/outbound/deliver.test.ts b/src/infra/outbound/deliver.test.ts index f0379561f14..f50b8080a4c 100644 --- a/src/infra/outbound/deliver.test.ts +++ b/src/infra/outbound/deliver.test.ts @@ -257,7 +257,9 @@ async function deliverSingleMatrixForHookTest(params?: { sessionKey?: string }) } function flushDiagnosticEvents() { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } async function runBestEffortPartialFailureDelivery(params?: { onError?: boolean }) { diff --git a/src/infra/package-dist-inventory.ts b/src/infra/package-dist-inventory.ts index 33a404c9324..0c4bf2fa747 100644 --- a/src/infra/package-dist-inventory.ts +++ b/src/infra/package-dist-inventory.ts @@ -109,7 +109,9 @@ async function withPackageDistInventoryFsSlot( task: () => Promise, ): Promise { while (context.activeFsOps >= context.fsConcurrency) { - await new Promise((resolve) => context.waiters.push(resolve)); + await new Promise((resolve) => { + context.waiters.push(resolve); + }); } context.activeFsOps += 1; try { diff --git a/src/infra/ports-probe.test.ts b/src/infra/ports-probe.test.ts index ff25f389ce6..024303ae5a6 100644 --- a/src/infra/ports-probe.test.ts +++ b/src/infra/ports-probe.test.ts @@ -23,7 +23,9 @@ async function withListeningServer(cb: (address: net.AddressInfo) => Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } } diff --git a/src/infra/ports.test.ts b/src/infra/ports.test.ts index 6d272cccd69..0f061d9b28d 100644 --- a/src/infra/ports.test.ts +++ b/src/infra/ports.test.ts @@ -72,7 +72,9 @@ describe("ports helpers", () => { } const port = address.port; await expect(ensurePortAvailable(port)).rejects.toBeInstanceOf(PortInUseError); - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); }); it("handlePortError exits nicely on EADDRINUSE", async () => { @@ -129,7 +131,9 @@ describeUnix("inspectPortUsage", () => { const enoentErrors = (result.errors ?? []).filter((err) => err.includes("ENOENT")); expect(enoentErrors.length).toBeGreaterThan(0); } finally { - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } }); @@ -190,7 +194,9 @@ describeUnix("inspectPortUsage", () => { expect(result.listeners[0]?.commandLine).toContain("openclaw"); expect(result.errors).toBeUndefined(); } finally { - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } }); diff --git a/src/infra/provider-usage.shared.test.ts b/src/infra/provider-usage.shared.test.ts index e981fdf39f0..573a4064653 100644 --- a/src/infra/provider-usage.shared.test.ts +++ b/src/infra/provider-usage.shared.test.ts @@ -61,7 +61,9 @@ describe("provider-usage.shared", () => { it("returns fallback when timeout wins", async () => { vi.useFakeTimers(); - const late = new Promise((resolve) => setTimeout(() => resolve("late"), 50)); + const late = new Promise((resolve) => { + setTimeout(() => resolve("late"), 50); + }); const result = withTimeout(late, 1, "fallback"); await vi.advanceTimersByTimeAsync(1); await expect(result).resolves.toBe("fallback"); diff --git a/src/infra/session-cost-usage.test.ts b/src/infra/session-cost-usage.test.ts index 40a1a743a68..0b004920965 100644 --- a/src/infra/session-cost-usage.test.ts +++ b/src/infra/session-cost-usage.test.ts @@ -596,7 +596,9 @@ describe("session cost usage", () => { activeStats += 1; maxActiveStats = Math.max(maxActiveStats, activeStats); try { - await new Promise((resolve) => setTimeout(resolve, 2)); + await new Promise((resolve) => { + setTimeout(resolve, 2); + }); return await originalStat(target); } finally { activeStats -= 1; diff --git a/src/infra/ssh-tunnel.ts b/src/infra/ssh-tunnel.ts index 3d80f5dfa67..94147764349 100644 --- a/src/infra/ssh-tunnel.ts +++ b/src/infra/ssh-tunnel.ts @@ -97,7 +97,9 @@ async function waitForLocalListener(port: number, timeoutMs: number): Promise setTimeout(r, 50)); + await new Promise((r) => { + setTimeout(r, 50); + }); } throw new Error(`ssh tunnel did not start listening on localhost:${port}`); } diff --git a/src/infra/tailscale.ts b/src/infra/tailscale.ts index 4ba85d1185b..1f693c5edb9 100644 --- a/src/infra/tailscale.ts +++ b/src/infra/tailscale.ts @@ -45,7 +45,9 @@ export async function findTailscaleBinary(): Promise { // Use Promise.race with runExec to implement timeout await Promise.race([ runExec(path, ["--version"], { timeoutMs: 3000 }), - new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), 3000)), + new Promise((_, reject) => { + setTimeout(() => reject(new Error("timeout")), 3000); + }), ]); return true; } catch { diff --git a/src/infra/warning-filter.test.ts b/src/infra/warning-filter.test.ts index 6d0d07e48fe..9f792bc03c9 100644 --- a/src/infra/warning-filter.test.ts +++ b/src/infra/warning-filter.test.ts @@ -13,7 +13,9 @@ function resetWarningFilterInstallState(): void { } async function flushWarnings(): Promise { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } describe("warning filter", () => { diff --git a/src/infra/watch-node.test.ts b/src/infra/watch-node.test.ts index a1cfea591c9..e5dbfec94fc 100644 --- a/src/infra/watch-node.test.ts +++ b/src/infra/watch-node.test.ts @@ -252,7 +252,9 @@ describe("watch-node script", () => { ); resolveLoadChokidar({ watch }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(watch).toHaveBeenCalledTimes(1); fakeProcess.emit("SIGINT"); @@ -336,7 +338,9 @@ describe("watch-node script", () => { const { watcher, fakeProcess, runPromise } = startWatchRun({ spawn }); gatewayA.emit("exit", 1, null); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(spawn).toHaveBeenCalledTimes(2); const doctorSpawnCall = requireMockCall(spawn, 1); @@ -350,7 +354,9 @@ describe("watch-node script", () => { expect(requireSpawnOptions(spawn, 1).stdio).toBe("inherit"); doctor.emit("exit", 0, null); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(spawn).toHaveBeenCalledTimes(3); const restartedGatewaySpawnCall = requireMockCall(spawn, 2); @@ -396,7 +402,9 @@ describe("watch-node script", () => { const { watcher, fakeProcess, runPromise } = startWatchRun({ spawn }); childA.emit("exit", 143, null); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(spawn).toHaveBeenCalledTimes(2); fakeProcess.emit("SIGINT"); @@ -451,37 +459,51 @@ describe("watch-node script", () => { const { watcher, fakeProcess, runPromise } = startWatchRun({ spawn }); watcher.emit("change", "src/infra/watch-node.test.ts"); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(spawn).toHaveBeenCalledTimes(1); expect(childA.kill).not.toHaveBeenCalled(); watcher.emit("change", "src/infra/watch-node.test.tsx"); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(spawn).toHaveBeenCalledTimes(1); expect(childA.kill).not.toHaveBeenCalled(); watcher.emit("change", "src/infra/watch-node-test-helpers.ts"); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(spawn).toHaveBeenCalledTimes(1); expect(childA.kill).not.toHaveBeenCalled(); watcher.emit("change", VOICE_CALL_README); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(spawn).toHaveBeenCalledTimes(1); expect(childA.kill).not.toHaveBeenCalled(); watcher.emit("change", VOICE_CALL_MANIFEST); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(childA.kill).toHaveBeenCalledWith("SIGTERM"); expect(spawn).toHaveBeenCalledTimes(2); watcher.emit("change", VOICE_CALL_PACKAGE); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(childB.kill).toHaveBeenCalledWith("SIGTERM"); expect(spawn).toHaveBeenCalledTimes(3); watcher.emit("change", "src/infra/watch-node.ts"); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(childC.kill).toHaveBeenCalledWith("SIGTERM"); expect(spawn).toHaveBeenCalledTimes(4); @@ -629,7 +651,9 @@ describe("watch-node script", () => { spawn, }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(signalProcess).toHaveBeenCalledWith(2121, "SIGTERM"); expect(spawn).toHaveBeenCalledTimes(1); diff --git a/src/logging/diagnostic-log-events.test.ts b/src/logging/diagnostic-log-events.test.ts index cbfd62ade7a..d3b48e107e8 100644 --- a/src/logging/diagnostic-log-events.test.ts +++ b/src/logging/diagnostic-log-events.test.ts @@ -16,7 +16,9 @@ const SPAN_ID = "00f067aa0ba902b7"; const PROTO_KEY = "__proto__"; function flushDiagnosticEvents() { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } beforeEach(() => { diff --git a/src/logging/diagnostic-stability.test.ts b/src/logging/diagnostic-stability.test.ts index ca2f98805a9..e100666d22a 100644 --- a/src/logging/diagnostic-stability.test.ts +++ b/src/logging/diagnostic-stability.test.ts @@ -69,7 +69,9 @@ describe("diagnostic stability recorder", () => { durationMs: 12, byteLength: 345, }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const snapshot = getDiagnosticStabilitySnapshot({ limit: 10 }); @@ -237,7 +239,9 @@ describe("diagnostic stability recorder", () => { contextTokenBudget: 200_000, reserveTokens: 20_000, }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const snapshot = getDiagnosticStabilitySnapshot({ limit: 10 }); @@ -284,7 +288,9 @@ describe("diagnostic stability recorder", () => { arrayBuffersBytes: 10, }, }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const snapshot = getDiagnosticStabilitySnapshot({ limit: 10 }); @@ -427,7 +433,9 @@ describe("diagnostic stability recorder", () => { }); } - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); const midDrainSnapshot = getDiagnosticStabilitySnapshot({ limit: 1000 }); expect(midDrainSnapshot.lastSeq).toBe(100); diff --git a/src/logging/diagnostic-stuck-session-recovery.integration.test.ts b/src/logging/diagnostic-stuck-session-recovery.integration.test.ts index 5d301dd4da9..df84320a0f3 100644 --- a/src/logging/diagnostic-stuck-session-recovery.integration.test.ts +++ b/src/logging/diagnostic-stuck-session-recovery.integration.test.ts @@ -21,7 +21,9 @@ import { } from "./diagnostic-stuck-session-recovery.runtime.js"; function delay(ms: number): Promise<"blocked"> { - return new Promise((resolve) => setTimeout(() => resolve("blocked"), ms)); + return new Promise((resolve) => { + setTimeout(() => resolve("blocked"), ms); + }); } describe("stuck session recovery integration", () => { diff --git a/src/logging/diagnostic.test.ts b/src/logging/diagnostic.test.ts index e5b003c28f5..d02d327ac72 100644 --- a/src/logging/diagnostic.test.ts +++ b/src/logging/diagnostic.test.ts @@ -52,7 +52,9 @@ function createEmitMemorySampleMock() { } function flushDiagnosticEvents() { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } function countMatching(items: readonly T[], predicate: (item: T) => boolean) { diff --git a/src/logging/test-helpers/diagnostic-log-capture.ts b/src/logging/test-helpers/diagnostic-log-capture.ts index f1084d4efb3..288c6e867ff 100644 --- a/src/logging/test-helpers/diagnostic-log-capture.ts +++ b/src/logging/test-helpers/diagnostic-log-capture.ts @@ -7,7 +7,9 @@ export type CapturedDiagnosticLogRecord = Extract { for (let index = 0; index < 3; index += 1) { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } } diff --git a/src/mcp/channel-server.shutdown-unhandled-rejection.test.ts b/src/mcp/channel-server.shutdown-unhandled-rejection.test.ts index 48e04057dca..e696b335d0c 100644 --- a/src/mcp/channel-server.shutdown-unhandled-rejection.test.ts +++ b/src/mcp/channel-server.shutdown-unhandled-rejection.test.ts @@ -118,7 +118,9 @@ describe("serveOpenClawChannelMcp shutdown", () => { transport.onclose?.(); await servePromise; - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(unhandledRejections).toStrictEqual([]); expect(bridgeState.close).toHaveBeenCalledTimes(1); diff --git a/src/media-understanding/shared.ts b/src/media-understanding/shared.ts index b5997e18e65..1d7d60b2649 100644 --- a/src/media-understanding/shared.ts +++ b/src/media-understanding/shared.ts @@ -151,14 +151,18 @@ export async function waitProviderOperationPollInterval(params: { const pollIntervalMs = resolveTimerTimeoutMs(params.pollIntervalMs, 1); const deadlineAtMs = params.deadline.deadlineAtMs; if (typeof deadlineAtMs !== "number") { - await new Promise((resolve) => setTimeout(resolve, pollIntervalMs)); + await new Promise((resolve) => { + setTimeout(resolve, pollIntervalMs); + }); return; } const remainingMs = deadlineAtMs - Date.now(); if (remainingMs <= 0) { throw new Error(`${params.deadline.label} timed out after ${params.deadline.timeoutMs}ms`); } - await new Promise((resolve) => setTimeout(resolve, Math.min(pollIntervalMs, remainingMs))); + await new Promise((resolve) => { + setTimeout(resolve, Math.min(pollIntervalMs, remainingMs)); + }); } export async function pollProviderOperationJson( diff --git a/src/media/input-files.fetch-guard.test.ts b/src/media/input-files.fetch-guard.test.ts index 74bccf608c8..df02e7d203a 100644 --- a/src/media/input-files.fetch-guard.test.ts +++ b/src/media/input-files.fetch-guard.test.ts @@ -17,7 +17,9 @@ vi.mock("@openclaw/media-core/mime", () => ({ })); async function waitForMicrotaskTurn(): Promise { - await new Promise((resolve) => queueMicrotask(resolve)); + await new Promise((resolve) => { + queueMicrotask(resolve); + }); } let fetchWithGuard: typeof import("./input-files.js").fetchWithGuard; diff --git a/src/plugin-sdk/keyed-async-queue.test.ts b/src/plugin-sdk/keyed-async-queue.test.ts index bb0d3d13d02..9630d6ba684 100644 --- a/src/plugin-sdk/keyed-async-queue.test.ts +++ b/src/plugin-sdk/keyed-async-queue.test.ts @@ -100,7 +100,9 @@ describe("enqueueKeyedTask", () => { }), ).rejects.toThrow("boom"); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(unhandled).toStrictEqual([]); } finally { process.off("unhandledRejection", onUnhandledRejection); diff --git a/src/plugin-sdk/provider-stream-shared.test.ts b/src/plugin-sdk/provider-stream-shared.test.ts index b96c7769828..83879ec2a7f 100644 --- a/src/plugin-sdk/provider-stream-shared.test.ts +++ b/src/plugin-sdk/provider-stream-shared.test.ts @@ -54,7 +54,9 @@ async function resolveStream(stream: ReturnType) { async function nextEvent(iterator: AsyncIterator, label: string): Promise { const result = await Promise.race([ iterator.next(), - new Promise<"timed out">((resolve) => setTimeout(() => resolve("timed out"), 50)), + new Promise<"timed out">((resolve) => { + setTimeout(() => resolve("timed out"), 50); + }), ]); if (result === "timed out") { throw new Error(`timed out waiting for ${label}`); diff --git a/src/plugin-sdk/provider-stream.test.ts b/src/plugin-sdk/provider-stream.test.ts index 9faeb0531ca..eb5b697af19 100644 --- a/src/plugin-sdk/provider-stream.test.ts +++ b/src/plugin-sdk/provider-stream.test.ts @@ -370,7 +370,9 @@ describe("createPlainTextToolCallCompatWrapper", () => { const firstResult = await Promise.race([ first, - new Promise<"timeout">((resolve) => setTimeout(() => resolve("timeout"), 20)), + new Promise<"timeout">((resolve) => { + setTimeout(() => resolve("timeout"), 20); + }), ]); expect(firstResult).not.toBe("timeout"); expect(firstResult).toMatchObject({ diff --git a/src/plugin-sdk/test-helpers/http-test-server.ts b/src/plugin-sdk/test-helpers/http-test-server.ts index 18493e885de..4bbaf09b8fb 100644 --- a/src/plugin-sdk/test-helpers/http-test-server.ts +++ b/src/plugin-sdk/test-helpers/http-test-server.ts @@ -13,6 +13,8 @@ export async function withServer(handler: RequestListener, fn: (baseUrl: string) try { await fn(`http://127.0.0.1:${address.port}`); } finally { - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } } diff --git a/src/plugin-sdk/test-helpers/stt-live-audio.ts b/src/plugin-sdk/test-helpers/stt-live-audio.ts index a9161206de3..a88942b68e4 100644 --- a/src/plugin-sdk/test-helpers/stt-live-audio.ts +++ b/src/plugin-sdk/test-helpers/stt-live-audio.ts @@ -29,7 +29,9 @@ export async function waitForLiveExpectation(expectation: () => void, timeoutMs return; } catch (error) { lastError = error; - await new Promise((resolve) => setTimeout(resolve, 100)); + await new Promise((resolve) => { + setTimeout(resolve, 100); + }); } } throw lastError; @@ -86,7 +88,9 @@ export async function streamAudioForLiveTest(params: { const delayMs = params.delayMs ?? 5; for (let offset = 0; offset < params.audio.byteLength; offset += chunkSize) { params.sendAudio(params.audio.subarray(offset, offset + chunkSize)); - await new Promise((resolve) => setTimeout(resolve, delayMs)); + await new Promise((resolve) => { + setTimeout(resolve, delayMs); + }); } } diff --git a/src/plugins/contracts/host-hooks.contract.test.ts b/src/plugins/contracts/host-hooks.contract.test.ts index f337a0b9baf..08d521e1784 100644 --- a/src/plugins/contracts/host-hooks.contract.test.ts +++ b/src/plugins/contracts/host-hooks.contract.test.ts @@ -45,7 +45,9 @@ import { runTrustedToolPolicies } from "../trusted-tool-policy.js"; import { registerHostHookFixture, registerTrustedHostHookFixture } from "./host-hook-fixture.js"; async function waitForPluginEventHandlers(): Promise { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } function requireFirstCommandRegistration( diff --git a/src/plugins/contracts/run-context-lifecycle.contract.test.ts b/src/plugins/contracts/run-context-lifecycle.contract.test.ts index ddfa06aa6eb..3cda39be396 100644 --- a/src/plugins/contracts/run-context-lifecycle.contract.test.ts +++ b/src/plugins/contracts/run-context-lifecycle.contract.test.ts @@ -26,7 +26,9 @@ import { createPluginRecord } from "../status.test-helpers.js"; import type { OpenClawPluginApi } from "../types.js"; async function waitForPluginEventHandlers(): Promise { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } function expectNoCleanupFailures(result: Awaited>): void { @@ -754,7 +756,7 @@ describe("plugin run context lifecycle", () => { it("rejects hung cleanup hooks with a bounded timeout", async () => { vi.useFakeTimers(); const cleanup = vi.fn(async () => { - await new Promise(() => undefined); + await new Promise(() => {}); }); registerPluginSessionSchedulerJob({ pluginId: "hung-cleanup-plugin", @@ -794,17 +796,17 @@ describe("plugin run context lifecycle", () => { api.registerSessionExtension({ namespace: "state", description: "hangs during cleanup", - cleanup: () => new Promise(() => undefined), + cleanup: () => new Promise(() => {}), }); api.registerRuntimeLifecycle({ id: "runtime-cleanup", - cleanup: () => new Promise(() => undefined), + cleanup: () => new Promise(() => {}), }); api.registerSessionSchedulerJob({ id: "scheduler-cleanup", sessionKey: "agent:main:main", kind: "monitor", - cleanup: () => new Promise(() => undefined), + cleanup: () => new Promise(() => {}), }); }, }); diff --git a/src/plugins/conversation-binding.test.ts b/src/plugins/conversation-binding.test.ts index 5041cafbe4e..1c45c392415 100644 --- a/src/plugins/conversation-binding.test.ts +++ b/src/plugins/conversation-binding.test.ts @@ -307,7 +307,9 @@ async function requestResolvedBinding(input: PluginBindingRequestInput) { } async function flushMicrotasks(): Promise { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } function createDeferredVoid(): { promise: Promise; resolve: () => void } { diff --git a/src/plugins/hooks.model-override-wiring.test.ts b/src/plugins/hooks.model-override-wiring.test.ts index 6f00c67e24d..6b227192b3c 100644 --- a/src/plugins/hooks.model-override-wiring.test.ts +++ b/src/plugins/hooks.model-override-wiring.test.ts @@ -235,7 +235,7 @@ describe("model override pipeline wiring", () => { addBeforePromptBuildHook( registry, "slow-plugin", - () => new Promise(() => undefined), + () => new Promise(() => {}), 10, ); addBeforePromptBuildHook(registry, "fast-plugin", () => ({ prependContext: "fast" }), 1); @@ -272,7 +272,9 @@ describe("model override pipeline wiring", () => { registry, "active-memory", async () => { - await new Promise((resolve) => setTimeout(resolve, 20)); + await new Promise((resolve) => { + setTimeout(resolve, 20); + }); return { prependContext: "memory context" }; }, 10, diff --git a/src/plugins/install.npm-spec.e2e.test.ts b/src/plugins/install.npm-spec.e2e.test.ts index c56d726429b..44955e17d14 100644 --- a/src/plugins/install.npm-spec.e2e.test.ts +++ b/src/plugins/install.npm-spec.e2e.test.ts @@ -30,7 +30,9 @@ const execFileAsync = promisify(execFile); afterEach(async () => { for (const server of servers.splice(0)) { - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + server.close(() => resolve()); + }); } for (const key of envKeys) { const original = originalEnv[key]; @@ -217,7 +219,9 @@ async function startStaticRegistry( response.end(`not found: ${url.pathname}`); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); servers.push(server); return `http://127.0.0.1:${(server.address() as { port: number }).port}`; } @@ -296,7 +300,9 @@ async function startMutableRegistry(params: { response.end(`not found: ${url.pathname}`); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); servers.push(server); return `http://127.0.0.1:${(server.address() as { port: number }).port}`; } diff --git a/src/proxy-capture/proxy-server.managed-proxy.test.ts b/src/proxy-capture/proxy-server.managed-proxy.test.ts index 7dabfb79690..a170c6f6746 100644 --- a/src/proxy-capture/proxy-server.managed-proxy.test.ts +++ b/src/proxy-capture/proxy-server.managed-proxy.test.ts @@ -47,7 +47,9 @@ async function connectThroughProxy(proxyUrl: string): Promise { socket.connect(Number(target.port), target.hostname, resolve); }); socket.write("CONNECT example.com:443 HTTP/1.1\r\nHost: example.com:443\r\n\r\n"); - await new Promise((resolve) => socket.once("end", resolve)); + await new Promise((resolve) => { + socket.once("end", resolve); + }); socket.destroy(); return data; } @@ -66,7 +68,9 @@ async function requestThroughProxy(proxyUrl: string, targetUrl: string): Promise socket.connect(Number(proxy.port), proxy.hostname, resolve); }); socket.write(`GET ${target.href} HTTP/1.1\r\nHost: ${target.host}\r\nConnection: close\r\n\r\n`); - await new Promise((resolve) => socket.once("end", resolve)); + await new Promise((resolve) => { + socket.once("end", resolve); + }); socket.destroy(); return data; } @@ -84,7 +88,9 @@ async function requestRawThroughProxy(proxyUrl: string, request: string): Promis socket.connect(Number(proxy.port), proxy.hostname, resolve); }); socket.write(request); - await new Promise((resolve) => socket.once("end", resolve)); + await new Promise((resolve) => { + socket.once("end", resolve); + }); socket.destroy(); return data; } diff --git a/src/proxy-capture/runtime.test.ts b/src/proxy-capture/runtime.test.ts index 106fce2a6cc..166ffa1cc2e 100644 --- a/src/proxy-capture/runtime.test.ts +++ b/src/proxy-capture/runtime.test.ts @@ -69,7 +69,9 @@ describe("debug proxy runtime", () => { headers: { "content-type": "application/json" }, body: '{"input":"hello"}', }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); finalizeDebugProxyCapture(settings, deps); const sessionEvents = events.filter((event) => event.sessionId === "runtime-test-session"); @@ -102,7 +104,9 @@ describe("debug proxy runtime", () => { headers, body: "{}", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); finalizeDebugProxyCapture(settings, deps); const request = events.find((event) => event.kind === "request"); @@ -137,7 +141,9 @@ describe("debug proxy runtime", () => { settings, deps, ); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); finalizeDebugProxyCapture(settings, deps); const request = events.find((event) => event.kind === "request"); diff --git a/src/realtime-transcription/websocket-session.test.ts b/src/realtime-transcription/websocket-session.test.ts index 12a0516f7ca..42b9bd3c4f4 100644 --- a/src/realtime-transcription/websocket-session.test.ts +++ b/src/realtime-transcription/websocket-session.test.ts @@ -59,13 +59,19 @@ async function createRealtimeServer(params?: { }); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); cleanup = async () => { for (const ws of clients) { ws.terminate(); } - await new Promise((resolve) => wss.close(() => resolve())); - await new Promise((resolve) => server.close(() => resolve())); + await new Promise((resolve) => { + wss.close(() => resolve()); + }); + await new Promise((resolve) => { + server.close(() => resolve()); + }); }; const port = (server.address() as AddressInfo).port; return { url: `ws://127.0.0.1:${port}` }; diff --git a/src/realtime-transcription/websocket-session.ts b/src/realtime-transcription/websocket-session.ts index 57f5e67a1c9..082da5215b9 100644 --- a/src/realtime-transcription/websocket-session.ts +++ b/src/realtime-transcription/websocket-session.ts @@ -350,7 +350,9 @@ class WebSocketRealtimeTranscriptionSession implements RealtimeTranscript const delay = this.reconnectDelayMs * 2 ** (this.reconnectAttempts - 1); this.reconnecting = true; try { - await new Promise((resolve) => setTimeout(resolve, delay)); + await new Promise((resolve) => { + setTimeout(resolve, delay); + }); if (!this.closed) { await this.doConnect(); } diff --git a/src/security/audit-sandbox-browser.test.ts b/src/security/audit-sandbox-browser.test.ts index a33cf28afc6..0fec86f0c3f 100644 --- a/src/security/audit-sandbox-browser.test.ts +++ b/src/security/audit-sandbox-browser.test.ts @@ -105,11 +105,11 @@ describe("security audit sandbox browser findings", () => { execDockerRawFn: async (_args, opts) => { probeSignal = opts?.signal; markProbeStarted(); - return await new Promise((_, reject) => + return await new Promise((_, reject) => { opts?.signal?.addEventListener("abort", () => reject(new Error("aborted")), { once: true, - }), - ); + }); + }); }, }); await probeStarted; @@ -146,11 +146,11 @@ describe("security audit sandbox browser findings", () => { }; } markHungProbeStarted(); - return await new Promise((_, reject) => + return await new Promise((_, reject) => { opts?.signal?.addEventListener("abort", () => reject(new Error("aborted")), { once: true, - }), - ); + }); + }); }, }); await hungProbeStarted; diff --git a/src/skills/lifecycle/upload-store.test.ts b/src/skills/lifecycle/upload-store.test.ts index a87a64e2cae..74fc61784c3 100644 --- a/src/skills/lifecycle/upload-store.test.ts +++ b/src/skills/lifecycle/upload-store.test.ts @@ -420,7 +420,9 @@ describe("skill upload store", () => { slug: "sweep-trigger", sizeBytes: 1, }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect((await fs.stat(path.join(rootDir, committed.uploadId))).isDirectory()).toBe(true); release.resolve(); @@ -467,7 +469,9 @@ describe("skill upload store", () => { sizeBytes: archive.length, idempotencyKey: "same-upload", }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect((await fs.stat(path.join(rootDir, committed.uploadId))).isDirectory()).toBe(true); release.resolve(); diff --git a/src/talk/diagnostics.test.ts b/src/talk/diagnostics.test.ts index 1ea6c6aeb52..a039cc293d8 100644 --- a/src/talk/diagnostics.test.ts +++ b/src/talk/diagnostics.test.ts @@ -54,7 +54,9 @@ describe("talk diagnostics", () => { }); recordTalkDiagnosticEvent(talkEvent); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(diagnostics).toHaveLength(1); const [diagnostic] = diagnostics; diff --git a/src/talk/logging.test.ts b/src/talk/logging.test.ts index 98427cbaa00..cecde1531fd 100644 --- a/src/talk/logging.test.ts +++ b/src/talk/logging.test.ts @@ -13,7 +13,9 @@ import { recordTalkObservabilityEvent } from "./observability.js"; import { createTalkEventSequencer } from "./talk-events.js"; function flushDiagnosticEvents() { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } type ObservedDiagnostic = { event: DiagnosticEventPayload; trusted: boolean }; diff --git a/src/tasks/task-registry.maintenance.ts b/src/tasks/task-registry.maintenance.ts index bc8b4eaf3b8..dbdf417e005 100644 --- a/src/tasks/task-registry.maintenance.ts +++ b/src/tasks/task-registry.maintenance.ts @@ -1068,7 +1068,9 @@ export function getTaskRegistryMaintenanceDiagnostics(): TaskRegistryMaintenance * synchronous task-registry maintenance work. */ function yieldToEventLoop(): Promise { - return new Promise((resolve) => setImmediate(resolve)); + return new Promise((resolve) => { + setImmediate(resolve); + }); } function startScheduledSweep() { diff --git a/src/tui/gateway-chat.ts b/src/tui/gateway-chat.ts index 0f01db83f7c..1f82ef5e1e6 100644 --- a/src/tui/gateway-chat.ts +++ b/src/tui/gateway-chat.ts @@ -94,7 +94,9 @@ function resolveStartupRetryDelayMs(err: GatewayClientRequestError): number { } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } export type GatewaySessionList = TuiSessionList; diff --git a/src/tui/tui-command-handlers.test.ts b/src/tui/tui-command-handlers.test.ts index 847a963db1e..9528505c761 100644 --- a/src/tui/tui-command-handlers.test.ts +++ b/src/tui/tui-command-handlers.test.ts @@ -20,7 +20,9 @@ type ConsumeCompletedRunMock = ReturnType & ((runId: string) => bo type FlushPendingHistoryRefreshMock = ReturnType & (() => void); async function flushAsyncSelect() { - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); } function expectSendChatFields( diff --git a/src/tui/tui-pty-test-support.ts b/src/tui/tui-pty-test-support.ts index e3d207ff78d..e7d8f975298 100644 --- a/src/tui/tui-pty-test-support.ts +++ b/src/tui/tui-pty-test-support.ts @@ -48,7 +48,9 @@ export function waitFor(params: { } export function sleep(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } function resolveSpawnPty() { diff --git a/src/tui/tui-session-actions.test.ts b/src/tui/tui-session-actions.test.ts index 5f59fc0412a..a420d91d694 100644 --- a/src/tui/tui-session-actions.test.ts +++ b/src/tui/tui-session-actions.test.ts @@ -95,7 +95,9 @@ describe("tui session actions", () => { const first = refreshSessionInfo(); const second = refreshSessionInfo(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(listSessions).toHaveBeenCalledTimes(1); expect(listSessions).toHaveBeenNthCalledWith(1, { limit: TUI_SESSION_LOOKUP_LIMIT, @@ -119,7 +121,9 @@ describe("tui session actions", () => { ], }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(listSessions).toHaveBeenCalledTimes(2); @@ -171,14 +175,18 @@ describe("tui session actions", () => { const second = refreshSessionInfo(); const third = refreshSessionInfo(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(listSessions).toHaveBeenCalledTimes(1); resolveFirst?.({ defaults: {}, sessions: [{ key: "agent:main:main", updatedAt: 1 }], }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(listSessions).toHaveBeenCalledTimes(2); resolveSecond?.({ diff --git a/src/utils.ts b/src/utils.ts index 58ad998156a..65e19241762 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -63,7 +63,9 @@ export function normalizeE164(number: string): string { /** Promise-based sleep that clamps timer inputs through the shared timeout resolver. */ export function sleep(ms: number) { - return new Promise((resolve) => setTimeout(resolve, resolveTimerTimeoutMs(ms, 0, 0))); + return new Promise((resolve) => { + setTimeout(resolve, resolveTimerTimeoutMs(ms, 0, 0)); + }); } function isHighSurrogate(codeUnit: number): boolean { diff --git a/test/helpers/openclaw-test-instance.ts b/test/helpers/openclaw-test-instance.ts index 90843ca6c15..16d0a893295 100644 --- a/test/helpers/openclaw-test-instance.ts +++ b/test/helpers/openclaw-test-instance.ts @@ -191,13 +191,17 @@ async function resolveGatewayEntrypoint(cwd: string): Promise { const getFreePort = async () => { const srv = net.createServer(); - await new Promise((resolve) => srv.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + srv.listen(0, "127.0.0.1", resolve); + }); const addr = srv.address(); if (!addr || typeof addr === "string") { srv.close(); throw new Error("failed to bind ephemeral port"); } - await new Promise((resolve) => srv.close(() => resolve())); + await new Promise((resolve) => { + srv.close(() => resolve()); + }); return addr.port; }; @@ -249,7 +253,8 @@ async function waitForGatewayExit( return await Promise.race([ new Promise((resolve) => { if (child.exitCode !== null || child.signalCode !== null) { - return resolve(true); + resolve(true); + return; } child.once("exit", () => resolve(true)); }), diff --git a/test/openclaw-launcher.e2e.test.ts b/test/openclaw-launcher.e2e.test.ts index 24bfed6ca01..35f80254b7a 100644 --- a/test/openclaw-launcher.e2e.test.ts +++ b/test/openclaw-launcher.e2e.test.ts @@ -65,7 +65,9 @@ async function waitForJsonFile(filePath: string, timeoutMs: number): Promise< return JSON.parse(await fs.readFile(filePath, "utf8")) as T; } catch (error) { lastError = error; - await new Promise((resolve) => setTimeout(resolve, 25)); + await new Promise((resolve) => { + setTimeout(resolve, 25); + }); } } throw new Error(`timed out waiting for parseable JSON in ${filePath}`, { cause: lastError }); diff --git a/test/scripts/e2e-websocket-open.test.ts b/test/scripts/e2e-websocket-open.test.ts index f2ad7ec1c00..fc666b97c33 100644 --- a/test/scripts/e2e-websocket-open.test.ts +++ b/test/scripts/e2e-websocket-open.test.ts @@ -28,7 +28,9 @@ describe("E2E WebSocket open guard", () => { } finally { clearTimeout(keepAlive); } - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(ws.terminated).toBe(true); expect(ws.listenerCount("open")).toBe(0); diff --git a/test/scripts/kitchen-sink-rpc-walk.test.ts b/test/scripts/kitchen-sink-rpc-walk.test.ts index 2b72251f3fa..9d040c0eb48 100644 --- a/test/scripts/kitchen-sink-rpc-walk.test.ts +++ b/test/scripts/kitchen-sink-rpc-walk.test.ts @@ -779,7 +779,7 @@ describe("kitchen-sink RPC process sampling", () => { const fetchImpl = vi.fn().mockResolvedValue({ ok: true, status: 200, - text: () => new Promise(() => undefined), + text: () => new Promise(() => {}), }); const result = fetchJson("http://127.0.0.1:19680/readyz", { diff --git a/test/scripts/mcp-connect-timeout.test.ts b/test/scripts/mcp-connect-timeout.test.ts index ba8eb77338b..db71bcef454 100644 --- a/test/scripts/mcp-connect-timeout.test.ts +++ b/test/scripts/mcp-connect-timeout.test.ts @@ -23,7 +23,7 @@ describe("MCP stdio connect timeout", () => { it("closes the transport when MCP initialize hangs", async () => { vi.useFakeTimers(); const client = { - connect: vi.fn(() => new Promise(() => undefined)), + connect: vi.fn(() => new Promise(() => {})), }; const transport = { close: vi.fn(), @@ -41,7 +41,7 @@ describe("MCP stdio connect timeout", () => { vi.useFakeTimers(); let closeSettled = false; const client = { - connect: vi.fn(() => new Promise(() => undefined)), + connect: vi.fn(() => new Promise(() => {})), }; const transport = { close: vi.fn( @@ -70,7 +70,7 @@ describe("MCP stdio connect timeout", () => { it("keeps the original timeout error when cleanup rejects", async () => { vi.useFakeTimers(); const client = { - connect: vi.fn(() => new Promise(() => undefined)), + connect: vi.fn(() => new Promise(() => {})), }; const transport = { close: vi.fn(async () => { diff --git a/test/scripts/mcp-websocket-open.test.ts b/test/scripts/mcp-websocket-open.test.ts index 2cf46048851..61d93fa36ad 100644 --- a/test/scripts/mcp-websocket-open.test.ts +++ b/test/scripts/mcp-websocket-open.test.ts @@ -33,7 +33,9 @@ describe("mcp channel WebSocket open guard", () => { } finally { clearTimeout(keepAlive); } - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(ws.terminated).toBe(true); expect(ws.listenerCount("open")).toBe(0); diff --git a/test/scripts/openclaw-cross-os-release-checks.test.ts b/test/scripts/openclaw-cross-os-release-checks.test.ts index e4f9006737f..73748343b39 100644 --- a/test/scripts/openclaw-cross-os-release-checks.test.ts +++ b/test/scripts/openclaw-cross-os-release-checks.test.ts @@ -731,7 +731,9 @@ describe("scripts/openclaw-cross-os-release-checks", () => { }), ]); await Promise.race([ - new Promise((resolve) => socket.once("close", resolve)), + new Promise((resolve) => { + socket.once("close", resolve); + }), delay(1_000).then(() => { throw new Error("socket close timed out"); }), diff --git a/test/scripts/package-openclaw-for-docker.test.ts b/test/scripts/package-openclaw-for-docker.test.ts index 061891852c7..302849ab629 100644 --- a/test/scripts/package-openclaw-for-docker.test.ts +++ b/test/scripts/package-openclaw-for-docker.test.ts @@ -20,7 +20,9 @@ function isProcessAlive(pid: number): boolean { } async function sleep(ms: number): Promise { - await new Promise((resolve) => setTimeout(resolve, ms)); + await new Promise((resolve) => { + setTimeout(resolve, ms); + }); } async function waitForFile(filePath: string, timeoutMs: number): Promise { diff --git a/test/scripts/parallels-smoke-model.test.ts b/test/scripts/parallels-smoke-model.test.ts index dfb7935d2f0..b95558214ad 100644 --- a/test/scripts/parallels-smoke-model.test.ts +++ b/test/scripts/parallels-smoke-model.test.ts @@ -105,11 +105,13 @@ function withEnv(env: Record, callback: () => T): T { async function unusedLoopbackPort(): Promise { const server = createServer(); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); const address = server.address(); - await new Promise((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ); + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); if (!address || typeof address === "string") { throw new Error("Expected TCP server address."); } diff --git a/test/scripts/parallels-update-job-timeout.test.ts b/test/scripts/parallels-update-job-timeout.test.ts index 3750ffc7893..81744011e0b 100644 --- a/test/scripts/parallels-update-job-timeout.test.ts +++ b/test/scripts/parallels-update-job-timeout.test.ts @@ -54,7 +54,10 @@ describe("Parallels update job timeout", () => { const result = runTimedUpdateJob({ append: (chunk) => chunks.push(chunk), label: "macOS", - run: () => new Promise((resolve) => setTimeout(resolve, 1000)), + run: () => + new Promise((resolve) => { + setTimeout(resolve, 1000); + }), timeoutDescription: "1s plus cleanup backstop", timeoutMs: 1200, writeLog, @@ -74,7 +77,7 @@ describe("Parallels update job timeout", () => { const result = runTimedUpdateJob({ append: (chunk) => chunks.push(chunk), label: "Windows", - run: () => new Promise(() => undefined), + run: () => new Promise(() => {}), timeoutDescription: "1s", timeoutMs: 1000, writeLog, diff --git a/test/scripts/plugin-gateway-gauntlet.test.ts b/test/scripts/plugin-gateway-gauntlet.test.ts index ab3be745da5..e6048de4608 100644 --- a/test/scripts/plugin-gateway-gauntlet.test.ts +++ b/test/scripts/plugin-gateway-gauntlet.test.ts @@ -568,7 +568,9 @@ describe("plugin gateway gauntlet helpers", () => { expect(row.spawnError?.code).toBe("ETIMEDOUT"); expect(row.wallMs).toBeLessThan(5_000); const afterReturn = await fs.readFile(markerPath, "utf8"); - await new Promise((resolve) => setTimeout(resolve, 250)); + await new Promise((resolve) => { + setTimeout(resolve, 250); + }); await expect(fs.readFile(markerPath, "utf8")).resolves.toBe(afterReturn); }); diff --git a/test/scripts/release-user-journey-assertions.test.ts b/test/scripts/release-user-journey-assertions.test.ts index a2e52e59412..d869e553301 100644 --- a/test/scripts/release-user-journey-assertions.test.ts +++ b/test/scripts/release-user-journey-assertions.test.ts @@ -60,7 +60,9 @@ async function startTcpFixtureServer(handler: (socket: Socket) => void): Promise socket.on("error", () => undefined); socket.on("close", () => sockets.delete(socket)); }); - await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + await new Promise((resolve) => { + server.listen(0, "127.0.0.1", resolve); + }); const address = server.address() as AddressInfo; return { port: address.port, @@ -68,9 +70,9 @@ async function startTcpFixtureServer(handler: (socket: Socket) => void): Promise for (const socket of sockets) { socket.destroy(); } - await new Promise((resolve, reject) => - server.close((error) => (error ? reject(error) : resolve())), - ); + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }); }, }; } diff --git a/test/scripts/source-file-scan-cache.test.ts b/test/scripts/source-file-scan-cache.test.ts index 25f70a59934..5e09916a414 100644 --- a/test/scripts/source-file-scan-cache.test.ts +++ b/test/scripts/source-file-scan-cache.test.ts @@ -33,7 +33,9 @@ describe("source file scan cache", () => { const readFile = async (filePath: string) => { activeReads += 1; maxActiveReads = Math.max(maxActiveReads, activeReads); - await new Promise((resolve) => setTimeout(resolve, 10)); + await new Promise((resolve) => { + setTimeout(resolve, 10); + }); activeReads -= 1; return `content:${path.basename(filePath)}`; }; diff --git a/test/scripts/test-extension.test.ts b/test/scripts/test-extension.test.ts index 002380e6063..bf7df0c3d00 100644 --- a/test/scripts/test-extension.test.ts +++ b/test/scripts/test-extension.test.ts @@ -576,7 +576,9 @@ describe("scripts/test-extension.mjs", () => { await Promise.resolve(); expect(started).toEqual(["heavy", "middle"]); resolvers.shift()?.(); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(started).toEqual(["heavy", "middle", "light"]); while (resolvers.length > 0) { resolvers.shift()?.(); diff --git a/test/scripts/write-cli-startup-metadata.test.ts b/test/scripts/write-cli-startup-metadata.test.ts index afa083f4a27..a0bdcf279d3 100644 --- a/test/scripts/write-cli-startup-metadata.test.ts +++ b/test/scripts/write-cli-startup-metadata.test.ts @@ -56,7 +56,9 @@ describe("write-cli-startup-metadata", () => { const result = await __testing.mapWithConcurrency([1, 2, 3, 4, 5], 2, async (value) => { active += 1; peakActive = Math.max(peakActive, active); - await new Promise((resolve) => setTimeout(resolve, 1)); + await new Promise((resolve) => { + setTimeout(resolve, 1); + }); active -= 1; return `rendered-${value}`; }); diff --git a/ui/src/ui/app-chat.test.ts b/ui/src/ui/app-chat.test.ts index 76d70129b57..38faf85485e 100644 --- a/ui/src/ui/app-chat.test.ts +++ b/ui/src/ui/app-chat.test.ts @@ -224,7 +224,7 @@ describe("refreshChat", () => { }); it("dispatches chat refresh work without waiting for slow history or metadata RPCs", async () => { - const request = vi.fn(() => new Promise(() => undefined)); + const request = vi.fn(() => new Promise(() => {})); const requestUpdate = vi.fn(); const host = makeHost({ client: { request } as unknown as ChatHost["client"], @@ -269,7 +269,7 @@ describe("refreshChat", () => { }); it("scopes global chat refresh session rows to the selected agent", async () => { - const request = vi.fn(() => new Promise(() => undefined)); + const request = vi.fn(() => new Promise(() => {})); const host = makeHost({ client: { request } as unknown as ChatHost["client"], sessionKey: "global", @@ -303,7 +303,7 @@ describe("refreshChat", () => { }); it("scopes agent main aliases as selected global chat refreshes", async () => { - const request = vi.fn(() => new Promise(() => undefined)); + const request = vi.fn(() => new Promise(() => {})); const host = makeHost({ client: { request } as unknown as ChatHost["client"], sessionKey: "agent:work:main", @@ -329,7 +329,7 @@ describe("refreshChat", () => { }); it("scopes agent session refresh rows before the list limit", async () => { - const request = vi.fn(() => new Promise(() => undefined)); + const request = vi.fn(() => new Promise(() => {})); const host = makeHost({ client: { request } as unknown as ChatHost["client"], sessionKey: "agent:work:dashboard", @@ -351,7 +351,7 @@ describe("refreshChat", () => { }); it("uses hello default for global chat refresh before agents list loads", async () => { - const request = vi.fn(() => new Promise(() => undefined)); + const request = vi.fn(() => new Promise(() => {})); const host = makeHost({ client: { request } as unknown as ChatHost["client"], sessionKey: "global", @@ -381,7 +381,7 @@ describe("refreshChat", () => { }); it("keeps unknown chat refresh session rows unscoped", async () => { - const request = vi.fn(() => new Promise(() => undefined)); + const request = vi.fn(() => new Promise(() => {})); const host = makeHost({ client: { request } as unknown as ChatHost["client"], sessionKey: "unknown", @@ -413,7 +413,7 @@ describe("refreshChat", () => { if (method === "chat.history") { return history.promise; } - return new Promise(() => undefined); + return new Promise(() => {}); }); const host = makeHost({ client: { request } as unknown as ChatHost["client"], @@ -457,7 +457,9 @@ describe("refreshChat", () => { }); await refreshChat(host, { scheduleScroll: false }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(request).toHaveBeenCalledWith( "chat.send", @@ -487,7 +489,9 @@ describe("refreshChat", () => { }); await refreshChat(host, { scheduleScroll: false }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(request).not.toHaveBeenCalledWith("chat.send", expect.anything()); expect(host.chatQueue).toEqual(restoredQueue); @@ -513,7 +517,9 @@ describe("refreshChat", () => { }); await refreshChat(host, { scheduleScroll: false }); - await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => { + setImmediate(resolve); + }); expect(request).not.toHaveBeenCalledWith("chat.send", expect.anything()); expect(host.chatQueue).toEqual(restoredQueue); @@ -862,7 +868,7 @@ describe("refreshChat", () => { it("does not wait for secondary chat metadata refreshes before showing history", async () => { const previousFetch = globalThis.fetch; - globalThis.fetch = vi.fn(() => new Promise(() => undefined)) as never; + globalThis.fetch = vi.fn(() => new Promise(() => {})) as never; try { const request = vi.fn((method: string) => { if (method === "chat.history") { @@ -870,7 +876,7 @@ describe("refreshChat", () => { messages: [{ role: "assistant", content: [{ type: "text", text: "ready" }] }], }); } - return new Promise(() => undefined); + return new Promise(() => {}); }); const host = makeHost({ client: { request } as unknown as ChatHost["client"], diff --git a/ui/src/ui/app-gateway.node.test.ts b/ui/src/ui/app-gateway.node.test.ts index 45d8f5a4745..88125bfd8e3 100644 --- a/ui/src/ui/app-gateway.node.test.ts +++ b/ui/src/ui/app-gateway.node.test.ts @@ -191,7 +191,7 @@ function createHost(): TestGatewayHost { execApprovalBusy: false, execApprovalError: null, updateAvailable: null, - updateComplete: new Promise(() => undefined), + updateComplete: new Promise(() => {}), } as unknown as TestGatewayHost; } diff --git a/ui/src/ui/app-settings.refresh-active-tab.node.test.ts b/ui/src/ui/app-settings.refresh-active-tab.node.test.ts index ba12866cdd2..cd26b9b4c0e 100644 --- a/ui/src/ui/app-settings.refresh-active-tab.node.test.ts +++ b/ui/src/ui/app-settings.refresh-active-tab.node.test.ts @@ -382,7 +382,7 @@ describe("refreshActiveTab", () => { it("does not wait for secondary overview refreshes before resolving", async () => { const host = createHost(); host.tab = "overview"; - mocks.loadUsageMock.mockReturnValueOnce(new Promise(() => undefined)); + mocks.loadUsageMock.mockReturnValueOnce(new Promise(() => {})); const refresh = refreshActiveTab(host as never); const outcome = await raceWithNextMacrotask(refresh); @@ -518,7 +518,7 @@ describe("refreshActiveTab", () => { it("does not wait for cron runs before resolving the cron tab refresh", async () => { const host = createHost(); host.tab = "cron"; - mocks.loadCronRunsMock.mockReturnValueOnce(new Promise<"ok">(() => undefined)); + mocks.loadCronRunsMock.mockReturnValueOnce(new Promise<"ok">(() => {})); const refresh = refreshActiveTab(host as never); const outcome = await raceWithNextMacrotask(refresh); diff --git a/ui/src/ui/controllers/channels.ts b/ui/src/ui/controllers/channels.ts index 6f6f506d873..5d146ba0a9e 100644 --- a/ui/src/ui/controllers/channels.ts +++ b/ui/src/ui/controllers/channels.ts @@ -12,7 +12,9 @@ type LoadChannelsOptions = { }; function delay(ms: number): Promise<"timeout"> { - return new Promise((resolve) => setTimeout(() => resolve("timeout"), ms)); + return new Promise((resolve) => { + setTimeout(() => resolve("timeout"), ms); + }); } export async function loadChannels( diff --git a/ui/src/ui/controllers/chat.ts b/ui/src/ui/controllers/chat.ts index 8e2ab6f0195..4fe247db71d 100644 --- a/ui/src/ui/controllers/chat.ts +++ b/ui/src/ui/controllers/chat.ts @@ -268,7 +268,9 @@ function resolveStartupRetryDelayMs(err: GatewayRequestError): number { } function sleep(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); } export type ChatState = { diff --git a/ui/src/ui/e2e/chat-flow.e2e.test.ts b/ui/src/ui/e2e/chat-flow.e2e.test.ts index 927d5dabe88..5aa3c96d9e2 100644 --- a/ui/src/ui/e2e/chat-flow.e2e.test.ts +++ b/ui/src/ui/e2e/chat-flow.e2e.test.ts @@ -41,7 +41,9 @@ async function waitForRequests( if (requests.length >= count) { return requests; } - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => { + setTimeout(resolve, 50); + }); } throw new Error(`Timed out waiting for ${count} ${method} requests`); } diff --git a/ui/src/ui/e2e/chat-picker-pagination.e2e.test.ts b/ui/src/ui/e2e/chat-picker-pagination.e2e.test.ts index 6a6107de253..79c42ae6b33 100644 --- a/ui/src/ui/e2e/chat-picker-pagination.e2e.test.ts +++ b/ui/src/ui/e2e/chat-picker-pagination.e2e.test.ts @@ -78,7 +78,9 @@ async function waitForSessionsRequest( if (match) { return match; } - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => { + setTimeout(resolve, 50); + }); } throw new Error(`No matching sessions.list request found: ${JSON.stringify(requests)}`); } diff --git a/ui/src/ui/e2e/cron-filters.e2e.test.ts b/ui/src/ui/e2e/cron-filters.e2e.test.ts index 315aba32a14..cc382130152 100644 --- a/ui/src/ui/e2e/cron-filters.e2e.test.ts +++ b/ui/src/ui/e2e/cron-filters.e2e.test.ts @@ -66,7 +66,9 @@ async function waitForCronListRequest( if (match) { return match; } - await new Promise((resolve) => setTimeout(resolve, 50)); + await new Promise((resolve) => { + setTimeout(resolve, 50); + }); } throw new Error(`No matching cron.list request found: ${JSON.stringify(requests)}`); } diff --git a/ui/src/ui/push-subscription.ts b/ui/src/ui/push-subscription.ts index f7df74b8351..17dec2dfeff 100644 --- a/ui/src/ui/push-subscription.ts +++ b/ui/src/ui/push-subscription.ts @@ -17,9 +17,9 @@ const SW_READY_TIMEOUT = 10_000; function swReady(): Promise { return Promise.race([ navigator.serviceWorker.ready, - new Promise((_, reject) => - setTimeout(() => reject(new Error("Service worker not ready (timed out)")), SW_READY_TIMEOUT), - ), + new Promise((_, reject) => { + setTimeout(() => reject(new Error("Service worker not ready (timed out)")), SW_READY_TIMEOUT); + }), ]); } diff --git a/ui/src/ui/realtime-talk-consult.test.ts b/ui/src/ui/realtime-talk-consult.test.ts index 68afe2af205..f3def4987c1 100644 --- a/ui/src/ui/realtime-talk-consult.test.ts +++ b/ui/src/ui/realtime-talk-consult.test.ts @@ -154,7 +154,7 @@ describe("RealtimeTalkSession consult handoff", () => { return { runId: "run-1" }; } if (method === "agent.wait") { - return new Promise(() => undefined); + return new Promise(() => {}); } throw new Error(`unexpected request: ${method}`); }); diff --git a/ui/src/ui/realtime-talk-webrtc.test.ts b/ui/src/ui/realtime-talk-webrtc.test.ts index b392cdc5d41..ef27b7fac62 100644 --- a/ui/src/ui/realtime-talk-webrtc.test.ts +++ b/ui/src/ui/realtime-talk-webrtc.test.ts @@ -642,7 +642,9 @@ describe("WebRtcSdpRealtimeTalkTransport", () => { }), ); - await new Promise((resolve) => setTimeout(resolve, 0)); + await new Promise((resolve) => { + setTimeout(resolve, 0); + }); expect(request).not.toHaveBeenCalledWith("talk.client.steer", expect.any(Object)); transport.stop(); }); diff --git a/ui/src/ui/test-helpers/app-mount.ts b/ui/src/ui/test-helpers/app-mount.ts index 7e93a3beb03..820197166cc 100644 --- a/ui/src/ui/test-helpers/app-mount.ts +++ b/ui/src/ui/test-helpers/app-mount.ts @@ -56,7 +56,9 @@ function nextMicrotask() { } function nextTimer() { - return new Promise((resolve) => window.setTimeout(resolve, 0)); + return new Promise((resolve) => { + window.setTimeout(resolve, 0); + }); } function nextFrame() { @@ -149,10 +151,7 @@ export function registerAppMountHooks() { document.body.innerHTML = ""; await i18n.setLocale("en"); vi.stubGlobal("WebSocket", MockWebSocket as unknown as typeof WebSocket); - vi.stubGlobal( - "fetch", - vi.fn(() => new Promise(() => undefined)) as unknown as typeof fetch, - ); + vi.stubGlobal("fetch", vi.fn(() => new Promise(() => {})) as unknown as typeof fetch); }); afterEach(async () => { diff --git a/ui/src/ui/views/agents-panels-tools-skills.browser.test.ts b/ui/src/ui/views/agents-panels-tools-skills.browser.test.ts index 9abaca7b1e0..66db3f1f2bd 100644 --- a/ui/src/ui/views/agents-panels-tools-skills.browser.test.ts +++ b/ui/src/ui/views/agents-panels-tools-skills.browser.test.ts @@ -411,7 +411,9 @@ describe("agents tools panel (browser)", () => { expect(tool.open).toBe(false); chip.click(); - await new Promise((resolve) => requestAnimationFrame(resolve)); + await new Promise((resolve) => { + requestAnimationFrame(resolve); + }); expect(group.open).toBe(true); expect(tool.open).toBe(true);