GitHub check
256 KB of 613 KB loaded Download the full log (613 KB)
357 KB of earlier output not loaded
5Z 131 β measuredWidthRef.current = width;
132 β capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
Β· βββββββ¬βββββ
Β· β°ββ `capsuleWidth` cannot be modified
133 β };
β°ββββ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): This value cannot be modified
ββ[apps/mobile/src/features/threads/floating-working-control.tsx:139:7]
122 β // Animate an in-flow sizer for native glass layout. Measure labels at fixed width to avoid repeated animation retargeting.
123 β const capsuleWidth = useSharedValue<number | null>(null);
Β· βββββββ¬βββββ
Β· β°ββ `capsuleWidth` originates here
124 β const measuredWidthRef = useRef<number | null>(null);
125 β const handleLabelLayout = (event: LayoutChangeEvent) => {
126 β const width = event.nativeEvent.layout.width;
127 β if (width === measuredWidthRef.current) {
128 β return;
129 β }
130 β const first = measuredWidthRef.current === null;
131 β measuredWidthRef.current = width;
132 β capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
133 β };
134 β const hasStatus = props.status !== null;
135 β const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
136 β useEffect(() => {
137 β if (!hasStatus) {
138 β measuredWidthRef.current = null;
139 β capsuleWidth.value = null;
Β· βββββββ¬βββββ
Β· β°ββ `capsuleWidth` cannot be modified
140 β }
β°ββββ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): Cannot modify local variables after render completes
ββ[apps/mobile/src/features/threads/floating-working-control.tsx:139:7]
135 β const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
136 β useEffect(() => {
Β· ββββ¬βββ
Β· β°ββ This function may (indirectly) reassign or modify `capsuleWidth` after render
137 β if (!hasStatus) {
138 β measuredWidthRef.current = null;
139 β capsuleWidth.value = null;
Β· βββββββ¬βββββ
Β· β°ββ This modifies `capsuleWidth`
140 β }
β°ββββ
help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): Cannot modify local variables after render completes
ββ[apps/mobile/src/features/threads/floating-working-control.tsx:132:5]
124 β const measuredWidthRef = useRef<number | null>(null);
125 β const handleLabelLayout = (event: LayoutChangeEvent) => {
Β· ββββββββββββββββ¬βββββββββββββββ
Β· β°ββ This function may (indirectly) reassign or modify `capsuleWidth` after render
126 β const width = event.nativeEvent.layout.width;
127 β if (width === measuredWidthRef.current) {
128 β return;
129 β }
130 β const first = measuredWidthRef.current === null;
131 β measuredWidthRef.current = width;
132 β capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
Β· βββββββ¬βββββ
Β· β°ββ This modifies `capsuleWidth`
133 β };
β°ββββ
help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(capitalized-calls): Capitalized function called without JSX
ββ[apps/mobile/src/features/threads/ThreadQueueControl.tsx:606:27]
605 β const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success));
606 β const gesture = Gesture.Pan()
Β· ββ¬β
Β· β°ββ `Pan` may be a component
607 β .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(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/state/use-thread-outbox-drain.ts:1362:5]
1361 β queuedMessagesByThreadKey,
1362 β retryTick,
Β· βββββ¬ββββ
Β· β°ββ Unnecessary dependency `retryTick`
1363 β 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
β eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
ββ[packages/provider-grok/src/server/adapter.ts:411:7]
410 β
411 β const layer: Layer.Layer<
Β· βββ¬ββ
Β· β°ββ 'layer' is declared here
412 β ProviderAdapter.ProviderAdapterV2,
β°ββββ
help: Consider removing this declaration.
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/threads/new-task-flow-provider.tsx:433:5]
423 β : null;
424 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
425 β if (
426 β props.active === false ||
427 β activeDraftKey !== null ||
428 β editingPendingTask !== null ||
429 β selectedProject === null
430 β ) {
431 β return;
432 β }
433 β setActiveDraftKey(
Β· βββββββββ¬ββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
434 β createNewTaskDraft({
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
ββ[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1214:36]
1213 β <ActiveNewTaskContext value={activeNewTask}>
1214 β <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>
Β· βββββββββββββ
1215 β </ActiveNewTaskContext>
β°ββββ
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
β react(no-array-index-key): Usage of Array index in keys is not allowed
ββ[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:84:15]
83 β <li
84 β key={`${index}:${check.name}`}
Β· ββββββββββββββββββββββββββββββ
85 β className="col-span-full grid grid-cols-subgrid items-center text-xs"
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
ββ[packages/client-runtime/src/state/usageAccess.ts:3:8]
2 β AuthDiagnosticsReadScope,
3 β type AuthSessionState,
Β· βββββββββ¬βββββββ
Β· β°ββ 'AuthSessionState' is imported here
4 β sessionGrantsScope,
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used.
ββ[packages/provider-grok/src/server/xaiAcpExtension.ts:1558:10]
1557 β
1558 β function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean {
Β· βββββββββββββββββββ¬ββββββββββββββββββ
Β· β°ββ 'promptResponseHasMissingXAiStopReason' is declared here
1559 β const meta = response._meta;
β°ββββ
help: Consider removing this declaration.
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:410:5]
408 β
409 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
410 β setInspectorSelection((current) => {
Β· βββββββββββ¬ββββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
411 β if (props.renderInspector === undefined) {
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(no-unstable-nested-components): Do not define components during render.
ββ[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:538:24]
537 β const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
538 β βββΆ const GitInspector = () => (
539 β β <GitOverviewSheet
540 β β headerInset={inspectorHeaderInset}
541 β β presentation="inspector"
542 β β route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
543 β β />
544 β β°ββΆ );
545 β const FilesInspector = () =>
β°ββββ
help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
β react(no-unstable-nested-components): Do not define components during render.
ββ[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:545:26]
544 β );
545 β βββΆ const FilesInspector = () =>
546 β β selectedThread !== null && selectedThreadCwd !== null ? (
547 β β <ThreadFileNavigatorPane
548 β β cwd={selectedThreadCwd}
549 β β environmentId={selectedThread.environmentId}
550 β β headerInset={inspectorHeaderInset}
551 β β projectName={selectedThreadProject?.title ?? "Files"}
552 β β selectedPath={null}
553 β β onSelectFile={handleSelectInspectorFile}
554 β β />
555 β β°ββΆ ) : null;
556 β const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
β°ββββ
help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
β 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/state/threads-sync.test.ts:1742:7]
1741 β yield* harness.replaceSession;
1742 β βββΆ for (let attempt = 0; attempt < 100; attempt += 1) {
1743 β β if ((yield* Ref.get(harness.subscriptionCount)) >= 2) {
1744 β β break;
1745 β β }
1746 β β yield* Effect.yieldNow;
1747 β β°ββΆ }
1748 β yield* Queue.offer(
β°ββββ
β 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/state/threads-sync.test.ts:1851:7]
1850 β yield* harness.replaceSession;
1851 β βββΆ for (let attempt = 0; attempt < 100; attempt += 1) {
1852 β β if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break;
1853 β β yield* Effect.yieldNow;
1854 β β°ββΆ }
1855 β expect(yield* Ref.get(harness.subscriptionCount)).toBe(2);
β°ββββ
β eslint(no-unused-vars): Type 'ScheduledTaskDraft' is imported but never used.
ββ[apps/mobile/src/features/settings/scheduled-task-editor.tsx:10:8]
9 β hasScheduledTaskDraftChanges,
10 β type ScheduledTaskDraft,
Β· ββββββββββ¬ββββββββ
Β· β°ββ 'ScheduledTaskDraft' is imported here
11 β } from "./scheduledTaskDraft";
β°ββββ
help: Consider removing this import.
β react(memo-dependencies): Found extra memoization dependencies
ββ[apps/mobile/src/features/settings/scheduled-task-editor.tsx:81:85]
80 β const startEditor = startScheduledTaskEditor;
81 β const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]);
Β· ββββββ¬βββββ
Β· β°ββ Unnecessary dependency `startEditor`
82 β const readEditor = useCallback(
β°ββββ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(memo-dependencies): Found extra memoization dependencies
ββ[apps/mobile/src/features/settings/scheduled-task-editor.tsx:102:7]
101 β setEditor,
102 β startEditor,
Β· ββββββ¬βββββ
Β· β°ββ Unnecessary dependency `startEditor`
103 β hasChanges,
β°ββββ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/state/use-vcs-action-state.ts:85:5]
82 β const [nowMs, setNowMs] = useState(() => Date.now());
83 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
84 β if (!actionState.isRunning) return;
85 β setNowMs(Date.now());
Β· βββββ¬βββ
Β· β°ββ Avoid calling setState() directly within an effect
86 β const interval = setInterval(() => setNowMs(Date.now()), 1000);
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/state/thread-order.ts:28:7]
27 β getPendingThreadOrder();
28 β }, [nowMinute, snoozeWakeTick]);
Β· βββββ¬ββββ ββββββββ¬ββββββ
Β· β β°ββ Unnecessary dependency `snoozeWakeTick`
Β· β°ββ Unnecessary dependency `nowMinute`
29 β return pending;
β°ββββ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:2221:5]
2219 β );
2220 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
2221 β setExpandedVideo(null);
Β· βββββββββ¬βββββββ
Β· β°ββ Avoid calling setState() directly within an effect
2222 β 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:2714:9]
2705 β const stopFollowingEnd = useEffectEvent(() => setEndFollow(false));
2706 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
2707 β if (!jumpToMessageId || loadedListKey !== listMountKey) return;
2708 β const index = presentedFeed.findIndex(
2709 β (entry) => entry.type === "message" && entry.id === jumpToMessageId,
2710 β );
2711 β if (index === -1) {
2712 β const runId = messageFoldRunId(props.feed, jumpToMessageId);
2713 β if (runId && !expandedTurnIds.has(runId)) {
2714 β setInteractionState((current) => ({
Β· ββββββββββ¬βββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
2715 β ...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:72:10]
71 β import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
72 β import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
Β· ββββββββββββ¬βββββββββββ
Β· β°ββ 'isMarkdownFileLinkLabel' is imported here
73 β 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:98:3]
97 β import {
98 β createContext,
Β· βββββββ¬ββββββ
Β· β°ββ 'createContext' is imported here
99 β memo,
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:114:3]
113 β import {
114 β ActivityIndicator,
Β· βββββββββ¬ββββββββ
Β· β°ββ 'ActivityIndicator' is imported here
115 β Image,
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:121:3]
120 β Pressable,
121 β ScrollView,
Β· ββββββ¬ββββ
Β· β°ββ 'ScrollView' is imported here
122 β StyleSheet,
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:123:11]
122 β StyleSheet,
123 β Text as NativeText,
Β· ββββββ¬ββββ
Β· β°ββ 'NativeText' is imported here
124 β 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:146:10]
145 β import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
146 β import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
Β· ββββββββββ¬ββββββββ
Β· β°ββ 'tryOpenExternalUrl' is imported here
147 β 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:149:10]
148 β import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
149 β import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
Β· ββββββββββ¬βββββββββ
Β· β°ββ 'faviconUrlForOrigin' is imported here
150 β import {
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:163:10]
162 β import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
163 β import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
Β· βββββββββ¬βββββββ
Β· β°ββ 'MediaVideoPlayer' is imported here
164 β 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:167:3]
166 β attachmentVideoPreviewSource,
167 β mediaVideoPreviewUri,
Β· βββββββββββ¬βββββββββ
Β· β°ββ 'mediaVideoPreviewUri' is imported here
168 β mediaVideoThumbnailKey,
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:168:3]
167 β mediaVideoPreviewUri,
168 β mediaVideoThumbnailKey,
Β· ββββββββββββ¬ββββββββββ
Β· β°ββ 'mediaVideoThumbnailKey' is imported here
169 β 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:169:8]
168 β mediaVideoThumbnailKey,
169 β type MediaVideoPreviewSource,
Β· ββββββββββββ¬βββββββββββ
Β· β°ββ 'MediaVideoPreviewSource' is imported here
170 β } 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:191:3]
190 β import {
191 β resolveMarkdownFontSizes,
Β· βββββββββββββ¬βββββββββββ
Β· β°ββ 'resolveMarkdownFontSizes' is imported here
192 β resolveNativeMarkdownTypography,
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:198:3]
197 β normalizeNativeMarkdownUrl,
198 β resolveMarkdownInlineCodePresentation,
Β· βββββββββββββββββββ¬ββββββββββββββββββ
Β· β°ββ 'resolveMarkdownInlineCodePresentation' is imported here
199 β resolveMarkdownLinkPresentation,
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Type 'PendingThreadFeedEntry' is imported but never used.
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:237:8]
236 β isCompactionCommandFeedEntry,
237 β type PendingThreadFeedEntry,
Β· ββββββββββββ¬ββββββββββ
Β· β°ββ 'PendingThreadFeedEntry' is imported here
238 β type ThreadFeedRow,
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:248:3]
247 β useAssetUrl,
248 β useAssetUrlState,
Β· βββββββββ¬βββββββ
Β· β°ββ 'useAssetUrlState' is imported here
249 β useRefreshAssetUrl,
β°ββββ
help: Consider removing this import.
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/threads/ThreadFeed.tsx:2223:7]
2222 β setExpandedFile(null);
2223 β }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
Β· ββββββββββ¬βββββββββ ββββββββ¬ββββββ ββββββββββββββββ¬ββββββββββββββ
Β· β β β°ββ Unnecessary dependency `props.contentPresentation.kind`
Β· β β°ββ Unnecessary dependency `props.threadId`
Β· β°ββ Unnecessary dependency `props.environmentId`
2224 β 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:2683:7]
2682 β reportHeaderMaterialVisibility(false);
2683 β }, [feedThreadKey, reportHeaderMaterialVisibility]);
Β· βββββββ¬ββββββ
Β· β°ββ Unnecessary dependency `feedThreadKey`
2684 β
β°ββββ
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:2699:7]
2698 β }
2699 β }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
Β· βββββββ¬βββββ
Β· β°ββ Unnecessary dependency `listMountKey`
2700 β // 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:2893:7]
2892 β }
2893 β }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
Β· ββββββββ¬βββββββ ββββββββββ¬ββββββββ βββββββββ¬βββββββ
Β· β β β°ββ Unnecessary dependency `expandedWorkRows`
Β· β β°ββ Unnecessary dependency `expandedWorkGroups`
Β· β°ββ Unnecessary dependency `expandedTurnIds`
2894 β
β°ββββ
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
β eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
ββ[packages/client-runtime/src/state/filesystem.ts:3:8]
2 β AuthFilesystemReadScope,
3 β type AuthSessionState,
Β· βββββββββ¬βββββββ
Β· β°ββ 'AuthSessionState' is imported here
4 β type FilesystemBrowseEntry,
β°ββββ
help: Consider removing this import.
β eslint(no-control-regex): Unexpected control character
ββ[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46]
219 β <Text selectable className="font-mono text-sm text-foreground">
220 β {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")}
Β· βββ¬β
Β· β°ββ 'U+001B' is a control character.
221 β </Text>
β°ββββ
help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression.
β eslint(no-unused-vars): Identifier 'Arr' is imported but never used.
ββ[packages/client-runtime/src/state/threadSort.ts:4:13]
3 β import type { EnvironmentThreadShell } from "./models.ts";
4 β import * as Arr from "effect/Array";
Β· ββ¬β
Β· β°ββ 'Arr' is imported here
5 β import * as Order from "effect/Order";
β°ββββ
help: Consider removing this import.
β eslint(no-unused-vars): Identifier 'Order' is imported but never used.
ββ[packages/client-runtime/src/state/threadSort.ts:5:13]
4 β import * as Arr from "effect/Array";
5 β import * as Order from "effect/Order";
Β· βββ¬ββ
Β· β°ββ 'Order' is imported here
6 β
β°ββββ
help: Consider removing this import.
β 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(exhaustive-effect-dependencies): Found missing/extra effect dependencies
ββ[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7]
248 β mountedRef.current = false;
249 β flow.setBranchQuery("");
Β· βββ¬β
Β· β°ββ Missing dependency `flow`
250 β };
251 β }, [flow.setBranchQuery]);
Β· ββββββββββ¬βββββββββ
Β· β°ββ Overly precise dependency `flow.setBranchQuery`, use `flow` instead
252 β
β°ββββ
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
β unicorn(require-module-specifiers): Empty import specifier is not allowed
ββ[packages/contracts/src/rpc.ts:302:8]
301 β } from "./device.ts";
302 β import {} from "./previewAutomation.ts";
Β· ββ
303 β import {
β°ββββ
help: Remove empty braces
β 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-low-value-comments): Cut this to 4 lines or fewer: keep the constraint, drop the background.
ββ[packages/contracts/src/orchestrationV2.ts:746:1]
745 β
746 β βββΆ /**
747 β β * Wire-only. Set for clients that opted in with `acceptDedupedBodies` or `dedupeBodies=1` when the
748 β β * marked field was blanked because the client already holds the same value: in the record it
749 β β * received earlier on the same response or stream. Restore with
750 β β * `@t3tools/shared/orchestrationV2DedupedBodies` before use; never store or forward a marked
751 β β * value. Clients that opted in restore only these fields, so blanking another field needs a new
752 β β * opt-in.
753 β β°ββΆ */
754 β const DedupedBodyMarker = Schema.optionalKey(Schema.Literal(true));
β°ββββ
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5]
37 β const [initialized, setInitialized] = useState(false);
38 β useLayoutEffect(() => {
Β· ββββββββ¬βββββββ
Β· β°ββ This is the containing effect
39 β reset();
40 β setInitialized(true);
Β· ββββββββ¬ββββββ
Β· β°ββ Avoid calling setState() directly within an effect
41 β }, [reset]);
β°ββββ
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/NewTaskDraftRouteScreen.tsx:93:5]
88 β
89 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
90 β if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
91 β const branchName = initialProjectRef.branch;
92 β let active = true;
93 β setPendingCheckouts((count) => count + 1);
Β· ββββββββββ¬βββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
94 β // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/home/thread-swipe-actions.tsx:472:27]
471 β >
472 β {props.children(close)}
Β· βββ¬ββ
Β· β°ββ Cannot access ref value during render
473 β </ReanimatedSwipeable>
β°ββββ
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
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:222:5]
221 β let idlePasses = 0;
222 β βββΆ for (;;) {
223 β β yield* Effect.promise(() => Promise.resolve());
224 β β const pending = backgroundRuntime.pending.shift();
225 β β if (!pending) {
226 β β idlePasses++;
227 β β if (idlePasses >= 3) {
228 β β return;
229 β β }
230 β β continue;
231 β β }
232 β β idlePasses = 0;
233 β β const exit = yield* Effect.exit(
234 β β pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
235 β β );
236 β β yield* Effect.sync(() => {
237 β β pending.resolve(exit);
238 β β });
239 β β°ββΆ }
240 β },
β°ββββ
β eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used.
ββ[apps/mobile/src/features/home/HomeScreen.tsx:14:8]
13 β threadSearchMatchKey,
14 β type EnvironmentThreadSearchMatch,
Β· βββββββββββββββ¬βββββββββββββ
Β· β°ββ 'EnvironmentThreadSearchMatch' is imported here
15 β } from "@t3tools/client-runtime/state/thread-search";
β°ββββ
help: Consider removing this import.
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/home/HomeScreen.tsx:484:25]
483 β // snoozeWakeTick re-arms clamped timers even when the wake date exceeds 32-bit setTimeout and stays unchanged.
484 β }, [nextSnoozeWakeAt, snoozeWakeTick]);
Β· ββββββββ¬ββββββ
Β· β°ββ Unnecessary dependency `snoozeWakeTick`
485 β // Called as `props.onSelectThread(...)`, the compiler would cache this handler on the whole
β°ββββ
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:1062:21]
1061 β <Navigator
1062 β screenLayout={(props) => <GuardedScreenLayout {...props} />}
Β· βββββββββββββββββββββββββββββββββββββββββββββ
1063 β 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/files/FileTreeBrowser.tsx:155:5]
150 β
151 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
152 β if (!controlledSelectedPath) {
153 β return;
154 β }
155 β setExpandedPaths((current) => {
Β· βββββββββ¬βββββββ
Β· β°ββ Avoid calling setState() directly within an effect
156 β const ancestors = ancestorPaths(controlledSelectedPath);
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:388:7]
383 β };
384 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
385 β if (!guidesEnabled && section === "guide") {
386 β requestedSection.current = "overview";
387 β currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
388 β setSection("overview");
Β· ββββββ¬ββββ
Β· β°ββ Avoid calling setState() directly within an effect
389 β }
β°ββββ
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 missing effect dependencies
ββ[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:390:6]
385 β if (!guidesEnabled && section === "guide") {
386 β requestedSection.current = "overview";
Β· βββββββββ¬βββββββ
Β· β°ββ Missing dependency `requestedSection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
387 β currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
Β· ββββββββββ¬βββββββββ βββββββ¬ββββββ
Β· β β°ββ Missing dependency `scrollOffsets`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
Β· β°ββ Missing dependency `currentScrollOffset`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
388 β setSection("overview");
389 β }
390 β }, [guidesEnabled, section, insets.top]);
Β· βββββββββββββββββββ¬βββββββββββββββββ
Β· β°ββ This dependency list is missing values used by the callback
391 β const tabContent = activityContent;
β°ββββ
help: Missing dependencies can cause an effect to fire less often than it should
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β typescript(no-extraneous-class): Unexpected class with only a constructor.
ββ[apps/desktop/src/preview/Manager.test.ts:150:18]
149 β BrowserWindow: browserWindowConstructor,
150 β βββΆ ClipboardItem: class {
151 β β constructor(data: Record<string, unknown>) {
152 β β clipboardItemConstructor(data);
153 β β }
154 β β°ββΆ },
155 β clipboard: {
β°ββββ
help: Try replacing this class with a standalone function or deleting it entirely
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
256 β return () => cancelAnimationFrame(frame);
257 β }, [props.path, targetIndex]);
Β· ββββββ¬ββββ
Β· β°ββ Unnecessary dependency `props.path`
258 β
β°ββββ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(no-array-index-key): Usage of Array index in keys is not allowed
ββ[apps/mobile/src/features/files/SourceFileSurface.tsx:289:23]
288 β <SourceText
289 β key={`${index}:${tokenIndex}`}
Β· ββββββββββββββββββββββββββββββ
290 β style={{
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β react(no-array-index-key): Usage of Array index in keys is not allowed
ββ[apps/mobile/src/features/files/SourceFileSurface.tsx:305:27]
304 β return (
305 β <SourceText key={index}>
Β· βββββββββββ
306 β {body}
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:266:35]
265 β };
266 β }, [method, nativeRef, payload, resetKey, onFailure, onDelivered]);
Β· βββββ¬βββ
Β· β°ββ Unnecessary dependency `resetKey`
267 β }
β°ββββ
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/diffs/nativeReviewDiffSurface.ts:390:39]
389 β
390 β βββΆ return createElement(RawNativeView, {
391 β β ...nativeProps,
392 β β refreshEnabled: props.onPullToRefresh !== undefined,
393 β β onDebug: (event) => {
394 β β if (event.nativeEvent.message === "rows-decode-failed") {
395 β β console.error("[native-review-diff] rows decode failed", event.nativeEvent.error);
396 β β onRowsFailure();
397 β β }
398 β β onDebug?.(event);
399 β β },
400 β β ref: nativeRef,
401 β βββΆ });
Β· β°ββββ Passing a ref to a function may read its value during render
402 β }
β°ββββ
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
β 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:339:38]
338 β visit(parser.parse(markdown));
339 β for (const lineStart of lineStarts.reverse()) {
Β· βββββββ
340 β // Lazy headers can lack container markers; copy the delimiter's markers to the header and blank line.
β°ββββ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
β 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.
β 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
β eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used.
ββ[apps/web/src/components/chat/ChatHeader.tsx:27:10]
26 β import { threadEnvironment } from "../../state/threads";
27 β import { serverEnvironment } from "../../state/server";
Β· βββββββββ¬ββββββββ
Β· β°ββ 'serverEnvironment' is imported here
28 β import { canShareWithGuestAtom } from "./guestShareAvailability";
β°ββββ
help: Consider removing this import.
Γ t3code(no-low-value-comments): Cut this to 4 lines or fewer: keep the constraint, drop the background.
ββ[packages/shared/src/orchestrationV2DedupedBodies.ts:13:1]
12 β
13 β βββΆ /**
14 β β * A turn item repeats a body its record already carries: message text, checkpoint files, a
15 β β * subagent's prompt and result. For clients that opt in, the server blanks the repeat and marks
16 β β * the field (`textOmitted`, `filesOmitted`, `promptOmitted`, `resultOmitted`), and the client
17 β β * copies the value back from the record it already holds. Only a body equal to the record's is
18 β β * blanked, so the restore is exact.
19 β β°ββΆ */
20 β export interface DedupedBodySource {
β°ββββ
β eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used.
ββ[apps/web/src/components/Sidebar.tsx:129:40]
128 β import { environmentPresentations } from "../state/presentation";
129 β import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server";
Β· βββββββββ¬ββββββββ
Β· β°ββ 'serverEnvironment' is imported here
130 β import { environmentProjects } from "../state/projects";
β°ββββ
help: Consider removing this import.
β react(purity): Cannot call impure function during render
ββ[apps/web/src/components/Sidebar.tsx:1117:11]
1116 β foldSearchQuery(threadSearchQuery),
1117 β Date.now(),
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
1118 β // A list filter, as on mobile: a pick would move rows unexplained.
β°ββββ
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-unneeded-ternary): Unnecessary use of boolean literals in conditional expression
ββ[packages/shared/src/serverSettings.test.ts:35:7]
34 β const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) =>
35 β instanceId === configured ? true : false,
Β· ββββββββββββββββββββββββββββββββββββββββ
36 β );
β°ββββ
help: Remove this ternary operator
β react(purity): Cannot call impure function during render
ββ[apps/web/src/components/CustomSnoozeDialog.tsx:140:58]
139 β {...(weekStartsOn === undefined ? {} : { weekStartsOn })}
140 β disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }}
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
141 β onSelect={(selected) => {
β°ββββ
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-empty-pattern): Empty array binding pattern
ββ[apps/server/src/pullRequest/PullRequestService.test.ts:1436:12]
1435 β
1436 β for (const [] of [
Β· ββ
1437 β ["github", "github.com"],
β°ββββ
help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable.
β 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.
β 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:2613:7]
2612 β let orphanedAt: number | undefined;
2613 β βββΆ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) {
2614 β β const tasks: Array<() => void> = [];
2615 β β const dispatcher: Scheduler.SchedulerDispatcher = {
2616 β β scheduleTask: (task) => tasks.push(task),
2617 β β flush: () => {
2618 β β let task: (() => void) | undefined;
2619 β β while ((task = tasks.shift()) !== undefined) task();
2620 β β },
2621 β β };
2622 β β
2623 β β let requestFiber: Fiber.Fiber<unknown, unknown> | undefined;
2624 β β let requestChecks = 0;
2625 β β const scheduler: Scheduler.Scheduler = {
2626 β β executionMode: "async",
2627 β β makeDispatcher: () => dispatcher,
2628 β β shouldYield: (fiber) => {
2629 β β if (fiber !== requestFiber) return false;
2630 β β requestChecks += 1;
2631 β β if (requestChecks !== interruptAt) return false;
2632 β β fiber.interruptUnsafe();
2633 β β return true;
2634 β β },
2635 β β };
2636 β β
2637 β β const input: UsageSummaryInput = {
2638 β β ...WINDOW,
2639 β β sinceDay: UsageDay.make("2026-09-01"),
2640 β β untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`),
2641 β β };
2642 β β const first = yield* service
2643 β β .readSummary(input)
2644 β β .pipe(
2645 β β Effect.exit,
2646 β β Effect.provideService(Scheduler.Scheduler, scheduler),
2647 β β Effect.forkChild,
2648 β β );
2649 β β requestFiber = first;
2650 β β yield* Effect.yieldNow;
2651 β β dispatcher.flush();
2652 β β
2653 β β const second = yield* service.readSummary(input).pipe(
2654 β β Effect.match({
2655 β β onFailure: (error) => error.reason,
2656 β β onSuccess: () => "success" as const,
2657 β β }),
2658 β β Effect.provideService(Scheduler.Scheduler, scheduler),
2659 β β Effect.forkChild,
2660 β β );
2661 β β yield* Effect.yieldNow;
2662 β β dispatcher.flush();
2663 β β const secondExit = second.pollUnsafe();
2664 β β if (secondExit === undefined) {
2665 β β second.interruptUnsafe();
2666 β β orphanedAt = interruptAt;
2667 β β break;
2668 β β }
2669 β β if (Exit.isFailure(secondExit)) {
2670 β β assert.fail("the matching request fiber was interrupted");
2671 β β }
2672 β β assert.strictEqual(secondExit.value, "invalidWindow");
2673 β β°ββΆ }
2674 β
β°ββββ
β eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/usage/UsageService.ts:162:7]
161 β
162 β const layerTest = Layer.succeed(
Β· βββββ¬ββββ
Β· β°ββ 'layerTest' is declared here
163 β UsageService,
β°ββββ
help: Consider removing this declaration.
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/components/ComposerEditor.tsx:82:6]
81 β },
82 β [draftKey],
Β· βββββ¬βββ
Β· β°ββ Unnecessary dependency `draftKey`
83 β );
β°ββββ
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/components/MediaVideoPlayer.tsx:59:5]
56 β
57 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
58 β const controller = new AbortController();
59 β setLoadState("pending");
Β· βββββββ¬βββββ
Β· β°ββ Avoid calling setState() directly within an effect
60 β // A renewed signature is used on Retry, not as a reason to reset the native player.
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/components/MediaVideoPlayer.tsx:70:7]
69 β return () => controller.abort();
70 β }, [player, props.playRequested, attempt]);
Β· ββββ¬ββ ββββββββββ¬βββββββββ ββββ¬βββ
Β· β β β°ββ Unnecessary dependency `attempt`
Β· β β°ββ Unnecessary dependency `props.playRequested`
Β· β°ββ Unnecessary dependency `player_0`
71 β
β°ββββ
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/components/VideoPreviewModal.tsx:67:5]
65 β const { id: attachmentId, fileUri } = attachment;
66 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
67 β setUri(null);
Β· ββββ¬ββ
Β· β°ββ Avoid calling setState() directly within an effect
68 β setError(null);
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/components/VideoPreviewModal.tsx:90:7]
89 β };
90 β }, [attachmentId, fileUri]);
Β· βββββββ¬βββββ ββββ¬βββ
Β· β β°ββ Unnecessary dependency `fileUri`
Β· β°ββ Unnecessary dependency `attachmentId`
91 β const mimeType = videoMimeType(attachment) ?? attachment.mimeType;
β°ββββ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
ββ[apps/mobile/src/components/VideoPreviewModal.tsx:212:34]
211 β useEffect(() => {
212 β if (!isFocused && hasSource) props.onRequestClose();
Β· βββ¬ββ
Β· β°ββ Missing dependency `props`
213 β }, [isFocused, hasSource, props.onRequestClose]);
Β· βββββββββββ¬βββββββββ
Β· β°ββ Overly precise dependency `props.onRequestClose`, use `props` instead
214 β const { source } = props;
β°ββββ
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β eslint(no-unused-vars): Type 'Scope' is imported but never used.
ββ[apps/server/src/provider/ProviderAuthService.ts:15:18]
14 β import * as Layer from "effect/Layer";
15 β import type * as Scope from "effect/Scope";
Β· βββ¬ββ
Β· β°ββ 'Scope' is imported here
16 β import * as Stream from "effect/Stream";
β°ββββ
help: Consider removing this import.
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/components/ProjectFavicon.tsx:171:5]
166 β const [activeFaviconRequest, setActiveFaviconRequest] = useState<typeof faviconRequest>(null);
167 β useLayoutEffect(() => {
Β· ββββββββ¬βββββββ
Β· β°ββ This is the containing effect
168 β if (faviconRequest === null) return;
169 β
170 β const endRequest = beginProjectFaviconRequest(faviconRequest);
171 β setActiveFaviconRequest(faviconRequest);
Β· ββββββββββββ¬βββββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
172 β return endRequest;
β°ββββ
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): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
ββ[apps/server/src/provider/AntigravityAuth.ts:303:20]
302 β },
303 β (effect, flow, stopSessions) =>
Β· βββββββ¬βββββ
Β· β°ββ 'stopSessions' is declared here
304 β effect.pipe(
β°ββββ
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.
ββ[packages/shared/src/atomicWrite.test.ts:137:5]
136 β Effect.gen(function* () {
137 β βββΆ while (fiber.pollUnsafe() === undefined) {
138 β β yield* TestClock.adjust("100 millis");
139 β β // oxlint-disable-next-line t3code/no-real-time-wait-in-tests -- a macrotask boundary so the real stat I/O can finish; time moves only via TestClock
140 β β yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve)));
141 β β°ββΆ }
142 β return yield* Fiber.join(fiber);
β°ββββ
β eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'.
ββ[packages/shared/src/model.test.ts:36:7]
35 β
36 β const claudeCaps: ModelCapabilities = createModelCapabilities({
Β· ββββββ¬ββββ
Β· β°ββ 'claudeCaps' is declared here
37 β optionDescriptors: [
β°ββββ
help: Consider removing this declaration.
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:148:27]
147 β <View ref={anchorRef} collapsable={false} className={props.className} style={props.style}>
148 β {props.children(open)}
Β· βββ¬β
Β· β°ββ Cannot access ref value during render
149 β </View>
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(memo-dependencies): Found missing/extra memoization dependencies
ββ[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:136:9]
135 β if (action.id !== undefined) {
136 β props.onPressAction?.({
Β· βββ¬ββ
Β· β°ββ Missing dependency `props`
137 β nativeEvent: { event: action.id },
138 β } as Parameters<NonNullable<MenuComponentProps["onPressAction"]>>[0]);
139 β }
140 β },
141 β [close, props.onPressAction],
Β· ββββββββββ¬βββββββββ
Β· β°ββ Overly precise dependency `props.onPressAction`, use `props` instead
142 β );
β°ββββ
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI. 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(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:160:24]
159 β keys,
160 β overridingProjects = [],
Β· ββ
161 β 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.
β t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownOption(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
ββ[packages/shared/src/otelEnvironment.ts:146:14]
145 β name,
146 β (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()),
Β· ββββββββββββββββββββββββββ
147 β `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`,
β°ββββ
β 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/project/ProjectEnrichmentService.test.ts:28:3]
27 β ) {
28 β βββΆ for (let attempt = 0; attempt < 100; attempt += 1) {
29 β β const available = yield* service.peek(workspaceRoot);
30 β β if (predicate(available)) return available;
31 β β yield* Effect.yieldNow;
32 β β°ββΆ }
33 β return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`);
β°ββββ
β 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/project/ProjectService.test.ts:94:3]
93 β ) {
94 β βββΆ for (let attempt = 0; attempt < 100; attempt += 1) {
95 β β const project = Option.getOrThrow(yield* service.getById(projectId));
96 β β if (predicate(project)) return project;
97 β β yield* Effect.yieldNow;
98 β β°ββΆ }
99 β return yield* Effect.die(`Project ${projectId} was not enriched in time.`);
β°ββββ
β eslint(no-empty-pattern): Empty object binding pattern
ββ[apps/server/src/provider/Drivers/CodexDriver.test.ts:460:14]
459 β
460 β for (const {} of ["direct", "wrapper"] as const) {
Β· ββ
461 β }
β°ββββ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
β unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
ββ[packages/shared/src/composerContextLegacySend.ts:15:45]
14 β const occurrences = collectComposerContextReferences(text);
15 β for (const occurrence of [...occurrences].reverse()) {
Β· βββββββ
16 β const record = recordsById.get(occurrence.contextId);
β°ββββ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
β 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:1296:13]
1295 β const usageLimitSources = yield* UsageLimitSources.UsageLimitSources;
1296 β const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner;
Β· βββββββββββββ¬βββββββββββ
Β· β°ββ 'projectSetupScriptRunner' is declared here
1297 β const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker;
β°ββββ
help: Consider removing this declaration.
β t3code(no-inline-schema-compile): Hoist Schema.is(...) 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.
ββ[apps/server/src/provider/acp/AntigravityProtocol.ts:260:20]
259 β ...(update._meta !== undefined
260 β ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null }
Β· βββββββββ
261 β : {}),
β°ββββ
β eslint(no-unused-vars): Identifier 'Option' is imported but never used.
ββ[apps/server/src/guest/GuestShareService.test.ts:24:13]
23 β import * as Ref from "effect/Ref";
24 β import * as Option from "effect/Option";
Β· ββββ¬ββ
Β· β°ββ 'Option' is imported here
25 β import * as Stream from "effect/Stream";
β°ββββ
help: Consider removing this import.
β unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
ββ[apps/server/src/guest/GuestShareService.test.ts:733:50]
732 β yield* guestShares.submit(session, { shareId, text: `note ${index}` }, []);
733 β const [waiting] = (yield* waitingMessages).filter((next) => next.status === "pending");
Β· ββββββ
734 β yield* orchestrator.dispatch({
β°ββββ
help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
β react(no-array-index-key): Usage of Array index in keys is not allowed
ββ[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9]
35 β <T3SourceTextRunNativeComponent
36 β key={index}
Β· βββββββββββ
37 β style={flattenedStyle}
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β 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.
β eslint(no-unused-vars): Variable 'I' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/guest/http.ts:88:33]
87 β /** Server-sent events with a heartbeat, never cached or buffered on the way. */
88 β const eventStreamResponse = <A, I>(
Β· β¬
Β· β°ββ 'I' is declared here
89 β events: Stream.Stream<A>,
β°ββββ
help: Consider removing this declaration.
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/components/ui/Menu.tsx:54:36]
53 β const child = children as ReactElement<Pick<PressableProps, "onTouchStart" | "onPress">>;
54 β βββΆ children = cloneElement(child, {
55 β β onTouchStart: (event) => {
56 β β // onPressIn can repeat within one gesture when a finger leaves and re-enters the row.
57 β β menuPress.current.isPreparing = false;
58 β β menuPress.current.suppressPress = menuPress.current.isOpen;
59 β β pendingPress.current = null;
60 β β child.props.onTouchStart?.(event);
61 β β },
62 β β onPress: (event) => {
63 β β // Accessibility clicks lack touch identifiers and must ignore previous touch cancellation.
64 β β const isTouch = typeof event.nativeEvent.identifier === "number";
65 β β if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) {
66 β β return;
67 β β }
68 β β if (isTouch && menuPress.current.isPreparing) {
69 β β // A release can precede native display; let UIKit's display/cancel callback decide its outcome.
70 β β event.persist();
71 β β pendingPress.current = () => child.props.onPress?.(event);
72 β β return;
73 β β }
74 β β child.props.onPress?.(event);
75 β β },
76 β βββΆ });
Β· β°ββββ Passing a ref to a function may read its value during render
77 β menuProps.onMenuInteractionStart = () => {
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β unicorn(no-useless-spread): Using a spread operator here creates a new array unnecessarily.
ββ[apps/mobile/src/native/native-layout-metrics.tsx:43:27]
42 β latestMetrics = next;
43 β for (const settle of [...metricsWaiters]) settle(next);
Β· βββ
44 β setMetrics(next);
β°ββββ
help: `forβ¦of` can iterate over iterable, it's unnecessary to convert to an array.
β eslint(no-unused-vars): Function 'describeSchedule' is declared but never used.
ββ[apps/server/src/scheduledTasks/Schedule.ts:75:10]
74 β
75 β function describeSchedule(schedule: ScheduledTaskSchedule): string {
Β· βββββββββ¬βββββββ
Β· β°ββ 'describeSchedule' is declared here
76 β if (schedule.type === "webhook") return "On webhook";
β°ββββ
help: Consider removing this declaration.
β unicorn(no-new-array): Do not use `new Array(singleArgument)`.
ββ[apps/web/src/terminal/ghostty/core.ts:186:19]
185 β const count = Math.min(CHUNK_SIZE, graphemeLength - start);
186 β const codes = new Array<number>(count);
Β· ββββββββββββββββββββββββ
187 β for (let index = 0; index < count; index += 1) {
β°ββββ
help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`.
β 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:520:13]
519 β })).delivery;
520 β βββΆ while (delivery.outcome === "accepted") {
521 β β yield* Effect.yieldNow;
522 β β delivery = (yield* service.getWebhookDelivery({
523 β β id: task.id,
524 β β deliveryId: deliveryId!,
525 β β })).delivery;
526 β β°ββΆ }
527 β assert.equal(delivery.outcome, "dispatch_failed");
β°ββββ
β 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.
ββ[apps/server/src/assets/AssetAccess.test.ts:975:35]
974 β // Every client and server release spells the resource this way on the wire.
975 β const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({
Β· ββββββββββββββββββββββββββ
976 β resource: { _tag: "github-media", cwd: "/repo", url },
β°ββββ
β t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
ββ[apps/server/src/assets/AssetAccess.test.ts:1012:32]
1011 β expect(error._tag).toBe("AssetGitHubMediaUrlValidationError");
1012 β const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error);
Β· βββββββββββββββββββ
1013 β expect(encoded).not.toContain(url);
β°ββββ
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27]
120 β const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"]));
121 β const dispatch = vi.fn((_: unknown) =>
Β· β¬
Β· β°ββ '_' is declared here
122 β (options.dispatchGate ?? Effect.void).pipe(
β°ββββ
help: Consider removing this parameter.
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39]
133 β );
134 β const listLocalBranchNames = vi.fn((_: string) =>
Β· β¬
Β· β°ββ '_' is declared here
135 β Effect.succeed(
β°ββββ
help: Consider removing this parameter.
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31]
177 β });
178 β const sendToThread = vi.fn((_: unknown) => {
Β· β¬
Β· β°ββ '_' is declared here
179 β switch (options.continuation ?? "queued") {
β°ββββ
help: Consider removing this parameter.
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33]
202 β );
203 β const removeWorktree = vi.fn((_: unknown) =>
Β· β¬
Β· β°ββ '_' is declared here
204 β options.removeWorktreeFails
β°ββββ
help: Consider removing this parameter.
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36]
207 β );
208 β const deleteLocalBranch = vi.fn((_: unknown) =>
Β· β¬
Β· β°ββ '_' is declared here
209 β options.deleteLocalBranchFails
β°ββββ
help: Consider removing this parameter.
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42]
212 β );
213 β const fetchWorktreeBaseCommit = vi.fn((_: unknown) =>
Β· β¬
Β· β°ββ '_' is declared here
214 β options.fetchWorktreeBaseFails
β°ββββ
help: Consider removing this parameter.
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30]
253 β );
254 β const localStatus = vi.fn((_: unknown) =>
Β· β¬
Β· β°ββ '_' is declared here
255 β Effect.succeed({
β°ββββ
help: Consider removing this parameter.
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32]
263 β );
264 β const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub"));
Β· β¬
Β· β°ββ '_' is declared here
265 β const runForThread = vi.fn((input: { readonly worktreePath: string }) => {
β°ββββ
help: Consider removing this parameter.
β eslint(no-empty-pattern): Empty object binding pattern
ββ[apps/server/src/processRunner.test.ts:264:14]
263 β
264 β for (const {} of ["timeout", "success"] as const) {
Β· ββ
265 β }
β°ββββ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
β eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/telemetry/AnalyticsService.ts:327:7]
326 β
327 β const layerTest = AnalyticsService.layerTest;
Β· βββββ¬ββββ
Β· β°ββ 'layerTest' is declared here
β°ββββ
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(exhaustive-effect-dependencies): Found missing effect dependencies
ββ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6]
225 β nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
226 β nativeEventSnapshotsRef.current,
Β· ββββββββββββ¬βββββββββββ
Β· β°ββ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
227 β mostRecentEventCount,
228 β );
229 β }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
Β· βββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββ
Β· β°ββ This dependency list is missing values used by the callback
230 β const assumedValue = props.value;
β°ββββ
help: Missing dependencies can cause an effect to fire less often than it should
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
ββ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:235:7]
234 β nativeEventSnapshotsRef.current = assumeComposerControlledState(
235 β nativeEventSnapshotsRef.current,
Β· ββββββββββββ¬βββββββββββ
Β· β°ββ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
236 β controlledEventCount,
237 β assumedValue,
238 β );
239 β }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
Β· ββββββββββββ¬ββββββββββ
Β· β°ββ Unnecessary dependency `controlledDocumentJson`
240 β const acceptNativeEvent = useCallback(
β°ββββ
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29]
161 β const tokens = collectComposerInlineTokens(props.value, {
162 β preserveTrailingFrom: confirmedTokensRef.current,
Β· ββββββββββββββ¬ββββββββββββ
Β· β°ββ Cannot access ref value during render
163 β });
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29]
161 β const tokens = collectComposerInlineTokens(props.value, {
162 β preserveTrailingFrom: confirmedTokensRef.current,
Β· ββββββββββββββ¬ββββββββββββ
Β· β°ββ Passing a ref to a function may read its value during render
163 β });
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23]
163 β });
164 β confirmedTokensRef.current = tokens;
Β· ββββββββββ¬βββββββββββββ¬βββ
Β· β β°ββ Cannot update ref value during render
Β· β°ββ This value is a ref
165 β return JSON.stringify(
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5]
205 β mostRecentEventCount,
206 β nativeEventSnapshotsRef.current,
Β· ββββββββββββββββ¬βββββββββββββββ
Β· β°ββ Passing a ref to a function may read its value during render
207 β );
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5]
211 β mostRecentEventCount,
212 β nativeEventSnapshotsRef.current,
Β· ββββββββββββββββ¬βββββββββββββββ
Β· β°ββ Passing a ref to a function may read its value during render
213 β );
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(memo-dependencies): Found missing memoization dependencies
ββ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6]
161 β const tokens = collectComposerInlineTokens(props.value, {
162 β preserveTrailingFrom: confirmedTokensRef.current,
Β· ββββββββββ¬ββββββββ
Β· β°ββ Missing dependency `confirmedTokensRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
163 β });
164 β confirmedTokensRef.current = tokens;
165 β return JSON.stringify(
166 β composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
167 β const record =
168 β token.type === "context"
169 β ? props.context?.records.find((record) => record.contextId === token.contextId)
170 β : undefined;
171 β const presentation = contextChipPresentation(
172 β token.type === "context" ? token.kind : token.type,
173 β record,
174 β );
175 β const icon = contextChipIcon(
176 β presentation,
177 β token.type === "mention" ? token.value : contextRecordFileName(record),
178 β );
179 β return {
180 β type: token.type,
181 β source: token.source,
182 β start: token.start,
183 β end: token.end,
184 β accent: contextChipAccent(presentation.accent, theme, chipTextColor),
185 β label:
186 β token.type === "skill"
187 β ? (skillLabels.get(token.value) ?? token.value)
188 β : token.type === "context"
189 β ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " Β· unavailable"}`
190 β : basename(token.value),
191 β detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
192 β iconUri: contextChipIconUri(icon),
193 β tintsIcon: icon.kind === "chip",
194 β };
195 β }),
196 β );
197 β }, [props.value, props.context, skillLabels, theme, chipTextColor]);
Β· ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ
Β· β°ββ This dependency list is missing values used by the callback
198 β // Every render resolves against the snapshot history, so a render whose
β°ββββ
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(memo-dependencies): Found missing memoization dependencies
ββ[apps/mobile/src/native/T3ComposerEditor.ios.tsx:257:5]
249 β mostRecentEventCountRef.current = acknowledgedEventCount;
250 β nativeEventSnapshotsRef.current.push({
Β· ββββββββββββ¬βββββββββββ
Β· β°ββ Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
251 β eventCount: acknowledgedEventCount,
252 β value,
253 β selection: nextSelection,
254 β });
255 β return acknowledgedEventCount;
256 β },
257 β [],
Β· ββ¬
Β· β°ββ This dependency list is missing values used by the callback
258 β );
β°ββββ
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-new): Do not use 'new' for side effects.
ββ[apps/server/src/mcp/McpToolAccess.test.ts:168:3]
167 β // @ts-expect-error a declaration constructed directly
168 β new McpToolAccess.Declaration(unchecked);
Β· βββββββββββββββββββββββββββββ
169 β // @ts-expect-error a handlers layer built outside McpToolAccess
β°ββββ
help: Assign the result of 'new' to a variable or compare it to a reference.
β t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
ββ[apps/server/src/serverSettings.test.ts:1740:32]
1739 β const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5");
1740 β const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
Β· βββββββββββββββββββ
1741 β const scriptsJson = yield* Schema.encodeEffect(
β°ββββ
β t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
ββ[apps/server/src/serverSettings.test.ts:1741:34]
1740 β const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
1741 β const scriptsJson = yield* Schema.encodeEffect(
Β· βββββββββββββββββββ
1742 β Schema.fromJsonString(Schema.Array(ProjectScript)),
β°ββββ
β 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.
β 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): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/orchestration-v2/Orchestrator.ts:12551:7]
12550 β
12551 β const layerUnavailable: Layer.Layer<OrchestratorV2> = Layer.succeed(
Β· βββββββββ¬βββββββ
Β· β°ββ 'layerUnavailable' is declared here
12552 β OrchestratorV2,
β°ββββ
help: Consider removing this declaration.
β unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
ββ[scripts/lib/cli-external-packages.test.ts:104:11]
103 β const declared = {
104 β ...(manifest.dependencies ?? {}),
Β· ββββββββββββββββββββββββββββββββ
105 β ...(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:105:11]
104 β ...(manifest.dependencies ?? {}),
105 β ...(manifest.optionalDependencies ?? {}),
Β· ββββββββββββββββββββββββββββββββββββββββ
106 β ...(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:106:11]
105 β ...(manifest.optionalDependencies ?? {}),
106 β ...(manifest.peerDependencies ?? {}),
Β· ββββββββββββββββββββββββββββββββββββ
107 β };
β°ββββ
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): 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(prefer-array-find): Prefer `find` over filtering and accessing the first result.
ββ[apps/server/src/terminal/Manager.test.ts:731:31]
730 β );
731 β const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot;
Β· ββββββ
732 β expect(snapshot?.history).toBe("aaπ\rEND");
β°ββββ
help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
β eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/mcp/McpSessionRegistry.ts:214:7]
213 β
214 β const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect<void> =>
Β· βββββββββββ¬ββββββββββ
Β· β°ββ 'revokeActiveMcpThread' is declared here
215 β activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void;
β°ββββ
help: Consider removing this declaration.
β eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/mcp/McpSessionRegistry.ts:217:7]
216 β
217 β const revokeAllActiveMcpCredentials = (): Effect.Effect<void> =>
Β· βββββββββββββββ¬ββββββββββββββ
Β· β°ββ 'revokeAllActiveMcpCredentials' is declared here
218 β activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void;
β°ββββ
help: Consider removing this declaration.
β 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.
β unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
ββ[packages/shared/src/serverSettings.ts:333:9]
332 β const entry: ProjectSettingsOverrides = {
333 β ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}),
Β· ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
334 β };
β°ββββ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
β oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce()
ββ[packages/shared/src/serverSettings.ts:435:24]
434 β const favorites =
435 β setModelFavorites?.reduce((current, change) => {
Β· ββββ¬ββ
Β· β°ββ For this reduce
436 β const exists = current.some(
437 β (favorite) => favorite.provider === change.provider && favorite.model === change.model,
438 β );
439 β return change.favorite
440 β ? exists
441 β ? current
442 β : [...current, { provider: change.provider, model: change.model }]
Β· ββββββ¬ββββ
Β· β°ββ From this spread
443 β : current.filter(
β°ββββ
help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead.
note: Using spreads within accumulators leads to `O(n^2)` time complexity.
β oxc(no-accumulating-spread): Do not spread accumulators in loops
ββ[packages/shared/src/serverSettings.ts:453:3]
451 β null;
452 β let nextModelPreferences = initialModelPreferences;
Β· βββββββββββ¬βββββββββ
Β· β°ββ From this accumulator
453 β for (const change of setModelsHidden ?? []) {
Β· ββ¬β
Β· β°ββ For this loop
454 β const preferences = nextModelPreferences?.[change.provider] ?? {
455 β hiddenModels: [],
456 β modelOrder: [],
457 β };
458 β const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model);
459 β if (change.hidden) hiddenModels.push(change.model);
460 β nextModelPreferences = {
461 β ...nextModelPreferences,
Β· ββββββββββββ¬βββββββββββ
Β· β°ββ From this spread
462 β [change.provider]: { ...preferences, hiddenModels },
β°ββββ
help: Consider using `Object.assign()` to mutate the accumulator instead.
note: Using spreads within accumulators leads to `O(n^2)` time complexity.
β eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/serverRuntimeStartup.ts:720:7]
719 β
720 β const layer = layerWithOptions();
Β· βββ¬ββ
Β· β°ββ 'layer' is declared here
β°ββββ
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(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): 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.
β 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.
β 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({
β°ββββ
β 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()),
β°ββββ
β 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): 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): Parameter '_' is declared but never used.
ββ[packages/shared/src/qrCode.ts:458:44]
457 β ): Array<byte> {
458 β let result: Array<byte> = divisor.map((_) => 0);
Β· β¬
Β· β°ββ '_' is declared here
459 β for (const b of data) {
β°ββββ
help: Consider removing this parameter.
β 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),
β°ββββ
β eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
ββ[packages/provider-opencode/src/server/adapter.ts:3719:7]
3718 β
3719 β const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, OpenCodeAdapterV2DriverEnv> =
Β· βββ¬ββ
Β· β°ββ 'layer' is declared here
3720 β Layer.effect(
β°ββββ
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-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);
β°ββββ
β 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.
β react(purity): Cannot call impure function during render
ββ[apps/web/src/components/sidebar/SidebarThreadRow.tsx:373:47]
372 β const { open, onOpenChange, onSnooze, timestampFormat } = props;
373 β const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : [];
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
374 β 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:860:39]
859 β if (snoozeGateClock.thread !== thread) {
860 β setSnoozeGateClock({ thread, now: new Date().toISOString() });
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
861 β }
β°ββββ
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/CommandPalette.tsx:2048:20]
2047 β title: inferProjectTitleFromPath(destinationPath),
2048 β createdAt: new Date().toISOString(),
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
2049 β remoteUrl: addProjectCloneFlow.remoteUrl,
β°ββββ
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
β typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
ββ[apps/web/src/contextMenuFallback.test.ts:38:9]
37 β get isConnected() {
38 β let current: FakeElement | null = this;
Β· βββββββ
39 β while (current?.parent) {
β°ββββ
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.
β eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
ββ[apps/web/src/components/preview/PreviewPanelShell.tsx:57:9]
56 β ) {
57 β const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
Β· βββββββ¬ββββββ
Β· β°ββ 'useDragRegion' is declared here
58 β 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/components/VideoPreviewModal.ios.tsx:63:55]
61 β }, []);
62 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
63 β if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl);
Β· ββββββββ¬ββββββ
Β· β°ββ Avoid calling setState() directly within an effect
64 β }, [playbackUrl, resolvedUrl]);
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(purity): Cannot call impure function during render
ββ[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58]
151 β if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) {
152 β claimThreadOpen(thread.environmentId, thread.id, Date.now());
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
153 β }
β°ββββ
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
β react(no-array-index-key): Usage of Array index in keys is not allowed
ββ[apps/mobile/src/components/ComposerContextSheet.tsx:272:25]
271 β {record.elements?.map((element, index) => (
272 β <View key={`${element.selector ?? element.tagName}:${index}`} className="gap-3">
Β· βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
273 β <ContextField
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β eslint(no-unused-vars): Identifier 'serverEnvironment' is imported but never used.
ββ[apps/web/src/components/LegacySidebar.tsx:210:40]
209 β import { useClientSettings, updateClientSettings } from "~/hooks/useSettings";
210 β import { primaryServerKeybindingsAtom, serverEnvironment } from "../state/server";
Β· βββββββββ¬ββββββββ
Β· β°ββ 'serverEnvironment' is imported here
211 β import { appAtomRegistry } from "../rpc/atomRegistry";
β°ββββ
help: Consider removing this import.
β 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
β eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
ββ[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8]
3 β AuthProvidersManageScope,
4 β type AuthSessionState,
Β· βββββββββ¬βββββββ
Β· β°ββ 'AuthSessionState' is imported here
5 β type EnvironmentId,
β°ββββ
help: Consider removing this import.
Found 3 errors and 377 warnings in 5539 files (5.4s, 8 threads)
Error: Process completed with exit code 1.
Post job cleanup.
##[start-action display=Cache full pnpm store;id=__cc2f6527-8fdf-416f-a6c6-f2370a42c233.__actions_cache]
##[end-action id=__cc2f6527-8fdf-416f-a6c6-f2370a42c233.__actions_cache;outcome=skipped;conclusion=skipped;duration_ms=0]
##[start-action display=Cache Vite+;id=__cc2f6527-8fdf-416f-a6c6-f2370a42c233.vp_cache]
##[end-action id=__cc2f6527-8fdf-416f-a6c6-f2370a42c233.vp_cache;outcome=skipped;conclusion=skipped;duration_ms=0]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/4a4fb22b-5691-4369-917f-2641980c9532' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
Removing SSH command configuration
[command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
[command]/usr/local/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
Warning: The process '/usr/local/bin/git' failed with exit code 128
A job completed hook has been configured by the self-hosted runner administrator
βΈ Run '/job_completed.sh'
shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
env:
BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 149
BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 376
BLACKSMITH_CHECK_RUN_ID: 121051323923
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