GitHub check
256 KB of 607 KB loaded Download the full log (607 KB)
351 KB of earlier output not loaded
8;2;106;159;181m 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:249:9]
248 โ const latest = useRef({ rows, planners, moveThread });
249 โ latest.current = { rows, planners, moveThread };
ยท โโโโฌโโโโโโโฌโโโ
ยท โ โฐโโ Cannot update ref value during render
ยท โฐโโ This value is a ref
250 โ
โฐโโโโ
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:247:22]
246 โ const [preview, setPreview] = useState<Drag | null>(null);
247 โ const translateY = useRef(new Animated.Value(0)).current;
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
ยท โฐโโ Cannot access ref value during render
248 โ 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(purity): Cannot call impure function during render
โญโ[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16]
323 โ update(0);
324 โ let last = performance.now();
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Cannot call impure function
325 โ 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(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
โ eslint(no-unused-vars): Variable 'navigation' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/mobile/src/features/workspace/WorkspaceSidebarTabs.ios.tsx:32:9]
31 โ const tabs = [...visibleNavigationTabs(order, hidden), "settings" as const];
32 โ const navigation = useNavigation();
ยท โโโโโโฌโโโโ
ยท โฐโโ 'navigation' is declared here
33 โ const selectTab = useSelectWorkspaceTab();
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-empty-pattern): Empty object binding pattern
โญโ[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14]
465 โ
466 โ for (const {} of ["direct", "wrapper"] as const) {
ยท โโ
467 โ }
โฐโโโโ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40]
28 โ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live);
29 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
30 โ if (snapshot && snapshot !== live) setHeld({ key, snapshot });
ยท โโโโฌโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
31 โ }, [key, live, snapshot]);
โฐโโโโ
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): Variable 'navigation' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/mobile/src/features/workspace/WorkspaceSectionToolbar.tsx:23:9]
22 โ const selectTab = useSelectWorkspaceTab();
23 โ const navigation = useNavigation();
ยท โโโโโโฌโโโโ
ยท โฐโโ 'navigation' is declared here
24 โ const selected = selectedNavigationTab(
โฐโโโโ
help: Consider removing this declaration.
โ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7]
772 โ if (settingsSheetPresentation.isActive) {
773 โ settingsRoutePresentation.present(settingsRouteSession);
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ Missing dependency `settingsRoutePresentation`
774 โ }
775 โ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]);
ยท โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ
ยท โฐโโ Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead
776 โ
โฐโโโโ
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(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5]
387 โ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0;
388 โ const animatedBorderRadius = useSharedValue(targetBorderRadius);
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ `animatedBorderRadius` originates here
389 โ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android";
390 โ useLayoutEffect(() => {
391 โ animatedBorderRadius.value = shouldAnimate
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ `animatedBorderRadius` cannot be modified
392 โ ? withTiming(targetBorderRadius, {
โฐโโโโ
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(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33]
113 โ return () => cancelAnimationFrame(frame);
114 โ }, [restoreSearch, tabActive, bottomSearch]);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `bottomSearch`
115 โ const composeButton = nativeToolbarCompose ? (
โฐโโโโ
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-unstable-nested-components): Do not define components during render.
โญโ[apps/mobile/src/Stack.tsx:1049:21]
1048 โ <Navigator
1049 โ screenLayout={(props) => <GuardedScreenLayout {...props} />}
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1050 โ 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.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2189:5]
2187 โ );
2188 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
2189 โ setExpandedVideo(null);
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
2190 โ 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
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2694:9]
2685 โ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false));
2686 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
2687 โ if (!jumpToMessageId || loadedListKey !== listMountKey) return;
2688 โ const index = presentedFeed.findIndex(
2689 โ (entry) => entry.type === "message" && entry.id === jumpToMessageId,
2690 โ );
2691 โ if (index === -1) {
2692 โ const runId = messageFoldRunId(props.feed, jumpToMessageId);
2693 โ if (runId && !expandedTurnIds.has(runId)) {
2694 โ setInteractionState((current) => ({
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
2695 โ ...current,
โฐโโโโ
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:70:10]
69 โ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
70 โ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'isMarkdownFileLinkLabel' is imported here
71 โ 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:96:3]
95 โ import {
96 โ createContext,
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ 'createContext' is imported here
97 โ memo,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:112:3]
111 โ import {
112 โ ActivityIndicator,
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ 'ActivityIndicator' is imported here
113 โ Image,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:119:3]
118 โ Pressable,
119 โ ScrollView,
ยท โโโโโโฌโโโโ
ยท โฐโโ 'ScrollView' is imported here
120 โ StyleSheet,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:121:11]
120 โ StyleSheet,
121 โ Text as NativeText,
ยท โโโโโโฌโโโโ
ยท โฐโโ 'NativeText' is imported here
122 โ 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:144:10]
143 โ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
144 โ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
ยท โโโโโโโโโโฌโโโโโโโโ
ยท โฐโโ 'tryOpenExternalUrl' is imported here
145 โ 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:147:10]
146 โ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
147 โ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ 'faviconUrlForOrigin' is imported here
148 โ import {
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:161:10]
160 โ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
161 โ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'MediaVideoPlayer' is imported here
162 โ 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:165:3]
164 โ attachmentVideoPreviewSource,
165 โ mediaVideoPreviewUri,
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ 'mediaVideoPreviewUri' is imported here
166 โ mediaVideoThumbnailKey,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:166:3]
165 โ mediaVideoPreviewUri,
166 โ mediaVideoThumbnailKey,
ยท โโโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ 'mediaVideoThumbnailKey' is imported here
167 โ 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:167:8]
166 โ mediaVideoThumbnailKey,
167 โ type MediaVideoPreviewSource,
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'MediaVideoPreviewSource' is imported here
168 โ } from "../../lib/videoPreviewSource";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3]
188 โ import {
189 โ resolveMarkdownFontSizes,
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'resolveMarkdownFontSizes' is imported here
190 โ resolveNativeMarkdownTypography,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:196:3]
195 โ normalizeNativeMarkdownUrl,
196 โ resolveMarkdownInlineCodePresentation,
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
ยท โฐโโ 'resolveMarkdownInlineCodePresentation' is imported here
197 โ resolveMarkdownLinkPresentation,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:244:3]
243 โ useAssetUrl,
244 โ useAssetUrlState,
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'useAssetUrlState' is imported here
245 โ useRefreshAssetUrl,
โฐโโโโ
help: Consider removing this import.
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2191:7]
2190 โ setExpandedFile(null);
2191 โ }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
ยท โโโโโโโโโโฌโโโโโโโโโ โโโโโโโโฌโโโโโโ โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
ยท โ โ โฐโโ Unnecessary dependency `props.contentPresentation.kind`
ยท โ โฐโโ Unnecessary dependency `props.threadId`
ยท โฐโโ Unnecessary dependency `props.environmentId`
2192 โ 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:2663:7]
2662 โ reportHeaderMaterialVisibility(false);
2663 โ }, [feedThreadKey, reportHeaderMaterialVisibility]);
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ Unnecessary dependency `feedThreadKey`
2664 โ
โฐโโโโ
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:2679:7]
2678 โ }
2679 โ }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `listMountKey`
2680 โ // Opening at a message: its run unfolds, the list stops following the end
โฐโโโโ
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:2875:7]
2874 โ }
2875 โ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
ยท โโโโโโโโฌโโโโโโโ โโโโโโโโโโฌโโโโโโโโ โโโโโโโโโฌโโโโโโโ
ยท โ โ โฐโโ Unnecessary dependency `expandedWorkRows`
ยท โ โฐโโ Unnecessary dependency `expandedWorkGroups`
ยท โฐโโ Unnecessary dependency `expandedTurnIds`
2876 โ
โฐโโโโ
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:626:9]
625 โ };
626 โ }, [props.environmentId, attachment.id, httpBaseUrl]),
ยท โโโโโโโโโโฌโโโโโโโโโ โโโโโโโฌโโโโโโ โโโโโโฌโโโโโ
ยท โ โ โฐโโ Unnecessary dependency `httpBaseUrl`
ยท โ โฐโโ Unnecessary dependency `attachment.id`
ยท โฐโโ Unnecessary dependency `props.environmentId`
627 โ );
โฐโโโโ
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/keyboard/HardwareKeyboardCommandProvider.tsx:121:34]
120 โ return [...commands];
121 โ }, [activeThreadRef, pathname, registrationVersion, navigation]);
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Unnecessary dependency `registrationVersion`
122 โ
โฐโโโโ
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/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(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:38:5]
33 โ
34 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
35 โ scheduler.reset();
36 โ highlightedRowIdsRef.current = new Set();
37 โ visibleChunkIndexRef.current = 0;
38 โ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 });
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
39 โ 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:41:7]
40 โ return () => scheduler.cancel();
41 โ }, [enabled, resetKey, rows.length, scheduler]);
ยท โโโโฌโโโ โโโโโโฌโโโโโ
ยท โ โฐโโ Unnecessary dependency `rows.length`
ยท โฐโโ Unnecessary dependency `enabled`
42 โ
โฐโโโโ
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
โ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'.
โญโ[packages/provider-cursor/src/server/credentialStore.test.ts:15:7]
14 โ
15 โ const legacyCredentials = {
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ 'legacyCredentials' is declared here
16 โ version: 1 as const,
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
โญโ[packages/provider-cursor/src/server/auth.ts:249:20]
248 โ },
249 โ (effect, flow, stopSessions) =>
ยท โโโโโโโฌโโโโโ
ยท โฐโโ 'stopSessions' is declared here
250 โ effect.pipe(
โฐโโโโ
help: Consider removing this parameter.
โ 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/threads/ThreadNavigationSidebar.tsx:279:5]
277 โ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0);
278 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
279 โ setNow(new Date().toISOString());
ยท โโโโฌโโ
ยท โฐโโ Avoid calling setState() directly within an effect
280 โ 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
โ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8]
12 โ threadSearchMatchKey,
13 โ type EnvironmentThreadSearchMatch,
ยท โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโ
ยท โฐโโ 'EnvironmentThreadSearchMatch' is imported here
14 โ } from "@t3tools/client-runtime/state/thread-search";
โฐโโโโ
help: Consider removing this import.
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25]
358 โ // range) the boundary string is identical and the chain would die.
359 โ }, [nextSnoozeWakeAt, snoozeWakeTick]);
ยท โโโโโโโโฌโโโโโโ
ยท โฐโโ Unnecessary dependency `snoozeWakeTick`
360 โ 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:350:53]
349 โ if (Number.isNaN(wakeAtMs)) return;
350 โ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
ยท โโโโโโฌโโโโ
ยท โฐโโ Cannot call impure function
351 โ 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
โ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used.
โญโ[packages/provider-acp/src/server/nativeLogging.ts:22:10]
21 โ
22 โ function summarizePayload(payload: unknown): Readonly<Record<string, unknown>> {
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'summarizePayload' is declared here
23 โ if (payload === null) return { valueType: "null" };
โฐโโโโ
help: Consider removing this declaration.
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:94:5]
83 โ
84 โ const cardCoverage = props.cardCoverage;
ยท โโโโโโโฌโโโโโ
ยท โฐโโ `cardCoverage` originates here
85 โ const barHeightRef = useRef(0);
86 โ const cardHeightRef = useRef(0);
87 โ const cardHeight = useSharedValue(0);
88 โ const notifyCoverage = useCallback(() => {
89 โ if (!cardCoverage) {
90 โ return;
91 โ }
92 โ // The card resizes with the keyboard every frame, so easing each sample would leave the
93 โ // feed inset and floating controls trailing it.
94 โ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ `cardCoverage` cannot be modified
95 โ }, [cardCoverage]);
โฐโโโโ
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:106:7]
86 โ const cardHeightRef = useRef(0);
87 โ const cardHeight = useSharedValue(0);
ยท โโโโโโฌโโโโ
ยท โฐโโ `cardHeight` originates here
88 โ const notifyCoverage = useCallback(() => {
89 โ if (!cardCoverage) {
90 โ return;
91 โ }
92 โ // The card resizes with the keyboard every frame, so easing each sample would leave the
93 โ // feed inset and floating controls trailing it.
94 โ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
95 โ }, [cardCoverage]);
96 โ const handleBarLayout = useCallback(
97 โ (event: LayoutChangeEvent) => {
98 โ barHeightRef.current = event.nativeEvent.layout.height;
99 โ notifyCoverage();
100 โ },
101 โ [notifyCoverage],
102 โ );
103 โ const handleCardLayout = useCallback(
104 โ (event: LayoutChangeEvent) => {
105 โ cardHeightRef.current = event.nativeEvent.layout.height;
106 โ cardHeight.value = event.nativeEvent.layout.height;
ยท โโโโโโฌโโโโ
ยท โฐโโ `cardHeight` cannot be modified
107 โ 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:94:5]
87 โ const cardHeight = useSharedValue(0);
88 โ const notifyCoverage = useCallback(() => {
ยท โโโโฌโโโ
ยท โฐโโ This function may (indirectly) reassign or modify `cardCoverage` after render
89 โ if (!cardCoverage) {
90 โ return;
91 โ }
92 โ // The card resizes with the keyboard every frame, so easing each sample would leave the
93 โ // feed inset and floating controls trailing it.
94 โ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ This modifies `cardCoverage`
95 โ }, [cardCoverage]);
โฐโโโโ
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:94:5]
93 โ // feed inset and floating controls trailing it.
94 โ cardCoverage.value = Math.max(0, cardHeightRef.current - barHeightRef.current);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ This modifies `cardCoverage`
95 โ }, [cardCoverage]);
96 โ const handleBarLayout = useCallback(
97 โ (event: LayoutChangeEvent) => {
ยท โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ This function may (indirectly) reassign or modify `cardCoverage` after render
98 โ 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:106:7]
103 โ const handleCardLayout = useCallback(
104 โ (event: LayoutChangeEvent) => {
ยท โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ This function may (indirectly) reassign or modify `cardHeight` after render
105 โ cardHeightRef.current = event.nativeEvent.layout.height;
106 โ cardHeight.value = event.nativeEvent.layout.height;
ยท โโโโโโฌโโโโ
ยท โฐโโ This modifies `cardHeight`
107 โ 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(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/review/ReviewSheet.tsx:454:7]
453 โ showAuxiliaryPane("inspector");
454 โ }, [environmentId, showAuxiliaryPane, threadId]);
ยท โโโโโโโฌโโโโโโ โโโโโฌโโโ
ยท โ โฐโโ Unnecessary dependency `threadId`
ยท โฐโโ Unnecessary dependency `environmentId`
455 โ 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:725:20]
492 โ // same check.
493 โ const NativeReviewDiffView = resolveNativeReviewDiffView();
ยท โโโโโโโโโโโโโโฌโโโโโโโโโโโโโ
ยท โฐโโ The component is created during render here
494 โ const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
495 โ const showcasedReviewDrawRef = useRef<string | null>(null);
496 โ const [isPullRefreshing, setIsPullRefreshing] = useState(false);
497 โ const handlePullToRefresh = async () => {
498 โ setIsPullRefreshing(true);
499 โ await refreshSelectedSection();
500 โ setIsPullRefreshing(false);
501 โ };
502 โ const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
503 โ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
504 โ const fileVisibility = useReviewFileVisibility({
505 โ threadKey: reviewCache.threadKey,
506 โ sectionId: selectedSection?.id ?? null,
507 โ files: reviewFiles,
508 โ cachedExpandedFileIds: selectedSection?.id
509 โ ? reviewCache.expandedFileIdsBySection[selectedSection.id]
510 โ : undefined,
511 โ cachedViewedFileIds: selectedSection?.id
512 โ ? reviewCache.viewedFileIdsBySection[selectedSection.id]
513 โ : undefined,
514 โ });
515 โ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
516 โ const commentSelection = useReviewCommentSelectionController({
517 โ environmentId,
518 โ threadId,
519 โ selectedSection,
520 โ nativeReviewDiffData,
521 โ });
522 โ const nativeBridge = useNativeReviewDiffBridge({
523 โ threadKey: reviewCache.threadKey,
524 โ sectionId: selectedSection?.id ?? null,
525 โ diff: selectedSection?.diff,
526 โ data: nativeReviewDiffData,
527 โ collapsedFileIds,
528 โ viewedFileIds,
529 โ selectedRowIds: commentSelection.selectedRowIds,
530 โ canHighlight: parsedDiff.kind === "files",
531 โ });
532 โ const showcaseReviewKey =
533 โ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
534 โ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
535 โ : null;
536 โ const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
537 โ nativeBridge.onDebug(event);
538 โ if (
539 โ showcaseReviewKey === null ||
540 โ showcasedReviewDrawRef.current === showcaseReviewKey ||
541 โ !isNativeReviewDiffDrawEvent(event.nativeEvent)
542 โ ) {
543 โ return;
544 โ }
545 โ showcasedReviewDrawRef.current = showcaseReviewKey;
546 โ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
547 โ };
548 โ
549 โ const handleSelectFile = async (fileId: string | null) => {
550 โ loadVisibleFile(fileId, true);
551 โ commentSelection.clearSelection();
552 โ if (fileId !== null && collapsedFileIds.includes(fileId)) {
553 โ toggleExpandedFile(fileId);
554 โ }
555 โ const nativeView = nativeReviewDiffViewRef.current;
556 โ if (!nativeView) return;
557 โ const result = await settlePromise(() =>
558 โ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
559 โ );
560 โ if (AsyncResult.isFailure(result)) {
561 โ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
562 โ }
563 โ };
564 โ const handleVisibleFileChange = (
565 โ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
566 โ ) => {
567 โ loadVisibleFile(event.nativeEvent.fileId ?? null);
568 โ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
569 โ };
570 โ const renderInspector = () => (
571 โ <ReviewFileNavigator
572 โ ref={reviewFileNavigatorRef}
573 โ files={nativeReviewDiffData.files}
574 โ headerInset={insets.top}
575 โ sectionId={selectedSection?.id ?? null}
576 โ onSelectFile={(fileId) => void handleSelectFile(fileId)}
577 โ />
578 โ );
579 โ
580 โ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
581 โ const { fileId } = event.nativeEvent;
582 โ if (fileId) {
583 โ loadVisibleFile(fileId, true);
584 โ toggleExpandedFile(fileId);
585 โ }
586 โ };
587 โ
588 โ const handleNativeToggleViewedFile = (
589 โ event: NativeSyntheticEvent<{ readonly fileId?: string }>,
590 โ ) => {
591 โ const { fileId } = event.nativeEvent;
592 โ if (fileId) {
593 โ toggleViewedFile(fileId);
594 โ }
595 โ };
596 โ
597 โ const parsedDiffNotice =
598 โ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
599 โ const hasCachedSelectedDiff = selectedSection?.diff != null;
600 โ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
601 โ const sectionMenu = buildReviewSectionMenu(reviewSections);
602 โ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
603 โ hasEnvironmentPresentation: environment.isReady,
604 โ isEnvironmentConnected: isEnvironmentReady,
605 โ hasCachedSelectedDiff,
606 โ hasAnyCachedDiff,
607 โ });
608 โ const handleRetryEnvironment = () => {
609 โ void retryEnvironment(environmentId);
610 โ };
611 โ const handleReturnToThread = () => {
612 โ if (navigation.canGoBack()) {
613 โ navigation.goBack();
614 โ return;
615 โ }
616 โ navigation.navigate("Thread", {
617 โ environmentId: String(environmentId),
618 โ threadId: String(threadId),
619 โ });
620 โ };
621 โ const androidHeaderSubtitle = [
622 โ selectedSection?.title,
623 โ headerDiffSummary.additions,
624 โ headerDiffSummary.deletions,
625 โ ]
626 โ .filter((part): part is string => Boolean(part))
627 โ .join(" ยท ");
628 โ
629 โ const showChangedFilesPane =
630 โ !showConnectionNotice &&
631 โ selectedSection !== null &&
632 โ parsedDiff.kind === "files" &&
633 โ NativeReviewDiffView !== null;
634 โ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
635 โ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
636 โ
637 โ const listHeader = (() => {
638 โ const children: ReactElement[] = [];
639 โ
640 โ if (error) {
641 โ children.push(
642 โ <View
643 โ key="review-error"
644 โ className={cn(
645 โ "bg-card px-4 py-3",
646 โ Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
647 โ )}
648 โ >
649 โ <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
650 โ <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
651 โ </View>,
652 โ );
653 โ }
654 โ
655 โ if (parsedDiffNotice) {
656 โ children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
657 โ }
658 โ
659 โ if (children.length === 0) {
660 โ return null;
661 โ }
662 โ
663 โ return <>{children}</>;
664 โ })();
665 โ const headerSubtitle = [
666 โ headerDiffSummary.additions,
667 โ headerDiffSummary.deletions,
668 โ pendingReviewCommentCount > 0
669 โ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
670 โ : null,
671 โ ]
672 โ .filter(Boolean)
673 โ .join(" ยท ");
674 โ const headerTitleText = selectedSection?.title ?? "Review changes";
675 โ
676 โ return (
677 โ <>
678 โ <ReviewHeader
679 โ environmentId={environmentId}
680 โ threadId={threadId}
681 โ title={headerTitleText}
682 โ subtitle={headerSubtitle}
683 โ androidSubtitle={androidHeaderSubtitle}
684 โ iconColor={headerIcon}
685 โ selectedThreadCwd={selectedThreadCwd}
686 โ sectionMenu={sectionMenu}
687 โ selectedSection={selectedSection}
688 โ showSectionToolbar={showSectionToolbar}
689 โ showChangedFilesToggle={showChangedFilesToggle}
690 โ onRefresh={handlePullToRefresh}
691 โ onSelectSection={selectSection}
692 โ onReturnToThread={handleReturnToThread}
693 โ />
694 โ
695 โ <ScreenContent>
696 โ <View className="flex-1 bg-sheet android:bg-sheet-solid">
697 โ {showConnectionNotice ? (
698 โ <View className="flex-1" style={{ paddingTop: topContentInset }}>
699 โ <EnvironmentConnectionNotice
700 โ environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
701 โ connection={
702 โ environment.presentation?.connection ?? {
703 โ phase: "available",
704 โ error: null,
705 โ traceId: null,
706 โ }
707 โ }
708 โ resourceName="review"
709 โ onRetry={handleRetryEnvironment}
710 โ />
711 โ </View>
712 โ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
713 โ <View
714 โ className="flex-1"
715 โ style={{
716 โ backgroundColor: nativeBridge.theme.background,
717 โ }}
718 โ >
719 โ <View
720 โ className="min-w-0 flex-1"
721 โ style={listHeader ? { paddingTop: topContentInset } : undefined}
722 โ >
723 โ {listHeader}
724 โ <View className="min-w-0 flex-1" collapsable={false}>
725 โ <NativeReviewDiffView
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ This component is created during render
726 โ 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
โ eslint(require-yield): This generator function does not have `yield`
โญโ[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78]
80 โ
81 โ โญโโถ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* (
82 โ โ options: AcpMcpOverAcpBridgeOptions,
83 โ โ ): Effect.fn.Return<AcpMcpOverAcpBridge> {
84 โ โ const fetchImplementation = options.fetchImplementation ?? fetch;
85 โ โ const connections = new Map<string, Connection>();
86 โ โ
87 โ โ const connectionFor = (connectionId: string): Effect.Effect<Connection, AcpMcpOverAcpError> =>
88 โ โ Effect.suspend(() => {
89 โ โ const connection = connections.get(connectionId);
90 โ โ return connection === undefined
91 โ โ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`))
92 โ โ : Effect.succeed(connection);
93 โ โ });
94 โ โ
95 โ โ const send = (
96 โ โ connection: Connection,
97 โ โ message: unknown,
98 โ โ ): Effect.Effect<ReadonlyArray<unknown>, AcpMcpOverAcpError> =>
99 โ โ connection.mutex.withPermits(1)(
100 โ โ Effect.gen(function* () {
101 โ โ const body = JSON.stringify(message);
102 โ โ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) {
103 โ โ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB."));
104 โ โ }
105 โ โ const response = yield* Effect.tryPromise({
106 โ โ try: (signal) =>
107 โ โ fetchImplementation(options.endpoint, {
108 โ โ method: "POST",
109 โ โ signal,
110 โ โ headers: {
111 โ โ "content-type": "application/json",
112 โ โ accept: "application/json, text/event-stream",
113 โ โ authorization: options.authorization,
114 โ โ ...(connection.sessionId === null
115 โ โ ? {}
116 โ โ : { "mcp-session-id": connection.sessionId }),
117 โ โ ...(connection.protocolVersion === null
118 โ โ ? {}
119 โ โ : { "mcp-protocol-version": connection.protocolVersion }),
120 โ โ },
121 โ โ body,
122 โ โ }),
123 โ โ catch: bridgeError,
124 โ โ });
125 โ โ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId;
126 โ โ if (!response.ok) {
127 โ โ yield* Effect.promise(
128 โ โ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
129 โ โ );
130 โ โ return yield* Effect.fail(
131 โ โ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`),
132 โ โ );
133 โ โ }
134 โ โ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))];
135 โ โ for (const payload of payloads) {
136 โ โ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion;
137 โ โ }
138 โ โ return payloads;
139 โ โ }).pipe(Effect.mapError(bridgeError)),
140 โ โ );
141 โ โ
142 โ โ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* (
143 โ โ request: AcpSchema.DisconnectMcpRequest,
144 โ โ ): Effect.fn.Return<AcpSchema.DisconnectMcpResponse, AcpMcpOverAcpError> {
145 โ โ const connection = yield* connectionFor(request.connectionId);
146 โ โ connections.delete(request.connectionId);
147 โ โ const sessionId = connection.sessionId;
148 โ โ if (sessionId !== null) {
149 โ โ const response = yield* Effect.tryPromise({
150 โ โ try: (signal) =>
151 โ โ fetchImplementation(options.endpoint, {
152 โ โ method: "DELETE",
153 โ โ signal,
154 โ โ headers: {
155 โ โ authorization: options.authorization,
156 โ โ "mcp-session-id": sessionId,
157 โ โ ...(connection.protocolVersion === null
158 โ โ ? {}
159 โ โ : { "mcp-protocol-version": connection.protocolVersion }),
160 โ โ },
161 โ โ }),
162 โ โ catch: bridgeError,
163 โ โ });
164 โ โ if (!response.ok && response.status !== 404) {
165 โ โ return yield* Effect.fail(
166 โ โ new AcpMcpOverAcpError(
167 โ โ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`,
168 โ โ ),
169 โ โ );
170 โ โ }
171 โ โ yield* Effect.promise(
172 โ โ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
173 โ โ );
174 โ โ }
175 โ โ return {};
176 โ โ });
177 โ โ
178 โ โ return {
179 โ โ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) {
180 โ โ if (request.serverId !== "t3-code") {
181 โ โ return yield* Effect.fail(
182 โ โ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`),
183 โ โ );
184 โ โ }
185 โ โ if (connections.size >= MAX_CONNECTIONS) {
186 โ โ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections."));
187 โ โ }
188 โ โ const connectionId = yield* options.allocateConnectionId;
189 โ โ connections.set(connectionId, {
190 โ โ mutex: yield* Semaphore.make(1),
191 โ โ sessionId: null,
192 โ โ protocolVersion: null,
193 โ โ nextRequestId: 0,
194 โ โ });
195 โ โ return { connectionId };
196 โ โ }),
197 โ โ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) {
198 โ โ const connection = yield* connectionFor(request.connectionId);
199 โ โ const id = ++connection.nextRequestId;
200 โ โ const payloads = yield* send(connection, {
201 โ โ jsonrpc: "2.0",
202 โ โ id,
203 โ โ method: request.method,
204 โ โ ...(request.params == null ? {} : { params: request.params }),
205 โ โ });
206 โ โ const response = payloads.find((payload) => asEnvelope(payload)?.id === id);
207 โ โ const envelope = asEnvelope(response);
208 โ โ if (envelope === null) {
209 โ โ return yield* Effect.fail(
210 โ โ new AcpMcpOverAcpError("MCP server did not return a matching response."),
211 โ โ );
212 โ โ }
213 โ โ if (envelope.error !== undefined) {
214 โ โ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error)));
215 โ โ }
216 โ โ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse;
217 โ โ }),
218 โ โ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) {
219 โ โ const connection = yield* connectionFor(request.connectionId);
220 โ โ yield* send(connection, {
221 โ โ jsonrpc: "2.0",
222 โ โ method: request.method,
223 โ โ ...(request.params == null ? {} : { params: request.params }),
224 โ โ });
225 โ โ }),
226 โ โ disconnect,
227 โ โ dispose: Effect.suspend(() =>
228 โ โ Effect.forEach(
229 โ โ [...connections.keys()],
230 โ โ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore),
231 โ โ { discard: true },
232 โ โ ),
233 โ โ ),
234 โ โ };
235 โ โฐโโถ });
โฐโโโโ
help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed.
โ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used.
โญโ[infra/relay/src/http/Api.ts:69:13]
68 โ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts";
69 โ import * as HookForwarder from "../hooks/HookForwarder.ts";
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ 'HookForwarder' is imported here
70 โ import * as HeldHooks from "../hooks/HeldHooks.ts";
โฐโโโโ
help: Consider removing this import.
โ 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
โ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used.
โญโ[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10]
1397 โ
1398 โ function assertUserMessagesExclude(
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ 'assertUserMessagesExclude' is declared here
1399 โ projection: OrchestrationV2ThreadProjection,
โฐโโโโ
help: Consider removing this declaration.
โ 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.
โญโ[packages/client-runtime/src/rpc/client.test.ts:131:9]
130 โ ) {
131 โ โญโโถ for (let attempt = 0; attempt < 100; attempt += 1) {
132 โ โ if (subscriptions.length >= count) {
133 โ โ return;
134 โ โ }
135 โ โ yield* Effect.yieldNow;
136 โ โฐโโถ }
137 โ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`));
โฐโโโโ
โ 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.
โญโ[packages/client-runtime/src/rpc/client.test.ts:252:7]
251 โ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient)));
252 โ โญโโถ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) {
253 โ โ yield* Effect.yieldNow;
254 โ โฐโโถ }
255 โ yield* SubscriptionRef.set(activeSession, Option.none());
โฐโโโโ
โ 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.
โญโ[packages/client-runtime/src/rpc/client.test.ts:258:7]
257 โ
258 โ โญโโถ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
259 โ โ yield* Effect.yieldNow;
260 โ โฐโโถ }
261 โ yield* Fiber.interrupt(subscriptionFiber);
โฐโโโโ
โ 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.
โญโ[packages/client-runtime/src/rpc/client.test.ts:322:7]
321 โ );
322 โ โญโโถ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) {
323 โ โ yield* Effect.yieldNow;
324 โ โฐโโถ }
325 โ
โฐโโโโ
โ 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.
โญโ[packages/client-runtime/src/rpc/client.test.ts:330:7]
329 โ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient)));
330 โ โญโโถ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
331 โ โ yield* Effect.yieldNow;
332 โ โฐโโถ }
333 โ yield* Fiber.interrupt(subscriptionFiber);
โฐโโโโ
โ 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.
โญโ[packages/client-runtime/src/rpc/session.test.ts:226:3]
225 โ ) {
226 โ โญโโถ for (let attempt = 0; attempt < 100; attempt += 1) {
227 โ โ const socket = sockets[index];
228 โ โ if (socket) {
229 โ โ return socket;
230 โ โ }
231 โ โ yield* Effect.yieldNow;
232 โ โฐโโถ }
233 โ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket."));
โฐโโโโ
โ 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.
โญโ[packages/client-runtime/src/rpc/session.test.ts:240:3]
239 โ ) {
240 โ โญโโถ for (let attempt = 0; attempt < 100; attempt += 1) {
241 โ โ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index];
242 โ โ if (request) {
243 โ โ return request;
244 โ โ }
245 โ โ yield* Effect.yieldNow;
246 โ โฐโโถ }
247 โ return yield* Effect.die(new Error("Expected the RPC protocol to send a request."));
โฐโโโโ
โ 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(prefer-array-find): Prefer `find` over filtering and accessing the first result.
โญโ[packages/client-runtime/src/operations/projects.ts:238:51]
237 โ ): string {
238 โ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? "";
ยท โโโโโโ
239 โ return target.owner ? `${target.owner}/${folderName}` : folderName;
โฐโโโโ
help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[scripts/lib/cli-external-packages.test.ts:114:11]
113 โ const declared = {
114 โ ...(manifest.dependencies ?? {}),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
115 โ ...(manifest.optionalDependencies ?? {}),
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[scripts/lib/cli-external-packages.test.ts:115:11]
114 โ ...(manifest.dependencies ?? {}),
115 โ ...(manifest.optionalDependencies ?? {}),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
116 โ ...(manifest.peerDependencies ?? {}),
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[scripts/lib/cli-external-packages.test.ts:116:11]
115 โ ...(manifest.optionalDependencies ?? {}),
116 โ ...(manifest.peerDependencies ?? {}),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
117 โ };
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used.
โญโ[apps/server/src/checkpointing/Utils.ts:12:10]
11 โ
12 โ function resolveThreadWorkspaceCwd(input: {
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ 'resolveThreadWorkspaceCwd' is declared here
13 โ readonly thread: {
โฐโโโโ
help: Consider removing this declaration.
โ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/effect-codex-app-server/src/schema.test.ts:50:18]
49 โ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) {
50 โ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true);
ยท โโโโโโโโโ
51 โ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true);
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/effect-codex-app-server/src/schema.test.ts:51:18]
50 โ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true);
51 โ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true);
ยท โโโโโโโโโ
52 โ }
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/effect-codex-app-server/src/schema.test.ts:55:5]
54 โ assert.equal(
55 โ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"),
ยท โโโโโโโโโ
56 โ true,
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/effect-codex-app-server/src/schema.test.ts:59:5]
58 โ assert.equal(
59 โ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"),
ยท โโโโโโโโโ
60 โ true,
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/effect-codex-app-server/src/schema.test.ts:103:16]
102 โ
103 โ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true);
ยท โโโโโโโโโ
104 โ });
โฐโโโโ
โ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used.
โญโ[packages/client-runtime/src/work-log/presentation.ts:237:10]
236 โ
237 โ function nonEmptyString(value: unknown): string | null {
ยท โโโโโโโโฌโโโโโโ
ยท โฐโโ 'nonEmptyString' is declared here
238 โ return typeof value === "string" && value.trim().length > 0 ? value : null;
โฐโโโโ
help: Consider removing this declaration.
โ react(purity): Cannot call impure function during render
โญโ[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47]
371 โ const { open, onOpenChange, onSnooze, timestampFormat } = props;
372 โ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : [];
ยท โโโโโโฌโโโโ
ยท โฐโโ Cannot call impure function
373 โ return (
โฐโโโโ
help: `Date` 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(purity): Cannot call impure function during render
โญโ[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39]
852 โ if (snoozeGateClock.thread !== thread) {
853 โ setSnoozeGateClock({ thread, now: new Date().toISOString() });
ยท โโโโโโฌโโโโ
ยท โฐโโ Cannot call impure function
854 โ }
โฐโโโโ
help: `Date` 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
โ 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.
โ eslint(no-empty-pattern): Empty object binding pattern
โญโ[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14]
52 โ
53 โ for (const {} of [
ยท โโ
54 โ { healthy: true },
โฐโโโโ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
โ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used.
โญโ[apps/server/src/ws.ts:10:13]
9 โ import * as Effect from "effect/Effect";
10 โ import * as Fiber from "effect/Fiber";
ยท โโโฌโโ
ยท โฐโโ 'Fiber' is imported here
11 โ import * as FileSystem from "effect/FileSystem";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used.
โญโ[apps/server/src/ws.ts:17:13]
16 โ import * as Ref from "effect/Ref";
17 โ import * as Schedule from "effect/Schedule";
ยท โโโโโฌโโโ
ยท โฐโโ 'Schedule' is imported here
18 โ import * as Schema from "effect/Schema";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/ws.ts:1292:13]
1291 โ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources;
1292 โ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner;
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'projectSetupScriptRunner' is declared here
1293 โ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker;
โฐโโโโ
help: Consider removing this declaration.
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[apps/web/src/lib/announce.browser.test.ts:41:46]
40 โ
41 โ expect(regionTexts()).toEqual([...first].reverse());
ยท โโโโโโโ
42 โ expect(regionTexts()).toContain("Claude");
โฐโโโโ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
โ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
โญโ[packages/provider-opencode/src/server/adapter.ts:3755:7]
3754 โ
3755 โ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, OpenCodeAdapterV2DriverEnv> =
ยท โโโฌโโ
ยท โฐโโ 'layer' is declared here
3756 โ Layer.effect(
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Parameter '_' is declared but never used.
โญโ[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70]
554 โ assert.deepStrictEqual(
555 โ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest),
ยท โฌ
ยท โฐโโ '_' is declared here
556 โ [
โฐโโโโ
help: Consider removing this parameter.
โ eslint(no-unused-vars): Parameter '_' is declared but never used.
โญโ[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70]
1154 โ assert.deepStrictEqual(
1155 โ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest),
ยท โฌ
ยท โฐโโ '_' is declared here
1156 โ [
โฐโโโโ
help: Consider removing this parameter.
โ 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/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7]
565 โ let afterSequence = created[0]!.sequence;
566 โ โญโโถ for (let index = 1; index <= 32; index += 1) {
567 โ โ const nextEvent = {
568 โ โ id: EventId.make(`event:foundation-stream-race:${index}`),
569 โ โ type: "thread.metadata-updated" as const,
570 โ โ threadId,
571 โ โ providerInstanceId,
572 โ โ occurredAt: now,
573 โ โ payload: { ...thread, title: `Race update ${index}` },
574 โ โ } satisfies OrchestrationV2DomainEvent;
575 โ โ const reader = yield* eventSink
576 โ โ .stream({ threadId, afterSequence })
577 โ โ .pipe(Stream.runHead, Effect.forkChild);
578 โ โ yield* Effect.yieldNow;
579 โ โ const written = yield* eventSink.write({ events: [nextEvent] });
580 โ โ const received = yield* Fiber.join(reader);
581 โ โ if (Option.isNone(received)) {
582 โ โ return yield* Effect.die("The event stream ended before delivering the live event.");
583 โ โ }
584 โ โ assert.equal(received.value.sequence, written[0]?.sequence);
585 โ โ assert.equal(received.value.event.id, nextEvent.id);
586 โ โ afterSequence = received.value.sequence;
587 โ โฐโโถ }
588 โ }),
โฐโโโโ
โ 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/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9]
2326 โ let settled = false;
2327 โ โญโโถ while (!settled) {
2328 โ โ settled = (yield* outbox.listByCommandId(commandId)).every(
2329 โ โ (effect) => effect.status === "succeeded",
2330 โ โ );
2331 โ โ if (!settled) yield* Effect.yieldNow;
2332 โ โฐโโถ }
2333 โ }).pipe(Effect.provide(layerWorker), Effect.scoped);
โฐโโโโ
โ eslint(no-unused-vars): Identifier 'Duration' is imported but never used.
โญโ[packages/provider-pi/src/server/adapter.test.ts:24:13]
23 โ import * as Deferred from "effect/Deferred";
24 โ import * as Duration from "effect/Duration";
ยท โโโโโฌโโโ
ยท โฐโโ 'Duration' is imported here
25 โ import * as Effect from "effect/Effect";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/orchestration-v2/Orchestrator.ts:12468:7]
12467 โ
12468 โ const layerUnavailable: Layer.Layer<OrchestratorV2> = Layer.succeed(
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'layerUnavailable' is declared here
12469 โ OrchestratorV2,
โฐโโโโ
help: Consider removing this declaration.
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[apps/web/src/lib/composerContextReferences.ts:90:40]
89 โ let cursor = prompt.length;
90 โ for (const occurrence of occurrences.reverse()) {
ยท โโโโโโโ
91 โ let { start, end } = occurrence;
โฐโโโโ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
โ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10691:7]
10690 โ
10691 โ const layer: Layer.Layer<
ยท โโโฌโโ
ยท โฐโโ 'layer' is declared here
10692 โ ProviderAdapter.ProviderAdapterV2,
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7]
1443 โ
1444 โ const layerCodexAppServerClientFactoryCommand = (
ยท โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโ
ยท โฐโโ 'layerCodexAppServerClientFactoryCommand' is declared here
1445 โ options: CodexClient.CodexAppServerClientOptions & {
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7]
1679 โ
1680 โ const layer: Layer.Layer<
ยท โโโฌโโ
ยท โฐโโ 'layer' is declared here
1681 โ ProviderAdapter.ProviderAdapterV2,
โฐโโโโ
help: Consider removing this declaration.
โ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
โญโ[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:2144:15]
2143 โ assert.equal(
2144 โ items.filter((item) => item.type === "assistant_message").at(-1)?.text,
ยท โโโโโโ
2145 โ "authoritative answer",
โฐโโโโ
help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
โ 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/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:4246:7]
4245 โ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped);
4246 โ โญโโถ while (!responseLifecycle.includes("failed")) {
4247 โ โ yield* Effect.yieldNow;
4248 โ โฐโโถ }
4249 โ const responseExit = yield* Fiber.join(responseFiber);
โฐโโโโ
โ 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/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6357:9]
6356 โ .pipe(Effect.forkScoped);
6357 โ โญโโถ while (promptGates.length < 1) {
6358 โ โ yield* Effect.yieldNow;
6359 โ โฐโโถ }
6360 โ assert.isDefined(sessionUpdateHandler, "session update handler must be wired");
โฐโโโโ
โ 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/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6492:9]
6491 โ .pipe(Effect.forkScoped);
6492 โ โญโโถ while (promptGates.length < 2) {
6493 โ โ yield* Effect.yieldNow;
6494 โ โฐโโถ }
6495 โ if (sessionUpdateHandler === undefined || capturedMutation.current === null) {
โฐโโโโ
โ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining
โญโ[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1850:8]
1849 โ assert.equal(
1850 โ (stored.context?.records[0] as { attachmentId: string }).attachmentId,
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโ
1851 โ stored.attachments[0]?.id,
โฐโโโโ
help: If this short-circuits with 'undefined' the evaluation will throw TypeError
โ t3code(no-inline-schema-compile): Hoist Schema.encodeUnknownSync(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
โญโ[packages/contracts/src/composerContext.test.ts:181:18]
180 โ it("sends a message without the records the wire cannot carry", () => {
181 โ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({
ยท โโโโโโโโโโโโโโโโโโโโโโโโ
182 โ version: 1,
โฐโโโโ
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:124:7]
119 โ
120 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
121 โ if (orientationSettled) return;
122 โ const orientation = getNativeShowcaseOrientation();
123 โ if (orientation === null) {
124 โ setOrientationSettled(true);
ยท โโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
125 โ 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/showcase/ShowcaseCaptureCoordinator.tsx:300:7]
288 โ
289 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
290 โ if (
291 โ scene === null ||
292 โ requestedScene === null ||
293 โ scene !== requestedScene ||
294 โ !hasFixture ||
295 โ !orientationSettled ||
296 โ !themeApplied ||
297 โ (scene === "agent-activity" && !agentActivityStaged) ||
298 โ !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
299 โ ) {
300 โ setReadyScene(null);
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
301 โ 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
โ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:129:9]
128 โ let cancelled = false;
129 โ let lastOutcome: string | null = null;
ยท โโโโโโฌโโโโโ
ยท โฐโโ 'lastOutcome' is declared here
130 โ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used.
โญโ[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10]
959 โ
960 โ function layerClaudeAgentSdkReplayQueryRunner(
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ
ยท โฐโโ 'layerClaudeAgentSdkReplayQueryRunner' is declared here
961 โ transcript: ClaudeAgentSdkReplayTranscript,
โฐโโโโ
help: Consider removing this declaration.
โ t3code(no-inline-schema-compile): Hoist Schema.encodeUnknownSync(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
โญโ[packages/contracts/src/baseSchemas.test.ts:39:9]
38 โ JSON.stringify(
39 โ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([
ยท โโโโโโโโโโโโโโโโโโโโโโโโ
40 โ { name: "a" },
โฐโโโโ
โ 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/connection/ConnectionsNewRouteScreen.tsx:82:5]
79 โ
80 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
81 โ const { host, code } = parsePairingUrl(connectionPairingUrl);
82 โ setHostInput(host);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
83 โ 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:92:5]
85 โ
86 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
87 โ if (routePairingUrl.length === 0) {
88 โ return;
89 โ }
90 โ
91 โ const { host, code } = parsePairingUrl(routePairingUrl);
92 โ setHostInput(host);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
93 โ 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:98:7]
95 โ
96 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
97 โ if (pairingConnectionError) {
98 โ setIsSubmitting(false);
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
99 โ }
โฐโโโโ
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 'openSettings' is imported but never used.
โญโ[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:35:10]
34 โ import { splitEnvironmentSections } from "./environmentSections";
35 โ import { openSettings } from "../settings/settings-navigation";
ยท โโโโโโโฌโโโโโ
ยท โฐโโ 'openSettings' is imported here
36 โ import { leaveSettingsPage } from "../settings/settings-navigation";
โฐโโโโ
help: Consider removing this import.
โ unicorn(require-module-specifiers): Empty import specifier is not allowed
โญโ[packages/contracts/src/rpc.ts:297:8]
296 โ } from "./device.ts";
297 โ import {} from "./previewAutomation.ts";
ยท โโ
298 โ import {
โฐโโโโ
help: Remove empty braces
โ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/contracts/src/auth.test.ts:17:12]
16 โ it("decodes legacy review credentials without offering them in new grants", () => {
17 โ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([
ยท โโโโโโโโโโโโโโโโโโโโโโโโ
18 โ "review:write",
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/contracts/src/auth.test.ts:20:18]
19 โ ]);
20 โ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow();
ยท โโโโโโโโโโโโโโโโโโโโโโโโ
21 โ expect(AuthStandardClientScopes).not.toContain("review:write");
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/contracts/src/auth.test.ts:58:21]
57 โ it("ignores unknown response permissions without falling back to broader scopes", () => {
58 โ const session = Schema.decodeUnknownSync(AuthSessionState)({
ยท โโโโโโโโโโโโโโโโโโโโโโโโ
59 โ authenticated: true,
โฐโโโโ
โ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used.
โญโ[apps/web/src/lib/terminalContext.ts:56:10]
55 โ
56 โ function normalizeTerminalContextSelection(
ยท โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ
ยท โฐโโ 'normalizeTerminalContextSelection' is declared here
57 โ selection: TerminalContextSelection,
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:410:7]
409 โ
410 โ const layer = Layer.effect(ThreadPullRequestServiceV2, make);
ยท โโโฌโโ
ยท โฐโโ 'layer' is declared here
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7]
345 โ
346 โ const layerFromProviderAdapter: Layer.Layer<
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'layerFromProviderAdapter' is declared here
347 โ ProviderAdapterRegistryV2,
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
60 โ ) {
61 โ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ 'useDragRegion' is declared here
62 โ const isInline = props.mode === "inline";
โฐโโโโ
help: Consider removing this declaration.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
638 โ
639 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
640 โ if (pendingLaunchEntry.key === launchTargetKey) {
641 โ return;
642 โ }
643 โ setPendingLaunchEntry({
ยท โโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
644 โ key: launchTargetKey,
โฐโโโโ
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/terminal/ThreadTerminalRouteScreen.tsx:653:5]
648 โ
649 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
650 โ if (initialAttachGridEntry.key === launchTargetKey) {
651 โ return;
652 โ }
653 โ setInitialAttachGridEntry({
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
654 โ key: launchTargetKey,
โฐโโโโ
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/terminal/ThreadTerminalRouteScreen.tsx:746:7]
743 โ
744 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
745 โ if (!routeEnvironmentId || !routeThreadId) {
746 โ setLastGridSize({
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
747 โ cols: DEFAULT_TERMINAL_COLS,
โฐโโโโ
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/terminal/ThreadTerminalRouteScreen.tsx:538:24]
537 โ });
538 โ }, [terminal.buffer, terminal.buffer.length, terminalKey]);
ยท โโโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
539 โ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
โฐโโโโ
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/terminal/ThreadTerminalRouteScreen.tsx:709:7]
708 โ sentInitialInputKeyRef.current = null;
709 โ }, [terminalKey]);
ยท โโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `terminalKey`
710 โ
โฐโโโโ
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/terminal/ThreadTerminalRouteScreen.tsx:800:52]
799 โ };
800 โ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ โโโโโโฌโโโโโ
ยท โ โฐโโ Unnecessary dependency `terminalKey`
ยท โฐโโ Unnecessary dependency `terminal.lifecycleVersion`
801 โ
โฐโโโโ
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(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
792 โ }
793 โ const pasteSession = pasteSessionRef.current;
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Cannot access ref value during render
794 โ
โฐโโโโ
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(static-components): Cannot create components during render
โญโ[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
196 โ const { onInput, onResize } = props;
197 โ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
ยท โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ The component is created during render here
198 โ const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
199 โ
200 โ useEffect(() => {
201 โ terminalDebugLog("native:surface", {
202 โ terminalKey: props.terminalKey,
203 โ native: hasNativeSurface,
204 โ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
205 โ bufferLen: props.buffer.length,
206 โ isRunning: props.isRunning,
207 โ });
208 โ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
209 โ const handleNativeInput = useCallback(
210 โ (event: NativeSyntheticEvent<TerminalInputEvent>) => {
211 โ if (!props.isRunning || props.readOnly) {
212 โ return;
213 โ }
214 โ terminalDebugLog("native:onInput", {
215 โ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
216 โ });
217 โ onInput(event.nativeEvent.data);
218 โ },
219 โ [onInput, props.isRunning, props.readOnly],
220 โ );
221 โ const handleNativeResize = useCallback(
222 โ (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
223 โ onResize({
224 โ cols: event.nativeEvent.cols,
225 โ rows: event.nativeEvent.rows,
226 โ });
227 โ },
228 โ [onResize],
229 โ );
230 โ
231 โ if (NativeTerminalSurfaceView) {
232 โ return (
233 โ <View style={props.style}>
234 โ <NativeTerminalSurfaceView
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ This component is created during render
235 โ appearanceScheme={themeAppearance}
โฐโโโโ
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
โ 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.
โญโ[packages/client-runtime/src/connection/supervisor.test.ts:135:3]
134 โ let lastState = yield* SubscriptionRef.get(state);
135 โ โญโโถ for (let iteration = 0; iteration < 100; iteration += 1) {
136 โ โ lastState = yield* SubscriptionRef.get(state);
137 โ โ if (predicate(lastState)) {
138 โ โ return lastState;
139 โ โ }
140 โ โ yield* Effect.yieldNow;
141 โ โฐโโถ }
142 โ return yield* Effect.die(
โฐโโโโ
โ 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/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
520 โ })).delivery;
521 โ โญโโถ while (delivery.outcome === "accepted") {
522 โ โ yield* Effect.yieldNow;
523 โ โ delivery = (yield* service.getWebhookDelivery({
524 โ โ id: task.id,
525 โ โ deliveryId: deliveryId!,
526 โ โ })).delivery;
527 โ โฐโโถ }
528 โ assert.equal(delivery.outcome, "dispatch_failed");
โฐโโโโ
โ 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
โ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used.
โญโ[apps/server/src/scheduledTasks/Schedule.ts:79:10]
78 โ
79 โ function describeSchedule(schedule: ScheduledTaskSchedule): string {
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'describeSchedule' is declared here
80 โ if (schedule.type === "webhook") return "On webhook";
โฐโโโโ
help: Consider removing this declaration.
โ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
โญโ[apps/web/src/components/settings/SettingInheritance.tsx:163:24]
162 โ keys,
163 โ overridingProjects = [],
ยท โโ
164 โ onClearOverrides,
โฐโโโโ
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
โ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/usage/UsageService.ts:169:7]
168 โ
169 โ const layerTest = Layer.succeed(
ยท โโโโโฌโโโโ
ยท โฐโโ 'layerTest' is declared here
170 โ UsageService,
โฐโโโโ
help: Consider removing this declaration.
โ 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/server/src/usage/UsageService.test.ts:2615:7]
2614 โ let orphanedAt: number | undefined;
2615 โ โญโโถ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) {
2616 โ โ const tasks: Array<() => void> = [];
2617 โ โ const dispatcher: Scheduler.SchedulerDispatcher = {
2618 โ โ scheduleTask: (task) => tasks.push(task),
2619 โ โ flush: () => {
2620 โ โ let task: (() => void) | undefined;
2621 โ โ while ((task = tasks.shift()) !== undefined) task();
2622 โ โ },
2623 โ โ };
2624 โ โ
2625 โ โ let requestFiber: Fiber.Fiber<unknown, unknown> | undefined;
2626 โ โ let requestChecks = 0;
2627 โ โ const scheduler: Scheduler.Scheduler = {
2628 โ โ executionMode: "async",
2629 โ โ makeDispatcher: () => dispatcher,
2630 โ โ shouldYield: (fiber) => {
2631 โ โ if (fiber !== requestFiber) return false;
2632 โ โ requestChecks += 1;
2633 โ โ if (requestChecks !== interruptAt) return false;
2634 โ โ fiber.interruptUnsafe();
2635 โ โ return true;
2636 โ โ },
2637 โ โ };
2638 โ โ
2639 โ โ const input: UsageSummaryInput = {
2640 โ โ ...WINDOW,
2641 โ โ sinceDay: UsageDay.make("2026-09-01"),
2642 โ โ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`),
2643 โ โ };
2644 โ โ const first = yield* service
2645 โ โ .readSummary(input)
2646 โ โ .pipe(
2647 โ โ Effect.exit,
2648 โ โ Effect.provideService(Scheduler.Scheduler, scheduler),
2649 โ โ Effect.forkChild,
2650 โ โ );
2651 โ โ requestFiber = first;
2652 โ โ yield* Effect.yieldNow;
2653 โ โ dispatcher.flush();
2654 โ โ
2655 โ โ const second = yield* service.readSummary(input).pipe(
2656 โ โ Effect.match({
2657 โ โ onFailure: (error) => error.reason,
2658 โ โ onSuccess: () => "success" as const,
2659 โ โ }),
2660 โ โ Effect.provideService(Scheduler.Scheduler, scheduler),
2661 โ โ Effect.forkChild,
2662 โ โ );
2663 โ โ yield* Effect.yieldNow;
2664 โ โ dispatcher.flush();
2665 โ โ const secondExit = second.pollUnsafe();
2666 โ โ if (secondExit === undefined) {
2667 โ โ second.interruptUnsafe();
2668 โ โ orphanedAt = interruptAt;
2669 โ โ break;
2670 โ โ }
2671 โ โ if (Exit.isFailure(secondExit)) {
2672 โ โ assert.fail("the matching request fiber was interrupted");
2673 โ โ }
2674 โ โ assert.strictEqual(secondExit.value, "invalidWindow");
2675 โ โฐโโถ }
2676 โ
โฐโโโโ
โ eslint(no-unused-vars): Identifier 'identity' is imported but never used.
โญโ[apps/server/src/auth/http.ts:28:10]
27 โ import * as Schema from "effect/Schema";
28 โ import { identity } from "effect/Function";
ยท โโโโโฌโโโ
ยท โฐโโ 'identity' is imported here
29 โ import * as Layer from "effect/Layer";
โฐโโโโ
help: Consider removing this import.
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[apps/mobile/src/lib/markdownDocument.ts:259:28]
258 โ visit(parser.parse(markdown), false, false);
259 โ for (const edit of edits.reverse())
ยท โโโโโโโ
260 โ 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:290:28]
289 โ visit(parser.parse(markdown));
290 โ for (const edit of edits.reverse())
ยท โโโโโโโ
291 โ 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:344:38]
343 โ visit(parser.parse(markdown));
344 โ for (const lineStart of lineStarts.reverse()) {
ยท โโโโโโโ
345 โ // 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.
โ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[apps/server/src/auth/RpcAuthorization.ts:237:17]
236 โ const requiredScopesForSettingsUpdate = (payload: unknown) => {
237 โ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload);
ยท โโโโโโโโโโโโโโโโโโโโโโโโ
238 โ const scopes = requiredScopesForServerSettingsPatch(input.patch);
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[apps/server/src/auth/RpcAuthorization.ts:256:26]
255 โ if (method === WS_METHODS.assetsCreateUrl) {
256 โ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload);
ยท โโโโโโโโโโโโโโโโโโโโโโโโ
257 โ return [
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/effect-acp/src/schema.test.ts:18:12]
17 โ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } };
18 โ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true);
ยท โโโโโโโโโ
19 โ expect(
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/effect-acp/src/schema.test.ts:20:7]
19 โ expect(
20 โ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }),
ยท โโโโโโโโโ
21 โ ).toBe(true);
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
โญโ[packages/effect-acp/src/errors.test.ts:129:28]
128 โ const secret = "acp-summary-secret";
129 โ const cause = yield* Schema.decodeUnknownEffect(
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโ
130 โ Schema.Struct({
โฐโโโโ
โ react(purity): Cannot call impure function during render
โญโ[apps/web/src/hooks/useThreadActions.ts:821:56]
820 โ const resolved = resolveThreadTarget(target);
821 โ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) {
ยท โโโโโโฌโโโโ
ยท โฐโโ Cannot call impure function
822 โ return AsyncResult.failure(
โฐโโโโ
help: `Date` 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(purity): Cannot call impure function during render
โญโ[apps/web/src/hooks/useThreadActions.ts:709:46]
708 โ const wokeAt = resolved
709 โ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() })
ยท โโโโโโฌโโโโ
ยท โฐโโ Cannot call impure function
710 โ : null;
โฐโโโโ
help: `Date` 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(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/state/use-thread-outbox-drain.ts:1321:5]
1320 โ queuedMessagesByThreadKey,
1321 โ retryTick,
ยท โโโโโฌโโโโ
ยท โฐโโ Unnecessary dependency `retryTick`
1322 โ 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
โ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts.
โญโ[apps/web/src/components/device/deviceHubApi.test.ts:12:14]
11 โ addEventListener(_type: string, listener: (event: { data: string }) => void) {
12 โ this.onmessage = listener;
ยท โโโโโโโโโ
13 โ }
โฐโโโโ
help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on<event>` replaces any previously registered handler.
โ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
โญโ[apps/web/src/components/device/deviceHubApi.test.ts:16:9]
15 โ constructor() {
16 โ source = this;
ยท โโโโโโ
17 โ }
โฐโโโโ
help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well.
โ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
โญโ[apps/web/src/components/pullRequest/pullRequestList.logic.ts:262:9]
261 โ ): boolean {
262 โ const labels = entry.labels.map((label) => label.name.trim().toLowerCase());
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
263 โ const holds = (label: string) => labels.includes(label.trim().toLowerCase());
โฐโโโโ
help: Switch to `Set`
โ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
โญโ[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19]
472 โ onFilters,
473 โ authorOptions = [],
ยท โโ
474 โ labelOptions = [],
โฐโโโโ
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
โ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
โญโ[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18]
473 โ authorOptions = [],
474 โ labelOptions = [],
ยท โโ
475 โ optionScope,
โฐโโโโ
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17]
817 โ <div
818 โ key={`${index}:${check.name}:${check.url ?? ""}`}
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
819 โ className="group flex items-center gap-2 rounded-md pr-1 hover:bg-accent/60"
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ 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.
โ 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
โ 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.
โ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
โญโ[packages/effect-acp/src/protocol.test.ts:500:31]
499 โ
500 โ const response = yield* Schema.decodeUnknownEffect(
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโ
501 โ Schema.fromJsonString(JsonRpcErrorResponse),
โฐโโโโ
โ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/effect-acp/src/client.ts:1270:11]
1269 โ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
1270 โ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโ
1271 โ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
โฐโโโโ
โ 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/server/src/background/HostPowerMonitor.test.ts:133:11]
132 โ const monitor = yield* HostPowerMonitor.HostPowerMonitor;
133 โ โญโโถ for (
134 โ โ let attempt = 0;
135 โ โ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true";
136 โ โ attempt += 1
137 โ โ ) {
138 โ โ yield* Effect.yieldNow;
139 โ โฐโโถ }
140 โ expect((yield* monitor.snapshot).onBattery).toBe("true");
โฐโโโโ
โ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used.
โญโ[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13]
24 โ import * as Schema from "effect/Schema";
25 โ import * as HostProcess from "@t3tools/shared/HostProcess";
ยท โโโโโโฌโโโโโ
ยท โฐโโ 'HostProcess' is imported here
26 โ
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11]
123 โ const path = yield* Path.Path;
124 โ const serverConfig = yield* ServerConfig.ServerConfig;
ยท โโโโโโโฌโโโโโ
ยท โฐโโ 'serverConfig' is declared here
125 โ const serverSettings = yield* ServerSettings.ServerSettingsService;
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11]
124 โ const serverConfig = yield* ServerConfig.ServerConfig;
125 โ const serverSettings = yield* ServerSettings.ServerSettingsService;
ยท โโโโโโโโฌโโโโโโ
ยท โฐโโ 'serverSettings' is declared here
126 โ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService;
โฐโโโโ
help: Consider removing this declaration.
โ unicorn(require-module-specifiers): Empty import specifier is not allowed
โญโ[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13]
14 โ } from "@t3tools/contracts";
15 โ import type {} from "@t3tools/contracts";
ยท โโ
16 โ
โฐโโโโ
help: Remove empty braces
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15]
87 โ <li
88 โ key={`${index}:${check.name}`}
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
89 โ className="col-span-full grid grid-cols-subgrid items-center text-xs"
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
โญโ[apps/web/src/components/chat/useComposerSend.ts:985:13]
984 โ const changedBeforeDecline = draftChangedSinceSend();
985 โ โญโโถ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map(
986 โ โ (approval) => approval.requestId,
987 โ โฐโโถ );
988 โ const approvalResponding = approvalsToDecline.some((approval) =>
โฐโโโโ
help: Switch to `Set`
โ react(purity): Cannot call impure function during render
โญโ[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58]
177 โ if (snoozeClockState.shell !== activeThreadShell) {
178 โ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() });
ยท โโโโโโฌโโโโ
ยท โฐโโ Cannot call impure function
179 โ }
โฐโโโโ
help: `Date` 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
Found 0 errors and 372 warnings in 5486 files (5.4s, 8 threads)
Post job cleanup.
Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
Post job cleanup.
##[start-action display=Cache full pnpm store;id=__01727676-7712-41d5-a60c-7d4efac6413b.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fe33cf74552d68b43bd4929ad8f74b63f776b4470e2e3533f781441d5e4f188c, not saving cache.
##[end-action id=__01727676-7712-41d5-a60c-7d4efac6413b.__actions_cache;outcome=success;conclusion=success;duration_ms=95]
##[start-action display=Cache Vite+;id=__01727676-7712-41d5-a60c-7d4efac6413b.vp_cache]
Post job cleanup.
Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache.
##[end-action id=__01727676-7712-41d5-a60c-7d4efac6413b.vp_cache;outcome=success;conclusion=success;duration_ms=63]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/d3c5d3f5-cd08-48d6-b2ba-81a53a59ceb1' 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: 216
BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 361
BLACKSMITH_CHECK_RUN_ID: 121035433332
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