authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-09-18 12:55:12-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-18 12:55:12-07:00
log53830d413474b2a5749c040d4382c96002894b88
tree1d2ef35f708fa03fdcd830a98a060c86fd9e66e9
parente0649ed7d8f8b5f21d114ff2b09ef803184f1d05
signature Signed by PGP key B5690EEEBB952194

perf(mobile): isolate iOS Live Activity imports (#12380)


4 files changed, 35 insertions(+), 12 deletions(-)

apps/mobile/src/features/agent-awareness/agentLiveActivity.ios.ts created+9
...@@ -0,0 +1,9 @@
1import AgentActivity, { type AgentActivityProps } from "../../widgets/AgentActivity";
2
3export function getAgentLiveActivities() {
4 return AgentActivity.getInstances();
5}
6
7export function startAgentLiveActivity(props: AgentActivityProps) {
8 return AgentActivity.start(props);
9}
apps/mobile/src/features/agent-awareness/agentLiveActivity.ts created+12
...@@ -0,0 +1,12 @@
1import type { LiveActivity } from "expo-widgets";
2import type { AgentActivityProps } from "../../widgets/AgentActivity";
3
4export function getAgentLiveActivities(): Array<LiveActivity<AgentActivityProps>> {
5 return [];
6}
7
8export function startAgentLiveActivity(
9 _props: AgentActivityProps,
10): LiveActivity<AgentActivityProps> | null {
11 return null;
12}
apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts+3-5
...@@ -101,11 +101,9 @@ vi.mock("expo-widgets", () => ({...@@ -101,11 +101,9 @@ vi.mock("expo-widgets", () => ({
101 addPushToStartTokenListener: vi.fn(() => ({ remove: vi.fn() })),101 addPushToStartTokenListener: vi.fn(() => ({ remove: vi.fn() })),
102}));102}));
103103
104vi.mock("../../widgets/AgentActivity", () => ({104vi.mock("./agentLiveActivity", () => ({
105 default: {105 getAgentLiveActivities: widgetMocks.getInstances,
106 getInstances: widgetMocks.getInstances,106 startAgentLiveActivity: widgetMocks.start,
107 start: widgetMocks.start,
108 },
109}));107}));
110108
111// The state modules pull the whole connection stack (and native expo modules)109// The state modules pull the whole connection stack (and native expo modules)
apps/mobile/src/features/agent-awareness/remoteRegistration.ts+11-7
...@@ -35,7 +35,8 @@ import {...@@ -35,7 +35,8 @@ import {
35 loadPreferences,35 loadPreferences,
36 saveAgentAwarenessRegistrationRecord,36 saveAgentAwarenessRegistrationRecord,
37} from "../../persistence/imperative";37} from "../../persistence/imperative";
38import AgentActivity, { type AgentActivityProps } from "../../widgets/AgentActivity";38import type { AgentActivityProps } from "../../widgets/AgentActivity";
39import { getAgentLiveActivities, startAgentLiveActivity } from "./agentLiveActivity";
39import { resolveCloudPublicConfig } from "../cloud/publicConfig";40import { resolveCloudPublicConfig } from "../cloud/publicConfig";
40import { supportsAgentAwarenessPush } from "./capabilities";41import { supportsAgentAwarenessPush } from "./capabilities";
41import { makeRelayDeviceRegistrationRequest, resolveApsEnvironment } from "./registrationPayload";42import { makeRelayDeviceRegistrationRequest, resolveApsEnvironment } from "./registrationPayload";
...@@ -522,11 +523,11 @@ function armAgentAwarenessLiveActivityForLocalWorkNow(input: {...@@ -522,11 +523,11 @@ function armAgentAwarenessLiveActivityForLocalWorkNow(input: {
522 readonly projectTitle: string;523 readonly projectTitle: string;
523}): void {524}): void {
524 try {525 try {
525 if (AgentActivity.getInstances().length > 0) {526 if (getAgentLiveActivities().length > 0) {
526 return;527 return;
527 }528 }
528 const nowIso = new Date(Date.now()).toISOString();529 const nowIso = new Date(Date.now()).toISOString();
529 const activity = AgentActivity.start({530 const activity = startAgentLiveActivity({
530 title: "T3 Code",531 title: "T3 Code",
531 subtitle: "Agent work in progress",532 subtitle: "Agent work in progress",
532 activeCount: 1,533 activeCount: 1,
...@@ -545,6 +546,9 @@ function armAgentAwarenessLiveActivityForLocalWorkNow(input: {...@@ -545,6 +546,9 @@ function armAgentAwarenessLiveActivityForLocalWorkNow(input: {
545 },546 },
546 ],547 ],
547 });548 });
549 if (!activity) {
550 return;
551 }
548 logRegistrationDebug("live activity card armed for local work", {552 logRegistrationDebug("live activity card armed for local work", {
549 threadTitle: input.threadTitle,553 threadTitle: input.threadTitle,
550 });554 });
...@@ -842,7 +846,7 @@ function endLocalLiveActivities(context: string): void {...@@ -842,7 +846,7 @@ function endLocalLiveActivities(context: string): void {
842 return;846 return;
843 }847 }
844 try {848 try {
845 for (const activity of AgentActivity.getInstances()) {849 for (const activity of getAgentLiveActivities()) {
846 activity.end("immediate").catch((error: unknown) => {850 activity.end("immediate").catch((error: unknown) => {
847 logRegistrationError(context, error);851 logRegistrationError(context, error);
848 });852 });
...@@ -1069,7 +1073,7 @@ export function refreshActiveLiveActivityRemoteRegistration(): Effect.Effect<...@@ -1069,7 +1073,7 @@ export function refreshActiveLiveActivityRemoteRegistration(): Effect.Effect<
1069 }1073 }
10701074
1071 let activities = yield* Effect.try({1075 let activities = yield* Effect.try({
1072 try: () => AgentActivity.getInstances(),1076 try: () => getAgentLiveActivities(),
1073 catch: (cause) =>1077 catch: (cause) =>
1074 new AgentAwarenessOperationError({1078 new AgentAwarenessOperationError({
1075 operation: "list-active-live-activities",1079 operation: "list-active-live-activities",
...@@ -1118,7 +1122,7 @@ export function refreshActiveLiveActivityRemoteRegistration(): Effect.Effect<...@@ -1118,7 +1122,7 @@ export function refreshActiveLiveActivityRemoteRegistration(): Effect.Effect<
1118 // The snapshot request yields; an arm-on-send may have created the1122 // The snapshot request yields; an arm-on-send may have created the
1119 // card in the meantime. Re-check so two cards are never started.1123 // card in the meantime. Re-check so two cards are never started.
1120 const armedMeanwhile = yield* Effect.try({1124 const armedMeanwhile = yield* Effect.try({
1121 try: () => AgentActivity.getInstances(),1125 try: () => getAgentLiveActivities(),
1122 catch: () => [] as ReadonlyArray<LiveActivity<AgentActivityProps>>,1126 catch: () => [] as ReadonlyArray<LiveActivity<AgentActivityProps>>,
1123 }).pipe(Effect.orElseSucceed(() => [] as ReadonlyArray<LiveActivity<AgentActivityProps>>));1127 }).pipe(Effect.orElseSucceed(() => [] as ReadonlyArray<LiveActivity<AgentActivityProps>>));
1124 if (armedMeanwhile.length > 0) {1128 if (armedMeanwhile.length > 0) {
...@@ -1127,7 +1131,7 @@ export function refreshActiveLiveActivityRemoteRegistration(): Effect.Effect<...@@ -1127,7 +1131,7 @@ export function refreshActiveLiveActivityRemoteRegistration(): Effect.Effect<
1127 const aggregate = snapshot.aggregate;1131 const aggregate = snapshot.aggregate;
1128 const primed = yield* Effect.try({1132 const primed = yield* Effect.try({
1129 try: () =>1133 try: () =>
1130 AgentActivity.start({1134 startAgentLiveActivity({
1131 title: aggregate.title,1135 title: aggregate.title,
1132 subtitle: aggregate.subtitle,1136 subtitle: aggregate.subtitle,
1133 activeCount: aggregate.activeCount,1137 activeCount: aggregate.activeCount,