GitHub check

256 KB of 596 KB loaded Download the full log (596 KB)
340 KB of earlier output not loaded
ef.current) {
2026-10-24T03:18:47.2050025Z  134 │       return;
2026-10-24T03:18:47.2050083Z  135 │     }
2026-10-24T03:18:47.2050194Z  136 │     const first = measuredWidthRef.current === null;
2026-10-24T03:18:47.2050279Z  137 │     measuredWidthRef.current = width;
2026-10-24T03:18:47.2050427Z  138 │     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-24T03:18:47.2050507Z      ·     ──────┬─────
2026-10-24T03:18:47.2050652Z      ·           ╰── `capsuleWidth` cannot be modified
2026-10-24T03:18:47.2050707Z  139 │   };
2026-10-24T03:18:47.2050762Z      ╰────
2026-10-24T03:18:47.2051042Z   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-24T03:18:47.2051364Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2051367Z
2026-10-24T03:18:47.2051530Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2051697Z      ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
2026-10-24T03:18:47.2051810Z  128 │   // and repeatedly retargets the animation as it grows.
2026-10-24T03:18:47.2051929Z  129 │   const capsuleWidth = useSharedValue<number | null>(null);
2026-10-24T03:18:47.2052012Z      ·         ──────┬─────
2026-10-24T03:18:47.2052151Z      ·               ╰── `capsuleWidth` originates here
2026-10-24T03:18:47.2052266Z  130 │   const measuredWidthRef = useRef<number | null>(null);
2026-10-24T03:18:47.2052384Z  131 │   const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-24T03:18:47.2052491Z  132 │     const width = event.nativeEvent.layout.width;
2026-10-24T03:18:47.2052587Z  133 │     if (width === measuredWidthRef.current) {
2026-10-24T03:18:47.2052651Z  134 │       return;
2026-10-24T03:18:47.2052708Z  135 │     }
2026-10-24T03:18:47.2052815Z  136 │     const first = measuredWidthRef.current === null;
2026-10-24T03:18:47.2052899Z  137 │     measuredWidthRef.current = width;
2026-10-24T03:18:47.2053043Z  138 │     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-24T03:18:47.2053099Z  139 │   };
2026-10-24T03:18:47.2053192Z  140 │   const hasStatus = props.status !== null;
2026-10-24T03:18:47.2053404Z  141 │   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
2026-10-24T03:18:47.2053529Z  142 │   useEffect(() => {
2026-10-24T03:18:47.2053620Z  143 │     if (!hasStatus) {
2026-10-24T03:18:47.2053710Z  144 │       measuredWidthRef.current = null;
2026-10-24T03:18:47.2053788Z  145 │       capsuleWidth.value = null;
2026-10-24T03:18:47.2053868Z      ·       ──────┬─────
2026-10-24T03:18:47.2054013Z      ·             ╰── `capsuleWidth` cannot be modified
2026-10-24T03:18:47.2054068Z  146 │     }
2026-10-24T03:18:47.2054123Z      ╰────
2026-10-24T03:18:47.2054468Z   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-24T03:18:47.2054786Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2054792Z
2026-10-24T03:18:47.2054998Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T03:18:47.2055161Z      ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
2026-10-24T03:18:47.2055299Z  141 │   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
2026-10-24T03:18:47.2055366Z  142 │   useEffect(() => {
2026-10-24T03:18:47.2055446Z      ·             ───┬───
2026-10-24T03:18:47.2055671Z      ·                ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
2026-10-24T03:18:47.2055739Z  143 │     if (!hasStatus) {
2026-10-24T03:18:47.2055828Z  144 │       measuredWidthRef.current = null;
2026-10-24T03:18:47.2055907Z  145 │       capsuleWidth.value = null;
2026-10-24T03:18:47.2055990Z      ·       ──────┬─────
2026-10-24T03:18:47.2056131Z      ·             ╰── This modifies `capsuleWidth`
2026-10-24T03:18:47.2056188Z  146 │     }
2026-10-24T03:18:47.2056242Z      ╰────
2026-10-24T03:18:47.2056585Z   help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-24T03:18:47.2057078Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2057082Z
2026-10-24T03:18:47.2057287Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T03:18:47.2057524Z      ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
2026-10-24T03:18:47.2057723Z  130 │   const measuredWidthRef = useRef<number | null>(null);
2026-10-24T03:18:47.2057848Z  131 │   const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-24T03:18:47.2057977Z      ·                             ───────────────┬───────────────
2026-10-24T03:18:47.2058223Z      ·                                            ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
2026-10-24T03:18:47.2058331Z  132 │     const width = event.nativeEvent.layout.width;
2026-10-24T03:18:47.2058469Z  133 │     if (width === measuredWidthRef.current) {
2026-10-24T03:18:47.2058558Z  134 │       return;
2026-10-24T03:18:47.2058614Z  135 │     }
2026-10-24T03:18:47.2058723Z  136 │     const first = measuredWidthRef.current === null;
2026-10-24T03:18:47.2058808Z  137 │     measuredWidthRef.current = width;
2026-10-24T03:18:47.2058958Z  138 │     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-24T03:18:47.2059041Z      ·     ──────┬─────
2026-10-24T03:18:47.2059178Z      ·           ╰── This modifies `capsuleWidth`
2026-10-24T03:18:47.2059231Z  139 │   };
2026-10-24T03:18:47.2059287Z      ╰────
2026-10-24T03:18:47.2059630Z   help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-24T03:18:47.2059947Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2059950Z
2026-10-24T03:18:47.2060426Z   ⚠ 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-24T03:18:47.2060615Z      ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
2026-10-24T03:18:47.2060689Z  520 │                 })).delivery;
2026-10-24T03:18:47.2060894Z  521 │ ╭─▶             while (delivery.outcome === "accepted") {
2026-10-24T03:18:47.2061014Z  522 │ │                 yield* Effect.yieldNow;
2026-10-24T03:18:47.2061162Z  523 │ │                 delivery = (yield* service.getWebhookDelivery({
2026-10-24T03:18:47.2061266Z  524 │ │                   id: task.id,
2026-10-24T03:18:47.2061386Z  525 │ │                   deliveryId: deliveryId!,
2026-10-24T03:18:47.2061494Z  526 │ │                 })).delivery;
2026-10-24T03:18:47.2061635Z  527 │ ╰─▶             }
2026-10-24T03:18:47.2061756Z  528 │                 assert.equal(delivery.outcome, "dispatch_failed");
2026-10-24T03:18:47.2061811Z      ╰────
2026-10-24T03:18:47.2061813Z
2026-10-24T03:18:47.2061984Z   ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2062126Z      ╭─[apps/server/src/process/externalLauncher.test.ts:186:12]
2026-10-24T03:18:47.2062182Z  185 │
2026-10-24T03:18:47.2062285Z  186 │ for (const {} of ["darwin", "linux"] as const) {
2026-10-24T03:18:47.2062358Z      ·            ──
2026-10-24T03:18:47.2062413Z  187 │ }
2026-10-24T03:18:47.2062467Z      ╰────
2026-10-24T03:18:47.2062774Z   help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2062806Z
2026-10-24T03:18:47.2063031Z   ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2063170Z      ╭─[apps/server/src/process/externalLauncher.test.ts:189:12]
2026-10-24T03:18:47.2063225Z  188 │
2026-10-24T03:18:47.2063292Z  189 │ for (const {} of [
2026-10-24T03:18:47.2063365Z      ·            ──
2026-10-24T03:18:47.2063458Z  190 │   { kind: "browser", folderVerb: "none" },
2026-10-24T03:18:47.2066322Z      ╰────
2026-10-24T03:18:47.2066575Z   help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2066578Z
2026-10-24T03:18:47.2066844Z   ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2067035Z      ╭─[apps/server/src/process/externalLauncher.test.ts:311:12]
2026-10-24T03:18:47.2067092Z  310 │
2026-10-24T03:18:47.2067221Z  311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) {
2026-10-24T03:18:47.2067293Z      ·            ──
2026-10-24T03:18:47.2067346Z  312 │ }
2026-10-24T03:18:47.2067397Z      ╰────
2026-10-24T03:18:47.2067626Z   help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2067629Z
2026-10-24T03:18:47.2067797Z   ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2067937Z      ╭─[apps/server/src/process/externalLauncher.test.ts:314:12]
2026-10-24T03:18:47.2067989Z  313 │
2026-10-24T03:18:47.2068054Z  314 │ for (const {} of [
2026-10-24T03:18:47.2068128Z      ·            ──
2026-10-24T03:18:47.2068186Z  315 │   {
2026-10-24T03:18:47.2068236Z      ╰────
2026-10-24T03:18:47.2068470Z   help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2068473Z
2026-10-24T03:18:47.2068947Z   ⚠ 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-24T03:18:47.2069125Z      ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5]
2026-10-24T03:18:47.2069194Z  222 │         let idlePasses = 0;
2026-10-24T03:18:47.2069340Z  223 │ ╭─▶     for (;;) {
2026-10-24T03:18:47.2069483Z  224 │ │         yield* Effect.promise(() => Promise.resolve());
2026-10-24T03:18:47.2069632Z  225 │ │         const pending = backgroundRuntime.pending.shift();
2026-10-24T03:18:47.2069730Z  226 │ │         if (!pending) {
2026-10-24T03:18:47.2069825Z  227 │ │           idlePasses++;
2026-10-24T03:18:47.2069933Z  228 │ │           if (idlePasses >= 3) {
2026-10-24T03:18:47.2070022Z  229 │ │             return;
2026-10-24T03:18:47.2070100Z  230 │ │           }
2026-10-24T03:18:47.2070185Z  231 │ │           continue;
2026-10-24T03:18:47.2070263Z  232 │ │         }
2026-10-24T03:18:47.2070355Z  233 │ │         idlePasses = 0;
2026-10-24T03:18:47.2070573Z  234 │ │         const exit = yield* Effect.exit(
2026-10-24T03:18:47.2070904Z  235 │ │           pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
2026-10-24T03:18:47.2070985Z  236 │ │         );
2026-10-24T03:18:47.2071094Z  237 │ │         yield* Effect.sync(() => {
2026-10-24T03:18:47.2071201Z  238 │ │           pending.resolve(exit);
2026-10-24T03:18:47.2071278Z  239 │ │         });
2026-10-24T03:18:47.2071413Z  240 │ ╰─▶     }
2026-10-24T03:18:47.2071505Z  241 │       },
2026-10-24T03:18:47.2071584Z      ╰────
2026-10-24T03:18:47.2071590Z
2026-10-24T03:18:47.2071789Z   ⚠ react(static-components): Cannot create components during render
2026-10-24T03:18:47.2071965Z      ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
2026-10-24T03:18:47.2072055Z  196 │   const { onInput, onResize } = props;
2026-10-24T03:18:47.2072204Z  197 │   const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
2026-10-24T03:18:47.2072338Z      ·                                     ────────────────┬───────────────
2026-10-24T03:18:47.2072532Z      ·                                                     ╰── The component is created during render here
2026-10-24T03:18:47.2072661Z  198 │   const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
2026-10-24T03:18:47.2072715Z  199 │
2026-10-24T03:18:47.2072781Z  200 │   useEffect(() => {
2026-10-24T03:18:47.2072873Z  201 │     terminalDebugLog("native:surface", {
2026-10-24T03:18:47.2072961Z  202 │       terminalKey: props.terminalKey,
2026-10-24T03:18:47.2073038Z  203 │       native: hasNativeSurface,
2026-10-24T03:18:47.2073178Z  204 │       hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
2026-10-24T03:18:47.2073267Z  205 │       bufferLen: props.buffer.length,
2026-10-24T03:18:47.2073347Z  206 │       isRunning: props.isRunning,
2026-10-24T03:18:47.2073404Z  207 │     });
2026-10-24T03:18:47.2073562Z  208 │   }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
2026-10-24T03:18:47.2073652Z  209 │   const handleNativeInput = useCallback(
2026-10-24T03:18:47.2073769Z  210 │     (event: NativeSyntheticEvent<TerminalInputEvent>) => {
2026-10-24T03:18:47.2073867Z  211 │       if (!props.isRunning || props.readOnly) {
2026-10-24T03:18:47.2073928Z  212 │         return;
2026-10-24T03:18:47.2073985Z  213 │       }
2026-10-24T03:18:47.2074076Z  214 │       terminalDebugLog("native:onInput", {
2026-10-24T03:18:47.2074233Z  215 │         codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
2026-10-24T03:18:47.2074296Z  216 │       });
2026-10-24T03:18:47.2074383Z  217 │       onInput(event.nativeEvent.data);
2026-10-24T03:18:47.2074440Z  218 │     },
2026-10-24T03:18:47.2074537Z  219 │     [onInput, props.isRunning, props.readOnly],
2026-10-24T03:18:47.2074594Z  220 │   );
2026-10-24T03:18:47.2074684Z  221 │   const handleNativeResize = useCallback(
2026-10-24T03:18:47.2074800Z  222 │     (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
2026-10-24T03:18:47.2074863Z  223 │       onResize({
2026-10-24T03:18:47.2074948Z  224 │         cols: event.nativeEvent.cols,
2026-10-24T03:18:47.2075032Z  225 │         rows: event.nativeEvent.rows,
2026-10-24T03:18:47.2075091Z  226 │       });
2026-10-24T03:18:47.2075147Z  227 │     },
2026-10-24T03:18:47.2075210Z  228 │     [onResize],
2026-10-24T03:18:47.2075267Z  229 │   );
2026-10-24T03:18:47.2075320Z  230 │
2026-10-24T03:18:47.2075484Z  231 │   if (NativeTerminalSurfaceView) {
2026-10-24T03:18:47.2075603Z  232 │     return (
2026-10-24T03:18:47.2075710Z  233 │       <View style={props.style}>
2026-10-24T03:18:47.2075791Z  234 │         <NativeTerminalSurfaceView
2026-10-24T03:18:47.2075900Z      ·          ────────────┬────────────
2026-10-24T03:18:47.2076066Z      ·                      ╰── This component is created during render
2026-10-24T03:18:47.2076164Z  235 │           appearanceScheme={themeAppearance}
2026-10-24T03:18:47.2076216Z      ╰────
2026-10-24T03:18:47.2076551Z   help: Components created during render will reset their state each time they are created. Declare components outside of render
2026-10-24T03:18:47.2077066Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-24T03:18:47.2077074Z
2026-10-24T03:18:47.2077487Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2077632Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2139:5]
2026-10-24T03:18:47.2077689Z  2137 │   );
2026-10-24T03:18:47.2077758Z  2138 │   useEffect(() => {
2026-10-24T03:18:47.2077833Z       ·   ────┬────
2026-10-24T03:18:47.2077969Z       ·       ╰── This is the containing effect
2026-10-24T03:18:47.2078044Z  2139 │     setExpandedVideo(null);
2026-10-24T03:18:47.2078128Z       ·     ────────┬───────
2026-10-24T03:18:47.2078307Z       ·             ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2078391Z  2140 │     setExpandedFile(null);
2026-10-24T03:18:47.2078447Z       ╰────
2026-10-24T03:18:47.2079084Z   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-24T03:18:47.2079427Z   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-24T03:18:47.2079430Z
2026-10-24T03:18:47.2079675Z   ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
2026-10-24T03:18:47.2079815Z     ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10]
2026-10-24T03:18:47.2079961Z  65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
2026-10-24T03:18:47.2080110Z  66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
2026-10-24T03:18:47.2080210Z     ·          ───────────┬───────────
2026-10-24T03:18:47.2080380Z     ·                     ╰── 'isMarkdownFileLinkLabel' is imported here
2026-10-24T03:18:47.2080540Z  67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments";
2026-10-24T03:18:47.2080594Z     ╰────
2026-10-24T03:18:47.2080695Z   help: Consider removing this import.
2026-10-24T03:18:47.2080698Z
2026-10-24T03:18:47.2080914Z   ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used.
2026-10-24T03:18:47.2081048Z     ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3]
2026-10-24T03:18:47.2081199Z  91 │ import {
2026-10-24T03:18:47.2081321Z  92 │   createContext,
2026-10-24T03:18:47.2081427Z     ·   ──────┬──────
2026-10-24T03:18:47.2081564Z     ·         ╰── 'createContext' is imported here
2026-10-24T03:18:47.2081623Z  93 │   memo,
2026-10-24T03:18:47.2081677Z     ╰────
2026-10-24T03:18:47.2081778Z   help: Consider removing this import.
2026-10-24T03:18:47.2081781Z
2026-10-24T03:18:47.2081998Z   ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
2026-10-24T03:18:47.2082208Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3]
2026-10-24T03:18:47.2082269Z  107 │ import {
2026-10-24T03:18:47.2082339Z  108 │   ActivityIndicator,
2026-10-24T03:18:47.2082420Z      ·   ────────┬────────
2026-10-24T03:18:47.2082577Z      ·           ╰── 'ActivityIndicator' is imported here
2026-10-24T03:18:47.2082639Z  109 │   Image,
2026-10-24T03:18:47.2082693Z      ╰────
2026-10-24T03:18:47.2082789Z   help: Consider removing this import.
2026-10-24T03:18:47.2082791Z
2026-10-24T03:18:47.2083000Z   ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
2026-10-24T03:18:47.2083135Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3]
2026-10-24T03:18:47.2083198Z  114 │   Pressable,
2026-10-24T03:18:47.2083260Z  115 │   ScrollView,
2026-10-24T03:18:47.2083335Z      ·   ─────┬────
2026-10-24T03:18:47.2083471Z      ·        ╰── 'ScrollView' is imported here
2026-10-24T03:18:47.2083534Z  116 │   StyleSheet,
2026-10-24T03:18:47.2083585Z      ╰────
2026-10-24T03:18:47.2083690Z   help: Consider removing this import.
2026-10-24T03:18:47.2083695Z
2026-10-24T03:18:47.2083903Z   ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
2026-10-24T03:18:47.2084038Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11]
2026-10-24T03:18:47.2084098Z  116 │   StyleSheet,
2026-10-24T03:18:47.2084167Z  117 │   Text as NativeText,
2026-10-24T03:18:47.2084249Z      ·           ─────┬────
2026-10-24T03:18:47.2084390Z      ·                ╰── 'NativeText' is imported here
2026-10-24T03:18:47.2084457Z  118 │   type ColorValue,
2026-10-24T03:18:47.2084509Z      ╰────
2026-10-24T03:18:47.2084608Z   help: Consider removing this import.
2026-10-24T03:18:47.2084610Z
2026-10-24T03:18:47.2084909Z   ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used.
2026-10-24T03:18:47.2085130Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10]
2026-10-24T03:18:47.2085270Z  139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
2026-10-24T03:18:47.2085399Z  140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
2026-10-24T03:18:47.2085490Z      ·          ─────────┬────────
2026-10-24T03:18:47.2085648Z      ·                   ╰── 'tryOpenExternalUrl' is imported here
2026-10-24T03:18:47.2085949Z  141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload";
2026-10-24T03:18:47.2086005Z      ╰────
2026-10-24T03:18:47.2086102Z   help: Consider removing this import.
2026-10-24T03:18:47.2086105Z
2026-10-24T03:18:47.2086336Z   ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used.
2026-10-24T03:18:47.2086470Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10]
2026-10-24T03:18:47.2086607Z  142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
2026-10-24T03:18:47.2086804Z  143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
2026-10-24T03:18:47.2086945Z      ·          ─────────┬─────────
2026-10-24T03:18:47.2087156Z      ·                   ╰── 'faviconUrlForOrigin' is imported here
2026-10-24T03:18:47.2087217Z  144 │ import {
2026-10-24T03:18:47.2087270Z      ╰────
2026-10-24T03:18:47.2087366Z   help: Consider removing this import.
2026-10-24T03:18:47.2087368Z
2026-10-24T03:18:47.2087582Z   ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
2026-10-24T03:18:47.2087723Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10]
2026-10-24T03:18:47.2087878Z  156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
2026-10-24T03:18:47.2088018Z  157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
2026-10-24T03:18:47.2088106Z      ·          ────────┬───────
2026-10-24T03:18:47.2088259Z      ·                  ╰── 'MediaVideoPlayer' is imported here
2026-10-24T03:18:47.2088399Z  158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia";
2026-10-24T03:18:47.2088452Z      ╰────
2026-10-24T03:18:47.2088548Z   help: Consider removing this import.
2026-10-24T03:18:47.2088550Z
2026-10-24T03:18:47.2088781Z   ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used.
2026-10-24T03:18:47.2088921Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3]
2026-10-24T03:18:47.2089008Z  160 │   attachmentVideoPreviewSource,
2026-10-24T03:18:47.2089080Z  161 │   mediaVideoPreviewUri,
2026-10-24T03:18:47.2089167Z      ·   ──────────┬─────────
2026-10-24T03:18:47.2089323Z      ·             ╰── 'mediaVideoPreviewUri' is imported here
2026-10-24T03:18:47.2089398Z  162 │   mediaVideoThumbnailKey,
2026-10-24T03:18:47.2089449Z      ╰────
2026-10-24T03:18:47.2089546Z   help: Consider removing this import.
2026-10-24T03:18:47.2089548Z
2026-10-24T03:18:47.2089774Z   ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
2026-10-24T03:18:47.2089908Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3]
2026-10-24T03:18:47.2089977Z  161 │   mediaVideoPreviewUri,
2026-10-24T03:18:47.2090146Z  162 │   mediaVideoThumbnailKey,
2026-10-24T03:18:47.2090313Z      ·   ───────────┬──────────
2026-10-24T03:18:47.2090499Z      ·              ╰── 'mediaVideoThumbnailKey' is imported here
2026-10-24T03:18:47.2090579Z  163 │   type MediaVideoPreviewSource,
2026-10-24T03:18:47.2090634Z      ╰────
2026-10-24T03:18:47.2090731Z   help: Consider removing this import.
2026-10-24T03:18:47.2090734Z
2026-10-24T03:18:47.2090954Z   ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used.
2026-10-24T03:18:47.2091151Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8]
2026-10-24T03:18:47.2091231Z  162 │   mediaVideoThumbnailKey,
2026-10-24T03:18:47.2091312Z  163 │   type MediaVideoPreviewSource,
2026-10-24T03:18:47.2091408Z      ·        ───────────┬───────────
2026-10-24T03:18:47.2091581Z      ·                   ╰── 'MediaVideoPreviewSource' is imported here
2026-10-24T03:18:47.2091673Z  164 │ } from "../../lib/videoPreviewSource";
2026-10-24T03:18:47.2091726Z      ╰────
2026-10-24T03:18:47.2091822Z   help: Consider removing this import.
2026-10-24T03:18:47.2091824Z
2026-10-24T03:18:47.2092023Z   ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used.
2026-10-24T03:18:47.2092158Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15]
2026-10-24T03:18:47.2092339Z  170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection";
2026-10-24T03:18:47.2092483Z  171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter";
2026-10-24T03:18:47.2092576Z      ·               ───────┬───────
2026-10-24T03:18:47.2092733Z      ·                      ╰── 'ReviewDiffTheme' is imported here
2026-10-24T03:18:47.2092796Z  172 │ import {
2026-10-24T03:18:47.2092850Z      ╰────
2026-10-24T03:18:47.2092945Z   help: Consider removing this import.
2026-10-24T03:18:47.2092948Z
2026-10-24T03:18:47.2093179Z   ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
2026-10-24T03:18:47.2093310Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3]
2026-10-24T03:18:47.2093370Z  185 │ import {
2026-10-24T03:18:47.2093447Z  186 │   resolveMarkdownFontSizes,
2026-10-24T03:18:47.2093538Z      ·   ────────────┬───────────
2026-10-24T03:18:47.2093702Z      ·               ╰── 'resolveMarkdownFontSizes' is imported here
2026-10-24T03:18:47.2093796Z  187 │   resolveNativeMarkdownTypography,
2026-10-24T03:18:47.2093851Z      ╰────
2026-10-24T03:18:47.2093945Z   help: Consider removing this import.
2026-10-24T03:18:47.2093947Z
2026-10-24T03:18:47.2094178Z   ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used.
2026-10-24T03:18:47.2094312Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10]
2026-10-24T03:18:47.2094450Z  190 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon";
2026-10-24T03:18:47.2094588Z  191 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons";
2026-10-24T03:18:47.2094685Z      ·          ───────────┬──────────
2026-10-24T03:18:47.2094850Z      ·                     ╰── 'markdownLinkIconSource' is imported here
2026-10-24T03:18:47.2094910Z  192 │ import {
2026-10-24T03:18:47.2094961Z      ╰────
2026-10-24T03:18:47.2095135Z   help: Consider removing this import.
2026-10-24T03:18:47.2095171Z
2026-10-24T03:18:47.2095498Z   ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
2026-10-24T03:18:47.2095633Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3]
2026-10-24T03:18:47.2095710Z  193 │   normalizeNativeMarkdownUrl,
2026-10-24T03:18:47.2095807Z  194 │   resolveMarkdownInlineCodePresentation,
2026-10-24T03:18:47.2095921Z      ·   ──────────────────┬──────────────────
2026-10-24T03:18:47.2096201Z      ·                     ╰── 'resolveMarkdownInlineCodePresentation' is imported here
2026-10-24T03:18:47.2096275Z  195 │   resolveMarkdownLinkIcon,
2026-10-24T03:18:47.2096329Z      ╰────
2026-10-24T03:18:47.2096433Z   help: Consider removing this import.
2026-10-24T03:18:47.2096438Z
2026-10-24T03:18:47.2096720Z   ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used.
2026-10-24T03:18:47.2096925Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3]
2026-10-24T03:18:47.2097048Z  194 │   resolveMarkdownInlineCodePresentation,
2026-10-24T03:18:47.2097122Z  195 │   resolveMarkdownLinkIcon,
2026-10-24T03:18:47.2097213Z      ·   ───────────┬───────────
2026-10-24T03:18:47.2097372Z      ·              ╰── 'resolveMarkdownLinkIcon' is imported here
2026-10-24T03:18:47.2097460Z  196 │   resolveMarkdownLinkPresentation,
2026-10-24T03:18:47.2097514Z      ╰────
2026-10-24T03:18:47.2097610Z   help: Consider removing this import.
2026-10-24T03:18:47.2097612Z
2026-10-24T03:18:47.2097847Z   ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used.
2026-10-24T03:18:47.2097984Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:234:10]
2026-10-24T03:18:47.2098089Z  233 │ import { ThreadMcpApp } from "./McpAppWebView";
2026-10-24T03:18:47.2098238Z  234 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState";
2026-10-24T03:18:47.2098340Z      ·          ────────────┬───────────
2026-10-24T03:18:47.2098507Z      ·                      ╰── 'useMarkdownCodeHighlight' is imported here
2026-10-24T03:18:47.2098567Z  235 │ import {
2026-10-24T03:18:47.2098621Z      ╰────
2026-10-24T03:18:47.2098716Z   help: Consider removing this import.
2026-10-24T03:18:47.2098719Z
2026-10-24T03:18:47.2098940Z   ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
2026-10-24T03:18:47.2099077Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:238:3]
2026-10-24T03:18:47.2099143Z  237 │   useAssetUrl,
2026-10-24T03:18:47.2099212Z  238 │   useAssetUrlState,
2026-10-24T03:18:47.2099291Z      ·   ────────┬───────
2026-10-24T03:18:47.2099437Z      ·           ╰── 'useAssetUrlState' is imported here
2026-10-24T03:18:47.2099508Z  239 │   useRefreshAssetUrl,
2026-10-24T03:18:47.2099561Z      ╰────
2026-10-24T03:18:47.2099654Z   help: Consider removing this import.
2026-10-24T03:18:47.2099656Z
2026-10-24T03:18:47.2099866Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2100005Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2141:7]
2026-10-24T03:18:47.2100166Z  2140 │     setExpandedFile(null);
2026-10-24T03:18:47.2100417Z  2141 │   }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
2026-10-24T03:18:47.2100649Z       ·       ─────────┬─────────  ───────┬──────  ───────────────┬──────────────
2026-10-24T03:18:47.2100953Z       ·                │                  │                       ╰── Unnecessary dependency `props.contentPresentation.kind`
2026-10-24T03:18:47.2101237Z       ·                │                  ╰── Unnecessary dependency `props.threadId`
2026-10-24T03:18:47.2101409Z       ·                ╰── Unnecessary dependency `props.environmentId`
2026-10-24T03:18:47.2101552Z  2142 │   const horizontalPadding = props.layoutVariant === "split" ? 20 : 16;
2026-10-24T03:18:47.2101616Z       ╰────
2026-10-24T03:18:47.2101921Z   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-24T03:18:47.2102241Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2102244Z
2026-10-24T03:18:47.2102449Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2102587Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2609:7]
2026-10-24T03:18:47.2102687Z  2608 │     reportHeaderMaterialVisibility(false);
2026-10-24T03:18:47.2102804Z  2609 │   }, [feedThreadKey, reportHeaderMaterialVisibility]);
2026-10-24T03:18:47.2102885Z       ·       ──────┬──────
2026-10-24T03:18:47.2103047Z       ·             ╰── Unnecessary dependency `feedThreadKey`
2026-10-24T03:18:47.2103106Z  2610 │
2026-10-24T03:18:47.2103160Z       ╰────
2026-10-24T03:18:47.2103457Z   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-24T03:18:47.2103770Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2103773Z
2026-10-24T03:18:47.2103976Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2104116Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2625:7]
2026-10-24T03:18:47.2104173Z  2624 │     }
2026-10-24T03:18:47.2104381Z  2625 │   }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
2026-10-24T03:18:47.2104523Z       ·       ──────┬─────
2026-10-24T03:18:47.2104697Z       ·             ╰── Unnecessary dependency `listMountKey`
2026-10-24T03:18:47.2104752Z  2626 │
2026-10-24T03:18:47.2104806Z       ╰────
2026-10-24T03:18:47.2105108Z   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-24T03:18:47.2105509Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2105512Z
2026-10-24T03:18:47.2105714Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2105858Z       ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2782:7]
2026-10-24T03:18:47.2105920Z  2781 │     }
2026-10-24T03:18:47.2106108Z  2782 │   }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
2026-10-24T03:18:47.2106315Z       ·       ───────┬───────  ─────────┬────────  ────────┬───────
2026-10-24T03:18:47.2106572Z       ·              │                  │                  ╰── Unnecessary dependency `expandedWorkRows`
2026-10-24T03:18:47.2106904Z       ·              │                  ╰── Unnecessary dependency `expandedWorkGroups`
2026-10-24T03:18:47.2107112Z       ·              ╰── Unnecessary dependency `expandedTurnIds`
2026-10-24T03:18:47.2107168Z  2783 │
2026-10-24T03:18:47.2107227Z       ╰────
2026-10-24T03:18:47.2107536Z   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-24T03:18:47.2107859Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2107861Z
2026-10-24T03:18:47.2108046Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T03:18:47.2108184Z      ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:613:9]
2026-10-24T03:18:47.2108242Z  612 │       };
2026-10-24T03:18:47.2108362Z  613 │     }, [props.environmentId, attachment.id, httpBaseUrl]),
2026-10-24T03:18:47.2108564Z      ·         ─────────┬─────────  ──────┬──────  ─────┬─────
2026-10-24T03:18:47.2108818Z      ·                  │                 │             ╰── Unnecessary dependency `httpBaseUrl`
2026-10-24T03:18:47.2109020Z      ·                  │                 ╰── Unnecessary dependency `attachment.id`
2026-10-24T03:18:47.2109192Z      ·                  ╰── Unnecessary dependency `props.environmentId`
2026-10-24T03:18:47.2109249Z  614 │   );
2026-10-24T03:18:47.2109302Z      ╰────
2026-10-24T03:18:47.2109624Z   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-24T03:18:47.2110023Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2110062Z
2026-10-24T03:18:47.2110294Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2110457Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76]
2026-10-24T03:18:47.2110640Z  696 │   const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
2026-10-24T03:18:47.2110808Z  697 │   if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
2026-10-24T03:18:47.2111006Z      ·                                                                            ─────┬────
2026-10-24T03:18:47.2111216Z      ·                                                                                 ╰── Cannot call impure function
2026-10-24T03:18:47.2111362Z  698 │   const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
2026-10-24T03:18:47.2111416Z      ╰────
2026-10-24T03:18:47.2111710Z   help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2112017Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2112019Z
2026-10-24T03:18:47.2112192Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2112353Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71]
2026-10-24T03:18:47.2112433Z  717 │   const snoozePresets = useMemo(
2026-10-24T03:18:47.2112623Z  718 │     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-24T03:18:47.2112762Z      ·                                                                       ─────┬────
2026-10-24T03:18:47.2112946Z      ·                                                                            ╰── Cannot call impure function
2026-10-24T03:18:47.2113065Z  719 │     [props.snoozePresetMinute, swipeActions.secondary],
2026-10-24T03:18:47.2113119Z      ╰────
2026-10-24T03:18:47.2113407Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2113713Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2113716Z
2026-10-24T03:18:47.2113908Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T03:18:47.2114068Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6]
2026-10-24T03:18:47.2114249Z  718 │     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-24T03:18:47.2114368Z  719 │     [props.snoozePresetMinute, swipeActions.secondary],
2026-10-24T03:18:47.2114466Z      ·      ────────────┬───────────
2026-10-24T03:18:47.2114646Z      ·                  ╰── Unnecessary dependency `props.snoozePresetMinute`
2026-10-24T03:18:47.2114704Z  720 │   );
2026-10-24T03:18:47.2114757Z      ╰────
2026-10-24T03:18:47.2115074Z   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-24T03:18:47.2115466Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2115563Z
2026-10-24T03:18:47.2115783Z   ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T03:18:47.2115940Z      ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7]
2026-10-24T03:18:47.2116011Z  764 │       thread.pinnedAt,
2026-10-24T03:18:47.2116074Z  765 │       variant,
2026-10-24T03:18:47.2116150Z      ·       ───┬───
2026-10-24T03:18:47.2116299Z      ·          ╰── Unnecessary dependency `variant`
2026-10-24T03:18:47.2116386Z  766 │     ],
2026-10-24T03:18:47.2116464Z      ╰────
2026-10-24T03:18:47.2116912Z   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-24T03:18:47.2117423Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2117426Z
2026-10-24T03:18:47.2117625Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T03:18:47.2117788Z       ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21]
2026-10-24T03:18:47.2117923Z  1214 │             {providerDrivers.slice(0, -1).map((driver, index) => (
2026-10-24T03:18:47.2118063Z  1215 │               <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
2026-10-24T03:18:47.2118182Z       ·                     ──────────────────────────
2026-10-24T03:18:47.2118302Z  1216 │                 <ProviderIcon provider={driver} size={12} />
2026-10-24T03:18:47.2118356Z       ╰────
2026-10-24T03:18:47.2118505Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T03:18:47.2118507Z
2026-10-24T03:18:47.2118771Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2118935Z      ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5]
2026-10-24T03:18:47.2119109Z  112 │   const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate }));
2026-10-24T03:18:47.2119178Z  113 │   useEffect(() => {
2026-10-24T03:18:47.2119252Z      ·   ────┬────
2026-10-24T03:18:47.2119387Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2119556Z  114 │     if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) {
2026-10-24T03:18:47.2119621Z  115 │       return;
2026-10-24T03:18:47.2119678Z  116 │     }
2026-10-24T03:18:47.2119798Z  117 │     setEntry({ key: input.targetKey, location: candidate });
2026-10-24T03:18:47.2119869Z      ·     ────┬───
2026-10-24T03:18:47.2120043Z      ·         ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2120166Z  118 │   }, [candidate, entry.key, entry.location, input.targetKey]);
2026-10-24T03:18:47.2120218Z      ╰────
2026-10-24T03:18:47.2120850Z   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-24T03:18:47.2121260Z   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-24T03:18:47.2121296Z
2026-10-24T03:18:47.2121572Z   ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used.
2026-10-24T03:18:47.2121715Z     ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10]
2026-10-24T03:18:47.2121770Z  21 │
2026-10-24T03:18:47.2121929Z  22 │ function summarizePayload(payload: unknown): Readonly<Record<string, unknown>> {
2026-10-24T03:18:47.2122021Z     ·          ────────┬───────
2026-10-24T03:18:47.2122218Z     ·                  ╰── 'summarizePayload' is declared here
2026-10-24T03:18:47.2122352Z  23 │   if (payload === null) return { valueType: "null" };
2026-10-24T03:18:47.2122409Z     ╰────
2026-10-24T03:18:47.2122521Z   help: Consider removing this declaration.
2026-10-24T03:18:47.2122523Z
2026-10-24T03:18:47.2122787Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2122951Z      ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5]
2026-10-24T03:18:47.2123013Z  434 │       : null;
2026-10-24T03:18:47.2123079Z  435 │   useEffect(() => {
2026-10-24T03:18:47.2123153Z      ·   ────┬────
2026-10-24T03:18:47.2123285Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2123343Z  436 │     if (
2026-10-24T03:18:47.2123423Z  437 │       props.active === false ||
2026-10-24T03:18:47.2123502Z  438 │       activeDraftKey !== null ||
2026-10-24T03:18:47.2123591Z  439 │       editingPendingTask !== null ||
2026-10-24T03:18:47.2123669Z  440 │       selectedProject === null
2026-10-24T03:18:47.2123727Z  441 │     ) {
2026-10-24T03:18:47.2123789Z  442 │       return;
2026-10-24T03:18:47.2123845Z  443 │     }
2026-10-24T03:18:47.2123914Z  444 │     setActiveDraftKey(
2026-10-24T03:18:47.2124002Z      ·     ────────┬────────
2026-10-24T03:18:47.2124180Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2124254Z  445 │       createNewTaskDraft({
2026-10-24T03:18:47.2124306Z      ╰────
2026-10-24T03:18:47.2125020Z   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-24T03:18:47.2125432Z   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-24T03:18:47.2125434Z
2026-10-24T03:18:47.2125687Z   ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-24T03:18:47.2125973Z       ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36]
2026-10-24T03:18:47.2126081Z  1243 │     <ActiveNewTaskContext value={activeNewTask}>
2026-10-24T03:18:47.2126278Z  1244 │       <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>
2026-10-24T03:18:47.2126396Z       ·                                    ─────────────
2026-10-24T03:18:47.2126472Z  1245 │     </ActiveNewTaskContext>
2026-10-24T03:18:47.2126530Z       ╰────
2026-10-24T03:18:47.2126846Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-24T03:18:47.2127070Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-24T03:18:47.2127073Z
2026-10-24T03:18:47.2127350Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2127523Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
2026-10-24T03:18:47.2127576Z  638 │
2026-10-24T03:18:47.2127645Z  639 │   useEffect(() => {
2026-10-24T03:18:47.2127717Z      ·   ────┬────
2026-10-24T03:18:47.2127849Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2127967Z  640 │     if (pendingLaunchEntry.key === launchTargetKey) {
2026-10-24T03:18:47.2128031Z  641 │       return;
2026-10-24T03:18:47.2128087Z  642 │     }
2026-10-24T03:18:47.2128160Z  643 │     setPendingLaunchEntry({
2026-10-24T03:18:47.2128252Z      ·     ──────────┬──────────
2026-10-24T03:18:47.2128430Z      ·               ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2128502Z  644 │       key: launchTargetKey,
2026-10-24T03:18:47.2128555Z      ╰────
2026-10-24T03:18:47.2129189Z   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-24T03:18:47.2129531Z   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-24T03:18:47.2129536Z
2026-10-24T03:18:47.2129802Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2129977Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5]
2026-10-24T03:18:47.2130029Z  648 │
2026-10-24T03:18:47.2130096Z  649 │   useEffect(() => {
2026-10-24T03:18:47.2130168Z      ·   ────┬────
2026-10-24T03:18:47.2130300Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2130416Z  650 │     if (initialAttachGridEntry.key === launchTargetKey) {
2026-10-24T03:18:47.2130477Z  651 │       return;
2026-10-24T03:18:47.2130622Z  652 │     }
2026-10-24T03:18:47.2130780Z  653 │     setInitialAttachGridEntry({
2026-10-24T03:18:47.2130899Z      ·     ────────────┬────────────
2026-10-24T03:18:47.2131075Z      ·                 ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2131149Z  654 │       key: launchTargetKey,
2026-10-24T03:18:47.2131202Z      ╰────
2026-10-24T03:18:47.2131894Z   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-24T03:18:47.2132234Z   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-24T03:18:47.2132239Z
2026-10-24T03:18:47.2132498Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2132672Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7]
2026-10-24T03:18:47.2132727Z  743 │
2026-10-24T03:18:47.2132791Z  744 │   useEffect(() => {
2026-10-24T03:18:47.2132863Z      ·   ────┬────
2026-10-24T03:18:47.2132995Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2133099Z  745 │     if (!routeEnvironmentId || !routeThreadId) {
2026-10-24T03:18:47.2133167Z  746 │       setLastGridSize({
2026-10-24T03:18:47.2133252Z      ·       ───────┬───────
2026-10-24T03:18:47.2133429Z      ·              ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2133518Z  747 │         cols: DEFAULT_TERMINAL_COLS,
2026-10-24T03:18:47.2133569Z      ╰────
2026-10-24T03:18:47.2134194Z   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-24T03:18:47.2134527Z   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-24T03:18:47.2134530Z
2026-10-24T03:18:47.2134741Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2134921Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24]
2026-10-24T03:18:47.2134980Z  537 │     });
2026-10-24T03:18:47.2135106Z  538 │   }, [terminal.buffer, terminal.buffer.length, terminalKey]);
2026-10-24T03:18:47.2135219Z      ·                        ───────────┬──────────
2026-10-24T03:18:47.2135471Z      ·                                   ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
2026-10-24T03:18:47.2135635Z  539 │   const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
2026-10-24T03:18:47.2135689Z      ╰────
2026-10-24T03:18:47.2135997Z   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-24T03:18:47.2136390Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2136430Z
2026-10-24T03:18:47.2136730Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2137001Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7]
2026-10-24T03:18:47.2137117Z  708 │     sentInitialInputKeyRef.current = null;
2026-10-24T03:18:47.2137187Z  709 │   }, [terminalKey]);
2026-10-24T03:18:47.2137298Z      ·       ─────┬─────
2026-10-24T03:18:47.2137483Z      ·            ╰── Unnecessary dependency `terminalKey`
2026-10-24T03:18:47.2137539Z  710 │
2026-10-24T03:18:47.2137593Z      ╰────
2026-10-24T03:18:47.2137901Z   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-24T03:18:47.2138224Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2138226Z
2026-10-24T03:18:47.2138433Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2138605Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52]
2026-10-24T03:18:47.2138663Z  799 │     };
2026-10-24T03:18:47.2138842Z  800 │   }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
2026-10-24T03:18:47.2139025Z      ·                                                    ────────────┬────────────  ─────┬─────
2026-10-24T03:18:47.2139267Z      ·                                                                │                   ╰── Unnecessary dependency `terminalKey`
2026-10-24T03:18:47.2139485Z      ·                                                                ╰── Unnecessary dependency `terminal.lifecycleVersion`
2026-10-24T03:18:47.2139539Z  801 │
2026-10-24T03:18:47.2139590Z      ╰────
2026-10-24T03:18:47.2139893Z   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-24T03:18:47.2140217Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2140220Z
2026-10-24T03:18:47.2140367Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2140539Z      ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
2026-10-24T03:18:47.2140597Z  792 │   }
2026-10-24T03:18:47.2140707Z  793 │   const pasteSession = pasteSessionRef.current;
2026-10-24T03:18:47.2140824Z      ·                        ───────────┬───────────
2026-10-24T03:18:47.2140988Z      ·                                   ╰── Cannot access ref value during render
2026-10-24T03:18:47.2141043Z  794 │
2026-10-24T03:18:47.2141096Z      ╰────
2026-10-24T03:18:47.2141572Z   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-24T03:18:47.2141936Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2141973Z
2026-10-24T03:18:47.2142231Z   ⚠ eslint(require-yield): This generator function does not have `yield`
2026-10-24T03:18:47.2142384Z      ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78]
2026-10-24T03:18:47.2142442Z   80 │
2026-10-24T03:18:47.2142726Z   81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* (
2026-10-24T03:18:47.2142884Z   82 │ │     options: AcpMcpOverAcpBridgeOptions,
2026-10-24T03:18:47.2143048Z   83 │ │   ): Effect.fn.Return<AcpMcpOverAcpBridge> {
2026-10-24T03:18:47.2143221Z   84 │ │     const fetchImplementation = options.fetchImplementation ?? fetch;
2026-10-24T03:18:47.2143367Z   85 │ │     const connections = new Map<string, Connection>();
2026-10-24T03:18:47.2143439Z   86 │ │
2026-10-24T03:18:47.2143656Z   87 │ │     const connectionFor = (connectionId: string): Effect.Effect<Connection, AcpMcpOverAcpError> =>
2026-10-24T03:18:47.2143760Z   88 │ │       Effect.suspend(() => {
2026-10-24T03:18:47.2143902Z   89 │ │         const connection = connections.get(connectionId);
2026-10-24T03:18:47.2144016Z   90 │ │         return connection === undefined
2026-10-24T03:18:47.2144235Z   91 │ │           ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`))
2026-10-24T03:18:47.2144348Z   92 │ │           : Effect.succeed(connection);
2026-10-24T03:18:47.2144428Z   93 │ │       });
2026-10-24T03:18:47.2144504Z   94 │ │
2026-10-24T03:18:47.2144593Z   95 │ │     const send = (
2026-10-24T03:18:47.2144696Z   96 │ │       connection: Connection,
2026-10-24T03:18:47.2144791Z   97 │ │       message: unknown,
2026-10-24T03:18:47.2144952Z   98 │ │     ): Effect.Effect<ReadonlyArray<unknown>, AcpMcpOverAcpError> =>
2026-10-24T03:18:47.2145067Z   99 │ │       connection.mutex.withPermits(1)(
2026-10-24T03:18:47.2145176Z  100 │ │         Effect.gen(function* () {
2026-10-24T03:18:47.2145303Z  101 │ │           const body = JSON.stringify(message);
2026-10-24T03:18:47.2145448Z  102 │ │           if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) {
2026-10-24T03:18:47.2145667Z  103 │ │             return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB."));
2026-10-24T03:18:47.2145750Z  104 │ │           }
2026-10-24T03:18:47.2145886Z  105 │ │           const response = yield* Effect.tryPromise({
2026-10-24T03:18:47.2145987Z  106 │ │             try: (signal) =>
2026-10-24T03:18:47.2146119Z  107 │ │               fetchImplementation(options.endpoint, {
2026-10-24T03:18:47.2146224Z  108 │ │                 method: "POST",
2026-10-24T03:18:47.2146317Z  109 │ │                 signal,
2026-10-24T03:18:47.2146417Z  110 │ │                 headers: {
2026-10-24T03:18:47.2146544Z  111 │ │                   "content-type": "application/json",
2026-10-24T03:18:47.2146823Z  112 │ │                   accept: "application/json, text/event-stream",
2026-10-24T03:18:47.2147065Z  113 │ │                   authorization: options.authorization,
2026-10-24T03:18:47.2147196Z  114 │ │                   ...(connection.sessionId === null
2026-10-24T03:18:47.2147291Z  115 │ │                     ? {}
2026-10-24T03:18:47.2147439Z  116 │ │                     : { "mcp-session-id": connection.sessionId }),
2026-10-24T03:18:47.2147577Z  117 │ │                   ...(connection.protocolVersion === null
2026-10-24T03:18:47.2147686Z  118 │ │                     ? {}
2026-10-24T03:18:47.2147914Z  119 │ │                     : { "mcp-protocol-version": connection.protocolVersion }),
2026-10-24T03:18:47.2148003Z  120 │ │                 },
2026-10-24T03:18:47.2148101Z  121 │ │                 body,
2026-10-24T03:18:47.2148190Z  122 │ │               }),
2026-10-24T03:18:47.2148293Z  123 │ │             catch: bridgeError,
2026-10-24T03:18:47.2148375Z  124 │ │           });
2026-10-24T03:18:47.2148593Z  125 │ │           connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId;
2026-10-24T03:18:47.2148696Z  126 │ │           if (!response.ok) {
2026-10-24T03:18:47.2148803Z  127 │ │             yield* Effect.promise(
2026-10-24T03:18:47.2148993Z  128 │ │               () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
2026-10-24T03:18:47.2149076Z  129 │ │             );
2026-10-24T03:18:47.2149190Z  130 │ │             return yield* Effect.fail(
2026-10-24T03:18:47.2149411Z  131 │ │               new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`),
2026-10-24T03:18:47.2149494Z  132 │ │             );
2026-10-24T03:18:47.2149573Z  133 │ │           }
2026-10-24T03:18:47.2149786Z  134 │ │           const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))];
2026-10-24T03:18:47.2149908Z  135 │ │           for (const payload of payloads) {
2026-10-24T03:18:47.2150125Z  136 │ │             connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion;
2026-10-24T03:18:47.2150203Z  137 │ │           }
2026-10-24T03:18:47.2150304Z  138 │ │           return payloads;
2026-10-24T03:18:47.2150434Z  139 │ │         }).pipe(Effect.mapError(bridgeError)),
2026-10-24T03:18:47.2150511Z  140 │ │       );
2026-10-24T03:18:47.2150582Z  141 │ │
2026-10-24T03:18:47.2150760Z  142 │ │     const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* (
2026-10-24T03:18:47.2150888Z  143 │ │       request: AcpSchema.DisconnectMcpRequest,
2026-10-24T03:18:47.2151076Z  144 │ │     ): Effect.fn.Return<AcpSchema.DisconnectMcpResponse, AcpMcpOverAcpError> {
2026-10-24T03:18:47.2151245Z  145 │ │       const connection = yield* connectionFor(request.connectionId);
2026-10-24T03:18:47.2151373Z  146 │ │       connections.delete(request.connectionId);
2026-10-24T03:18:47.2151495Z  147 │ │       const sessionId = connection.sessionId;
2026-10-24T03:18:47.2151670Z  148 │ │       if (sessionId !== null) {
2026-10-24T03:18:47.2151890Z  149 │ │         const response = yield* Effect.tryPromise({
2026-10-24T03:18:47.2151990Z  150 │ │           try: (signal) =>
2026-10-24T03:18:47.2152123Z  151 │ │             fetchImplementation(options.endpoint, {
2026-10-24T03:18:47.2152223Z  152 │ │               method: "DELETE",
2026-10-24T03:18:47.2152315Z  153 │ │               signal,
2026-10-24T03:18:47.2152410Z  154 │ │               headers: {
2026-10-24T03:18:47.2152567Z  155 │ │                 authorization: options.authorization,
2026-10-24T03:18:47.2152736Z  156 │ │                 "mcp-session-id": sessionId,
2026-10-24T03:18:47.2152871Z  157 │ │                 ...(connection.protocolVersion === null
2026-10-24T03:18:47.2152970Z  158 │ │                   ? {}
2026-10-24T03:18:47.2153140Z  159 │ │                   : { "mcp-protocol-version": connection.protocolVersion }),
2026-10-24T03:18:47.2153223Z  160 │ │               },
2026-10-24T03:18:47.2153307Z  161 │ │             }),
2026-10-24T03:18:47.2153407Z  162 │ │           catch: bridgeError,
2026-10-24T03:18:47.2153487Z  163 │ │         });
2026-10-24T03:18:47.2153621Z  164 │ │         if (!response.ok && response.status !== 404) {
2026-10-24T03:18:47.2153733Z  165 │ │           return yield* Effect.fail(
2026-10-24T03:18:47.2153844Z  166 │ │             new AcpMcpOverAcpError(
2026-10-24T03:18:47.2154038Z  167 │ │               `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`,
2026-10-24T03:18:47.2154122Z  168 │ │             ),
2026-10-24T03:18:47.2154200Z  169 │ │           );
2026-10-24T03:18:47.2154277Z  170 │ │         }
2026-10-24T03:18:47.2154381Z  171 │ │         yield* Effect.promise(
2026-10-24T03:18:47.2154561Z  172 │ │           () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
2026-10-24T03:18:47.2154638Z  173 │ │         );
2026-10-24T03:18:47.2154713Z  174 │ │       }
2026-10-24T03:18:47.2154798Z  175 │ │       return {};
2026-10-24T03:18:47.2154870Z  176 │ │     });
2026-10-24T03:18:47.2154938Z  177 │ │
2026-10-24T03:18:47.2155018Z  178 │ │     return {
2026-10-24T03:18:47.2155272Z  179 │ │       connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) {
2026-10-24T03:18:47.2155475Z  180 │ │         if (request.serverId !== "t3-code") {
2026-10-24T03:18:47.2155589Z  181 │ │           return yield* Effect.fail(
2026-10-24T03:18:47.2155781Z  182 │ │             new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`),
2026-10-24T03:18:47.2155860Z  183 │ │           );
2026-10-24T03:18:47.2155936Z  184 │ │         }
2026-10-24T03:18:47.2156064Z  185 │ │         if (connections.size >= MAX_CONNECTIONS) {
2026-10-24T03:18:47.2156355Z  186 │ │           return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections."));
2026-10-24T03:18:47.2156431Z  187 │ │         }
2026-10-24T03:18:47.2156595Z  188 │ │         const connectionId = yield* options.allocateConnectionId;
2026-10-24T03:18:47.2156774Z  189 │ │         connections.set(connectionId, {
2026-10-24T03:18:47.2156966Z  190 │ │           mutex: yield* Semaphore.make(1),
2026-10-24T03:18:47.2157124Z  191 │ │           sessionId: null,
2026-10-24T03:18:47.2157291Z  192 │ │           protocolVersion: null,
2026-10-24T03:18:47.2157446Z  193 │ │           nextRequestId: 0,
2026-10-24T03:18:47.2157531Z  194 │ │         });
2026-10-24T03:18:47.2157636Z  195 │ │         return { connectionId };
2026-10-24T03:18:47.2157712Z  196 │ │       }),
2026-10-24T03:18:47.2157889Z  197 │ │       message: Effect.fn("mcpOverAcpBridge.message")(function* (request) {
2026-10-24T03:18:47.2158060Z  198 │ │         const connection = yield* connectionFor(request.connectionId);
2026-10-24T03:18:47.2158188Z  199 │ │         const id = ++connection.nextRequestId;
2026-10-24T03:18:47.2158317Z  200 │ │         const payloads = yield* send(connection, {
2026-10-24T03:18:47.2158416Z  201 │ │           jsonrpc: "2.0",
2026-10-24T03:18:47.2158498Z  202 │ │           id,
2026-10-24T03:18:47.2158603Z  203 │ │           method: request.method,
2026-10-24T03:18:47.2158766Z  204 │ │           ...(request.params == null ? {} : { params: request.params }),
2026-10-24T03:18:47.2158843Z  205 │ │         });
2026-10-24T03:18:47.2159034Z  206 │ │         const response = payloads.find((payload) => asEnvelope(payload)?.id === id);
2026-10-24T03:18:47.2159163Z  207 │ │         const envelope = asEnvelope(response);
2026-10-24T03:18:47.2159269Z  208 │ │         if (envelope === null) {
2026-10-24T03:18:47.2159376Z  209 │ │           return yield* Effect.fail(
2026-10-24T03:18:47.2159566Z  210 │ │             new AcpMcpOverAcpError("MCP server did not return a matching response."),
2026-10-24T03:18:47.2159646Z  211 │ │           );
2026-10-24T03:18:47.2159722Z  212 │ │         }
2026-10-24T03:18:47.2159841Z  213 │ │         if (envelope.error !== undefined) {
2026-10-24T03:18:47.2160041Z  214 │ │           return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error)));
2026-10-24T03:18:47.2160116Z  215 │ │         }
2026-10-24T03:18:47.2160365Z  216 │ │         return (envelope.result ?? null) as AcpSchema.MessageMcpResponse;
2026-10-24T03:18:47.2160510Z  217 │ │       }),
2026-10-24T03:18:47.2160740Z  218 │ │       notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) {
2026-10-24T03:18:47.2160906Z  219 │ │         const connection = yield* connectionFor(request.connectionId);
2026-10-24T03:18:47.2161011Z  220 │ │         yield* send(connection, {
2026-10-24T03:18:47.2161109Z  221 │ │           jsonrpc: "2.0",
2026-10-24T03:18:47.2161222Z  222 │ │           method: request.method,
2026-10-24T03:18:47.2161449Z  223 │ │           ...(request.params == null ? {} : { params: request.params }),
2026-10-24T03:18:47.2161528Z  224 │ │         });
2026-10-24T03:18:47.2161608Z  225 │ │       }),
2026-10-24T03:18:47.2161698Z  226 │ │       disconnect,
2026-10-24T03:18:47.2161808Z  227 │ │       dispose: Effect.suspend(() =>
2026-10-24T03:18:47.2161905Z  228 │ │         Effect.forEach(
2026-10-24T03:18:47.2162012Z  229 │ │           [...connections.keys()],
2026-10-24T03:18:47.2162185Z  230 │ │           (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore),
2026-10-24T03:18:47.2162287Z  231 │ │           { discard: true },
2026-10-24T03:18:47.2162364Z  232 │ │         ),
2026-10-24T03:18:47.2162439Z  233 │ │       ),
2026-10-24T03:18:47.2162511Z  234 │ │     };
2026-10-24T03:18:47.2162641Z  235 │ ╰─▶ });
2026-10-24T03:18:47.2162701Z      ╰────
2026-10-24T03:18:47.2162959Z   help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed.
2026-10-24T03:18:47.2162964Z
2026-10-24T03:18:47.2163159Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T03:18:47.2163321Z     ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15]
2026-10-24T03:18:47.2163389Z  71 │             <Pressable
2026-10-24T03:18:47.2163457Z  72 │               key={index}
2026-10-24T03:18:47.2163542Z     ·               ───────────
2026-10-24T03:18:47.2163628Z  73 │               accessibilityRole="button"
2026-10-24T03:18:47.2163683Z     ╰────
2026-10-24T03:18:47.2163833Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T03:18:47.2163836Z
2026-10-24T03:18:47.2164103Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2164284Z     ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5]
2026-10-24T03:18:47.2164339Z  58 │
2026-10-24T03:18:47.2164407Z  59 │   useEffect(() => {
2026-10-24T03:18:47.2164478Z     ·   ────┬────
2026-10-24T03:18:47.2164610Z     ·       ╰── This is the containing effect
2026-10-24T03:18:47.2164691Z  60 │     setMountedModes((current) => {
2026-10-24T03:18:47.2164772Z     ·     ───────┬───────
2026-10-24T03:18:47.2164943Z     ·            ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2165026Z  61 │       if (current.has(props.mode)) {
2026-10-24T03:18:47.2165172Z     ╰────
2026-10-24T03:18:47.2166005Z   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-24T03:18:47.2166332Z   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-24T03:18:47.2166336Z
2026-10-24T03:18:47.2166599Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2166871Z      ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7]
2026-10-24T03:18:47.2166953Z  118 │
2026-10-24T03:18:47.2167046Z  119 │   useEffect(() => {
2026-10-24T03:18:47.2167120Z      ·   ────┬────
2026-10-24T03:18:47.2167254Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2167337Z  120 │     if (orientationSettled) return;
2026-10-24T03:18:47.2167451Z  121 │     const orientation = getNativeShowcaseOrientation();
2026-10-24T03:18:47.2167524Z  122 │     if (orientation === null) {
2026-10-24T03:18:47.2167607Z  123 │       setOrientationSettled(true);
2026-10-24T03:18:47.2167699Z      ·       ──────────┬──────────
2026-10-24T03:18:47.2167875Z      ·                 ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2167937Z  124 │       return;
2026-10-24T03:18:47.2167991Z      ╰────
2026-10-24T03:18:47.2168597Z   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-24T03:18:47.2168936Z   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-24T03:18:47.2168939Z
2026-10-24T03:18:47.2169196Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2169368Z      ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7]
2026-10-24T03:18:47.2169423Z  292 │
2026-10-24T03:18:47.2169488Z  293 │   useEffect(() => {
2026-10-24T03:18:47.2169561Z      ·   ────┬────
2026-10-24T03:18:47.2169695Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2169757Z  294 │     if (
2026-10-24T03:18:47.2169823Z  295 │       scene === null ||
2026-10-24T03:18:47.2169899Z  296 │       requestedScene === null ||
2026-10-24T03:18:47.2169978Z  297 │       scene !== requestedScene ||
2026-10-24T03:18:47.2170044Z  298 │       !hasFixture ||
2026-10-24T03:18:47.2170117Z  299 │       !orientationSettled ||
2026-10-24T03:18:47.2170185Z  300 │       !themeApplied ||
2026-10-24T03:18:47.2170304Z  301 │       (scene === "agent-activity" && !agentActivityStaged) ||
2026-10-24T03:18:47.2170444Z  302 │       !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
2026-10-24T03:18:47.2170501Z  303 │     ) {
2026-10-24T03:18:47.2170569Z  304 │       setReadyScene(null);
2026-10-24T03:18:47.2170651Z      ·       ──────┬──────
2026-10-24T03:18:47.2170917Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2171042Z  305 │       return;
2026-10-24T03:18:47.2171120Z      ╰────
2026-10-24T03:18:47.2171768Z   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-24T03:18:47.2172161Z   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-24T03:18:47.2172164Z
2026-10-24T03:18:47.2172450Z   ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2172625Z      ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9]
2026-10-24T03:18:47.2172694Z  127 │     let cancelled = false;
2026-10-24T03:18:47.2172787Z  128 │     let lastOutcome: string | null = null;
2026-10-24T03:18:47.2172868Z      ·         ─────┬─────
2026-10-24T03:18:47.2173007Z      ·              ╰── 'lastOutcome' is declared here
2026-10-24T03:18:47.2173188Z  129 │     void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
2026-10-24T03:18:47.2173242Z      ╰────
2026-10-24T03:18:47.2173350Z   help: Consider removing this declaration.
2026-10-24T03:18:47.2173353Z
2026-10-24T03:18:47.2173567Z   ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed
2026-10-24T03:18:47.2173743Z     ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13]
2026-10-24T03:18:47.2173821Z  14 │ } from "@t3tools/contracts";
2026-10-24T03:18:47.2173913Z  15 │ import type {} from "@t3tools/contracts";
2026-10-24T03:18:47.2173984Z     ·             ──
2026-10-24T03:18:47.2174168Z  16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl";
2026-10-24T03:18:47.2174222Z     ╰────
2026-10-24T03:18:47.2174306Z   help: Remove empty braces
2026-10-24T03:18:47.2174309Z
2026-10-24T03:18:47.2174587Z   ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2174735Z     ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
2026-10-24T03:18:47.2174788Z  60 │ ) {
2026-10-24T03:18:47.2174963Z  61 │   const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
2026-10-24T03:18:47.2175047Z     ·         ──────┬──────
2026-10-24T03:18:47.2175188Z     ·               ╰── 'useDragRegion' is declared here
2026-10-24T03:18:47.2175279Z  62 │   const isInline = props.mode === "inline";
2026-10-24T03:18:47.2175331Z     ╰────
2026-10-24T03:18:47.2175439Z   help: Consider removing this declaration.
2026-10-24T03:18:47.2175441Z
2026-10-24T03:18:47.2175597Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2175759Z     ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5]
2026-10-24T03:18:47.2175813Z  35 │
2026-10-24T03:18:47.2175955Z  36 │   const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0);
2026-10-24T03:18:47.2176121Z     ·         ────────┬────────
2026-10-24T03:18:47.2176359Z     ·                 ╰── `inspectorProgress` originates here
2026-10-24T03:18:47.2176454Z  37 │   const { renderedInspectorWidth } = props;
2026-10-24T03:18:47.2176591Z  38 │   const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
2026-10-24T03:18:47.2176645Z  39 │
2026-10-24T03:18:47.2176793Z  40 │   const onClosed = props.onClosed;
2026-10-24T03:18:47.2176896Z  41 │   useEffect(() => {
2026-10-24T03:18:47.2177035Z  42 │     inspectorProgress.value = withTiming(
2026-10-24T03:18:47.2177162Z     ·     ────────┬────────
2026-10-24T03:18:47.2177334Z     ·             ╰── `inspectorProgress` cannot be modified
2026-10-24T03:18:47.2177414Z  43 │       inspectorVisible ? 1 : 0,
2026-10-24T03:18:47.2177467Z     ╰────
2026-10-24T03:18:47.2177744Z   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-24T03:18:47.2178065Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2178068Z
2026-10-24T03:18:47.2178229Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2178393Z     ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7]
2026-10-24T03:18:47.2178486Z  37 │   const { renderedInspectorWidth } = props;
2026-10-24T03:18:47.2178616Z  38 │   const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
2026-10-24T03:18:47.2178708Z     ·         ──────────┬─────────
2026-10-24T03:18:47.2178872Z     ·                   ╰── `renderedContentWidth` originates here
2026-10-24T03:18:47.2178928Z  39 │
2026-10-24T03:18:47.2179006Z  40 │   const onClosed = props.onClosed;
2026-10-24T03:18:47.2179071Z  41 │   useEffect(() => {
2026-10-24T03:18:47.2179161Z  42 │     inspectorProgress.value = withTiming(
2026-10-24T03:18:47.2179238Z  43 │       inspectorVisible ? 1 : 0,
2026-10-24T03:18:47.2179308Z  44 │       WORKSPACE_PANE_TIMING,
2026-10-24T03:18:47.2179376Z  45 │       (finished) => {
2026-10-24T03:18:47.2179517Z  46 │         if (finished === true && !inspectorVisible && onClosed !== undefined) {
2026-10-24T03:18:47.2179592Z  47 │           runOnJS(onClosed)();
2026-10-24T03:18:47.2179649Z  48 │         }
2026-10-24T03:18:47.2179707Z  49 │       },
2026-10-24T03:18:47.2179763Z  50 │     );
2026-10-24T03:18:47.2179897Z  51 │     const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0;
2026-10-24T03:18:47.2180048Z  52 │     renderedInspectorWidth.set(
2026-10-24T03:18:47.2180278Z  53 │       resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING),
2026-10-24T03:18:47.2180334Z  54 │     );
2026-10-24T03:18:47.2180387Z  55 │   }, [
2026-10-24T03:18:47.2180457Z  56 │     inspectorProgress,
2026-10-24T03:18:47.2180525Z  57 │     inspectorVisible,
2026-10-24T03:18:47.2180590Z  58 │     inspectorWidth,
2026-10-24T03:18:47.2180650Z  59 │     onClosed,
2026-10-24T03:18:47.2180724Z  60 │     renderedInspectorWidth,
2026-10-24T03:18:47.2180785Z  61 │     resizing,
2026-10-24T03:18:47.2180841Z  62 │   ]);
2026-10-24T03:18:47.2180900Z  63 │
2026-10-24T03:18:47.2181000Z  64 │   useEffect(() => {
2026-10-24T03:18:47.2181121Z  65 │     const targetWidth = inspectorWidth ?? 0;
2026-10-24T03:18:47.2181208Z  66 │     if (!inspectorVisible || resizing) {
2026-10-24T03:18:47.2181312Z  67 │       renderedContentWidth.value = targetWidth;
2026-10-24T03:18:47.2181405Z     ·       ──────────┬─────────
2026-10-24T03:18:47.2181570Z     ·                 ╰── `renderedContentWidth` cannot be modified
2026-10-24T03:18:47.2181630Z  68 │       return;
2026-10-24T03:18:47.2181681Z     ╰────
2026-10-24T03:18:47.2181954Z   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-24T03:18:47.2182274Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2182276Z
2026-10-24T03:18:47.2182451Z   ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2182650Z     ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14]
2026-10-24T03:18:47.2182708Z  52 │
2026-10-24T03:18:47.2182774Z  53 │   for (const {} of [
2026-10-24T03:18:47.2182848Z     ·              ──
2026-10-24T03:18:47.2182913Z  54 │     { healthy: true },
2026-10-24T03:18:47.2182967Z     ╰────
2026-10-24T03:18:47.2183200Z   help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2183203Z
2026-10-24T03:18:47.2183470Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2183614Z       ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7]
2026-10-24T03:18:47.2183671Z  3754 │
2026-10-24T03:18:47.2183878Z  3755 │ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, OpenCodeAdapterV2DriverEnv> =
2026-10-24T03:18:47.2183953Z       ·       ──┬──
2026-10-24T03:18:47.2184080Z       ·         ╰── 'layer' is declared here
2026-10-24T03:18:47.2184146Z  3756 │   Layer.effect(
2026-10-24T03:18:47.2184199Z       ╰────
2026-10-24T03:18:47.2184306Z   help: Consider removing this declaration.
2026-10-24T03:18:47.2184308Z
2026-10-24T03:18:47.2184514Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2184681Z      ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7]
2026-10-24T03:18:47.2184738Z  214 │     }
2026-10-24T03:18:47.2184808Z  215 │   }, [wrappedRender]);
2026-10-24T03:18:47.2184887Z      ·       ──────┬──────
2026-10-24T03:18:47.2185121Z      ·             ╰── Unnecessary dependency `wrappedRender`
2026-10-24T03:18:47.2185218Z  216 │
2026-10-24T03:18:47.2185295Z      ╰────
2026-10-24T03:18:47.2185619Z   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-24T03:18:47.2185946Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2185949Z
2026-10-24T03:18:47.2186270Z   ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-24T03:18:47.2186434Z      ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35]
2026-10-24T03:18:47.2186493Z  816 │       >
2026-10-24T03:18:47.2186607Z  817 │         <AdaptiveWorkspaceContext value={contextValue}>
2026-10-24T03:18:47.2186790Z      ·                                   ────────────────────
2026-10-24T03:18:47.2186942Z  818 │           <NativeWorkspaceInspectorContext
2026-10-24T03:18:47.2187024Z      ╰────
2026-10-24T03:18:47.2187272Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-24T03:18:47.2187418Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-24T03:18:47.2187421Z
2026-10-24T03:18:47.2187669Z   ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-24T03:18:47.2187836Z      ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:832:42]
2026-10-24T03:18:47.2187891Z  831 │     >
2026-10-24T03:18:47.2188026Z  832 │       <AdaptiveWorkspaceContext.Provider value={contextValue}>
2026-10-24T03:18:47.2188154Z      ·                                          ────────────────────
2026-10-24T03:18:47.2188256Z  833 │         <WindowHingeContext value={windowHinge}>
2026-10-24T03:18:47.2188307Z      ╰────
2026-10-24T03:18:47.2188533Z   help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-24T03:18:47.2188671Z         Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-24T03:18:47.2188674Z
2026-10-24T03:18:47.2188935Z   ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2189062Z      ╭─[apps/server/src/serverRuntimeStartup.ts:728:7]
2026-10-24T03:18:47.2189115Z  727 │
2026-10-24T03:18:47.2189203Z  728 │ const layer = layerWithOptions();
2026-10-24T03:18:47.2189278Z      ·       ──┬──
2026-10-24T03:18:47.2189406Z      ·         ╰── 'layer' is declared here
2026-10-24T03:18:47.2189457Z      ╰────
2026-10-24T03:18:47.2189564Z   help: Consider removing this declaration.
2026-10-24T03:18:47.2189566Z
2026-10-24T03:18:47.2190055Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-24T03:18:47.2190179Z      ╭─[packages/effect-acp/src/errors.test.ts:129:28]
2026-10-24T03:18:47.2190272Z  128 │       const secret = "acp-summary-secret";
2026-10-24T03:18:47.2190386Z  129 │       const cause = yield* Schema.decodeUnknownEffect(
2026-10-24T03:18:47.2190579Z      ·                            ──────────────────────────
2026-10-24T03:18:47.2190711Z  130 │         Schema.Struct({
2026-10-24T03:18:47.2190789Z      ╰────
2026-10-24T03:18:47.2190792Z
2026-10-24T03:18:47.2191148Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T03:18:47.2191272Z     ╭─[packages/effect-acp/src/schema.test.ts:18:12]
2026-10-24T03:18:47.2191455Z  17 │     const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } };
2026-10-24T03:18:47.2191639Z  18 │     expect(Schema.is(V1.AvailableCommand)(command)).toBe(true);
2026-10-24T03:18:47.2191718Z     ·            ─────────
2026-10-24T03:18:47.2191780Z  19 │     expect(
2026-10-24T03:18:47.2191833Z     ╰────
2026-10-24T03:18:47.2191836Z
2026-10-24T03:18:47.2192182Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T03:18:47.2192304Z     ╭─[packages/effect-acp/src/schema.test.ts:20:7]
2026-10-24T03:18:47.2192365Z  19 │     expect(
2026-10-24T03:18:47.2192540Z  20 │       Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }),
2026-10-24T03:18:47.2192616Z     ·       ─────────
2026-10-24T03:18:47.2192678Z  21 │     ).toBe(true);
2026-10-24T03:18:47.2192731Z     ╰────
2026-10-24T03:18:47.2192734Z
2026-10-24T03:18:47.2192969Z   ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used.
2026-10-24T03:18:47.2193087Z     ╭─[apps/server/src/checkpointing/Utils.ts:12:10]
2026-10-24T03:18:47.2193139Z  11 │
2026-10-24T03:18:47.2193243Z  12 │ function resolveThreadWorkspaceCwd(input: {
2026-10-24T03:18:47.2193350Z     ·          ────────────┬────────────
2026-10-24T03:18:47.2193524Z     ·                      ╰── 'resolveThreadWorkspaceCwd' is declared here
2026-10-24T03:18:47.2193590Z  13 │   readonly thread: {
2026-10-24T03:18:47.2193644Z     ╰────
2026-10-24T03:18:47.2193750Z   help: Consider removing this declaration.
2026-10-24T03:18:47.2193752Z
2026-10-24T03:18:47.2194222Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-24T03:18:47.2194347Z      ╭─[packages/effect-acp/src/protocol.test.ts:500:31]
2026-10-24T03:18:47.2194401Z  499 │
2026-10-24T03:18:47.2194524Z  500 │       const response = yield* Schema.decodeUnknownEffect(
2026-10-24T03:18:47.2194648Z      ·                               ──────────────────────────
2026-10-24T03:18:47.2194757Z  501 │         Schema.fromJsonString(JsonRpcErrorResponse),
2026-10-24T03:18:47.2194811Z      ╰────
2026-10-24T03:18:47.2194814Z
2026-10-24T03:18:47.2195272Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-24T03:18:47.2195398Z       ╭─[apps/server/src/serverSettings.test.ts:1741:32]
2026-10-24T03:18:47.2195572Z  1740 │       const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5");
2026-10-24T03:18:47.2195836Z  1741 │       const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
2026-10-24T03:18:47.2196083Z       ·                                ───────────────────
2026-10-24T03:18:47.2196197Z  1742 │       const scriptsJson = yield* Schema.encodeEffect(
2026-10-24T03:18:47.2196252Z       ╰────
2026-10-24T03:18:47.2196255Z
2026-10-24T03:18:47.2196780Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
2026-10-24T03:18:47.2196944Z       ╭─[apps/server/src/serverSettings.test.ts:1742:34]
2026-10-24T03:18:47.2197132Z  1741 │       const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
2026-10-24T03:18:47.2197242Z  1742 │       const scriptsJson = yield* Schema.encodeEffect(
2026-10-24T03:18:47.2197363Z       ·                                  ───────────────────
2026-10-24T03:18:47.2197485Z  1743 │         Schema.fromJsonString(Schema.Array(ProjectScript)),
2026-10-24T03:18:47.2197539Z       ╰────
2026-10-24T03:18:47.2197542Z
2026-10-24T03:18:47.2197770Z   ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
2026-10-24T03:18:47.2197892Z      ╭─[apps/server/src/terminal/Manager.test.ts:731:31]
2026-10-24T03:18:47.2197950Z  730 │       );
2026-10-24T03:18:47.2198126Z  731 │       const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot;
2026-10-24T03:18:47.2198226Z      ·                               ──────
2026-10-24T03:18:47.2198348Z  732 │       expect(snapshot?.history).toBe("aa😀\rEND");
2026-10-24T03:18:47.2198400Z      ╰────
2026-10-24T03:18:47.2198590Z   help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
2026-10-24T03:18:47.2198596Z
2026-10-24T03:18:47.2198761Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2198928Z     ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7]
2026-10-24T03:18:47.2199027Z  53 │ function usePulseAnimation(pulse: boolean) {
2026-10-24T03:18:47.2199123Z  54 │   const pulseProgress = useSharedValue(0);
2026-10-24T03:18:47.2199208Z     ·         ──────┬──────
2026-10-24T03:18:47.2199352Z     ·               ╰── `pulseProgress` originates here
2026-10-24T03:18:47.2199406Z  55 │
2026-10-24T03:18:47.2199474Z  56 │   useEffect(() => {
2026-10-24T03:18:47.2199540Z  57 │     if (pulse) {
2026-10-24T03:18:47.2199630Z  58 │       pulseProgress.value = withRepeat(
2026-10-24T03:18:47.2199716Z     ·       ──────┬──────
2026-10-24T03:18:47.2199867Z     ·             ╰── `pulseProgress` cannot be modified
2026-10-24T03:18:47.2199938Z  59 │         withTiming(1, {
2026-10-24T03:18:47.2199991Z     ╰────
2026-10-24T03:18:47.2200258Z   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-24T03:18:47.2200571Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2200573Z
2026-10-24T03:18:47.2200949Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T03:18:47.2201145Z       ╭─[packages/effect-acp/src/client.ts:1269:11]
2026-10-24T03:18:47.2201385Z  1268 │         extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
2026-10-24T03:18:47.2201564Z  1269 │           Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
2026-10-24T03:18:47.2201672Z       ·           ──────────────────────────
2026-10-24T03:18:47.2201825Z  1270 │             Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
2026-10-24T03:18:47.2201877Z       ╰────
2026-10-24T03:18:47.2201882Z
2026-10-24T03:18:47.2202169Z   ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-24T03:18:47.2202307Z     ╭─[apps/web/src/lib/composerContextReferences.ts:90:40]
2026-10-24T03:18:47.2202384Z  89 │   let cursor = prompt.length;
2026-10-24T03:18:47.2202493Z  90 │   for (const occurrence of occurrences.reverse()) {
2026-10-24T03:18:47.2202603Z     ·                                        ───────
2026-10-24T03:18:47.2202689Z  91 │     let { start, end } = occurrence;
2026-10-24T03:18:47.2202744Z     ╰────
2026-10-24T03:18:47.2203007Z   help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-24T03:18:47.2203010Z
2026-10-24T03:18:47.2203271Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2203445Z     ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5]
2026-10-24T03:18:47.2203500Z  76 │
2026-10-24T03:18:47.2203567Z  77 │   useEffect(() => {
2026-10-24T03:18:47.2203639Z     ·   ────┬────
2026-10-24T03:18:47.2203778Z     ·       ╰── This is the containing effect
2026-10-24T03:18:47.2203911Z  78 │     const { host, code } = parsePairingUrl(connectionPairingUrl);
2026-10-24T03:18:47.2203982Z  79 │     setHostInput(host);
2026-10-24T03:18:47.2204058Z     ·     ──────┬─────
2026-10-24T03:18:47.2204229Z     ·           ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2204298Z  80 │     setCodeInput(code);
2026-10-24T03:18:47.2204351Z     ╰────
2026-10-24T03:18:47.2204956Z   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-24T03:18:47.2205369Z   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-24T03:18:47.2205404Z
2026-10-24T03:18:47.2205805Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2206009Z     ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5]
2026-10-24T03:18:47.2206064Z  82 │
2026-10-24T03:18:47.2206128Z  83 │   useEffect(() => {
2026-10-24T03:18:47.2206200Z     ·   ────┬────
2026-10-24T03:18:47.2206333Z     ·       ╰── This is the containing effect
2026-10-24T03:18:47.2206425Z  84 │     if (routePairingUrl.length === 0) {
2026-10-24T03:18:47.2206485Z  85 │       return;
2026-10-24T03:18:47.2206541Z  86 │     }
2026-10-24T03:18:47.2206594Z  87 │
2026-10-24T03:18:47.2206776Z  88 │     const { host, code } = parsePairingUrl(routePairingUrl);
2026-10-24T03:18:47.2206876Z  89 │     setHostInput(host);
2026-10-24T03:18:47.2206990Z     ·     ──────┬─────
2026-10-24T03:18:47.2207266Z     ·           ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2207369Z  90 │     setCodeInput(code);
2026-10-24T03:18:47.2207456Z     ╰────
2026-10-24T03:18:47.2208164Z   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-24T03:18:47.2208498Z   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-24T03:18:47.2208503Z
2026-10-24T03:18:47.2208763Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2208933Z     ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7]
2026-10-24T03:18:47.2208984Z  92 │
2026-10-24T03:18:47.2209049Z  93 │   useEffect(() => {
2026-10-24T03:18:47.2209120Z     ·   ────┬────
2026-10-24T03:18:47.2209249Z     ·       ╰── This is the containing effect
2026-10-24T03:18:47.2209335Z  94 │     if (pairingConnectionError) {
2026-10-24T03:18:47.2209409Z  95 │       setIsSubmitting(false);
2026-10-24T03:18:47.2209491Z     ·       ───────┬───────
2026-10-24T03:18:47.2209667Z     ·              ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2209727Z  96 │     }
2026-10-24T03:18:47.2209780Z     ╰────
2026-10-24T03:18:47.2210380Z   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-24T03:18:47.2210702Z   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-24T03:18:47.2210705Z
2026-10-24T03:18:47.2210998Z   ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
2026-10-24T03:18:47.2211224Z      ╭─[packages/provider-cursor/src/server/auth.ts:249:20]
2026-10-24T03:18:47.2211366Z  248 │     },
2026-10-24T03:18:47.2211482Z  249 │     (effect, flow, stopSessions) =>
2026-10-24T03:18:47.2211578Z      ·                    ──────┬─────
2026-10-24T03:18:47.2211732Z      ·                          ╰── 'stopSessions' is declared here
2026-10-24T03:18:47.2211798Z  250 │       effect.pipe(
2026-10-24T03:18:47.2211850Z      ╰────
2026-10-24T03:18:47.2211953Z   help: Consider removing this parameter.
2026-10-24T03:18:47.2211956Z
2026-10-24T03:18:47.2212127Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2212337Z      ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39]
2026-10-24T03:18:47.2212394Z  276 │
2026-10-24T03:18:47.2212587Z  277 │ ╭─▶   return createElement(RawNativeView, {
2026-10-24T03:18:47.2212688Z  278 │ │       ...nativeProps,
2026-10-24T03:18:47.2212840Z  279 │ │       refreshEnabled: props.onPullToRefresh !== undefined,
2026-10-24T03:18:47.2212933Z  280 │ │       ref: nativeRef,
2026-10-24T03:18:47.2213065Z  281 │ ├─▶   });
2026-10-24T03:18:47.2213310Z      · ╰──── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2213368Z  282 │     }
2026-10-24T03:18:47.2213422Z      ╰────
2026-10-24T03:18:47.2213908Z   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-24T03:18:47.2214214Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2214217Z
2026-10-24T03:18:47.2214511Z   ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2214670Z     ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7]
2026-10-24T03:18:47.2214724Z  14 │
2026-10-24T03:18:47.2214795Z  15 │ const legacyCredentials = {
2026-10-24T03:18:47.2214882Z     ·       ────────┬────────
2026-10-24T03:18:47.2215033Z     ·               ╰── 'legacyCredentials' is declared here
2026-10-24T03:18:47.2215109Z  16 │   version: 1 as const,
2026-10-24T03:18:47.2215162Z     ╰────
2026-10-24T03:18:47.2215271Z   help: Consider removing this declaration.
2026-10-24T03:18:47.2215273Z
2026-10-24T03:18:47.2215531Z   ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used.
2026-10-24T03:18:47.2215648Z     ╭─[apps/web/src/lib/terminalContext.ts:56:10]
2026-10-24T03:18:47.2215700Z  55 │
2026-10-24T03:18:47.2215801Z  56 │ function normalizeTerminalContextSelection(
2026-10-24T03:18:47.2215915Z     ·          ────────────────┬────────────────
2026-10-24T03:18:47.2216109Z     ·                          ╰── 'normalizeTerminalContextSelection' is declared here
2026-10-24T03:18:47.2216198Z  57 │   selection: TerminalContextSelection,
2026-10-24T03:18:47.2216249Z     ╰────
2026-10-24T03:18:47.2216429Z   help: Consider removing this declaration.
2026-10-24T03:18:47.2216464Z
2026-10-24T03:18:47.2216888Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2217082Z      ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7]
2026-10-24T03:18:47.2217137Z  211 │   };
2026-10-24T03:18:47.2217206Z  212 │   useEffect(() => {
2026-10-24T03:18:47.2217297Z      ·   ────┬────
2026-10-24T03:18:47.2217489Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2217668Z  213 │     const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null;
2026-10-24T03:18:47.2217737Z  214 │     if (inserted) {
2026-10-24T03:18:47.2217816Z  215 │       setSelection((current) =>
2026-10-24T03:18:47.2217904Z      ·       ──────┬─────
2026-10-24T03:18:47.2218078Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2218250Z  216 │         current.start === inserted.start && current.end === inserted.end ? current : inserted,
2026-10-24T03:18:47.2218304Z      ╰────
2026-10-24T03:18:47.2218909Z   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-24T03:18:47.2219236Z   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-24T03:18:47.2219242Z
2026-10-24T03:18:47.2219504Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2219674Z      ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7]
2026-10-24T03:18:47.2219752Z  284 │   }, [hasWorkspaceSnapshot]);
2026-10-24T03:18:47.2219817Z  285 │   useEffect(() => {
2026-10-24T03:18:47.2219888Z      ·   ────┬────
2026-10-24T03:18:47.2220021Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2220172Z  286 │     if (!environmentId || !projectCwd || !selectedProviderInstanceId) return;
2026-10-24T03:18:47.2220324Z  287 │     const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`;
2026-10-24T03:18:47.2220395Z  288 │     const now = Date.now();
2026-10-24T03:18:47.2220513Z  289 │     const lastRequest = workspaceRefreshKeyRef.current;
2026-10-24T03:18:47.2220578Z  290 │     if (
2026-10-24T03:18:47.2220660Z  291 │       lastRequest?.key === key &&
2026-10-24T03:18:47.2220800Z  292 │       now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS
2026-10-24T03:18:47.2220858Z  293 │     )
2026-10-24T03:18:47.2220922Z  294 │       return;
2026-10-24T03:18:47.2221100Z  295 │     if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) {
2026-10-24T03:18:47.2221186Z  296 │       setWorkspaceRefreshRetry(null);
2026-10-24T03:18:47.2221285Z      ·       ────────────┬───────────
2026-10-24T03:18:47.2221466Z      ·                   ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2221529Z  297 │       return;
2026-10-24T03:18:47.2221582Z      ╰────
2026-10-24T03:18:47.2222283Z   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-24T03:18:47.2222698Z   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-24T03:18:47.2222701Z
2026-10-24T03:18:47.2222907Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2223074Z      ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5]
2026-10-24T03:18:47.2223147Z  325 │   }, [
2026-10-24T03:18:47.2223248Z  326 │     draftMessage,
2026-10-24T03:18:47.2223344Z      ·     ──────┬─────
2026-10-24T03:18:47.2223497Z      ·           ╰── Unnecessary dependency `draftMessage`
2026-10-24T03:18:47.2223567Z  327 │     environmentId,
2026-10-24T03:18:47.2223622Z      ╰────
2026-10-24T03:18:47.2223929Z   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-24T03:18:47.2224258Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2224261Z
2026-10-24T03:18:47.2224517Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2224676Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
2026-10-24T03:18:47.2224744Z  259 │     .join("|");
2026-10-24T03:18:47.2224812Z  260 │   useEffect(() => {
2026-10-24T03:18:47.2224882Z      ·   ────┬────
2026-10-24T03:18:47.2225014Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2225077Z  261 │     stop();
2026-10-24T03:18:47.2225148Z      ·     ──┬─
2026-10-24T03:18:47.2225314Z      ·       ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2225381Z  262 │   }, [orderVersion]);
2026-10-24T03:18:47.2225435Z      ╰────
2026-10-24T03:18:47.2226067Z   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-24T03:18:47.2226400Z   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-24T03:18:47.2226405Z
2026-10-24T03:18:47.2226627Z   ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T03:18:47.2226898Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
2026-10-24T03:18:47.2226982Z  260 │   useEffect(() => {
2026-10-24T03:18:47.2227043Z  261 │     stop();
2026-10-24T03:18:47.2227112Z      ·     ──┬─
2026-10-24T03:18:47.2227241Z      ·       ╰── Missing dependency `stop`
2026-10-24T03:18:47.2227309Z  262 │   }, [orderVersion]);
2026-10-24T03:18:47.2227389Z      ·       ──────┬─────
2026-10-24T03:18:47.2227612Z      ·             ╰── Unnecessary dependency `orderVersion`
2026-10-24T03:18:47.2227722Z  263 │   useEffect(
2026-10-24T03:18:47.2227803Z      ╰────
2026-10-24T03:18:47.2228255Z   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-24T03:18:47.2228654Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2228657Z
2026-10-24T03:18:47.2228805Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2228967Z     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9]
2026-10-24T03:18:47.2229049Z  95 │   const latest = useRef(props);
2026-10-24T03:18:47.2229119Z  96 │   latest.current = props;
2026-10-24T03:18:47.2229225Z     ·   ───┬──────┬───
2026-10-24T03:18:47.2229407Z     ·      │      ╰── Cannot update ref value during render
2026-10-24T03:18:47.2229524Z     ·      ╰── This value is a ref
2026-10-24T03:18:47.2229591Z  97 │   const gesture = useMemo(
2026-10-24T03:18:47.2229644Z     ╰────
2026-10-24T03:18:47.2230133Z   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-24T03:18:47.2230441Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2230446Z
2026-10-24T03:18:47.2230592Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2230750Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18]
2026-10-24T03:18:47.2230817Z  103 │         .runOnJS(true)
2026-10-24T03:18:47.2230920Z  104 │         .onStart(() => latest.current.onStart())
2026-10-24T03:18:47.2231038Z      ·                  ───────────────┬──────────────
2026-10-24T03:18:47.2231241Z      ·                                 ╰── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2231379Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2231432Z      ╰────
2026-10-24T03:18:47.2231997Z   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-24T03:18:47.2232376Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2232379Z
2026-10-24T03:18:47.2232521Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2232681Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19]
2026-10-24T03:18:47.2232777Z  104 │         .onStart(() => latest.current.onStart())
2026-10-24T03:18:47.2232968Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2233130Z      ·                   ──────────────────────────┬─────────────────────────
2026-10-24T03:18:47.2233350Z      ·                                             ╰── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2233477Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2233529Z      ╰────
2026-10-24T03:18:47.2233992Z   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-24T03:18:47.2234293Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2234295Z
2026-10-24T03:18:47.2234444Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2234607Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16]
2026-10-24T03:18:47.2234738Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2234860Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2235008Z      ·                ──────────────────────────┬─────────────────────────
2026-10-24T03:18:47.2235220Z      ·                                          ╰── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2235348Z  107 │         .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-24T03:18:47.2235399Z      ╰────
2026-10-24T03:18:47.2235892Z   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-24T03:18:47.2236193Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2236195Z
2026-10-24T03:18:47.2239125Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2239297Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21]
2026-10-24T03:18:47.2239425Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2239548Z  107 │         .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-24T03:18:47.2239687Z      ·                     ───────────────────────┬──────────────────────
2026-10-24T03:18:47.2240007Z      ·                                            ╰── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2240139Z  108 │     [props.disabled],
2026-10-24T03:18:47.2240217Z      ╰────
2026-10-24T03:18:47.2240716Z   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-24T03:18:47.2241101Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2241104Z
2026-10-24T03:18:47.2241253Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2241422Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9]
2026-10-24T03:18:47.2241538Z  248 │   const latest = useRef({ rows, planners, moveThread });
2026-10-24T03:18:47.2241645Z  249 │   latest.current = { rows, planners, moveThread };
2026-10-24T03:18:47.2241752Z      ·   ───┬──────┬───
2026-10-24T03:18:47.2241937Z      ·      │      ╰── Cannot update ref value during render
2026-10-24T03:18:47.2242052Z      ·      ╰── This value is a ref
2026-10-24T03:18:47.2242107Z  250 │
2026-10-24T03:18:47.2242160Z      ╰────
2026-10-24T03:18:47.2242624Z   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-24T03:18:47.2242924Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2242929Z
2026-10-24T03:18:47.2243083Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2243246Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22]
2026-10-24T03:18:47.2243366Z  246 │   const [preview, setPreview] = useState<Drag | null>(null);
2026-10-24T03:18:47.2243483Z  247 │   const translateY = useRef(new Animated.Value(0)).current;
2026-10-24T03:18:47.2243611Z      ·                      ──────────────────┬──────────────────
2026-10-24T03:18:47.2243787Z      ·                                        ╰── Cannot access ref value during render
2026-10-24T03:18:47.2243905Z  248 │   const latest = useRef({ rows, planners, moveThread });
2026-10-24T03:18:47.2243961Z      ╰────
2026-10-24T03:18:47.2244442Z   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-24T03:18:47.2244742Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2244744Z
2026-10-24T03:18:47.2244919Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2245082Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16]
2026-10-24T03:18:47.2245151Z  323 │     update(0);
2026-10-24T03:18:47.2245309Z  324 │     let last = performance.now();
2026-10-24T03:18:47.2245466Z      ·                ────────┬────────
2026-10-24T03:18:47.2245633Z      ·                        ╰── Cannot call impure function
2026-10-24T03:18:47.2245779Z  325 │     const tick = () => {
2026-10-24T03:18:47.2245858Z      ╰────
2026-10-24T03:18:47.2246190Z   help: `performance.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2246498Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2246500Z
2026-10-24T03:18:47.2246741Z   ⚠ react(capitalized-calls): Capitalized function called without JSX
2026-10-24T03:18:47.2247004Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15]
2026-10-24T03:18:47.2247071Z   98 │     () =>
2026-10-24T03:18:47.2247139Z   99 │       Gesture.Pan()
2026-10-24T03:18:47.2247217Z      ·               ─┬─
2026-10-24T03:18:47.2247351Z      ·                ╰── `Pan` may be a component
2026-10-24T03:18:47.2247435Z  100 │         .enabled(!props.disabled)
2026-10-24T03:18:47.2247487Z      ╰────
2026-10-24T03:18:47.2247768Z   help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
2026-10-24T03:18:47.2248219Z   note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-24T03:18:47.2248222Z
2026-10-24T03:18:47.2248417Z   ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T03:18:47.2248582Z      ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5]
2026-10-24T03:18:47.2248651Z  103 │         .runOnJS(true)
2026-10-24T03:18:47.2248754Z  104 │         .onStart(() => latest.current.onStart())
2026-10-24T03:18:47.2248842Z      ·                        ───┬──
2026-10-24T03:18:47.2249281Z      ·                           ╰── Missing dependency `latest`. 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-24T03:18:47.2249416Z  105 │         .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2249548Z  106 │         .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2249675Z  107 │         .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-24T03:18:47.2249743Z  108 │     [props.disabled],
2026-10-24T03:18:47.2249827Z      ·     ────────┬───────
2026-10-24T03:18:47.2250020Z      ·             ╰── This dependency list is missing values used by the callback
2026-10-24T03:18:47.2250076Z  109 │   );
2026-10-24T03:18:47.2250129Z      ╰────
2026-10-24T03:18:47.2250335Z   help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T03:18:47.2250651Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2250654Z
2026-10-24T03:18:47.2251021Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2251286Z      ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5]
2026-10-24T03:18:47.2251342Z  398 │
2026-10-24T03:18:47.2251409Z  399 │   useEffect(() => {
2026-10-24T03:18:47.2251484Z      ·   ────┬────
2026-10-24T03:18:47.2251615Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2251708Z  400 │     setInspectorSelection((current) => {
2026-10-24T03:18:47.2251798Z      ·     ──────────┬──────────
2026-10-24T03:18:47.2252032Z      ·               ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2252151Z  401 │       if (props.renderInspector === undefined) {
2026-10-24T03:18:47.2252205Z      ╰────
2026-10-24T03:18:47.2252821Z   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-24T03:18:47.2253159Z   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-24T03:18:47.2253162Z
2026-10-24T03:18:47.2253386Z   ⚠ react(no-unstable-nested-components): Do not define components during render.
2026-10-24T03:18:47.2253541Z      ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24]
2026-10-24T03:18:47.2253705Z  527 │       const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
2026-10-24T03:18:47.2253886Z  528 │ ╭─▶   const GitInspector = () => (
2026-10-24T03:18:47.2253988Z  529 │ │       <GitOverviewSheet
2026-10-24T03:18:47.2254112Z  530 │ │         headerInset={inspectorHeaderInset}
2026-10-24T03:18:47.2254222Z  531 │ │         presentation="inspector"
2026-10-24T03:18:47.2254408Z  532 │ │         route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
2026-10-24T03:18:47.2254485Z  533 │ │       />
2026-10-24T03:18:47.2254613Z  534 │ ╰─▶   );
2026-10-24T03:18:47.2254696Z  535 │       const FilesInspector = () =>
2026-10-24T03:18:47.2254749Z      ╰────
2026-10-24T03:18:47.2255053Z   help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
2026-10-24T03:18:47.2255087Z
2026-10-24T03:18:47.2255358Z   ⚠ react(no-unstable-nested-components): Do not define components during render.
2026-10-24T03:18:47.2255514Z      ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26]
2026-10-24T03:18:47.2255574Z  534 │       );
2026-10-24T03:18:47.2255747Z  535 │ ╭─▶   const FilesInspector = () =>
2026-10-24T03:18:47.2255917Z  536 │ │       selectedThread !== null && selectedThreadCwd !== null ? (
2026-10-24T03:18:47.2256077Z  537 │ │         <ThreadFileNavigatorPane
2026-10-24T03:18:47.2256186Z  538 │ │           cwd={selectedThreadCwd}
2026-10-24T03:18:47.2256327Z  539 │ │           environmentId={selectedThread.environmentId}
2026-10-24T03:18:47.2256457Z  540 │ │           headerInset={inspectorHeaderInset}
2026-10-24T03:18:47.2256607Z  541 │ │           projectName={selectedThreadProject?.title ?? "Files"}
2026-10-24T03:18:47.2256771Z  542 │ │           selectedPath={null}
2026-10-24T03:18:47.2256981Z  543 │ │           onSelectFile={handleSelectInspectorFile}
2026-10-24T03:18:47.2257099Z  544 │ │         />
2026-10-24T03:18:47.2257318Z  545 │ ╰─▶     ) : null;
2026-10-24T03:18:47.2257557Z  546 │       const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
2026-10-24T03:18:47.2257612Z      ╰────
2026-10-24T03:18:47.2257840Z   help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
2026-10-24T03:18:47.2257843Z
2026-10-24T03:18:47.2258092Z   ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
2026-10-24T03:18:47.2258235Z      ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13]
2026-10-24T03:18:47.2258361Z  984 │           const changedBeforeDecline = draftChangedSinceSend();
2026-10-24T03:18:47.2258607Z  985 │ ╭─▶       const pendingIdsBeforeDecline = pendingApprovalsRef.current.map(
2026-10-24T03:18:47.2258730Z  986 │ │           (approval) => approval.requestId,
2026-10-24T03:18:47.2258863Z  987 │ ╰─▶       );
2026-10-24T03:18:47.2259003Z  988 │           const approvalResponding = approvalsToDecline.some((approval) =>
2026-10-24T03:18:47.2259056Z      ╰────
2026-10-24T03:18:47.2259138Z   help: Switch to `Set`
2026-10-24T03:18:47.2259145Z
2026-10-24T03:18:47.2259405Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2259568Z     ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5]
2026-10-24T03:18:47.2259681Z  37 │   const [initialized, setInitialized] = useState(false);
2026-10-24T03:18:47.2259750Z  38 │   useLayoutEffect(() => {
2026-10-24T03:18:47.2259830Z     ·   ───────┬───────
2026-10-24T03:18:47.2259965Z     ·          ╰── This is the containing effect
2026-10-24T03:18:47.2260028Z  39 │     reset();
2026-10-24T03:18:47.2260098Z  40 │     setInitialized(true);
2026-10-24T03:18:47.2260175Z     ·     ───────┬──────
2026-10-24T03:18:47.2260429Z     ·            ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2260541Z  41 │   }, [reset]);
2026-10-24T03:18:47.2260621Z     ╰────
2026-10-24T03:18:47.2261276Z   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-24T03:18:47.2261671Z   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-24T03:18:47.2261674Z
2026-10-24T03:18:47.2261933Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2262101Z     ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5]
2026-10-24T03:18:47.2262158Z  88 │
2026-10-24T03:18:47.2262222Z  89 │   useEffect(() => {
2026-10-24T03:18:47.2262295Z     ·   ────┬────
2026-10-24T03:18:47.2262426Z     ·       ╰── This is the containing effect
2026-10-24T03:18:47.2262587Z  90 │     if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
2026-10-24T03:18:47.2262691Z  91 │     const branchName = initialProjectRef.branch;
2026-10-24T03:18:47.2262759Z  92 │     let active = true;
2026-10-24T03:18:47.2262858Z  93 │     setPendingCheckouts((count) => count + 1);
2026-10-24T03:18:47.2262943Z     ·     ─────────┬─────────
2026-10-24T03:18:47.2263118Z     ·              ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2263280Z  94 │     // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
2026-10-24T03:18:47.2263336Z     ╰────
2026-10-24T03:18:47.2263963Z   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-24T03:18:47.2264294Z   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-24T03:18:47.2264299Z
2026-10-24T03:18:47.2264557Z   ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2264708Z      ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
2026-10-24T03:18:47.2264765Z  150 │
2026-10-24T03:18:47.2264831Z  151 │   useEffect(() => {
2026-10-24T03:18:47.2264903Z      ·   ────┬────
2026-10-24T03:18:47.2265036Z      ·       ╰── This is the containing effect
2026-10-24T03:18:47.2265122Z  152 │     if (!controlledSelectedPath) {
2026-10-24T03:18:47.2265183Z  153 │       return;
2026-10-24T03:18:47.2265239Z  154 │     }
2026-10-24T03:18:47.2265324Z  155 │     setExpandedPaths((current) => {
2026-10-24T03:18:47.2265407Z      ·     ────────┬───────
2026-10-24T03:18:47.2265579Z      ·             ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2265706Z  156 │       const ancestors = ancestorPaths(controlledSelectedPath);
2026-10-24T03:18:47.2265759Z      ╰────
2026-10-24T03:18:47.2266471Z   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-24T03:18:47.2267048Z   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-24T03:18:47.2267052Z
2026-10-24T03:18:47.2267280Z   ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
2026-10-24T03:18:47.2267471Z     ╭─[apps/web/src/contextMenuFallback.test.ts:38:9]
2026-10-24T03:18:47.2267547Z  37 │   get isConnected() {
2026-10-24T03:18:47.2267642Z  38 │     let current: FakeElement | null = this;
2026-10-24T03:18:47.2267720Z     ·         ───────
2026-10-24T03:18:47.2267797Z  39 │     while (current?.parent) {
2026-10-24T03:18:47.2267850Z     ╰────
2026-10-24T03:18:47.2268137Z   help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well.
2026-10-24T03:18:47.2268139Z
2026-10-24T03:18:47.2268322Z   ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`.
2026-10-24T03:18:47.2268446Z      ╭─[apps/web/src/terminal/ghostty/core.ts:194:19]
2026-10-24T03:18:47.2268574Z  193 │     const count = Math.min(CHUNK_SIZE, graphemeLength - start);
2026-10-24T03:18:47.2268668Z  194 │     const codes = new Array<number>(count);
2026-10-24T03:18:47.2268781Z      ·                   ────────────────────────
2026-10-24T03:18:47.2268892Z  195 │     for (let index = 0; index < count; index += 1) {
2026-10-24T03:18:47.2268947Z      ╰────
2026-10-24T03:18:47.2269370Z   help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`.
2026-10-24T03:18:47.2269373Z
2026-10-24T03:18:47.2269577Z   ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2269723Z      ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
2026-10-24T03:18:47.2269821Z  256 │     return () => cancelAnimationFrame(frame);
2026-10-24T03:18:47.2269903Z  257 │   }, [props.path, targetIndex]);
2026-10-24T03:18:47.2269979Z      ·       ─────┬────
2026-10-24T03:18:47.2270132Z      ·            ╰── Unnecessary dependency `props.path`
2026-10-24T03:18:47.2270189Z  258 │
2026-10-24T03:18:47.2270242Z      ╰────
2026-10-24T03:18:47.2270539Z   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-24T03:18:47.2270861Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2270866Z
2026-10-24T03:18:47.2271058Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T03:18:47.2271210Z      ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
2026-10-24T03:18:47.2271284Z  292 │                     <SourceText
2026-10-24T03:18:47.2271384Z  293 │                       key={`${index}:${tokenIndex}`}
2026-10-24T03:18:47.2271577Z      ·                       ──────────────────────────────
2026-10-24T03:18:47.2271705Z  294 │                       style={{
2026-10-24T03:18:47.2271784Z      ╰────
2026-10-24T03:18:47.2271941Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T03:18:47.2271946Z
2026-10-24T03:18:47.2272139Z   ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T03:18:47.2272286Z      ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
2026-10-24T03:18:47.2272352Z  308 │             return (
2026-10-24T03:18:47.2272452Z  309 │               <SourceText key={index}>
2026-10-24T03:18:47.2272605Z      ·                           ───────────
2026-10-24T03:18:47.2272673Z  310 │                 {body}
2026-10-24T03:18:47.2272728Z      ╰────
2026-10-24T03:18:47.2272882Z   help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T03:18:47.2272887Z
2026-10-24T03:18:47.2273095Z   ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used.
2026-10-24T03:18:47.2273189Z     ╭─[apps/web/src/types.ts:22:3]
2026-10-24T03:18:47.2273262Z  21 │   EnvironmentThreadShell,
2026-10-24T03:18:47.2273329Z  22 │   ThreadRunSummary,
2026-10-24T03:18:47.2273406Z     ·   ────────┬───────
2026-10-24T03:18:47.2273550Z     ·           ╰── 'ThreadRunSummary' is imported here
2026-10-24T03:18:47.2273621Z  23 │   ThreadRuntimeSummary,
2026-10-24T03:18:47.2273674Z     ╰────
2026-10-24T03:18:47.2273773Z   help: Consider removing this import.
2026-10-24T03:18:47.2273776Z
2026-10-24T03:18:47.2273941Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2274117Z     ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5]
2026-10-24T03:18:47.2274174Z  90 │ }) {
2026-10-24T03:18:47.2274287Z  91 │   const rotation = useSharedValue(props.hidden ? 1 : 0);
2026-10-24T03:18:47.2274363Z     ·         ────┬───
2026-10-24T03:18:47.2274497Z     ·             ╰── `rotation` originates here
2026-10-24T03:18:47.2274566Z  92 │   useLayoutEffect(() => {
2026-10-24T03:18:47.2274708Z  93 │     rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING);
2026-10-24T03:18:47.2274781Z     ·     ────┬───
2026-10-24T03:18:47.2274916Z     ·         ╰── `rotation` cannot be modified
2026-10-24T03:18:47.2274993Z  94 │   }, [props.hidden, rotation]);
2026-10-24T03:18:47.2275043Z     ╰────
2026-10-24T03:18:47.2275319Z   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-24T03:18:47.2275630Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2275633Z
2026-10-24T03:18:47.2275793Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2275963Z      ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5]
2026-10-24T03:18:47.2276058Z  266 │   const variant = props.variant ?? "plain";
2026-10-24T03:18:47.2276192Z  267 │   const loadingVisibility = useSharedValue(props.loading ? 1 : 0);
2026-10-24T03:18:47.2276280Z      ·         ────────┬────────
2026-10-24T03:18:47.2276509Z      ·                 ╰── `loadingVisibility` originates here
2026-10-24T03:18:47.2276642Z  268 │   useLayoutEffect(() => {
2026-10-24T03:18:47.2276866Z  269 │     loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING);
2026-10-24T03:18:47.2276951Z      ·     ────────┬────────
2026-10-24T03:18:47.2277101Z      ·             ╰── `loadingVisibility` cannot be modified
2026-10-24T03:18:47.2277194Z  270 │   }, [loadingVisibility, props.loading]);
2026-10-24T03:18:47.2277247Z      ╰────
2026-10-24T03:18:47.2277597Z   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-24T03:18:47.2277905Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2277913Z
2026-10-24T03:18:47.2278071Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2278244Z      ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5]
2026-10-24T03:18:47.2278302Z  325 │ }) {
2026-10-24T03:18:47.2278468Z  326 │   const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0);
2026-10-24T03:18:47.2278556Z      ·         ─────────┬─────────
2026-10-24T03:18:47.2278712Z      ·                  ╰── `recordingVisibility` originates here
2026-10-24T03:18:47.2278782Z  327 │   useLayoutEffect(() => {
2026-10-24T03:18:47.2278972Z  328 │     recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING);
2026-10-24T03:18:47.2279058Z      ·     ─────────┬─────────
2026-10-24T03:18:47.2279220Z      ·              ╰── `recordingVisibility` cannot be modified
2026-10-24T03:18:47.2279315Z  329 │   }, [props.phase, recordingVisibility]);
2026-10-24T03:18:47.2279368Z      ╰────
2026-10-24T03:18:47.2279638Z   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-24T03:18:47.2279958Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2279961Z
2026-10-24T03:18:47.2280109Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2280270Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38]
2026-10-24T03:18:47.2280537Z  121 │   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T03:18:47.2280748Z  122 │   const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T03:18:47.2280874Z      ·                                      ───────────┬──────────
2026-10-24T03:18:47.2281054Z      ·                                                 ╰── Cannot access ref value during render
2026-10-24T03:18:47.2281175Z  123 │   const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T03:18:47.2281226Z      ╰────
2026-10-24T03:18:47.2281786Z   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-24T03:18:47.2282085Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2282090Z
2026-10-24T03:18:47.2282236Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2282396Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8]
2026-10-24T03:18:47.2282449Z  125 │
2026-10-24T03:18:47.2282560Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2282650Z      ·        ─────────┬────────
2026-10-24T03:18:47.2282800Z      ·                 ╰── Cannot access ref value during render
2026-10-24T03:18:47.2282901Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2282955Z      ╰────
2026-10-24T03:18:47.2283430Z   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-24T03:18:47.2283730Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2283733Z
2026-10-24T03:18:47.2283877Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2284039Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7]
2026-10-24T03:18:47.2284093Z  125 │
2026-10-24T03:18:47.2284201Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2284287Z      ·       ─────────┬─────────
2026-10-24T03:18:47.2284442Z      ·                ╰── Cannot access ref value during render
2026-10-24T03:18:47.2284550Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2284604Z      ╰────
2026-10-24T03:18:47.2285071Z   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-24T03:18:47.2285362Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2285365Z
2026-10-24T03:18:47.2285509Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2285670Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31]
2026-10-24T03:18:47.2285811Z  125 │
2026-10-24T03:18:47.2286018Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2286362Z      ·                               ─────────┬─────────
2026-10-24T03:18:47.2286533Z      ·                                        ╰── Cannot access ref value during render
2026-10-24T03:18:47.2286632Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2286730Z      ╰────
2026-10-24T03:18:47.2287411Z   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-24T03:18:47.2287710Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2287712Z
2026-10-24T03:18:47.2287863Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2288023Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30]
2026-10-24T03:18:47.2288077Z  125 │
2026-10-24T03:18:47.2288184Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2288299Z      ·                              ──────────┬─────────
2026-10-24T03:18:47.2288468Z      ·                                        ╰── Cannot access ref value during render
2026-10-24T03:18:47.2288570Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2288623Z      ╰────
2026-10-24T03:18:47.2289093Z   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-24T03:18:47.2289395Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2289398Z
2026-10-24T03:18:47.2289539Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2289700Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46]
2026-10-24T03:18:47.2289813Z  126 │       if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2290014Z  127 │ ╭─▶     const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2290191Z  128 │ │         create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T03:18:47.2290325Z  129 │ │         onStatus: (status: RecordingStatus) => {
2026-10-24T03:18:47.2290485Z  130 │ │           sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T03:18:47.2290605Z  131 │ │             isFinished: status.isFinished,
2026-10-24T03:18:47.2290783Z  132 │ │             hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T03:18:47.2290888Z  133 │ │             error: status.error,
2026-10-24T03:18:47.2290988Z  134 │ │             url: status.url,
2026-10-24T03:18:47.2291072Z  135 │ │           });
2026-10-24T03:18:47.2291150Z  136 │ │         },
2026-10-24T03:18:47.2291350Z  137 │ │         // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T03:18:47.2291537Z  138 │ │         selectInput: (inputs) => {
2026-10-24T03:18:47.2291791Z  139 │ │           const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T03:18:47.2291941Z  140 │ │           if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T03:18:47.2292107Z  141 │ │           const known = microphoneOrder(preferences.value.microphones);
2026-10-24T03:18:47.2292250Z  142 │ │           const order = rememberMicrophones(known, inputs);
2026-10-24T03:18:47.2292353Z  143 │ │           if (order !== known) {
2026-10-24T03:18:47.2292559Z  144 │ │             registry.set(updateMobilePreferencesAtom, {
2026-10-24T03:18:47.2292682Z  145 │ │               transform: (current) => ({
2026-10-24T03:18:47.2292897Z  146 │ │                 microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T03:18:47.2292988Z  147 │ │               }),
2026-10-24T03:18:47.2293070Z  148 │ │             });
2026-10-24T03:18:47.2293148Z  149 │ │           }
2026-10-24T03:18:47.2293292Z  150 │ │           return preferredMicrophoneInput(inputs, order);
2026-10-24T03:18:47.2293370Z  151 │ │         },
2026-10-24T03:18:47.2293504Z  152 │ ├─▶     });
2026-10-24T03:18:47.2293744Z      · ╰──── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2293831Z  153 │         recorderRef.current = recorder;
2026-10-24T03:18:47.2293884Z      ╰────
2026-10-24T03:18:47.2294359Z   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-24T03:18:47.2294663Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2294666Z
2026-10-24T03:18:47.2294813Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2294979Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16]
2026-10-24T03:18:47.2295040Z  152 │     });
2026-10-24T03:18:47.2295123Z  153 │     recorderRef.current = recorder;
2026-10-24T03:18:47.2295237Z      ·     ─────┬─────────┬───
2026-10-24T03:18:47.2295433Z      ·          │         ╰── Cannot update ref value during render
2026-10-24T03:18:47.2295554Z      ·          ╰── This value is a ref
2026-10-24T03:18:47.2295663Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-24T03:18:47.2295715Z      ╰────
2026-10-24T03:18:47.2296204Z   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-24T03:18:47.2296507Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2296509Z
2026-10-24T03:18:47.2296656Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2297037Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48]
2026-10-24T03:18:47.2297209Z  153 │         recorderRef.current = recorder;
2026-10-24T03:18:47.2297438Z  154 │ ╭─▶     sessionRef.current = new VoiceInputSession({
2026-10-24T03:18:47.2297524Z  155 │ │         recorder,
2026-10-24T03:18:47.2297655Z  156 │ │         getTranscriber: getLocalVoiceTranscriber,
2026-10-24T03:18:47.2297772Z  157 │ │         requestPermission: async () => {
2026-10-24T03:18:47.2297980Z  158 │ │           const permission = await requestRecordingPermissionsAsync();
2026-10-24T03:18:47.2298210Z  159 │ │           return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T03:18:47.2298294Z  160 │ │         },
2026-10-24T03:18:47.2298437Z  161 │ │         configureRecording: configureVoiceRecordingAudio,
2026-10-24T03:18:47.2298575Z  162 │ │         releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T03:18:47.2298710Z  163 │ │         deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T03:18:47.2298823Z  164 │ │         onStateChange: (nextState) =>
2026-10-24T03:18:47.2298913Z  165 │ │           setState({
2026-10-24T03:18:47.2299016Z  166 │ │             state: nextState,
2026-10-24T03:18:47.2299155Z  167 │ │             ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T03:18:47.2299284Z  168 │ │             label: sessionRef.current?.label ?? null,
2026-10-24T03:18:47.2299364Z  169 │ │           }),
2026-10-24T03:18:47.2299500Z  170 │ ├─▶     });
2026-10-24T03:18:47.2299705Z      · ╰──── Cannot access ref value during render
2026-10-24T03:18:47.2299763Z  171 │       }
2026-10-24T03:18:47.2299814Z      ╰────
2026-10-24T03:18:47.2300293Z   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-24T03:18:47.2300596Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2300598Z
2026-10-24T03:18:47.2300750Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2300915Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15]
2026-10-24T03:18:47.2300997Z  153 │     recorderRef.current = recorder;
2026-10-24T03:18:47.2301101Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-24T03:18:47.2301213Z      ·     ─────┬────────┬───
2026-10-24T03:18:47.2301397Z      ·          │        ╰── Cannot update ref value during render
2026-10-24T03:18:47.2301513Z      ·          ╰── This value is a ref
2026-10-24T03:18:47.2301579Z  155 │       recorder,
2026-10-24T03:18:47.2301631Z      ╰────
2026-10-24T03:18:47.2302175Z   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-24T03:18:47.2302562Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2302566Z
2026-10-24T03:18:47.2302708Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2302868Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7]
2026-10-24T03:18:47.2302956Z  184 │     return () => subscription.remove();
2026-10-24T03:18:47.2303035Z  185 │   }, [controller]);
2026-10-24T03:18:47.2303150Z      ·       ─────┬────
2026-10-24T03:18:47.2303316Z      ·            ╰── Cannot access ref value during render
2026-10-24T03:18:47.2303371Z  186 │
2026-10-24T03:18:47.2303429Z      ╰────
2026-10-24T03:18:47.2303913Z   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-24T03:18:47.2304217Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2304219Z
2026-10-24T03:18:47.2304364Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2304524Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6]
2026-10-24T03:18:47.2304611Z  184 │     return () => subscription.remove();
2026-10-24T03:18:47.2304675Z  185 │   }, [controller]);
2026-10-24T03:18:47.2304760Z      ·      ──────┬─────
2026-10-24T03:18:47.2304907Z      ·            ╰── Cannot access ref value during render
2026-10-24T03:18:47.2304962Z  186 │
2026-10-24T03:18:47.2305013Z      ╰────
2026-10-24T03:18:47.2305498Z   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-24T03:18:47.2305800Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2305803Z
2026-10-24T03:18:47.2305946Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2306108Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6]
2026-10-24T03:18:47.2306168Z  191 │     },
2026-10-24T03:18:47.2306241Z  192 │     [controller, recorder],
2026-10-24T03:18:47.2306318Z      ·      ─────┬────
2026-10-24T03:18:47.2306459Z      ·           ╰── Cannot access ref value during render
2026-10-24T03:18:47.2306515Z  193 │   );
2026-10-24T03:18:47.2306568Z      ╰────
2026-10-24T03:18:47.2307291Z   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-24T03:18:47.2307588Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2307591Z
2026-10-24T03:18:47.2307808Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2308056Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20]
2026-10-24T03:18:47.2308151Z  174 │   const controller = session.controller;
2026-10-24T03:18:47.2308239Z  175 │   const recorder = recorderRef.current;
2026-10-24T03:18:47.2308344Z      ·                    ─────────┬─────────
2026-10-24T03:18:47.2308505Z      ·                             ╰── Cannot access ref value during render
2026-10-24T03:18:47.2308559Z  176 │
2026-10-24T03:18:47.2308612Z      ╰────
2026-10-24T03:18:47.2309164Z   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-24T03:18:47.2309457Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2309460Z
2026-10-24T03:18:47.2309603Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2309759Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5]
2026-10-24T03:18:47.2309816Z  191 │     },
2026-10-24T03:18:47.2309886Z  192 │     [controller, recorder],
2026-10-24T03:18:47.2309978Z      ·     ───────────┬──────────
2026-10-24T03:18:47.2310128Z      ·                ╰── Cannot access ref value during render
2026-10-24T03:18:47.2310183Z  193 │   );
2026-10-24T03:18:47.2310234Z      ╰────
2026-10-24T03:18:47.2310720Z   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-24T03:18:47.2311019Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2311021Z
2026-10-24T03:18:47.2311166Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2311325Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20]
2026-10-24T03:18:47.2311419Z  245 │     return () => clearInterval(intervalId);
2026-10-24T03:18:47.2311531Z  246 │   }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T03:18:47.2311622Z      ·                    ─────┬────
2026-10-24T03:18:47.2311851Z      ·                         ╰── Cannot access ref value during render
2026-10-24T03:18:47.2311959Z  247 │
2026-10-24T03:18:47.2312039Z      ╰────
2026-10-24T03:18:47.2312534Z   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-24T03:18:47.2312912Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2312915Z
2026-10-24T03:18:47.2313058Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2313217Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6]
2026-10-24T03:18:47.2313313Z  245 │     return () => clearInterval(intervalId);
2026-10-24T03:18:47.2313426Z  246 │   }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T03:18:47.2313556Z      ·      ────────────────────────┬───────────────────────
2026-10-24T03:18:47.2313719Z      ·                              ╰── Cannot access ref value during render
2026-10-24T03:18:47.2313773Z  247 │
2026-10-24T03:18:47.2313826Z      ╰────
2026-10-24T03:18:47.2314290Z   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-24T03:18:47.2314586Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2314591Z
2026-10-24T03:18:47.2314739Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2314897Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5]
2026-10-24T03:18:47.2314969Z  260 │     setOwnerFocused,
2026-10-24T03:18:47.2315029Z  261 │     session,
2026-10-24T03:18:47.2315102Z      ·     ───┬───
2026-10-24T03:18:47.2315241Z      ·        ╰── Cannot access ref value during render
2026-10-24T03:18:47.2315302Z  262 │     stop,
2026-10-24T03:18:47.2315353Z      ╰────
2026-10-24T03:18:47.2315841Z   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-24T03:18:47.2316147Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2316152Z
2026-10-24T03:18:47.2316298Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2316456Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10]
2026-10-24T03:18:47.2316515Z  250 │
2026-10-24T03:18:47.2316659Z  251 │ ╭─▶   return {
2026-10-24T03:18:47.2317077Z  252 │ │       isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null,
2026-10-24T03:18:47.2317163Z  253 │ │       state,
2026-10-24T03:18:47.2317252Z  254 │ │       audioLevels,
2026-10-24T03:18:47.2317426Z  255 │ │       elapsedSeconds,
2026-10-24T03:18:47.2317611Z  256 │ │       isBusy: voiceInputBlocksSubmission(state),
2026-10-24T03:18:47.2317723Z  257 │ │       ownerKey,
2026-10-24T03:18:47.2317804Z  258 │ │       label,
2026-10-24T03:18:47.2317897Z  259 │ │       focusedOwners,
2026-10-24T03:18:47.2317994Z  260 │ │       setOwnerFocused,
2026-10-24T03:18:47.2318075Z  261 │ │       session,
2026-10-24T03:18:47.2318156Z  262 │ │       stop,
2026-10-24T03:18:47.2318238Z  263 │ │       cancel,
2026-10-24T03:18:47.2318400Z  264 │ ├─▶   };
2026-10-24T03:18:47.2318653Z      · ╰──── Cannot access ref value during render
2026-10-24T03:18:47.2318714Z  265 │     }
2026-10-24T03:18:47.2318770Z      ╰────
2026-10-24T03:18:47.2319240Z   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-24T03:18:47.2319535Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2319538Z
2026-10-24T03:18:47.2319698Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2319860Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T03:18:47.2320031Z  121 │   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T03:18:47.2320159Z  122 │   const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T03:18:47.2320238Z      ·         ─────┬─────
2026-10-24T03:18:47.2320378Z      ·              ╰── `audioLevels` originates here
2026-10-24T03:18:47.2320499Z  123 │   const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T03:18:47.2320647Z  124 │   const recorderRef = useRef<LazyVoiceRecorder<RecorderState> | null>(null);
2026-10-24T03:18:47.2320700Z  125 │
2026-10-24T03:18:47.2320808Z  126 │   if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2320910Z  127 │     const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2321051Z  128 │       create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T03:18:47.2321145Z  129 │       onStatus: (status: RecordingStatus) => {
2026-10-24T03:18:47.2321275Z  130 │         sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T03:18:47.2321365Z  131 │           isFinished: status.isFinished,
2026-10-24T03:18:47.2321509Z  132 │           hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T03:18:47.2321583Z  133 │           error: status.error,
2026-10-24T03:18:47.2321654Z  134 │           url: status.url,
2026-10-24T03:18:47.2321715Z  135 │         });
2026-10-24T03:18:47.2321773Z  136 │       },
2026-10-24T03:18:47.2321938Z  137 │       // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T03:18:47.2322016Z  138 │       selectInput: (inputs) => {
2026-10-24T03:18:47.2322140Z  139 │         const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T03:18:47.2322255Z  140 │         if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T03:18:47.2322459Z  141 │         const known = microphoneOrder(preferences.value.microphones);
2026-10-24T03:18:47.2322619Z  142 │         const order = rememberMicrophones(known, inputs);
2026-10-24T03:18:47.2322726Z  143 │         if (order !== known) {
2026-10-24T03:18:47.2322836Z  144 │           registry.set(updateMobilePreferencesAtom, {
2026-10-24T03:18:47.2322919Z  145 │             transform: (current) => ({
2026-10-24T03:18:47.2323096Z  146 │               microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T03:18:47.2323159Z  147 │             }),
2026-10-24T03:18:47.2323221Z  148 │           });
2026-10-24T03:18:47.2323279Z  149 │         }
2026-10-24T03:18:47.2323432Z  150 │         return preferredMicrophoneInput(inputs, order);
2026-10-24T03:18:47.2323518Z  151 │       },
2026-10-24T03:18:47.2323576Z  152 │     });
2026-10-24T03:18:47.2323662Z  153 │     recorderRef.current = recorder;
2026-10-24T03:18:47.2323770Z  154 │     sessionRef.current = new VoiceInputSession({
2026-10-24T03:18:47.2323833Z  155 │       recorder,
2026-10-24T03:18:47.2323934Z  156 │       getTranscriber: getLocalVoiceTranscriber,
2026-10-24T03:18:47.2324019Z  157 │       requestPermission: async () => {
2026-10-24T03:18:47.2324155Z  158 │         const permission = await requestRecordingPermissionsAsync();
2026-10-24T03:18:47.2324315Z  159 │         return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T03:18:47.2324372Z  160 │       },
2026-10-24T03:18:47.2324480Z  161 │       configureRecording: configureVoiceRecordingAudio,
2026-10-24T03:18:47.2324587Z  162 │       releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T03:18:47.2324690Z  163 │       deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T03:18:47.2324771Z  164 │       onStateChange: (nextState) =>
2026-10-24T03:18:47.2324842Z  165 │         setState({
2026-10-24T03:18:47.2324915Z  166 │           state: nextState,
2026-10-24T03:18:47.2325021Z  167 │           ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T03:18:47.2325119Z  168 │           label: sessionRef.current?.label ?? null,
2026-10-24T03:18:47.2325178Z  169 │         }),
2026-10-24T03:18:47.2325236Z  170 │     });
2026-10-24T03:18:47.2325291Z  171 │   }
2026-10-24T03:18:47.2325343Z  172 │
2026-10-24T03:18:47.2325430Z  173 │   const session = sessionRef.current;
2026-10-24T03:18:47.2325519Z  174 │   const controller = session.controller;
2026-10-24T03:18:47.2325606Z  175 │   const recorder = recorderRef.current;
2026-10-24T03:18:47.2325658Z  176 │
2026-10-24T03:18:47.2325814Z  177 │   useEffect(() => {
2026-10-24T03:18:47.2325973Z  178 │     const subscription = AppState.addEventListener("change", (nextState) => {
2026-10-24T03:18:47.2326126Z  179 │       // iOS reports `inactive` while its permission dialog is open. Only the
2026-10-24T03:18:47.2326269Z  180 │       // real background state cancels preparation; recorder status handles
2026-10-24T03:18:47.2326377Z  181 │       // calls and route interruptions during capture.
2026-10-24T03:18:47.2326516Z  182 │       if (nextState === "background") controller.appMovedToBackground();
2026-10-24T03:18:47.2326573Z  183 │     });
2026-10-24T03:18:47.2326657Z  184 │     return () => subscription.remove();
2026-10-24T03:18:47.2326809Z  185 │   }, [controller]);
2026-10-24T03:18:47.2326891Z  186 │
2026-10-24T03:18:47.2326967Z  187 │   useEffect(
2026-10-24T03:18:47.2327029Z  188 │     () => () => {
2026-10-24T03:18:47.2327103Z  189 │       controller.dispose();
2026-10-24T03:18:47.2327172Z  190 │       recorder.release();
2026-10-24T03:18:47.2327226Z  191 │     },
2026-10-24T03:18:47.2327386Z  192 │     [controller, recorder],
2026-10-24T03:18:47.2327488Z  193 │   );
2026-10-24T03:18:47.2327571Z  194 │
2026-10-24T03:18:47.2327668Z  195 │   useEffect(() => {
2026-10-24T03:18:47.2327787Z  196 │     if (state.phase !== "recording") return;
2026-10-24T03:18:47.2327841Z  197 │
2026-10-24T03:18:47.2327993Z  198 │     const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`;
2026-10-24T03:18:47.2328097Z  199 │     const activation = activateKeepAwakeAsync(tag);
2026-10-24T03:18:47.2328180Z  200 │     void activation.catch(() => {});
2026-10-24T03:18:47.2328244Z  201 │     return () => {
2026-10-24T03:18:47.2328488Z  202 │       // Release after activation settles, even if the recording ends immediately.
2026-10-24T03:18:47.2328650Z  203 │       void activation.then(() => deactivateKeepAwake(tag)).catch(() => {});
2026-10-24T03:18:47.2328707Z  204 │     };
2026-10-24T03:18:47.2328794Z  205 │   }, [keepAwakeId, state.phase]);
2026-10-24T03:18:47.2328850Z  206 │
2026-10-24T03:18:47.2328912Z  207 │   useEffect(() => {
2026-10-24T03:18:47.2329047Z  208 │     if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T03:18:47.2329099Z  209 │
2026-10-24T03:18:47.2329222Z  210 │     if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T03:18:47.2329375Z  211 │       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T03:18:47.2329479Z  212 │       audioLevels.value = audioLevelsRef.current;
2026-10-24T03:18:47.2329558Z      ·       ─────┬─────
2026-10-24T03:18:47.2329701Z      ·            ╰── `audioLevels` cannot be modified
2026-10-24T03:18:47.2329755Z  213 │     }
2026-10-24T03:18:47.2329809Z      ╰────
2026-10-24T03:18:47.2330087Z   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-24T03:18:47.2330402Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2330404Z
2026-10-24T03:18:47.2330608Z   ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T03:18:47.2330771Z      ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T03:18:47.2330825Z  206 │
2026-10-24T03:18:47.2330889Z  207 │   useEffect(() => {
2026-10-24T03:18:47.2330966Z      ·             ───┬───
2026-10-24T03:18:47.2331190Z      ·                ╰── This function may (indirectly) reassign or modify `audioLevels` after render
2026-10-24T03:18:47.2331331Z  208 │     if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T03:18:47.2331387Z  209 │
2026-10-24T03:18:47.2331508Z  210 │     if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T03:18:47.2331662Z  211 │       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T03:18:47.2331766Z  212 │       audioLevels.value = audioLevelsRef.current;
2026-10-24T03:18:47.2331844Z      ·       ─────┬─────
2026-10-24T03:18:47.2331977Z      ·            ╰── This modifies `audioLevels`
2026-10-24T03:18:47.2332033Z  213 │     }
2026-10-24T03:18:47.2332085Z      ╰────
2026-10-24T03:18:47.2332430Z   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-24T03:18:47.2332818Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2332853Z
2026-10-24T03:18:47.2333068Z   ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2333239Z     ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
2026-10-24T03:18:47.2333345Z  65 │   const [expanded, setExpanded] = useState(false);
2026-10-24T03:18:47.2333431Z  66 │   const progress = useSharedValue(0);
2026-10-24T03:18:47.2333505Z     ·         ────┬───
2026-10-24T03:18:47.2333638Z     ·             ╰── `progress` originates here
2026-10-24T03:18:47.2333728Z  67 │   useEffect(() => {
2026-10-24T03:18:47.2333903Z  68 │     progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
2026-10-24T03:18:47.2333979Z     ·     ────┬───
2026-10-24T03:18:47.2334117Z     ·         ╰── `progress` cannot be modified
2026-10-24T03:18:47.2334190Z  69 │   }, [expanded, progress]);
2026-10-24T03:18:47.2334242Z     ╰────
2026-10-24T03:18:47.2334512Z   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-24T03:18:47.2334820Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2334824Z
2026-10-24T03:18:47.2334972Z   ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2335140Z     ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14]
2026-10-24T03:18:47.2335227Z  26 │   const latestInput = useRef(input);
2026-10-24T03:18:47.2335306Z  27 │   latestInput.current = input;
2026-10-24T03:18:47.2335419Z     ·   ─────┬─────────┬───
2026-10-24T03:18:47.2335606Z     ·        │         ╰── Cannot update ref value during render
2026-10-24T03:18:47.2335724Z     ·        ╰── This value is a ref
2026-10-24T03:18:47.2335801Z  28 │   const mounted = useRef(true);
2026-10-24T03:18:47.2335854Z     ╰────
2026-10-24T03:18:47.2336327Z   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-24T03:18:47.2336627Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2336633Z
2026-10-24T03:18:47.2336986Z   ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T03:18:47.2337227Z    ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8]
2026-10-24T03:18:47.2337302Z  3 │   AuthProvidersManageScope,
2026-10-24T03:18:47.2337373Z  4 │   type AuthSessionState,
2026-10-24T03:18:47.2337459Z    ·        ────────┬───────
2026-10-24T03:18:47.2337607Z    ·                ╰── 'AuthSessionState' is imported here
2026-10-24T03:18:47.2337675Z  5 │   type EnvironmentId,
2026-10-24T03:18:47.2337728Z    ╰────
2026-10-24T03:18:47.2337827Z   help: Consider removing this import.
2026-10-24T03:18:47.2337830Z
2026-10-24T03:18:47.2338075Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2338279Z      ╭─[apps/web/src/hooks/useThreadActions.ts:821:56]
2026-10-24T03:18:47.2338399Z  820 │     const resolved = resolveThreadTarget(target);
2026-10-24T03:18:47.2338557Z  821 │     if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) {
2026-10-24T03:18:47.2338683Z      ·                                                        ─────┬────
2026-10-24T03:18:47.2338857Z      ·                                                             ╰── Cannot call impure function
2026-10-24T03:18:47.2338948Z  822 │       return AsyncResult.failure(
2026-10-24T03:18:47.2339026Z      ╰────
2026-10-24T03:18:47.2339355Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2339662Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2339664Z
2026-10-24T03:18:47.2339838Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2339960Z      ╭─[apps/web/src/hooks/useThreadActions.ts:709:46]
2026-10-24T03:18:47.2340031Z  708 │     const wokeAt = resolved
2026-10-24T03:18:47.2340171Z  709 │       ? threadWokeAt(resolved.thread, { now: new Date().toISOString() })
2026-10-24T03:18:47.2340288Z      ·                                              ─────┬────
2026-10-24T03:18:47.2340453Z      ·                                                   ╰── Cannot call impure function
2026-10-24T03:18:47.2340519Z  710 │       : null;
2026-10-24T03:18:47.2340577Z      ╰────
2026-10-24T03:18:47.2340855Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2341159Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2341162Z
2026-10-24T03:18:47.2341634Z   ⚠ 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-24T03:18:47.2341769Z      ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3]
2026-10-24T03:18:47.2341827Z  225 │     ) {
2026-10-24T03:18:47.2342108Z  226 │ ╭─▶   for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T03:18:47.2342296Z  227 │ │       const socket = sockets[index];
2026-10-24T03:18:47.2342397Z  228 │ │       if (socket) {
2026-10-24T03:18:47.2342492Z  229 │ │         return socket;
2026-10-24T03:18:47.2342567Z  230 │ │       }
2026-10-24T03:18:47.2342671Z  231 │ │       yield* Effect.yieldNow;
2026-10-24T03:18:47.2342797Z  232 │ ╰─▶   }
2026-10-24T03:18:47.2342993Z  233 │       return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket."));
2026-10-24T03:18:47.2343075Z      ╰────
2026-10-24T03:18:47.2343080Z
2026-10-24T03:18:47.2343576Z   ⚠ 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-24T03:18:47.2343715Z      ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3]
2026-10-24T03:18:47.2343772Z  239 │     ) {
2026-10-24T03:18:47.2343978Z  240 │ ╭─▶   for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T03:18:47.2344201Z  241 │ │       const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index];
2026-10-24T03:18:47.2344293Z  242 │ │       if (request) {
2026-10-24T03:18:47.2344388Z  243 │ │         return request;
2026-10-24T03:18:47.2344463Z  244 │ │       }
2026-10-24T03:18:47.2344571Z  245 │ │       yield* Effect.yieldNow;
2026-10-24T03:18:47.2344701Z  246 │ ╰─▶   }
2026-10-24T03:18:47.2344868Z  247 │       return yield* Effect.die(new Error("Expected the RPC protocol to send a request."));
2026-10-24T03:18:47.2344922Z      ╰────
2026-10-24T03:18:47.2344924Z
2026-10-24T03:18:47.2345387Z   ⚠ 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-24T03:18:47.2345523Z      ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9]
2026-10-24T03:18:47.2345583Z  130 │           ) {
2026-10-24T03:18:47.2345798Z  131 │ ╭─▶         for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T03:18:47.2345930Z  132 │ │             if (subscriptions.length >= count) {
2026-10-24T03:18:47.2346025Z  133 │ │               return;
2026-10-24T03:18:47.2346105Z  134 │ │             }
2026-10-24T03:18:47.2346213Z  135 │ │             yield* Effect.yieldNow;
2026-10-24T03:18:47.2346347Z  136 │ ╰─▶         }
2026-10-24T03:18:47.2346514Z  137 │             return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`));
2026-10-24T03:18:47.2346564Z      ╰────
2026-10-24T03:18:47.2346569Z
2026-10-24T03:18:47.2347313Z   ⚠ 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-24T03:18:47.2347538Z      ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7]
2026-10-24T03:18:47.2347703Z  251 │           yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient)));
2026-10-24T03:18:47.2347955Z  252 │ ╭─▶       for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) {
2026-10-24T03:18:47.2348060Z  253 │ │           yield* Effect.yieldNow;
2026-10-24T03:18:47.2348224Z  254 │ ╰─▶       }
2026-10-24T03:18:47.2348396Z  255 │           yield* SubscriptionRef.set(activeSession, Option.none());
2026-10-24T03:18:47.2348450Z      ╰────
2026-10-24T03:18:47.2348452Z
2026-10-24T03:18:47.2348939Z   ⚠ 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-24T03:18:47.2349076Z      ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7]
2026-10-24T03:18:47.2349134Z  257 │
2026-10-24T03:18:47.2349386Z  258 │ ╭─▶       for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
2026-10-24T03:18:47.2349493Z  259 │ │           yield* Effect.yieldNow;
2026-10-24T03:18:47.2349623Z  260 │ ╰─▶       }
2026-10-24T03:18:47.2349730Z  261 │           yield* Fiber.interrupt(subscriptionFiber);
2026-10-24T03:18:47.2349784Z      ╰────
2026-10-24T03:18:47.2349786Z
2026-10-24T03:18:47.2350251Z   ⚠ 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-24T03:18:47.2350384Z      ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7]
2026-10-24T03:18:47.2350446Z  321 │           );
2026-10-24T03:18:47.2350708Z  322 │ ╭─▶       for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) {
2026-10-24T03:18:47.2350813Z  323 │ │           yield* Effect.yieldNow;
2026-10-24T03:18:47.2350944Z  324 │ ╰─▶       }
2026-10-24T03:18:47.2350998Z  325 │
2026-10-24T03:18:47.2351051Z      ╰────
2026-10-24T03:18:47.2351054Z
2026-10-24T03:18:47.2351520Z   ⚠ 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-24T03:18:47.2351656Z      ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7]
2026-10-24T03:18:47.2351821Z  329 │           yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient)));
2026-10-24T03:18:47.2352077Z  330 │ ╭─▶       for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
2026-10-24T03:18:47.2352182Z  331 │ │           yield* Effect.yieldNow;
2026-10-24T03:18:47.2352313Z  332 │ ╰─▶       }
2026-10-24T03:18:47.2352417Z  333 │           yield* Fiber.interrupt(subscriptionFiber);
2026-10-24T03:18:47.2352470Z      ╰────
2026-10-24T03:18:47.2352547Z
2026-10-24T03:18:47.2352843Z   ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used.
2026-10-24T03:18:47.2352951Z     ╭─[apps/server/src/auth/http.ts:28:10]
2026-10-24T03:18:47.2353039Z  27 │ import * as Schema from "effect/Schema";
2026-10-24T03:18:47.2353134Z  28 │ import { identity } from "effect/Function";
2026-10-24T03:18:47.2353212Z     ·          ────┬───
2026-10-24T03:18:47.2353349Z     ·              ╰── 'identity' is imported here
2026-10-24T03:18:47.2353464Z  29 │ import * as Layer from "effect/Layer";
2026-10-24T03:18:47.2353546Z     ╰────
2026-10-24T03:18:47.2353659Z   help: Consider removing this import.
2026-10-24T03:18:47.2353662Z
2026-10-24T03:18:47.2354045Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T03:18:47.2354180Z      ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17]
2026-10-24T03:18:47.2354317Z  236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => {
2026-10-24T03:18:47.2354453Z  237 │   const input = Schema.decodeUnknownSync(SettingsUpdate)(payload);
2026-10-24T03:18:47.2354562Z      ·                 ────────────────────────
2026-10-24T03:18:47.2354704Z  238 │   const scopes = requiredScopesForServerSettingsPatch(input.patch);
2026-10-24T03:18:47.2354755Z      ╰────
2026-10-24T03:18:47.2354757Z
2026-10-24T03:18:47.2355130Z   ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
2026-10-24T03:18:47.2355266Z      ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26]
2026-10-24T03:18:47.2355369Z  255 │   if (method === WS_METHODS.assetsCreateUrl) {
2026-10-24T03:18:47.2355526Z  256 │     const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload);
2026-10-24T03:18:47.2355641Z      ·                          ────────────────────────
2026-10-24T03:18:47.2355703Z  257 │     return [
2026-10-24T03:18:47.2355755Z      ╰────
2026-10-24T03:18:47.2355758Z
2026-10-24T03:18:47.2355927Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2356076Z      ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58]
2026-10-24T03:18:47.2356189Z  177 │   if (snoozeClockState.shell !== activeThreadShell) {
2026-10-24T03:18:47.2356358Z  178 │     setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() });
2026-10-24T03:18:47.2356487Z      ·                                                          ─────┬────
2026-10-24T03:18:47.2356702Z      ·                                                               ╰── Cannot call impure function
2026-10-24T03:18:47.2356785Z  179 │   }
2026-10-24T03:18:47.2356864Z      ╰────
2026-10-24T03:18:47.2357202Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2357501Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2357503Z
2026-10-24T03:18:47.2357743Z   ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
2026-10-24T03:18:47.2357979Z      ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9]
2026-10-24T03:18:47.2358093Z  264 │ ): boolean {
2026-10-24T03:18:47.2358287Z  265 │   const labels = entry.labels.map((label) => label.name.trim().toLowerCase());
2026-10-24T03:18:47.2358457Z      ·         ─────────────────────────────────────────────────────────────────────
2026-10-24T03:18:47.2358609Z  266 │   const holds = (label: string) => labels.includes(label.trim().toLowerCase());
2026-10-24T03:18:47.2358662Z      ╰────
2026-10-24T03:18:47.2358739Z   help: Switch to `Set`
2026-10-24T03:18:47.2358742Z
2026-10-24T03:18:47.2358973Z   ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2359127Z      ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58]
2026-10-24T03:18:47.2359271Z  139 │                             {...(weekStartsOn === undefined ? {} : { weekStartsOn })}
2026-10-24T03:18:47.2359426Z  140 │                             disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }}
2026-10-24T03:18:47.2359549Z      ·                                                          ─────┬────
2026-10-24T03:18:47.2359723Z      ·                                                               ╰── Cannot call impure function
2026-10-24T03:18:47.2359822Z  141 │                             onSelect={(selected) => {
2026-10-24T03:18:47.2359875Z      ╰────
2026-10-24T03:18:47.2360157Z   help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2360454Z   note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2360462Z
2026-10-24T03:18:47.2360744Z   ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2360879Z      ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7]
2026-10-24T03:18:47.2360933Z  339 │
2026-10-24T03:18:47.2361038Z  340 │ const layerTest = AnalyticsService.layerTest;
2026-10-24T03:18:47.2361114Z      ·       ────┬────
2026-10-24T03:18:47.2361250Z      ·           ╰── 'layerTest' is declared here
2026-10-24T03:18:47.2361300Z      ╰────
2026-10-24T03:18:47.2361409Z   help: Consider removing this declaration.
2026-10-24T03:18:47.2361412Z
2026-10-24T03:18:47.2361583Z   ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2361713Z      ╭─[apps/server/src/processRunner.test.ts:266:14]
2026-10-24T03:18:47.2361769Z  265 │
2026-10-24T03:18:47.2361876Z  266 │   for (const {} of ["timeout", "success"] as const) {
2026-10-24T03:18:47.2361948Z      ·              ──
2026-10-24T03:18:47.2362004Z  267 │   }
2026-10-24T03:18:47.2362055Z      ╰────
2026-10-24T03:18:47.2362289Z   help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2362293Z
2026-10-24T03:18:47.2362484Z   ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops
2026-10-24T03:18:47.2362611Z      ╭─[packages/client-runtime/src/state/shell.ts:189:5]
2026-10-24T03:18:47.2362720Z  186 │     let waiting = yield* Ref.get(awaitingCompletion);
2026-10-24T03:18:47.2362788Z  187 │     let next = initial;
2026-10-24T03:18:47.2362980Z      ·         ──┬─
2026-10-24T03:18:47.2363186Z      ·           ╰── From this accumulator
2026-10-24T03:18:47.2363271Z  188 │     let receivedSnapshot = false;
2026-10-24T03:18:47.2363349Z  189 │     for (const item of items) {
2026-10-24T03:18:47.2363419Z      ·     ─┬─
2026-10-24T03:18:47.2363528Z      ·      ╰── For this loop
2026-10-24T03:18:47.2363618Z  190 │       if (item.kind === "synchronized") {
2026-10-24T03:18:47.2363687Z  191 │         waiting = false;
2026-10-24T03:18:47.2363779Z  192 │         if (Option.isSome(next.snapshot)) {
2026-10-24T03:18:47.2363958Z  193 │           next = { ...next, status: "live", error: Option.none() };
2026-10-24T03:18:47.2364057Z      ·                    ───┬───
2026-10-24T03:18:47.2364198Z      ·                       ╰── From this spread
2026-10-24T03:18:47.2364261Z  194 │         }
2026-10-24T03:18:47.2364313Z      ╰────
2026-10-24T03:18:47.2364469Z   help: Consider using `Object.assign()` to mutate the accumulator instead.
2026-10-24T03:18:47.2364631Z   note: Using spreads within accumulators leads to `O(n^2)` time complexity.
2026-10-24T03:18:47.2364635Z
2026-10-24T03:18:47.2364899Z   ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts.
2026-10-24T03:18:47.2365048Z     ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14]
2026-10-24T03:18:47.2365208Z  11 │       addEventListener(_type: string, listener: (event: { data: string }) => void) {
2026-10-24T03:18:47.2365288Z  12 │         this.onmessage = listener;
2026-10-24T03:18:47.2365369Z     ·              ─────────
2026-10-24T03:18:47.2365434Z  13 │       }
2026-10-24T03:18:47.2365487Z     ╰────
2026-10-24T03:18:47.2365975Z   help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on<event>` replaces any previously registered handler.
2026-10-24T03:18:47.2365979Z
2026-10-24T03:18:47.2366193Z   ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
2026-10-24T03:18:47.2366341Z     ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9]
2026-10-24T03:18:47.2366408Z  15 │       constructor() {
2026-10-24T03:18:47.2366472Z  16 │         source = this;
2026-10-24T03:18:47.2366546Z     ·         ──────
2026-10-24T03:18:47.2366603Z  17 │       }
2026-10-24T03:18:47.2366655Z     ╰────
2026-10-24T03:18:47.2367073Z   help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well.
2026-10-24T03:18:47.2367078Z
2026-10-24T03:18:47.2367289Z   ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T03:18:47.2367426Z    ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8]
2026-10-24T03:18:47.2367503Z  2 │   AuthDiagnosticsReadScope,
2026-10-24T03:18:47.2367572Z  3 │   type AuthSessionState,
2026-10-24T03:18:47.2367657Z    ·        ────────┬───────
2026-10-24T03:18:47.2367808Z    ·                ╰── 'AuthSessionState' is imported here
2026-10-24T03:18:47.2367878Z  4 │   sessionGrantsScope,
2026-10-24T03:18:47.2367929Z    ╰────
2026-10-24T03:18:47.2368030Z   help: Consider removing this import.
2026-10-24T03:18:47.2368033Z
2026-10-24T03:18:47.2368613Z   ⚠ 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-24T03:18:47.2368872Z      ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7]
2026-10-24T03:18:47.2368934Z  168 │           });
2026-10-24T03:18:47.2369138Z  169 │ ╭─▶       for (let index = 0; index < 100; index += 1) {
2026-10-24T03:18:47.2369338Z  170 │ │           if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break;
2026-10-24T03:18:47.2369447Z  171 │ │           yield* Effect.yieldNow;
2026-10-24T03:18:47.2369638Z  172 │ ╰─▶       }
2026-10-24T03:18:47.2369705Z  173 │
2026-10-24T03:18:47.2369765Z      ╰────
2026-10-24T03:18:47.2369770Z
2026-10-24T03:18:47.2370257Z   ⚠ 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-24T03:18:47.2370407Z      ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7]
2026-10-24T03:18:47.2370518Z  177 │           yield* Deferred.succeed(releaseSave, undefined);
2026-10-24T03:18:47.2370716Z  178 │ ╭─▶       for (let index = 0; index < 100; index += 1) {
2026-10-24T03:18:47.2370852Z  179 │ │           if ((yield* Ref.get(saved)).length > 0) break;
2026-10-24T03:18:47.2370958Z  180 │ │           yield* Effect.yieldNow;
2026-10-24T03:18:47.2371094Z  181 │ ╰─▶       }
2026-10-24T03:18:47.2371152Z  182 │
2026-10-24T03:18:47.2371205Z      ╰────
2026-10-24T03:18:47.2371208Z
2026-10-24T03:18:47.2371668Z   ⚠ 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-24T03:18:47.2371817Z      ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7]
2026-10-24T03:18:47.2371944Z  306 │           yield* Deferred.succeed(releaseUnenrichedSave, undefined);
2026-10-24T03:18:47.2372137Z  307 │ ╭─▶       for (let index = 0; index < 100; index += 1) {
2026-10-24T03:18:47.2372261Z  308 │ │           const values = yield* Ref.get(saved);
2026-10-24T03:18:47.2372529Z  309 │ │           if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) {
2026-10-24T03:18:47.2372668Z  310 │ │             break;
2026-10-24T03:18:47.2372772Z  311 │ │           }
2026-10-24T03:18:47.2372879Z  312 │ │           yield* Effect.yieldNow;
2026-10-24T03:18:47.2373012Z  313 │ ╰─▶       }
2026-10-24T03:18:47.2373066Z  314 │
2026-10-24T03:18:47.2373118Z      ╰────
2026-10-24T03:18:47.2373121Z
2026-10-24T03:18:47.2373326Z   ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T03:18:47.2373523Z    ╭─[packages/client-runtime/src/state/filesystem.ts:3:8]
2026-10-24T03:18:47.2373607Z  2 │   AuthFilesystemReadScope,
2026-10-24T03:18:47.2373684Z  3 │   type AuthSessionState,
2026-10-24T03:18:47.2373772Z    ·        ────────┬───────
2026-10-24T03:18:47.2373922Z    ·                ╰── 'AuthSessionState' is imported here
2026-10-24T03:18:47.2373997Z  4 │   type FilesystemBrowseEntry,
2026-10-24T03:18:47.2374049Z    ╰────
2026-10-24T03:18:47.2374150Z   help: Consider removing this import.
2026-10-24T03:18:47.2374153Z
2026-10-24T03:18:47.2374369Z   ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used.
2026-10-24T03:18:47.2374473Z     ╭─[infra/relay/src/http/Api.ts:69:13]
2026-10-24T03:18:47.2374618Z  68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts";
2026-10-24T03:18:47.2374737Z  69 │ import * as HookForwarder from "../hooks/HookForwarder.ts";
2026-10-24T03:18:47.2374830Z     ·             ──────┬──────
2026-10-24T03:18:47.2374979Z     ·                   ╰── 'HookForwarder' is imported here
2026-10-24T03:18:47.2375086Z  70 │ import * as HeldHooks from "../hooks/HeldHooks.ts";
2026-10-24T03:18:47.2375139Z     ╰────
2026-10-24T03:18:47.2375239Z   help: Consider removing this import.
2026-10-24T03:18:47.2375241Z
2026-10-24T03:18:47.2375326Z Found 0 errors and 360 warnings in 5409 files (5.2s, 8 threads)
2026-10-24T03:18:47.2892134Z Post job cleanup.
2026-10-24T03:18:47.3558167Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
2026-10-24T03:18:47.3637379Z Post job cleanup.
2026-10-24T03:18:47.3646479Z ##[start-action display=Cache full pnpm store;id=__9b546d06-f711-4b8b-896f-c9fcda459c8d.__actions_cache]
2026-10-24T03:18:47.3990563Z Post job cleanup.
2026-10-24T03:18:47.4926271Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-045caa51c4b226597018f0d0c699ccc3936ad58bb7e4b01dc2f26bb9d6fd8aef, not saving cache.
2026-10-24T03:18:47.4964518Z ##[end-action id=__9b546d06-f711-4b8b-896f-c9fcda459c8d.__actions_cache;outcome=success;conclusion=success;duration_ms=131]
2026-10-24T03:18:47.4966450Z ##[start-action display=Cache Vite+;id=__9b546d06-f711-4b8b-896f-c9fcda459c8d.vp_cache]
2026-10-24T03:18:47.4986829Z Post job cleanup.
2026-10-24T03:18:47.5627252Z 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-24T03:18:47.5664338Z ##[end-action id=__9b546d06-f711-4b8b-896f-c9fcda459c8d.vp_cache;outcome=success;conclusion=success;duration_ms=69]
2026-10-24T03:18:47.5701365Z Post job cleanup.
2026-10-24T03:18:47.6122158Z [command]/usr/local/bin/git version
2026-10-24T03:18:47.6151655Z git version 2.55.0
2026-10-24T03:18:47.6169079Z Temporarily overriding HOME='/home/runner/_work/_temp/7e153447-df7e-46dc-92a3-5292c4e66757' before making global git config changes
2026-10-24T03:18:47.6169649Z Adding repository directory to the temporary git global config as a safe directory
2026-10-24T03:18:47.6172067Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
2026-10-24T03:18:47.6192722Z Removing SSH command configuration
2026-10-24T03:18:47.6195649Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
2026-10-24T03:18:47.6217954Z [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-24T03:18:47.6348698Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
2026-10-24T03:18:47.6402267Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128
2026-10-24T03:18:47.6439254Z A job completed hook has been configured by the self-hosted runner administrator
2026-10-24T03:18:47.6455909Z ##[group]Run '/job_completed.sh'
2026-10-24T03:18:47.6462433Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
2026-10-24T03:18:47.6462602Z env:
2026-10-24T03:18:47.6462715Z   BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 223
2026-10-24T03:18:47.6462864Z   BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 385
2026-10-24T03:18:47.6463005Z   BLACKSMITH_CHECK_RUN_ID: 120764327339
2026-10-24T03:18:47.6463144Z   BLACKSMITH_JOB_DISPLAY_NAME: Lint
2026-10-24T03:18:47.6463281Z   GITHUB_ACTIONS_CACHE_MODE: write
2026-10-24T03:18:47.6463415Z ##[endgroup]
2026-10-24T03:18:47.6542446Z Docker container cache not activated, skipping hash computation.
2026-10-24T03:18:47.6855448Z No active SSH sessions detected. Proceeding with shutdown immediately.
2026-10-24T03:18:47.7283788Z Cleaning up orphan processes