diff --git a/packages/app/src/app/h/[serverId]/agent/[agentId].tsx b/packages/app/src/app/h/[serverId]/agent/[agentId].tsx index 231b8bb0f..c32788dbc 100644 --- a/packages/app/src/app/h/[serverId]/agent/[agentId].tsx +++ b/packages/app/src/app/h/[serverId]/agent/[agentId].tsx @@ -1,5 +1,5 @@ import { useEffect, useRef } from "react"; -import { useLocalSearchParams, useRouter } from "expo-router"; +import { useLocalSearchParams, useRouter, type Href } from "expo-router"; import { HostRouteBootstrapBoundary } from "@/components/host-route-bootstrap-boundary"; import { useSessionStore } from "@/stores/session-store"; import { useResolveWorkspaceIdByCwd } from "@/stores/session-store-hooks"; @@ -44,7 +44,7 @@ function HostAgentReadyRouteContent() { } if (!serverId || !agentId) { redirectedRef.current = true; - router.replace("/" as any); + router.replace("/" as Href); return; } @@ -55,7 +55,7 @@ function HostAgentReadyRouteContent() { serverId, workspaceId: resolvedWorkspaceId, target: { kind: "agent", agentId }, - }) as any, + }) as Href, ); } }, [agentId, resolvedWorkspaceId, router, serverId]); @@ -107,7 +107,7 @@ function HostAgentReadyRouteContent() { serverId, workspaceId, target: { kind: "agent", agentId }, - }) as any, + }) as Href, ); return; } diff --git a/packages/app/src/app/h/[serverId]/workspace/[workspaceId]/_layout.tsx b/packages/app/src/app/h/[serverId]/workspace/[workspaceId]/_layout.tsx index 153d50432..00c707758 100644 --- a/packages/app/src/app/h/[serverId]/workspace/[workspaceId]/_layout.tsx +++ b/packages/app/src/app/h/[serverId]/workspace/[workspaceId]/_layout.tsx @@ -65,8 +65,8 @@ function stripOpenSearchParamFromBrowserUrl() { } function clearConsumedOpenIntent(input: { - navigation: { setParams: (...args: any[]) => void }; - router: { replace: (...args: any[]) => void }; + navigation: { setParams: (params: { open?: string | undefined }) => void }; + router: ReturnType; serverId: string; workspaceId: string; }) { @@ -137,7 +137,9 @@ function HostWorkspaceLayoutContent() { const consumptionKey = `${serverId}:${workspaceId}:${openValue}`; if (consumedIntentRef.current === consumptionKey) { clearConsumedOpenIntent({ - navigation, + navigation: navigation as unknown as { + setParams: (params: { open?: string | undefined }) => void; + }, router, serverId, workspaceId, @@ -161,7 +163,9 @@ function HostWorkspaceLayoutContent() { // skips search params). Strip ?open from the browser URL directly so the // address bar reflects the clean workspace route. clearConsumedOpenIntent({ - navigation, + navigation: navigation as unknown as { + setParams: (params: { open?: string | undefined }) => void; + }, router, serverId, workspaceId, diff --git a/packages/app/src/components/archived-agent-callout.tsx b/packages/app/src/components/archived-agent-callout.tsx index e8cfecabe..752529e7f 100644 --- a/packages/app/src/components/archived-agent-callout.tsx +++ b/packages/app/src/components/archived-agent-callout.tsx @@ -59,7 +59,7 @@ export function ArchivedAgentCallout({ serverId, agentId }: ArchivedAgentCallout ); } -const styles = StyleSheet.create(((theme: Theme) => ({ +const styles = StyleSheet.create((theme: Theme) => ({ container: { flexDirection: "column", position: "relative", @@ -99,4 +99,4 @@ const styles = StyleSheet.create(((theme: Theme) => ({ color: theme.colors.foregroundMuted, fontSize: theme.fontSize.base, }, -})) as any) as Record; +})) as unknown as Record; diff --git a/packages/app/src/components/draggable-list.native.tsx b/packages/app/src/components/draggable-list.native.tsx index 3f013286d..e7ef89401 100644 --- a/packages/app/src/components/draggable-list.native.tsx +++ b/packages/app/src/components/draggable-list.native.tsx @@ -85,8 +85,8 @@ export function DraggableList({ containerStyle ?? (scrollEnabled ? SCROLL_ENABLED_FLEX_STYLE : undefined); const shouldShowRefreshControl = showRefreshControl && !nestable; const ListComponent: typeof DraggableFlatList = ( - nestable ? (NestableDraggableFlatList as any) : DraggableFlatList - ) as any; + nestable ? (NestableDraggableFlatList as unknown) : DraggableFlatList + ) as typeof DraggableFlatList; const refreshControl = useMemo( () => diff --git a/packages/app/src/components/message-input.test.tsx b/packages/app/src/components/message-input.test.tsx index 8e897b475..b54eb344b 100644 --- a/packages/app/src/components/message-input.test.tsx +++ b/packages/app/src/components/message-input.test.tsx @@ -150,11 +150,11 @@ vi.mock("@/components/ui/tooltip", () => ({ }: { asChild?: boolean; children: React.ReactNode | ((state: { hovered: boolean }) => React.ReactNode); - } & Record) => + } & Record) => asChild ? ( children ) : ( - ), diff --git a/packages/app/src/components/resize-handle.tsx b/packages/app/src/components/resize-handle.tsx index 02a932b58..651e4380a 100644 --- a/packages/app/src/components/resize-handle.tsx +++ b/packages/app/src/components/resize-handle.tsx @@ -1,5 +1,5 @@ import { useCallback, useMemo, useRef, useState } from "react"; -import { View } from "react-native"; +import { View, type PointerEvent as RNPointerEvent } from "react-native"; import { StyleSheet, useUnistyles } from "react-native-unistyles"; export interface ResizeHandleProps { @@ -32,8 +32,8 @@ export function ResizeHandle({ const highlighted = active || dragging; const handlePointerDown = useCallback( - (event: any) => { - const hitAreaElement = event.currentTarget as HTMLElement | null; + (event: RNPointerEvent) => { + const hitAreaElement = event.currentTarget as unknown as HTMLElement | null; const containerElement = hitAreaElement?.parentElement?.parentElement ?? null; if (!containerElement) { return; @@ -49,7 +49,8 @@ export function ResizeHandle({ pointerStateRef.current = { containerSize, - pointerStart: direction === "horizontal" ? event.clientX : event.clientY, + pointerStart: + direction === "horizontal" ? event.nativeEvent.clientX : event.nativeEvent.clientY, leftSize: sizes[index] ?? 0, rightSize: sizes[index + 1] ?? 0, }; @@ -129,7 +130,7 @@ export function ResizeHandle({ direction === "horizontal" ? styles.hitAreaHorizontal : styles.hitAreaVertical, { cursor: direction === "horizontal" ? "col-resize" : "row-resize", - } as any, + } as object, ], [direction], ); diff --git a/packages/app/src/components/ui/autocomplete.tsx b/packages/app/src/components/ui/autocomplete.tsx index 60f37b22a..458305a89 100644 --- a/packages/app/src/components/ui/autocomplete.tsx +++ b/packages/app/src/components/ui/autocomplete.tsx @@ -283,7 +283,7 @@ export function Autocomplete({ ); } -const styles = StyleSheet.create(((theme: Theme) => ({ +const styles = StyleSheet.create((theme: Theme) => ({ outerWrapper: { gap: theme.spacing[1], }, @@ -385,4 +385,4 @@ const styles = StyleSheet.create(((theme: Theme) => ({ color: theme.colors.foregroundMuted, fontSize: theme.fontSize.sm, }, -})) as any) as Record; +})) as unknown as Record; diff --git a/packages/app/src/components/ui/context-menu.tsx b/packages/app/src/components/ui/context-menu.tsx index 449ad141d..1ca505d2a 100644 --- a/packages/app/src/components/ui/context-menu.tsx +++ b/packages/app/src/components/ui/context-menu.tsx @@ -175,7 +175,17 @@ function computePosition({ } function coerceEventPoint(event: unknown): { pageX: number; pageY: number } | null { - const nativeEvent: any = (event as any)?.nativeEvent ?? event; + const wrapper = event as + | { + nativeEvent?: { pageX?: number; pageY?: number; clientX?: number; clientY?: number }; + pageX?: number; + pageY?: number; + clientX?: number; + clientY?: number; + } + | null + | undefined; + const nativeEvent = wrapper?.nativeEvent ?? wrapper; const pageX = nativeEvent?.pageX; const pageY = nativeEvent?.pageY; if (typeof pageX === "number" && typeof pageY === "number") { @@ -315,7 +325,7 @@ export function ContextMenuTrigger({ if (isNative) { return; } - const e: any = event; + const e = event as { preventDefault?: () => void; stopPropagation?: () => void } | undefined; e?.preventDefault?.(); e?.stopPropagation?.(); openAtEvent(event as GestureResponderEvent); diff --git a/packages/app/src/contexts/session-context.tsx b/packages/app/src/contexts/session-context.tsx index 9a0e3dc93..6c1f89190 100644 --- a/packages/app/src/contexts/session-context.tsx +++ b/packages/app/src/contexts/session-context.tsx @@ -24,6 +24,9 @@ import { } from "@server/shared/agent-attention-notification"; import type { AgentLifecycleStatus } from "@server/shared/agent-lifecycle"; import type { DaemonClient } from "@server/client/daemon-client"; +import type { AgentSessionConfig } from "@server/server/agent/agent-sdk-types"; +import type { GitSetupOptions } from "@server/shared/messages"; +import type { AgentPermissionResponse } from "@server/server/agent/agent-sdk-types"; import { getHostRuntimeStore, useHostRuntimeIsConnected } from "@/runtime/host-runtime"; import { useVoiceAudioEngineOptional, useVoiceRuntimeOptional } from "@/contexts/voice-context"; import type { AudioPlaybackSource } from "@/voice/audio-engine-types"; @@ -1629,11 +1632,11 @@ function SessionProviderInternal({ children, serverId, client }: SessionProvider worktreeName, requestId, }: { - config: any; + config: AgentSessionConfig; initialPrompt: string; images?: AttachmentMetadata[]; attachments?: AgentAttachment[]; - git?: any; + git?: GitSetupOptions; worktreeName?: string; requestId?: string; }) => { @@ -1704,7 +1707,7 @@ function SessionProviderInternal({ children, serverId, client }: SessionProvider ); const _respondToPermission = useCallback( - (agentId: string, requestId: string, response: any) => { + (agentId: string, requestId: string, response: AgentPermissionResponse) => { if (!client) { console.warn("[Session] respondToPermission skipped: daemon unavailable"); return; diff --git a/packages/app/src/desktop/daemon/desktop-daemon-transport.test.ts b/packages/app/src/desktop/daemon/desktop-daemon-transport.test.ts index b7ed732ff..f999a1a13 100644 --- a/packages/app/src/desktop/daemon/desktop-daemon-transport.test.ts +++ b/packages/app/src/desktop/daemon/desktop-daemon-transport.test.ts @@ -16,7 +16,7 @@ const desktopDaemonMock = vi.hoisted(() => { const openLocalTransportSession = vi.fn<(...args: unknown[]) => Promise>(); const listenToLocalTransportEvents = vi.fn( async ( - handler: typeof eventHandler extends ((...args: infer A) => any) | null + handler: typeof eventHandler extends ((...args: infer A) => unknown) | null ? (...args: A) => void : never, ) => { diff --git a/packages/app/src/hooks/image-attachment-picker.test.ts b/packages/app/src/hooks/image-attachment-picker.test.ts index ad7ea2238..3ae194dc0 100644 --- a/packages/app/src/hooks/image-attachment-picker.test.ts +++ b/packages/app/src/hooks/image-attachment-picker.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it, vi, beforeEach } from "vitest"; const desktopHostState = vi.hoisted(() => ({ - api: null as any, + api: null as unknown, })); vi.mock("@/desktop/host", () => ({ diff --git a/packages/app/src/hooks/use-audio-recorder.native.ts b/packages/app/src/hooks/use-audio-recorder.native.ts index 8babad104..f42de2caa 100644 --- a/packages/app/src/hooks/use-audio-recorder.native.ts +++ b/packages/app/src/hooks/use-audio-recorder.native.ts @@ -219,15 +219,18 @@ export function useAudioRecorder(config?: AudioCaptureConfig) { await recorder.record(); attemptGuardRef.current.assertCurrent(attemptId); - } catch (error: any) { + } catch (error) { setRecordingStartTime(null); if (error instanceof AttemptCancelledError) { return; } - if (error?.message !== "Recording cancelled") { + if ((error as { message?: string })?.message !== "Recording cancelled") { console.error("[AudioRecorder] Failed to start recording:", error); } - throw new Error(`Failed to start audio recording: ${error.message}`, { cause: error }); + throw new Error( + `Failed to start audio recording: ${(error as { message?: string })?.message ?? String(error)}`, + { cause: error }, + ); } }, [recordingOptions.sampleRate, recordingOptions.numberOfChannels, recordingOptions.bitRate]); @@ -290,10 +293,13 @@ export function useAudioRecorder(config?: AudioCaptureConfig) { })(); startStopMutexRef.current = stopPromise; return await stopPromise; - } catch (error: any) { + } catch (error) { setRecordingStartTime(null); console.error("[AudioRecorder] Failed to stop recording:", error); - throw new Error(`Failed to stop audio recording: ${error.message}`, { cause: error }); + throw new Error( + `Failed to stop audio recording: ${(error as { message?: string })?.message ?? String(error)}`, + { cause: error }, + ); } finally { startStopMutexRef.current = null; } diff --git a/packages/app/src/hooks/use-audio-recorder.web.ts b/packages/app/src/hooks/use-audio-recorder.web.ts index 65794d450..b68b28026 100644 --- a/packages/app/src/hooks/use-audio-recorder.web.ts +++ b/packages/app/src/hooks/use-audio-recorder.web.ts @@ -189,8 +189,11 @@ export function useAudioRecorder(config?: AudioCaptureConfig) { let stream: MediaStream; try { stream = await navigator.mediaDevices.getUserMedia(constraints); - } catch (error: any) { - throw new Error(`Failed to access microphone: ${error?.message ?? error}`, { cause: error }); + } catch (error) { + throw new Error( + `Failed to access microphone: ${(error as { message?: string })?.message ?? String(error)}`, + { cause: error }, + ); } try { @@ -223,11 +226,14 @@ export function useAudioRecorder(config?: AudioCaptureConfig) { let recorder: MediaRecorder; try { recorder = new MediaRecorder(stream, recorderOptions); - } catch (error: any) { + } catch (error) { cleanupStream(); - throw new Error(`Failed to initialize recorder: ${error?.message ?? error}`, { - cause: error, - }); + throw new Error( + `Failed to initialize recorder: ${(error as { message?: string })?.message ?? String(error)}`, + { + cause: error, + }, + ); } mediaRecorderRef.current = recorder; diff --git a/packages/app/src/hooks/use-dictation-audio-source.web.ts b/packages/app/src/hooks/use-dictation-audio-source.web.ts index 344f8a05a..ca199f24c 100644 --- a/packages/app/src/hooks/use-dictation-audio-source.web.ts +++ b/packages/app/src/hooks/use-dictation-audio-source.web.ts @@ -260,7 +260,10 @@ export function useDictationAudioSource(config: DictationAudioSourceConfig): Dic // isn't available (e.g., Playwright tests with a stubbed getUserMedia). } - const RecorderCtor = typeof window !== "undefined" ? (window as any).MediaRecorder : undefined; + const RecorderCtor = + typeof window !== "undefined" + ? (window as Window & { MediaRecorder?: typeof MediaRecorder }).MediaRecorder + : undefined; if (!RecorderCtor) { throw new Error("MediaRecorder unavailable"); } @@ -277,7 +280,7 @@ export function useDictationAudioSource(config: DictationAudioSourceConfig): Dic stoppedReject: null, }; - recorder.ondataavailable = (event: any) => { + recorder.ondataavailable = (event: BlobEvent) => { const data: Blob | undefined = event?.data; if (data) { recorderRefs.audioChunks.push(data); diff --git a/packages/app/src/hooks/use-push-token-registration.ts b/packages/app/src/hooks/use-push-token-registration.ts index 6b641f71d..78271cfdc 100644 --- a/packages/app/src/hooks/use-push-token-registration.ts +++ b/packages/app/src/hooks/use-push-token-registration.ts @@ -9,10 +9,14 @@ import { isWeb } from "@/constants/platform"; const STORAGE_PREFIX = "@paseo:expo-push-token:"; function getExpoProjectId(): string | null { - const fromEas = (Constants as any)?.easConfig?.projectId; + const constants = Constants as unknown as { + easConfig?: { projectId?: unknown }; + expoConfig?: { extra?: { eas?: { projectId?: unknown } } }; + }; + const fromEas = constants?.easConfig?.projectId; if (typeof fromEas === "string" && fromEas.trim()) return fromEas.trim(); - const fromExtra = (Constants as any)?.expoConfig?.extra?.eas?.projectId; + const fromExtra = constants?.expoConfig?.extra?.eas?.projectId; if (typeof fromExtra === "string" && fromExtra.trim()) return fromExtra.trim(); return null; diff --git a/packages/app/src/stores/panel-store.test.ts b/packages/app/src/stores/panel-store.test.ts index ae0010211..6d940b0b2 100644 --- a/packages/app/src/stores/panel-store.test.ts +++ b/packages/app/src/stores/panel-store.test.ts @@ -18,6 +18,7 @@ vi.mock("@react-native-async-storage/async-storage", () => { import { buildExplorerCheckoutKey, resolveExplorerTabForCheckout, + type ExplorerTab, } from "@/stores/explorer-tab-memory"; import { selectIsAgentListOpen, @@ -108,7 +109,7 @@ describe("panel-store explorer tab resolution", () => { cwd, isGit: true, explorerTabByCheckout: { - [key]: "terminals" as any, + [key]: "terminals" as unknown as ExplorerTab, }, }), ).toBe("changes"); diff --git a/packages/app/src/stores/workspace-layout-store.test.ts b/packages/app/src/stores/workspace-layout-store.test.ts index b23ac2a76..5bd649cd0 100644 --- a/packages/app/src/stores/workspace-layout-store.test.ts +++ b/packages/app/src/stores/workspace-layout-store.test.ts @@ -29,6 +29,7 @@ import { removeTabFromTree, useWorkspaceLayoutStore, type SplitNode, + type SplitPane, } from "@/stores/workspace-layout-store"; const SERVER_ID = "server-1"; @@ -55,7 +56,7 @@ function createPane(input: { tabIds: input.tabIds, focusedTabId: input.focusedTabId ?? input.tabIds[input.tabIds.length - 1] ?? null, tabs, - } as any, + } as SplitPane, }; } @@ -1048,7 +1049,7 @@ describe("workspace-layout-store actions", () => { createdAt: 4, }, ], - } as any, + } as SplitPane, }, focusedPaneId: "main", }, diff --git a/packages/app/src/stores/workspace-tabs-store.ts b/packages/app/src/stores/workspace-tabs-store.ts index 03990a950..5c3b7bbfd 100644 --- a/packages/app/src/stores/workspace-tabs-store.ts +++ b/packages/app/src/stores/workspace-tabs-store.ts @@ -405,36 +405,36 @@ export const useWorkspaceTabsStore = create()( const legacy = persistedState as | { version?: number; - state?: any; + state?: unknown; openTabsByWorkspace?: Record; uiTabsByWorkspace?: Record; focusedTabIdByWorkspace?: Record; tabOrderByWorkspace?: Record; - lastFocusedTabByWorkspace?: Record; + lastFocusedTabByWorkspace?: Record; tabOrderLegacyByWorkspace?: Record; } | undefined; - const rawState = (legacy as any)?.state ?? legacy ?? {}; + const rawState = ((legacy as { state?: Record } | undefined)?.state ?? + legacy ?? + {}) as Record; - const rawUiTabsByWorkspace = - rawState.uiTabsByWorkspace ?? + const rawUiTabsByWorkspace = (rawState.uiTabsByWorkspace ?? rawState.openTabsByWorkspace ?? legacy?.uiTabsByWorkspace ?? legacy?.openTabsByWorkspace ?? - {}; - const rawFocused = - rawState.focusedTabIdByWorkspace ?? + {}) as Record; + const rawFocused = (rawState.focusedTabIdByWorkspace ?? legacy?.focusedTabIdByWorkspace ?? rawState.lastFocusedTabByWorkspace ?? - {}; - const rawOrder = - rawState.tabOrderByWorkspace ?? + {}) as Record; + const rawOrder = (rawState.tabOrderByWorkspace ?? legacy?.tabOrderByWorkspace ?? rawState.tabOrderByWorkspace ?? - {}; - const legacyOrder = - rawState.tabOrderByWorkspace ?? rawState.tabOrderLegacyByWorkspace ?? {}; + {}) as Record; + const legacyOrder = (rawState.tabOrderByWorkspace ?? + rawState.tabOrderLegacyByWorkspace ?? + {}) as Record; const uiTabsByWorkspace: Record = {}; const tabOrderByWorkspace: Record = {}; @@ -523,15 +523,24 @@ export const useWorkspaceTabsStore = create()( } for (const key in rawFocused) { - const value = rawFocused[key]; - if (typeof value === "string") { - const normalized = trimNonEmpty(value); + const rawValue = rawFocused[key]; + if (typeof rawValue === "string") { + const normalized = trimNonEmpty(rawValue); if (normalized) { focusedTabIdByWorkspace[key] = normalized; } continue; } - if (!value || typeof value !== "object" || typeof value.kind !== "string") { + if (!rawValue || typeof rawValue !== "object") { + continue; + } + const value = rawValue as { + kind?: string; + agentId?: string; + terminalId?: string; + draftId?: string; + }; + if (typeof value.kind !== "string") { continue; } if (value.kind === "agent" && typeof value.agentId === "string" && value.agentId.trim()) { diff --git a/packages/app/src/terminal/runtime/terminal-snapshot.test.ts b/packages/app/src/terminal/runtime/terminal-snapshot.test.ts index bf2333157..c5fdbbd9f 100644 --- a/packages/app/src/terminal/runtime/terminal-snapshot.test.ts +++ b/packages/app/src/terminal/runtime/terminal-snapshot.test.ts @@ -62,7 +62,16 @@ function extractState(terminal: ClientTerminal | HeadlessTerminal): SnapshotStat function extractCursorState(terminal: ClientTerminal | HeadlessTerminal): SnapshotState["cursor"] { const buffer = terminal.buffer.active; - const coreService = (terminal as any)._core?.coreService; + const coreService = ( + terminal as unknown as { + _core?: { + coreService?: { + decPrivateModes?: { cursorStyle?: string; cursorBlink?: boolean }; + isCursorHidden?: boolean; + }; + }; + } + )._core?.coreService; const cursorStyle = coreService?.decPrivateModes?.cursorStyle; const normalizedCursorStyle = cursorStyle === "block" || cursorStyle === "underline" || cursorStyle === "bar" diff --git a/packages/app/src/utils/agent-grouping.test.ts b/packages/app/src/utils/agent-grouping.test.ts index aa431a789..7df88ada9 100644 --- a/packages/app/src/utils/agent-grouping.test.ts +++ b/packages/app/src/utils/agent-grouping.test.ts @@ -7,12 +7,12 @@ function makeAgent(overrides: Partial = {}): AggregatedAgent { return { id: overrides.id ?? "a1", serverId: overrides.serverId ?? "s1", - serverLabel: (overrides as any).serverLabel ?? "server", + serverLabel: (overrides as { serverLabel?: string }).serverLabel ?? "server", title: overrides.title ?? null, status: overrides.status ?? ("running" as AggregatedAgent["status"]), lastActivityAt: overrides.lastActivityAt ?? now, cwd: overrides.cwd ?? "/tmp/repo", - provider: overrides.provider ?? ("openai" as any), + provider: overrides.provider ?? ("openai" as AggregatedAgent["provider"]), requiresAttention: overrides.requiresAttention ?? false, attentionReason: overrides.attentionReason ?? null, attentionTimestamp: overrides.attentionTimestamp ?? null, diff --git a/packages/app/src/utils/workspace-navigation.ts b/packages/app/src/utils/workspace-navigation.ts index 8e100408b..075042ff3 100644 --- a/packages/app/src/utils/workspace-navigation.ts +++ b/packages/app/src/utils/workspace-navigation.ts @@ -1,4 +1,4 @@ -import { router } from "expo-router"; +import { router, type Href } from "expo-router"; import { isNative } from "@/constants/platform"; import { activateNavigationWorkspaceSelection, @@ -65,9 +65,9 @@ export function navigateToPreparedWorkspaceTab(input: NavigateToPreparedWorkspac }, 0); return route; } - router.replace(route as any); + router.replace(route as Href); } else { - router.navigate(route as any); + router.navigate(route as Href); } return route; } diff --git a/packages/app/src/voice/audio-engine.native.ts b/packages/app/src/voice/audio-engine.native.ts index f58056ade..fadab8a0a 100644 --- a/packages/app/src/voice/audio-engine.native.ts +++ b/packages/app/src/voice/audio-engine.native.ts @@ -98,17 +98,17 @@ export function createAudioEngine( const microphoneSubscription = native.addExpoTwoWayAudioEventListener( "onMicrophoneData", - (event: any) => { + (event: { data: Uint8Array }) => { if (!refs.captureActive || refs.muted) { return; } - const pcm = event.data as Uint8Array; + const pcm = event.data; callbacks.onCaptureData(pcm); }, ); const volumeSubscription = native.addExpoTwoWayAudioEventListener( "onInputVolumeLevelData", - (event: any) => { + (event: { data: number }) => { if (!refs.captureActive) { return; }