From c3bb1648890716fcc92db628c6463d6a56fe6ebd Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 17 Sep 2026 21:04:41 -0700 Subject: [PATCH] perf(mobile): isolate iOS Live Activity imports --- .../agent-awareness/agentLiveActivity.ios.ts | 9 +++++++++ .../agent-awareness/agentLiveActivity.ts | 12 ++++++++++++ .../agent-awareness/remoteRegistration.test.ts | 8 +++----- .../agent-awareness/remoteRegistration.ts | 18 +++++++++++------- 4 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 apps/mobile/src/features/agent-awareness/agentLiveActivity.ios.ts create mode 100644 apps/mobile/src/features/agent-awareness/agentLiveActivity.ts diff --git a/apps/mobile/src/features/agent-awareness/agentLiveActivity.ios.ts b/apps/mobile/src/features/agent-awareness/agentLiveActivity.ios.ts new file mode 100644 index 000000000000..ab078b29a665 --- /dev/null +++ b/apps/mobile/src/features/agent-awareness/agentLiveActivity.ios.ts @@ -0,0 +1,9 @@ +import AgentActivity, { type AgentActivityProps } from "../../widgets/AgentActivity"; + +export function getAgentLiveActivities() { + return AgentActivity.getInstances(); +} + +export function startAgentLiveActivity(props: AgentActivityProps) { + return AgentActivity.start(props); +} diff --git a/apps/mobile/src/features/agent-awareness/agentLiveActivity.ts b/apps/mobile/src/features/agent-awareness/agentLiveActivity.ts new file mode 100644 index 000000000000..44ac017984d9 --- /dev/null +++ b/apps/mobile/src/features/agent-awareness/agentLiveActivity.ts @@ -0,0 +1,12 @@ +import type { LiveActivity } from "expo-widgets"; +import type { AgentActivityProps } from "../../widgets/AgentActivity"; + +export function getAgentLiveActivities(): Array> { + return []; +} + +export function startAgentLiveActivity( + _props: AgentActivityProps, +): LiveActivity | null { + return null; +} diff --git a/apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts b/apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts index bd4109c275e6..df8e023710bd 100644 --- a/apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts +++ b/apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts @@ -101,11 +101,9 @@ vi.mock("expo-widgets", () => ({ addPushToStartTokenListener: vi.fn(() => ({ remove: vi.fn() })), })); -vi.mock("../../widgets/AgentActivity", () => ({ - default: { - getInstances: widgetMocks.getInstances, - start: widgetMocks.start, - }, +vi.mock("./agentLiveActivity", () => ({ + getAgentLiveActivities: widgetMocks.getInstances, + startAgentLiveActivity: widgetMocks.start, })); // The state modules pull the whole connection stack (and native expo modules) diff --git a/apps/mobile/src/features/agent-awareness/remoteRegistration.ts b/apps/mobile/src/features/agent-awareness/remoteRegistration.ts index 5b4ca2423249..a6c31594327a 100644 --- a/apps/mobile/src/features/agent-awareness/remoteRegistration.ts +++ b/apps/mobile/src/features/agent-awareness/remoteRegistration.ts @@ -35,7 +35,8 @@ import { loadPreferences, saveAgentAwarenessRegistrationRecord, } from "../../persistence/imperative"; -import AgentActivity, { type AgentActivityProps } from "../../widgets/AgentActivity"; +import type { AgentActivityProps } from "../../widgets/AgentActivity"; +import { getAgentLiveActivities, startAgentLiveActivity } from "./agentLiveActivity"; import { resolveCloudPublicConfig } from "../cloud/publicConfig"; import { supportsAgentAwarenessPush } from "./capabilities"; import { makeRelayDeviceRegistrationRequest, resolveApsEnvironment } from "./registrationPayload"; @@ -522,11 +523,11 @@ function armAgentAwarenessLiveActivityForLocalWorkNow(input: { readonly projectTitle: string; }): void { try { - if (AgentActivity.getInstances().length > 0) { + if (getAgentLiveActivities().length > 0) { return; } const nowIso = new Date(Date.now()).toISOString(); - const activity = AgentActivity.start({ + const activity = startAgentLiveActivity({ title: "T3 Code", subtitle: "Agent work in progress", activeCount: 1, @@ -545,6 +546,9 @@ function armAgentAwarenessLiveActivityForLocalWorkNow(input: { }, ], }); + if (!activity) { + return; + } logRegistrationDebug("live activity card armed for local work", { threadTitle: input.threadTitle, }); @@ -842,7 +846,7 @@ function endLocalLiveActivities(context: string): void { return; } try { - for (const activity of AgentActivity.getInstances()) { + for (const activity of getAgentLiveActivities()) { activity.end("immediate").catch((error: unknown) => { logRegistrationError(context, error); }); @@ -1069,7 +1073,7 @@ export function refreshActiveLiveActivityRemoteRegistration(): Effect.Effect< } let activities = yield* Effect.try({ - try: () => AgentActivity.getInstances(), + try: () => getAgentLiveActivities(), catch: (cause) => new AgentAwarenessOperationError({ operation: "list-active-live-activities", @@ -1118,7 +1122,7 @@ export function refreshActiveLiveActivityRemoteRegistration(): Effect.Effect< // The snapshot request yields; an arm-on-send may have created the // card in the meantime. Re-check so two cards are never started. const armedMeanwhile = yield* Effect.try({ - try: () => AgentActivity.getInstances(), + try: () => getAgentLiveActivities(), catch: () => [] as ReadonlyArray>, }).pipe(Effect.orElseSucceed(() => [] as ReadonlyArray>)); if (armedMeanwhile.length > 0) { @@ -1127,7 +1131,7 @@ export function refreshActiveLiveActivityRemoteRegistration(): Effect.Effect< const aggregate = snapshot.aggregate; const primed = yield* Effect.try({ try: () => - AgentActivity.start({ + startAgentLiveActivity({ title: aggregate.title, subtitle: aggregate.subtitle, activeCount: aggregate.activeCount,