GitHub check

256 KB of 599 KB loaded Download the full log (599 KB)
343 KB of earlier output not loaded
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 63 โ”‚     if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl);
    ยท                                                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท                                                              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 64 โ”‚   }, [playbackUrl, resolvedUrl]);
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(refs): Cannot access refs during render
    โ•ญโ”€[apps/mobile/src/components/ui/Menu.tsx:54:36]
 53 โ”‚         const child = children as ReactElement<Pick<PressableProps, "onTouchStart" | "onPress">>;
 54 โ”‚ โ•ญโ”€โ–ถ     children = cloneElement(child, {
 55 โ”‚ โ”‚         onTouchStart: (event) => {
 56 โ”‚ โ”‚           // Reset for a new touch, not onPressIn, which also fires when a
 57 โ”‚ โ”‚           // finger moves out of the row and back during the same gesture.
 58 โ”‚ โ”‚           menuPress.current.isPreparing = false;
 59 โ”‚ โ”‚           menuPress.current.suppressPress = menuPress.current.isOpen;
 60 โ”‚ โ”‚           pendingPress.current = null;
 61 โ”‚ โ”‚           child.props.onTouchStart?.(event);
 62 โ”‚ โ”‚         },
 63 โ”‚ โ”‚         onPress: (event) => {
 64 โ”‚ โ”‚           // Accessibility clicks have no touch identifier and must not inherit
 65 โ”‚ โ”‚           // cancellation from a previous physical gesture.
 66 โ”‚ โ”‚           const isTouch = typeof event.nativeEvent.identifier === "number";
 67 โ”‚ โ”‚           if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) {
 68 โ”‚ โ”‚             return;
 69 โ”‚ โ”‚           }
 70 โ”‚ โ”‚           if (isTouch && menuPress.current.isPreparing) {
 71 โ”‚ โ”‚             // A release can arrive between native menu preparation and display.
 72 โ”‚ โ”‚             // Let UIKit's display/cancel callback decide this press's outcome.
 73 โ”‚ โ”‚             event.persist();
 74 โ”‚ โ”‚             pendingPress.current = () => child.props.onPress?.(event);
 75 โ”‚ โ”‚             return;
 76 โ”‚ โ”‚           }
 77 โ”‚ โ”‚           child.props.onPress?.(event);
 78 โ”‚ โ”‚         },
 79 โ”‚ โ”œโ”€โ–ถ     });
    ยท โ•ฐโ”€โ”€โ”€โ”€ Passing a ref to a function may read its value during render
 80 โ”‚         menuProps.onMenuInteractionStart = () => {
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(memo-dependencies): Found missing memoization dependencies
     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6]
 161 โ”‚     const tokens = collectComposerInlineTokens(props.value, {
 162 โ”‚       preserveTrailingFrom: confirmedTokensRef.current,
     ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                      โ•ฐโ”€โ”€ Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
 163 โ”‚     });
 164 โ”‚     confirmedTokensRef.current = tokens;
 165 โ”‚     return JSON.stringify(
 166 โ”‚       composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
 167 โ”‚         const record =
 168 โ”‚           token.type === "context"
 169 โ”‚             ? props.context?.records.find((record) => record.contextId === token.contextId)
 170 โ”‚             : undefined;
 171 โ”‚         const presentation = contextChipPresentation(
 172 โ”‚           token.type === "context" ? token.kind : token.type,
 173 โ”‚           record,
 174 โ”‚         );
 175 โ”‚         const icon = contextChipIcon(
 176 โ”‚           presentation,
 177 โ”‚           token.type === "mention" ? token.value : contextRecordFileName(record),
 178 โ”‚         );
 179 โ”‚         return {
 180 โ”‚           type: token.type,
 181 โ”‚           source: token.source,
 182 โ”‚           start: token.start,
 183 โ”‚           end: token.end,
 184 โ”‚           accent: presentation.accent,
 185 โ”‚           label:
 186 โ”‚             token.type === "skill"
 187 โ”‚               ? (skillLabels.get(token.value) ?? token.value)
 188 โ”‚               : token.type === "context"
 189 โ”‚                 ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " ยท unavailable"}`
 190 โ”‚                 : basename(token.value),
 191 โ”‚           detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
 192 โ”‚           iconUri: contextChipIconUri(icon),
 193 โ”‚           tintsIcon: icon.kind === "chip",
 194 โ”‚         };
 195 โ”‚       }),
 196 โ”‚     );
 197 โ”‚   }, [props.value, props.context, skillLabels]);
     ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                          โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
 198 โ”‚   // Every render resolves against the snapshot history, so a render whose
     โ•ฐโ”€โ”€โ”€โ”€
  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(memo-dependencies): Found missing memoization dependencies
     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5]
 251 โ”‚       mostRecentEventCountRef.current = acknowledgedEventCount;
 252 โ”‚       nativeEventSnapshotsRef.current.push({
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
 253 โ”‚         eventCount: acknowledgedEventCount,
 254 โ”‚         value,
 255 โ”‚         selection: nextSelection,
 256 โ”‚       });
 257 โ”‚       return acknowledgedEventCount;
 258 โ”‚     },
 259 โ”‚     [],
     ยท     โ”€โ”ฌ
     ยท      โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
 260 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29]
 161 โ”‚     const tokens = collectComposerInlineTokens(props.value, {
 162 โ”‚       preserveTrailingFrom: confirmedTokensRef.current,
     ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                          โ•ฐโ”€โ”€ Cannot access ref value during render
 163 โ”‚     });
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29]
 161 โ”‚     const tokens = collectComposerInlineTokens(props.value, {
 162 โ”‚       preserveTrailingFrom: confirmedTokensRef.current,
     ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                          โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 163 โ”‚     });
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23]
 163 โ”‚     });
 164 โ”‚     confirmedTokensRef.current = tokens;
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท              โ”‚            โ•ฐโ”€โ”€ Cannot update ref value during render
     ยท              โ•ฐโ”€โ”€ This value is a ref
 165 โ”‚     return JSON.stringify(
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5]
 205 โ”‚     mostRecentEventCount,
 206 โ”‚     nativeEventSnapshotsRef.current,
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                    โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 207 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5]
 211 โ”‚     mostRecentEventCount,
 212 โ”‚     nativeEventSnapshotsRef.current,
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                    โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 213 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(exhaustive-effect-dependencies): Found missing effect dependencies
     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6]
 225 โ”‚     nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
 226 โ”‚       nativeEventSnapshotsRef.current,
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
 227 โ”‚       mostRecentEventCount,
 228 โ”‚     );
 229 โ”‚   }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
     ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
 230 โ”‚   const assumedValue = props.value;
     โ•ฐโ”€โ”€โ”€โ”€
  help: Missing dependencies can cause an effect to fire less often than it should
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7]
 236 โ”‚     nativeEventSnapshotsRef.current = assumeComposerControlledState(
 237 โ”‚       nativeEventSnapshotsRef.current,
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
 238 โ”‚       controlledEventCount,
 239 โ”‚       assumedValue,
 240 โ”‚     );
 241 โ”‚   }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
     ยท                                                         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                                                    โ•ฐโ”€โ”€ Unnecessary dependency `controlledDocumentJson`
 242 โ”‚   const acceptNativeEvent = useCallback(
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  eslint(no-control-regex): Unexpected control character
     โ•ญโ”€[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46]
 219 โ”‚               <Text selectable className="font-mono text-sm text-foreground">
 220 โ”‚                 {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")}
     ยท                                              โ”€โ”€โ”ฌโ”€
     ยท                                                โ•ฐโ”€โ”€ 'U+001B' is a control character.
 221 โ”‚               </Text>
     โ•ฐโ”€โ”€โ”€โ”€
  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression.

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/mobile/src/components/ComposerContextSheet.tsx:267:25]
 266 โ”‚                 {record.elements?.map((element, index) => (
 267 โ”‚                   <View key={`${element.selector ?? element.tagName}:${index}`} className="gap-3">
     ยท                         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 268 โ”‚                     <ContextField
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85]
  99 โ”‚   const startEditor = startScheduledTaskEditor;
 100 โ”‚   const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]);
     ยท                                                                                     โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท                                                                                          โ•ฐโ”€โ”€ Unnecessary dependency `startEditor`
 101 โ”‚   const readEditor = useCallback(
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7]
 120 โ”‚       setEditor,
 121 โ”‚       startEditor,
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ Unnecessary dependency `startEditor`
 122 โ”‚       hasChanges,
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/components/VideoPreviewModal.tsx:68:5]
 66 โ”‚   const { id: attachmentId, fileUri } = attachment;
 67 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 68 โ”‚     setUri(null);
    ยท     โ”€โ”€โ”€โ”ฌโ”€โ”€
    ยท        โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 69 โ”‚     setError(null);
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/components/VideoPreviewModal.tsx:91:7]
 90 โ”‚     };
 91 โ”‚   }, [attachmentId, fileUri]);
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท             โ”‚          โ•ฐโ”€โ”€ Unnecessary dependency `fileUri`
    ยท             โ•ฐโ”€โ”€ Unnecessary dependency `attachmentId`
 92 โ”‚   const mimeType = videoMimeType(attachment) ?? attachment.mimeType;
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/components/VideoPreviewModal.tsx:213:34]
 212 โ”‚   useEffect(() => {
 213 โ”‚     if (!isFocused && hasSource) props.onRequestClose();
     ยท                                  โ”€โ”€โ”ฌโ”€โ”€
     ยท                                    โ•ฐโ”€โ”€ Missing dependency `props`
 214 โ”‚   }, [isFocused, hasSource, props.onRequestClose]);
     ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                       โ•ฐโ”€โ”€ Overly precise dependency `props.onRequestClose`, use `props` instead
 215 โ”‚   const { source } = props;
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7]
 211 โ”‚   };
 212 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 213 โ”‚     const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null;
 214 โ”‚     if (inserted) {
 215 โ”‚       setSelection((current) =>
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 216 โ”‚         current.start === inserted.start && current.end === inserted.end ? current : inserted,
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7]
 284 โ”‚   }, [hasWorkspaceSnapshot]);
 285 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 286 โ”‚     if (!environmentId || !projectCwd || !selectedProviderInstanceId) return;
 287 โ”‚     const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`;
 288 โ”‚     const now = Date.now();
 289 โ”‚     const lastRequest = workspaceRefreshKeyRef.current;
 290 โ”‚     if (
 291 โ”‚       lastRequest?.key === key &&
 292 โ”‚       now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS
 293 โ”‚     )
 294 โ”‚       return;
 295 โ”‚     if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) {
 296 โ”‚       setWorkspaceRefreshRetry(null);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 297 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5]
 325 โ”‚   }, [
 326 โ”‚     draftMessage,
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ Unnecessary dependency `draftMessage`
 327 โ”‚     environmentId,
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10]
 117 โ”‚
 118 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 119 โ”‚     void refreshNotifications();
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                    โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 120 โ”‚     const subscription = AppState.addEventListener("change", (state) => {
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7]
 125 โ”‚
 126 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 127 โ”‚     if (!isLoaded) {
 128 โ”‚       setLiveActivityStatus("checking");
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 129 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(no-unstable-nested-components): Do not define components during render.
      โ•ญโ”€[apps/mobile/src/Stack.tsx:1058:21]
 1057 โ”‚     <Navigator
 1058 โ”‚       screenLayout={(props) => <GuardedScreenLayout {...props} />}
      ยท                     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1059 โ”‚       screenOptions={({ route }) => {
      โ•ฐโ”€โ”€โ”€โ”€
  help: Move this component definition out of the parent component `AdaptiveRootStack` and pass data as props. If you want to allow component creation in props, set `allowAsProps` option to true.

  โš  eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used.
    โ•ญโ”€[apps/web/src/types.ts:22:3]
 21 โ”‚   EnvironmentThreadShell,
 22 โ”‚   ThreadRunSummary,
    ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ 'ThreadRunSummary' is imported here
 23 โ”‚   ThreadRuntimeSummary,
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  unicorn(no-new-array): Do not use `new Array(singleArgument)`.
     โ•ญโ”€[apps/web/src/terminal/ghostty/core.ts:194:19]
 193 โ”‚     const count = Math.min(CHUNK_SIZE, graphemeLength - start);
 194 โ”‚     const codes = new Array<number>(count);
     ยท                   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 195 โ”‚     for (let index = 0; index < count; index += 1) {
     โ•ฐโ”€โ”€โ”€โ”€
  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]`.

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:682:6]
 681 โ”‚     () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
 682 โ”‚     [props.snoozePresetMinute, swipeActions.secondary],
     ยท      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `props.snoozePresetMinute`
 683 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:728:7]
 727 โ”‚       thread.pinnedAt,
 728 โ”‚       variant,
     ยท       โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท          โ•ฐโ”€โ”€ Unnecessary dependency `variant`
 729 โ”‚     ],
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(purity): Cannot call impure function during render
     โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:660:76]
 659 โ”‚   const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
 660 โ”‚   if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
     ยท                                                                            โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                                                                                 โ•ฐโ”€โ”€ Cannot call impure function
 661 โ”‚   const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
      โ•ญโ”€[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1178:21]
 1177 โ”‚             {providerDrivers.slice(0, -1).map((driver, index) => (
 1178 โ”‚               <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
      ยท                     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1179 โ”‚                 <ProviderIcon provider={driver} size={12} />
      โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39]
 276 โ”‚
 277 โ”‚ โ•ญโ”€โ–ถ   return createElement(RawNativeView, {
 278 โ”‚ โ”‚       ...nativeProps,
 279 โ”‚ โ”‚       refreshEnabled: props.onPullToRefresh !== undefined,
 280 โ”‚ โ”‚       ref: nativeRef,
 281 โ”‚ โ”œโ”€โ–ถ   });
     ยท โ•ฐโ”€โ”€โ”€โ”€ Passing a ref to a function may read its value during render
 282 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(capitalized-calls): Capitalized function called without JSX
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadQueueControl.tsx:595:27]
 594 โ”‚   const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success));
 595 โ”‚   const gesture = Gesture.Pan()
     ยท                           โ”€โ”ฌโ”€
     ยท                            โ•ฐโ”€โ”€ `Pan` may be a component
 596 โ”‚     .enabled(!props.disabled)
     โ•ฐโ”€โ”€โ”€โ”€
  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
  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

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
  86 โ”‚
  87 โ”‚   const cardCoverage = props.cardCoverage;
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ `cardCoverage` originates here
  88 โ”‚   const barHeightRef = useRef(0);
  89 โ”‚   const cardHeightRef = useRef(0);
  90 โ”‚   const cardHeight = useSharedValue(0);
  91 โ”‚   const notifyCoverage = useCallback(() => {
  92 โ”‚     if (!cardCoverage) {
  93 โ”‚       return;
  94 โ”‚     }
  95 โ”‚     const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
  96 โ”‚     if (coverage === cardCoverage.value) {
  97 โ”‚       return;
  98 โ”‚     }
  99 โ”‚     if (cardCoverage.value === 0) {
 100 โ”‚       cardCoverage.value = coverage;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ `cardCoverage` cannot be modified
 101 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  help: Do not mutate component props or hook arguments. If the value should change, update it where it is owned and pass an update callback, or use local state
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7]
  89 โ”‚   const cardHeightRef = useRef(0);
  90 โ”‚   const cardHeight = useSharedValue(0);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ `cardHeight` originates here
  91 โ”‚   const notifyCoverage = useCallback(() => {
  92 โ”‚     if (!cardCoverage) {
  93 โ”‚       return;
  94 โ”‚     }
  95 โ”‚     const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
  96 โ”‚     if (coverage === cardCoverage.value) {
  97 โ”‚       return;
  98 โ”‚     }
  99 โ”‚     if (cardCoverage.value === 0) {
 100 โ”‚       cardCoverage.value = coverage;
 101 โ”‚       return;
 102 โ”‚     }
 103 โ”‚     cardCoverage.value = withTiming(coverage, {
 104 โ”‚       duration: USER_INPUT_TOGGLE_DURATION_MS,
 105 โ”‚       easing: Easing.out(Easing.cubic),
 106 โ”‚     });
 107 โ”‚   }, [cardCoverage]);
 108 โ”‚   const handleBarLayout = useCallback(
 109 โ”‚     (event: LayoutChangeEvent) => {
 110 โ”‚       barHeightRef.current = event.nativeEvent.layout.height;
 111 โ”‚       notifyCoverage();
 112 โ”‚     },
 113 โ”‚     [notifyCoverage],
 114 โ”‚   );
 115 โ”‚   const handleCardLayout = useCallback(
 116 โ”‚     (event: LayoutChangeEvent) => {
 117 โ”‚       cardHeightRef.current = event.nativeEvent.layout.height;
 118 โ”‚       cardHeight.value = event.nativeEvent.layout.height;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ `cardHeight` cannot be modified
 119 โ”‚       notifyCoverage();
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): Cannot modify local variables after render completes
     โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
  90 โ”‚   const cardHeight = useSharedValue(0);
  91 โ”‚   const notifyCoverage = useCallback(() => {
     ยท                                      โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท                                         โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `cardCoverage` after render
  92 โ”‚     if (!cardCoverage) {
  93 โ”‚       return;
  94 โ”‚     }
  95 โ”‚     const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
  96 โ”‚     if (coverage === cardCoverage.value) {
  97 โ”‚       return;
  98 โ”‚     }
  99 โ”‚     if (cardCoverage.value === 0) {
 100 โ”‚       cardCoverage.value = coverage;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ This modifies `cardCoverage`
 101 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): Cannot modify local variables after render completes
     โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
  99 โ”‚     if (cardCoverage.value === 0) {
 100 โ”‚       cardCoverage.value = coverage;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ This modifies `cardCoverage`
 101 โ”‚       return;
 102 โ”‚     }
 103 โ”‚     cardCoverage.value = withTiming(coverage, {
 104 โ”‚       duration: USER_INPUT_TOGGLE_DURATION_MS,
 105 โ”‚       easing: Easing.out(Easing.cubic),
 106 โ”‚     });
 107 โ”‚   }, [cardCoverage]);
 108 โ”‚   const handleBarLayout = useCallback(
 109 โ”‚     (event: LayoutChangeEvent) => {
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                    โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `cardCoverage` after render
 110 โ”‚       barHeightRef.current = event.nativeEvent.layout.height;
     โ•ฐโ”€โ”€โ”€โ”€
  help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): Cannot modify local variables after render completes
     โ•ญโ”€[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7]
 115 โ”‚   const handleCardLayout = useCallback(
 116 โ”‚     (event: LayoutChangeEvent) => {
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                    โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `cardHeight` after render
 117 โ”‚       cardHeightRef.current = event.nativeEvent.layout.height;
 118 โ”‚       cardHeight.value = event.nativeEvent.layout.height;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ This modifies `cardHeight`
 119 โ”‚       notifyCoverage();
     โ•ฐโ”€โ”€โ”€โ”€
  help: This argument is a function which may reassign or mutate `cardHeight` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(capitalized-calls): Capitalized function called without JSX
   โ•ญโ”€[apps/mobile/src/lib/useHoverGesture.ts:8:15]
 7 โ”‚     () =>
 8 โ”‚       Gesture.Hover()
   ยท               โ”€โ”€โ”ฌโ”€โ”€
   ยท                 โ•ฐโ”€โ”€ `Hover` may be a component
 9 โ”‚         .manualActivation(true)
   โ•ฐโ”€โ”€โ”€โ”€
  help: Render `Hover` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
  note: `Hover` 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

  โš  unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
      โ•ญโ”€[apps/mobile/src/state/use-composer-drafts.ts:1022:15]
 1021 โ”‚             instanceId,
 1022 โ”‚             { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models },
      ยท               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1023 โ”‚           ]),
      โ•ฐโ”€โ”€โ”€โ”€
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  โš  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.
     โ•ญโ”€[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5]
 222 โ”‚         let idlePasses = 0;
 223 โ”‚ โ•ญโ”€โ–ถ     for (;;) {
 224 โ”‚ โ”‚         yield* Effect.promise(() => Promise.resolve());
 225 โ”‚ โ”‚         const pending = backgroundRuntime.pending.shift();
 226 โ”‚ โ”‚         if (!pending) {
 227 โ”‚ โ”‚           idlePasses++;
 228 โ”‚ โ”‚           if (idlePasses >= 3) {
 229 โ”‚ โ”‚             return;
 230 โ”‚ โ”‚           }
 231 โ”‚ โ”‚           continue;
 232 โ”‚ โ”‚         }
 233 โ”‚ โ”‚         idlePasses = 0;
 234 โ”‚ โ”‚         const exit = yield* Effect.exit(
 235 โ”‚ โ”‚           pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
 236 โ”‚ โ”‚         );
 237 โ”‚ โ”‚         yield* Effect.sync(() => {
 238 โ”‚ โ”‚           pending.resolve(exit);
 239 โ”‚ โ”‚         });
 240 โ”‚ โ•ฐโ”€โ–ถ     }
 241 โ”‚       },
     โ•ฐโ”€โ”€โ”€โ”€

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/state/use-vcs-action-state.ts:86:5]
 83 โ”‚   const [nowMs, setNowMs] = useState(() => Date.now());
 84 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 85 โ”‚     if (!actionState.isRunning) return;
 86 โ”‚     setNowMs(Date.now());
    ยท     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท         โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 87 โ”‚     const interval = setInterval(() => setNowMs(Date.now()), 1000);
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/review/ReviewSheet.tsx:462:7]
 461 โ”‚     showAuxiliaryPane("inspector");
 462 โ”‚   }, [environmentId, showAuxiliaryPane, threadId]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€                     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท             โ”‚                               โ•ฐโ”€โ”€ Unnecessary dependency `threadId`
     ยท             โ•ฐโ”€โ”€ Unnecessary dependency `environmentId`
 463 โ”‚   const {
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(static-components): Cannot create components during render
     โ•ญโ”€[apps/mobile/src/features/review/ReviewSheet.tsx:733:20]
 500 โ”‚   // same check.
 501 โ”‚   const NativeReviewDiffView = resolveNativeReviewDiffView();
     ยท                                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                             โ•ฐโ”€โ”€ The component is created during render here
 502 โ”‚   const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
 503 โ”‚   const showcasedReviewDrawRef = useRef<string | null>(null);
 504 โ”‚   const [isPullRefreshing, setIsPullRefreshing] = useState(false);
 505 โ”‚   const handlePullToRefresh = async () => {
 506 โ”‚     setIsPullRefreshing(true);
 507 โ”‚     await refreshSelectedSection();
 508 โ”‚     setIsPullRefreshing(false);
 509 โ”‚   };
 510 โ”‚   const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
 511 โ”‚   const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
 512 โ”‚   const fileVisibility = useReviewFileVisibility({
 513 โ”‚     threadKey: reviewCache.threadKey,
 514 โ”‚     sectionId: selectedSection?.id ?? null,
 515 โ”‚     files: reviewFiles,
 516 โ”‚     cachedExpandedFileIds: selectedSection?.id
 517 โ”‚       ? reviewCache.expandedFileIdsBySection[selectedSection.id]
 518 โ”‚       : undefined,
 519 โ”‚     cachedViewedFileIds: selectedSection?.id
 520 โ”‚       ? reviewCache.viewedFileIdsBySection[selectedSection.id]
 521 โ”‚       : undefined,
 522 โ”‚   });
 523 โ”‚   const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
 524 โ”‚   const commentSelection = useReviewCommentSelectionController({
 525 โ”‚     environmentId,
 526 โ”‚     threadId,
 527 โ”‚     selectedSection,
 528 โ”‚     nativeReviewDiffData,
 529 โ”‚   });
 530 โ”‚   const nativeBridge = useNativeReviewDiffBridge({
 531 โ”‚     threadKey: reviewCache.threadKey,
 532 โ”‚     sectionId: selectedSection?.id ?? null,
 533 โ”‚     diff: selectedSection?.diff,
 534 โ”‚     data: nativeReviewDiffData,
 535 โ”‚     collapsedFileIds,
 536 โ”‚     viewedFileIds,
 537 โ”‚     selectedRowIds: commentSelection.selectedRowIds,
 538 โ”‚     canHighlight: parsedDiff.kind === "files",
 539 โ”‚   });
 540 โ”‚   const showcaseReviewKey =
 541 โ”‚     SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
 542 โ”‚       ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
 543 โ”‚       : null;
 544 โ”‚   const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
 545 โ”‚     nativeBridge.onDebug(event);
 546 โ”‚     if (
 547 โ”‚       showcaseReviewKey === null ||
 548 โ”‚       showcasedReviewDrawRef.current === showcaseReviewKey ||
 549 โ”‚       !isNativeReviewDiffDrawEvent(event.nativeEvent)
 550 โ”‚     ) {
 551 โ”‚       return;
 552 โ”‚     }
 553 โ”‚     showcasedReviewDrawRef.current = showcaseReviewKey;
 554 โ”‚     reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
 555 โ”‚   };
 556 โ”‚
 557 โ”‚   const handleSelectFile = async (fileId: string | null) => {
 558 โ”‚     loadVisibleFile(fileId, true);
 559 โ”‚     commentSelection.clearSelection();
 560 โ”‚     if (fileId !== null && collapsedFileIds.includes(fileId)) {
 561 โ”‚       toggleExpandedFile(fileId);
 562 โ”‚     }
 563 โ”‚     const nativeView = nativeReviewDiffViewRef.current;
 564 โ”‚     if (!nativeView) return;
 565 โ”‚     const result = await settlePromise(() =>
 566 โ”‚       fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
 567 โ”‚     );
 568 โ”‚     if (AsyncResult.isFailure(result)) {
 569 โ”‚       console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
 570 โ”‚     }
 571 โ”‚   };
 572 โ”‚   const handleVisibleFileChange = (
 573 โ”‚     event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
 574 โ”‚   ) => {
 575 โ”‚     loadVisibleFile(event.nativeEvent.fileId ?? null);
 576 โ”‚     reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
 577 โ”‚   };
 578 โ”‚   const renderInspector = () => (
 579 โ”‚     <ReviewFileNavigator
 580 โ”‚       ref={reviewFileNavigatorRef}
 581 โ”‚       files={nativeReviewDiffData.files}
 582 โ”‚       headerInset={insets.top}
 583 โ”‚       sectionId={selectedSection?.id ?? null}
 584 โ”‚       onSelectFile={(fileId) => void handleSelectFile(fileId)}
 585 โ”‚     />
 586 โ”‚   );
 587 โ”‚
 588 โ”‚   const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
 589 โ”‚     const { fileId } = event.nativeEvent;
 590 โ”‚     if (fileId) {
 591 โ”‚       loadVisibleFile(fileId, true);
 592 โ”‚       toggleExpandedFile(fileId);
 593 โ”‚     }
 594 โ”‚   };
 595 โ”‚
 596 โ”‚   const handleNativeToggleViewedFile = (
 597 โ”‚     event: NativeSyntheticEvent<{ readonly fileId?: string }>,
 598 โ”‚   ) => {
 599 โ”‚     const { fileId } = event.nativeEvent;
 600 โ”‚     if (fileId) {
 601 โ”‚       toggleViewedFile(fileId);
 602 โ”‚     }
 603 โ”‚   };
 604 โ”‚
 605 โ”‚   const parsedDiffNotice =
 606 โ”‚     parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
 607 โ”‚   const hasCachedSelectedDiff = selectedSection?.diff != null;
 608 โ”‚   const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
 609 โ”‚   const sectionMenu = buildReviewSectionMenu(reviewSections);
 610 โ”‚   const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
 611 โ”‚     hasEnvironmentPresentation: environment.isReady,
 612 โ”‚     isEnvironmentConnected: isEnvironmentReady,
 613 โ”‚     hasCachedSelectedDiff,
 614 โ”‚     hasAnyCachedDiff,
 615 โ”‚   });
 616 โ”‚   const handleRetryEnvironment = () => {
 617 โ”‚     void retryEnvironment(environmentId);
 618 โ”‚   };
 619 โ”‚   const handleReturnToThread = () => {
 620 โ”‚     if (navigation.canGoBack()) {
 621 โ”‚       navigation.goBack();
 622 โ”‚       return;
 623 โ”‚     }
 624 โ”‚     navigation.navigate("Thread", {
 625 โ”‚       environmentId: String(environmentId),
 626 โ”‚       threadId: String(threadId),
 627 โ”‚     });
 628 โ”‚   };
 629 โ”‚   const androidHeaderSubtitle = [
 630 โ”‚     selectedSection?.title,
 631 โ”‚     headerDiffSummary.additions,
 632 โ”‚     headerDiffSummary.deletions,
 633 โ”‚   ]
 634 โ”‚     .filter((part): part is string => Boolean(part))
 635 โ”‚     .join(" ยท ");
 636 โ”‚
 637 โ”‚   const showChangedFilesPane =
 638 โ”‚     !showConnectionNotice &&
 639 โ”‚     selectedSection !== null &&
 640 โ”‚     parsedDiff.kind === "files" &&
 641 โ”‚     NativeReviewDiffView !== null;
 642 โ”‚   useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
 643 โ”‚   const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
 644 โ”‚
 645 โ”‚   const listHeader = (() => {
 646 โ”‚     const children: ReactElement[] = [];
 647 โ”‚
 648 โ”‚     if (error) {
 649 โ”‚       children.push(
 650 โ”‚         <View
 651 โ”‚           key="review-error"
 652 โ”‚           className={cn(
 653 โ”‚             "bg-card px-4 py-3",
 654 โ”‚             Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
 655 โ”‚           )}
 656 โ”‚         >
 657 โ”‚           <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
 658 โ”‚           <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
 659 โ”‚         </View>,
 660 โ”‚       );
 661 โ”‚     }
 662 โ”‚
 663 โ”‚     if (parsedDiffNotice) {
 664 โ”‚       children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
 665 โ”‚     }
 666 โ”‚
 667 โ”‚     if (children.length === 0) {
 668 โ”‚       return null;
 669 โ”‚     }
 670 โ”‚
 671 โ”‚     return <>{children}</>;
 672 โ”‚   })();
 673 โ”‚   const headerSubtitle = [
 674 โ”‚     headerDiffSummary.additions,
 675 โ”‚     headerDiffSummary.deletions,
 676 โ”‚     pendingReviewCommentCount > 0
 677 โ”‚       ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
 678 โ”‚       : null,
 679 โ”‚   ]
 680 โ”‚     .filter(Boolean)
 681 โ”‚     .join(" ยท ");
 682 โ”‚   const headerTitleText = selectedSection?.title ?? "Review changes";
 683 โ”‚
 684 โ”‚   return (
 685 โ”‚     <>
 686 โ”‚       <ReviewHeader
 687 โ”‚         environmentId={environmentId}
 688 โ”‚         threadId={threadId}
 689 โ”‚         title={headerTitleText}
 690 โ”‚         subtitle={headerSubtitle}
 691 โ”‚         androidSubtitle={androidHeaderSubtitle}
 692 โ”‚         iconColor={headerIcon}
 693 โ”‚         selectedThreadCwd={selectedThreadCwd}
 694 โ”‚         sectionMenu={sectionMenu}
 695 โ”‚         selectedSection={selectedSection}
 696 โ”‚         showSectionToolbar={showSectionToolbar}
 697 โ”‚         showChangedFilesToggle={showChangedFilesToggle}
 698 โ”‚         onRefresh={handlePullToRefresh}
 699 โ”‚         onSelectSection={selectSection}
 700 โ”‚         onReturnToThread={handleReturnToThread}
 701 โ”‚       />
 702 โ”‚
 703 โ”‚       <ScreenContent>
 704 โ”‚         <View className="flex-1 bg-sheet android:bg-sheet-solid">
 705 โ”‚           {showConnectionNotice ? (
 706 โ”‚             <View className="flex-1" style={{ paddingTop: topContentInset }}>
 707 โ”‚               <EnvironmentConnectionNotice
 708 โ”‚                 environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
 709 โ”‚                 connection={
 710 โ”‚                   environment.presentation?.connection ?? {
 711 โ”‚                     phase: "available",
 712 โ”‚                     error: null,
 713 โ”‚                     traceId: null,
 714 โ”‚                   }
 715 โ”‚                 }
 716 โ”‚                 resourceName="review"
 717 โ”‚                 onRetry={handleRetryEnvironment}
 718 โ”‚               />
 719 โ”‚             </View>
 720 โ”‚           ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
 721 โ”‚             <View
 722 โ”‚               className="flex-1"
 723 โ”‚               style={{
 724 โ”‚                 backgroundColor: nativeBridge.theme.background,
 725 โ”‚               }}
 726 โ”‚             >
 727 โ”‚               <View
 728 โ”‚                 className="min-w-0 flex-1"
 729 โ”‚                 style={listHeader ? { paddingTop: topContentInset } : undefined}
 730 โ”‚               >
 731 โ”‚                 {listHeader}
 732 โ”‚                 <View className="min-w-0 flex-1" collapsable={false}>
 733 โ”‚                   <NativeReviewDiffView
     ยท                    โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                              โ•ฐโ”€โ”€ This component is created during render
 734 โ”‚                     collapsable={false}
     โ•ฐโ”€โ”€โ”€โ”€
  help: Components created during render will reset their state each time they are created. Declare components outside of render
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31]
 222 โ”‚               ? snippetTokens.map((line, lineIndex) => (
 223 โ”‚                   <NativeText key={lineIndex}>
     ยท                               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 224 โ”‚                     {lineIndex > 0 ? "\n" : ""}
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25]
 226 โ”‚                       <NativeText
 227 โ”‚                         key={tokenIndex}
     ยท                         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 228 โ”‚                         style={{
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7]
 100 โ”‚
 101 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 102 โ”‚     if (!target || selectedLines.length === 0) {
 103 โ”‚       setHighlightedLinesById({});
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 104 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
 150 โ”‚
 151 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 152 โ”‚     if (!controlledSelectedPath) {
 153 โ”‚       return;
 154 โ”‚     }
 155 โ”‚     setExpandedPaths((current) => {
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 156 โ”‚       const ancestors = ancestorPaths(controlledSelectedPath);
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5]
 104 โ”‚
 105 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 106 โ”‚     clearReviewCommentTarget();
 107 โ”‚     setPendingNativeCommentSelection(null);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                     โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 108 โ”‚   }, [selectedSection?.id]);
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7]
 109 โ”‚
 110 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 111 โ”‚     if (activeCommentTarget === null) {
 112 โ”‚       setPendingNativeCommentSelection(null);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                       โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 113 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7]
 107 โ”‚     setPendingNativeCommentSelection(null);
 108 โ”‚   }, [selectedSection?.id]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ Unnecessary dependency `selectedSection?.id`
 109 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
 256 โ”‚     return () => cancelAnimationFrame(frame);
 257 โ”‚   }, [props.path, targetIndex]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท            โ•ฐโ”€โ”€ Unnecessary dependency `props.path`
 258 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
 292 โ”‚                     <SourceText
 293 โ”‚                       key={`${index}:${tokenIndex}`}
     ยท                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 294 โ”‚                       style={{
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(no-array-index-key): Usage of Array index in keys is not allowed
     โ•ญโ”€[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
 308 โ”‚             return (
 309 โ”‚               <SourceText key={index}>
     ยท                           โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 310 โ”‚                 {body}
     โ•ฐโ”€โ”€โ”€โ”€
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5]
 55 โ”‚
 56 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 57 โ”‚     scheduler.reset();
 58 โ”‚     highlightedRowIdsRef.current = new Set();
 59 โ”‚     visibleChunkIndexRef.current = 0;
 60 โ”‚     setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 });
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 61 โ”‚     setTokensPatchJson(createEmptyTokenPatch(resetKey));
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7]
 62 โ”‚     return () => scheduler.cancel();
 63 โ”‚   }, [enabled, resetKey, rows.length, scheduler]);
    ยท       โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€            โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท          โ”‚                    โ•ฐโ”€โ”€ Unnecessary dependency `rows.length`
    ยท          โ•ฐโ”€โ”€ Unnecessary dependency `enabled`
 64 โ”‚
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
     โ•ญโ”€[apps/mobile/src/lib/markdownDocument.ts:138:28]
 137 โ”‚   visit(parser.parse(markdown));
 138 โ”‚   for (const edit of edits.reverse())
     ยท                            โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 139 โ”‚     markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  โš  unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
     โ•ญโ”€[apps/mobile/src/lib/markdownDocument.ts:169:28]
 168 โ”‚   visit(parser.parse(markdown));
 169 โ”‚   for (const edit of edits.reverse())
     ยท                            โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 170 โ”‚     markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  โš  unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
     โ•ญโ”€[apps/mobile/src/lib/markdownDocument.ts:223:38]
 222 โ”‚   visit(parser.parse(markdown));
 223 โ”‚   for (const lineStart of lineStarts.reverse()) {
     ยท                                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 224 โ”‚     // The header row may be a lazy line without its container markers (`>` or list indent),
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5]
 76 โ”‚
 77 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 78 โ”‚     const { host, code } = parsePairingUrl(connectionPairingUrl);
 79 โ”‚     setHostInput(host);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 80 โ”‚     setCodeInput(code);
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5]
 82 โ”‚
 83 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 84 โ”‚     if (routePairingUrl.length === 0) {
 85 โ”‚       return;
 86 โ”‚     }
 87 โ”‚
 88 โ”‚     const { host, code } = parsePairingUrl(routePairingUrl);
 89 โ”‚     setHostInput(host);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 90 โ”‚     setCodeInput(code);
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7]
 92 โ”‚
 93 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 94 โ”‚     if (pairingConnectionError) {
 95 โ”‚       setIsSubmitting(false);
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 96 โ”‚     }
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:111:5]
 107 โ”‚   );
 108 โ”‚   const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ `separationProgress` originates here
 109 โ”‚
 110 โ”‚   useEffect(() => {
 111 โ”‚     separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ `separationProgress` cannot be modified
 112 โ”‚   }, [props.showScrollToEnd, separationProgress]);
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
 128 โ”‚   // and repeatedly retargets the animation as it grows.
 129 โ”‚   const capsuleWidth = useSharedValue<number | null>(null);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ `capsuleWidth` originates here
 130 โ”‚   const measuredWidthRef = useRef<number | null>(null);
 131 โ”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
 132 โ”‚     const width = event.nativeEvent.layout.width;
 133 โ”‚     if (width === measuredWidthRef.current) {
 134 โ”‚       return;
 135 โ”‚     }
 136 โ”‚     const first = measuredWidthRef.current === null;
 137 โ”‚     measuredWidthRef.current = width;
 138 โ”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ `capsuleWidth` cannot be modified
 139 โ”‚   };
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
 128 โ”‚   // and repeatedly retargets the animation as it grows.
 129 โ”‚   const capsuleWidth = useSharedValue<number | null>(null);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ `capsuleWidth` originates here
 130 โ”‚   const measuredWidthRef = useRef<number | null>(null);
 131 โ”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
 132 โ”‚     const width = event.nativeEvent.layout.width;
 133 โ”‚     if (width === measuredWidthRef.current) {
 134 โ”‚       return;
 135 โ”‚     }
 136 โ”‚     const first = measuredWidthRef.current === null;
 137 โ”‚     measuredWidthRef.current = width;
 138 โ”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
 139 โ”‚   };
 140 โ”‚   const hasStatus = props.status !== null;
 141 โ”‚   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
 142 โ”‚   useEffect(() => {
 143 โ”‚     if (!hasStatus) {
 144 โ”‚       measuredWidthRef.current = null;
 145 โ”‚       capsuleWidth.value = null;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ `capsuleWidth` cannot be modified
 146 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): Cannot modify local variables after render completes
     โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
 141 โ”‚   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
 142 โ”‚   useEffect(() => {
     ยท             โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `capsuleWidth` after render
 143 โ”‚     if (!hasStatus) {
 144 โ”‚       measuredWidthRef.current = null;
 145 โ”‚       capsuleWidth.value = null;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ This modifies `capsuleWidth`
 146 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): Cannot modify local variables after render completes
     โ•ญโ”€[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
 130 โ”‚   const measuredWidthRef = useRef<number | null>(null);
 131 โ”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
     ยท                             โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                            โ•ฐโ”€โ”€ This function may (indirectly) reassign or modify `capsuleWidth` after render
 132 โ”‚     const width = event.nativeEvent.layout.width;
 133 โ”‚     if (width === measuredWidthRef.current) {
 134 โ”‚       return;
 135 โ”‚     }
 136 โ”‚     const first = measuredWidthRef.current === null;
 137 โ”‚     measuredWidthRef.current = width;
 138 โ”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ This modifies `capsuleWidth`
 139 โ”‚   };
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(memo-dependencies): Found missing memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5]
 103 โ”‚         .runOnJS(true)
 104 โ”‚         .onStart(() => latest.current.onStart())
     ยท                        โ”€โ”€โ”€โ”ฌโ”€โ”€
     ยท                           โ•ฐโ”€โ”€ 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
 105 โ”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
 106 โ”‚         .onEnd((event) => latest.current.onMove(event.translationY))
 107 โ”‚         .onFinalize((_, success) => latest.current.onEnd(!success)),
 108 โ”‚     [props.disabled],
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ This dependency list is missing values used by the callback
 109 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:262:5]
 260 โ”‚     .join("|");
 261 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 262 โ”‚     stop();
     ยท     โ”€โ”€โ”ฌโ”€
     ยท       โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 263 โ”‚   }, [orderVersion]);
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(refs): Cannot access refs during render
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9]
 95 โ”‚   const latest = useRef(props);
 96 โ”‚   latest.current = props;
    ยท   โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
    ยท      โ”‚      โ•ฐโ”€โ”€ Cannot update ref value during render
    ยท      โ•ฐโ”€โ”€ This value is a ref
 97 โ”‚   const gesture = useMemo(
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18]
 103 โ”‚         .runOnJS(true)
 104 โ”‚         .onStart(() => latest.current.onStart())
     ยท                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                 โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 105 โ”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19]
 104 โ”‚         .onStart(() => latest.current.onStart())
 105 โ”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
     ยท                   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                             โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 106 โ”‚         .onEnd((event) => latest.current.onMove(event.translationY))
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16]
 105 โ”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
 106 โ”‚         .onEnd((event) => latest.current.onMove(event.translationY))
     ยท                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                          โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 107 โ”‚         .onFinalize((_, success) => latest.current.onEnd(!success)),
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21]
 106 โ”‚         .onEnd((event) => latest.current.onMove(event.translationY))
 107 โ”‚         .onFinalize((_, success) => latest.current.onEnd(!success)),
     ยท                     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                            โ•ฐโ”€โ”€ Passing a ref to a function may read its value during render
 108 โ”‚     [props.disabled],
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:250:9]
 249 โ”‚   const latest = useRef({ rows, planners, moveThread });
 250 โ”‚   latest.current = { rows, planners, moveThread };
     ยท   โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
     ยท      โ”‚      โ•ฐโ”€โ”€ Cannot update ref value during render
     ยท      โ•ฐโ”€โ”€ This value is a ref
 251 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22]
 247 โ”‚   const [preview, setPreview] = useState<Drag | null>(null);
 248 โ”‚   const translateY = useRef(new Animated.Value(0)).current;
     ยท                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                        โ•ฐโ”€โ”€ Cannot access ref value during render
 249 โ”‚   const latest = useRef({ rows, planners, moveThread });
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22]
 247 โ”‚   const [preview, setPreview] = useState<Drag | null>(null);
 248 โ”‚   const translateY = useRef(new Animated.Value(0)).current;
     ยท                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                        โ•ฐโ”€โ”€ Cannot access ref value during render
 249 โ”‚   const latest = useRef({ rows, planners, moveThread });
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22]
 247 โ”‚   const [preview, setPreview] = useState<Drag | null>(null);
 248 โ”‚   const translateY = useRef(new Animated.Value(0)).current;
     ยท                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                        โ•ฐโ”€โ”€ Cannot access ref value during render
 249 โ”‚   const latest = useRef({ rows, planners, moveThread });
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(refs): Cannot access refs during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:248:22]
 247 โ”‚   const [preview, setPreview] = useState<Drag | null>(null);
 248 โ”‚   const translateY = useRef(new Animated.Value(0)).current;
     ยท                      โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                        โ•ฐโ”€โ”€ Cannot access ref value during render
 249 โ”‚   const latest = useRef({ rows, planners, moveThread });
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:262:5]
 261 โ”‚   useEffect(() => {
 262 โ”‚     stop();
     ยท     โ”€โ”€โ”ฌโ”€
     ยท       โ•ฐโ”€โ”€ Missing dependency `stop`
 263 โ”‚   }, [orderVersion]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Unnecessary dependency `orderVersion`
 264 โ”‚   useEffect(
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(purity): Cannot call impure function during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:325:16]
 324 โ”‚     update(0);
 325 โ”‚     let last = performance.now();
     ยท                โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                        โ•ฐโ”€โ”€ Cannot call impure function
 326 โ”‚     const tick = () => {
     โ•ฐโ”€โ”€โ”€โ”€
  help: `performance.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  โš  react(capitalized-calls): Capitalized function called without JSX
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15]
  98 โ”‚     () =>
  99 โ”‚       Gesture.Pan()
     ยท               โ”€โ”ฌโ”€
     ยท                โ•ฐโ”€โ”€ `Pan` may be a component
 100 โ”‚         .enabled(!props.disabled)
     โ•ฐโ”€โ”€โ”€โ”€
  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
  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

  โš  react(immutability): This value cannot be modified
    โ•ญโ”€[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7]
 53 โ”‚ function usePulseAnimation(pulse: boolean) {
 54 โ”‚   const pulseProgress = useSharedValue(0);
    ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท               โ•ฐโ”€โ”€ `pulseProgress` originates here
 55 โ”‚
 56 โ”‚   useEffect(() => {
 57 โ”‚     if (pulse) {
 58 โ”‚       pulseProgress.value = withRepeat(
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท             โ•ฐโ”€โ”€ `pulseProgress` cannot be modified
 59 โ”‚         withTiming(1, {
    โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5]
 55 โ”‚
 56 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 57 โ”‚     setDecodedSize(null);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 58 โ”‚   }, [props.sourceKey]);
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5]
 59 โ”‚
 60 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 61 โ”‚     setFailedUri(null);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 62 โ”‚   }, [props.uri]);
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
   โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10]
 6 โ”‚ import { parse, SvgAst, type JsxAST } from "react-native-svg";
 7 โ”‚ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native";
   ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
   ยท                  โ•ฐโ”€โ”€ 'ActivityIndicator' is imported here
 8 โ”‚
   โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7]
 57 โ”‚     setDecodedSize(null);
 58 โ”‚   }, [props.sourceKey]);
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท              โ•ฐโ”€โ”€ Unnecessary dependency `props.sourceKey`
 59 โ”‚
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7]
 61 โ”‚     setFailedUri(null);
 62 โ”‚   }, [props.uri]);
    ยท       โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท           โ•ฐโ”€โ”€ Unnecessary dependency `props.uri`
 63 โ”‚
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:84:5]
 79 โ”‚
 80 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 81 โ”‚     if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
 82 โ”‚     const branchName = initialProjectRef.branch;
 83 โ”‚     let active = true;
 84 โ”‚     setPendingCheckouts((count) => count + 1);
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 85 โ”‚     // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:289:50]
 288 โ”‚   return (
 289 โ”‚     <ExistingThreadSettingsRouteContext.Provider value={value}>
     ยท                                                  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 290 โ”‚       {props.children}
     โ•ฐโ”€โ”€โ”€โ”€
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:653:44]
 652 โ”‚   return (
 653 โ”‚     <ThreadSettingsSessionContext.Provider value={value}>
     ยท                                            โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 654 โ”‚       {props.children}
     โ•ฐโ”€โ”€โ”€โ”€
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1456:55]
 1455 โ”‚   return (
 1456 โ”‚     <ThreadSettingsPickerPresentationContext.Provider value={presentation}>
      ยท                                                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1457 โ”‚       <ThreadSettingsPickerStack.Navigator
      โ•ฐโ”€โ”€โ”€โ”€
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:282:7]
 281 โ”‚       mountedRef.current = false;
 282 โ”‚       flow.setBranchQuery("");
     ยท       โ”€โ”€โ”ฌโ”€
     ยท         โ•ฐโ”€โ”€ Missing dependency `flow`
 283 โ”‚     };
 284 โ”‚   }, [flow.setBranchQuery]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ Overly precise dependency `flow.setBranchQuery`, use `flow` instead
 285 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:487:5]
 485 โ”‚   }, []);
 486 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 487 โ”‚     setKeyboardStateSuspect(false);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 488 โ”‚   }, [isKeyboardVisible, liveKeyboardHeight]);
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:838:7]
 835 โ”‚   const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0);
 836 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 837 โ”‚     if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) {
 838 โ”‚       setLastKnownKeyboardHeight(liveKeyboardHeight);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                    โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 839 โ”‚     }
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1081:5]
 1077 โ”‚
 1078 โ”‚   useLayoutEffect(() => {
      ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท          โ•ฐโ”€โ”€ This is the containing effect
 1079 โ”‚     selectedThreadKeyRef.current = selectedThreadKey;
 1080 โ”‚     // A replaced or unmounted native editor may not emit a blur event.
 1081 โ”‚     setComposerFocused(false);
      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 1082 โ”‚   }, [selectedThreadKey, showContent]);
      โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1085:5]
 1083 โ”‚
 1084 โ”‚   useEffect(() => {
      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท       โ•ฐโ”€โ”€ This is the containing effect
 1085 โ”‚     setAnchorMessageId(null);
      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท              โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 1086 โ”‚     setSubmittedMessageId(null);
      โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:488:7]
 487 โ”‚     setKeyboardStateSuspect(false);
 488 โ”‚   }, [isKeyboardVisible, liveKeyboardHeight]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ”‚                   โ•ฐโ”€โ”€ Unnecessary dependency `liveKeyboardHeight`
     ยท               โ•ฐโ”€โ”€ Unnecessary dependency `isKeyboardVisible`
 489 โ”‚   const handleOwnedInputFocusChange = (focused: boolean) => {
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1031:7]
 1030 โ”‚     userInputInsetProgress.set(1);
 1031 โ”‚   }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                   โ•ฐโ”€โ”€ Unnecessary dependency `activeUserInputRequestId`
 1032 โ”‚   const showContent = props.showContent ?? true;
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1082:26]
 1081 โ”‚     setComposerFocused(false);
 1082 โ”‚   }, [selectedThreadKey, showContent]);
      ยท                          โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
      ยท                               โ•ฐโ”€โ”€ Unnecessary dependency `showContent`
 1083 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1091:15]
 1090 โ”‚     freeze.set(false);
 1091 โ”‚   }, [freeze, selectedThreadKey]);
      ยท               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                       โ•ฐโ”€โ”€ Unnecessary dependency `selectedThreadKey`
 1092 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:919:5]
 914 โ”‚   const composerPopoverHeight = useSharedValue(0);
 915 โ”‚   const floatingControlCoverage = useSharedValue(
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                    โ•ฐโ”€โ”€ `floatingControlCoverage` originates here
 916 โ”‚     showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
 917 โ”‚   );
 918 โ”‚   useEffect(() => {
 919 โ”‚     floatingControlCoverage.value = withTiming(
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ `floatingControlCoverage` cannot be modified
 920 โ”‚       showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(immutability): This value cannot be modified
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:937:7]
 927 โ”‚   const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null;
 928 โ”‚   const combinedContentInsetEndAdjustment = useSharedValue(
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                         โ•ฐโ”€โ”€ `combinedContentInsetEndAdjustment` originates here
 929 โ”‚     Math.max(0, estimatedOverlayHeight - nativeInsetOvercount),
 930 โ”‚   );
 931 โ”‚   useAnimatedReaction(
 932 โ”‚     () =>
 933 โ”‚       contentInsetEndAdjustment.value +
 934 โ”‚       floatingControlCoverage.value +
 935 โ”‚       (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0),
 936 โ”‚     (value) => {
 937 โ”‚       combinedContentInsetEndAdjustment.value = value;
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                       โ•ฐโ”€โ”€ `combinedContentInsetEndAdjustment` cannot be modified
 938 โ”‚     },
     โ•ฐโ”€โ”€โ”€โ”€
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:282:5]
 280 โ”‚   const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0);
 281 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 282 โ”‚     setNow(new Date().toISOString());
     ยท     โ”€โ”€โ”€โ”ฌโ”€โ”€
     ยท        โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 283 โ”‚     const id = setInterval(() => setNow(new Date().toISOString()), 60_000);
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:362:25]
 361 โ”‚     // range) the boundary string is identical and the chain would die.
 362 โ”‚   }, [nextSnoozeWakeAt, snoozeWakeTick]);
     ยท                         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
     ยท                                โ•ฐโ”€โ”€ Unnecessary dependency `snoozeWakeTick`
 363 โ”‚   const listItems = ((): readonly SidebarListItem[] => {
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(purity): Cannot call impure function during render
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:353:53]
 352 โ”‚     if (Number.isNaN(wakeAtMs)) return;
 353 โ”‚     const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
     ยท                                                     โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                                                          โ•ฐโ”€โ”€ Cannot call impure function
 354 โ”‚     const id = setTimeout(() => {
     โ•ฐโ”€โ”€โ”€โ”€
  help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  โš  unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
    โ•ญโ”€[apps/mobile/src/state/use-model-option-memory.ts:21:7]
 20 โ”‚     [instanceId]: {
 21 โ”‚       ...(state[instanceId] ?? {}),
    ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 22 โ”‚       [model]: options,
    โ•ฐโ”€โ”€โ”€โ”€
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    โ•ญโ”€[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:57:5]
 55 โ”‚
 56 โ”‚   useEffect(() => {
    ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
    ยท       โ•ฐโ”€โ”€ This is the containing effect
 57 โ”‚     setMountedModes((current) => {
    ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท            โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 58 โ”‚       if (current.has(props.mode)) {
    โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5]
 1314 โ”‚     queuedMessagesByThreadKey,
 1315 โ”‚     retryTick,
      ยท     โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท         โ•ฐโ”€โ”€ Unnecessary dependency `retryTick`
 1316 โ”‚     restoreQueuedMessage,
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
    โ•ญโ”€[apps/mobile/src/state/thread-order.ts:29:7]
 28 โ”‚     getPendingThreadOrder();
 29 โ”‚   }, [nowMinute, snoozeWakeTick]);
    ยท       โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท           โ”‚             โ•ฐโ”€โ”€ Unnecessary dependency `snoozeWakeTick`
    ยท           โ•ฐโ”€โ”€ Unnecessary dependency `nowMinute`
 30 โ”‚   return pending;
    โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(memo-dependencies): Found extra memoization dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:590:9]
 589 โ”‚       };
 590 โ”‚     }, [props.environmentId, attachment.id, httpBaseUrl]),
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
     ยท                  โ”‚                 โ”‚             โ•ฐโ”€โ”€ Unnecessary dependency `httpBaseUrl`
     ยท                  โ”‚                 โ•ฐโ”€โ”€ Unnecessary dependency `attachment.id`
     ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `props.environmentId`
 591 โ”‚   );
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:1845:5]
 1843 โ”‚   );
 1844 โ”‚   useEffect(() => {
      ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
      ยท       โ•ฐโ”€โ”€ This is the containing effect
 1845 โ”‚     setExpandedVideo(null);
      ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 1846 โ”‚     setExpandedFile(null);
      โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:64:10]
 63 โ”‚ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
 64 โ”‚ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
    ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
    ยท                     โ•ฐโ”€โ”€ 'isMarkdownFileLinkLabel' is imported here
 65 โ”‚ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments";
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'createContext' is imported but never used.
    โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:90:3]
 89 โ”‚ import {
 90 โ”‚   createContext,
    ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
    ยท         โ•ฐโ”€โ”€ 'createContext' is imported here
 91 โ”‚   memo,
    โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:104:3]
 103 โ”‚ import {
 104 โ”‚   ActivityIndicator,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ 'ActivityIndicator' is imported here
 105 โ”‚   Image,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:111:3]
 110 โ”‚   Pressable,
 111 โ”‚   ScrollView,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท        โ•ฐโ”€โ”€ 'ScrollView' is imported here
 112 โ”‚   StyleSheet,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:113:11]
 112 โ”‚   StyleSheet,
 113 โ”‚   Text as NativeText,
     ยท           โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท                โ•ฐโ”€โ”€ 'NativeText' is imported here
 114 โ”‚   type ColorValue,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:135:10]
 134 โ”‚ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
 135 โ”‚ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'tryOpenExternalUrl' is imported here
 136 โ”‚ import { downloadAndShareAttachment } from "../../lib/attachmentDownload";
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:138:10]
 137 โ”‚ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
 138 โ”‚ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'faviconUrlForOrigin' is imported here
 139 โ”‚ import {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:152:10]
 151 โ”‚ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
 152 โ”‚ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ 'MediaVideoPlayer' is imported here
 153 โ”‚ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia";
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3]
 155 โ”‚   attachmentVideoPreviewSource,
 156 โ”‚   mediaVideoPreviewUri,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ 'mediaVideoPreviewUri' is imported here
 157 โ”‚   mediaVideoThumbnailKey,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:157:3]
 156 โ”‚   mediaVideoPreviewUri,
 157 โ”‚   mediaVideoThumbnailKey,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ 'mediaVideoThumbnailKey' is imported here
 158 โ”‚   type MediaVideoPreviewSource,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:158:8]
 157 โ”‚   mediaVideoThumbnailKey,
 158 โ”‚   type MediaVideoPreviewSource,
     ยท        โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                   โ•ฐโ”€โ”€ 'MediaVideoPreviewSource' is imported here
 159 โ”‚ } from "../../lib/videoPreviewSource";
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:166:15]
 165 โ”‚ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection";
 166 โ”‚ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter";
     ยท               โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                      โ•ฐโ”€โ”€ 'ReviewDiffTheme' is imported here
 167 โ”‚ import {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:181:3]
 180 โ”‚ import {
 181 โ”‚   resolveMarkdownFontSizes,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ 'resolveMarkdownFontSizes' is imported here
 182 โ”‚   resolveNativeMarkdownTypography,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:186:10]
 185 โ”‚ import { PierreEntryIcon } from "../../components/PierreEntryIcon";
 186 โ”‚ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                     โ•ฐโ”€โ”€ 'markdownLinkIconSource' is imported here
 187 โ”‚ import {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3]
 188 โ”‚   normalizeNativeMarkdownUrl,
 189 โ”‚   resolveMarkdownInlineCodePresentation,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                     โ•ฐโ”€โ”€ 'resolveMarkdownInlineCodePresentation' is imported here
 190 โ”‚   resolveMarkdownLinkIcon,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:190:3]
 189 โ”‚   resolveMarkdownInlineCodePresentation,
 190 โ”‚   resolveMarkdownLinkIcon,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ 'resolveMarkdownLinkIcon' is imported here
 191 โ”‚   resolveMarkdownLinkPresentation,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:225:10]
 224 โ”‚ import { ThreadMcpApp } from "./McpAppWebView";
 225 โ”‚ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState";
     ยท          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                      โ•ฐโ”€โ”€ 'useMarkdownCodeHighlight' is imported here
 226 โ”‚ import {
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:229:3]
 228 โ”‚   useAssetUrl,
 229 โ”‚   useAssetUrlState,
     ยท   โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท           โ•ฐโ”€โ”€ 'useAssetUrlState' is imported here
 230 โ”‚   useRefreshAssetUrl,
     โ•ฐโ”€โ”€โ”€โ”€
  help: Consider removing this import.

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:1847:7]
 1846 โ”‚     setExpandedFile(null);
 1847 โ”‚   }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท                โ”‚                  โ”‚                       โ•ฐโ”€โ”€ Unnecessary dependency `props.contentPresentation.kind`
      ยท                โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `props.threadId`
      ยท                โ•ฐโ”€โ”€ Unnecessary dependency `props.environmentId`
 1848 โ”‚   const horizontalPadding = props.layoutVariant === "split" ? 20 : 16;
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2302:30]
 2301 โ”‚     transitionEndFollow({ type: "reset" });
 2302 โ”‚   }, [clearUserScrollSettle, feedThreadKey, transitionEndFollow]);
      ยท                              โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
      ยท                                    โ•ฐโ”€โ”€ Unnecessary dependency `feedThreadKey`
 2303 โ”‚   useEffect(() => {
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2320:7]
 2319 โ”‚     reportHeaderMaterialVisibility(false);
 2320 โ”‚   }, [feedThreadKey, reportHeaderMaterialVisibility]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€
      ยท             โ•ฐโ”€โ”€ Unnecessary dependency `feedThreadKey`
 2321 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2352:7]
 2351 โ”‚     }
 2352 โ”‚   }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€
      ยท             โ•ฐโ”€โ”€ Unnecessary dependency `listMountKey`
 2353 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
      โ•ญโ”€[apps/mobile/src/features/threads/ThreadFeed.tsx:2447:7]
 2446 โ”‚     }
 2447 โ”‚   }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
      ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
      ยท              โ”‚                  โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `expandedWorkRows`
      ยท              โ”‚                  โ•ฐโ”€โ”€ Unnecessary dependency `expandedWorkGroups`
      ยท              โ•ฐโ”€โ”€ Unnecessary dependency `expandedTurnIds`
 2448 โ”‚
      โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/new-task-flow-provider.tsx:431:5]
 426 โ”‚       : null;
 427 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 428 โ”‚     if (activeDraftKey !== null || editingPendingTask !== null || selectedProject === null) {
 429 โ”‚       return;
 430 โ”‚     }
 431 โ”‚     setActiveDraftKey(
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท             โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 432 โ”‚       createNewTaskDraft({
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
      โ•ญโ”€[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1212:39]
 1211 โ”‚
 1212 โ”‚   return <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>;
      ยท                                       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 1213 โ”‚ }
      โ•ฐโ”€โ”€โ”€โ”€
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:388:5]
 386 โ”‚
 387 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 388 โ”‚     setInspectorSelection((current) => {
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 389 โ”‚       if (props.renderInspector === undefined) {
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(no-unstable-nested-components): Do not define components during render.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:516:24]
 515 โ”‚       const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
 516 โ”‚ โ•ญโ”€โ–ถ   const GitInspector = () => (
 517 โ”‚ โ”‚       <GitOverviewSheet
 518 โ”‚ โ”‚         headerInset={inspectorHeaderInset}
 519 โ”‚ โ”‚         presentation="inspector"
 520 โ”‚ โ”‚         route={{ params: props.route.params }}
 521 โ”‚ โ”‚       />
 522 โ”‚ โ•ฐโ”€โ–ถ   );
 523 โ”‚       const FilesInspector = () =>
     โ•ฐโ”€โ”€โ”€โ”€
  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.

  โš  react(no-unstable-nested-components): Do not define components during render.
     โ•ญโ”€[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:523:26]
 522 โ”‚       );
 523 โ”‚ โ•ญโ”€โ–ถ   const FilesInspector = () =>
 524 โ”‚ โ”‚       selectedThread !== null && selectedThreadCwd !== null ? (
 525 โ”‚ โ”‚         <ThreadFileNavigatorPane
 526 โ”‚ โ”‚           cwd={selectedThreadCwd}
 527 โ”‚ โ”‚           environmentId={selectedThread.environmentId}
 528 โ”‚ โ”‚           headerInset={inspectorHeaderInset}
 529 โ”‚ โ”‚           projectName={selectedThreadProject?.title ?? "Files"}
 530 โ”‚ โ”‚           selectedPath={null}
 531 โ”‚ โ”‚           onSelectFile={handleSelectInspectorFile}
 532 โ”‚ โ”‚         />
 533 โ”‚ โ•ฐโ”€โ–ถ     ) : null;
 534 โ”‚       const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
     โ•ฐโ”€โ”€โ”€โ”€
  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:552:7]
 546 โ”‚   }, [cancelledIncomingShareId, navigation, props.incomingShareId]);
 547 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 548 โ”‚     if (!isReturningToProjectPicker) {
 549 โ”‚       return;
 550 โ”‚     }
 551 โ”‚     if (requestedInitialProjectAvailable) {
 552 โ”‚       setIsReturningToProjectPicker(false);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                     โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 553 โ”‚       return;
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:700:9]
 643 โ”‚
 644 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 645 โ”‚     if (props.pendingTaskId || props.draftId) {
 646 โ”‚       return;
 647 โ”‚     }
 648 โ”‚     if (lastInitialProjectRefRef.current !== props.initialProjectRef) {
 649 โ”‚       lastInitialProjectRefRef.current = props.initialProjectRef;
 650 โ”‚       appliedInitialProjectKeyRef.current = null;
 651 โ”‚     }
 652 โ”‚     const initialEnvironmentId = props.initialProjectRef?.environmentId;
 653 โ”‚     const initialProjectId = props.initialProjectRef?.projectId;
 654 โ”‚     if (initialEnvironmentId && initialProjectId) {
 655 โ”‚       const directProject =
 656 โ”‚         projects.find(
 657 โ”‚           (project) =>
 658 โ”‚             project.environmentId === initialEnvironmentId && project.id === initialProjectId,
 659 โ”‚         ) ?? null;
 660 โ”‚
 661 โ”‚       if (directProject) {
 662 โ”‚         // Apply the route's project once. Re-applying on every change would
 663 โ”‚         // instantly revert environment/project switches made in the picker.
 664 โ”‚         const directProjectKey = `${directProject.environmentId}:${directProject.id}`;
 665 โ”‚         if (appliedInitialProjectKeyRef.current === directProjectKey) {
 666 โ”‚           return;
 667 โ”‚         }
 668 โ”‚         if (props.initialProjectRef?.branch) {
 669 โ”‚           if (
 670 โ”‚             selectedProject?.environmentId !== directProject.environmentId ||
 671 โ”‚             selectedProject.id !== directProject.id
 672 โ”‚           ) {
 673 โ”‚             setProject(directProject);
 674 โ”‚             return;
 675 โ”‚           }
 676 โ”‚           if (!flow.draftKey) return;
 677 โ”‚           // The route completes checkout before mounting this composer. Local
 678 โ”‚           // mode reuses an existing worktree; worktree mode would create another.
 679 โ”‚           updateComposerDraftSettings(flow.draftKey, {
 680 โ”‚             workspaceSelection: {
 681 โ”‚               mode: "local",
 682 โ”‚               branch: props.initialProjectRef.branch,
 683 โ”‚               worktreePath: props.initialProjectRef.worktreePath ?? null,
 684 โ”‚               startFromOrigin: false,
 685 โ”‚             },
 686 โ”‚           });
 687 โ”‚         }
 688 โ”‚         appliedInitialProjectKeyRef.current = directProjectKey;
 689 โ”‚         if (
 690 โ”‚           selectedProject?.environmentId === directProject.environmentId &&
 691 โ”‚           selectedProject.id === directProject.id
 692 โ”‚         ) {
 693 โ”‚           return;
 694 โ”‚         }
 695 โ”‚         setProject(directProject);
 696 โ”‚         return;
 697 โ”‚       }
 698 โ”‚
 699 โ”‚       if (projects.length > 0) {
 700 โ”‚         setIsReturningToProjectPicker(true);
     ยท         โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                       โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 701 โ”‚       }
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:800:5]
 741 โ”‚
 742 โ”‚   useEffect(() => {
     ยท   โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€
     ยท       โ•ฐโ”€โ”€ This is the containing effect
 743 โ”‚     const shareId = props.incomingShareId;
 744 โ”‚     const draftKey = flow.draftKey;
 745 โ”‚     const destinationProject = selectedProject;
 746 โ”‚     const initialEnvironmentId = props.initialProjectRef?.environmentId;
 747 โ”‚     const initialProjectId = props.initialProjectRef?.projectId;
 748 โ”‚     const selectedProjectMatchesRoute =
 749 โ”‚       !initialEnvironmentId ||
 750 โ”‚       !initialProjectId ||
 751 โ”‚       (destinationProject?.environmentId === initialEnvironmentId &&
 752 โ”‚         destinationProject.id === initialProjectId);
 753 โ”‚     if (
 754 โ”‚       !shareId ||
 755 โ”‚       !draftKey ||
 756 โ”‚       !destinationProject ||
 757 โ”‚       !selectedProjectMatchesRoute ||
 758 โ”‚       cancelledIncomingShareId === shareId
 759 โ”‚     ) {
 760 โ”‚       return;
 761 โ”‚     }
 762 โ”‚     const importKey = `${shareId}:${draftKey}`;
 763 โ”‚     if (
 764 โ”‚       startedShareImportKeyRef.current === importKey ||
 765 โ”‚       cancellingShareImportKeyRef.current === importKey
 766 โ”‚     ) {
 767 โ”‚       return;
 768 โ”‚     }
 769 โ”‚
 770 โ”‚     if (!incomingShare) {
 771 โ”‚       if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) {
 772 โ”‚         alertedUnavailableIncomingShareIdRef.current = shareId;
 773 โ”‚         Dialog.alert(
 774 โ”‚           "Shared content unavailable",
 775 โ”‚           "The shared content is no longer in the inbox. You can continue editing this task draft.",
 776 โ”‚         );
 777 โ”‚       }
 778 โ”‚       return;
 779 โ”‚     }
 780 โ”‚
 781 โ”‚     if (
 782 โ”‚       incomingShare.attachments.some((attachment) => attachment.type === "file") &&
 783 โ”‚       selectedEnvironmentServerConfig === null
 784 โ”‚     ) {
 785 โ”‚       return;
 786 โ”‚     }
 787 โ”‚
 788 โ”‚     if (alertedUnavailableIncomingShareIdRef.current === shareId) {
 789 โ”‚       alertedUnavailableIncomingShareIdRef.current = null;
 790 โ”‚     }
 791 โ”‚     startedShareImportKeyRef.current = importKey;
 792 โ”‚     const draftBackup =
 793 โ”‚       shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey);
 794 โ”‚     shareImportDraftBackupRef.current.set(importKey, draftBackup);
 795 โ”‚     const importToken = Symbol(importKey);
 796 โ”‚     let didReserveShare = false;
 797 โ”‚     let didConsumeShare = false;
 798 โ”‚     let needsDraftRestore = false;
 799 โ”‚     activeShareImportTokenRef.current = importToken;
 800 โ”‚     setImportingShareKey(importKey);
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ Avoid calling setState() directly within an effect
 801 โ”‚     void (async () => {
     โ•ฐโ”€โ”€โ”€โ”€
  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.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:720:5]
 719 โ”‚     props.initialProjectRef,
 720 โ”‚     props.incomingShareId,
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ Unnecessary dependency `props.incomingShareId`
 721 โ”‚     props.pendingTaskId,
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:739:5]
 738 โ”‚     loadedBranchesProjectKeyRef.current = projectKey;
 739 โ”‚     flow.loadBranches();
     ยท     โ”€โ”€โ”ฌโ”€
     ยท       โ•ฐโ”€โ”€ Missing dependency `flow`
 740 โ”‚   }, [flow.loadBranches, selectedProject]);
     ยท       โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท               โ•ฐโ”€โ”€ Overly precise dependency `flow.loadBranches`, use `flow` instead
 741 โ”‚
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  โš  react(exhaustive-effect-dependencies): Found extra effect dependencies
     โ•ญโ”€[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:962:5]
 961 โ”‚     flow.draftKey,
 962 โ”‚     hasImportedIncomingShare,
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                 โ•ฐโ”€โ”€ Unnecessary dependency `hasImportedIncomingShare`
 963 โ”‚     incomingShare,
 964 โ”‚     isIncomingShareInboxLoading,
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท                  โ•ฐโ”€โ”€ Unnecessary dependency `isIncomingShareInboxLoading`
 965 โ”‚     isIncomingShareUnavailable,
 966 โ”‚     props.incomingShareId,
 967 โ”‚     props.initialProjectRef?.environmentId,
 968 โ”‚     props.initialProjectRef?.projectId,
 969 โ”‚     releaseShareReservation,
 970 โ”‚     reserveShare,
 971 โ”‚     selectedEnvironmentServerConfig,
 972 โ”‚     selectedProject,
 973 โ”‚     shareImportAttempt,
     ยท     โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
     ยท              โ•ฐโ”€โ”€ Unnecessary dependency `shareImportAttempt`
 974 โ”‚   ]);
     โ•ฐโ”€โ”€โ”€โ”€
  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
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

Found 0 errors and 361 warnings in 5241 files (6.9s, 8 threads)
Post job cleanup.
##[start-action display=Cache full pnpm store;id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache_2]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-68ecfee7dce3960a4e095879378684d06946a297346201d9bd411a74fc6057ea, not saving cache.
##[end-action id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache_2;outcome=success;conclusion=success;duration_ms=107]
##[start-action display=Setup Vite+;id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__voidzero-dev_setup-vp]
Post job cleanup.
##[end-action id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__voidzero-dev_setup-vp;outcome=success;conclusion=success;duration_ms=68]
##[start-action display=Cache Vite+;id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key vite-plus-home-v1-Linux-X64-1.0.0, not saving cache.
##[end-action id=__dc76fdd1-1c51-4e2a-ac43-f2397a4cd527.__actions_cache;outcome=success;conclusion=success;duration_ms=66]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/f14e02d3-3a85-4f03-9b07-a6140fd406b1' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
Removing SSH command configuration
[command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
[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' || :"
fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
Warning: The process '/usr/local/bin/git' failed with exit code 128
A job completed hook has been configured by the self-hosted runner administrator
โ–ธ Run '/job_completed.sh'
shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
env:
  BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149
  BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 422
  BLACKSMITH_CHECK_RUN_ID: 119018884336
  BLACKSMITH_JOB_DISPLAY_NAME: Lint
  GITHUB_ACTIONS_CACHE_MODE: write
Docker container cache not activated, skipping hash computation.
No active SSH sessions detected. Proceeding with shutdown immediately.
Cleaning up orphan processes