GitHub check
256 KB of 611 KB loaded Download the full log (611 KB)
355 KB of earlier output not loaded
:38:28.3003533Z ╰────
2026-10-24T20:38:28.3003536Z
2026-10-24T20:38:28.3003729Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used.
2026-10-24T20:38:28.3003831Z ╭─[apps/server/src/auth/http.ts:28:10]
2026-10-24T20:38:28.3003918Z 27 │ import * as Schema from "effect/Schema";
2026-10-24T20:38:28.3004009Z 28 │ import { identity } from "effect/Function";
2026-10-24T20:38:28.3004082Z · ────┬───
2026-10-24T20:38:28.3004214Z · ╰── 'identity' is imported here
2026-10-24T20:38:28.3004297Z 29 │ import * as Layer from "effect/Layer";
2026-10-24T20:38:28.3004346Z ╰────
2026-10-24T20:38:28.3004439Z help: Consider removing this import.
2026-10-24T20:38:28.3004441Z
2026-10-24T20:38:28.3004662Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-24T20:38:28.3004789Z ╭─[scripts/lib/cli-external-packages.test.ts:114:11]
2026-10-24T20:38:28.3004858Z 113 │ const declared = {
2026-10-24T20:38:28.3004946Z 114 │ ...(manifest.dependencies ?? {}),
2026-10-24T20:38:28.3005053Z · ────────────────────────────────
2026-10-24T20:38:28.3005156Z 115 │ ...(manifest.optionalDependencies ?? {}),
2026-10-24T20:38:28.3005206Z ╰────
2026-10-24T20:38:28.3005468Z help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
2026-10-24T20:38:28.3005473Z
2026-10-24T20:38:28.3005685Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-24T20:38:28.3005856Z ╭─[scripts/lib/cli-external-packages.test.ts:115:11]
2026-10-24T20:38:28.3005972Z 114 │ ...(manifest.dependencies ?? {}),
2026-10-24T20:38:28.3006073Z 115 │ ...(manifest.optionalDependencies ?? {}),
2026-10-24T20:38:28.3006189Z · ────────────────────────────────────────
2026-10-24T20:38:28.3006286Z 116 │ ...(manifest.peerDependencies ?? {}),
2026-10-24T20:38:28.3006337Z ╰────
2026-10-24T20:38:28.3006597Z help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
2026-10-24T20:38:28.3006600Z
2026-10-24T20:38:28.3006811Z ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
2026-10-24T20:38:28.3006939Z ╭─[scripts/lib/cli-external-packages.test.ts:116:11]
2026-10-24T20:38:28.3007041Z 115 │ ...(manifest.optionalDependencies ?? {}),
2026-10-24T20:38:28.3007135Z 116 │ ...(manifest.peerDependencies ?? {}),
2026-10-24T20:38:28.3007245Z · ────────────────────────────────────
2026-10-24T20:38:28.3007303Z 117 │ };
2026-10-24T20:38:28.3007354Z ╰────
2026-10-24T20:38:28.3007611Z help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
2026-10-24T20:38:28.3007613Z
2026-10-24T20:38:28.3007788Z ⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used.
2026-10-24T20:38:28.3007921Z ╭─[apps/server/src/provider/ProviderAuthService.ts:15:18]
2026-10-24T20:38:28.3008006Z 14 │ import * as Layer from "effect/Layer";
2026-10-24T20:38:28.3008102Z 15 │ import type * as Scope from "effect/Scope";
2026-10-24T20:38:28.3008183Z · ──┬──
2026-10-24T20:38:28.3008313Z · ╰── 'Scope' is imported here
2026-10-24T20:38:28.3008398Z 16 │ import * as Stream from "effect/Stream";
2026-10-24T20:38:28.3008450Z ╰────
2026-10-24T20:38:28.3008545Z help: Consider removing this import.
2026-10-24T20:38:28.3008549Z
2026-10-24T20:38:28.3008748Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used.
2026-10-24T20:38:28.3008849Z ╭─[infra/relay/src/http/Api.ts:69:13]
2026-10-24T20:38:28.3008986Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts";
2026-10-24T20:38:28.3009097Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts";
2026-10-24T20:38:28.3009185Z · ──────┬──────
2026-10-24T20:38:28.3009326Z · ╰── 'HookForwarder' is imported here
2026-10-24T20:38:28.3009428Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts";
2026-10-24T20:38:28.3009478Z ╰────
2026-10-24T20:38:28.3009570Z help: Consider removing this import.
2026-10-24T20:38:28.3009573Z
2026-10-24T20:38:28.3009855Z ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
2026-10-24T20:38:28.3010007Z ╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24]
2026-10-24T20:38:28.3010063Z 162 │ keys,
2026-10-24T20:38:28.3010133Z 163 │ overridingProjects = [],
2026-10-24T20:38:28.3010215Z · ──
2026-10-24T20:38:28.3010282Z 164 │ onClearOverrides,
2026-10-24T20:38:28.3010394Z ╰────
2026-10-24T20:38:28.3010735Z help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
2026-10-24T20:38:28.3010738Z
2026-10-24T20:38:28.3010966Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used.
2026-10-24T20:38:28.3011102Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10]
2026-10-24T20:38:28.3011154Z 21 │
2026-10-24T20:38:28.3011305Z 22 │ function summarizePayload(payload: unknown): Readonly<Record<string, unknown>> {
2026-10-24T20:38:28.3011391Z · ────────┬───────
2026-10-24T20:38:28.3011535Z · ╰── 'summarizePayload' is declared here
2026-10-24T20:38:28.3011646Z 23 │ if (payload === null) return { valueType: "null" };
2026-10-24T20:38:28.3011697Z ╰────
2026-10-24T20:38:28.3011797Z help: Consider removing this declaration.
2026-10-24T20:38:28.3011800Z
2026-10-24T20:38:28.3011942Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3012059Z ╭─[apps/mobile/src/native/StackHeader.tsx:185:9]
2026-10-24T20:38:28.3012122Z 184 │ "options",
2026-10-24T20:38:28.3012214Z 185 │ latestOptionFunctionsRef.current,
2026-10-24T20:38:28.3012319Z · ────────────────┬───────────────
2026-10-24T20:38:28.3012509Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3012600Z 186 │ optionFunctionWrappersRef.current,
2026-10-24T20:38:28.3012651Z ╰────
2026-10-24T20:38:28.3013119Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3013409Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3013411Z
2026-10-24T20:38:28.3013552Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3013666Z ╭─[apps/mobile/src/native/StackHeader.tsx:186:9]
2026-10-24T20:38:28.3013757Z 185 │ latestOptionFunctionsRef.current,
2026-10-24T20:38:28.3013847Z 186 │ optionFunctionWrappersRef.current,
2026-10-24T20:38:28.3013955Z · ────────────────┬────────────────
2026-10-24T20:38:28.3014146Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3014238Z 187 │ ) as NativeStackNavigationOptions)
2026-10-24T20:38:28.3014287Z ╰────
2026-10-24T20:38:28.3014743Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3015028Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3015030Z
2026-10-24T20:38:28.3015216Z ⚠ eslint(require-yield): This generator function does not have `yield`
2026-10-24T20:38:28.3015406Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78]
2026-10-24T20:38:28.3015488Z 80 │
2026-10-24T20:38:28.3015755Z 81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* (
2026-10-24T20:38:28.3015872Z 82 │ │ options: AcpMcpOverAcpBridgeOptions,
2026-10-24T20:38:28.3015993Z 83 │ │ ): Effect.fn.Return<AcpMcpOverAcpBridge> {
2026-10-24T20:38:28.3016157Z 84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch;
2026-10-24T20:38:28.3016290Z 85 │ │ const connections = new Map<string, Connection>();
2026-10-24T20:38:28.3016357Z 86 │ │
2026-10-24T20:38:28.3016572Z 87 │ │ const connectionFor = (connectionId: string): Effect.Effect<Connection, AcpMcpOverAcpError> =>
2026-10-24T20:38:28.3016674Z 88 │ │ Effect.suspend(() => {
2026-10-24T20:38:28.3016806Z 89 │ │ const connection = connections.get(connectionId);
2026-10-24T20:38:28.3016915Z 90 │ │ return connection === undefined
2026-10-24T20:38:28.3017122Z 91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`))
2026-10-24T20:38:28.3017229Z 92 │ │ : Effect.succeed(connection);
2026-10-24T20:38:28.3017303Z 93 │ │ });
2026-10-24T20:38:28.3017370Z 94 │ │
2026-10-24T20:38:28.3017450Z 95 │ │ const send = (
2026-10-24T20:38:28.3017548Z 96 │ │ connection: Connection,
2026-10-24T20:38:28.3017644Z 97 │ │ message: unknown,
2026-10-24T20:38:28.3017800Z 98 │ │ ): Effect.Effect<ReadonlyArray<unknown>, AcpMcpOverAcpError> =>
2026-10-24T20:38:28.3017909Z 99 │ │ connection.mutex.withPermits(1)(
2026-10-24T20:38:28.3018014Z 100 │ │ Effect.gen(function* () {
2026-10-24T20:38:28.3018133Z 101 │ │ const body = JSON.stringify(message);
2026-10-24T20:38:28.3018270Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) {
2026-10-24T20:38:28.3018481Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB."));
2026-10-24T20:38:28.3018557Z 104 │ │ }
2026-10-24T20:38:28.3018687Z 105 │ │ const response = yield* Effect.tryPromise({
2026-10-24T20:38:28.3018788Z 106 │ │ try: (signal) =>
2026-10-24T20:38:28.3018919Z 107 │ │ fetchImplementation(options.endpoint, {
2026-10-24T20:38:28.3019019Z 108 │ │ method: "POST",
2026-10-24T20:38:28.3019109Z 109 │ │ signal,
2026-10-24T20:38:28.3019204Z 110 │ │ headers: {
2026-10-24T20:38:28.3019327Z 111 │ │ "content-type": "application/json",
2026-10-24T20:38:28.3019466Z 112 │ │ accept: "application/json, text/event-stream",
2026-10-24T20:38:28.3019594Z 113 │ │ authorization: options.authorization,
2026-10-24T20:38:28.3019717Z 114 │ │ ...(connection.sessionId === null
2026-10-24T20:38:28.3019857Z 115 │ │ ? {}
2026-10-24T20:38:28.3020024Z 116 │ │ : { "mcp-session-id": connection.sessionId }),
2026-10-24T20:38:28.3020155Z 117 │ │ ...(connection.protocolVersion === null
2026-10-24T20:38:28.3020246Z 118 │ │ ? {}
2026-10-24T20:38:28.3020406Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }),
2026-10-24T20:38:28.3020493Z 120 │ │ },
2026-10-24T20:38:28.3020585Z 121 │ │ body,
2026-10-24T20:38:28.3020669Z 122 │ │ }),
2026-10-24T20:38:28.3020767Z 123 │ │ catch: bridgeError,
2026-10-24T20:38:28.3020866Z 124 │ │ });
2026-10-24T20:38:28.3021085Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId;
2026-10-24T20:38:28.3021186Z 126 │ │ if (!response.ok) {
2026-10-24T20:38:28.3021288Z 127 │ │ yield* Effect.promise(
2026-10-24T20:38:28.3021465Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
2026-10-24T20:38:28.3021545Z 129 │ │ );
2026-10-24T20:38:28.3021654Z 130 │ │ return yield* Effect.fail(
2026-10-24T20:38:28.3021862Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`),
2026-10-24T20:38:28.3021940Z 132 │ │ );
2026-10-24T20:38:28.3022014Z 133 │ │ }
2026-10-24T20:38:28.3022226Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))];
2026-10-24T20:38:28.3022345Z 135 │ │ for (const payload of payloads) {
2026-10-24T20:38:28.3022555Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion;
2026-10-24T20:38:28.3022632Z 137 │ │ }
2026-10-24T20:38:28.3022727Z 138 │ │ return payloads;
2026-10-24T20:38:28.3022849Z 139 │ │ }).pipe(Effect.mapError(bridgeError)),
2026-10-24T20:38:28.3022921Z 140 │ │ );
2026-10-24T20:38:28.3022991Z 141 │ │
2026-10-24T20:38:28.3023162Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* (
2026-10-24T20:38:28.3023336Z 143 │ │ request: AcpSchema.DisconnectMcpRequest,
2026-10-24T20:38:28.3023545Z 144 │ │ ): Effect.fn.Return<AcpSchema.DisconnectMcpResponse, AcpMcpOverAcpError> {
2026-10-24T20:38:28.3023703Z 145 │ │ const connection = yield* connectionFor(request.connectionId);
2026-10-24T20:38:28.3023829Z 146 │ │ connections.delete(request.connectionId);
2026-10-24T20:38:28.3023948Z 147 │ │ const sessionId = connection.sessionId;
2026-10-24T20:38:28.3024047Z 148 │ │ if (sessionId !== null) {
2026-10-24T20:38:28.3024173Z 149 │ │ const response = yield* Effect.tryPromise({
2026-10-24T20:38:28.3024268Z 150 │ │ try: (signal) =>
2026-10-24T20:38:28.3024398Z 151 │ │ fetchImplementation(options.endpoint, {
2026-10-24T20:38:28.3024496Z 152 │ │ method: "DELETE",
2026-10-24T20:38:28.3024585Z 153 │ │ signal,
2026-10-24T20:38:28.3024679Z 154 │ │ headers: {
2026-10-24T20:38:28.3024806Z 155 │ │ authorization: options.authorization,
2026-10-24T20:38:28.3024920Z 156 │ │ "mcp-session-id": sessionId,
2026-10-24T20:38:28.3025051Z 157 │ │ ...(connection.protocolVersion === null
2026-10-24T20:38:28.3025141Z 158 │ │ ? {}
2026-10-24T20:38:28.3025301Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }),
2026-10-24T20:38:28.3025383Z 160 │ │ },
2026-10-24T20:38:28.3025470Z 161 │ │ }),
2026-10-24T20:38:28.3025573Z 162 │ │ catch: bridgeError,
2026-10-24T20:38:28.3025652Z 163 │ │ });
2026-10-24T20:38:28.3025782Z 164 │ │ if (!response.ok && response.status !== 404) {
2026-10-24T20:38:28.3025893Z 165 │ │ return yield* Effect.fail(
2026-10-24T20:38:28.3026002Z 166 │ │ new AcpMcpOverAcpError(
2026-10-24T20:38:28.3026185Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`,
2026-10-24T20:38:28.3026266Z 168 │ │ ),
2026-10-24T20:38:28.3026343Z 169 │ │ );
2026-10-24T20:38:28.3026421Z 170 │ │ }
2026-10-24T20:38:28.3026532Z 171 │ │ yield* Effect.promise(
2026-10-24T20:38:28.3026710Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
2026-10-24T20:38:28.3026785Z 173 │ │ );
2026-10-24T20:38:28.3026860Z 174 │ │ }
2026-10-24T20:38:28.3026947Z 175 │ │ return {};
2026-10-24T20:38:28.3027019Z 176 │ │ });
2026-10-24T20:38:28.3027089Z 177 │ │
2026-10-24T20:38:28.3027168Z 178 │ │ return {
2026-10-24T20:38:28.3027339Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) {
2026-10-24T20:38:28.3027456Z 180 │ │ if (request.serverId !== "t3-code") {
2026-10-24T20:38:28.3027564Z 181 │ │ return yield* Effect.fail(
2026-10-24T20:38:28.3027803Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`),
2026-10-24T20:38:28.3027910Z 183 │ │ );
2026-10-24T20:38:28.3027987Z 184 │ │ }
2026-10-24T20:38:28.3028112Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) {
2026-10-24T20:38:28.3028320Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections."));
2026-10-24T20:38:28.3028397Z 187 │ │ }
2026-10-24T20:38:28.3028552Z 188 │ │ const connectionId = yield* options.allocateConnectionId;
2026-10-24T20:38:28.3028663Z 189 │ │ connections.set(connectionId, {
2026-10-24T20:38:28.3028781Z 190 │ │ mutex: yield* Semaphore.make(1),
2026-10-24T20:38:28.3028884Z 191 │ │ sessionId: null,
2026-10-24T20:38:28.3028992Z 192 │ │ protocolVersion: null,
2026-10-24T20:38:28.3029089Z 193 │ │ nextRequestId: 0,
2026-10-24T20:38:28.3029167Z 194 │ │ });
2026-10-24T20:38:28.3029270Z 195 │ │ return { connectionId };
2026-10-24T20:38:28.3029352Z 196 │ │ }),
2026-10-24T20:38:28.3029518Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) {
2026-10-24T20:38:28.3029681Z 198 │ │ const connection = yield* connectionFor(request.connectionId);
2026-10-24T20:38:28.3029803Z 199 │ │ const id = ++connection.nextRequestId;
2026-10-24T20:38:28.3029936Z 200 │ │ const payloads = yield* send(connection, {
2026-10-24T20:38:28.3030034Z 201 │ │ jsonrpc: "2.0",
2026-10-24T20:38:28.3030117Z 202 │ │ id,
2026-10-24T20:38:28.3030260Z 203 │ │ method: request.method,
2026-10-24T20:38:28.3030532Z 204 │ │ ...(request.params == null ? {} : { params: request.params }),
2026-10-24T20:38:28.3030646Z 205 │ │ });
2026-10-24T20:38:28.3030879Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id);
2026-10-24T20:38:28.3032310Z 207 │ │ const envelope = asEnvelope(response);
2026-10-24T20:38:28.3032447Z 208 │ │ if (envelope === null) {
2026-10-24T20:38:28.3032575Z 209 │ │ return yield* Effect.fail(
2026-10-24T20:38:28.3032798Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."),
2026-10-24T20:38:28.3032908Z 211 │ │ );
2026-10-24T20:38:28.3033004Z 212 │ │ }
2026-10-24T20:38:28.3033143Z 213 │ │ if (envelope.error !== undefined) {
2026-10-24T20:38:28.3033378Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error)));
2026-10-24T20:38:28.3033482Z 215 │ │ }
2026-10-24T20:38:28.3033676Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse;
2026-10-24T20:38:28.3033756Z 217 │ │ }),
2026-10-24T20:38:28.3033997Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) {
2026-10-24T20:38:28.3034251Z 219 │ │ const connection = yield* connectionFor(request.connectionId);
2026-10-24T20:38:28.3034470Z 220 │ │ yield* send(connection, {
2026-10-24T20:38:28.3034578Z 221 │ │ jsonrpc: "2.0",
2026-10-24T20:38:28.3034714Z 222 │ │ method: request.method,
2026-10-24T20:38:28.3034903Z 223 │ │ ...(request.params == null ? {} : { params: request.params }),
2026-10-24T20:38:28.3035013Z 224 │ │ });
2026-10-24T20:38:28.3035099Z 225 │ │ }),
2026-10-24T20:38:28.3035210Z 226 │ │ disconnect,
2026-10-24T20:38:28.3035365Z 227 │ │ dispose: Effect.suspend(() =>
2026-10-24T20:38:28.3035490Z 228 │ │ Effect.forEach(
2026-10-24T20:38:28.3035627Z 229 │ │ [...connections.keys()],
2026-10-24T20:38:28.3035812Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore),
2026-10-24T20:38:28.3035942Z 231 │ │ { discard: true },
2026-10-24T20:38:28.3036056Z 232 │ │ ),
2026-10-24T20:38:28.3036159Z 233 │ │ ),
2026-10-24T20:38:28.3036249Z 234 │ │ };
2026-10-24T20:38:28.3036397Z 235 │ ╰─▶ });
2026-10-24T20:38:28.3036497Z ╰────
2026-10-24T20:38:28.3036774Z help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed.
2026-10-24T20:38:28.3036777Z
2026-10-24T20:38:28.3036987Z ⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used.
2026-10-24T20:38:28.3037214Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10]
2026-10-24T20:38:28.3037377Z 16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native";
2026-10-24T20:38:28.3037527Z 17 │ import { Image, Platform, StyleSheet } from "react-native";
2026-10-24T20:38:28.3037611Z · ──┬──
2026-10-24T20:38:28.3037769Z · ╰── 'Image' is imported here
2026-10-24T20:38:28.3037843Z 18 │
2026-10-24T20:38:28.3037944Z ╰────
2026-10-24T20:38:28.3038054Z help: Consider removing this import.
2026-10-24T20:38:28.3038057Z
2026-10-24T20:38:28.3038294Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T20:38:28.3038470Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:229:6]
2026-10-24T20:38:28.3038665Z 225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
2026-10-24T20:38:28.3038791Z 226 │ nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3038899Z · ───────────┬───────────
2026-10-24T20:38:28.3039404Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3039985Z 227 │ mostRecentEventCount,
2026-10-24T20:38:28.3040253Z 228 │ );
2026-10-24T20:38:28.3040521Z 229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
2026-10-24T20:38:28.3040863Z · ──────────────────────────┬──────────────────────────
2026-10-24T20:38:28.3041354Z · ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3041712Z 230 │ const assumedValue = props.value;
2026-10-24T20:38:28.3041906Z ╰────
2026-10-24T20:38:28.3042202Z help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T20:38:28.3043058Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3043415Z
2026-10-24T20:38:28.3043712Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T20:38:28.3044142Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:237:7]
2026-10-24T20:38:28.3044502Z 236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState(
2026-10-24T20:38:28.3044801Z 237 │ nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3045066Z · ───────────┬───────────
2026-10-24T20:38:28.3045675Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3046237Z 238 │ controlledEventCount,
2026-10-24T20:38:28.3046435Z 239 │ assumedValue,
2026-10-24T20:38:28.3046637Z 240 │ );
2026-10-24T20:38:28.3046960Z 241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
2026-10-24T20:38:28.3047770Z · ───────────┬──────────
2026-10-24T20:38:28.3048298Z · ╰── Unnecessary dependency `controlledDocumentJson`
2026-10-24T20:38:28.3048644Z 242 │ const acceptNativeEvent = useCallback(
2026-10-24T20:38:28.3048854Z ╰────
2026-10-24T20:38:28.3049389Z help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3050124Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3050454Z
2026-10-24T20:38:28.3050628Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3051005Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29]
2026-10-24T20:38:28.3051411Z 161 │ const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3051704Z 162 │ preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3052081Z · ─────────────┬────────────
2026-10-24T20:38:28.3052534Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3052865Z 163 │ });
2026-10-24T20:38:28.3053026Z ╰────
2026-10-24T20:38:28.3053738Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3054551Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3054891Z
2026-10-24T20:38:28.3055057Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3055470Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:29]
2026-10-24T20:38:28.3055797Z 161 │ const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3056101Z 162 │ preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3056401Z · ─────────────┬────────────
2026-10-24T20:38:28.3056774Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3057203Z 163 │ });
2026-10-24T20:38:28.3057359Z ╰────
2026-10-24T20:38:28.3058003Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3058809Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3059175Z
2026-10-24T20:38:28.3059354Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3059702Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:164:23]
2026-10-24T20:38:28.3059952Z 163 │ });
2026-10-24T20:38:28.3060143Z 164 │ confirmedTokensRef.current = tokens;
2026-10-24T20:38:28.3060437Z · ─────────┬────────────┬───
2026-10-24T20:38:28.3060801Z · │ ╰── Cannot update ref value during render
2026-10-24T20:38:28.3061182Z · ╰── This value is a ref
2026-10-24T20:38:28.3061432Z 165 │ return JSON.stringify(
2026-10-24T20:38:28.3061633Z ╰────
2026-10-24T20:38:28.3062254Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3063021Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3063317Z
2026-10-24T20:38:28.3063561Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3063925Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:206:5]
2026-10-24T20:38:28.3064203Z 205 │ mostRecentEventCount,
2026-10-24T20:38:28.3064432Z 206 │ nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3064681Z · ───────────────┬───────────────
2026-10-24T20:38:28.3065044Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3065376Z 207 │ );
2026-10-24T20:38:28.3065561Z ╰────
2026-10-24T20:38:28.3066116Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3066890Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3067201Z
2026-10-24T20:38:28.3067372Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3067695Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:212:5]
2026-10-24T20:38:28.3067987Z 211 │ mostRecentEventCount,
2026-10-24T20:38:28.3068205Z 212 │ nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3068481Z · ───────────────┬───────────────
2026-10-24T20:38:28.3068861Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3069161Z 213 │ );
2026-10-24T20:38:28.3069312Z ╰────
2026-10-24T20:38:28.3069867Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3070647Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3070987Z
2026-10-24T20:38:28.3071190Z ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T20:38:28.3071697Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:197:6]
2026-10-24T20:38:28.3072026Z 161 │ const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3075742Z 162 │ preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3075988Z · ─────────┬────────
2026-10-24T20:38:28.3076572Z · ╰── Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3077037Z 163 │ });
2026-10-24T20:38:28.3077196Z 164 │ confirmedTokensRef.current = tokens;
2026-10-24T20:38:28.3077373Z 165 │ return JSON.stringify(
2026-10-24T20:38:28.3077624Z 166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
2026-10-24T20:38:28.3077861Z 167 │ const record =
2026-10-24T20:38:28.3078022Z 168 │ token.type === "context"
2026-10-24T20:38:28.3078286Z 169 │ ? props.context?.records.find((record) => record.contextId === token.contextId)
2026-10-24T20:38:28.3078519Z 170 │ : undefined;
2026-10-24T20:38:28.3078811Z 171 │ const presentation = contextChipPresentation(
2026-10-24T20:38:28.3079080Z 172 │ token.type === "context" ? token.kind : token.type,
2026-10-24T20:38:28.3079269Z 173 │ record,
2026-10-24T20:38:28.3079404Z 174 │ );
2026-10-24T20:38:28.3079556Z 175 │ const icon = contextChipIcon(
2026-10-24T20:38:28.3079721Z 176 │ presentation,
2026-10-24T20:38:28.3079944Z 177 │ token.type === "mention" ? token.value : contextRecordFileName(record),
2026-10-24T20:38:28.3080151Z 178 │ );
2026-10-24T20:38:28.3080279Z 179 │ return {
2026-10-24T20:38:28.3080428Z 180 │ type: token.type,
2026-10-24T20:38:28.3080586Z 181 │ source: token.source,
2026-10-24T20:38:28.3080749Z 182 │ start: token.start,
2026-10-24T20:38:28.3080921Z 183 │ end: token.end,
2026-10-24T20:38:28.3081201Z 184 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor),
2026-10-24T20:38:28.3081418Z 185 │ label:
2026-10-24T20:38:28.3081569Z 186 │ token.type === "skill"
2026-10-24T20:38:28.3081776Z 187 │ ? (skillLabels.get(token.value) ?? token.value)
2026-10-24T20:38:28.3081976Z 188 │ : token.type === "context"
2026-10-24T20:38:28.3082311Z 189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}`
2026-10-24T20:38:28.3082618Z 190 │ : basename(token.value),
2026-10-24T20:38:28.3082864Z 191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
2026-10-24T20:38:28.3083104Z 192 │ iconUri: contextChipIconUri(icon),
2026-10-24T20:38:28.3083304Z 193 │ tintsIcon: icon.kind === "chip",
2026-10-24T20:38:28.3083466Z 194 │ };
2026-10-24T20:38:28.3083592Z 195 │ }),
2026-10-24T20:38:28.3083714Z 196 │ );
2026-10-24T20:38:28.3083911Z 197 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]);
2026-10-24T20:38:28.3084202Z · ───────────────────────────────┬───────────────────────────────
2026-10-24T20:38:28.3084547Z · ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3084872Z 198 │ // Every render resolves against the snapshot history, so a render whose
2026-10-24T20:38:28.3085071Z ╰────
2026-10-24T20:38:28.3085331Z help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T20:38:28.3085857Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3086154Z
2026-10-24T20:38:28.3086340Z ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T20:38:28.3086661Z ╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:259:5]
2026-10-24T20:38:28.3086935Z 251 │ mostRecentEventCountRef.current = acknowledgedEventCount;
2026-10-24T20:38:28.3087172Z 252 │ nativeEventSnapshotsRef.current.push({
2026-10-24T20:38:28.3087380Z · ───────────┬───────────
2026-10-24T20:38:28.3087932Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3088484Z 253 │ eventCount: acknowledgedEventCount,
2026-10-24T20:38:28.3088743Z 254 │ value,
2026-10-24T20:38:28.3088931Z 255 │ selection: nextSelection,
2026-10-24T20:38:28.3089082Z 256 │ });
2026-10-24T20:38:28.3089251Z 257 │ return acknowledgedEventCount;
2026-10-24T20:38:28.3089407Z 258 │ },
2026-10-24T20:38:28.3089526Z 259 │ [],
2026-10-24T20:38:28.3089659Z · ─┬
2026-10-24T20:38:28.3089917Z · ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3090143Z 260 │ );
2026-10-24T20:38:28.3090251Z ╰────
2026-10-24T20:38:28.3090506Z help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T20:38:28.3091060Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3091354Z
2026-10-24T20:38:28.3091555Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T20:38:28.3091973Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6]
2026-10-24T20:38:28.3092274Z 227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
2026-10-24T20:38:28.3092528Z 228 │ nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3092733Z · ───────────┬───────────
2026-10-24T20:38:28.3093281Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3093756Z 229 │ mostRecentEventCount,
2026-10-24T20:38:28.3093901Z 230 │ );
2026-10-24T20:38:28.3094094Z 231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
2026-10-24T20:38:28.3094360Z · ──────────────────────────┬──────────────────────────
2026-10-24T20:38:28.3094684Z · ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3094950Z 232 │ const assumedValue = props.value;
2026-10-24T20:38:28.3095102Z ╰────
2026-10-24T20:38:28.3095322Z help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T20:38:28.3095813Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3096106Z
2026-10-24T20:38:28.3096323Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T20:38:28.3096665Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:239:7]
2026-10-24T20:38:28.3096945Z 238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState(
2026-10-24T20:38:28.3097185Z 239 │ nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3097382Z · ───────────┬───────────
2026-10-24T20:38:28.3097932Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3098398Z 240 │ controlledEventCount,
2026-10-24T20:38:28.3098551Z 241 │ assumedValue,
2026-10-24T20:38:28.3098685Z 242 │ );
2026-10-24T20:38:28.3098960Z 243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
2026-10-24T20:38:28.3099284Z · ───────────┬──────────
2026-10-24T20:38:28.3099615Z · ╰── Unnecessary dependency `controlledDocumentJson`
2026-10-24T20:38:28.3099886Z 244 │ const acceptNativeEvent = useCallback(
2026-10-24T20:38:28.3100039Z ╰────
2026-10-24T20:38:28.3100504Z help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3101217Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3101510Z
2026-10-24T20:38:28.3101654Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3101937Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29]
2026-10-24T20:38:28.3102199Z 163 │ const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3102443Z 164 │ preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3102684Z · ─────────────┬────────────
2026-10-24T20:38:28.3102966Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3103178Z 165 │ });
2026-10-24T20:38:28.3103289Z ╰────
2026-10-24T20:38:28.3103812Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3104517Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3104792Z
2026-10-24T20:38:28.3104935Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3105213Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:29]
2026-10-24T20:38:28.3105478Z 163 │ const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3105720Z 164 │ preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3105959Z · ─────────────┬────────────
2026-10-24T20:38:28.3106325Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3106600Z 165 │ });
2026-10-24T20:38:28.3106711Z ╰────
2026-10-24T20:38:28.3107224Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3107923Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3108202Z
2026-10-24T20:38:28.3108343Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3108625Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:166:23]
2026-10-24T20:38:28.3108827Z 165 │ });
2026-10-24T20:38:28.3108976Z 166 │ confirmedTokensRef.current = tokens;
2026-10-24T20:38:28.3109204Z · ─────────┬────────────┬───
2026-10-24T20:38:28.3109508Z · │ ╰── Cannot update ref value during render
2026-10-24T20:38:28.3109795Z · ╰── This value is a ref
2026-10-24T20:38:28.3109984Z 167 │ return JSON.stringify(
2026-10-24T20:38:28.3110122Z ╰────
2026-10-24T20:38:28.3110631Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3111498Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3111777Z
2026-10-24T20:38:28.3111918Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3112199Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:208:5]
2026-10-24T20:38:28.3112406Z 207 │ mostRecentEventCount,
2026-10-24T20:38:28.3112580Z 208 │ nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3112784Z · ───────────────┬───────────────
2026-10-24T20:38:28.3113073Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3113302Z 209 │ );
2026-10-24T20:38:28.3113412Z ╰────
2026-10-24T20:38:28.3113927Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3114631Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3114904Z
2026-10-24T20:38:28.3115045Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3115325Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:214:5]
2026-10-24T20:38:28.3115532Z 213 │ mostRecentEventCount,
2026-10-24T20:38:28.3115705Z 214 │ nativeEventSnapshotsRef.current,
2026-10-24T20:38:28.3115907Z · ───────────────┬───────────────
2026-10-24T20:38:28.3116261Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3116534Z 215 │ );
2026-10-24T20:38:28.3116641Z ╰────
2026-10-24T20:38:28.3117151Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3117854Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3118128Z
2026-10-24T20:38:28.3118308Z ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T20:38:28.3118620Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:199:6]
2026-10-24T20:38:28.3118883Z 163 │ const tokens = collectComposerInlineTokens(props.value, {
2026-10-24T20:38:28.3119127Z 164 │ preserveTrailingFrom: confirmedTokensRef.current,
2026-10-24T20:38:28.3119357Z · ─────────┬────────
2026-10-24T20:38:28.3119928Z · ╰── Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3120382Z 165 │ });
2026-10-24T20:38:28.3120534Z 166 │ confirmedTokensRef.current = tokens;
2026-10-24T20:38:28.3120705Z 167 │ return JSON.stringify(
2026-10-24T20:38:28.3121000Z 168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
2026-10-24T20:38:28.3121237Z 169 │ const record =
2026-10-24T20:38:28.3121400Z 170 │ token.type === "context"
2026-10-24T20:38:28.3121660Z 171 │ ? props.context?.records.find((record) => record.contextId === token.contextId)
2026-10-24T20:38:28.3121887Z 172 │ : undefined;
2026-10-24T20:38:28.3122075Z 173 │ const presentation = contextChipPresentation(
2026-10-24T20:38:28.3122299Z 174 │ token.type === "context" ? token.kind : token.type,
2026-10-24T20:38:28.3122483Z 175 │ record,
2026-10-24T20:38:28.3122615Z 176 │ );
2026-10-24T20:38:28.3122764Z 177 │ const icon = contextChipIcon(
2026-10-24T20:38:28.3122926Z 178 │ presentation,
2026-10-24T20:38:28.3123148Z 179 │ token.type === "mention" ? token.value : contextRecordFileName(record),
2026-10-24T20:38:28.3123354Z 180 │ );
2026-10-24T20:38:28.3123480Z 181 │ return {
2026-10-24T20:38:28.3123630Z 182 │ type: token.type,
2026-10-24T20:38:28.3123791Z 183 │ source: token.source,
2026-10-24T20:38:28.3123954Z 184 │ start: token.start,
2026-10-24T20:38:28.3124105Z 185 │ end: token.end,
2026-10-24T20:38:28.3124333Z 186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor),
2026-10-24T20:38:28.3124545Z 187 │ label:
2026-10-24T20:38:28.3124693Z 188 │ token.type === "skill"
2026-10-24T20:38:28.3124895Z 189 │ ? (skillLabels.get(token.value) ?? token.value)
2026-10-24T20:38:28.3125095Z 190 │ : token.type === "context"
2026-10-24T20:38:28.3125420Z 191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}`
2026-10-24T20:38:28.3125721Z 192 │ : basename(token.value),
2026-10-24T20:38:28.3126015Z 193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
2026-10-24T20:38:28.3126282Z 194 │ iconUri: contextChipIconUri(icon),
2026-10-24T20:38:28.3126474Z 195 │ tintsIcon: icon.kind === "chip",
2026-10-24T20:38:28.3126633Z 196 │ };
2026-10-24T20:38:28.3126755Z 197 │ }),
2026-10-24T20:38:28.3126873Z 198 │ );
2026-10-24T20:38:28.3127066Z 199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]);
2026-10-24T20:38:28.3127356Z · ───────────────────────────────┬───────────────────────────────
2026-10-24T20:38:28.3127694Z · ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3128020Z 200 │ // Every render resolves against the snapshot history, so a render whose
2026-10-24T20:38:28.3128216Z ╰────
2026-10-24T20:38:28.3128477Z help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T20:38:28.3128986Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3129278Z
2026-10-24T20:38:28.3129459Z ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T20:38:28.3129770Z ╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5]
2026-10-24T20:38:28.3130038Z 253 │ mostRecentEventCountRef.current = acknowledgedEventCount;
2026-10-24T20:38:28.3130274Z 254 │ nativeEventSnapshotsRef.current.push({
2026-10-24T20:38:28.3130477Z · ───────────┬───────────
2026-10-24T20:38:28.3131061Z · ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3131555Z 255 │ eventCount: acknowledgedEventCount,
2026-10-24T20:38:28.3131722Z 256 │ value,
2026-10-24T20:38:28.3131873Z 257 │ selection: nextSelection,
2026-10-24T20:38:28.3132023Z 258 │ });
2026-10-24T20:38:28.3132171Z 259 │ return acknowledgedEventCount;
2026-10-24T20:38:28.3132323Z 260 │ },
2026-10-24T20:38:28.3132440Z 261 │ [],
2026-10-24T20:38:28.3132565Z · ─┬
2026-10-24T20:38:28.3132820Z · ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3133044Z 262 │ );
2026-10-24T20:38:28.3133151Z ╰────
2026-10-24T20:38:28.3133411Z help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T20:38:28.3133919Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3134214Z
2026-10-24T20:38:28.3134469Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3134835Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7]
2026-10-24T20:38:28.3135018Z 727 │
2026-10-24T20:38:28.3135149Z 728 │ const layer = layerWithOptions();
2026-10-24T20:38:28.3135315Z · ──┬──
2026-10-24T20:38:28.3135515Z · ╰── 'layer' is declared here
2026-10-24T20:38:28.3135690Z ╰────
2026-10-24T20:38:28.3135898Z help: Consider removing this declaration.
2026-10-24T20:38:28.3136043Z
2026-10-24T20:38:28.3136241Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T20:38:28.3136592Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8]
2026-10-24T20:38:28.3136830Z 3 │ AuthProvidersManageScope,
2026-10-24T20:38:28.3136986Z 4 │ type AuthSessionState,
2026-10-24T20:38:28.3137155Z · ────────┬───────
2026-10-24T20:38:28.3137390Z · ╰── 'AuthSessionState' is imported here
2026-10-24T20:38:28.3137595Z 5 │ type EnvironmentId,
2026-10-24T20:38:28.3137728Z ╰────
2026-10-24T20:38:28.3137873Z help: Consider removing this import.
2026-10-24T20:38:28.3137985Z
2026-10-24T20:38:28.3138182Z ⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used.
2026-10-24T20:38:28.3138504Z ╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3]
2026-10-24T20:38:28.3138709Z 1 │ import type {
2026-10-24T20:38:28.3138841Z 2 │ EnvironmentId,
2026-10-24T20:38:28.3138988Z · ──────┬──────
2026-10-24T20:38:28.3139202Z · ╰── 'EnvironmentId' is imported here
2026-10-24T20:38:28.3139418Z 3 │ ExecutionEnvironmentCapabilities,
2026-10-24T20:38:28.3139567Z ╰────
2026-10-24T20:38:28.3139710Z help: Consider removing this import.
2026-10-24T20:38:28.3139819Z
2026-10-24T20:38:28.3140287Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-24T20:38:28.3140877Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7]
2026-10-24T20:38:28.3141088Z 168 │ });
2026-10-24T20:38:28.3141352Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
2026-10-24T20:38:28.3141721Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break;
2026-10-24T20:38:28.3142011Z 171 │ │ yield* Effect.yieldNow;
2026-10-24T20:38:28.3142257Z 172 │ ╰─▶ }
2026-10-24T20:38:28.3142439Z 173 │
2026-10-24T20:38:28.3142548Z ╰────
2026-10-24T20:38:28.3142605Z
2026-10-24T20:38:28.3143069Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-24T20:38:28.3143624Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7]
2026-10-24T20:38:28.3143879Z 177 │ yield* Deferred.succeed(releaseSave, undefined);
2026-10-24T20:38:28.3144189Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
2026-10-24T20:38:28.3144497Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break;
2026-10-24T20:38:28.3144735Z 180 │ │ yield* Effect.yieldNow;
2026-10-24T20:38:28.3144975Z 181 │ ╰─▶ }
2026-10-24T20:38:28.3145162Z 182 │
2026-10-24T20:38:28.3145269Z ╰────
2026-10-24T20:38:28.3145378Z
2026-10-24T20:38:28.3145858Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-24T20:38:28.3146405Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7]
2026-10-24T20:38:28.3146680Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined);
2026-10-24T20:38:28.3147001Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
2026-10-24T20:38:28.3147297Z 308 │ │ const values = yield* Ref.get(saved);
2026-10-24T20:38:28.3147615Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) {
2026-10-24T20:38:28.3147890Z 310 │ │ break;
2026-10-24T20:38:28.3148068Z 311 │ │ }
2026-10-24T20:38:28.3148261Z 312 │ │ yield* Effect.yieldNow;
2026-10-24T20:38:28.3148504Z 313 │ ╰─▶ }
2026-10-24T20:38:28.3148687Z 314 │
2026-10-24T20:38:28.3148794Z ╰────
2026-10-24T20:38:28.3148848Z
2026-10-24T20:38:28.3149043Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3149378Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
2026-10-24T20:38:28.3149622Z 256 │ return () => cancelAnimationFrame(frame);
2026-10-24T20:38:28.3149808Z 257 │ }, [props.path, targetIndex]);
2026-10-24T20:38:28.3149980Z · ─────┬────
2026-10-24T20:38:28.3150215Z · ╰── Unnecessary dependency `props.path`
2026-10-24T20:38:28.3150410Z 258 │
2026-10-24T20:38:28.3150517Z ╰────
2026-10-24T20:38:28.3151034Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3151665Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3151958Z
2026-10-24T20:38:28.3152146Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3152476Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
2026-10-24T20:38:28.3152695Z 292 │ <SourceText
2026-10-24T20:38:28.3152948Z 293 │ key={`${index}:${tokenIndex}`}
2026-10-24T20:38:28.3153217Z · ──────────────────────────────
2026-10-24T20:38:28.3153406Z 294 │ style={{
2026-10-24T20:38:28.3153542Z ╰────
2026-10-24T20:38:28.3153736Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3153889Z
2026-10-24T20:38:28.3154076Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3154402Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
2026-10-24T20:38:28.3154615Z 308 │ return (
2026-10-24T20:38:28.3154778Z 309 │ <SourceText key={index}>
2026-10-24T20:38:28.3154973Z · ───────────
2026-10-24T20:38:28.3155148Z 310 │ {body}
2026-10-24T20:38:28.3155282Z ╰────
2026-10-24T20:38:28.3155474Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3155625Z
2026-10-24T20:38:28.3155878Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3156253Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
2026-10-24T20:38:28.3156446Z 150 │
2026-10-24T20:38:28.3156567Z 151 │ useEffect(() => {
2026-10-24T20:38:28.3156716Z · ────┬────
2026-10-24T20:38:28.3156923Z · ╰── This is the containing effect
2026-10-24T20:38:28.3157135Z 152 │ if (!controlledSelectedPath) {
2026-10-24T20:38:28.3157292Z 153 │ return;
2026-10-24T20:38:28.3157417Z 154 │ }
2026-10-24T20:38:28.3157567Z 155 │ setExpandedPaths((current) => {
2026-10-24T20:38:28.3157745Z · ────────┬───────
2026-10-24T20:38:28.3158002Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3158287Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath);
2026-10-24T20:38:28.3158471Z ╰────
2026-10-24T20:38:28.3159115Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3159973Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3160276Z
2026-10-24T20:38:28.3160730Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-24T20:38:28.3161325Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7]
2026-10-24T20:38:28.3161572Z 1679 │ yield* harness.replaceSession;
2026-10-24T20:38:28.3161883Z 1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T20:38:28.3162221Z 1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) {
2026-10-24T20:38:28.3162458Z 1682 │ │ break;
2026-10-24T20:38:28.3162692Z 1683 │ │ }
2026-10-24T20:38:28.3162921Z 1684 │ │ yield* Effect.yieldNow;
2026-10-24T20:38:28.3163168Z 1685 │ ╰─▶ }
2026-10-24T20:38:28.3163372Z 1686 │ yield* Queue.offer(
2026-10-24T20:38:28.3163512Z ╰────
2026-10-24T20:38:28.3163565Z
2026-10-24T20:38:28.3164021Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-24T20:38:28.3164580Z ╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7]
2026-10-24T20:38:28.3164824Z 1788 │ yield* harness.replaceSession;
2026-10-24T20:38:28.3165132Z 1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T20:38:28.3165476Z 1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break;
2026-10-24T20:38:28.3165734Z 1791 │ │ yield* Effect.yieldNow;
2026-10-24T20:38:28.3165981Z 1792 │ ╰─▶ }
2026-10-24T20:38:28.3166237Z 1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2);
2026-10-24T20:38:28.3166425Z ╰────
2026-10-24T20:38:28.3166478Z
2026-10-24T20:38:28.3166657Z ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T20:38:28.3167013Z ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34]
2026-10-24T20:38:28.3167263Z 115 │ return [...commands];
2026-10-24T20:38:28.3167483Z 116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]);
2026-10-24T20:38:28.3167736Z · ─────────┬─────────
2026-10-24T20:38:28.3168032Z · ╰── Unnecessary dependency `registrationVersion`
2026-10-24T20:38:28.3168251Z 117 │
2026-10-24T20:38:28.3168357Z ╰────
2026-10-24T20:38:28.3168724Z help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-24T20:38:28.3169322Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3169618Z
2026-10-24T20:38:28.3169832Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-24T20:38:28.3170157Z ╭─[apps/web/src/lib/announce.browser.test.ts:41:46]
2026-10-24T20:38:28.3170336Z 40 │
2026-10-24T20:38:28.3170497Z 41 │ expect(regionTexts()).toEqual([...first].reverse());
2026-10-24T20:38:28.3170727Z · ───────
2026-10-24T20:38:28.3170943Z 42 │ expect(regionTexts()).toContain("Claude");
2026-10-24T20:38:28.3171129Z ╰────
2026-10-24T20:38:28.3171434Z help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-24T20:38:28.3171681Z
2026-10-24T20:38:28.3172188Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-24T20:38:28.3172801Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
2026-10-24T20:38:28.3173049Z 520 │ })).delivery;
2026-10-24T20:38:28.3173323Z 521 │ ╭─▶ while (delivery.outcome === "accepted") {
2026-10-24T20:38:28.3173614Z 522 │ │ yield* Effect.yieldNow;
2026-10-24T20:38:28.3173877Z 523 │ │ delivery = (yield* service.getWebhookDelivery({
2026-10-24T20:38:28.3174124Z 524 │ │ id: task.id,
2026-10-24T20:38:28.3174348Z 525 │ │ deliveryId: deliveryId!,
2026-10-24T20:38:28.3174568Z 526 │ │ })).delivery;
2026-10-24T20:38:28.3174813Z 527 │ ╰─▶ }
2026-10-24T20:38:28.3175067Z 528 │ assert.equal(delivery.outcome, "dispatch_failed");
2026-10-24T20:38:28.3175240Z ╰────
2026-10-24T20:38:28.3175294Z
2026-10-24T20:38:28.3175499Z ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used.
2026-10-24T20:38:28.3175818Z ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10]
2026-10-24T20:38:28.3175997Z 78 │
2026-10-24T20:38:28.3176186Z 79 │ function describeSchedule(schedule: ScheduledTaskSchedule): string {
2026-10-24T20:38:28.3176413Z · ────────┬───────
2026-10-24T20:38:28.3176649Z · ╰── 'describeSchedule' is declared here
2026-10-24T20:38:28.3176894Z 80 │ if (schedule.type === "webhook") return "On webhook";
2026-10-24T20:38:28.3177066Z ╰────
2026-10-24T20:38:28.3177222Z help: Consider removing this declaration.
2026-10-24T20:38:28.3177337Z
2026-10-24T20:38:28.3177489Z ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3177796Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5]
2026-10-24T20:38:28.3178009Z 35 │
2026-10-24T20:38:28.3178196Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0);
2026-10-24T20:38:28.3178423Z · ────────┬────────
2026-10-24T20:38:28.3178656Z · ╰── `inspectorProgress` originates here
2026-10-24T20:38:28.3178887Z 37 │ const { renderedInspectorWidth } = props;
2026-10-24T20:38:28.3179121Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
2026-10-24T20:38:28.3179316Z 39 │
2026-10-24T20:38:28.3179450Z 40 │ const onClosed = props.onClosed;
2026-10-24T20:38:28.3179608Z 41 │ useEffect(() => {
2026-10-24T20:38:28.3179777Z 42 │ inspectorProgress.value = withTiming(
2026-10-24T20:38:28.3179962Z · ────────┬────────
2026-10-24T20:38:28.3180197Z · ╰── `inspectorProgress` cannot be modified
2026-10-24T20:38:28.3180414Z 43 │ inspectorVisible ? 1 : 0,
2026-10-24T20:38:28.3180555Z ╰────
2026-10-24T20:38:28.3180901Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T20:38:28.3181451Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3181740Z
2026-10-24T20:38:28.3181943Z ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3182284Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7]
2026-10-24T20:38:28.3182535Z 37 │ const { renderedInspectorWidth } = props;
2026-10-24T20:38:28.3182769Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
2026-10-24T20:38:28.3182996Z · ──────────┬─────────
2026-10-24T20:38:28.3183244Z · ╰── `renderedContentWidth` originates here
2026-10-24T20:38:28.3183441Z 39 │
2026-10-24T20:38:28.3183573Z 40 │ const onClosed = props.onClosed;
2026-10-24T20:38:28.3183728Z 41 │ useEffect(() => {
2026-10-24T20:38:28.3183893Z 42 │ inspectorProgress.value = withTiming(
2026-10-24T20:38:28.3184071Z 43 │ inspectorVisible ? 1 : 0,
2026-10-24T20:38:28.3184238Z 44 │ WORKSPACE_PANE_TIMING,
2026-10-24T20:38:28.3184396Z 45 │ (finished) => {
2026-10-24T20:38:28.3184611Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) {
2026-10-24T20:38:28.3184824Z 47 │ runOnJS(onClosed)();
2026-10-24T20:38:28.3184968Z 48 │ }
2026-10-24T20:38:28.3185085Z 49 │ },
2026-10-24T20:38:28.3185197Z 50 │ );
2026-10-24T20:38:28.3185384Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0;
2026-10-24T20:38:28.3185602Z 52 │ renderedInspectorWidth.set(
2026-10-24T20:38:28.3185836Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING),
2026-10-24T20:38:28.3186040Z 54 │ );
2026-10-24T20:38:28.3186151Z 55 │ }, [
2026-10-24T20:38:28.3186279Z 56 │ inspectorProgress,
2026-10-24T20:38:28.3186427Z 57 │ inspectorVisible,
2026-10-24T20:38:28.3186577Z 58 │ inspectorWidth,
2026-10-24T20:38:28.3186719Z 59 │ onClosed,
2026-10-24T20:38:28.3186859Z 60 │ renderedInspectorWidth,
2026-10-24T20:38:28.3187006Z 61 │ resizing,
2026-10-24T20:38:28.3187125Z 62 │ ]);
2026-10-24T20:38:28.3187235Z 63 │
2026-10-24T20:38:28.3187349Z 64 │ useEffect(() => {
2026-10-24T20:38:28.3187517Z 65 │ const targetWidth = inspectorWidth ?? 0;
2026-10-24T20:38:28.3187704Z 66 │ if (!inspectorVisible || resizing) {
2026-10-24T20:38:28.3187901Z 67 │ renderedContentWidth.value = targetWidth;
2026-10-24T20:38:28.3188095Z · ──────────┬─────────
2026-10-24T20:38:28.3188250Z · ╰── `renderedContentWidth` cannot be modified
2026-10-24T20:38:28.3188308Z 68 │ return;
2026-10-24T20:38:28.3188359Z ╰────
2026-10-24T20:38:28.3188626Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T20:38:28.3188931Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3188933Z
2026-10-24T20:38:28.3189098Z ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T20:38:28.3189214Z ╭─[apps/server/src/processRunner.test.ts:266:14]
2026-10-24T20:38:28.3189267Z 265 │
2026-10-24T20:38:28.3189370Z 266 │ for (const {} of ["timeout", "success"] as const) {
2026-10-24T20:38:28.3189440Z · ──
2026-10-24T20:38:28.3189491Z 267 │ }
2026-10-24T20:38:28.3189542Z ╰────
2026-10-24T20:38:28.3189827Z help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T20:38:28.3189858Z
2026-10-24T20:38:28.3190055Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3190213Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7]
2026-10-24T20:38:28.3190267Z 154 │ }
2026-10-24T20:38:28.3190333Z 155 │ }, [wrappedRender]);
2026-10-24T20:38:28.3190409Z · ──────┬──────
2026-10-24T20:38:28.3190552Z · ╰── Unnecessary dependency `wrappedRender`
2026-10-24T20:38:28.3190604Z 156 │
2026-10-24T20:38:28.3190653Z ╰────
2026-10-24T20:38:28.3190978Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3191295Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3191298Z
2026-10-24T20:38:28.3191576Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-24T20:38:28.3191734Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42]
2026-10-24T20:38:28.3191787Z 799 │ >
2026-10-24T20:38:28.3191909Z 800 │ <AdaptiveWorkspaceContext.Provider value={contextValue}>
2026-10-24T20:38:28.3192027Z · ────────────────────
2026-10-24T20:38:28.3192125Z 801 │ <WindowHingeContext value={windowHinge}>
2026-10-24T20:38:28.3192175Z ╰────
2026-10-24T20:38:28.3192398Z help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-24T20:38:28.3192538Z Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-24T20:38:28.3192540Z
2026-10-24T20:38:28.3192725Z ⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used.
2026-10-24T20:38:28.3192855Z ╭─[packages/client-runtime/src/state/threadSort.ts:4:13]
2026-10-24T20:38:28.3192969Z 3 │ import type { EnvironmentThreadShell } from "./models.ts";
2026-10-24T20:38:28.3193046Z 4 │ import * as Arr from "effect/Array";
2026-10-24T20:38:28.3193116Z · ─┬─
2026-10-24T20:38:28.3193238Z · ╰── 'Arr' is imported here
2026-10-24T20:38:28.3193319Z 5 │ import * as Order from "effect/Order";
2026-10-24T20:38:28.3193429Z ╰────
2026-10-24T20:38:28.3193562Z help: Consider removing this import.
2026-10-24T20:38:28.3193564Z
2026-10-24T20:38:28.3193753Z ⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used.
2026-10-24T20:38:28.3193879Z ╭─[packages/client-runtime/src/state/threadSort.ts:5:13]
2026-10-24T20:38:28.3193956Z 4 │ import * as Arr from "effect/Array";
2026-10-24T20:38:28.3194037Z 5 │ import * as Order from "effect/Order";
2026-10-24T20:38:28.3194109Z · ──┬──
2026-10-24T20:38:28.3194235Z · ╰── 'Order' is imported here
2026-10-24T20:38:28.3194284Z 6 │
2026-10-24T20:38:28.3194337Z ╰────
2026-10-24T20:38:28.3194431Z help: Consider removing this import.
2026-10-24T20:38:28.3194434Z
2026-10-24T20:38:28.3194581Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3194745Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14]
2026-10-24T20:38:28.3194827Z 26 │ const latestInput = useRef(input);
2026-10-24T20:38:28.3194902Z 27 │ latestInput.current = input;
2026-10-24T20:38:28.3195008Z · ─────┬─────────┬───
2026-10-24T20:38:28.3195182Z · │ ╰── Cannot update ref value during render
2026-10-24T20:38:28.3195294Z · ╰── This value is a ref
2026-10-24T20:38:28.3195368Z 28 │ const mounted = useRef(true);
2026-10-24T20:38:28.3195419Z ╰────
2026-10-24T20:38:28.3195890Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3196182Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3196185Z
2026-10-24T20:38:28.3196337Z ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3196497Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
2026-10-24T20:38:28.3196600Z 65 │ const [expanded, setExpanded] = useState(false);
2026-10-24T20:38:28.3196679Z 66 │ const progress = useSharedValue(0);
2026-10-24T20:38:28.3196751Z · ────┬───
2026-10-24T20:38:28.3196879Z · ╰── `progress` originates here
2026-10-24T20:38:28.3196949Z 67 │ useEffect(() => {
2026-10-24T20:38:28.3197070Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
2026-10-24T20:38:28.3197139Z · ────┬───
2026-10-24T20:38:28.3197268Z · ╰── `progress` cannot be modified
2026-10-24T20:38:28.3197337Z 69 │ }, [expanded, progress]);
2026-10-24T20:38:28.3197385Z ╰────
2026-10-24T20:38:28.3197643Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T20:38:28.3197940Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3197943Z
2026-10-24T20:38:28.3198092Z ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3198299Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5]
2026-10-24T20:38:28.3198382Z 90 │ }) {
2026-10-24T20:38:28.3198495Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0);
2026-10-24T20:38:28.3198566Z · ────┬───
2026-10-24T20:38:28.3198690Z · ╰── `rotation` originates here
2026-10-24T20:38:28.3198758Z 92 │ useLayoutEffect(() => {
2026-10-24T20:38:28.3198897Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING);
2026-10-24T20:38:28.3198966Z · ────┬───
2026-10-24T20:38:28.3199090Z · ╰── `rotation` cannot be modified
2026-10-24T20:38:28.3199165Z 94 │ }, [props.hidden, rotation]);
2026-10-24T20:38:28.3199216Z ╰────
2026-10-24T20:38:28.3199478Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T20:38:28.3199775Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3199780Z
2026-10-24T20:38:28.3199932Z ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3200100Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5]
2026-10-24T20:38:28.3200192Z 266 │ const variant = props.variant ?? "plain";
2026-10-24T20:38:28.3200320Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0);
2026-10-24T20:38:28.3200404Z · ────────┬────────
2026-10-24T20:38:28.3200554Z · ╰── `loadingVisibility` originates here
2026-10-24T20:38:28.3200624Z 268 │ useLayoutEffect(() => {
2026-10-24T20:38:28.3200779Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING);
2026-10-24T20:38:28.3200871Z · ────────┬────────
2026-10-24T20:38:28.3201044Z · ╰── `loadingVisibility` cannot be modified
2026-10-24T20:38:28.3201135Z 270 │ }, [loadingVisibility, props.loading]);
2026-10-24T20:38:28.3201185Z ╰────
2026-10-24T20:38:28.3201439Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T20:38:28.3201737Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3201739Z
2026-10-24T20:38:28.3201893Z ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3202059Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5]
2026-10-24T20:38:28.3202111Z 325 │ }) {
2026-10-24T20:38:28.3202266Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0);
2026-10-24T20:38:28.3202352Z · ─────────┬─────────
2026-10-24T20:38:28.3202501Z · ╰── `recordingVisibility` originates here
2026-10-24T20:38:28.3202567Z 327 │ useLayoutEffect(() => {
2026-10-24T20:38:28.3202750Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING);
2026-10-24T20:38:28.3202834Z · ─────────┬─────────
2026-10-24T20:38:28.3203030Z · ╰── `recordingVisibility` cannot be modified
2026-10-24T20:38:28.3203148Z 329 │ }, [props.phase, recordingVisibility]);
2026-10-24T20:38:28.3203199Z ╰────
2026-10-24T20:38:28.3203456Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T20:38:28.3203754Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3203756Z
2026-10-24T20:38:28.3203896Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3204048Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38]
2026-10-24T20:38:28.3204203Z 121 │ const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T20:38:28.3204329Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T20:38:28.3204448Z · ───────────┬──────────
2026-10-24T20:38:28.3204615Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3204731Z 123 │ const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T20:38:28.3204782Z ╰────
2026-10-24T20:38:28.3205245Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3205535Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3205539Z
2026-10-24T20:38:28.3205677Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3205831Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8]
2026-10-24T20:38:28.3205884Z 125 │
2026-10-24T20:38:28.3205990Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3206074Z · ─────────┬────────
2026-10-24T20:38:28.3206219Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3206317Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3206368Z ╰────
2026-10-24T20:38:28.3206828Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3207114Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3207117Z
2026-10-24T20:38:28.3207255Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3207407Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7]
2026-10-24T20:38:28.3207462Z 125 │
2026-10-24T20:38:28.3207565Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3207649Z · ─────────┬─────────
2026-10-24T20:38:28.3207793Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3207941Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3208086Z ╰────
2026-10-24T20:38:28.3208541Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3208825Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3208827Z
2026-10-24T20:38:28.3208965Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3209118Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31]
2026-10-24T20:38:28.3209167Z 125 │
2026-10-24T20:38:28.3209270Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3209384Z · ─────────┬─────────
2026-10-24T20:38:28.3209547Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3209643Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3209693Z ╰────
2026-10-24T20:38:28.3210144Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3210426Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3210428Z
2026-10-24T20:38:28.3210569Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3210724Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30]
2026-10-24T20:38:28.3210776Z 125 │
2026-10-24T20:38:28.3210887Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3211022Z · ──────────┬─────────
2026-10-24T20:38:28.3211184Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3211282Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3211335Z ╰────
2026-10-24T20:38:28.3211785Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3212072Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3212077Z
2026-10-24T20:38:28.3212216Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3212369Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46]
2026-10-24T20:38:28.3212477Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3212662Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3212832Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T20:38:28.3212955Z 129 │ │ onStatus: (status: RecordingStatus) => {
2026-10-24T20:38:28.3213148Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T20:38:28.3213297Z 131 │ │ isFinished: status.isFinished,
2026-10-24T20:38:28.3213468Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T20:38:28.3213569Z 133 │ │ error: status.error,
2026-10-24T20:38:28.3213664Z 134 │ │ url: status.url,
2026-10-24T20:38:28.3213744Z 135 │ │ });
2026-10-24T20:38:28.3213818Z 136 │ │ },
2026-10-24T20:38:28.3214009Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T20:38:28.3214116Z 138 │ │ selectInput: (inputs) => {
2026-10-24T20:38:28.3214273Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T20:38:28.3214416Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T20:38:28.3214577Z 141 │ │ const known = microphoneOrder(preferences.value.microphones);
2026-10-24T20:38:28.3214713Z 142 │ │ const order = rememberMicrophones(known, inputs);
2026-10-24T20:38:28.3214812Z 143 │ │ if (order !== known) {
2026-10-24T20:38:28.3214944Z 144 │ │ registry.set(updateMobilePreferencesAtom, {
2026-10-24T20:38:28.3215055Z 145 │ │ transform: (current) => ({
2026-10-24T20:38:28.3215255Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T20:38:28.3215344Z 147 │ │ }),
2026-10-24T20:38:28.3215423Z 148 │ │ });
2026-10-24T20:38:28.3215501Z 149 │ │ }
2026-10-24T20:38:28.3215638Z 150 │ │ return preferredMicrophoneInput(inputs, order);
2026-10-24T20:38:28.3215714Z 151 │ │ },
2026-10-24T20:38:28.3215840Z 152 │ ├─▶ });
2026-10-24T20:38:28.3216070Z · ╰──── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3216154Z 153 │ recorderRef.current = recorder;
2026-10-24T20:38:28.3216206Z ╰────
2026-10-24T20:38:28.3216708Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3217022Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3217025Z
2026-10-24T20:38:28.3217165Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3217318Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16]
2026-10-24T20:38:28.3217375Z 152 │ });
2026-10-24T20:38:28.3217453Z 153 │ recorderRef.current = recorder;
2026-10-24T20:38:28.3217565Z · ─────┬─────────┬───
2026-10-24T20:38:28.3217751Z · │ ╰── Cannot update ref value during render
2026-10-24T20:38:28.3217865Z · ╰── This value is a ref
2026-10-24T20:38:28.3217966Z 154 │ sessionRef.current = new VoiceInputSession({
2026-10-24T20:38:28.3218016Z ╰────
2026-10-24T20:38:28.3218469Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3218751Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3218753Z
2026-10-24T20:38:28.3218890Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3219045Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48]
2026-10-24T20:38:28.3219131Z 153 │ recorderRef.current = recorder;
2026-10-24T20:38:28.3219319Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({
2026-10-24T20:38:28.3219403Z 155 │ │ recorder,
2026-10-24T20:38:28.3219526Z 156 │ │ getTranscriber: getLocalVoiceTranscriber,
2026-10-24T20:38:28.3219642Z 157 │ │ requestPermission: async () => {
2026-10-24T20:38:28.3219800Z 158 │ │ const permission = await requestRecordingPermissionsAsync();
2026-10-24T20:38:28.3219986Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T20:38:28.3220060Z 160 │ │ },
2026-10-24T20:38:28.3220204Z 161 │ │ configureRecording: configureVoiceRecordingAudio,
2026-10-24T20:38:28.3220339Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T20:38:28.3220470Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T20:38:28.3220577Z 164 │ │ onStateChange: (nextState) =>
2026-10-24T20:38:28.3220665Z 165 │ │ setState({
2026-10-24T20:38:28.3220762Z 166 │ │ state: nextState,
2026-10-24T20:38:28.3220906Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T20:38:28.3221055Z 168 │ │ label: sessionRef.current?.label ?? null,
2026-10-24T20:38:28.3221132Z 169 │ │ }),
2026-10-24T20:38:28.3221302Z 170 │ ├─▶ });
2026-10-24T20:38:28.3221526Z · ╰──── Cannot access ref value during render
2026-10-24T20:38:28.3221582Z 171 │ }
2026-10-24T20:38:28.3221631Z ╰────
2026-10-24T20:38:28.3222087Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3222371Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3222373Z
2026-10-24T20:38:28.3222513Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3222669Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15]
2026-10-24T20:38:28.3222752Z 153 │ recorderRef.current = recorder;
2026-10-24T20:38:28.3222854Z 154 │ sessionRef.current = new VoiceInputSession({
2026-10-24T20:38:28.3222961Z · ─────┬────────┬───
2026-10-24T20:38:28.3223136Z · │ ╰── Cannot update ref value during render
2026-10-24T20:38:28.3223250Z · ╰── This value is a ref
2026-10-24T20:38:28.3223313Z 155 │ recorder,
2026-10-24T20:38:28.3223363Z ╰────
2026-10-24T20:38:28.3223822Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3224104Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3224107Z
2026-10-24T20:38:28.3224246Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3224397Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7]
2026-10-24T20:38:28.3224482Z 184 │ return () => subscription.remove();
2026-10-24T20:38:28.3224545Z 185 │ }, [controller]);
2026-10-24T20:38:28.3224619Z · ─────┬────
2026-10-24T20:38:28.3224760Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3224811Z 186 │
2026-10-24T20:38:28.3224860Z ╰────
2026-10-24T20:38:28.3225321Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3225603Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3225606Z
2026-10-24T20:38:28.3225746Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3225896Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6]
2026-10-24T20:38:28.3225978Z 184 │ return () => subscription.remove();
2026-10-24T20:38:28.3226043Z 185 │ }, [controller]);
2026-10-24T20:38:28.3226119Z · ──────┬─────
2026-10-24T20:38:28.3226304Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3226385Z 186 │
2026-10-24T20:38:28.3226435Z ╰────
2026-10-24T20:38:28.3226888Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3227168Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3227171Z
2026-10-24T20:38:28.3227307Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3227460Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6]
2026-10-24T20:38:28.3227519Z 191 │ },
2026-10-24T20:38:28.3227591Z 192 │ [controller, recorder],
2026-10-24T20:38:28.3227664Z · ─────┬────
2026-10-24T20:38:28.3227802Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3227856Z 193 │ );
2026-10-24T20:38:28.3227906Z ╰────
2026-10-24T20:38:28.3228358Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3228639Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3228641Z
2026-10-24T20:38:28.3228783Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3228940Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20]
2026-10-24T20:38:28.3229028Z 174 │ const controller = session.controller;
2026-10-24T20:38:28.3229112Z 175 │ const recorder = recorderRef.current;
2026-10-24T20:38:28.3229214Z · ─────────┬─────────
2026-10-24T20:38:28.3229367Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3229417Z 176 │
2026-10-24T20:38:28.3229465Z ╰────
2026-10-24T20:38:28.3229920Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3230206Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3230211Z
2026-10-24T20:38:28.3230349Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3230500Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5]
2026-10-24T20:38:28.3230553Z 191 │ },
2026-10-24T20:38:28.3230624Z 192 │ [controller, recorder],
2026-10-24T20:38:28.3230711Z · ───────────┬──────────
2026-10-24T20:38:28.3230863Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3230915Z 193 │ );
2026-10-24T20:38:28.3230994Z ╰────
2026-10-24T20:38:28.3231542Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3231862Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3231864Z
2026-10-24T20:38:28.3231999Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3232152Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20]
2026-10-24T20:38:28.3232242Z 245 │ return () => clearInterval(intervalId);
2026-10-24T20:38:28.3232351Z 246 │ }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T20:38:28.3232435Z · ─────┬────
2026-10-24T20:38:28.3232590Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3232644Z 247 │
2026-10-24T20:38:28.3232698Z ╰────
2026-10-24T20:38:28.3233153Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3233431Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3233434Z
2026-10-24T20:38:28.3233571Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3233724Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6]
2026-10-24T20:38:28.3233815Z 245 │ return () => clearInterval(intervalId);
2026-10-24T20:38:28.3233923Z 246 │ }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T20:38:28.3234048Z · ────────────────────────┬───────────────────────
2026-10-24T20:38:28.3234201Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3234253Z 247 │
2026-10-24T20:38:28.3234301Z ╰────
2026-10-24T20:38:28.3234758Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3235039Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3235042Z
2026-10-24T20:38:28.3235185Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3235340Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5]
2026-10-24T20:38:28.3235406Z 260 │ setOwnerFocused,
2026-10-24T20:38:28.3235470Z 261 │ session,
2026-10-24T20:38:28.3235540Z · ───┬───
2026-10-24T20:38:28.3235676Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3235733Z 262 │ stop,
2026-10-24T20:38:28.3235785Z ╰────
2026-10-24T20:38:28.3237886Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3238250Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3238296Z
2026-10-24T20:38:28.3238437Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3238591Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10]
2026-10-24T20:38:28.3238645Z 250 │
2026-10-24T20:38:28.3238781Z 251 │ ╭─▶ return {
2026-10-24T20:38:28.3238987Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null,
2026-10-24T20:38:28.3239065Z 253 │ │ state,
2026-10-24T20:38:28.3239151Z 254 │ │ audioLevels,
2026-10-24T20:38:28.3239248Z 255 │ │ elapsedSeconds,
2026-10-24T20:38:28.3239376Z 256 │ │ isBusy: voiceInputBlocksSubmission(state),
2026-10-24T20:38:28.3239455Z 257 │ │ ownerKey,
2026-10-24T20:38:28.3239531Z 258 │ │ label,
2026-10-24T20:38:28.3239619Z 259 │ │ focusedOwners,
2026-10-24T20:38:28.3239709Z 260 │ │ setOwnerFocused,
2026-10-24T20:38:28.3239788Z 261 │ │ session,
2026-10-24T20:38:28.3239863Z 262 │ │ stop,
2026-10-24T20:38:28.3239940Z 263 │ │ cancel,
2026-10-24T20:38:28.3240062Z 264 │ ├─▶ };
2026-10-24T20:38:28.3240255Z · ╰──── Cannot access ref value during render
2026-10-24T20:38:28.3240316Z 265 │ }
2026-10-24T20:38:28.3240370Z ╰────
2026-10-24T20:38:28.3240828Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3241150Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3241153Z
2026-10-24T20:38:28.3241305Z ⚠ react(immutability): This value cannot be modified
2026-10-24T20:38:28.3241459Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T20:38:28.3241613Z 121 │ const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T20:38:28.3241736Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T20:38:28.3241815Z · ─────┬─────
2026-10-24T20:38:28.3241947Z · ╰── `audioLevels` originates here
2026-10-24T20:38:28.3242063Z 123 │ const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T20:38:28.3242203Z 124 │ const recorderRef = useRef<LazyVoiceRecorder<RecorderState> | null>(null);
2026-10-24T20:38:28.3242258Z 125 │
2026-10-24T20:38:28.3242362Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T20:38:28.3242458Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T20:38:28.3242592Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T20:38:28.3242684Z 129 │ onStatus: (status: RecordingStatus) => {
2026-10-24T20:38:28.3242859Z 130 │ sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T20:38:28.3242970Z 131 │ isFinished: status.isFinished,
2026-10-24T20:38:28.3243108Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T20:38:28.3243180Z 133 │ error: status.error,
2026-10-24T20:38:28.3243245Z 134 │ url: status.url,
2026-10-24T20:38:28.3243303Z 135 │ });
2026-10-24T20:38:28.3243356Z 136 │ },
2026-10-24T20:38:28.3243517Z 137 │ // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T20:38:28.3243591Z 138 │ selectInput: (inputs) => {
2026-10-24T20:38:28.3243710Z 139 │ const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T20:38:28.3243818Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T20:38:28.3243951Z 141 │ const known = microphoneOrder(preferences.value.microphones);
2026-10-24T20:38:28.3244057Z 142 │ const order = rememberMicrophones(known, inputs);
2026-10-24T20:38:28.3244126Z 143 │ if (order !== known) {
2026-10-24T20:38:28.3244227Z 144 │ registry.set(updateMobilePreferencesAtom, {
2026-10-24T20:38:28.3244308Z 145 │ transform: (current) => ({
2026-10-24T20:38:28.3244476Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T20:38:28.3244536Z 147 │ }),
2026-10-24T20:38:28.3244593Z 148 │ });
2026-10-24T20:38:28.3244649Z 149 │ }
2026-10-24T20:38:28.3244754Z 150 │ return preferredMicrophoneInput(inputs, order);
2026-10-24T20:38:28.3244808Z 151 │ },
2026-10-24T20:38:28.3244860Z 152 │ });
2026-10-24T20:38:28.3244939Z 153 │ recorderRef.current = recorder;
2026-10-24T20:38:28.3245044Z 154 │ sessionRef.current = new VoiceInputSession({
2026-10-24T20:38:28.3245104Z 155 │ recorder,
2026-10-24T20:38:28.3245199Z 156 │ getTranscriber: getLocalVoiceTranscriber,
2026-10-24T20:38:28.3245280Z 157 │ requestPermission: async () => {
2026-10-24T20:38:28.3245406Z 158 │ const permission = await requestRecordingPermissionsAsync();
2026-10-24T20:38:28.3245556Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T20:38:28.3245610Z 160 │ },
2026-10-24T20:38:28.3245717Z 161 │ configureRecording: configureVoiceRecordingAudio,
2026-10-24T20:38:28.3245818Z 162 │ releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T20:38:28.3245917Z 163 │ deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T20:38:28.3245994Z 164 │ onStateChange: (nextState) =>
2026-10-24T20:38:28.3246056Z 165 │ setState({
2026-10-24T20:38:28.3246172Z 166 │ state: nextState,
2026-10-24T20:38:28.3246303Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T20:38:28.3246396Z 168 │ label: sessionRef.current?.label ?? null,
2026-10-24T20:38:28.3246453Z 169 │ }),
2026-10-24T20:38:28.3246506Z 170 │ });
2026-10-24T20:38:28.3246556Z 171 │ }
2026-10-24T20:38:28.3246606Z 172 │
2026-10-24T20:38:28.3246688Z 173 │ const session = sessionRef.current;
2026-10-24T20:38:28.3246773Z 174 │ const controller = session.controller;
2026-10-24T20:38:28.3246854Z 175 │ const recorder = recorderRef.current;
2026-10-24T20:38:28.3246903Z 176 │
2026-10-24T20:38:28.3246967Z 177 │ useEffect(() => {
2026-10-24T20:38:28.3247112Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => {
2026-10-24T20:38:28.3247252Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the
2026-10-24T20:38:28.3247388Z 180 │ // real background state cancels preparation; recorder status handles
2026-10-24T20:38:28.3247494Z 181 │ // calls and route interruptions during capture.
2026-10-24T20:38:28.3247626Z 182 │ if (nextState === "background") controller.appMovedToBackground();
2026-10-24T20:38:28.3247678Z 183 │ });
2026-10-24T20:38:28.3247761Z 184 │ return () => subscription.remove();
2026-10-24T20:38:28.3247823Z 185 │ }, [controller]);
2026-10-24T20:38:28.3247875Z 186 │
2026-10-24T20:38:28.3247932Z 187 │ useEffect(
2026-10-24T20:38:28.3247991Z 188 │ () => () => {
2026-10-24T20:38:28.3248061Z 189 │ controller.dispose();
2026-10-24T20:38:28.3248127Z 190 │ recorder.release();
2026-10-24T20:38:28.3248179Z 191 │ },
2026-10-24T20:38:28.3248245Z 192 │ [controller, recorder],
2026-10-24T20:38:28.3248301Z 193 │ );
2026-10-24T20:38:28.3248351Z 194 │
2026-10-24T20:38:28.3248413Z 195 │ useEffect(() => {
2026-10-24T20:38:28.3248502Z 196 │ if (state.phase !== "recording") return;
2026-10-24T20:38:28.3248552Z 197 │
2026-10-24T20:38:28.3248693Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`;
2026-10-24T20:38:28.3248793Z 199 │ const activation = activateKeepAwakeAsync(tag);
2026-10-24T20:38:28.3248871Z 200 │ void activation.catch(() => {});
2026-10-24T20:38:28.3248932Z 201 │ return () => {
2026-10-24T20:38:28.3249075Z 202 │ // Release after activation settles, even if the recording ends immediately.
2026-10-24T20:38:28.3249209Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {});
2026-10-24T20:38:28.3249261Z 204 │ };
2026-10-24T20:38:28.3249337Z 205 │ }, [keepAwakeId, state.phase]);
2026-10-24T20:38:28.3249390Z 206 │
2026-10-24T20:38:28.3249456Z 207 │ useEffect(() => {
2026-10-24T20:38:28.3249587Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T20:38:28.3249636Z 209 │
2026-10-24T20:38:28.3249752Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T20:38:28.3249901Z 211 │ audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T20:38:28.3250000Z 212 │ audioLevels.value = audioLevelsRef.current;
2026-10-24T20:38:28.3250075Z · ─────┬─────
2026-10-24T20:38:28.3250209Z · ╰── `audioLevels` cannot be modified
2026-10-24T20:38:28.3250262Z 213 │ }
2026-10-24T20:38:28.3250311Z ╰────
2026-10-24T20:38:28.3250625Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T20:38:28.3250996Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3250999Z
2026-10-24T20:38:28.3251192Z ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T20:38:28.3251346Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T20:38:28.3251397Z 206 │
2026-10-24T20:38:28.3251457Z 207 │ useEffect(() => {
2026-10-24T20:38:28.3251531Z · ───┬───
2026-10-24T20:38:28.3251744Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render
2026-10-24T20:38:28.3251881Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T20:38:28.3251930Z 209 │
2026-10-24T20:38:28.3252047Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T20:38:28.3252196Z 211 │ audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T20:38:28.3252294Z 212 │ audioLevels.value = audioLevelsRef.current;
2026-10-24T20:38:28.3252367Z · ─────┬─────
2026-10-24T20:38:28.3252496Z · ╰── This modifies `audioLevels`
2026-10-24T20:38:28.3252548Z 213 │ }
2026-10-24T20:38:28.3252597Z ╰────
2026-10-24T20:38:28.3252929Z help: This argument is a function which may reassign or mutate `audioLevels` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-24T20:38:28.3253234Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T20:38:28.3253238Z
2026-10-24T20:38:28.3253444Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-24T20:38:28.3253575Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40]
2026-10-24T20:38:28.3253647Z 89 │ let cursor = prompt.length;
2026-10-24T20:38:28.3253749Z 90 │ for (const occurrence of occurrences.reverse()) {
2026-10-24T20:38:28.3253850Z · ───────
2026-10-24T20:38:28.3253929Z 91 │ let { start, end } = occurrence;
2026-10-24T20:38:28.3253979Z ╰────
2026-10-24T20:38:28.3254231Z help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-24T20:38:28.3254239Z
2026-10-24T20:38:28.3254403Z ⚠ eslint(no-control-regex): Unexpected control character
2026-10-24T20:38:28.3254592Z ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46]
2026-10-24T20:38:28.3254726Z 219 │ <Text selectable className="font-mono text-sm text-foreground">
2026-10-24T20:38:28.3254865Z 220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")}
2026-10-24T20:38:28.3254970Z · ──┬─
2026-10-24T20:38:28.3255130Z · ╰── 'U+001B' is a control character.
2026-10-24T20:38:28.3255192Z 221 │ </Text>
2026-10-24T20:38:28.3255240Z ╰────
2026-10-24T20:38:28.3255517Z help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression.
2026-10-24T20:38:28.3255549Z
2026-10-24T20:38:28.3255745Z ⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining
2026-10-24T20:38:28.3255908Z ╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8]
2026-10-24T20:38:28.3255972Z 1782 │ assert.equal(
2026-10-24T20:38:28.3256110Z 1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId,
2026-10-24T20:38:28.3256210Z · ──────────────────────────
2026-10-24T20:38:28.3256288Z 1784 │ stored.attachments[0]?.id,
2026-10-24T20:38:28.3256337Z ╰────
2026-10-24T20:38:28.3256503Z help: If this short-circuits with 'undefined' the evaluation will throw TypeError
2026-10-24T20:38:28.3256505Z
2026-10-24T20:38:28.3256770Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3256900Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7]
2026-10-24T20:38:28.3256950Z 339 │
2026-10-24T20:38:28.3257046Z 340 │ const layerTest = AnalyticsService.layerTest;
2026-10-24T20:38:28.3257118Z · ────┬────
2026-10-24T20:38:28.3257244Z · ╰── 'layerTest' is declared here
2026-10-24T20:38:28.3257293Z ╰────
2026-10-24T20:38:28.3257392Z help: Consider removing this declaration.
2026-10-24T20:38:28.3257395Z
2026-10-24T20:38:28.3257570Z ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T20:38:28.3257725Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85]
2026-10-24T20:38:28.3257830Z 99 │ const startEditor = startScheduledTaskEditor;
2026-10-24T20:38:28.3258008Z 100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]);
2026-10-24T20:38:28.3258149Z · ─────┬─────
2026-10-24T20:38:28.3258347Z · ╰── Unnecessary dependency `startEditor`
2026-10-24T20:38:28.3258424Z 101 │ const readEditor = useCallback(
2026-10-24T20:38:28.3258471Z ╰────
2026-10-24T20:38:28.3258782Z help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-24T20:38:28.3259097Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3259102Z
2026-10-24T20:38:28.3259276Z ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T20:38:28.3259429Z ╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7]
2026-10-24T20:38:28.3259489Z 120 │ setEditor,
2026-10-24T20:38:28.3259550Z 121 │ startEditor,
2026-10-24T20:38:28.3259623Z · ─────┬─────
2026-10-24T20:38:28.3259763Z · ╰── Unnecessary dependency `startEditor`
2026-10-24T20:38:28.3259823Z 122 │ hasChanges,
2026-10-24T20:38:28.3259872Z ╰────
2026-10-24T20:38:28.3260226Z help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
2026-10-24T20:38:28.3260558Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3260561Z
2026-10-24T20:38:28.3260757Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T20:38:28.3260895Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8]
2026-10-24T20:38:28.3260995Z 2 │ AuthDiagnosticsReadScope,
2026-10-24T20:38:28.3261061Z 3 │ type AuthSessionState,
2026-10-24T20:38:28.3261141Z · ────────┬───────
2026-10-24T20:38:28.3261280Z · ╰── 'AuthSessionState' is imported here
2026-10-24T20:38:28.3261346Z 4 │ sessionGrantsScope,
2026-10-24T20:38:28.3261399Z ╰────
2026-10-24T20:38:28.3261496Z help: Consider removing this import.
2026-10-24T20:38:28.3261499Z
2026-10-24T20:38:28.3261717Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
2026-10-24T20:38:28.3261883Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15]
2026-10-24T20:38:28.3261949Z 1997 │ assert.equal(
2026-10-24T20:38:28.3262091Z 1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text,
2026-10-24T20:38:28.3262167Z · ──────
2026-10-24T20:38:28.3262246Z 1999 │ "authoritative answer",
2026-10-24T20:38:28.3262295Z ╰────
2026-10-24T20:38:28.3262460Z help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
2026-10-24T20:38:28.3262462Z
2026-10-24T20:38:28.3262932Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-24T20:38:28.3263098Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7]
2026-10-24T20:38:28.3263273Z 3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped);
2026-10-24T20:38:28.3263473Z 3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) {
2026-10-24T20:38:28.3263579Z 3952 │ │ yield* Effect.yieldNow;
2026-10-24T20:38:28.3263707Z 3953 │ ╰─▶ }
2026-10-24T20:38:28.3263830Z 3954 │ const responseExit = yield* Fiber.join(responseFiber);
2026-10-24T20:38:28.3263881Z ╰────
2026-10-24T20:38:28.3263884Z
2026-10-24T20:38:28.3264337Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-24T20:38:28.3264499Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9]
2026-10-24T20:38:28.3264587Z 6061 │ .pipe(Effect.forkScoped);
2026-10-24T20:38:28.3264765Z 6062 │ ╭─▶ while (promptGates.length < 1) {
2026-10-24T20:38:28.3264871Z 6063 │ │ yield* Effect.yieldNow;
2026-10-24T20:38:28.3265000Z 6064 │ ╰─▶ }
2026-10-24T20:38:28.3265210Z 6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired");
2026-10-24T20:38:28.3265293Z ╰────
2026-10-24T20:38:28.3265295Z
2026-10-24T20:38:28.3265747Z ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
2026-10-24T20:38:28.3265909Z ╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9]
2026-10-24T20:38:28.3265993Z 6196 │ .pipe(Effect.forkScoped);
2026-10-24T20:38:28.3266169Z 6197 │ ╭─▶ while (promptGates.length < 2) {
2026-10-24T20:38:28.3266274Z 6198 │ │ yield* Effect.yieldNow;
2026-10-24T20:38:28.3266407Z 6199 │ ╰─▶ }
2026-10-24T20:38:28.3266569Z 6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) {
2026-10-24T20:38:28.3266619Z ╰────
2026-10-24T20:38:28.3266621Z
2026-10-24T20:38:28.3266874Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3267038Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10602:7]
2026-10-24T20:38:28.3267090Z 10601 │
2026-10-24T20:38:28.3267160Z 10602 │ const layer: Layer.Layer<
2026-10-24T20:38:28.3267231Z · ──┬──
2026-10-24T20:38:28.3267355Z · ╰── 'layer' is declared here
2026-10-24T20:38:28.3267452Z 10603 │ ProviderAdapter.ProviderAdapterV2,
2026-10-24T20:38:28.3267504Z ╰────
2026-10-24T20:38:28.3267606Z help: Consider removing this declaration.
2026-10-24T20:38:28.3267609Z
2026-10-24T20:38:28.3267931Z ⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3268087Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7]
2026-10-24T20:38:28.3268138Z 1443 │
2026-10-24T20:38:28.3268250Z 1444 │ const layerCodexAppServerClientFactoryCommand = (
2026-10-24T20:38:28.3268363Z · ───────────────────┬───────────────────
2026-10-24T20:38:28.3268563Z · ╰── 'layerCodexAppServerClientFactoryCommand' is declared here
2026-10-24T20:38:28.3268685Z 1445 │ options: CodexClient.CodexAppServerClientOptions & {
2026-10-24T20:38:28.3268737Z ╰────
2026-10-24T20:38:28.3268836Z help: Consider removing this declaration.
2026-10-24T20:38:28.3268839Z
2026-10-24T20:38:28.3269087Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3269242Z ╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7]
2026-10-24T20:38:28.3269293Z 1679 │
2026-10-24T20:38:28.3269361Z 1680 │ const layer: Layer.Layer<
2026-10-24T20:38:28.3269428Z · ──┬──
2026-10-24T20:38:28.3269547Z · ╰── 'layer' is declared here
2026-10-24T20:38:28.3269636Z 1681 │ ProviderAdapter.ProviderAdapterV2,
2026-10-24T20:38:28.3269685Z ╰────
2026-10-24T20:38:28.3269830Z help: Consider removing this declaration.
2026-10-24T20:38:28.3269911Z
2026-10-24T20:38:28.3270278Z ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownOption(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T20:38:28.3270400Z ╭─[packages/shared/src/otelEnvironment.ts:146:14]
2026-10-24T20:38:28.3270457Z 145 │ name,
2026-10-24T20:38:28.3270591Z 146 │ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()),
2026-10-24T20:38:28.3270692Z · ──────────────────────────
2026-10-24T20:38:28.3270812Z 147 │ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`,
2026-10-24T20:38:28.3270875Z ╰────
2026-10-24T20:38:28.3270878Z
2026-10-24T20:38:28.3271155Z ⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used.
2026-10-24T20:38:28.3271391Z ╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10]
2026-10-24T20:38:28.3271444Z 959 │
2026-10-24T20:38:28.3271549Z 960 │ function layerClaudeAgentSdkReplayQueryRunner(
2026-10-24T20:38:28.3271658Z · ──────────────────┬─────────────────
2026-10-24T20:38:28.3271850Z · ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here
2026-10-24T20:38:28.3271950Z 961 │ transcript: ClaudeAgentSdkReplayTranscript,
2026-10-24T20:38:28.3272000Z ╰────
2026-10-24T20:38:28.3272098Z help: Consider removing this declaration.
2026-10-24T20:38:28.3272100Z
2026-10-24T20:38:28.3272319Z ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used.
2026-10-24T20:38:28.3272481Z ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10]
2026-10-24T20:38:28.3272535Z 1397 │
2026-10-24T20:38:28.3272620Z 1398 │ function assertUserMessagesExclude(
2026-10-24T20:38:28.3272719Z · ────────────┬────────────
2026-10-24T20:38:28.3272882Z · ╰── 'assertUserMessagesExclude' is declared here
2026-10-24T20:38:28.3272987Z 1399 │ projection: OrchestrationV2ThreadProjection,
2026-10-24T20:38:28.3273036Z ╰────
2026-10-24T20:38:28.3273134Z help: Consider removing this declaration.
2026-10-24T20:38:28.3273136Z
2026-10-24T20:38:28.3273314Z ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
2026-10-24T20:38:28.3273419Z ╭─[packages/shared/src/qrCode.ts:458:44]
2026-10-24T20:38:28.3273548Z 457 │ ): Array<byte> {
2026-10-24T20:38:28.3273693Z 458 │ let result: Array<byte> = divisor.map((_) => 0);
2026-10-24T20:38:28.3273788Z · ┬
2026-10-24T20:38:28.3273928Z · ╰── '_' is declared here
2026-10-24T20:38:28.3273997Z 459 │ for (const b of data) {
2026-10-24T20:38:28.3274047Z ╰────
2026-10-24T20:38:28.3274146Z help: Consider removing this parameter.
2026-10-24T20:38:28.3274148Z
2026-10-24T20:38:28.3274342Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T20:38:28.3274471Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8]
2026-10-24T20:38:28.3274541Z 2 │ AuthFilesystemReadScope,
2026-10-24T20:38:28.3274607Z 3 │ type AuthSessionState,
2026-10-24T20:38:28.3274694Z · ────────┬───────
2026-10-24T20:38:28.3274835Z · ╰── 'AuthSessionState' is imported here
2026-10-24T20:38:28.3274907Z 4 │ type FilesystemBrowseEntry,
2026-10-24T20:38:28.3274956Z ╰────
2026-10-24T20:38:28.3275052Z help: Consider removing this import.
2026-10-24T20:38:28.3275055Z
2026-10-24T20:38:28.3275248Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3275407Z ╭─[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33]
2026-10-24T20:38:28.3275499Z 113 │ return () => cancelAnimationFrame(frame);
2026-10-24T20:38:28.3275595Z 114 │ }, [restoreSearch, tabActive, bottomSearch]);
2026-10-24T20:38:28.3275696Z · ──────┬─────
2026-10-24T20:38:28.3275860Z · ╰── Unnecessary dependency `bottomSearch`
2026-10-24T20:38:28.3275962Z 115 │ const composeButton = nativeToolbarCompose ? (
2026-10-24T20:38:28.3276012Z ╰────
2026-10-24T20:38:28.3276304Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3276609Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3276612Z
2026-10-24T20:38:28.3276794Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops
2026-10-24T20:38:28.3276914Z ╭─[packages/client-runtime/src/state/shell.ts:189:5]
2026-10-24T20:38:28.3277025Z 186 │ let waiting = yield* Ref.get(awaitingCompletion);
2026-10-24T20:38:28.3277092Z 187 │ let next = initial;
2026-10-24T20:38:28.3277159Z · ──┬─
2026-10-24T20:38:28.3277276Z · ╰── From this accumulator
2026-10-24T20:38:28.3277353Z 188 │ let receivedSnapshot = false;
2026-10-24T20:38:28.3277427Z 189 │ for (const item of items) {
2026-10-24T20:38:28.3277493Z · ─┬─
2026-10-24T20:38:28.3277593Z · ╰── For this loop
2026-10-24T20:38:28.3277681Z 190 │ if (item.kind === "synchronized") {
2026-10-24T20:38:28.3277745Z 191 │ waiting = false;
2026-10-24T20:38:28.3277833Z 192 │ if (Option.isSome(next.snapshot)) {
2026-10-24T20:38:28.3277946Z 193 │ next = { ...next, status: "live", error: Option.none() };
2026-10-24T20:38:28.3278078Z · ───┬───
2026-10-24T20:38:28.3278229Z · ╰── From this spread
2026-10-24T20:38:28.3278287Z 194 │ }
2026-10-24T20:38:28.3278335Z ╰────
2026-10-24T20:38:28.3278486Z help: Consider using `Object.assign()` to mutate the accumulator instead.
2026-10-24T20:38:28.3278638Z note: Using spreads within accumulators leads to `O(n^2)` time complexity.
2026-10-24T20:38:28.3278641Z
2026-10-24T20:38:28.3278818Z ⚠ react(static-components): Cannot create components during render
2026-10-24T20:38:28.3278972Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
2026-10-24T20:38:28.3279057Z 196 │ const { onInput, onResize } = props;
2026-10-24T20:38:28.3279204Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
2026-10-24T20:38:28.3279332Z · ────────────────┬───────────────
2026-10-24T20:38:28.3279511Z · ╰── The component is created during render here
2026-10-24T20:38:28.3279634Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
2026-10-24T20:38:28.3279685Z 199 │
2026-10-24T20:38:28.3279751Z 200 │ useEffect(() => {
2026-10-24T20:38:28.3279834Z 201 │ terminalDebugLog("native:surface", {
2026-10-24T20:38:28.3279919Z 202 │ terminalKey: props.terminalKey,
2026-10-24T20:38:28.3279992Z 203 │ native: hasNativeSurface,
2026-10-24T20:38:28.3280122Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
2026-10-24T20:38:28.3280202Z 205 │ bufferLen: props.buffer.length,
2026-10-24T20:38:28.3280284Z 206 │ isRunning: props.isRunning,
2026-10-24T20:38:28.3280343Z 207 │ });
2026-10-24T20:38:28.3280499Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
2026-10-24T20:38:28.3280582Z 209 │ const handleNativeInput = useCallback(
2026-10-24T20:38:28.3280693Z 210 │ (event: NativeSyntheticEvent<TerminalInputEvent>) => {
2026-10-24T20:38:28.3280787Z 211 │ if (!props.isRunning || props.readOnly) {
2026-10-24T20:38:28.3280858Z 212 │ return;
2026-10-24T20:38:28.3280910Z 213 │ }
2026-10-24T20:38:28.3281024Z 214 │ terminalDebugLog("native:onInput", {
2026-10-24T20:38:28.3281171Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
2026-10-24T20:38:28.3281227Z 216 │ });
2026-10-24T20:38:28.3281309Z 217 │ onInput(event.nativeEvent.data);
2026-10-24T20:38:28.3281362Z 218 │ },
2026-10-24T20:38:28.3281463Z 219 │ [onInput, props.isRunning, props.readOnly],
2026-10-24T20:38:28.3281516Z 220 │ );
2026-10-24T20:38:28.3281602Z 221 │ const handleNativeResize = useCallback(
2026-10-24T20:38:28.3281713Z 222 │ (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
2026-10-24T20:38:28.3281774Z 223 │ onResize({
2026-10-24T20:38:28.3281854Z 224 │ cols: event.nativeEvent.cols,
2026-10-24T20:38:28.3281934Z 225 │ rows: event.nativeEvent.rows,
2026-10-24T20:38:28.3281989Z 226 │ });
2026-10-24T20:38:28.3282042Z 227 │ },
2026-10-24T20:38:28.3282101Z 228 │ [onResize],
2026-10-24T20:38:28.3282154Z 229 │ );
2026-10-24T20:38:28.3282203Z 230 │
2026-10-24T20:38:28.3282284Z 231 │ if (NativeTerminalSurfaceView) {
2026-10-24T20:38:28.3282341Z 232 │ return (
2026-10-24T20:38:28.3282417Z 233 │ <View style={props.style}>
2026-10-24T20:38:28.3282616Z 234 │ <NativeTerminalSurfaceView
2026-10-24T20:38:28.3282758Z · ────────────┬────────────
2026-10-24T20:38:28.3282912Z · ╰── This component is created during render
2026-10-24T20:38:28.3283005Z 235 │ appearanceScheme={themeAppearance}
2026-10-24T20:38:28.3283054Z ╰────
2026-10-24T20:38:28.3283295Z help: Components created during render will reset their state each time they are created. Declare components outside of render
2026-10-24T20:38:28.3283608Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-24T20:38:28.3283610Z
2026-10-24T20:38:28.3283799Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3283959Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15]
2026-10-24T20:38:28.3284024Z 71 │ <Pressable
2026-10-24T20:38:28.3284086Z 72 │ key={index}
2026-10-24T20:38:28.3284170Z · ───────────
2026-10-24T20:38:28.3284251Z 73 │ accessibilityRole="button"
2026-10-24T20:38:28.3284300Z ╰────
2026-10-24T20:38:28.3284443Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3284446Z
2026-10-24T20:38:28.3284697Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3284880Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10]
2026-10-24T20:38:28.3284931Z 117 │
2026-10-24T20:38:28.3284999Z 118 │ useEffect(() => {
2026-10-24T20:38:28.3285070Z · ────┬────
2026-10-24T20:38:28.3285196Z · ╰── This is the containing effect
2026-10-24T20:38:28.3285273Z 119 │ void refreshNotifications();
2026-10-24T20:38:28.3285360Z · ──────────┬─────────
2026-10-24T20:38:28.3285528Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3285667Z 120 │ const subscription = AppState.addEventListener("change", (state) => {
2026-10-24T20:38:28.3285715Z ╰────
2026-10-24T20:38:28.3286311Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3286634Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3286637Z
2026-10-24T20:38:28.3286887Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3287069Z ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7]
2026-10-24T20:38:28.3287119Z 125 │
2026-10-24T20:38:28.3287181Z 126 │ useEffect(() => {
2026-10-24T20:38:28.3287250Z · ────┬────
2026-10-24T20:38:28.3287373Z · ╰── This is the containing effect
2026-10-24T20:38:28.3287435Z 127 │ if (!isLoaded) {
2026-10-24T20:38:28.3287565Z 128 │ setLiveActivityStatus("checking");
2026-10-24T20:38:28.3287679Z · ──────────┬──────────
2026-10-24T20:38:28.3287846Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3287907Z 129 │ return;
2026-10-24T20:38:28.3287955Z ╰────
2026-10-24T20:38:28.3288541Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3288853Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3288856Z
2026-10-24T20:38:28.3289109Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3289264Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5]
2026-10-24T20:38:28.3289428Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate }));
2026-10-24T20:38:28.3289491Z 113 │ useEffect(() => {
2026-10-24T20:38:28.3289559Z · ────┬────
2026-10-24T20:38:28.3289683Z · ╰── This is the containing effect
2026-10-24T20:38:28.3289842Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) {
2026-10-24T20:38:28.3289901Z 115 │ return;
2026-10-24T20:38:28.3289954Z 116 │ }
2026-10-24T20:38:28.3290073Z 117 │ setEntry({ key: input.targetKey, location: candidate });
2026-10-24T20:38:28.3290143Z · ────┬───
2026-10-24T20:38:28.3290303Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3290420Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]);
2026-10-24T20:38:28.3290473Z ╰────
2026-10-24T20:38:28.3291092Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3291404Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3291406Z
2026-10-24T20:38:28.3291599Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3291740Z ╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9]
2026-10-24T20:38:28.3291827Z 35 │ <T3SourceTextRunNativeComponent
2026-10-24T20:38:28.3291887Z 36 │ key={index}
2026-10-24T20:38:28.3291963Z · ───────────
2026-10-24T20:38:28.3292036Z 37 │ style={flattenedStyle}
2026-10-24T20:38:28.3292084Z ╰────
2026-10-24T20:38:28.3292225Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3292228Z
2026-10-24T20:38:28.3292436Z ⚠ react(no-unstable-nested-components): Do not define components during render.
2026-10-24T20:38:28.3292538Z ╭─[apps/mobile/src/Stack.tsx:1079:21]
2026-10-24T20:38:28.3292645Z 1078 │ <Navigator
2026-10-24T20:38:28.3292806Z 1079 │ screenLayout={(props) => <GuardedScreenLayout {...props} />}
2026-10-24T20:38:28.3292938Z · ─────────────────────────────────────────────
2026-10-24T20:38:28.3293018Z 1080 │ screenOptions={({ route }) =>
2026-10-24T20:38:28.3293068Z ╰────
2026-10-24T20:38:28.3293422Z help: Move this component definition out of the parent component `AdaptiveRootStack` and pass data as props. If you want to allow component creation in props, set `allowAsProps` option to true.
2026-10-24T20:38:28.3293426Z
2026-10-24T20:38:28.3293675Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3293841Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7]
2026-10-24T20:38:28.3293898Z 118 │
2026-10-24T20:38:28.3293963Z 119 │ useEffect(() => {
2026-10-24T20:38:28.3294030Z · ────┬────
2026-10-24T20:38:28.3294153Z · ╰── This is the containing effect
2026-10-24T20:38:28.3294234Z 120 │ if (orientationSettled) return;
2026-10-24T20:38:28.3294346Z 121 │ const orientation = getNativeShowcaseOrientation();
2026-10-24T20:38:28.3294417Z 122 │ if (orientation === null) {
2026-10-24T20:38:28.3294497Z 123 │ setOrientationSettled(true);
2026-10-24T20:38:28.3294584Z · ──────────┬──────────
2026-10-24T20:38:28.3294748Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3294807Z 124 │ return;
2026-10-24T20:38:28.3294858Z ╰────
2026-10-24T20:38:28.3295444Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3295760Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3295763Z
2026-10-24T20:38:28.3296009Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3296177Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7]
2026-10-24T20:38:28.3296227Z 292 │
2026-10-24T20:38:28.3296289Z 293 │ useEffect(() => {
2026-10-24T20:38:28.3296396Z · ────┬────
2026-10-24T20:38:28.3296545Z · ╰── This is the containing effect
2026-10-24T20:38:28.3296602Z 294 │ if (
2026-10-24T20:38:28.3296667Z 295 │ scene === null ||
2026-10-24T20:38:28.3296740Z 296 │ requestedScene === null ||
2026-10-24T20:38:28.3296814Z 297 │ scene !== requestedScene ||
2026-10-24T20:38:28.3296876Z 298 │ !hasFixture ||
2026-10-24T20:38:28.3296946Z 299 │ !orientationSettled ||
2026-10-24T20:38:28.3297009Z 300 │ !themeApplied ||
2026-10-24T20:38:28.3297122Z 301 │ (scene === "agent-activity" && !agentActivityStaged) ||
2026-10-24T20:38:28.3297253Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
2026-10-24T20:38:28.3297307Z 303 │ ) {
2026-10-24T20:38:28.3297372Z 304 │ setReadyScene(null);
2026-10-24T20:38:28.3297454Z · ──────┬──────
2026-10-24T20:38:28.3297620Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3297679Z 305 │ return;
2026-10-24T20:38:28.3297726Z ╰────
2026-10-24T20:38:28.3298308Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3298619Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3298622Z
2026-10-24T20:38:28.3298892Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3299059Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9]
2026-10-24T20:38:28.3299124Z 127 │ let cancelled = false;
2026-10-24T20:38:28.3299213Z 128 │ let lastOutcome: string | null = null;
2026-10-24T20:38:28.3299291Z · ─────┬─────
2026-10-24T20:38:28.3299422Z · ╰── 'lastOutcome' is declared here
2026-10-24T20:38:28.3299594Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
2026-10-24T20:38:28.3299643Z ╰────
2026-10-24T20:38:28.3299745Z help: Consider removing this declaration.
2026-10-24T20:38:28.3299747Z
2026-10-24T20:38:28.3300001Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3300164Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
2026-10-24T20:38:28.3300216Z 638 │
2026-10-24T20:38:28.3300279Z 639 │ useEffect(() => {
2026-10-24T20:38:28.3300346Z · ────┬────
2026-10-24T20:38:28.3300468Z · ╰── This is the containing effect
2026-10-24T20:38:28.3300575Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) {
2026-10-24T20:38:28.3300634Z 641 │ return;
2026-10-24T20:38:28.3300686Z 642 │ }
2026-10-24T20:38:28.3300757Z 643 │ setPendingLaunchEntry({
2026-10-24T20:38:28.3300842Z · ──────────┬──────────
2026-10-24T20:38:28.3301037Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3301154Z 644 │ key: launchTargetKey,
2026-10-24T20:38:28.3301231Z ╰────
2026-10-24T20:38:28.3301811Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3302123Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3302125Z
2026-10-24T20:38:28.3302373Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3302542Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5]
2026-10-24T20:38:28.3302594Z 648 │
2026-10-24T20:38:28.3302656Z 649 │ useEffect(() => {
2026-10-24T20:38:28.3302724Z · ────┬────
2026-10-24T20:38:28.3302849Z · ╰── This is the containing effect
2026-10-24T20:38:28.3302959Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) {
2026-10-24T20:38:28.3303018Z 651 │ return;
2026-10-24T20:38:28.3303070Z 652 │ }
2026-10-24T20:38:28.3303148Z 653 │ setInitialAttachGridEntry({
2026-10-24T20:38:28.3303237Z · ────────────┬────────────
2026-10-24T20:38:28.3303403Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3303472Z 654 │ key: launchTargetKey,
2026-10-24T20:38:28.3303521Z ╰────
2026-10-24T20:38:28.3304106Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3304422Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3304425Z
2026-10-24T20:38:28.3304672Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3304835Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7]
2026-10-24T20:38:28.3304885Z 743 │
2026-10-24T20:38:28.3304945Z 744 │ useEffect(() => {
2026-10-24T20:38:28.3305015Z · ────┬────
2026-10-24T20:38:28.3305140Z · ╰── This is the containing effect
2026-10-24T20:38:28.3305239Z 745 │ if (!routeEnvironmentId || !routeThreadId) {
2026-10-24T20:38:28.3305303Z 746 │ setLastGridSize({
2026-10-24T20:38:28.3305382Z · ───────┬───────
2026-10-24T20:38:28.3305544Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3305624Z 747 │ cols: DEFAULT_TERMINAL_COLS,
2026-10-24T20:38:28.3305672Z ╰────
2026-10-24T20:38:28.3306303Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3306643Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3306645Z
2026-10-24T20:38:28.3306840Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3307004Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24]
2026-10-24T20:38:28.3307057Z 537 │ });
2026-10-24T20:38:28.3307174Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]);
2026-10-24T20:38:28.3307279Z · ───────────┬──────────
2026-10-24T20:38:28.3307522Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
2026-10-24T20:38:28.3307680Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
2026-10-24T20:38:28.3307729Z ╰────
2026-10-24T20:38:28.3308015Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3308318Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3308321Z
2026-10-24T20:38:28.3308512Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3308674Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7]
2026-10-24T20:38:28.3308766Z 708 │ sentInitialInputKeyRef.current = null;
2026-10-24T20:38:28.3308835Z 709 │ }, [terminalKey]);
2026-10-24T20:38:28.3308909Z · ─────┬─────
2026-10-24T20:38:28.3309047Z · ╰── Unnecessary dependency `terminalKey`
2026-10-24T20:38:28.3309098Z 710 │
2026-10-24T20:38:28.3309146Z ╰────
2026-10-24T20:38:28.3309428Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3309729Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3309732Z
2026-10-24T20:38:28.3309923Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3310091Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52]
2026-10-24T20:38:28.3310147Z 799 │ };
2026-10-24T20:38:28.3310320Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
2026-10-24T20:38:28.3310491Z · ────────────┬──────────── ─────┬─────
2026-10-24T20:38:28.3310716Z · │ ╰── Unnecessary dependency `terminalKey`
2026-10-24T20:38:28.3310931Z · ╰── Unnecessary dependency `terminal.lifecycleVersion`
2026-10-24T20:38:28.3311010Z 801 │
2026-10-24T20:38:28.3311060Z ╰────
2026-10-24T20:38:28.3311451Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3311795Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3311797Z
2026-10-24T20:38:28.3311937Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3312097Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
2026-10-24T20:38:28.3312151Z 792 │ }
2026-10-24T20:38:28.3312255Z 793 │ const pasteSession = pasteSessionRef.current;
2026-10-24T20:38:28.3312366Z · ───────────┬───────────
2026-10-24T20:38:28.3312529Z · ╰── Cannot access ref value during render
2026-10-24T20:38:28.3312581Z 794 │
2026-10-24T20:38:28.3312629Z ╰────
2026-10-24T20:38:28.3313090Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3313374Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3313379Z
2026-10-24T20:38:28.3313628Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3313757Z ╭─[apps/mobile/src/components/ProjectFavicon.tsx:172:5]
2026-10-24T20:38:28.3313947Z 167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState<typeof faviconRequest>(null);
2026-10-24T20:38:28.3314015Z 168 │ useLayoutEffect(() => {
2026-10-24T20:38:28.3314090Z · ───────┬───────
2026-10-24T20:38:28.3314219Z · ╰── This is the containing effect
2026-10-24T20:38:28.3314305Z 169 │ if (faviconRequest === null) return;
2026-10-24T20:38:28.3314355Z 170 │
2026-10-24T20:38:28.3314483Z 171 │ const endRequest = beginProjectFaviconRequest(faviconRequest);
2026-10-24T20:38:28.3314576Z 172 │ setActiveFaviconRequest(faviconRequest);
2026-10-24T20:38:28.3314664Z · ───────────┬───────────
2026-10-24T20:38:28.3314831Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3314896Z 173 │ return endRequest;
2026-10-24T20:38:28.3314945Z ╰────
2026-10-24T20:38:28.3315579Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3315921Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3315923Z
2026-10-24T20:38:28.3316063Z ⚠ react(refs): Cannot access refs during render
2026-10-24T20:38:28.3316216Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39]
2026-10-24T20:38:28.3316270Z 276 │
2026-10-24T20:38:28.3316451Z 277 │ ╭─▶ return createElement(RawNativeView, {
2026-10-24T20:38:28.3316544Z 278 │ │ ...nativeProps,
2026-10-24T20:38:28.3316685Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined,
2026-10-24T20:38:28.3316774Z 280 │ │ ref: nativeRef,
2026-10-24T20:38:28.3316898Z 281 │ ├─▶ });
2026-10-24T20:38:28.3317129Z · ╰──── Passing a ref to a function may read its value during render
2026-10-24T20:38:28.3317181Z 282 │ }
2026-10-24T20:38:28.3317230Z ╰────
2026-10-24T20:38:28.3317692Z help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
2026-10-24T20:38:28.3317978Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T20:38:28.3317981Z
2026-10-24T20:38:28.3318230Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3318391Z ╭─[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7]
2026-10-24T20:38:28.3318443Z 100 │
2026-10-24T20:38:28.3318507Z 101 │ useEffect(() => {
2026-10-24T20:38:28.3318575Z · ────┬────
2026-10-24T20:38:28.3318698Z · ╰── This is the containing effect
2026-10-24T20:38:28.3318798Z 102 │ if (!target || selectedLines.length === 0) {
2026-10-24T20:38:28.3318884Z 103 │ setHighlightedLinesById({});
2026-10-24T20:38:28.3318978Z · ───────────┬───────────
2026-10-24T20:38:28.3319147Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3319208Z 104 │ return;
2026-10-24T20:38:28.3319256Z ╰────
2026-10-24T20:38:28.3319841Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3320154Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3320202Z
2026-10-24T20:38:28.3320421Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3320565Z ╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25]
2026-10-24T20:38:28.3320670Z 271 │ {record.elements?.map((element, index) => (
2026-10-24T20:38:28.3320833Z 272 │ <View key={`${element.selector ?? element.tagName}:${index}`} className="gap-3">
2026-10-24T20:38:28.3321016Z · ───────────────────────────────────────────────────────
2026-10-24T20:38:28.3321092Z 273 │ <ContextField
2026-10-24T20:38:28.3321143Z ╰────
2026-10-24T20:38:28.3321287Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3321290Z
2026-10-24T20:38:28.3321487Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3321617Z ╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6]
2026-10-24T20:38:28.3321671Z 81 │ },
2026-10-24T20:38:28.3321732Z 82 │ [draftKey],
2026-10-24T20:38:28.3321801Z · ────┬───
2026-10-24T20:38:28.3321935Z · ╰── Unnecessary dependency `draftKey`
2026-10-24T20:38:28.3321986Z 83 │ );
2026-10-24T20:38:28.3322035Z ╰────
2026-10-24T20:38:28.3322318Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3322621Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3322624Z
2026-10-24T20:38:28.3322877Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3323062Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5]
2026-10-24T20:38:28.3323113Z 104 │
2026-10-24T20:38:28.3323175Z 105 │ useEffect(() => {
2026-10-24T20:38:28.3323244Z · ────┬────
2026-10-24T20:38:28.3323369Z · ╰── This is the containing effect
2026-10-24T20:38:28.3323445Z 106 │ clearReviewCommentTarget();
2026-10-24T20:38:28.3323539Z 107 │ setPendingNativeCommentSelection(null);
2026-10-24T20:38:28.3323643Z · ────────────────┬───────────────
2026-10-24T20:38:28.3323817Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3323890Z 108 │ }, [selectedSection?.id]);
2026-10-24T20:38:28.3323939Z ╰────
2026-10-24T20:38:28.3324518Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3324830Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3324832Z
2026-10-24T20:38:28.3325080Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3325307Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7]
2026-10-24T20:38:28.3325390Z 109 │
2026-10-24T20:38:28.3325453Z 110 │ useEffect(() => {
2026-10-24T20:38:28.3325522Z · ────┬────
2026-10-24T20:38:28.3325644Z · ╰── This is the containing effect
2026-10-24T20:38:28.3325730Z 111 │ if (activeCommentTarget === null) {
2026-10-24T20:38:28.3325829Z 112 │ setPendingNativeCommentSelection(null);
2026-10-24T20:38:28.3325934Z · ────────────────┬───────────────
2026-10-24T20:38:28.3326104Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3326157Z 113 │ }
2026-10-24T20:38:28.3326206Z ╰────
2026-10-24T20:38:28.3326793Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3327108Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3327110Z
2026-10-24T20:38:28.3327300Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3327478Z ╭─[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7]
2026-10-24T20:38:28.3327571Z 107 │ setPendingNativeCommentSelection(null);
2026-10-24T20:38:28.3327642Z 108 │ }, [selectedSection?.id]);
2026-10-24T20:38:28.3327730Z · ─────────┬─────────
2026-10-24T20:38:28.3327889Z · ╰── Unnecessary dependency `selectedSection?.id`
2026-10-24T20:38:28.3327941Z 109 │
2026-10-24T20:38:28.3327989Z ╰────
2026-10-24T20:38:28.3328272Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3328575Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3328578Z
2026-10-24T20:38:28.3328769Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3328900Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7]
2026-10-24T20:38:28.3328987Z 453 │ showAuxiliaryPane("inspector");
2026-10-24T20:38:28.3329093Z 454 │ }, [environmentId, showAuxiliaryPane, threadId]);
2026-10-24T20:38:28.3329234Z · ──────┬────── ────┬───
2026-10-24T20:38:28.3329426Z · │ ╰── Unnecessary dependency `threadId`
2026-10-24T20:38:28.3329571Z · ╰── Unnecessary dependency `environmentId`
2026-10-24T20:38:28.3329629Z 455 │ const {
2026-10-24T20:38:28.3329678Z ╰────
2026-10-24T20:38:28.3329964Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3330322Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3330354Z
2026-10-24T20:38:28.3330534Z ⚠ react(static-components): Cannot create components during render
2026-10-24T20:38:28.3330664Z ╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20]
2026-10-24T20:38:28.3330727Z 492 │ // same check.
2026-10-24T20:38:28.3330862Z 493 │ const NativeReviewDiffView = resolveNativeReviewDiffView();
2026-10-24T20:38:28.3331006Z · ─────────────┬─────────────
2026-10-24T20:38:28.3331180Z · ╰── The component is created during render here
2026-10-24T20:38:28.3331325Z 494 │ const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
2026-10-24T20:38:28.3331446Z 495 │ const showcasedReviewDrawRef = useRef<string | null>(null);
2026-10-24T20:38:28.3331576Z 496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false);
2026-10-24T20:38:28.3331665Z 497 │ const handlePullToRefresh = async () => {
2026-10-24T20:38:28.3331741Z 498 │ setIsPullRefreshing(true);
2026-10-24T20:38:28.3331823Z 499 │ await refreshSelectedSection();
2026-10-24T20:38:28.3331900Z 500 │ setIsPullRefreshing(false);
2026-10-24T20:38:28.3331950Z 501 │ };
2026-10-24T20:38:28.3332089Z 502 │ const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
2026-10-24T20:38:28.3332226Z 503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
2026-10-24T20:38:28.3332331Z 504 │ const fileVisibility = useReviewFileVisibility({
2026-10-24T20:38:28.3332413Z 505 │ threadKey: reviewCache.threadKey,
2026-10-24T20:38:28.3332501Z 506 │ sectionId: selectedSection?.id ?? null,
2026-10-24T20:38:28.3332572Z 507 │ files: reviewFiles,
2026-10-24T20:38:28.3332671Z 508 │ cachedExpandedFileIds: selectedSection?.id
2026-10-24T20:38:28.3332797Z 509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id]
2026-10-24T20:38:28.3332860Z 510 │ : undefined,
2026-10-24T20:38:28.3332952Z 511 │ cachedViewedFileIds: selectedSection?.id
2026-10-24T20:38:28.3333071Z 512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id]
2026-10-24T20:38:28.3333130Z 513 │ : undefined,
2026-10-24T20:38:28.3333183Z 514 │ });
2026-10-24T20:38:28.3333368Z 515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
2026-10-24T20:38:28.3333495Z 516 │ const commentSelection = useReviewCommentSelectionController({
2026-10-24T20:38:28.3333554Z 517 │ environmentId,
2026-10-24T20:38:28.3333614Z 518 │ threadId,
2026-10-24T20:38:28.3333683Z 519 │ selectedSection,
2026-10-24T20:38:28.3333751Z 520 │ nativeReviewDiffData,
2026-10-24T20:38:28.3333803Z 521 │ });
2026-10-24T20:38:28.3333904Z 522 │ const nativeBridge = useNativeReviewDiffBridge({
2026-10-24T20:38:28.3333987Z 523 │ threadKey: reviewCache.threadKey,
2026-10-24T20:38:28.3334073Z 524 │ sectionId: selectedSection?.id ?? null,
2026-10-24T20:38:28.3334148Z 525 │ diff: selectedSection?.diff,
2026-10-24T20:38:28.3334222Z 526 │ data: nativeReviewDiffData,
2026-10-24T20:38:28.3334291Z 527 │ collapsedFileIds,
2026-10-24T20:38:28.3334351Z 528 │ viewedFileIds,
2026-10-24T20:38:28.3334457Z 529 │ selectedRowIds: commentSelection.selectedRowIds,
2026-10-24T20:38:28.3334553Z 530 │ canHighlight: parsedDiff.kind === "files",
2026-10-24T20:38:28.3334605Z 531 │ });
2026-10-24T20:38:28.3334675Z 532 │ const showcaseReviewKey =
2026-10-24T20:38:28.3334853Z 533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
2026-10-24T20:38:28.3335084Z 534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
2026-10-24T20:38:28.3335143Z 535 │ : null;
2026-10-24T20:38:28.3335304Z 536 │ const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
2026-10-24T20:38:28.3335380Z 537 │ nativeBridge.onDebug(event);
2026-10-24T20:38:28.3335437Z 538 │ if (
2026-10-24T20:38:28.3335514Z 539 │ showcaseReviewKey === null ||
2026-10-24T20:38:28.3335630Z 540 │ showcasedReviewDrawRef.current === showcaseReviewKey ||
2026-10-24T20:38:28.3335737Z 541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent)
2026-10-24T20:38:28.3335791Z 542 │ ) {
2026-10-24T20:38:28.3335849Z 543 │ return;
2026-10-24T20:38:28.3335900Z 544 │ }
2026-10-24T20:38:28.3336014Z 545 │ showcasedReviewDrawRef.current = showcaseReviewKey;
2026-10-24T20:38:28.3336174Z 546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
2026-10-24T20:38:28.3336225Z 547 │ };
2026-10-24T20:38:28.3336275Z 548 │
2026-10-24T20:38:28.3336388Z 549 │ const handleSelectFile = async (fileId: string | null) => {
2026-10-24T20:38:28.3336465Z 550 │ loadVisibleFile(fileId, true);
2026-10-24T20:38:28.3336551Z 551 │ commentSelection.clearSelection();
2026-10-24T20:38:28.3336668Z 552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) {
2026-10-24T20:38:28.3336746Z 553 │ toggleExpandedFile(fileId);
2026-10-24T20:38:28.3336798Z 554 │ }
2026-10-24T20:38:28.3336905Z 555 │ const nativeView = nativeReviewDiffViewRef.current;
2026-10-24T20:38:28.3336973Z 556 │ if (!nativeView) return;
2026-10-24T20:38:28.3337068Z 557 │ const result = await settlePromise(() =>
2026-10-24T20:38:28.3337239Z 558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
2026-10-24T20:38:28.3337292Z 559 │ );
2026-10-24T20:38:28.3337378Z 560 │ if (AsyncResult.isFailure(result)) {
2026-10-24T20:38:28.3337554Z 561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
2026-10-24T20:38:28.3337606Z 562 │ }
2026-10-24T20:38:28.3337656Z 563 │ };
2026-10-24T20:38:28.3337736Z 564 │ const handleVisibleFileChange = (
2026-10-24T20:38:28.3337865Z 565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
2026-10-24T20:38:28.3337922Z 566 │ ) => {
2026-10-24T20:38:28.3338026Z 567 │ loadVisibleFile(event.nativeEvent.fileId ?? null);
2026-10-24T20:38:28.3338236Z 568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
2026-10-24T20:38:28.3338317Z 569 │ };
2026-10-24T20:38:28.3338393Z 570 │ const renderInspector = () => (
2026-10-24T20:38:28.3338458Z 571 │ <ReviewFileNavigator
2026-10-24T20:38:28.3338536Z 572 │ ref={reviewFileNavigatorRef}
2026-10-24T20:38:28.3338622Z 573 │ files={nativeReviewDiffData.files}
2026-10-24T20:38:28.3338695Z 574 │ headerInset={insets.top}
2026-10-24T20:38:28.3338784Z 575 │ sectionId={selectedSection?.id ?? null}
2026-10-24T20:38:28.3338899Z 576 │ onSelectFile={(fileId) => void handleSelectFile(fileId)}
2026-10-24T20:38:28.3338952Z 577 │ />
2026-10-24T20:38:28.3339002Z 578 │ );
2026-10-24T20:38:28.3339053Z 579 │
2026-10-24T20:38:28.3339232Z 580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
2026-10-24T20:38:28.3339323Z 581 │ const { fileId } = event.nativeEvent;
2026-10-24T20:38:28.3339385Z 582 │ if (fileId) {
2026-10-24T20:38:28.3339466Z 583 │ loadVisibleFile(fileId, true);
2026-10-24T20:38:28.3339541Z 584 │ toggleExpandedFile(fileId);
2026-10-24T20:38:28.3339594Z 585 │ }
2026-10-24T20:38:28.3339644Z 586 │ };
2026-10-24T20:38:28.3339693Z 587 │
2026-10-24T20:38:28.3339780Z 588 │ const handleNativeToggleViewedFile = (
2026-10-24T20:38:28.3339897Z 589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>,
2026-10-24T20:38:28.3339951Z 590 │ ) => {
2026-10-24T20:38:28.3340035Z 591 │ const { fileId } = event.nativeEvent;
2026-10-24T20:38:28.3340097Z 592 │ if (fileId) {
2026-10-24T20:38:28.3340170Z 593 │ toggleViewedFile(fileId);
2026-10-24T20:38:28.3340220Z 594 │ }
2026-10-24T20:38:28.3340272Z 595 │ };
2026-10-24T20:38:28.3340323Z 596 │
2026-10-24T20:38:28.3340396Z 597 │ const parsedDiffNotice =
2026-10-24T20:38:28.3340554Z 598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
2026-10-24T20:38:28.3340671Z 599 │ const hasCachedSelectedDiff = selectedSection?.diff != null;
2026-10-24T20:38:28.3340822Z 600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
2026-10-24T20:38:28.3340972Z 601 │ const sectionMenu = buildReviewSectionMenu(reviewSections);
2026-10-24T20:38:28.3341125Z 602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
2026-10-24T20:38:28.3341232Z 603 │ hasEnvironmentPresentation: environment.isReady,
2026-10-24T20:38:28.3341330Z 604 │ isEnvironmentConnected: isEnvironmentReady,
2026-10-24T20:38:28.3341400Z 605 │ hasCachedSelectedDiff,
2026-10-24T20:38:28.3341463Z 606 │ hasAnyCachedDiff,
2026-10-24T20:38:28.3341515Z 607 │ });
2026-10-24T20:38:28.3341604Z 608 │ const handleRetryEnvironment = () => {
2026-10-24T20:38:28.3341688Z 609 │ void retryEnvironment(environmentId);
2026-10-24T20:38:28.3341740Z 610 │ };
2026-10-24T20:38:28.3341822Z 611 │ const handleReturnToThread = () => {
2026-10-24T20:38:28.3341898Z 612 │ if (navigation.canGoBack()) {
2026-10-24T20:38:28.3341963Z 613 │ navigation.goBack();
2026-10-24T20:38:28.3342020Z 614 │ return;
2026-10-24T20:38:28.3342072Z 615 │ }
2026-10-24T20:38:28.3342150Z 616 │ navigation.navigate("Thread", {
2026-10-24T20:38:28.3342236Z 617 │ environmentId: String(environmentId),
2026-10-24T20:38:28.3342311Z 618 │ threadId: String(threadId),
2026-10-24T20:38:28.3342363Z 619 │ });
2026-10-24T20:38:28.3342416Z 620 │ };
2026-10-24T20:38:28.3342490Z 621 │ const androidHeaderSubtitle = [
2026-10-24T20:38:28.3342605Z 622 │ selectedSection?.title,
2026-10-24T20:38:28.3342715Z 623 │ headerDiffSummary.additions,
2026-10-24T20:38:28.3342790Z 624 │ headerDiffSummary.deletions,
2026-10-24T20:38:28.3342842Z 625 │ ]
2026-10-24T20:38:28.3342945Z 626 │ .filter((part): part is string => Boolean(part))
2026-10-24T20:38:28.3343006Z 627 │ .join(" · ");
2026-10-24T20:38:28.3343056Z 628 │
2026-10-24T20:38:28.3343131Z 629 │ const showChangedFilesPane =
2026-10-24T20:38:28.3343203Z 630 │ !showConnectionNotice &&
2026-10-24T20:38:28.3343276Z 631 │ selectedSection !== null &&
2026-10-24T20:38:28.3343351Z 632 │ parsedDiff.kind === "files" &&
2026-10-24T20:38:28.3343429Z 633 │ NativeReviewDiffView !== null;
2026-10-24T20:38:28.3343594Z 634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
2026-10-24T20:38:28.3343766Z 635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
2026-10-24T20:38:28.3343817Z 636 │
2026-10-24T20:38:28.3343888Z 637 │ const listHeader = (() => {
2026-10-24T20:38:28.3343971Z 638 │ const children: ReactElement[] = [];
2026-10-24T20:38:28.3344021Z 639 │
2026-10-24T20:38:28.3344080Z 640 │ if (error) {
2026-10-24T20:38:28.3344144Z 641 │ children.push(
2026-10-24T20:38:28.3344202Z 642 │ <View
2026-10-24T20:38:28.3344270Z 643 │ key="review-error"
2026-10-24T20:38:28.3344333Z 644 │ className={cn(
2026-10-24T20:38:28.3344408Z 645 │ "bg-card px-4 py-3",
2026-10-24T20:38:28.3344558Z 646 │ Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
2026-10-24T20:38:28.3344614Z 647 │ )}
2026-10-24T20:38:28.3344670Z 648 │ >
2026-10-24T20:38:28.3344835Z 649 │ <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
2026-10-24T20:38:28.3344991Z 650 │ <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
2026-10-24T20:38:28.3345050Z 651 │ </View>,
2026-10-24T20:38:28.3345105Z 652 │ );
2026-10-24T20:38:28.3345158Z 653 │ }
2026-10-24T20:38:28.3345207Z 654 │
2026-10-24T20:38:28.3345275Z 655 │ if (parsedDiffNotice) {
2026-10-24T20:38:28.3345431Z 656 │ children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
2026-10-24T20:38:28.3345483Z 657 │ }
2026-10-24T20:38:28.3345532Z 658 │
2026-10-24T20:38:28.3345605Z 659 │ if (children.length === 0) {
2026-10-24T20:38:28.3345667Z 660 │ return null;
2026-10-24T20:38:28.3345719Z 661 │ }
2026-10-24T20:38:28.3345770Z 662 │
2026-10-24T20:38:28.3345838Z 663 │ return <>{children}</>;
2026-10-24T20:38:28.3345898Z 664 │ })();
2026-10-24T20:38:28.3345968Z 665 │ const headerSubtitle = [
2026-10-24T20:38:28.3346045Z 666 │ headerDiffSummary.additions,
2026-10-24T20:38:28.3346121Z 667 │ headerDiffSummary.deletions,
2026-10-24T20:38:28.3346201Z 668 │ pendingReviewCommentCount > 0
2026-10-24T20:38:28.3346370Z 669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
2026-10-24T20:38:28.3346427Z 670 │ : null,
2026-10-24T20:38:28.3346479Z 671 │ ]
2026-10-24T20:38:28.3346543Z 672 │ .filter(Boolean)
2026-10-24T20:38:28.3346604Z 673 │ .join(" · ");
2026-10-24T20:38:28.3346734Z 674 │ const headerTitleText = selectedSection?.title ?? "Review changes";
2026-10-24T20:38:28.3346786Z 675 │
2026-10-24T20:38:28.3346845Z 676 │ return (
2026-10-24T20:38:28.3346900Z 677 │ <>
2026-10-24T20:38:28.3346961Z 678 │ <ReviewHeader
2026-10-24T20:38:28.3347094Z 679 │ environmentId={environmentId}
2026-10-24T20:38:28.3347191Z 680 │ threadId={threadId}
2026-10-24T20:38:28.3347266Z 681 │ title={headerTitleText}
2026-10-24T20:38:28.3347342Z 682 │ subtitle={headerSubtitle}
2026-10-24T20:38:28.3347438Z 683 │ androidSubtitle={androidHeaderSubtitle}
2026-10-24T20:38:28.3347509Z 684 │ iconColor={headerIcon}
2026-10-24T20:38:28.3347602Z 685 │ selectedThreadCwd={selectedThreadCwd}
2026-10-24T20:38:28.3347676Z 686 │ sectionMenu={sectionMenu}
2026-10-24T20:38:28.3347760Z 687 │ selectedSection={selectedSection}
2026-10-24T20:38:28.3347855Z 688 │ showSectionToolbar={showSectionToolbar}
2026-10-24T20:38:28.3347962Z 689 │ showChangedFilesToggle={showChangedFilesToggle}
2026-10-24T20:38:28.3348046Z 690 │ onRefresh={handlePullToRefresh}
2026-10-24T20:38:28.3348135Z 691 │ onSelectSection={selectSection}
2026-10-24T20:38:28.3348230Z 692 │ onReturnToThread={handleReturnToThread}
2026-10-24T20:38:28.3348284Z 693 │ />
2026-10-24T20:38:28.3348335Z 694 │
2026-10-24T20:38:28.3348401Z 695 │ <ScreenContent>
2026-10-24T20:38:28.3348520Z 696 │ <View className="flex-1 bg-sheet android:bg-sheet-solid">
2026-10-24T20:38:28.3348597Z 697 │ {showConnectionNotice ? (
2026-10-24T20:38:28.3348735Z 698 │ <View className="flex-1" style={{ paddingTop: topContentInset }}>
2026-10-24T20:38:28.3348823Z 699 │ <EnvironmentConnectionNotice
2026-10-24T20:38:28.3348995Z 700 │ environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
2026-10-24T20:38:28.3349061Z 701 │ connection={
2026-10-24T20:38:28.3349170Z 702 │ environment.presentation?.connection ?? {
2026-10-24T20:38:28.3349251Z 703 │ phase: "available",
2026-10-24T20:38:28.3349323Z 704 │ error: null,
2026-10-24T20:38:28.3349394Z 705 │ traceId: null,
2026-10-24T20:38:28.3349458Z 706 │ }
2026-10-24T20:38:28.3349518Z 707 │ }
2026-10-24T20:38:28.3349597Z 708 │ resourceName="review"
2026-10-24T20:38:28.3349689Z 709 │ onRetry={handleRetryEnvironment}
2026-10-24T20:38:28.3349749Z 710 │ />
2026-10-24T20:38:28.3349810Z 711 │ </View>
2026-10-24T20:38:28.3349963Z 712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
2026-10-24T20:38:28.3350020Z 713 │ <View
2026-10-24T20:38:28.3350094Z 714 │ className="flex-1"
2026-10-24T20:38:28.3350157Z 715 │ style={{
2026-10-24T20:38:28.3350275Z 716 │ backgroundColor: nativeBridge.theme.background,
2026-10-24T20:38:28.3350334Z 717 │ }}
2026-10-24T20:38:28.3350392Z 718 │ >
2026-10-24T20:38:28.3350454Z 719 │ <View
2026-10-24T20:38:28.3350537Z 720 │ className="min-w-0 flex-1"
2026-10-24T20:38:28.3350674Z 721 │ style={listHeader ? { paddingTop: topContentInset } : undefined}
2026-10-24T20:38:28.3350734Z 722 │ >
2026-10-24T20:38:28.3350802Z 723 │ {listHeader}
2026-10-24T20:38:28.3350954Z 724 │ <View className="min-w-0 flex-1" collapsable={false}>
2026-10-24T20:38:28.3351035Z 725 │ <NativeReviewDiffView
2026-10-24T20:38:28.3351141Z · ──────────┬─────────
2026-10-24T20:38:28.3351405Z · ╰── This component is created during render
2026-10-24T20:38:28.3351522Z 726 │ collapsable={false}
2026-10-24T20:38:28.3351574Z ╰────
2026-10-24T20:38:28.3351821Z help: Components created during render will reset their state each time they are created. Declare components outside of render
2026-10-24T20:38:28.3352137Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-24T20:38:28.3352140Z
2026-10-24T20:38:28.3352395Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3352527Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5]
2026-10-24T20:38:28.3352630Z 66 │ const { id: attachmentId, fileUri } = attachment;
2026-10-24T20:38:28.3352697Z 67 │ useEffect(() => {
2026-10-24T20:38:28.3352768Z · ────┬────
2026-10-24T20:38:28.3352892Z · ╰── This is the containing effect
2026-10-24T20:38:28.3352953Z 68 │ setUri(null);
2026-10-24T20:38:28.3353023Z · ───┬──
2026-10-24T20:38:28.3353182Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3353243Z 69 │ setError(null);
2026-10-24T20:38:28.3353293Z ╰────
2026-10-24T20:38:28.3353881Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3354203Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3354208Z
2026-10-24T20:38:28.3354403Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3354534Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:91:7]
2026-10-24T20:38:28.3354588Z 90 │ };
2026-10-24T20:38:28.3354661Z 91 │ }, [attachmentId, fileUri]);
2026-10-24T20:38:28.3354774Z · ──────┬───── ───┬───
2026-10-24T20:38:28.3354949Z · │ ╰── Unnecessary dependency `fileUri`
2026-10-24T20:38:28.3355091Z · ╰── Unnecessary dependency `attachmentId`
2026-10-24T20:38:28.3355228Z 92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType;
2026-10-24T20:38:28.3355281Z ╰────
2026-10-24T20:38:28.3355566Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3355872Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3355874Z
2026-10-24T20:38:28.3356081Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T20:38:28.3356218Z ╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34]
2026-10-24T20:38:28.3356282Z 212 │ useEffect(() => {
2026-10-24T20:38:28.3356502Z 213 │ if (!isFocused && hasSource) props.onRequestClose();
2026-10-24T20:38:28.3356626Z · ──┬──
2026-10-24T20:38:28.3356773Z · ╰── Missing dependency `props`
2026-10-24T20:38:28.3356879Z 214 │ }, [isFocused, hasSource, props.onRequestClose]);
2026-10-24T20:38:28.3356985Z · ──────────┬─────────
2026-10-24T20:38:28.3357206Z · ╰── Overly precise dependency `props.onRequestClose`, use `props` instead
2026-10-24T20:38:28.3357277Z 215 │ const { source } = props;
2026-10-24T20:38:28.3357327Z ╰────
2026-10-24T20:38:28.3357745Z help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3358055Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3358057Z
2026-10-24T20:38:28.3358308Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3358451Z ╭─[apps/mobile/src/components/VideoPreviewModal.ios.tsx:63:55]
2026-10-24T20:38:28.3358508Z 61 │ }, []);
2026-10-24T20:38:28.3358568Z 62 │ useEffect(() => {
2026-10-24T20:38:28.3358636Z · ────┬────
2026-10-24T20:38:28.3358760Z · ╰── This is the containing effect
2026-10-24T20:38:28.3358908Z 63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl);
2026-10-24T20:38:28.3359031Z · ───────┬──────
2026-10-24T20:38:28.3359231Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3359308Z 64 │ }, [playbackUrl, resolvedUrl]);
2026-10-24T20:38:28.3359357Z ╰────
2026-10-24T20:38:28.3359941Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3360261Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3360266Z
2026-10-24T20:38:28.3360455Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3360602Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31]
2026-10-24T20:38:28.3360706Z 222 │ ? snippetTokens.map((line, lineIndex) => (
2026-10-24T20:38:28.3360797Z 223 │ <NativeText key={lineIndex}>
2026-10-24T20:38:28.3360932Z · ───────────────
2026-10-24T20:38:28.3361022Z 224 │ {lineIndex > 0 ? "\n" : ""}
2026-10-24T20:38:28.3361072Z ╰────
2026-10-24T20:38:28.3361214Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3361217Z
2026-10-24T20:38:28.3361452Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T20:38:28.3361634Z ╭─[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25]
2026-10-24T20:38:28.3361710Z 226 │ <NativeText
2026-10-24T20:38:28.3361790Z 227 │ key={tokenIndex}
2026-10-24T20:38:28.3361890Z · ────────────────
2026-10-24T20:38:28.3361962Z 228 │ style={{
2026-10-24T20:38:28.3362015Z ╰────
2026-10-24T20:38:28.3362154Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T20:38:28.3362156Z
2026-10-24T20:38:28.3362408Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3362578Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5]
2026-10-24T20:38:28.3362634Z 55 │
2026-10-24T20:38:28.3362697Z 56 │ useEffect(() => {
2026-10-24T20:38:28.3362765Z · ────┬────
2026-10-24T20:38:28.3362889Z · ╰── This is the containing effect
2026-10-24T20:38:28.3362954Z 57 │ scheduler.reset();
2026-10-24T20:38:28.3363048Z 58 │ highlightedRowIdsRef.current = new Set();
2026-10-24T20:38:28.3363132Z 59 │ visibleChunkIndexRef.current = 0;
2026-10-24T20:38:28.3363246Z 60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 });
2026-10-24T20:38:28.3363323Z · ───────┬───────
2026-10-24T20:38:28.3363487Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3363598Z 61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey));
2026-10-24T20:38:28.3363649Z ╰────
2026-10-24T20:38:28.3364241Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3364559Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3364561Z
2026-10-24T20:38:28.3364754Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T20:38:28.3364924Z ╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7]
2026-10-24T20:38:28.3365003Z 62 │ return () => scheduler.cancel();
2026-10-24T20:38:28.3365105Z 63 │ }, [enabled, resetKey, rows.length, scheduler]);
2026-10-24T20:38:28.3365229Z · ───┬─── ─────┬─────
2026-10-24T20:38:28.3365416Z · │ ╰── Unnecessary dependency `rows.length`
2026-10-24T20:38:28.3365549Z · ╰── Unnecessary dependency `enabled`
2026-10-24T20:38:28.3365600Z 64 │
2026-10-24T20:38:28.3365648Z ╰────
2026-10-24T20:38:28.3365938Z help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
2026-10-24T20:38:28.3366241Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3366243Z
2026-10-24T20:38:28.3366561Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
2026-10-24T20:38:28.3366731Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
2026-10-24T20:38:28.3366782Z 60 │ ) {
2026-10-24T20:38:28.3366946Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
2026-10-24T20:38:28.3367024Z · ──────┬──────
2026-10-24T20:38:28.3367159Z · ╰── 'useDragRegion' is declared here
2026-10-24T20:38:28.3367246Z 62 │ const isInline = props.mode === "inline";
2026-10-24T20:38:28.3367295Z ╰────
2026-10-24T20:38:28.3367396Z help: Consider removing this declaration.
2026-10-24T20:38:28.3367399Z
2026-10-24T20:38:28.3367654Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T20:38:28.3367822Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7]
2026-10-24T20:38:28.3367877Z 328 │ };
2026-10-24T20:38:28.3367942Z 329 │ useEffect(() => {
2026-10-24T20:38:28.3368013Z · ────┬────
2026-10-24T20:38:28.3368137Z · ╰── This is the containing effect
2026-10-24T20:38:28.3368234Z 330 │ if (!guidesEnabled && section === "guide") {
2026-10-24T20:38:28.3368327Z 331 │ requestedSection.current = "overview";
2026-10-24T20:38:28.3368488Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
2026-10-24T20:38:28.3368558Z 333 │ setSection("overview");
2026-10-24T20:38:28.3368631Z · ─────┬────
2026-10-24T20:38:28.3368804Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T20:38:28.3368860Z 334 │ }
2026-10-24T20:38:28.3368909Z ╰────
2026-10-24T20:38:28.3369493Z help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
2026-10-24T20:38:28.3369807Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T20:38:28.3369809Z
2026-10-24T20:38:28.3370007Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T20:38:28.3370222Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6]
2026-10-24T20:38:28.3370342Z 330 │ if (!guidesEnabled && section === "guide") {
2026-10-24T20:38:28.3370436Z 331 │ requestedSection.current = "overview";
2026-10-24T20:38:28.3370517Z · ────────┬───────
2026-10-24T20:38:28.3370992Z · ╰── Missing dependency `requestedSection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3371150Z 332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
2026-10-24T20:38:28.3371297Z · ─────────┬───────── ──────┬──────
2026-10-24T20:38:28.3371791Z · │ ╰── Missing dependency `scrollOffsets`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3372234Z · ╰── Missing dependency `currentScrollOffset`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3372309Z 333 │ setSection("overview");
2026-10-24T20:38:28.3372360Z 334 │ }
2026-10-24T20:38:28.3372450Z 335 │ }, [guidesEnabled, section, insets.top]);
2026-10-24T20:38:28.3372558Z · ──────────────────┬─────────────────
2026-10-24T20:38:28.3372751Z · ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3372837Z 336 │ const tabContent = activityContent;
2026-10-24T20:38:28.3372887Z ╰────
2026-10-24T20:38:28.3373050Z help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T20:38:28.3373354Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3373357Z
2026-10-24T20:38:28.3373555Z ⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
2026-10-24T20:38:28.3373720Z ╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6]
2026-10-24T20:38:28.3373777Z 860 │ if (
2026-10-24T20:38:28.3373890Z 861 │ lastSelection.current.path === route.params.path &&
2026-10-24T20:38:28.3373971Z · ──────┬──────
2026-10-24T20:38:28.3374393Z · ╰── Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3374519Z 862 │ lastSelection.current.id === route.params.fileSelectionId
2026-10-24T20:38:28.3374570Z 863 │ )
2026-10-24T20:38:28.3374632Z 864 │ return;
2026-10-24T20:38:28.3374803Z 865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId };
2026-10-24T20:38:28.3374935Z 866 │ if (route.params.focus) navigation.setParams({ focus: undefined });
2026-10-24T20:38:28.3375019Z 867 │ setJumpPath(route.params.path);
2026-10-24T20:38:28.3375089Z 868 │ setSelectedRowId(null);
2026-10-24T20:38:28.3375166Z 869 │ jumpStarted.current = false;
2026-10-24T20:38:28.3375358Z 870 │ const file = data.files.find((entry) => entry.path === route.params.path);
2026-10-24T20:38:28.3375479Z 871 │ if (!file || !nativeView.current) return;
2026-10-24T20:38:28.3375567Z · ─────┬────
2026-10-24T20:38:28.3375994Z · ╰── Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T20:38:28.3376117Z 872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id));
2026-10-24T20:38:28.3376194Z 873 │ jumpStarted.current = true;
2026-10-24T20:38:28.3376326Z 874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => {
2026-10-24T20:38:28.3376403Z 875 │ jumpStarted.current = false;
2026-10-24T20:38:28.3376463Z 876 │ });
2026-10-24T20:38:28.3376655Z 877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]);
2026-10-24T20:38:28.3376855Z · ──────────────────────────────────────────────┬──────────────────────────────────────────────
2026-10-24T20:38:28.3377068Z · ╰── This dependency list is missing values used by the callback
2026-10-24T20:38:28.3377175Z 878 │ const appliedFilter = useRef(filter.hideTestFiles);
2026-10-24T20:38:28.3377226Z ╰────
2026-10-24T20:38:28.3377388Z help: Missing dependencies can cause an effect to fire less often than it should
2026-10-24T20:38:28.3377693Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T20:38:28.3377702Z
2026-10-24T20:38:28.3377783Z Found 0 errors and 367 warnings in 5479 files (5.5s, 8 threads)
2026-10-24T20:38:28.3814487Z Post job cleanup.
2026-10-24T20:38:28.4400711Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
2026-10-24T20:38:28.4466773Z Post job cleanup.
2026-10-24T20:38:28.4476653Z ##[start-action display=Cache full pnpm store;id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.__actions_cache]
2026-10-24T20:38:28.4778177Z Post job cleanup.
2026-10-24T20:38:28.5483266Z [command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/_work/t3code/t3code --files-from manifest.txt --use-compress-program zstdmt
2026-10-24T20:38:32.0104225Z Failed to save: Unable to reserve cache with key pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6, another job may be creating this cache.
2026-10-24T20:38:32.0565525Z ##[end-action id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.__actions_cache;outcome=success;conclusion=success;duration_ms=3608]
2026-10-24T20:38:32.0567162Z ##[start-action display=Cache Vite+;id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.vp_cache]
2026-10-24T20:38:32.0585937Z Post job cleanup.
2026-10-24T20:38:32.1183454Z Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache.
2026-10-24T20:38:32.1212248Z ##[end-action id=__25224e64-3c10-4c2d-826b-ea14e7e2e024.vp_cache;outcome=success;conclusion=success;duration_ms=64]
2026-10-24T20:38:32.1245945Z Post job cleanup.
2026-10-24T20:38:32.1616808Z [command]/usr/local/bin/git version
2026-10-24T20:38:32.1642786Z git version 2.55.0
2026-10-24T20:38:32.1689670Z Temporarily overriding HOME='/home/runner/_work/_temp/fe065c06-5498-4a18-91d5-577c1fadb2cf' before making global git config changes
2026-10-24T20:38:32.1690015Z Adding repository directory to the temporary git global config as a safe directory
2026-10-24T20:38:32.1692340Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
2026-10-24T20:38:32.1712114Z Removing SSH command configuration
2026-10-24T20:38:32.1714826Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
2026-10-24T20:38:32.1735481Z [command]/usr/local/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
2026-10-24T20:38:32.1843220Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
2026-10-24T20:38:32.1867544Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128
2026-10-24T20:38:32.1909768Z A job completed hook has been configured by the self-hosted runner administrator
2026-10-24T20:38:32.1923515Z ##[group]Run '/job_completed.sh'
2026-10-24T20:38:32.1929076Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
2026-10-24T20:38:32.1929242Z env:
2026-10-24T20:38:32.1929348Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 167
2026-10-24T20:38:32.1929501Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 383
2026-10-24T20:38:32.1929634Z BLACKSMITH_CHECK_RUN_ID: 120981382431
2026-10-24T20:38:32.1929770Z BLACKSMITH_JOB_DISPLAY_NAME: Lint
2026-10-24T20:38:32.1929904Z GITHUB_ACTIONS_CACHE_MODE: write
2026-10-24T20:38:32.1930033Z ##[endgroup]
2026-10-24T20:38:32.1997329Z Docker container cache not activated, skipping hash computation.
2026-10-24T20:38:32.2249311Z No active SSH sessions detected. Proceeding with shutdown immediately.
2026-10-24T20:38:32.2289509Z Cleaning up orphan processes