GitHub check
256 KB of 594 KB loaded Download the full log (594 KB)
338 KB of earlier output not loaded
ence/eslint-plugin-react-hooks/lints/refs
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5]
58 β
59 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
60 β setMountedModes((current) => {
Β· ββββββββ¬βββββββ
Β· β°ββ Avoid calling setState() directly within an effect
61 β if (current.has(props.mode)) {
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used.
ββ[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10]
1619 β
1620 β function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean {
Β· βββββββββββββββββββ¬ββββββββββββββββββ
Β· β°ββ 'promptResponseHasMissingXAiStopReason' is declared here
1621 β 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/pull-requests/PullRequestRouteScreen.tsx:335:7]
330 β };
331 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
332 β if (!guidesEnabled && section === "guide") {
333 β requestedSection.current = "overview";
334 β currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
335 β setSection("overview");
Β· ββββββ¬ββββ
Β· β°ββ Avoid calling setState() directly within an effect
336 β }
β°ββββ
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:337:6]
332 β if (!guidesEnabled && section === "guide") {
333 β 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
334 β 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
335 β setSection("overview");
336 β }
337 β }, [guidesEnabled, section, insets.top]);
Β· βββββββββββββββββββ¬βββββββββββββββββ
Β· β°ββ This dependency list is missing values used by the callback
338 β 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
β react(exhaustive-effect-dependencies): Found missing effect dependencies
ββ[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:873:6]
856 β if (
857 β lastSelection.current.path === route.params.path &&
Β· βββββββ¬ββββββ
Β· β°ββ Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
858 β lastSelection.current.id === route.params.fileSelectionId
859 β )
860 β return;
861 β lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId };
862 β if (route.params.focus) navigation.setParams({ focus: undefined });
863 β setJumpPath(route.params.path);
864 β setSelectedRowId(null);
865 β jumpStarted.current = false;
866 β const file = data.files.find((entry) => entry.path === route.params.path);
867 β if (!file || !nativeView.current) return;
Β· ββββββ¬ββββ
Β· β°ββ Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
868 β setCollapsedIds((ids) => ids.filter((id) => id !== file.id));
869 β jumpStarted.current = true;
870 β void nativeView.current.scrollToFile(file.id, false).catch(() => {
871 β jumpStarted.current = false;
872 β });
873 β }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]);
Β· βββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββ
Β· β°ββ This dependency list is missing values used by the callback
874 β const appliedFilter = useRef(filter.hideTestFiles);
β°ββββ
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
β eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
ββ[packages/provider-grok/src/server/adapter.ts:408:7]
407 β
408 β const layer: Layer.Layer<
Β· βββ¬ββ
Β· β°ββ 'layer' is declared here
409 β 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/ThreadNavigationSidebar.tsx:285:5]
283 β const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0);
284 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
285 β setNow(new Date().toISOString());
Β· ββββ¬ββ
Β· β°ββ Avoid calling setState() directly within an effect
286 β const id = setInterval(() => setNow(new Date().toISOString()), 60_000);
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25]
364 β // range) the boundary string is identical and the chain would die.
365 β }, [nextSnoozeWakeAt, snoozeWakeTick]);
Β· ββββββββ¬ββββββ
Β· β°ββ Unnecessary dependency `snoozeWakeTick`
366 β const listItems = ((): readonly SidebarListItem[] => {
β°ββββ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(purity): Cannot call impure function during render
ββ[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53]
355 β if (Number.isNaN(wakeAtMs)) return;
356 β const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
357 β const id = setTimeout(() => {
β°ββββ
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14]
26 β const latestInput = useRef(input);
27 β latestInput.current = input;
Β· ββββββ¬ββββββββββ¬βββ
Β· β β°ββ Cannot update ref value during render
Β· β°ββ This value is a ref
28 β const mounted = useRef(true);
β°ββββ
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(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5]
55 β
56 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
57 β setDecodedSize(null);
Β· ββββββββ¬ββββββ
Β· β°ββ Avoid calling setState() directly within an effect
58 β }, [props.sourceKey]);
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5]
59 β
60 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
61 β setFailedUri(null);
Β· βββββββ¬βββββ
Β· β°ββ Avoid calling setState() directly within an effect
62 β }, [props.uri]);
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
ββ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10]
6 β import { parse, SvgAst, type JsxAST } from "react-native-svg";
7 β import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native";
Β· βββββββββ¬ββββββββ
Β· β°ββ 'ActivityIndicator' is imported here
8 β
β°ββββ
help: Consider removing this import.
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7]
57 β setDecodedSize(null);
58 β }, [props.sourceKey]);
Β· ββββββββ¬βββββββ
Β· β°ββ Unnecessary dependency `props.sourceKey`
59 β
β°ββββ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7]
61 β setFailedUri(null);
62 β }, [props.uri]);
Β· βββββ¬ββββ
Β· β°ββ Unnecessary dependency `props.uri`
63 β
β°ββββ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5]
55 β
56 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
57 β scheduler.reset();
58 β highlightedRowIdsRef.current = new Set();
59 β visibleChunkIndexRef.current = 0;
60 β setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 });
Β· ββββββββ¬βββββββ
Β· β°ββ Avoid calling setState() directly within an effect
61 β setTokensPatchJson(createEmptyTokenPatch(resetKey));
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7]
62 β return () => scheduler.cancel();
63 β }, [enabled, resetKey, rows.length, scheduler]);
Β· ββββ¬βββ ββββββ¬βββββ
Β· β β°ββ Unnecessary dependency `rows.length`
Β· β°ββ Unnecessary dependency `enabled`
64 β
β°ββββ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(no-array-index-key): Usage of Array index in keys is not allowed
ββ[apps/mobile/src/features/review/ReviewCommentCard.tsx:223:31]
222 β ? snippetTokens.map((line, lineIndex) => (
223 β <NativeText key={lineIndex}>
Β· βββββββββββββββ
224 β {lineIndex > 0 ? "\n" : ""}
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β react(no-array-index-key): Usage of Array index in keys is not allowed
ββ[apps/mobile/src/features/review/ReviewCommentCard.tsx:227:25]
226 β <NativeText
227 β key={tokenIndex}
Β· ββββββββββββββββ
228 β style={{
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β typescript(no-extraneous-class): Unexpected class with only a constructor.
ββ[apps/desktop/src/preview/Manager.test.ts:158:18]
157 β BrowserWindow: browserWindowConstructor,
158 β βββΆ ClipboardItem: class {
159 β β constructor(data: Record<string, unknown>) {
160 β β clipboardItemConstructor(data);
161 β β }
162 β β°ββΆ },
163 β clipboard: {
β°ββββ
help: Try replacing this class with a standalone function or deleting it entirely
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10]
117 β
118 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
119 β void refreshNotifications();
Β· βββββββββββ¬βββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
120 β const subscription = AppState.addEventListener("change", (state) => {
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7]
125 β
126 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
127 β if (!isLoaded) {
128 β setLiveActivityStatus("checking");
Β· βββββββββββ¬ββββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
129 β return;
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:107:5]
104 β
105 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
106 β clearReviewCommentTarget();
107 β setPendingNativeCommentSelection(null);
Β· βββββββββββββββββ¬βββββββββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
108 β }, [selectedSection?.id]);
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:112:7]
109 β
110 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
111 β if (activeCommentTarget === null) {
112 β setPendingNativeCommentSelection(null);
Β· βββββββββββββββββ¬βββββββββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
113 β }
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/review/useReviewCommentSelectionController.ts:108:7]
107 β setPendingNativeCommentSelection(null);
108 β }, [selectedSection?.id]);
Β· ββββββββββ¬βββββββββ
Β· β°ββ Unnecessary dependency `selectedSection?.id`
109 β
β°ββββ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(exhaustive-effect-dependencies): Found extra effect dependencies
ββ[apps/mobile/src/features/review/ReviewSheet.tsx:454:7]
453 β showAuxiliaryPane("inspector");
454 β }, [environmentId, showAuxiliaryPane, threadId]);
Β· βββββββ¬ββββββ βββββ¬βββ
Β· β β°ββ Unnecessary dependency `threadId`
Β· β°ββ Unnecessary dependency `environmentId`
455 β const {
β°ββββ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(static-components): Cannot create components during render
ββ[apps/mobile/src/features/review/ReviewSheet.tsx:725:20]
492 β // same check.
493 β const NativeReviewDiffView = resolveNativeReviewDiffView();
Β· ββββββββββββββ¬βββββββββββββ
Β· β°ββ The component is created during render here
494 β const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
495 β const showcasedReviewDrawRef = useRef<string | null>(null);
496 β const [isPullRefreshing, setIsPullRefreshing] = useState(false);
497 β const handlePullToRefresh = async () => {
498 β setIsPullRefreshing(true);
499 β await refreshSelectedSection();
500 β setIsPullRefreshing(false);
501 β };
502 β const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
503 β const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
504 β const fileVisibility = useReviewFileVisibility({
505 β threadKey: reviewCache.threadKey,
506 β sectionId: selectedSection?.id ?? null,
507 β files: reviewFiles,
508 β cachedExpandedFileIds: selectedSection?.id
509 β ? reviewCache.expandedFileIdsBySection[selectedSection.id]
510 β : undefined,
511 β cachedViewedFileIds: selectedSection?.id
512 β ? reviewCache.viewedFileIdsBySection[selectedSection.id]
513 β : undefined,
514 β });
515 β const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
516 β const commentSelection = useReviewCommentSelectionController({
517 β environmentId,
518 β threadId,
519 β selectedSection,
520 β nativeReviewDiffData,
521 β });
522 β const nativeBridge = useNativeReviewDiffBridge({
523 β threadKey: reviewCache.threadKey,
524 β sectionId: selectedSection?.id ?? null,
525 β diff: selectedSection?.diff,
526 β data: nativeReviewDiffData,
527 β collapsedFileIds,
528 β viewedFileIds,
529 β selectedRowIds: commentSelection.selectedRowIds,
530 β canHighlight: parsedDiff.kind === "files",
531 β });
532 β const showcaseReviewKey =
533 β SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
534 β ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
535 β : null;
536 β const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
537 β nativeBridge.onDebug(event);
538 β if (
539 β showcaseReviewKey === null ||
540 β showcasedReviewDrawRef.current === showcaseReviewKey ||
541 β !isNativeReviewDiffDrawEvent(event.nativeEvent)
542 β ) {
543 β return;
544 β }
545 β showcasedReviewDrawRef.current = showcaseReviewKey;
546 β reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
547 β };
548 β
549 β const handleSelectFile = async (fileId: string | null) => {
550 β loadVisibleFile(fileId, true);
551 β commentSelection.clearSelection();
552 β if (fileId !== null && collapsedFileIds.includes(fileId)) {
553 β toggleExpandedFile(fileId);
554 β }
555 β const nativeView = nativeReviewDiffViewRef.current;
556 β if (!nativeView) return;
557 β const result = await settlePromise(() =>
558 β fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
559 β );
560 β if (AsyncResult.isFailure(result)) {
561 β console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
562 β }
563 β };
564 β const handleVisibleFileChange = (
565 β event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
566 β ) => {
567 β loadVisibleFile(event.nativeEvent.fileId ?? null);
568 β reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
569 β };
570 β const renderInspector = () => (
571 β <ReviewFileNavigator
572 β ref={reviewFileNavigatorRef}
573 β files={nativeReviewDiffData.files}
574 β headerInset={insets.top}
575 β sectionId={selectedSection?.id ?? null}
576 β onSelectFile={(fileId) => void handleSelectFile(fileId)}
577 β />
578 β );
579 β
580 β const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
581 β const { fileId } = event.nativeEvent;
582 β if (fileId) {
583 β loadVisibleFile(fileId, true);
584 β toggleExpandedFile(fileId);
585 β }
586 β };
587 β
588 β const handleNativeToggleViewedFile = (
589 β event: NativeSyntheticEvent<{ readonly fileId?: string }>,
590 β ) => {
591 β const { fileId } = event.nativeEvent;
592 β if (fileId) {
593 β toggleViewedFile(fileId);
594 β }
595 β };
596 β
597 β const parsedDiffNotice =
598 β parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
599 β const hasCachedSelectedDiff = selectedSection?.diff != null;
600 β const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
601 β const sectionMenu = buildReviewSectionMenu(reviewSections);
602 β const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
603 β hasEnvironmentPresentation: environment.isReady,
604 β isEnvironmentConnected: isEnvironmentReady,
605 β hasCachedSelectedDiff,
606 β hasAnyCachedDiff,
607 β });
608 β const handleRetryEnvironment = () => {
609 β void retryEnvironment(environmentId);
610 β };
611 β const handleReturnToThread = () => {
612 β if (navigation.canGoBack()) {
613 β navigation.goBack();
614 β return;
615 β }
616 β navigation.navigate("Thread", {
617 β environmentId: String(environmentId),
618 β threadId: String(threadId),
619 β });
620 β };
621 β const androidHeaderSubtitle = [
622 β selectedSection?.title,
623 β headerDiffSummary.additions,
624 β headerDiffSummary.deletions,
625 β ]
626 β .filter((part): part is string => Boolean(part))
627 β .join(" Β· ");
628 β
629 β const showChangedFilesPane =
630 β !showConnectionNotice &&
631 β selectedSection !== null &&
632 β parsedDiff.kind === "files" &&
633 β NativeReviewDiffView !== null;
634 β useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
635 β const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
636 β
637 β const listHeader = (() => {
638 β const children: ReactElement[] = [];
639 β
640 β if (error) {
641 β children.push(
642 β <View
643 β key="review-error"
644 β className={cn(
645 β "bg-card px-4 py-3",
646 β Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
647 β )}
648 β >
649 β <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
650 β <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
651 β </View>,
652 β );
653 β }
654 β
655 β if (parsedDiffNotice) {
656 β children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
657 β }
658 β
659 β if (children.length === 0) {
660 β return null;
661 β }
662 β
663 β return <>{children}</>;
664 β })();
665 β const headerSubtitle = [
666 β headerDiffSummary.additions,
667 β headerDiffSummary.deletions,
668 β pendingReviewCommentCount > 0
669 β ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
670 β : null,
671 β ]
672 β .filter(Boolean)
673 β .join(" Β· ");
674 β const headerTitleText = selectedSection?.title ?? "Review changes";
675 β
676 β return (
677 β <>
678 β <ReviewHeader
679 β environmentId={environmentId}
680 β threadId={threadId}
681 β title={headerTitleText}
682 β subtitle={headerSubtitle}
683 β androidSubtitle={androidHeaderSubtitle}
684 β iconColor={headerIcon}
685 β selectedThreadCwd={selectedThreadCwd}
686 β sectionMenu={sectionMenu}
687 β selectedSection={selectedSection}
688 β showSectionToolbar={showSectionToolbar}
689 β showChangedFilesToggle={showChangedFilesToggle}
690 β onRefresh={handlePullToRefresh}
691 β onSelectSection={selectSection}
692 β onReturnToThread={handleReturnToThread}
693 β />
694 β
695 β <ScreenContent>
696 β <View className="flex-1 bg-sheet android:bg-sheet-solid">
697 β {showConnectionNotice ? (
698 β <View className="flex-1" style={{ paddingTop: topContentInset }}>
699 β <EnvironmentConnectionNotice
700 β environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
701 β connection={
702 β environment.presentation?.connection ?? {
703 β phase: "available",
704 β error: null,
705 β traceId: null,
706 β }
707 β }
708 β resourceName="review"
709 β onRetry={handleRetryEnvironment}
710 β />
711 β </View>
712 β ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
713 β <View
714 β className="flex-1"
715 β style={{
716 β backgroundColor: nativeBridge.theme.background,
717 β }}
718 β >
719 β <View
720 β className="min-w-0 flex-1"
721 β style={listHeader ? { paddingTop: topContentInset } : undefined}
722 β >
723 β {listHeader}
724 β <View className="min-w-0 flex-1" collapsable={false}>
725 β <NativeReviewDiffView
Β· βββββββββββ¬βββββββββ
Β· β°ββ This component is created during render
726 β collapsable={false}
β°ββββ
help: Components created during render will reset their state each time they are created. Declare components outside of render
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
β react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
ββ[apps/web/src/components/settings/SettingInheritance.tsx:163:24]
162 β keys,
163 β overridingProjects = [],
Β· ββ
164 β onClearOverrides,
β°ββββ
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7]
118 β
119 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
120 β if (orientationSettled) return;
121 β const orientation = getNativeShowcaseOrientation();
122 β if (orientation === null) {
123 β setOrientationSettled(true);
Β· βββββββββββ¬ββββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
124 β return;
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7]
292 β
293 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
294 β if (
295 β scene === null ||
296 β requestedScene === null ||
297 β scene !== requestedScene ||
298 β !hasFixture ||
299 β !orientationSettled ||
300 β !themeApplied ||
301 β (scene === "agent-activity" && !agentActivityStaged) ||
302 β !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
303 β ) {
304 β setReadyScene(null);
Β· βββββββ¬ββββββ
Β· β°ββ Avoid calling setState() directly within an effect
305 β return;
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
ββ[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9]
127 β let cancelled = false;
128 β let lastOutcome: string | null = null;
Β· ββββββ¬βββββ
Β· β°ββ 'lastOutcome' is declared here
129 β void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
β°ββββ
help: Consider removing this declaration.
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7]
100 β
101 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
102 β if (!target || selectedLines.length === 0) {
103 β setHighlightedLinesById({});
Β· ββββββββββββ¬βββββββββββ
Β· β°ββ Avoid calling setState() directly within an effect
104 β return;
β°ββββ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
β react(immutability): This value cannot be modified
ββ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
86 β
87 β const cardCoverage = props.cardCoverage;
Β· βββββββ¬βββββ
Β· β°ββ `cardCoverage` originates here
88 β const barHeightRef = useRef(0);
89 β const cardHeightRef = useRef(0);
90 β const cardHeight = useSharedValue(0);
91 β const notifyCoverage = useCallback(() => {
92 β if (!cardCoverage) {
93 β return;
94 β }
95 β const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
96 β if (coverage === cardCoverage.value) {
97 β return;
98 β }
99 β if (cardCoverage.value === 0) {
100 β cardCoverage.value = coverage;
Β· βββββββ¬βββββ
Β· β°ββ `cardCoverage` cannot be modified
101 β return;
β°ββββ
help: Do not mutate component props or hook arguments. If the value should change, update it where it is owned and pass an update callback, or use local state
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): This value cannot be modified
ββ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7]
89 β const cardHeightRef = useRef(0);
90 β const cardHeight = useSharedValue(0);
Β· ββββββ¬ββββ
Β· β°ββ `cardHeight` originates here
91 β const notifyCoverage = useCallback(() => {
92 β if (!cardCoverage) {
93 β return;
94 β }
95 β const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
96 β if (coverage === cardCoverage.value) {
97 β return;
98 β }
99 β if (cardCoverage.value === 0) {
100 β cardCoverage.value = coverage;
101 β return;
102 β }
103 β cardCoverage.value = withTiming(coverage, {
104 β duration: USER_INPUT_TOGGLE_DURATION_MS,
105 β easing: Easing.out(Easing.cubic),
106 β });
107 β }, [cardCoverage]);
108 β const handleBarLayout = useCallback(
109 β (event: LayoutChangeEvent) => {
110 β barHeightRef.current = event.nativeEvent.layout.height;
111 β notifyCoverage();
112 β },
113 β [notifyCoverage],
114 β );
115 β const handleCardLayout = useCallback(
116 β (event: LayoutChangeEvent) => {
117 β cardHeightRef.current = event.nativeEvent.layout.height;
118 β cardHeight.value = event.nativeEvent.layout.height;
Β· ββββββ¬ββββ
Β· β°ββ `cardHeight` cannot be modified
119 β notifyCoverage();
β°ββββ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): Cannot modify local variables after render completes
ββ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
90 β const cardHeight = useSharedValue(0);
91 β const notifyCoverage = useCallback(() => {
Β· ββββ¬βββ
Β· β°ββ This function may (indirectly) reassign or modify `cardCoverage` after render
92 β if (!cardCoverage) {
93 β return;
94 β }
95 β const coverage = Math.max(0, cardHeightRef.current - barHeightRef.current);
96 β if (coverage === cardCoverage.value) {
97 β return;
98 β }
99 β if (cardCoverage.value === 0) {
100 β cardCoverage.value = coverage;
Β· βββββββ¬βββββ
Β· β°ββ This modifies `cardCoverage`
101 β return;
β°ββββ
help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): Cannot modify local variables after render completes
ββ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:100:7]
99 β if (cardCoverage.value === 0) {
100 β cardCoverage.value = coverage;
Β· βββββββ¬βββββ
Β· β°ββ This modifies `cardCoverage`
101 β return;
102 β }
103 β cardCoverage.value = withTiming(coverage, {
104 β duration: USER_INPUT_TOGGLE_DURATION_MS,
105 β easing: Easing.out(Easing.cubic),
106 β });
107 β }, [cardCoverage]);
108 β const handleBarLayout = useCallback(
109 β (event: LayoutChangeEvent) => {
Β· ββββββββββββββββ¬βββββββββββββββ
Β· β°ββ This function may (indirectly) reassign or modify `cardCoverage` after render
110 β barHeightRef.current = event.nativeEvent.layout.height;
β°ββββ
help: This argument is a function which may reassign or mutate `cardCoverage` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): Cannot modify local variables after render completes
ββ[apps/mobile/src/features/threads/PendingUserInputCard.tsx:118:7]
115 β const handleCardLayout = useCallback(
116 β (event: LayoutChangeEvent) => {
Β· ββββββββββββββββ¬βββββββββββββββ
Β· β°ββ This function may (indirectly) reassign or modify `cardHeight` after render
117 β cardHeightRef.current = event.nativeEvent.layout.height;
118 β cardHeight.value = event.nativeEvent.layout.height;
Β· ββββββ¬ββββ
Β· β°ββ This modifies `cardHeight`
119 β notifyCoverage();
β°ββββ
help: This argument is a function which may reassign or mutate `cardHeight` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5]
222 β let idlePasses = 0;
223 β βββΆ for (;;) {
224 β β yield* Effect.promise(() => Promise.resolve());
225 β β const pending = backgroundRuntime.pending.shift();
226 β β if (!pending) {
227 β β idlePasses++;
228 β β if (idlePasses >= 3) {
229 β β return;
230 β β }
231 β β continue;
232 β β }
233 β β idlePasses = 0;
234 β β const exit = yield* Effect.exit(
235 β β pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
236 β β );
237 β β yield* Effect.sync(() => {
238 β β pending.resolve(exit);
239 β β });
240 β β°ββΆ }
241 β },
β°ββββ
β react(immutability): This value cannot be modified
ββ[apps/mobile/src/features/threads/thread-work-log.tsx:174:5]
170 β const expandedAngle = props.collapsedDirection === "right" ? 90 : 180;
171 β const rotation = useSharedValue(props.expanded ? expandedAngle : 0);
Β· βββββ¬βββ
Β· β°ββ `rotation` originates here
172 β
173 β useLayoutEffect(() => {
174 β rotation.value = withTiming(props.expanded ? expandedAngle : 0, {
Β· βββββ¬βββ
Β· β°ββ `rotation` cannot be modified
175 β duration: THREAD_DISCLOSURE_TRANSITION_MS,
β°ββββ
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(no-array-index-key): Usage of Array index in keys is not allowed
ββ[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23]
1245 β <Text
1246 β key={`${index}:${line}`}
Β· ββββββββββββββββββββββββ
1247 β selectable
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β react(immutability): This value cannot be modified
ββ[apps/mobile/src/features/threads/floating-working-control.tsx:111:5]
107 β );
108 β const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0);
Β· ββββββββββ¬ββββββββ
Β· β°ββ `separationProgress` originates here
109 β
110 β useEffect(() => {
111 β separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING);
Β· ββββββββββ¬ββββββββ
Β· β°ββ `separationProgress` cannot be modified
112 β }, [props.showScrollToEnd, separationProgress]);
β°ββββ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): This value cannot be modified
ββ[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
128 β // and repeatedly retargets the animation as it grows.
129 β const capsuleWidth = useSharedValue<number | null>(null);
Β· βββββββ¬βββββ
Β· β°ββ `capsuleWidth` originates here
130 β const measuredWidthRef = useRef<number | null>(null);
131 β const handleLabelLayout = (event: LayoutChangeEvent) => {
132 β const width = event.nativeEvent.layout.width;
133 β if (width === measuredWidthRef.current) {
134 β return;
135 β }
136 β const first = measuredWidthRef.current === null;
137 β measuredWidthRef.current = width;
138 β capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
Β· βββββββ¬βββββ
Β· β°ββ `capsuleWidth` cannot be modified
139 β };
β°ββββ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): This value cannot be modified
ββ[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
128 β // and repeatedly retargets the animation as it grows.
129 β const capsuleWidth = useSharedValue<number | null>(null);
Β· βββββββ¬βββββ
Β· β°ββ `capsuleWidth` originates here
130 β const measuredWidthRef = useRef<number | null>(null);
131 β const handleLabelLayout = (event: LayoutChangeEvent) => {
132 β const width = event.nativeEvent.layout.width;
133 β if (width === measuredWidthRef.current) {
134 β return;
135 β }
136 β const first = measuredWidthRef.current === null;
137 β measuredWidthRef.current = width;
138 β capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
139 β };
140 β const hasStatus = props.status !== null;
141 β const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
142 β useEffect(() => {
143 β if (!hasStatus) {
144 β measuredWidthRef.current = null;
145 β capsuleWidth.value = null;
Β· βββββββ¬βββββ
Β· β°ββ `capsuleWidth` cannot be modified
146 β }
β°ββββ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): Cannot modify local variables after render completes
ββ[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
141 β const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
142 β useEffect(() => {
Β· ββββ¬βββ
Β· β°ββ This function may (indirectly) reassign or modify `capsuleWidth` after render
143 β if (!hasStatus) {
144 β measuredWidthRef.current = null;
145 β capsuleWidth.value = null;
Β· βββββββ¬βββββ
Β· β°ββ This modifies `capsuleWidth`
146 β }
β°ββββ
help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β react(immutability): Cannot modify local variables after render completes
ββ[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
130 β const measuredWidthRef = useRef<number | null>(null);
131 β const handleLabelLayout = (event: LayoutChangeEvent) => {
Β· ββββββββββββββββ¬βββββββββββββββ
Β· β°ββ This function may (indirectly) reassign or modify `capsuleWidth` after render
132 β const width = event.nativeEvent.layout.width;
133 β if (width === measuredWidthRef.current) {
134 β return;
135 β }
136 β const first = measuredWidthRef.current === null;
137 β measuredWidthRef.current = width;
138 β capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
Β· βββββββ¬βββββ
Β· β°ββ This modifies `capsuleWidth`
139 β };
β°ββββ
help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
β 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(purity): Cannot call impure function during render
ββ[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76]
696 β const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
697 β if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
698 β const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
β°ββββ
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
β react(purity): Cannot call impure function during render
ββ[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71]
717 β const snoozePresets = useMemo(
718 β () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
719 β [props.snoozePresetMinute, swipeActions.secondary],
β°ββββ
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(memo-dependencies): Found extra memoization dependencies
ββ[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6]
718 β () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
719 β [props.snoozePresetMinute, swipeActions.secondary],
Β· βββββββββββββ¬βββββββββββ
Β· β°ββ Unnecessary dependency `props.snoozePresetMinute`
720 β );
β°ββββ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(memo-dependencies): Found extra memoization dependencies
ββ[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7]
764 β thread.pinnedAt,
765 β variant,
Β· ββββ¬βββ
Β· β°ββ Unnecessary dependency `variant`
766 β ],
β°ββββ
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(no-array-index-key): Usage of Array index in keys is not allowed
ββ[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21]
1214 β {providerDrivers.slice(0, -1).map((driver, index) => (
1215 β <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
Β· ββββββββββββββββββββββββββ
1216 β <ProviderIcon provider={driver} size={12} />
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β 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): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used.
ββ[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10]
959 β
960 β function layerClaudeAgentSdkReplayQueryRunner(
Β· βββββββββββββββββββ¬βββββββββββββββββ
Β· β°ββ 'layerClaudeAgentSdkReplayQueryRunner' is declared here
961 β transcript: ClaudeAgentSdkReplayTranscript,
β°ββββ
help: Consider removing this declaration.
β eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7]
1443 β
1444 β const layerCodexAppServerClientFactoryCommand = (
Β· ββββββββββββββββββββ¬βββββββββββββββββββ
Β· β°ββ 'layerCodexAppServerClientFactoryCommand' is declared here
1445 β options: CodexClient.CodexAppServerClientOptions & {
β°ββββ
help: Consider removing this declaration.
β eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7]
1679 β
1680 β const layer: Layer.Layer<
Β· βββ¬ββ
Β· β°ββ 'layer' is declared here
1681 β ProviderAdapter.ProviderAdapterV2,
β°ββββ
help: Consider removing this declaration.
β react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
ββ[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:370:7]
369 β mountedRef.current = false;
370 β flow.setBranchQuery("");
Β· βββ¬β
Β· β°ββ Missing dependency `flow`
371 β };
372 β }, [flow.setBranchQuery]);
Β· ββββββββββ¬βββββββββ
Β· β°ββ Overly precise dependency `flow.setBranchQuery`, use `flow` instead
373 β
β°ββββ
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): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
ββ[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
60 β ) {
61 β const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
Β· βββββββ¬ββββββ
Β· β°ββ 'useDragRegion' is declared here
62 β const isInline = props.mode === "inline";
β°ββββ
help: Consider removing this declaration.
β eslint(no-empty-pattern): Empty object binding pattern
ββ[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14]
465 β
466 β for (const {} of ["direct", "wrapper"] as const) {
Β· ββ
467 β }
β°ββββ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
β unicorn(no-new-array): Do not use `new Array(singleArgument)`.
ββ[apps/web/src/terminal/ghostty/core.ts:194:19]
193 β const count = Math.min(CHUNK_SIZE, graphemeLength - start);
194 β const codes = new Array<number>(count);
Β· ββββββββββββββββββββββββ
195 β for (let index = 0; index < count; index += 1) {
β°ββββ
help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`.
β unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
ββ[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15]
1997 β assert.equal(
1998 β items.filter((item) => item.type === "assistant_message").at(-1)?.text,
Β· ββββββ
1999 β "authoritative answer",
β°ββββ
help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7]
3950 β const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped);
3951 β βββΆ while (!responseLifecycle.includes("failed")) {
3952 β β yield* Effect.yieldNow;
3953 β β°ββΆ }
3954 β const responseExit = yield* Fiber.join(responseFiber);
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9]
6061 β .pipe(Effect.forkScoped);
6062 β βββΆ while (promptGates.length < 1) {
6063 β β yield* Effect.yieldNow;
6064 β β°ββΆ }
6065 β assert.isDefined(sessionUpdateHandler, "session update handler must be wired");
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9]
6196 β .pipe(Effect.forkScoped);
6197 β βββΆ while (promptGates.length < 2) {
6198 β β yield* Effect.yieldNow;
6199 β β°ββΆ }
6200 β if (sessionUpdateHandler === undefined || capturedMutation.current === null) {
β°ββββ
β eslint(no-empty-pattern): Empty object binding pattern
ββ[apps/server/src/processRunner.test.ts:266:14]
265 β
266 β for (const {} of ["timeout", "success"] as const) {
Β· ββ
267 β }
β°ββββ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
β eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining
ββ[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8]
1782 β assert.equal(
1783 β (stored.context?.records[0] as { attachmentId: string }).attachmentId,
Β· ββββββββββββββββββββββββββ
1784 β stored.attachments[0]?.id,
β°ββββ
help: If this short-circuits with 'undefined' the evaluation will throw TypeError
β eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10566:7]
10565 β
10566 β const layer: Layer.Layer<
Β· βββ¬ββ
Β· β°ββ 'layer' is declared here
10567 β ProviderAdapter.ProviderAdapterV2,
β°ββββ
help: Consider removing this declaration.
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70]
554 β assert.deepStrictEqual(
555 β (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest),
Β· β¬
Β· β°ββ '_' is declared here
556 β [
β°ββββ
help: Consider removing this parameter.
β eslint(no-unused-vars): Parameter '_' is declared but never used.
ββ[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70]
1154 β assert.deepStrictEqual(
1155 β (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest),
Β· β¬
Β· β°ββ '_' is declared here
1156 β [
β°ββββ
help: Consider removing this parameter.
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7]
565 β let afterSequence = created[0]!.sequence;
566 β βββΆ for (let index = 1; index <= 32; index += 1) {
567 β β const nextEvent = {
568 β β id: EventId.make(`event:foundation-stream-race:${index}`),
569 β β type: "thread.metadata-updated" as const,
570 β β threadId,
571 β β providerInstanceId,
572 β β occurredAt: now,
573 β β payload: { ...thread, title: `Race update ${index}` },
574 β β } satisfies OrchestrationV2DomainEvent;
575 β β const reader = yield* eventSink
576 β β .stream({ threadId, afterSequence })
577 β β .pipe(Stream.runHead, Effect.forkChild);
578 β β yield* Effect.yieldNow;
579 β β const written = yield* eventSink.write({ events: [nextEvent] });
580 β β const received = yield* Fiber.join(reader);
581 β β if (Option.isNone(received)) {
582 β β return yield* Effect.die("The event stream ended before delivering the live event.");
583 β β }
584 β β assert.equal(received.value.sequence, written[0]?.sequence);
585 β β assert.equal(received.value.event.id, nextEvent.id);
586 β β afterSequence = received.value.sequence;
587 β β°ββΆ }
588 β }),
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9]
2326 β let settled = false;
2327 β βββΆ while (!settled) {
2328 β β settled = (yield* outbox.listByCommandId(commandId)).every(
2329 β β (effect) => effect.status === "succeeded",
2330 β β );
2331 β β if (!settled) yield* Effect.yieldNow;
2332 β β°ββΆ }
2333 β }).pipe(Effect.provide(layerWorker), Effect.scoped);
β°ββββ
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38]
121 β const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
122 β const audioLevels = useSharedValue(audioLevelsRef.current);
Β· ββββββββββββ¬ββββββββββ
Β· β°ββ Cannot access ref value during render
123 β const sessionRef = useRef<VoiceInputSession | null>(null);
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8]
125 β
126 β if (!sessionRef.current || !recorderRef.current) {
Β· ββββββββββ¬ββββββββ
Β· β°ββ Cannot access ref value during render
127 β const recorder = createLazyVoiceRecorder({
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7]
125 β
126 β if (!sessionRef.current || !recorderRef.current) {
Β· ββββββββββ¬βββββββββ
Β· β°ββ Cannot access ref value during render
127 β const recorder = createLazyVoiceRecorder({
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31]
125 β
126 β if (!sessionRef.current || !recorderRef.current) {
Β· ββββββββββ¬βββββββββ
Β· β°ββ Cannot access ref value during render
127 β const recorder = createLazyVoiceRecorder({
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30]
125 β
126 β if (!sessionRef.current || !recorderRef.current) {
Β· βββββββββββ¬βββββββββ
Β· β°ββ Cannot access ref value during render
127 β const recorder = createLazyVoiceRecorder({
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46]
126 β if (!sessionRef.current || !recorderRef.current) {
127 β βββΆ const recorder = createLazyVoiceRecorder({
128 β β create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
129 β β onStatus: (status: RecordingStatus) => {
130 β β sessionRef.current?.controller.handleRecorderStatus({
131 β β isFinished: status.isFinished,
132 β β hasError: status.hasError || status.mediaServicesDidReset === true,
133 β β error: status.error,
134 β β url: status.url,
135 β β });
136 β β },
137 β β // Read when recording starts so preference changes do not re-render every composer.
138 β β selectInput: (inputs) => {
139 β β const preferences = registry.get(mobilePreferencesAtom);
140 β β if (!AsyncResult.isSuccess(preferences)) return null;
141 β β const known = microphoneOrder(preferences.value.microphones);
142 β β const order = rememberMicrophones(known, inputs);
143 β β if (order !== known) {
144 β β registry.set(updateMobilePreferencesAtom, {
145 β β transform: (current) => ({
146 β β microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
147 β β }),
148 β β });
149 β β }
150 β β return preferredMicrophoneInput(inputs, order);
151 β β },
152 β βββΆ });
Β· β°ββββ Passing a ref to a function may read its value during render
153 β recorderRef.current = recorder;
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16]
152 β });
153 β recorderRef.current = recorder;
Β· ββββββ¬ββββββββββ¬βββ
Β· β β°ββ Cannot update ref value during render
Β· β°ββ This value is a ref
154 β sessionRef.current = new VoiceInputSession({
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48]
153 β recorderRef.current = recorder;
154 β βββΆ sessionRef.current = new VoiceInputSession({
155 β β recorder,
156 β β getTranscriber: getLocalVoiceTranscriber,
157 β β requestPermission: async () => {
158 β β const permission = await requestRecordingPermissionsAsync();
159 β β return { granted: permission.granted, canAskAgain: permission.canAskAgain };
160 β β },
161 β β configureRecording: configureVoiceRecordingAudio,
162 β β releaseRecording: releaseVoiceRecordingAudio,
163 β β deleteRecording: (uri) => new File(uri).delete(),
164 β β onStateChange: (nextState) =>
165 β β setState({
166 β β state: nextState,
167 β β ownerKey: sessionRef.current?.ownerKey ?? null,
168 β β label: sessionRef.current?.label ?? null,
169 β β }),
170 β βββΆ });
Β· β°ββββ Cannot access ref value during render
171 β }
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15]
153 β recorderRef.current = recorder;
154 β sessionRef.current = new VoiceInputSession({
Β· ββββββ¬βββββββββ¬βββ
Β· β β°ββ Cannot update ref value during render
Β· β°ββ This value is a ref
155 β recorder,
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7]
184 β return () => subscription.remove();
185 β }, [controller]);
Β· ββββββ¬ββββ
Β· β°ββ Cannot access ref value during render
186 β
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6]
184 β return () => subscription.remove();
185 β }, [controller]);
Β· βββββββ¬βββββ
Β· β°ββ Cannot access ref value during render
186 β
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6]
191 β },
192 β [controller, recorder],
Β· ββββββ¬ββββ
Β· β°ββ Cannot access ref value during render
193 β );
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20]
174 β const controller = session.controller;
175 β const recorder = recorderRef.current;
Β· ββββββββββ¬βββββββββ
Β· β°ββ Cannot access ref value during render
176 β
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5]
191 β },
192 β [controller, recorder],
Β· ββββββββββββ¬ββββββββββ
Β· β°ββ Cannot access ref value during render
193 β );
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20]
245 β return () => clearInterval(intervalId);
246 β }, [audioLevels, controller, recorder, state.phase]);
Β· ββββββ¬ββββ
Β· β°ββ Cannot access ref value during render
247 β
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6]
245 β return () => clearInterval(intervalId);
246 β }, [audioLevels, controller, recorder, state.phase]);
Β· βββββββββββββββββββββββββ¬βββββββββββββββββββββββ
Β· β°ββ Cannot access ref value during render
247 β
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5]
260 β setOwnerFocused,
261 β session,
Β· ββββ¬βββ
Β· β°ββ Cannot access ref value during render
262 β stop,
β°ββββ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
β react(refs): Cannot access refs during render
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10]
250 β
251 β βββΆ return {
252 β β isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null,
253 β β state,
254 β β audioLevels,
255 β β elapsedSeconds,
256 β β isBusy: voiceInputBlocksSubmission(state),
257 β β ownerKey,
258 β β label,
259 β β focusedOwners,
260 β β setOwnerFocused,
261 β β session,
262 β β stop,
263 β β cancel,
264 β βββΆ };
Β· β°ββββ Cannot access ref value during render
265 β }
β°ββββ
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(immutability): This value cannot be modified
ββ[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
121 β const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
122 β const audioLevels = useSharedValue(audioLevelsRef.current);
Β· ββββββ¬βββββ
Β· β°ββ `audioLevels` originates here
123 β const sessionRef = useRef<VoiceInputSession | null>(null);
124 β const recorderRef = useRef<LazyVoiceRecorder<RecorderState> | null>(null);
125 β
126 β if (!sessionRef.current || !recorderRef.current) {
127 β const recorder = createLazyVoiceRecorder({
128 β create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
129 β onStatus: (status: RecordingStatus) => {
130 β sessionRef.current?.controller.handleRecorderStatus({
131 β isFinished: status.isFinished,
132 β hasError: status.hasError || status.mediaServicesDidReset === true,
133 β error: status.error,
134 β url: status.url,
135 β });
136 β },
137 β // Read when recording starts so preference changes do not re-render every composer.
138 β selectInput: (inputs) => {
139 β const preferences = registry.get(mobilePreferencesAtom);
140 β if (!AsyncResult.isSuccess(preferences)) return null;
141 β const known = microphoneOrder(preferences.value.microphones);
142 β const order = rememberMicrophones(known, inputs);
143 β if (order !== known) {
144 β registry.set(updateMobilePreferencesAtom, {
145 β transform: (current) => ({
146 β microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
147 β }),
148 β });
149 β }
150 β return preferredMicrophoneInput(inputs, order);
151 β },
152 β });
153 β recorderRef.current = recorder;
154 β sessionRef.current = new VoiceInputSession({
155 β recorder,
156 β getTranscriber: getLocalVoiceTranscriber,
157 β requestPermission: async () => {
158 β const permission = await requestRecordingPermissionsAsync();
159 β return { granted: permission.granted, canAskAgain: permission.canAskAgain };
160 β },
161 β configureRecording: configureVoiceRecordingAudio,
162 β releaseRecording: releaseVoiceRecordingAudio,
163 β deleteRecording: (uri) => new File(uri).delete(),
164 β onStateChange: (nextState) =>
165 β setState({
166 β state: nextState,
167 β ownerKey: sessionRef.current?.ownerKey ?? null,
168 β label: sessionRef.current?.label ?? null,
169 β }),
170 β });
171 β }
172 β
173 β const session = sessionRef.current;
174 β const controller = session.controller;
175 β const recorder = recorderRef.current;
176 β
177 β useEffect(() => {
178 β const subscription = AppState.addEventListener("change", (nextState) => {
179 β // iOS reports `inactive` while its permission dialog is open. Only the
180 β // real background state cancels preparation; recorder status handles
181 β // calls and route interruptions during capture.
182 β if (nextState === "background") controller.appMovedToBackground();
183 β });
184 β return () => subscription.remove();
185 β }, [controller]);
186 β
187 β useEffect(
188 β () => () => {
189 β controller.dispose();
190 β recorder.release();
191 β },
192 β [controller, recorder],
193 β );
194 β
195 β useEffect(() => {
196 β if (state.phase !== "recording") return;
197 β
198 β const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`;
199 β const activation = activateKeepAwakeAsync(tag);
200 β void activation.catch(() => {});
201 β return () => {
202 β // Release after activation settles, even if the recording ends immediately.
203 β void activation.then(() => deactivateKeepAwake(tag)).catch(() => {});
204 β };
205 β }, [keepAwakeId, state.phase]);
206 β
207 β useEffect(() => {
208 β if (state.phase !== "preparing" && state.phase !== "recording") return;
209 β
210 β if (audioLevelsRef.current.some((level) => level !== 0)) {
211 β audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
212 β audioLevels.value = audioLevelsRef.current;
Β· ββββββ¬βββββ
Β· β°ββ `audioLevels` cannot be modified
213 β }
β°ββββ
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/voice-input/VoiceInputProvider.tsx:212:7]
206 β
207 β useEffect(() => {
Β· ββββ¬βββ
Β· β°ββ This function may (indirectly) reassign or modify `audioLevels` after render
208 β if (state.phase !== "preparing" && state.phase !== "recording") return;
209 β
210 β if (audioLevelsRef.current.some((level) => level !== 0)) {
211 β audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
212 β audioLevels.value = audioLevelsRef.current;
Β· ββββββ¬βββββ
Β· β°ββ This modifies `audioLevels`
213 β }
β°ββββ
help: This argument is a function which may reassign or mutate `audioLevels` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
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/voice-input/ComposerDictationControl.tsx:93:5]
90 β }) {
91 β const rotation = useSharedValue(props.hidden ? 1 : 0);
Β· βββββ¬βββ
Β· β°ββ `rotation` originates here
92 β useLayoutEffect(() => {
93 β rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING);
Β· βββββ¬βββ
Β· β°ββ `rotation` cannot be modified
94 β }, [props.hidden, rotation]);
β°ββββ
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/voice-input/ComposerDictationControl.tsx:269:5]
266 β const variant = props.variant ?? "plain";
267 β const loadingVisibility = useSharedValue(props.loading ? 1 : 0);
Β· βββββββββ¬ββββββββ
Β· β°ββ `loadingVisibility` originates here
268 β useLayoutEffect(() => {
269 β loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING);
Β· βββββββββ¬ββββββββ
Β· β°ββ `loadingVisibility` cannot be modified
270 β }, [loadingVisibility, props.loading]);
β°ββββ
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/voice-input/ComposerDictationControl.tsx:328:5]
325 β }) {
326 β const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0);
Β· ββββββββββ¬βββββββββ
Β· β°ββ `recordingVisibility` originates here
327 β useLayoutEffect(() => {
328 β recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING);
Β· ββββββββββ¬βββββββββ
Β· β°ββ `recordingVisibility` cannot be modified
329 β }, [props.phase, recordingVisibility]);
β°ββββ
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
β 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.
β react(immutability): This value cannot be modified
ββ[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
65 β const [expanded, setExpanded] = useState(false);
66 β const progress = useSharedValue(0);
Β· βββββ¬βββ
Β· β°ββ `progress` originates here
67 β useEffect(() => {
68 β progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
Β· βββββ¬βββ
Β· β°ββ `progress` cannot be modified
69 β }, [expanded, progress]);
β°ββββ
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
β eslint(no-empty-pattern): Empty object binding pattern
ββ[apps/server/src/process/externalLauncher.test.ts:186:12]
185 β
186 β for (const {} of ["darwin", "linux"] as const) {
Β· ββ
187 β }
β°ββββ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
β eslint(no-empty-pattern): Empty object binding pattern
ββ[apps/server/src/process/externalLauncher.test.ts:189:12]
188 β
189 β for (const {} of [
Β· ββ
190 β { kind: "browser", folderVerb: "none" },
β°ββββ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
β eslint(no-empty-pattern): Empty object binding pattern
ββ[apps/server/src/process/externalLauncher.test.ts:311:12]
310 β
311 β for (const {} of ["rejected", "spawn-error", "stalled"] as const) {
Β· ββ
312 β }
β°ββββ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
β eslint(no-empty-pattern): Empty object binding pattern
ββ[apps/server/src/process/externalLauncher.test.ts:314:12]
313 β
314 β for (const {} of [
Β· ββ
315 β {
β°ββββ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
β eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/orchestration-v2/EffectWorker.ts:914:7]
913 β
914 β const layerDaemon: Layer.Layer<never, never, OrchestrationEffectWorkerV2> = Layer.effectDiscard(
Β· ββββββ¬βββββ
Β· β°ββ 'layerDaemon' is declared here
915 β runDaemon.pipe(Effect.forkScoped),
β°ββββ
help: Consider removing this declaration.
β eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
ββ[apps/server/src/provider/AntigravityAuth.ts:285:20]
284 β },
285 β (effect, flow, stopSessions) =>
Β· βββββββ¬βββββ
Β· β°ββ 'stopSessions' is declared here
286 β effect.pipe(
β°ββββ
help: Consider removing this parameter.
β eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:408:7]
407 β
408 β const layer = Layer.effect(ThreadPullRequestServiceV2, make);
Β· βββ¬ββ
Β· β°ββ 'layer' is declared here
β°ββββ
help: Consider removing this declaration.
β eslint(no-unused-vars): Function 'describeSchedule' is declared but never used.
ββ[apps/server/src/scheduledTasks/Schedule.ts:79:10]
78 β
79 β function describeSchedule(schedule: ScheduledTaskSchedule): string {
Β· βββββββββ¬βββββββ
Β· β°ββ 'describeSchedule' is declared here
80 β if (schedule.type === "webhook") return "On webhook";
β°ββββ
help: Consider removing this declaration.
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
520 β })).delivery;
521 β βββΆ while (delivery.outcome === "accepted") {
522 β β yield* Effect.yieldNow;
523 β β delivery = (yield* service.getWebhookDelivery({
524 β β id: task.id,
525 β β deliveryId: deliveryId!,
526 β β })).delivery;
527 β β°ββΆ }
528 β assert.equal(delivery.outcome, "dispatch_failed");
β°ββββ
β 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:263:20]
262 β ...(update._meta !== undefined
263 β ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null }
Β· βββββββββ
264 β : {}),
β°ββββ
β eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7]
345 β
346 β const layerFromProviderAdapter: Layer.Layer<
Β· βββββββββββββ¬βββββββββββ
Β· β°ββ 'layerFromProviderAdapter' is declared here
347 β ProviderAdapterRegistryV2,
β°ββββ
help: Consider removing this declaration.
β t3code(no-inline-schema-compile): Hoist Schema.encodeUnknownSync(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
ββ[packages/contracts/src/composerContext.test.ts:181:18]
180 β it("sends a message without the records the wire cannot carry", () => {
181 β const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({
Β· ββββββββββββββββββββββββ
182 β version: 1,
β°ββββ
β eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/orchestration-v2/Orchestrator.ts:12316:7]
12315 β
12316 β const layerUnavailable: Layer.Layer<OrchestratorV2> = Layer.succeed(
Β· βββββββββ¬βββββββ
Β· β°ββ 'layerUnavailable' is declared here
12317 β OrchestratorV2,
β°ββββ
help: Consider removing this declaration.
β 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.
β 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-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
ββ[apps/server/src/auth/RpcAuthorization.ts:236:17]
235 β const requiredScopesForSettingsUpdate = (payload: unknown) => {
236 β const input = Schema.decodeUnknownSync(SettingsUpdate)(payload);
Β· ββββββββββββββββββββββββ
237 β const scopes = requiredScopesForServerSettingsPatch(input.patch);
β°ββββ
β t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
ββ[apps/server/src/auth/RpcAuthorization.ts:255:26]
254 β if (method === WS_METHODS.assetsCreateUrl) {
255 β const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload);
Β· ββββββββββββββββββββββββ
256 β return [
β°ββββ
β eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/serverRuntimeStartup.ts:728:7]
727 β
728 β const layer = layerWithOptions();
Β· βββ¬ββ
Β· β°ββ 'layer' is declared here
β°ββββ
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.
β unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
ββ[packages/client-runtime/src/operations/projects.ts:228:51]
227 β ): string {
228 β const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? "";
Β· ββββββ
229 β return target.owner ? `${target.owner}/${folderName}` : folderName;
β°ββββ
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/src/features/terminal/TerminalContextSheet.tsx:72:15]
71 β <Pressable
72 β key={index}
Β· βββββββββββ
73 β accessibilityRole="button"
β°ββββ
help: Use a unique data-dependent key to avoid unnecessary rerenders
β 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.`);
β°ββββ
β 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:139:5]
138 β Effect.gen(function* () {
139 β βββΆ while (fiber.pollUnsafe() === undefined) {
140 β β yield* TestClock.adjust("100 millis");
141 β β // 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
142 β β yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve)));
143 β β°ββΆ }
144 β return yield* Fiber.join(fiber);
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[packages/client-runtime/src/rpc/client.test.ts:131:9]
130 β ) {
131 β βββΆ for (let attempt = 0; attempt < 100; attempt += 1) {
132 β β if (subscriptions.length >= count) {
133 β β return;
134 β β }
135 β β yield* Effect.yieldNow;
136 β β°ββΆ }
137 β return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`));
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[packages/client-runtime/src/rpc/client.test.ts:252:7]
251 β yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient)));
252 β βββΆ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) {
253 β β yield* Effect.yieldNow;
254 β β°ββΆ }
255 β yield* SubscriptionRef.set(activeSession, Option.none());
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[packages/client-runtime/src/rpc/client.test.ts:258:7]
257 β
258 β βββΆ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
259 β β yield* Effect.yieldNow;
260 β β°ββΆ }
261 β yield* Fiber.interrupt(subscriptionFiber);
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[packages/client-runtime/src/rpc/client.test.ts:322:7]
321 β );
322 β βββΆ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) {
323 β β yield* Effect.yieldNow;
324 β β°ββΆ }
325 β
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[packages/client-runtime/src/rpc/client.test.ts:330:7]
329 β yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient)));
330 β βββΆ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
331 β β yield* Effect.yieldNow;
332 β β°ββΆ }
333 β yield* Fiber.interrupt(subscriptionFiber);
β°ββββ
β t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
ββ[packages/effect-acp/src/schema.test.ts:18:12]
17 β const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } };
18 β expect(Schema.is(V1.AvailableCommand)(command)).toBe(true);
Β· βββββββββ
19 β expect(
β°ββββ
β t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
ββ[packages/effect-acp/src/schema.test.ts:20:7]
19 β expect(
20 β Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }),
Β· βββββββββ
21 β ).toBe(true);
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[packages/client-runtime/src/rpc/session.test.ts:226:3]
225 β ) {
226 β βββΆ for (let attempt = 0; attempt < 100; attempt += 1) {
227 β β const socket = sockets[index];
228 β β if (socket) {
229 β β return socket;
230 β β }
231 β β yield* Effect.yieldNow;
232 β β°ββΆ }
233 β return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket."));
β°ββββ
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[packages/client-runtime/src/rpc/session.test.ts:240:3]
239 β ) {
240 β βββΆ for (let attempt = 0; attempt < 100; attempt += 1) {
241 β β const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index];
242 β β if (request) {
243 β β return request;
244 β β }
245 β β yield* Effect.yieldNow;
246 β β°ββΆ }
247 β return yield* Effect.die(new Error("Expected the RPC protocol to send a request."));
β°ββββ
β 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:32]
1740 β const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5");
1741 β const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
Β· βββββββββββββββββββ
1742 β 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:1742:34]
1741 β const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
1742 β const scriptsJson = yield* Schema.encodeEffect(
Β· βββββββββββββββββββ
1743 β Schema.fromJsonString(Schema.Array(ProjectScript)),
β°ββββ
β t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
ββ[packages/effect-acp/src/protocol.test.ts:500:31]
499 β
500 β const response = yield* Schema.decodeUnknownEffect(
Β· ββββββββββββββββββββββββββ
501 β Schema.fromJsonString(JsonRpcErrorResponse),
β°ββββ
β t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
ββ[packages/effect-acp/src/client.ts:1269:11]
1268 β extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
1269 β Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
Β· ββββββββββββββββββββββββββ
1270 β Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
β°ββββ
β 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({
β°ββββ
β 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 β import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl";
β°ββββ
help: Remove empty braces
β eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/telemetry/AnalyticsService.ts:340:7]
339 β
340 β const layerTest = AnalyticsService.layerTest;
Β· βββββ¬ββββ
Β· β°ββ 'layerTest' is declared here
β°ββββ
help: Consider removing this declaration.
β eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/usage/UsageService.ts:169:7]
168 β
169 β const layerTest = Layer.succeed(
Β· βββββ¬ββββ
Β· β°ββ 'layerTest' is declared here
170 β UsageService,
β°ββββ
help: Consider removing this declaration.
β t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
ββ[apps/server/src/usage/UsageService.test.ts:2383:7]
2382 β let orphanedAt: number | undefined;
2383 β βββΆ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) {
2384 β β const tasks: Array<() => void> = [];
2385 β β const dispatcher: Scheduler.SchedulerDispatcher = {
2386 β β scheduleTask: (task) => tasks.push(task),
2387 β β flush: () => {
2388 β β let task: (() => void) | undefined;
2389 β β while ((task = tasks.shift()) !== undefined) task();
2390 β β },
2391 β β };
2392 β β
2393 β β let requestFiber: Fiber.Fiber<unknown, unknown> | undefined;
2394 β β let requestChecks = 0;
2395 β β const scheduler: Scheduler.Scheduler = {
2396 β β executionMode: "async",
2397 β β makeDispatcher: () => dispatcher,
2398 β β shouldYield: (fiber) => {
2399 β β if (fiber !== requestFiber) return false;
2400 β β requestChecks += 1;
2401 β β if (requestChecks !== interruptAt) return false;
2402 β β fiber.interruptUnsafe();
2403 β β return true;
2404 β β },
2405 β β };
2406 β β
2407 β β const input: UsageSummaryInput = {
2408 β β ...WINDOW,
2409 β β sinceDay: UsageDay.make("2026-09-01"),
2410 β β untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`),
2411 β β };
2412 β β const first = yield* service
2413 β β .readSummary(input)
2414 β β .pipe(
2415 β β Effect.exit,
2416 β β Effect.provideService(Scheduler.Scheduler, scheduler),
2417 β β Effect.forkChild,
2418 β β );
2419 β β requestFiber = first;
2420 β β yield* Effect.yieldNow;
2421 β β dispatcher.flush();
2422 β β
2423 β β const second = yield* service.readSummary(input).pipe(
2424 β β Effect.match({
2425 β β onFailure: (error) => error.reason,
2426 β β onSuccess: () => "success" as const,
2427 β β }),
2428 β β Effect.provideService(Scheduler.Scheduler, scheduler),
2429 β β Effect.forkChild,
2430 β β );
2431 β β yield* Effect.yieldNow;
2432 β β dispatcher.flush();
2433 β β const secondExit = second.pollUnsafe();
2434 β β if (secondExit === undefined) {
2435 β β second.interruptUnsafe();
2436 β β orphanedAt = interruptAt;
2437 β β break;
2438 β β }
2439 β β if (Exit.isFailure(secondExit)) {
2440 β β assert.fail("the matching request fiber was interrupted");
2441 β β }
2442 β β assert.strictEqual(secondExit.value, "invalidWindow");
2443 β β°ββΆ }
2444 β
β°ββββ
β 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.
β unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
ββ[apps/web/src/components/chat/useComposerSend.ts:985:13]
984 β const changedBeforeDecline = draftChangedSinceSend();
985 β βββΆ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map(
986 β β (approval) => approval.requestId,
987 β β°ββΆ );
988 β const approvalResponding = approvalsToDecline.some((approval) =>
β°ββββ
help: Switch to `Set`
β 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.
β 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.
β react(memo-dependencies): Found extra memoization dependencies
ββ[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85]
99 β const startEditor = startScheduledTaskEditor;
100 β const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]);
Β· ββββββ¬βββββ
Β· β°ββ Unnecessary dependency `startEditor`
101 β const readEditor = useCallback(
β°ββββ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(memo-dependencies): Found extra memoization dependencies
ββ[apps/mobile/src/features/settings/scheduled-task-editor.tsx:121:7]
120 β setEditor,
121 β startEditor,
Β· ββββββ¬βββββ
Β· β°ββ Unnecessary dependency `startEditor`
122 β hasChanges,
β°ββββ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
β react(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): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'.
ββ[apps/server/src/mcp/McpSessionRegistry.ts:218:7]
217 β
218 β const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect<void> =>
Β· βββββββββββ¬ββββββββββ
Β· β°ββ 'revokeActiveMcpThread' is declared here
219 β 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:221:7]
220 β
221 β const revokeAllActiveMcpCredentials = (): Effect.Effect<void> =>
Β· βββββββββββββββ¬ββββββββββββββ
Β· β°ββ 'revokeAllActiveMcpCredentials' is declared here
222 β activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void;
β°ββββ
help: Consider removing this declaration.
β eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'.
ββ[packages/provider-cursor/src/server/credentialStore.test.ts:15:7]
14 β
15 β const legacyCredentials = {
Β· βββββββββ¬ββββββββ
Β· β°ββ 'legacyCredentials' is declared here
16 β version: 1 as const,
β°ββββ
help: Consider removing this declaration.
β eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
ββ[packages/provider-cursor/src/server/auth.ts:249:20]
248 β },
249 β (effect, flow, stopSessions) =>
Β· βββββββ¬βββββ
Β· β°ββ 'stopSessions' is declared here
250 β effect.pipe(
β°ββββ
help: Consider removing this parameter.
β react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
ββ[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5]
112 β const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate }));
113 β useEffect(() => {
Β· βββββ¬ββββ
Β· β°ββ This is the containing effect
114 β if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) {
115 β return;
116 β }
117 β setEntry({ key: input.targetKey, location: candidate });
Β· βββββ¬βββ
Β· β°ββ Avoid calling setState() directly within an effect
118 β }, [candidate, entry.key, entry.location, input.targetKey]);
β°ββββ
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(static-components): Cannot create components during render
ββ[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
196 β const { onInput, onResize } = props;
197 β const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
Β· βββββββββββββββββ¬βββββββββββββββ
Β· β°ββ The component is created during render here
198 β const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
199 β
200 β useEffect(() => {
201 β terminalDebugLog("native:surface", {
202 β terminalKey: props.terminalKey,
203 β native: hasNativeSurface,
204 β hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
205 β bufferLen: props.buffer.length,
206 β isRunning: props.isRunning,
207 β });
208 β }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
209 β const handleNativeInput = useCallback(
210 β (event: NativeSyntheticEvent<TerminalInputEvent>) => {
211 β if (!props.isRunning || props.readOnly) {
212 β return;
213 β }
214 β terminalDebugLog("native:onInput", {
215 β codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
216 β });
217 β onInput(event.nativeEvent.data);
218 β },
219 β [onInput, props.isRunning, props.readOnly],
220 β );
221 β const handleNativeResize = useCallback(
222 β (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
223 β onResize({
224 β cols: event.nativeEvent.cols,
225 β rows: event.nativeEvent.rows,
226 β });
227 β },
228 β [onResize],
229 β );
230 β
231 β if (NativeTerminalSurfaceView) {
232 β return (
233 β <View style={props.style}>
234 β <NativeTerminalSurfaceView
Β· βββββββββββββ¬ββββββββββββ
Β· β°ββ This component is created during render
235 β appearanceScheme={themeAppearance}
β°ββββ
help: Components created during render will reset their state each time they are created. Declare components outside of render
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
β react(purity): Cannot call impure function during render
ββ[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58]
177 β if (snoozeClockState.shell !== activeThreadShell) {
178 β setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() });
Β· ββββββ¬ββββ
Β· β°ββ Cannot call impure function
179 β }
β°ββββ
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
Found 0 errors and 358 warnings in 5404 files (4.8s, 8 threads)
Post job cleanup.
Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
Post job cleanup.
##[start-action display=Cache full pnpm store;id=__cb7f31f0-6d71-4ba4-9d6c-754c6fbafe13.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-00e587c1edf31fe669c96bc4768c0e07a969fff8e8228235fb75ec6c0abf4161, not saving cache.
##[end-action id=__cb7f31f0-6d71-4ba4-9d6c-754c6fbafe13.__actions_cache;outcome=success;conclusion=success;duration_ms=93]
##[start-action display=Cache Vite+;id=__cb7f31f0-6d71-4ba4-9d6c-754c6fbafe13.vp_cache]
Post job cleanup.
Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache.
##[end-action id=__cb7f31f0-6d71-4ba4-9d6c-754c6fbafe13.vp_cache;outcome=success;conclusion=success;duration_ms=63]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/89c07976-cca3-4eee-b32a-7f815e75422f' 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: 224
BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 399
BLACKSMITH_CHECK_RUN_ID: 120286090319
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