From 3d6f90cb536ec30ff5091e1cbe3b1e619a93e1b0 Mon Sep 17 00:00:00 2001
From: Kit Langton <kit.langton@gmail.com>
Date: Wed, 15 Apr 2026 20:45:19 -0400
Subject: feat: add oxlint with correctness defaults (#22682)

---
 packages/app/src/context/layout.tsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'packages/app/src/context/layout.tsx')

diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx
index bab3d39f3..87f11d2b6 100644
--- a/packages/app/src/context/layout.tsx
+++ b/packages/app/src/context/layout.tsx
@@ -344,7 +344,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
           return
         }
 
-        setStore("sessionView", sessionKey, "scroll", (prev) => ({ ...(prev ?? {}), ...next }))
+        setStore("sessionView", sessionKey, "scroll", (prev) => ({ ...prev, ...next }))
         prune(keep)
       },
     })
@@ -399,7 +399,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
         local?.icon?.color !== undefined
 
       const base = {
-        ...(metadata ?? {}),
+        ...metadata,
         ...project,
         icon: {
           url: metadata?.icon?.url,
-- 
cgit v1.2.3


From 80f1f1b5b8535b6008af54621665738115346cde Mon Sep 17 00:00:00 2001
From: Kit Langton <kit.langton@gmail.com>
Date: Wed, 15 Apr 2026 23:27:32 -0400
Subject: feat: enable type-aware no-floating-promises rule, fix all 177
 violations (#22741)

---
 .oxlintrc.json                                       |  8 +++++++-
 bun.lock                                             | 15 +++++++++++++++
 github/index.ts                                      |  2 +-
 package.json                                         |  1 +
 packages/app/src/app.tsx                             |  4 ++--
 .../app/src/components/dialog-connect-provider.tsx   |  4 ++--
 packages/app/src/components/dialog-select-file.tsx   |  4 ++--
 packages/app/src/components/dialog-select-server.tsx |  6 +++---
 packages/app/src/components/prompt-input.tsx         | 10 +++++-----
 packages/app/src/components/prompt-input/submit.ts   |  2 +-
 .../app/src/components/session-context-usage.tsx     |  2 +-
 .../session/session-sortable-terminal-tab.tsx        |  2 +-
 packages/app/src/components/terminal.tsx             |  2 +-
 packages/app/src/context/global-sync.tsx             | 10 +++++-----
 packages/app/src/context/layout.tsx                  |  2 +-
 packages/app/src/context/terminal.tsx                |  4 ++--
 packages/app/src/pages/layout.tsx                    | 20 ++++++++++----------
 packages/app/src/pages/layout/sidebar-workspace.tsx  |  2 +-
 packages/app/src/pages/session.tsx                   |  2 +-
 packages/app/src/pages/session/helpers.ts            |  2 +-
 packages/console/app/script/generate-sitemap.ts      |  2 +-
 packages/console/app/src/component/spotlight.tsx     |  2 +-
 .../app/src/routes/black/subscribe/[plan].tsx        |  2 +-
 packages/console/app/src/routes/download/index.tsx   |  2 +-
 packages/console/app/src/routes/index.tsx            |  2 +-
 packages/console/app/src/routes/temp.tsx             |  2 +-
 .../console/app/src/routes/zen/util/dataDumper.ts    |  4 ++--
 packages/desktop/src/entry.tsx                       |  4 ++--
 packages/desktop/src/index.tsx                       |  2 +-
 packages/desktop/src/loading.tsx                     |  2 +-
 packages/desktop/src/menu.ts                         |  2 +-
 packages/desktop/src/webview-zoom.ts                 |  2 +-
 packages/enterprise/test-debug.ts                    |  2 +-
 packages/opencode/script/postinstall.mjs             |  2 +-
 packages/opencode/src/acp/agent.ts                   |  4 ++--
 packages/opencode/src/cli/cmd/tui/app.tsx            |  6 +++---
 .../cli/cmd/tui/component/dialog-session-list.tsx    |  2 +-
 .../cli/cmd/tui/component/dialog-session-rename.tsx  |  2 +-
 .../src/cli/cmd/tui/component/error-component.tsx    |  4 ++--
 .../src/cli/cmd/tui/component/prompt/index.tsx       | 16 ++++++++--------
 packages/opencode/src/cli/cmd/tui/context/kv.tsx     |  2 +-
 packages/opencode/src/cli/cmd/tui/context/local.tsx  |  2 +-
 packages/opencode/src/cli/cmd/tui/context/sync.tsx   |  6 +++---
 packages/opencode/src/cli/cmd/tui/context/theme.tsx  |  4 ++--
 .../cli/cmd/tui/feature-plugins/system/plugins.tsx   |  4 ++--
 .../cli/cmd/tui/routes/session/dialog-message.tsx    |  2 +-
 .../src/cli/cmd/tui/routes/session/index.tsx         | 14 +++++++-------
 .../src/cli/cmd/tui/routes/session/permission.tsx    |  8 ++++----
 .../src/cli/cmd/tui/routes/session/question.tsx      |  6 +++---
 packages/opencode/src/config/config.ts               |  6 +++---
 packages/opencode/src/control-plane/workspace.ts     |  6 +++---
 packages/opencode/src/file/watcher.ts                |  6 +++---
 packages/opencode/src/lsp/client.ts                  |  2 +-
 packages/opencode/src/lsp/index.ts                   |  4 ++--
 packages/opencode/src/plugin/plugin.ts               |  2 +-
 packages/opencode/src/provider/models.ts             |  2 +-
 packages/opencode/src/server/instance/session.ts     | 18 ++++++++++--------
 packages/opencode/src/server/proxy.ts                |  2 +-
 packages/opencode/src/storage/db.ts                  |  6 +++---
 packages/opencode/src/sync/sync-event.ts             |  6 +++---
 packages/opencode/src/util/defer.ts                  |  2 +-
 packages/opencode/src/util/log.ts                    |  2 +-
 .../opencode/test/cli/tui/plugin-lifecycle.test.ts   |  2 +-
 packages/opencode/test/mcp/headers.test.ts           |  4 ++--
 packages/opencode/test/mcp/lifecycle.test.ts         | 10 +++++-----
 .../opencode/test/mcp/oauth-auto-connect.test.ts     |  8 ++++----
 packages/opencode/test/mcp/oauth-browser.test.ts     | 10 +++++-----
 packages/opencode/test/memory/abort-leak-webfetch.ts |  2 +-
 packages/opencode/test/permission/next.test.ts       |  2 +-
 packages/opencode/test/preload.ts                    |  2 +-
 .../opencode/test/project/migrate-global.test.ts     |  2 +-
 packages/opencode/test/project/project.test.ts       |  2 +-
 .../opencode/test/server/global-session-list.test.ts |  2 +-
 .../opencode/test/server/project-init-git.test.ts    |  2 +-
 .../opencode/test/server/session-actions.test.ts     |  2 +-
 packages/opencode/test/server/session-list.test.ts   |  2 +-
 .../opencode/test/server/session-messages.test.ts    |  2 +-
 packages/opencode/test/server/session-select.test.ts |  2 +-
 packages/opencode/test/session/compaction.test.ts    |  2 +-
 packages/opencode/test/session/llm.test.ts           |  2 +-
 .../test/session/messages-pagination.test.ts         |  2 +-
 .../opencode/test/session/processor-effect.test.ts   |  2 +-
 packages/opencode/test/session/prompt-effect.test.ts |  2 +-
 packages/opencode/test/session/prompt.test.ts        |  6 +++---
 .../opencode/test/session/revert-compact.test.ts     |  2 +-
 packages/opencode/test/session/session.test.ts       |  2 +-
 .../opencode/test/session/snapshot-tool-race.test.ts |  2 +-
 .../session/structured-output-integration.test.ts    |  2 +-
 packages/opencode/test/skill/discovery.test.ts       |  2 +-
 packages/sdk/js/src/gen/core/serverSentEvents.gen.ts |  2 +-
 .../sdk/js/src/v2/gen/core/serverSentEvents.gen.ts   |  2 +-
 packages/slack/src/index.ts                          |  4 ++--
 packages/ui/src/components/basic-tool.tsx            |  2 +-
 packages/ui/src/components/list.tsx                  |  2 +-
 packages/ui/src/components/message-part.tsx          |  2 +-
 packages/ui/src/components/text-field.tsx            |  5 +++--
 packages/ui/src/components/text-reveal.tsx           |  2 +-
 .../ui/src/components/thinking-heading.stories.tsx   |  2 +-
 packages/ui/src/components/tool-error-card.tsx       |  2 +-
 packages/ui/src/components/tool-status-title.tsx     |  2 +-
 packages/ui/src/pierre/worker.ts                     |  2 +-
 packages/ui/vite.config.ts                           |  4 ++--
 script/duplicate-pr.ts                               |  2 +-
 103 files changed, 212 insertions(+), 187 deletions(-)

(limited to 'packages/app/src/context/layout.tsx')

diff --git a/.oxlintrc.json b/.oxlintrc.json
index 37d91f425..e16c8408d 100644
--- a/.oxlintrc.json
+++ b/.oxlintrc.json
@@ -30,7 +30,13 @@
     // postMessage target origin not relevant for this codebase
     "unicorn/require-post-message-target-origin": "off",
     // Side-effectful constructors are intentional in some places
-    "no-new": "off"
+    "no-new": "off",
+
+    // Type-aware: catch unhandled promises
+    "typescript/no-floating-promises": "warn"
+  },
+  "options": {
+    "typeAware": true
   },
   "ignorePatterns": ["**/node_modules", "**/dist", "**/.build", "**/.sst", "**/*.d.ts"]
 }
diff --git a/bun.lock b/bun.lock
index 705181160..a011a648f 100644
--- a/bun.lock
+++ b/bun.lock
@@ -20,6 +20,7 @@
         "glob": "13.0.5",
         "husky": "9.1.7",
         "oxlint": "1.60.0",
+        "oxlint-tsgolint": "0.21.0",
         "prettier": "3.6.2",
         "semver": "^7.6.0",
         "sst": "3.18.10",
@@ -1680,6 +1681,18 @@
 
     "@oxc-transform/binding-win32-x64-msvc": ["@oxc-transform/binding-win32-x64-msvc@0.96.0", "", { "os": "win32", "cpu": "x64" }, "sha512-0fI0P0W7bSO/GCP/N5dkmtB9vBqCA4ggo1WmXTnxNJVmFFOtcA1vYm1I9jl8fxo+sucW2WnlpnI4fjKdo3JKxA=="],
 
+    "@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.21.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-P20j3MLqfwIT+94qGU3htC7dWp4pXGZW1p1p7FRUzu1aopq7c9nPCgf0W/WjktqQ57+iuTq9mbSlwWinl6+H1A=="],
+
+    "@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.21.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-81TmmuBcPedEA0MwRmObuQuXnCprS1UiHQWGe7pseqNAJzUWXeAPrayqKTACX92VpruJI+yvY0XJrFp11PpcTA=="],
+
+    "@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.21.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-sbjBr6zDduX8rNO0PTjhf7VYLCPWqdijWiMPp8e10qu6Tam1GdaVLaLlX8QrNupTgglO1GvqqgY/jcacWL8a6g=="],
+
+    "@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.21.0", "", { "os": "linux", "cpu": "x64" }, "sha512-jNrOcy53R5TJQfrK444Cm60bW9437xDoxPbm3AdvFSo/fhdFMllawc7uZC2Wzr+EAjTkW13K8R4QHzsUdBG9fQ=="],
+
+    "@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.21.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-xWeRxJJILDE4b9UqHEWGBxcBc1TUS6zWHhxcyxTZMwf4q3wdKeu0OHYAcwLGJzoSjEIf6FTjyfPiRNil2oqsdg=="],
+
+    "@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.21.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Ob9AA9teI8ckPo1whV1smLr5NrqwgBv/8boDbK0YZG+fKgNGRwr1hBj1ORgFWOQaUBv+5njp5A0RAfJJjQ95QQ=="],
+
     "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.60.0", "", { "os": "android", "cpu": "arm" }, "sha512-YdeJKaZckDQL1qa62a1aKq/goyq48aX3yOxaaWqWb4sau4Ee4IiLbamftNLU3zbePky6QsDj6thnSSzHRBjDfA=="],
 
     "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.60.0", "", { "os": "android", "cpu": "arm64" }, "sha512-7ANS7PpXCfq84xZQ8E5WPs14gwcuPcl+/8TFNXfpSu0CQBXz3cUo2fDpHT8v8HJN+Ut02eacvMAzTnc9s6X4tw=="],
@@ -4100,6 +4113,8 @@
 
     "oxlint": ["oxlint@1.60.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.60.0", "@oxlint/binding-android-arm64": "1.60.0", "@oxlint/binding-darwin-arm64": "1.60.0", "@oxlint/binding-darwin-x64": "1.60.0", "@oxlint/binding-freebsd-x64": "1.60.0", "@oxlint/binding-linux-arm-gnueabihf": "1.60.0", "@oxlint/binding-linux-arm-musleabihf": "1.60.0", "@oxlint/binding-linux-arm64-gnu": "1.60.0", "@oxlint/binding-linux-arm64-musl": "1.60.0", "@oxlint/binding-linux-ppc64-gnu": "1.60.0", "@oxlint/binding-linux-riscv64-gnu": "1.60.0", "@oxlint/binding-linux-riscv64-musl": "1.60.0", "@oxlint/binding-linux-s390x-gnu": "1.60.0", "@oxlint/binding-linux-x64-gnu": "1.60.0", "@oxlint/binding-linux-x64-musl": "1.60.0", "@oxlint/binding-openharmony-arm64": "1.60.0", "@oxlint/binding-win32-arm64-msvc": "1.60.0", "@oxlint/binding-win32-ia32-msvc": "1.60.0", "@oxlint/binding-win32-x64-msvc": "1.60.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.18.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-tnRzTWiWJ9pg3ftRWnD0+Oqh78L6ZSwcEudvCZaER0PIqiAnNyXj5N1dPwjmNpDalkKS9m/WMLN1CTPUBPmsgw=="],
 
+    "oxlint-tsgolint": ["oxlint-tsgolint@0.21.0", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.21.0", "@oxlint-tsgolint/darwin-x64": "0.21.0", "@oxlint-tsgolint/linux-arm64": "0.21.0", "@oxlint-tsgolint/linux-x64": "0.21.0", "@oxlint-tsgolint/win32-arm64": "0.21.0", "@oxlint-tsgolint/win32-x64": "0.21.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-HiWPhANwRnN1pZJQ2SgNB3WRR+1etLJHmRzQ/MJhyINsEIaOUCjxhlXJKbEaVUwdnyXwRWqo/P9Fx21lz0/mSg=="],
+
     "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="],
 
     "p-defer": ["p-defer@3.0.0", "", {}, "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw=="],
diff --git a/github/index.ts b/github/index.ts
index 4463aa200..51ee2a46a 100644
--- a/github/index.ts
+++ b/github/index.ts
@@ -513,7 +513,7 @@ async function subscribeSessionEvents() {
   const decoder = new TextDecoder()
 
   let text = ""
-  ;(async () => {
+  void (async () => {
     while (true) {
       try {
         const { done, value } = await reader.read()
diff --git a/package.json b/package.json
index 8c5ae9195..5fecc0992 100644
--- a/package.json
+++ b/package.json
@@ -87,6 +87,7 @@
     "glob": "13.0.5",
     "husky": "9.1.7",
     "oxlint": "1.60.0",
+    "oxlint-tsgolint": "0.21.0",
     "prettier": "3.6.2",
     "semver": "^7.6.0",
     "sst": "3.18.10",
diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx
index 9983548ba..a2a746c05 100644
--- a/packages/app/src/app.tsx
+++ b/packages/app/src/app.tsx
@@ -197,12 +197,12 @@ function ConnectionGate(props: ParentProps<{ disableHealthCheck?: boolean }>) {
         fallback={
           <ConnectionError
             onRetry={() => {
-              if (checkMode() === "background") healthCheckActions.refetch()
+              if (checkMode() === "background") void healthCheckActions.refetch()
             }}
             onServerSelected={(key) => {
               setCheckMode("blocking")
               server.setActive(key)
-              healthCheckActions.refetch()
+              void healthCheckActions.refetch()
             }}
           />
         }
diff --git a/packages/app/src/components/dialog-connect-provider.tsx b/packages/app/src/components/dialog-connect-provider.tsx
index 41225d02a..e30574379 100644
--- a/packages/app/src/components/dialog-connect-provider.tsx
+++ b/packages/app/src/components/dialog-connect-provider.tsx
@@ -327,7 +327,7 @@ export function DialogConnectProvider(props: { provider: string }) {
     if (loading()) return
     if (methods().length === 1) {
       auto = true
-      selectMethod(0)
+      void selectMethod(0)
     }
   })
 
@@ -373,7 +373,7 @@ export function DialogConnectProvider(props: { provider: string }) {
             key={(m) => m?.label}
             onSelect={async (selected, index) => {
               if (!selected) return
-              selectMethod(index)
+              void selectMethod(index)
             }}
           >
             {(i) => (
diff --git a/packages/app/src/components/dialog-select-file.tsx b/packages/app/src/components/dialog-select-file.tsx
index a0347a039..186906f92 100644
--- a/packages/app/src/components/dialog-select-file.tsx
+++ b/packages/app/src/components/dialog-select-file.tsx
@@ -348,8 +348,8 @@ export function DialogSelectFile(props: { mode?: DialogSelectFileMode; onOpenFil
 
   const open = (path: string) => {
     const value = file.tab(path)
-    tabs().open(value)
-    file.load(path)
+    void tabs().open(value)
+    void file.load(path)
     if (!view().reviewPanel.opened()) view().reviewPanel.open()
     layout.fileTree.setTab("all")
     props.onOpenFile?.(path)
diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx
index ca4c42a37..dd92edec3 100644
--- a/packages/app/src/components/dialog-select-server.tsx
+++ b/packages/app/src/components/dialog-select-server.tsx
@@ -344,7 +344,7 @@ export function DialogSelectServer() {
 
   createEffect(() => {
     items()
-    refreshHealth()
+    void refreshHealth()
     const interval = setInterval(refreshHealth, 10_000)
     onCleanup(() => clearInterval(interval))
   })
@@ -498,7 +498,7 @@ export function DialogSelectServer() {
   async function handleRemove(url: ServerConnection.Key) {
     server.remove(url)
     if ((await platform.getDefaultServer?.()) === url) {
-      platform.setDefaultServer?.(null)
+      void platform.setDefaultServer?.(null)
     }
   }
 
@@ -536,7 +536,7 @@ export function DialogSelectServer() {
             items={sortedItems}
             key={(x) => x.http.url}
             onSelect={(x) => {
-              if (x) select(x)
+              if (x) void select(x)
             }}
             divider={true}
             class="px-5 [&_[data-slot=list-search-wrapper]]:w-full [&_[data-slot=list-scroll]]h-[300px] [&_[data-slot=list-scroll]]:overflow-y-auto [&_[data-slot=list-items]]:bg-surface-base [&_[data-slot=list-items]]:rounded-md [&_[data-slot=list-item]]:min-h-14 [&_[data-slot=list-item]]:p-3 [&_[data-slot=list-item]]:!bg-transparent"
diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx
index 8ddb10a90..534215022 100644
--- a/packages/app/src/components/prompt-input.tsx
+++ b/packages/app/src/components/prompt-input.tsx
@@ -212,9 +212,9 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
     if (!view().reviewPanel.opened()) view().reviewPanel.open()
     layout.fileTree.setTab("all")
     const tab = files.tab(item.path)
-    tabs().open(tab)
+    void tabs().open(tab)
     tabs().setActive(tab)
-    Promise.resolve(files.load(item.path)).finally(() => queueCommentFocus())
+    void Promise.resolve(files.load(item.path)).finally(() => queueCommentFocus())
   }
 
   const recent = createMemo(() => {
@@ -1139,7 +1139,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
       }
 
       if (working()) {
-        abort()
+        void abort()
         event.preventDefault()
         event.stopPropagation()
         return
@@ -1205,7 +1205,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
         return
       }
       if (working()) {
-        abort()
+        void abort()
         event.preventDefault()
       }
       return
@@ -1245,7 +1245,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
       ) {
         return
       }
-      handleSubmit(event)
+      void handleSubmit(event)
     }
   }
 
diff --git a/packages/app/src/components/prompt-input/submit.ts b/packages/app/src/components/prompt-input/submit.ts
index 27e898043..6805f619c 100644
--- a/packages/app/src/components/prompt-input/submit.ts
+++ b/packages/app/src/components/prompt-input/submit.ts
@@ -295,7 +295,7 @@ export function createPromptSubmit(input: PromptSubmitInput) {
     const mode = input.mode()
 
     if (text.trim().length === 0 && images.length === 0 && input.commentCount() === 0) {
-      if (input.working()) abort()
+      if (input.working()) void abort()
       return
     }
 
diff --git a/packages/app/src/components/session-context-usage.tsx b/packages/app/src/components/session-context-usage.tsx
index d7c249ab0..6b7fe4ef7 100644
--- a/packages/app/src/components/session-context-usage.tsx
+++ b/packages/app/src/components/session-context-usage.tsx
@@ -24,7 +24,7 @@ function openSessionContext(args: {
 }) {
   if (!args.view.reviewPanel.opened()) args.view.reviewPanel.open()
   if (args.layout.fileTree.opened() && args.layout.fileTree.tab() !== "all") args.layout.fileTree.setTab("all")
-  args.tabs.open("context")
+  void args.tabs.open("context")
   args.tabs.setActive("context")
 }
 
diff --git a/packages/app/src/components/session/session-sortable-terminal-tab.tsx b/packages/app/src/components/session/session-sortable-terminal-tab.tsx
index ba697f91a..2d88ed180 100644
--- a/packages/app/src/components/session/session-sortable-terminal-tab.tsx
+++ b/packages/app/src/components/session/session-sortable-terminal-tab.tsx
@@ -44,7 +44,7 @@ export function SortableTerminalTab(props: { terminal: LocalPTY; onClose?: () =>
 
   const close = () => {
     const count = terminal.all().length
-    terminal.close(props.terminal.id)
+    void terminal.close(props.terminal.id)
     if (count === 1) {
       props.onClose?.()
     }
diff --git a/packages/app/src/components/terminal.tsx b/packages/app/src/components/terminal.tsx
index 9b7ef83b2..db7d53f2b 100644
--- a/packages/app/src/components/terminal.tsx
+++ b/packages/app/src/components/terminal.tsx
@@ -415,7 +415,7 @@ export const Terminal = (props: TerminalProps) => {
       if (local.autoFocus !== false) focusTerminal()
 
       if (typeof document !== "undefined" && document.fonts) {
-        document.fonts.ready.then(scheduleFit)
+        void document.fonts.ready.then(scheduleFit)
       }
 
       const onResize = t.onResize((size) => {
diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx
index fe5f2f130..57b76a96f 100644
--- a/packages/app/src/context/global-sync.tsx
+++ b/packages/app/src/context/global-sync.tsx
@@ -237,7 +237,7 @@ function createGlobalSync() {
       })
 
     sessionLoads.set(directory, promise)
-    promise.finally(() => {
+    void promise.finally(() => {
       sessionLoads.delete(directory)
       children.unpin(directory)
     })
@@ -273,7 +273,7 @@ function createGlobalSync() {
     })()
 
     booting.set(directory, promise)
-    promise.finally(() => {
+    void promise.finally(() => {
       booting.delete(directory)
       children.unpin(directory)
     })
@@ -317,7 +317,7 @@ function createGlobalSync() {
       setSessionTodo,
       vcsCache: children.vcsCache.get(directory),
       loadLsp: () => {
-        sdkFor(directory)
+        void sdkFor(directory)
           .lsp.status()
           .then((x) => {
             setStore("lsp", x.data ?? [])
@@ -359,13 +359,13 @@ function createGlobalSync() {
         eventFrame = undefined
         eventTimer = setTimeout(() => {
           eventTimer = undefined
-          globalSDK.event.start()
+          void globalSDK.event.start()
         }, 0)
       })
     } else {
       eventTimer = setTimeout(() => {
         eventTimer = undefined
-        globalSDK.event.start()
+        void globalSDK.event.start()
       }, 0)
     }
     void bootstrap()
diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx
index 87f11d2b6..74ea28531 100644
--- a/packages/app/src/context/layout.tsx
+++ b/packages/app/src/context/layout.tsx
@@ -582,7 +582,7 @@ export const { use: useLayout, provider: LayoutProvider } = createSimpleContext(
         open(directory: string) {
           const root = rootFor(directory)
           if (server.projects.list().find((x) => x.worktree === root)) return
-          globalSync.project.loadSessions(root)
+          void globalSync.project.loadSessions(root)
           server.projects.open(root)
         },
         close(directory: string) {
diff --git a/packages/app/src/context/terminal.tsx b/packages/app/src/context/terminal.tsx
index 17355aab9..31d2d6e04 100644
--- a/packages/app/src/context/terminal.tsx
+++ b/packages/app/src/context/terminal.tsx
@@ -117,7 +117,7 @@ export function clearWorkspaceTerminals(dir: string, sessionIDs?: string[], plat
     entry?.value.clear()
   }
 
-  removePersisted(Persist.workspace(dir, "terminal"), platform)
+  void removePersisted(Persist.workspace(dir, "terminal"), platform)
 
   const legacy = new Set(getLegacyTerminalStorageKeys(dir))
   for (const id of sessionIDs ?? []) {
@@ -126,7 +126,7 @@ export function clearWorkspaceTerminals(dir: string, sessionIDs?: string[], plat
     }
   }
   for (const key of legacy) {
-    removePersisted({ key }, platform)
+    void removePersisted({ key }, platform)
   }
 }
 
diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx
index 3ba2659a3..8fad0bafe 100644
--- a/packages/app/src/pages/layout.tsx
+++ b/packages/app/src/pages/layout.tsx
@@ -956,7 +956,7 @@ export default function Layout(props: ParentProps) {
 
     // warm up child store to prevent flicker
     globalSync.child(target.worktree)
-    openProject(target.worktree)
+    void openProject(target.worktree)
   }
 
   function navigateSessionByUnseen(offset: number) {
@@ -1094,7 +1094,7 @@ export default function Layout(props: ParentProps) {
         disabled: !params.dir || !params.id,
         onSelect: () => {
           const session = currentSessions().find((s) => s.id === params.id)
-          if (session) archiveSession(session)
+          if (session) void archiveSession(session)
         },
       },
       {
@@ -1360,11 +1360,11 @@ export default function Layout(props: ParentProps) {
     if (!server.isLocal()) return
 
     for (const directory of collectOpenProjectDeepLinks(urls)) {
-      openProject(directory)
+      void openProject(directory)
     }
 
     for (const link of collectNewSessionDeepLinks(urls)) {
-      openProject(link.directory, false)
+      void openProject(link.directory, false)
       const slug = base64Encode(link.directory)
       if (link.prompt) {
         setSessionHandoff(slug, { prompt: link.prompt })
@@ -1453,11 +1453,11 @@ export default function Layout(props: ParentProps) {
     function resolve(result: string | string[] | null) {
       if (Array.isArray(result)) {
         for (const directory of result) {
-          openProject(directory, false)
+          void openProject(directory, false)
         }
-        navigateToProject(result[0])
+        void navigateToProject(result[0])
       } else if (result) {
-        openProject(result)
+        void openProject(result)
       }
     }
 
@@ -1825,7 +1825,7 @@ export default function Layout(props: ParentProps) {
         const next = new Set(dirs)
         for (const directory of next) {
           if (loadedSessionDirs.has(directory)) continue
-          globalSync.project.loadSessions(directory)
+          void globalSync.project.loadSessions(directory)
         }
 
         loadedSessionDirs.clear()
@@ -2110,7 +2110,7 @@ export default function Layout(props: ParentProps) {
                     onSave={(next) => {
                       const item = project()
                       if (!item) return
-                      renameProject(item, next)
+                      void renameProject(item, next)
                     }}
                     class="text-14-medium text-text-strong truncate"
                     displayClass="text-14-medium text-text-strong truncate"
@@ -2242,7 +2242,7 @@ export default function Layout(props: ParentProps) {
                       onClick={() => {
                         const item = project()
                         if (!item) return
-                        createWorkspace(item)
+                        void createWorkspace(item)
                       }}
                     >
                       {language.t("workspace.new")}
diff --git a/packages/app/src/pages/layout/sidebar-workspace.tsx b/packages/app/src/pages/layout/sidebar-workspace.tsx
index 9e0069147..9d74651b9 100644
--- a/packages/app/src/pages/layout/sidebar-workspace.tsx
+++ b/packages/app/src/pages/layout/sidebar-workspace.tsx
@@ -277,7 +277,7 @@ const WorkspaceSessionList = (props: {
           class="flex w-full text-left justify-start text-14-regular text-text-weak pl-2 pr-10"
           size="large"
           onClick={(e: MouseEvent) => {
-            props.loadMore()
+            void props.loadMore()
             ;(e.currentTarget as HTMLButtonElement).blur()
           }}
         >
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index 32df997f7..c63bbc4f9 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -484,7 +484,7 @@ export default function Page() {
     if (!tab) return
 
     const path = file.pathFromTab(tab)
-    if (path) file.load(path)
+    if (path) void file.load(path)
   })
 
   createEffect(
diff --git a/packages/app/src/pages/session/helpers.ts b/packages/app/src/pages/session/helpers.ts
index f3215f685..e136ba999 100644
--- a/packages/app/src/pages/session/helpers.ts
+++ b/packages/app/src/pages/session/helpers.ts
@@ -117,7 +117,7 @@ export const createOpenReviewFile = (input: {
         input.openTab(tab)
         input.setActive(tab)
       }
-      if (maybePromise instanceof Promise) maybePromise.then(open)
+      if (maybePromise instanceof Promise) void maybePromise.then(open)
       else open()
     })
   }
diff --git a/packages/console/app/script/generate-sitemap.ts b/packages/console/app/script/generate-sitemap.ts
index 9fd3ba0f0..1cf64d6e8 100755
--- a/packages/console/app/script/generate-sitemap.ts
+++ b/packages/console/app/script/generate-sitemap.ts
@@ -105,4 +105,4 @@ async function main() {
   console.log(`✓ Sitemap generated at ${outputPath}`)
 }
 
-main()
+void main()
diff --git a/packages/console/app/src/component/spotlight.tsx b/packages/console/app/src/component/spotlight.tsx
index 704306990..19accb88a 100644
--- a/packages/console/app/src/component/spotlight.tsx
+++ b/packages/console/app/src/component/spotlight.tsx
@@ -766,7 +766,7 @@ export default function Spotlight(props: SpotlightProps) {
       }
     }
 
-    initializeWebGPU()
+    void initializeWebGPU()
 
     onCleanup(() => {
       if (cleanupFunctionRef) {
diff --git a/packages/console/app/src/routes/black/subscribe/[plan].tsx b/packages/console/app/src/routes/black/subscribe/[plan].tsx
index 19b56eabe..52e640876 100644
--- a/packages/console/app/src/routes/black/subscribe/[plan].tsx
+++ b/packages/console/app/src/routes/black/subscribe/[plan].tsx
@@ -298,7 +298,7 @@ export default function BlackSubscribe() {
 
   // Resolve stripe promise once
   createEffect(() => {
-    stripePromise.then((s) => {
+    void stripePromise.then((s) => {
       if (s) setStripe(s)
     })
   })
diff --git a/packages/console/app/src/routes/download/index.tsx b/packages/console/app/src/routes/download/index.tsx
index 0278d8622..b5c202a5e 100644
--- a/packages/console/app/src/routes/download/index.tsx
+++ b/packages/console/app/src/routes/download/index.tsx
@@ -77,7 +77,7 @@ export default function Download() {
 
   const handleCopyClick = (command: string) => (event: Event) => {
     const button = event.currentTarget as HTMLButtonElement
-    navigator.clipboard.writeText(command)
+    void navigator.clipboard.writeText(command)
     button.setAttribute("data-copied", "")
     setTimeout(() => {
       button.removeAttribute("data-copied")
diff --git a/packages/console/app/src/routes/index.tsx b/packages/console/app/src/routes/index.tsx
index b5b12a84b..ee40ded87 100644
--- a/packages/console/app/src/routes/index.tsx
+++ b/packages/console/app/src/routes/index.tsx
@@ -35,7 +35,7 @@ export default function Home() {
     const button = event.currentTarget as HTMLButtonElement
     const text = button.textContent
     if (text) {
-      navigator.clipboard.writeText(text)
+      void navigator.clipboard.writeText(text)
       button.setAttribute("data-copied", "")
       setTimeout(() => {
         button.removeAttribute("data-copied")
diff --git a/packages/console/app/src/routes/temp.tsx b/packages/console/app/src/routes/temp.tsx
index 4eed47857..6bbabc9ea 100644
--- a/packages/console/app/src/routes/temp.tsx
+++ b/packages/console/app/src/routes/temp.tsx
@@ -27,7 +27,7 @@ export default function Home() {
       const callback = () => {
         const text = button.textContent
         if (text) {
-          navigator.clipboard.writeText(text)
+          void navigator.clipboard.writeText(text)
           button.setAttribute("data-copied", "")
           setTimeout(() => {
             button.removeAttribute("data-copied")
diff --git a/packages/console/app/src/routes/zen/util/dataDumper.ts b/packages/console/app/src/routes/zen/util/dataDumper.ts
index b852ca0b5..bc88c3813 100644
--- a/packages/console/app/src/routes/zen/util/dataDumper.ts
+++ b/packages/console/app/src/routes/zen/util/dataDumper.ts
@@ -26,14 +26,14 @@ export function createDataDumper(sessionId: string, requestId: string, projectId
       const minute = timestamp.substring(10, 12)
       const second = timestamp.substring(12, 14)
 
-      waitUntil(
+      void waitUntil(
         Resource.ZenDataNew.put(
           `data/${data.modelName}/${year}/${month}/${day}/${hour}/${minute}/${second}/${requestId}.json`,
           JSON.stringify({ timestamp, ...data }),
         ),
       )
 
-      waitUntil(
+      void waitUntil(
         Resource.ZenDataNew.put(
           `meta/${data.modelName}/${sessionId}/${requestId}.json`,
           JSON.stringify({ timestamp, ...metadata }),
diff --git a/packages/desktop/src/entry.tsx b/packages/desktop/src/entry.tsx
index b1c9f13f9..0e43d85fa 100644
--- a/packages/desktop/src/entry.tsx
+++ b/packages/desktop/src/entry.tsx
@@ -1,5 +1,5 @@
 if (location.pathname === "/loading") {
-  import("./loading")
+  void import("./loading")
 } else {
-  import("./")
+  void import("./")
 }
diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx
index 5fe88d501..d6a0ad74f 100644
--- a/packages/desktop/src/index.tsx
+++ b/packages/desktop/src/index.tsx
@@ -410,7 +410,7 @@ const createPlatform = (): Platform => {
 }
 
 let menuTrigger = null as null | ((id: string) => void)
-createMenu((id) => {
+void createMenu((id) => {
   menuTrigger?.(id)
 })
 void listenForDeepLinks()
diff --git a/packages/desktop/src/loading.tsx b/packages/desktop/src/loading.tsx
index a02f1a95e..bcea016be 100644
--- a/packages/desktop/src/loading.tsx
+++ b/packages/desktop/src/loading.tsx
@@ -48,7 +48,7 @@ render(() => {
     })
 
     onCleanup(() => {
-      listener.then((cb) => cb())
+      void listener.then((cb) => cb())
       timers.forEach(clearTimeout)
     })
   })
diff --git a/packages/desktop/src/menu.ts b/packages/desktop/src/menu.ts
index 9005dd702..837c8c017 100644
--- a/packages/desktop/src/menu.ts
+++ b/packages/desktop/src/menu.ts
@@ -186,5 +186,5 @@ export async function createMenu(trigger: (id: string) => void) {
       }),
     ],
   })
-  menu.setAsAppMenu()
+  void menu.setAsAppMenu()
 }
diff --git a/packages/desktop/src/webview-zoom.ts b/packages/desktop/src/webview-zoom.ts
index 06f46a3af..46de208b0 100644
--- a/packages/desktop/src/webview-zoom.ts
+++ b/packages/desktop/src/webview-zoom.ts
@@ -17,7 +17,7 @@ const clamp = (value: number) => Math.min(Math.max(value, MIN_ZOOM_LEVEL), MAX_Z
 
 const applyZoom = (next: number) => {
   setWebviewZoom(next)
-  invoke("plugin:webview|set_webview_zoom", {
+  void invoke("plugin:webview|set_webview_zoom", {
     value: next,
   })
 }
diff --git a/packages/enterprise/test-debug.ts b/packages/enterprise/test-debug.ts
index a2ec4d8cd..28558dec1 100644
--- a/packages/enterprise/test-debug.ts
+++ b/packages/enterprise/test-debug.ts
@@ -37,4 +37,4 @@ async function test() {
   await Share.remove({ id: shareInfo.id, secret: shareInfo.secret })
 }
 
-test()
+void test()
diff --git a/packages/opencode/script/postinstall.mjs b/packages/opencode/script/postinstall.mjs
index 7dcf3958a..99f8bf432 100644
--- a/packages/opencode/script/postinstall.mjs
+++ b/packages/opencode/script/postinstall.mjs
@@ -112,7 +112,7 @@ async function main() {
 }
 
 try {
-  main()
+  void main()
 } catch (error) {
   console.error("Postinstall script error:", error.message)
   process.exit(0)
diff --git a/packages/opencode/src/acp/agent.ts b/packages/opencode/src/acp/agent.ts
index 669462772..57cce6668 100644
--- a/packages/opencode/src/acp/agent.ts
+++ b/packages/opencode/src/acp/agent.ts
@@ -242,7 +242,7 @@ export namespace ACP {
                 const newContent = getNewContent(content, diff)
 
                 if (newContent) {
-                  this.connection.writeTextFile({
+                  void this.connection.writeTextFile({
                     sessionId: session.id,
                     path: filepath,
                     content: newContent,
@@ -1253,7 +1253,7 @@ export namespace ACP {
       )
 
       setTimeout(() => {
-        this.connection.sessionUpdate({
+        void this.connection.sessionUpdate({
           sessionId,
           update: {
             sessionUpdate: "available_commands_update",
diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx
index 3d5350cb6..e7e9fd9cd 100644
--- a/packages/opencode/src/cli/cmd/tui/app.tsx
+++ b/packages/opencode/src/cli/cmd/tui/app.tsx
@@ -350,7 +350,7 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
     if (match) {
       continued = true
       if (args.fork) {
-        sdk.client.session.fork({ sessionID: match }).then((result) => {
+        void sdk.client.session.fork({ sessionID: match }).then((result) => {
           if (result.data?.id) {
             route.navigate({ type: "session", sessionID: result.data.id })
           } else {
@@ -370,7 +370,7 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
   createEffect(() => {
     if (forked || sync.status !== "complete" || !args.sessionID || !args.fork) return
     forked = true
-    sdk.client.session.fork({ sessionID: args.sessionID }).then((result) => {
+    void sdk.client.session.fork({ sessionID: args.sessionID }).then((result) => {
       if (result.data?.id) {
         route.navigate({ type: "session", sessionID: result.data.id })
       } else {
@@ -818,7 +818,7 @@ function App(props: { onSnapshot?: () => Promise<string[]> }) {
       `Successfully updated to OpenCode v${result.data.version}. Please restart the application.`,
     )
 
-    exit()
+    void exit()
   })
 
   const plugin = createMemo(() => {
diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx
index a42755bee..f58b73c9a 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx
@@ -145,7 +145,7 @@ export function DialogSessionList() {
           title: "delete",
           onTrigger: async (option) => {
             if (toDelete() === option.value) {
-              sdk.client.session.delete({
+              void sdk.client.session.delete({
                 sessionID: option.value,
               })
               setToDelete(undefined)
diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-session-rename.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-session-rename.tsx
index 141340d55..a079941c1 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-session-rename.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-session-rename.tsx
@@ -19,7 +19,7 @@ export function DialogSessionRename(props: DialogSessionRenameProps) {
       title="Rename Session"
       value={session()?.title}
       onConfirm={(value) => {
-        sdk.client.session.update({
+        void sdk.client.session.update({
           sessionID: props.session,
           title: value,
         })
diff --git a/packages/opencode/src/cli/cmd/tui/component/error-component.tsx b/packages/opencode/src/cli/cmd/tui/component/error-component.tsx
index b22163902..e8758b3d7 100644
--- a/packages/opencode/src/cli/cmd/tui/component/error-component.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/error-component.tsx
@@ -26,7 +26,7 @@ export function ErrorComponent(props: {
 
   useKeyboard((evt) => {
     if (evt.ctrl && evt.name === "c") {
-      handleExit()
+      void handleExit()
     }
   })
   const [copied, setCopied] = createSignal(false)
@@ -56,7 +56,7 @@ export function ErrorComponent(props: {
   issueURL.searchParams.set("opencode-version", Installation.VERSION)
 
   const copyIssueURL = () => {
-    Clipboard.copy(issueURL.toString()).then(() => {
+    void Clipboard.copy(issueURL.toString()).then(() => {
       setCopied(true)
     })
   }
diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
index c361e48c9..b80c32243 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
@@ -235,7 +235,7 @@ export function Prompt(props: PromptProps) {
         hidden: true,
         onSelect: (dialog) => {
           if (!input.focused) return
-          submit()
+          void submit()
           dialog.clear()
         },
       },
@@ -280,7 +280,7 @@ export function Prompt(props: PromptProps) {
           }, 5000)
 
           if (store.interrupt >= 2) {
-            sdk.client.session.abort({
+            void sdk.client.session.abort({
               sessionID: props.sessionID,
             })
             setStore("interrupt", 0)
@@ -429,7 +429,7 @@ export function Prompt(props: PromptProps) {
       setStore("extmarkToPartIndex", new Map())
     },
     submit() {
-      submit()
+      void submit()
     },
   }
 
@@ -604,12 +604,12 @@ export function Prompt(props: PromptProps) {
     if (!store.prompt.input) return
     const trimmed = store.prompt.input.trim()
     if (trimmed === "exit" || trimmed === "quit" || trimmed === ":q") {
-      exit()
+      void exit()
       return
     }
     const selectedModel = local.model.current()
     if (!selectedModel) {
-      promptModelWarning()
+      void promptModelWarning()
       return
     }
 
@@ -660,7 +660,7 @@ export function Prompt(props: PromptProps) {
     const variant = local.model.variant.current()
 
     if (store.mode === "shell") {
-      sdk.client.session.shell({
+      void sdk.client.session.shell({
         sessionID,
         agent: local.agent.current().name,
         model: {
@@ -685,7 +685,7 @@ export function Prompt(props: PromptProps) {
       const restOfInput = firstLineEnd === -1 ? "" : inputText.slice(firstLineEnd + 1)
       const args = firstLineArgs.join(" ") + (restOfInput ? "\n" + restOfInput : "")
 
-      sdk.client.session.command({
+      void sdk.client.session.command({
         sessionID,
         command: command.slice(1),
         arguments: args,
@@ -1208,7 +1208,7 @@ export function Prompt(props: PromptProps) {
                       const r = retry()
                       if (!r) return
                       if (isTruncated()) {
-                        DialogAlert.show(dialog, "Retry Error", r.message)
+                        void DialogAlert.show(dialog, "Retry Error", r.message)
                       }
                     }
 
diff --git a/packages/opencode/src/cli/cmd/tui/context/kv.tsx b/packages/opencode/src/cli/cmd/tui/context/kv.tsx
index dc0b96c62..39e976b0e 100644
--- a/packages/opencode/src/cli/cmd/tui/context/kv.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/kv.tsx
@@ -44,7 +44,7 @@ export const { use: useKV, provider: KVProvider } = createSimpleContext({
       },
       set(key: string, value: any) {
         setStore(key, value)
-        Filesystem.writeJson(filePath, store)
+        void Filesystem.writeJson(filePath, store)
       },
     }
     return result
diff --git a/packages/opencode/src/cli/cmd/tui/context/local.tsx b/packages/opencode/src/cli/cmd/tui/context/local.tsx
index 612f2b717..4c298ec11 100644
--- a/packages/opencode/src/cli/cmd/tui/context/local.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/local.tsx
@@ -131,7 +131,7 @@ export const { use: useLocal, provider: LocalProvider } = createSimpleContext({
           return
         }
         state.pending = false
-        Filesystem.writeJson(filePath, {
+        void Filesystem.writeJson(filePath, {
           recent: modelStore.recent,
           favorite: modelStore.favorite,
           variant: modelStore.variant,
diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx
index a0a59199b..2558f9751 100644
--- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx
@@ -111,7 +111,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
     event.subscribe((event) => {
       switch (event.type) {
         case "server.instance.disposed":
-          bootstrap()
+          void bootstrap()
           break
         case "permission.replied": {
           const requests = store.permission[event.properties.sessionID]
@@ -336,7 +336,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
 
         case "lsp.updated": {
           const workspace = project.workspace.current()
-          sdk.client.lsp.status({ workspace }).then((x) => setStore("lsp", x.data ?? []))
+          void sdk.client.lsp.status({ workspace }).then((x) => setStore("lsp", x.data ?? []))
           break
         }
 
@@ -415,7 +415,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
         .then(() => {
           if (store.status !== "complete") setStore("status", "partial")
           // non-blocking
-          Promise.all([
+          void Promise.all([
             ...(args.continue ? [] : [sessionListPromise.then((sessions) => setStore("session", reconcile(sessions)))]),
             consoleStatePromise.then((consoleState) => setStore("console_state", reconcile(consoleState))),
             sdk.client.command.list({ workspace }).then((x) => setStore("command", reconcile(x.data ?? []))),
diff --git a/packages/opencode/src/cli/cmd/tui/context/theme.tsx b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
index 179dc9370..679be8f25 100644
--- a/packages/opencode/src/cli/cmd/tui/context/theme.tsx
+++ b/packages/opencode/src/cli/cmd/tui/context/theme.tsx
@@ -329,7 +329,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
     })
 
     function init() {
-      Promise.allSettled([
+      void Promise.allSettled([
         resolveSystemTheme(store.mode),
         getCustomThemes()
           .then((custom) => {
@@ -377,7 +377,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({
       if (store.mode === mode) return
       setStore("mode", mode)
       renderer.clearPaletteCache()
-      resolveSystemTheme(mode)
+      void resolveSystemTheme(mode)
     }
 
     function pin(mode: "dark" | "light" = store.mode) {
diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/system/plugins.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/system/plugins.tsx
index f391eb24a..b5edabcf0 100644
--- a/packages/opencode/src/cli/cmd/tui/feature-plugins/system/plugins.tsx
+++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/system/plugins.tsx
@@ -78,7 +78,7 @@ function Install(props: { api: TuiPluginApi }) {
         }
 
         setBusy(true)
-        props.api.plugins
+        void props.api.plugins
           .install(mod, { global: global() })
           .then((out) => {
             if (!out.ok) {
@@ -188,7 +188,7 @@ function View(props: { api: TuiPluginApi }) {
     if (!item) return
     setLock(true)
     const task = item.active ? props.api.plugins.deactivate(x) : props.api.plugins.activate(x)
-    task
+    void task
       .then((ok) => {
         if (!ok) {
           props.api.ui.toast({
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-message.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-message.tsx
index a51a6cfe5..835ac8f5d 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-message.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-message.tsx
@@ -29,7 +29,7 @@ export function DialogMessage(props: {
             const msg = message()
             if (!msg) return
 
-            sdk.client.session.revert({
+            void sdk.client.session.revert({
               sessionID: props.sessionID,
               messageID: msg.id,
             })
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
index 58b5d6626..2ea936c89 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -241,7 +241,7 @@ export function Session() {
 
     if (kv.get(GO_UPSELL_DONT_SHOW)) return
 
-    DialogGoUpsell.show(dialog).then((dontShowAgain) => {
+    void DialogGoUpsell.show(dialog).then((dontShowAgain) => {
       if (dontShowAgain) kv.set(GO_UPSELL_DONT_SHOW, true)
       kv.set(GO_UPSELL_LAST_SEEN_AT, Date.now())
     })
@@ -272,7 +272,7 @@ export function Session() {
   useKeyboard((evt) => {
     if (!session()?.parentID) return
     if (keybind.match("app_exit", evt)) {
-      exit()
+      void exit()
     }
   })
 
@@ -483,7 +483,7 @@ export function Session() {
           })
           return
         }
-        sdk.client.session.summarize({
+        void sdk.client.session.summarize({
           sessionID: route.sessionID,
           modelID: selectedModel.modelID,
           providerID: selectedModel.providerID,
@@ -529,7 +529,7 @@ export function Session() {
         const revert = session()?.revert?.messageID
         const message = messages().findLast((x) => (!revert || x.id < revert) && x.role === "user")
         if (!message) return
-        sdk.client.session
+        void sdk.client.session
           .revert({
             sessionID: route.sessionID,
             messageID: message.id,
@@ -568,13 +568,13 @@ export function Session() {
         if (!messageID) return
         const message = messages().find((x) => x.role === "user" && x.id > messageID)
         if (!message) {
-          sdk.client.session.unrevert({
+          void sdk.client.session.unrevert({
             sessionID: route.sessionID,
           })
           prompt?.set({ input: "", parts: [] })
           return
         }
-        sdk.client.session.revert({
+        void sdk.client.session.revert({
           sessionID: route.sessionID,
           messageID: message.id,
         })
@@ -1966,7 +1966,7 @@ function Task(props: ToolProps<typeof TaskTool>) {
 
   onMount(() => {
     if (props.metadata.sessionId && !sync.data.message[props.metadata.sessionId]?.length)
-      sync.session.sync(props.metadata.sessionId)
+      void sync.session.sync(props.metadata.sessionId)
   })
 
   const messages = createMemo(() => sync.data.message[props.metadata.sessionId ?? ""] ?? [])
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx
index 3554ab44c..54cc86a40 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx
@@ -184,7 +184,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) {
           onSelect={(option) => {
             setStore("stage", "permission")
             if (option === "cancel") return
-            sdk.client.permission.reply({
+            void sdk.client.permission.reply({
               reply: "always",
               requestID: props.request.id,
             })
@@ -194,7 +194,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) {
       <Match when={store.stage === "reject"}>
         <RejectPrompt
           onConfirm={(message) => {
-            sdk.client.permission.reply({
+            void sdk.client.permission.reply({
               reply: "reject",
               requestID: props.request.id,
               message: message || undefined,
@@ -447,13 +447,13 @@ export function PermissionPrompt(props: { request: PermissionRequest }) {
                     setStore("stage", "reject")
                     return
                   }
-                  sdk.client.permission.reply({
+                  void sdk.client.permission.reply({
                     reply: "reject",
                     requestID: props.request.id,
                   })
                   return
                 }
-                sdk.client.permission.reply({
+                void sdk.client.permission.reply({
                   reply: "once",
                   requestID: props.request.id,
                 })
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/question.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/question.tsx
index 65989b9f3..3ff95b4bb 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/question.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/question.tsx
@@ -45,14 +45,14 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
 
   function submit() {
     const answers = questions().map((_, i) => store.answers[i] ?? [])
-    sdk.client.question.reply({
+    void sdk.client.question.reply({
       requestID: props.request.id,
       answers,
     })
   }
 
   function reject() {
-    sdk.client.question.reject({
+    void sdk.client.question.reject({
       requestID: props.request.id,
     })
   }
@@ -67,7 +67,7 @@ export function QuestionPrompt(props: { request: QuestionRequest }) {
       setStore("custom", inputs)
     }
     if (single()) {
-      sdk.client.question.reply({
+      void sdk.client.question.reply({
         requestID: props.request.id,
         answers: [[answer]],
       })
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index ee1c755eb..3da2dd6bd 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -171,7 +171,7 @@ async function loadCommand(dir: string) {
         ? err.data.message
         : `Failed to parse command ${item}`
       const { Session } = await import("@/session")
-      Bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
+      void Bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
       log.error("failed to load command", { command: item, err })
       return undefined
     })
@@ -210,7 +210,7 @@ async function loadAgent(dir: string) {
         ? err.data.message
         : `Failed to parse agent ${item}`
       const { Session } = await import("@/session")
-      Bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
+      void Bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
       log.error("failed to load agent", { agent: item, err })
       return undefined
     })
@@ -248,7 +248,7 @@ async function loadMode(dir: string) {
         ? err.data.message
         : `Failed to parse mode ${item}`
       const { Session } = await import("@/session")
-      Bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
+      void Bus.publish(Session.Event.Error, { error: new NamedError.Unknown({ message }).toObject() })
       log.error("failed to load mode", { mode: item, err })
       return undefined
     })
diff --git a/packages/opencode/src/control-plane/workspace.ts b/packages/opencode/src/control-plane/workspace.ts
index a0d4c1680..dfd018db7 100644
--- a/packages/opencode/src/control-plane/workspace.ts
+++ b/packages/opencode/src/control-plane/workspace.ts
@@ -114,7 +114,7 @@ export namespace Workspace {
 
     await adaptor.create(config)
 
-    startSync(info)
+    void startSync(info)
 
     await waitEvent({
       timeout: TIMEOUT,
@@ -294,7 +294,7 @@ export namespace Workspace {
     )
     const spaces = rows.map(fromRow).sort((a, b) => a.id.localeCompare(b.id))
 
-    for (const space of spaces) startSync(space)
+    for (const space of spaces) void startSync(space)
     return spaces
   }
 
@@ -307,7 +307,7 @@ export namespace Workspace {
   export const get = fn(WorkspaceID.zod, async (id) => {
     const space = lookup(id)
     if (!space) return
-    startSync(space)
+    void startSync(space)
     return space
   })
 
diff --git a/packages/opencode/src/file/watcher.ts b/packages/opencode/src/file/watcher.ts
index f11cf88a6..3e3da444a 100644
--- a/packages/opencode/src/file/watcher.ts
+++ b/packages/opencode/src/file/watcher.ts
@@ -98,9 +98,9 @@ export namespace FileWatcher {
             const cb: ParcelWatcher.SubscribeCallback = Instance.bind((err, evts) => {
               if (err) return
               for (const evt of evts) {
-                if (evt.type === "create") Bus.publish(Event.Updated, { file: evt.path, event: "add" })
-                if (evt.type === "update") Bus.publish(Event.Updated, { file: evt.path, event: "change" })
-                if (evt.type === "delete") Bus.publish(Event.Updated, { file: evt.path, event: "unlink" })
+                if (evt.type === "create") void Bus.publish(Event.Updated, { file: evt.path, event: "add" })
+                if (evt.type === "update") void Bus.publish(Event.Updated, { file: evt.path, event: "change" })
+                if (evt.type === "delete") void Bus.publish(Event.Updated, { file: evt.path, event: "unlink" })
               }
             })
 
diff --git a/packages/opencode/src/lsp/client.ts b/packages/opencode/src/lsp/client.ts
index 50051b390..27301e79a 100644
--- a/packages/opencode/src/lsp/client.ts
+++ b/packages/opencode/src/lsp/client.ts
@@ -59,7 +59,7 @@ export namespace LSPClient {
       const exists = diagnostics.has(filePath)
       diagnostics.set(filePath, params.diagnostics)
       if (!exists && input.serverID === "typescript") return
-      Bus.publish(Event.Diagnostics, { path: filePath, serverID: input.serverID })
+      void Bus.publish(Event.Diagnostics, { path: filePath, serverID: input.serverID })
     })
     connection.onRequest("window/workDoneProgress/create", (params) => {
       l.info("window/workDoneProgress/create", params)
diff --git a/packages/opencode/src/lsp/index.ts b/packages/opencode/src/lsp/index.ts
index a55ac1840..5146c40ab 100644
--- a/packages/opencode/src/lsp/index.ts
+++ b/packages/opencode/src/lsp/index.ts
@@ -293,7 +293,7 @@ export namespace LSP {
             const task = schedule(server, root, root + server.id)
             s.spawning.set(root + server.id, task)
 
-            task.finally(() => {
+            void task.finally(() => {
               if (s.spawning.get(root + server.id) === task) {
                 s.spawning.delete(root + server.id)
               }
@@ -303,7 +303,7 @@ export namespace LSP {
             if (!client) continue
 
             result.push(client)
-            Bus.publish(Event.Updated, {})
+            void Bus.publish(Event.Updated, {})
           }
 
           return result
diff --git a/packages/opencode/src/plugin/plugin.ts b/packages/opencode/src/plugin/plugin.ts
index ec1cf1e31..d1fc60d99 100644
--- a/packages/opencode/src/plugin/plugin.ts
+++ b/packages/opencode/src/plugin/plugin.ts
@@ -245,7 +245,7 @@ export const layer = Layer.effect(
           Stream.runForEach((input) =>
             Effect.sync(() => {
               for (const hook of hooks) {
-                hook["event"]?.({ event: input as any })
+                void hook["event"]?.({ event: input as any })
               }
             }),
           ),
diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts
index 59d629a37..245730e00 100644
--- a/packages/opencode/src/provider/models.ts
+++ b/packages/opencode/src/provider/models.ts
@@ -172,7 +172,7 @@ export namespace ModelsDev {
 }
 
 if (!Flag.OPENCODE_DISABLE_MODELS_FETCH && !process.argv.includes("--get-yargs-completions")) {
-  ModelsDev.refresh()
+  void ModelsDev.refresh()
   setInterval(
     async () => {
       await ModelsDev.refresh()
diff --git a/packages/opencode/src/server/instance/session.ts b/packages/opencode/src/server/instance/session.ts
index 1b2755fb8..06495b628 100644
--- a/packages/opencode/src/server/instance/session.ts
+++ b/packages/opencode/src/server/instance/session.ts
@@ -898,7 +898,7 @@ export const SessionRoutes = lazy(() =>
           const msg = await AppRuntime.runPromise(
             SessionPrompt.Service.use((svc) => svc.prompt({ ...body, sessionID })),
           )
-          stream.write(JSON.stringify(msg))
+          void stream.write(JSON.stringify(msg))
         })
       },
     )
@@ -926,13 +926,15 @@ export const SessionRoutes = lazy(() =>
       async (c) => {
         const sessionID = c.req.valid("param").sessionID
         const body = c.req.valid("json")
-        AppRuntime.runPromise(SessionPrompt.Service.use((svc) => svc.prompt({ ...body, sessionID }))).catch((err) => {
-          log.error("prompt_async failed", { sessionID, error: err })
-          Bus.publish(Session.Event.Error, {
-            sessionID,
-            error: new NamedError.Unknown({ message: err instanceof Error ? err.message : String(err) }).toObject(),
-          })
-        })
+        void AppRuntime.runPromise(SessionPrompt.Service.use((svc) => svc.prompt({ ...body, sessionID }))).catch(
+          (err) => {
+            log.error("prompt_async failed", { sessionID, error: err })
+            void Bus.publish(Session.Event.Error, {
+              sessionID,
+              error: new NamedError.Unknown({ message: err instanceof Error ? err.message : String(err) }).toObject(),
+            })
+          },
+        )
 
         return c.body(null, 204)
       },
diff --git a/packages/opencode/src/server/proxy.ts b/packages/opencode/src/server/proxy.ts
index 07edcc2bb..5e36f2cff 100644
--- a/packages/opencode/src/server/proxy.ts
+++ b/packages/opencode/src/server/proxy.ts
@@ -76,7 +76,7 @@ const app = (upgrade: UpgradeWebSocket) =>
             queue.length = 0
           }
           remote.onmessage = (event) => {
-            send(ws, event.data)
+            void send(ws, event.data)
           }
           remote.onerror = () => {
             ws.close(1011, "proxy error")
diff --git a/packages/opencode/src/storage/db.ts b/packages/opencode/src/storage/db.ts
index ee53182f3..7acd458dc 100644
--- a/packages/opencode/src/storage/db.ts
+++ b/packages/opencode/src/storage/db.ts
@@ -134,7 +134,7 @@ export namespace Database {
       if (err instanceof LocalContext.NotFound) {
         const effects: (() => void | Promise<void>)[] = []
         const result = ctx.provide({ effects, tx: Client() }, () => callback(Client()))
-        for (const effect of effects) effect()
+        for (const effect of effects) void effect()
         return result
       }
       throw err
@@ -146,7 +146,7 @@ export namespace Database {
     try {
       ctx.use().effects.push(bound)
     } catch {
-      bound()
+      void bound()
     }
   }
 
@@ -165,7 +165,7 @@ export namespace Database {
         const effects: (() => void | Promise<void>)[] = []
         const txCallback = InstanceState.bind((tx: TxOrDb) => ctx.provide({ tx, effects }, () => callback(tx)))
         const result = Client().transaction(txCallback, { behavior: options?.behavior })
-        for (const effect of effects) effect()
+        for (const effect of effects) void effect()
         return result as NotPromise<T>
       }
       throw err
diff --git a/packages/opencode/src/sync/sync-event.ts b/packages/opencode/src/sync/sync-event.ts
index bee7e3c4c..d4ad86040 100644
--- a/packages/opencode/src/sync/sync-event.ts
+++ b/packages/opencode/src/sync/sync-event.ts
@@ -142,11 +142,11 @@ function process<Def extends Definition>(def: Def, event: Event<Def>, options: {
       if (options?.publish) {
         const result = convertEvent(def.type, event.data)
         if (result instanceof Promise) {
-          result.then((data) => {
-            ProjectBus.publish({ type: def.type, properties: def.schema }, data)
+          void result.then((data) => {
+            void ProjectBus.publish({ type: def.type, properties: def.schema }, data)
           })
         } else {
-          ProjectBus.publish({ type: def.type, properties: def.schema }, result)
+          void ProjectBus.publish({ type: def.type, properties: def.schema }, result)
         }
 
         GlobalBus.emit("event", {
diff --git a/packages/opencode/src/util/defer.ts b/packages/opencode/src/util/defer.ts
index 8de21528c..d1c9edc66 100644
--- a/packages/opencode/src/util/defer.ts
+++ b/packages/opencode/src/util/defer.ts
@@ -3,7 +3,7 @@ export function defer<T extends () => void | Promise<void>>(
 ): T extends () => Promise<void> ? { [Symbol.asyncDispose]: () => Promise<void> } : { [Symbol.dispose]: () => void } {
   return {
     [Symbol.dispose]() {
-      fn()
+      void fn()
     },
     [Symbol.asyncDispose]() {
       return Promise.resolve(fn())
diff --git a/packages/opencode/src/util/log.ts b/packages/opencode/src/util/log.ts
index 6be9816a8..7c1581bfc 100644
--- a/packages/opencode/src/util/log.ts
+++ b/packages/opencode/src/util/log.ts
@@ -59,7 +59,7 @@ let write = (msg: any) => {
 
 export async function init(options: Options) {
   if (options.level) level = options.level
-  cleanup(Global.Path.log)
+  void cleanup(Global.Path.log)
   if (options.print) return
   logpath = path.join(
     Global.Path.log,
diff --git a/packages/opencode/test/cli/tui/plugin-lifecycle.test.ts b/packages/opencode/test/cli/tui/plugin-lifecycle.test.ts
index b22180ef3..078e4484d 100644
--- a/packages/opencode/test/cli/tui/plugin-lifecycle.test.ts
+++ b/packages/opencode/test/cli/tui/plugin-lifecycle.test.ts
@@ -209,7 +209,7 @@ test(
 
       const done = await new Promise<string>((resolve) => {
         const timer = setTimeout(() => resolve("timeout"), 7000)
-        TuiPluginRuntime.dispose().then(() => {
+        void TuiPluginRuntime.dispose().then(() => {
           clearTimeout(timer)
           resolve("done")
         })
diff --git a/packages/opencode/test/mcp/headers.test.ts b/packages/opencode/test/mcp/headers.test.ts
index 14c08e303..175717d05 100644
--- a/packages/opencode/test/mcp/headers.test.ts
+++ b/packages/opencode/test/mcp/headers.test.ts
@@ -10,7 +10,7 @@ const transportCalls: Array<{
 }> = []
 
 // Mock the transport constructors to capture their arguments
-mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
   StreamableHTTPClientTransport: class MockStreamableHTTP {
     constructor(url: URL, options?: { authProvider?: unknown; requestInit?: RequestInit }) {
       transportCalls.push({
@@ -25,7 +25,7 @@ mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
   },
 }))
 
-mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
   SSEClientTransport: class MockSSE {
     constructor(url: URL, options?: { authProvider?: unknown; requestInit?: RequestInit }) {
       transportCalls.push({
diff --git a/packages/opencode/test/mcp/lifecycle.test.ts b/packages/opencode/test/mcp/lifecycle.test.ts
index add7c66d9..31712f156 100644
--- a/packages/opencode/test/mcp/lifecycle.test.ts
+++ b/packages/opencode/test/mcp/lifecycle.test.ts
@@ -89,19 +89,19 @@ class MockSSE {
   }
 }
 
-mock.module("@modelcontextprotocol/sdk/client/stdio.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/stdio.js", () => ({
   StdioClientTransport: MockStdioTransport,
 }))
 
-mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
   StreamableHTTPClientTransport: MockStreamableHTTP,
 }))
 
-mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
   SSEClientTransport: MockSSE,
 }))
 
-mock.module("@modelcontextprotocol/sdk/client/auth.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/auth.js", () => ({
   UnauthorizedError: class extends Error {
     constructor() {
       super("Unauthorized")
@@ -110,7 +110,7 @@ mock.module("@modelcontextprotocol/sdk/client/auth.js", () => ({
 }))
 
 // Mock Client that delegates to per-name MockClientState
-mock.module("@modelcontextprotocol/sdk/client/index.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/index.js", () => ({
   Client: class MockClient {
     _state!: MockClientState
     transport: any
diff --git a/packages/opencode/test/mcp/oauth-auto-connect.test.ts b/packages/opencode/test/mcp/oauth-auto-connect.test.ts
index 89edd0908..8b29f6d1e 100644
--- a/packages/opencode/test/mcp/oauth-auto-connect.test.ts
+++ b/packages/opencode/test/mcp/oauth-auto-connect.test.ts
@@ -22,7 +22,7 @@ let simulateAuthFlow = true
 let connectSucceedsImmediately = false
 
 // Mock the transport constructors to simulate OAuth auto-auth on 401
-mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
   StreamableHTTPClientTransport: class MockStreamableHTTP {
     authProvider:
       | {
@@ -66,7 +66,7 @@ mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
   },
 }))
 
-mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
   SSEClientTransport: class MockSSE {
     constructor(url: URL, options?: { authProvider?: unknown }) {
       transportCalls.push({
@@ -82,7 +82,7 @@ mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
 }))
 
 // Mock the MCP SDK Client
-mock.module("@modelcontextprotocol/sdk/client/index.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/index.js", () => ({
   Client: class MockClient {
     async connect(transport: { start: () => Promise<void> }) {
       await transport.start()
@@ -99,7 +99,7 @@ mock.module("@modelcontextprotocol/sdk/client/index.js", () => ({
 }))
 
 // Mock UnauthorizedError in the auth module so instanceof checks work
-mock.module("@modelcontextprotocol/sdk/client/auth.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/auth.js", () => ({
   UnauthorizedError: MockUnauthorizedError,
 }))
 
diff --git a/packages/opencode/test/mcp/oauth-browser.test.ts b/packages/opencode/test/mcp/oauth-browser.test.ts
index b6a32b1e1..3a6df02a1 100644
--- a/packages/opencode/test/mcp/oauth-browser.test.ts
+++ b/packages/opencode/test/mcp/oauth-browser.test.ts
@@ -7,7 +7,7 @@ import type { MCP as MCPNS } from "../../src/mcp/index"
 let openShouldFail = false
 let openCalledWith: string | undefined
 
-mock.module("open", () => ({
+void mock.module("open", () => ({
   default: async (url: string) => {
     openCalledWith = url
 
@@ -39,7 +39,7 @@ const transportCalls: Array<{
 }> = []
 
 // Mock the transport constructors
-mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
   StreamableHTTPClientTransport: class MockStreamableHTTP {
     url: string
     authProvider: { redirectToAuthorization?: (url: URL) => Promise<void> } | undefined
@@ -65,7 +65,7 @@ mock.module("@modelcontextprotocol/sdk/client/streamableHttp.js", () => ({
   },
 }))
 
-mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
   SSEClientTransport: class MockSSE {
     constructor(url: URL) {
       transportCalls.push({
@@ -81,7 +81,7 @@ mock.module("@modelcontextprotocol/sdk/client/sse.js", () => ({
 }))
 
 // Mock the MCP SDK Client to trigger OAuth flow
-mock.module("@modelcontextprotocol/sdk/client/index.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/index.js", () => ({
   Client: class MockClient {
     async connect(transport: { start: () => Promise<void> }) {
       await transport.start()
@@ -90,7 +90,7 @@ mock.module("@modelcontextprotocol/sdk/client/index.js", () => ({
 }))
 
 // Mock UnauthorizedError in the auth module
-mock.module("@modelcontextprotocol/sdk/client/auth.js", () => ({
+void mock.module("@modelcontextprotocol/sdk/client/auth.js", () => ({
   UnauthorizedError: MockUnauthorizedError,
 }))
 
diff --git a/packages/opencode/test/memory/abort-leak-webfetch.ts b/packages/opencode/test/memory/abort-leak-webfetch.ts
index 1286d5f0b..c3197f8dd 100644
--- a/packages/opencode/test/memory/abort-leak-webfetch.ts
+++ b/packages/opencode/test/memory/abort-leak-webfetch.ts
@@ -44,6 +44,6 @@ try {
   const after = heap()
   process.stdout.write(JSON.stringify({ baseline, after, growth: after - baseline }))
 } finally {
-  server.stop(true)
+  void server.stop(true)
   process.exit(0)
 }
diff --git a/packages/opencode/test/permission/next.test.ts b/packages/opencode/test/permission/next.test.ts
index 805c230f3..d654d4b87 100644
--- a/packages/opencode/test/permission/next.test.ts
+++ b/packages/opencode/test/permission/next.test.ts
@@ -954,7 +954,7 @@ it.live("pending permission rejects on instance dispose", () =>
     }).pipe(run, Effect.forkScoped)
 
     expect(yield* waitForPending(1).pipe(run)).toHaveLength(1)
-    yield* Effect.promise(() => Instance.provide({ directory: dir, fn: () => Instance.dispose() }))
+    yield* Effect.promise(() => Instance.provide({ directory: dir, fn: () => void Instance.dispose() }))
 
     const exit = yield* Fiber.await(fiber)
     expect(Exit.isFailure(exit)).toBe(true)
diff --git a/packages/opencode/test/preload.ts b/packages/opencode/test/preload.ts
index ba5df4f1e..7c6f04c79 100644
--- a/packages/opencode/test/preload.ts
+++ b/packages/opencode/test/preload.ts
@@ -81,7 +81,7 @@ process.env["OPENCODE_DB"] = ":memory:"
 const { Log } = await import("../src/util")
 const { initProjectors } = await import("../src/server/projectors")
 
-Log.init({
+void Log.init({
   print: false,
   dev: true,
   level: "DEBUG",
diff --git a/packages/opencode/test/project/migrate-global.test.ts b/packages/opencode/test/project/migrate-global.test.ts
index d645fb25b..c399d8872 100644
--- a/packages/opencode/test/project/migrate-global.test.ts
+++ b/packages/opencode/test/project/migrate-global.test.ts
@@ -10,7 +10,7 @@ import { $ } from "bun"
 import { tmpdir } from "../fixture/fixture"
 import { Effect } from "effect"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function run<A>(fn: (svc: Project.Interface) => Effect.Effect<A>) {
   return Effect.runPromise(
diff --git a/packages/opencode/test/project/project.test.ts b/packages/opencode/test/project/project.test.ts
index a579a2335..4c272b794 100644
--- a/packages/opencode/test/project/project.test.ts
+++ b/packages/opencode/test/project/project.test.ts
@@ -12,7 +12,7 @@ import { NodePath } from "@effect/platform-node"
 import { AppFileSystem } from "@opencode-ai/shared/filesystem"
 import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 const encoder = new TextEncoder()
 
diff --git a/packages/opencode/test/server/global-session-list.test.ts b/packages/opencode/test/server/global-session-list.test.ts
index c029fd933..0edabd8e6 100644
--- a/packages/opencode/test/server/global-session-list.test.ts
+++ b/packages/opencode/test/server/global-session-list.test.ts
@@ -7,7 +7,7 @@ import { Session as SessionNs } from "../../src/session"
 import { Log } from "../../src/util"
 import { tmpdir } from "../fixture/fixture"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function run<A, E>(fx: Effect.Effect<A, E, SessionNs.Service>) {
   return Effect.runPromise(fx.pipe(Effect.provide(SessionNs.defaultLayer)))
diff --git a/packages/opencode/test/server/project-init-git.test.ts b/packages/opencode/test/server/project-init-git.test.ts
index c3ee18e73..a29b4ebb3 100644
--- a/packages/opencode/test/server/project-init-git.test.ts
+++ b/packages/opencode/test/server/project-init-git.test.ts
@@ -10,7 +10,7 @@ import { Log } from "../../src/util"
 import { resetDatabase } from "../fixture/db"
 import { provideInstance, tmpdir } from "../fixture/fixture"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 afterEach(async () => {
   await resetDatabase()
diff --git a/packages/opencode/test/server/session-actions.test.ts b/packages/opencode/test/server/session-actions.test.ts
index 3209ebff3..4be2344aa 100644
--- a/packages/opencode/test/server/session-actions.test.ts
+++ b/packages/opencode/test/server/session-actions.test.ts
@@ -7,7 +7,7 @@ import type { SessionID } from "../../src/session/schema"
 import { Log } from "../../src/util"
 import { tmpdir } from "../fixture/fixture"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function run<A, E>(fx: Effect.Effect<A, E, SessionNs.Service>) {
   return Effect.runPromise(fx.pipe(Effect.provide(SessionNs.defaultLayer)))
diff --git a/packages/opencode/test/server/session-list.test.ts b/packages/opencode/test/server/session-list.test.ts
index 9af60b9bd..602d0f204 100644
--- a/packages/opencode/test/server/session-list.test.ts
+++ b/packages/opencode/test/server/session-list.test.ts
@@ -5,7 +5,7 @@ import { Session as SessionNs } from "../../src/session"
 import { Log } from "../../src/util"
 import { tmpdir } from "../fixture/fixture"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function run<A, E>(fx: Effect.Effect<A, E, SessionNs.Service>) {
   return Effect.runPromise(fx.pipe(Effect.provide(SessionNs.defaultLayer)))
diff --git a/packages/opencode/test/server/session-messages.test.ts b/packages/opencode/test/server/session-messages.test.ts
index d558d4324..50b765896 100644
--- a/packages/opencode/test/server/session-messages.test.ts
+++ b/packages/opencode/test/server/session-messages.test.ts
@@ -8,7 +8,7 @@ import { MessageID, PartID, type SessionID } from "../../src/session/schema"
 import { Log } from "../../src/util"
 import { tmpdir } from "../fixture/fixture"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function run<A, E>(fx: Effect.Effect<A, E, SessionNs.Service>) {
   return Effect.runPromise(fx.pipe(Effect.provide(SessionNs.defaultLayer)))
diff --git a/packages/opencode/test/server/session-select.test.ts b/packages/opencode/test/server/session-select.test.ts
index c53448dfd..21e07f88a 100644
--- a/packages/opencode/test/server/session-select.test.ts
+++ b/packages/opencode/test/server/session-select.test.ts
@@ -7,7 +7,7 @@ import { Instance } from "../../src/project/instance"
 import { Server } from "../../src/server/server"
 import { tmpdir } from "../fixture/fixture"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function run<A, E>(fx: Effect.Effect<A, E, SessionNs.Service>) {
   return Effect.runPromise(fx.pipe(Effect.provide(SessionNs.defaultLayer)))
diff --git a/packages/opencode/test/session/compaction.test.ts b/packages/opencode/test/session/compaction.test.ts
index ee0193221..ee3f645c5 100644
--- a/packages/opencode/test/session/compaction.test.ts
+++ b/packages/opencode/test/session/compaction.test.ts
@@ -27,7 +27,7 @@ import { ProviderTest } from "../fake/provider"
 import { testEffect } from "../lib/effect"
 import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function run<A, E>(fx: Effect.Effect<A, E, SessionNs.Service>) {
   return Effect.runPromise(fx.pipe(Effect.provide(SessionNs.defaultLayer)))
diff --git a/packages/opencode/test/session/llm.test.ts b/packages/opencode/test/session/llm.test.ts
index d1d53f605..f26bef605 100644
--- a/packages/opencode/test/session/llm.test.ts
+++ b/packages/opencode/test/session/llm.test.ts
@@ -229,7 +229,7 @@ beforeEach(() => {
 })
 
 afterAll(() => {
-  state.server?.stop()
+  void state.server?.stop()
 })
 
 function createChatStream(text: string) {
diff --git a/packages/opencode/test/session/messages-pagination.test.ts b/packages/opencode/test/session/messages-pagination.test.ts
index 804076dd4..40ccacc58 100644
--- a/packages/opencode/test/session/messages-pagination.test.ts
+++ b/packages/opencode/test/session/messages-pagination.test.ts
@@ -9,7 +9,7 @@ import { ModelID, ProviderID } from "../../src/provider/schema"
 import { Log } from "../../src/util"
 
 const root = path.join(__dirname, "../..")
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function run<A, E>(fx: Effect.Effect<A, E, SessionNs.Service>) {
   return Effect.runPromise(fx.pipe(Effect.provide(SessionNs.defaultLayer)))
diff --git a/packages/opencode/test/session/processor-effect.test.ts b/packages/opencode/test/session/processor-effect.test.ts
index 87ff40c70..74ce91307 100644
--- a/packages/opencode/test/session/processor-effect.test.ts
+++ b/packages/opencode/test/session/processor-effect.test.ts
@@ -24,7 +24,7 @@ import { provideTmpdirServer } from "../fixture/fixture"
 import { testEffect } from "../lib/effect"
 import { raw, reply, TestLLMServer } from "../lib/llm-server"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 const summary = Layer.succeed(
   SessionSummary.Service,
diff --git a/packages/opencode/test/session/prompt-effect.test.ts b/packages/opencode/test/session/prompt-effect.test.ts
index 0a750352a..6819da481 100644
--- a/packages/opencode/test/session/prompt-effect.test.ts
+++ b/packages/opencode/test/session/prompt-effect.test.ts
@@ -44,7 +44,7 @@ import { provideTmpdirInstance, provideTmpdirServer } from "../fixture/fixture"
 import { testEffect } from "../lib/effect"
 import { reply, TestLLMServer } from "../lib/llm-server"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 const summary = Layer.succeed(
   SessionSummary.Service,
diff --git a/packages/opencode/test/session/prompt.test.ts b/packages/opencode/test/session/prompt.test.ts
index acf305f3f..2b489da9e 100644
--- a/packages/opencode/test/session/prompt.test.ts
+++ b/packages/opencode/test/session/prompt.test.ts
@@ -11,7 +11,7 @@ import { SessionPrompt } from "../../src/session/prompt"
 import { Log } from "../../src/util"
 import { tmpdir } from "../fixture/fixture"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function run<A, E>(fx: Effect.Effect<A, E, SessionPrompt.Service | Session.Service>) {
   return Effect.runPromise(
@@ -316,7 +316,7 @@ describe("session.prompt regression", () => {
           ),
       })
     } finally {
-      server.stop(true)
+      void server.stop(true)
     }
   })
 
@@ -409,7 +409,7 @@ describe("session.prompt regression", () => {
           ),
       })
     } finally {
-      server.stop(true)
+      void server.stop(true)
     }
   })
 })
diff --git a/packages/opencode/test/session/revert-compact.test.ts b/packages/opencode/test/session/revert-compact.test.ts
index 211fcde9a..f28fb94c0 100644
--- a/packages/opencode/test/session/revert-compact.test.ts
+++ b/packages/opencode/test/session/revert-compact.test.ts
@@ -13,7 +13,7 @@ import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
 import { provideTmpdirInstance } from "../fixture/fixture"
 import { testEffect } from "../lib/effect"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 const env = Layer.mergeAll(
   Session.defaultLayer,
diff --git a/packages/opencode/test/session/session.test.ts b/packages/opencode/test/session/session.test.ts
index 9c4686cba..f63ad9bee 100644
--- a/packages/opencode/test/session/session.test.ts
+++ b/packages/opencode/test/session/session.test.ts
@@ -10,7 +10,7 @@ import { AppRuntime } from "../../src/effect/app-runtime"
 import { tmpdir } from "../fixture/fixture"
 
 const projectRoot = path.join(__dirname, "../..")
-Log.init({ print: false })
+void Log.init({ print: false })
 
 function create(input?: SessionNs.CreateInput) {
   return AppRuntime.runPromise(SessionNs.Service.use((svc) => svc.create(input)))
diff --git a/packages/opencode/test/session/snapshot-tool-race.test.ts b/packages/opencode/test/session/snapshot-tool-race.test.ts
index cb7fe4568..38aed4376 100644
--- a/packages/opencode/test/session/snapshot-tool-race.test.ts
+++ b/packages/opencode/test/session/snapshot-tool-race.test.ts
@@ -57,7 +57,7 @@ import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner"
 import { Ripgrep } from "../../src/file/ripgrep"
 import { Format } from "../../src/format"
 
-Log.init({ print: false })
+void Log.init({ print: false })
 
 const mcp = Layer.succeed(
   MCP.Service,
diff --git a/packages/opencode/test/session/structured-output-integration.test.ts b/packages/opencode/test/session/structured-output-integration.test.ts
index 346705bf2..fb8d42f07 100644
--- a/packages/opencode/test/session/structured-output-integration.test.ts
+++ b/packages/opencode/test/session/structured-output-integration.test.ts
@@ -8,7 +8,7 @@ import { Instance } from "../../src/project/instance"
 import { MessageV2 } from "../../src/session/message-v2"
 
 const projectRoot = path.join(__dirname, "../..")
-Log.init({ print: false })
+void Log.init({ print: false })
 
 // Skip tests if no API key is available
 const hasApiKey = !!process.env.ANTHROPIC_API_KEY
diff --git a/packages/opencode/test/skill/discovery.test.ts b/packages/opencode/test/skill/discovery.test.ts
index 175500862..3f8210329 100644
--- a/packages/opencode/test/skill/discovery.test.ts
+++ b/packages/opencode/test/skill/discovery.test.ts
@@ -42,7 +42,7 @@ beforeAll(async () => {
 })
 
 afterAll(async () => {
-  server?.stop()
+  void server?.stop()
   await rm(cacheDir, { recursive: true, force: true })
 })
 
diff --git a/packages/sdk/js/src/gen/core/serverSentEvents.gen.ts b/packages/sdk/js/src/gen/core/serverSentEvents.gen.ts
index 8f7fac549..ffc4f16dc 100644
--- a/packages/sdk/js/src/gen/core/serverSentEvents.gen.ts
+++ b/packages/sdk/js/src/gen/core/serverSentEvents.gen.ts
@@ -111,7 +111,7 @@ export const createSseClient = <TData = unknown>({
 
         const abortHandler = () => {
           try {
-            reader.cancel()
+            void reader.cancel()
           } catch {
             // noop
           }
diff --git a/packages/sdk/js/src/v2/gen/core/serverSentEvents.gen.ts b/packages/sdk/js/src/v2/gen/core/serverSentEvents.gen.ts
index 056a81259..eecc3c37a 100644
--- a/packages/sdk/js/src/v2/gen/core/serverSentEvents.gen.ts
+++ b/packages/sdk/js/src/v2/gen/core/serverSentEvents.gen.ts
@@ -138,7 +138,7 @@ export const createSseClient = <TData = unknown>({
 
         const abortHandler = () => {
           try {
-            reader.cancel()
+            void reader.cancel()
           } catch {
             // noop
           }
diff --git a/packages/slack/src/index.ts b/packages/slack/src/index.ts
index 85d685129..bd5523a2a 100644
--- a/packages/slack/src/index.ts
+++ b/packages/slack/src/index.ts
@@ -20,7 +20,7 @@ const opencode = await createOpencode({
 console.log("✅ Opencode server ready")
 
 const sessions = new Map<string, { client: any; server: any; sessionId: string; channel: string; thread: string }>()
-;(async () => {
+void (async () => {
   const events = await opencode.client.event.subscribe()
   for await (const event of events.stream) {
     if (event.type === "message.part.updated") {
@@ -29,7 +29,7 @@ const sessions = new Map<string, { client: any; server: any; sessionId: string;
         // Find the session for this tool update
         for (const [_sessionKey, session] of sessions.entries()) {
           if (session.sessionId === part.sessionID) {
-            handleToolUpdate(part, session.channel, session.thread)
+            void handleToolUpdate(part, session.channel, session.thread)
             break
           }
         }
diff --git a/packages/ui/src/components/basic-tool.tsx b/packages/ui/src/components/basic-tool.tsx
index 7d18dfacd..27ad7c3c7 100644
--- a/packages/ui/src/components/basic-tool.tsx
+++ b/packages/ui/src/components/basic-tool.tsx
@@ -100,7 +100,7 @@ export function BasicTool(props: BasicToolProps) {
         if (isOpen) {
           contentRef.style.overflow = "hidden"
           heightAnim = animate(contentRef, { height: "auto" }, SPRING)
-          heightAnim.finished.then(() => {
+          void heightAnim.finished.then(() => {
             if (!contentRef || !open()) return
             contentRef.style.overflow = "visible"
             contentRef.style.height = "auto"
diff --git a/packages/ui/src/components/list.tsx b/packages/ui/src/components/list.tsx
index b5879624e..cc5fc0ce5 100644
--- a/packages/ui/src/components/list.tsx
+++ b/packages/ui/src/components/list.tsx
@@ -107,7 +107,7 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
     // Force a refetch even if the value is unchanged.
     // This is important for programmatic changes like Tab completion.
     if (prev === value) {
-      refetch()
+      void refetch()
       return
     }
     queueMicrotask(() => refetch())
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx
index 81e6a52a2..a47ff1804 100644
--- a/packages/ui/src/components/message-part.tsx
+++ b/packages/ui/src/components/message-part.tsx
@@ -1158,7 +1158,7 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp
                 onMouseDown={(e) => e.preventDefault()}
                 onClick={(event) => {
                   event.stopPropagation()
-                  handleCopy()
+                  void handleCopy()
                 }}
                 aria-label={copied() ? i18n.t("ui.message.copied") : i18n.t("ui.message.copyMessage")}
               />
diff --git a/packages/ui/src/components/text-field.tsx b/packages/ui/src/components/text-field.tsx
index d10f5d6ac..93b2663ba 100644
--- a/packages/ui/src/components/text-field.tsx
+++ b/packages/ui/src/components/text-field.tsx
@@ -6,7 +6,8 @@ import { IconButton } from "./icon-button"
 import { Tooltip } from "./tooltip"
 
 export interface TextFieldProps
-  extends ComponentProps<typeof Kobalte.Input>,
+  extends
+    ComponentProps<typeof Kobalte.Input>,
     Partial<
       Pick<
         ComponentProps<typeof Kobalte>,
@@ -75,7 +76,7 @@ export function TextField(props: TextFieldProps) {
   }
 
   function handleClick() {
-    if (local.copyable) handleCopy()
+    if (local.copyable) void handleCopy()
   }
 
   return (
diff --git a/packages/ui/src/components/text-reveal.tsx b/packages/ui/src/components/text-reveal.tsx
index 02bf8084c..2d2a94e6a 100644
--- a/packages/ui/src/components/text-reveal.tsx
+++ b/packages/ui/src/components/text-reveal.tsx
@@ -102,7 +102,7 @@ export function TextReveal(props: {
       requestAnimationFrame(() => setState("ready", true))
       return
     }
-    fonts.ready.finally(() => {
+    void fonts.ready.finally(() => {
       widen(win())
       requestAnimationFrame(() => setState("ready", true))
     })
diff --git a/packages/ui/src/components/thinking-heading.stories.tsx b/packages/ui/src/components/thinking-heading.stories.tsx
index 3a65619ce..12a06b4d8 100644
--- a/packages/ui/src/components/thinking-heading.stories.tsx
+++ b/packages/ui/src/components/thinking-heading.stories.tsx
@@ -442,7 +442,7 @@ function AnimatedHeading(props) {
 
   onMount(() => {
     measure()
-    document.fonts?.ready.finally(() => {
+    void document.fonts?.ready.finally(() => {
       measure()
       requestAnimationFrame(() => setState("ready", true))
     })
diff --git a/packages/ui/src/components/tool-error-card.tsx b/packages/ui/src/components/tool-error-card.tsx
index 038870d38..9983e2fe7 100644
--- a/packages/ui/src/components/tool-error-card.tsx
+++ b/packages/ui/src/components/tool-error-card.tsx
@@ -128,7 +128,7 @@ export function ToolErrorCard(props: ToolErrorCardProps) {
                     onMouseDown={(e) => e.preventDefault()}
                     onClick={(e) => {
                       e.stopPropagation()
-                      copy()
+                      void copy()
                     }}
                     aria-label={copied() ? i18n.t("ui.message.copied") : i18n.t("ui.toolErrorCard.copyError")}
                   />
diff --git a/packages/ui/src/components/tool-status-title.tsx b/packages/ui/src/components/tool-status-title.tsx
index 2a58e0e5b..412d92e3d 100644
--- a/packages/ui/src/components/tool-status-title.tsx
+++ b/packages/ui/src/components/tool-status-title.tsx
@@ -86,7 +86,7 @@ export function ToolStatusTitle(props: {
       finish()
       return
     }
-    fonts.ready.finally(() => {
+    void fonts.ready.finally(() => {
       measure()
       finish()
     })
diff --git a/packages/ui/src/pierre/worker.ts b/packages/ui/src/pierre/worker.ts
index 1993ad7aa..d25dee4d9 100644
--- a/packages/ui/src/pierre/worker.ts
+++ b/packages/ui/src/pierre/worker.ts
@@ -25,7 +25,7 @@ function createPool(lineDiffType: "none" | "word-alt") {
     },
   )
 
-  pool.initialize()
+  void pool.initialize()
   return pool
 }
 
diff --git a/packages/ui/vite.config.ts b/packages/ui/vite.config.ts
index 335084bd6..1e38adede 100644
--- a/packages/ui/vite.config.ts
+++ b/packages/ui/vite.config.ts
@@ -36,10 +36,10 @@ function providerIconsPlugin() {
   return {
     name: "provider-icons-plugin",
     configureServer() {
-      fetchProviderIcons()
+      void fetchProviderIcons()
     },
     buildStart() {
-      fetchProviderIcons()
+      void fetchProviderIcons()
     },
   }
 }
diff --git a/script/duplicate-pr.ts b/script/duplicate-pr.ts
index b77737c1d..2ef16cb65 100755
--- a/script/duplicate-pr.ts
+++ b/script/duplicate-pr.ts
@@ -76,4 +76,4 @@ Examples:
   }
 }
 
-main()
+void main()
-- 
cgit v1.2.3

