GitHub check
256 KB of 597 KB loaded Download the full log (597 KB)
341 KB of earlier output not loaded
6-10-24T06:23:36.8254225Z ยท โโโโฌโโโ
ยท โฐโโ From this spread
194 โ }
โฐโโโโ
help: Consider using `Object.assign()` to mutate the accumulator instead.
note: Using spreads within accumulators leads to `O(n^2)` time complexity.
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/review/ReviewSheet.tsx:454:7]
453 โ showAuxiliaryPane("inspector");
454 โ }, [environmentId, showAuxiliaryPane, threadId]);
ยท โโโโโโโฌโโโโโโ โโโโโฌโโโ
ยท โ โฐโโ Unnecessary dependency `threadId`
ยท โฐโโ Unnecessary dependency `environmentId`
455 โ const {
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(static-components): Cannot create components during render
โญโ[apps/mobile/src/features/review/ReviewSheet.tsx:725:20]
492 โ // same check.
493 โ const NativeReviewDiffView = resolveNativeReviewDiffView();
ยท โโโโโโโโโโโโโโฌโโโโโโโโโโโโโ
ยท โฐโโ The component is created during render here
494 โ const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
495 โ const showcasedReviewDrawRef = useRef<string | null>(null);
496 โ const [isPullRefreshing, setIsPullRefreshing] = useState(false);
497 โ const handlePullToRefresh = async () => {
498 โ setIsPullRefreshing(true);
499 โ await refreshSelectedSection();
500 โ setIsPullRefreshing(false);
501 โ };
502 โ const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
503 โ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
504 โ const fileVisibility = useReviewFileVisibility({
505 โ threadKey: reviewCache.threadKey,
506 โ sectionId: selectedSection?.id ?? null,
507 โ files: reviewFiles,
508 โ cachedExpandedFileIds: selectedSection?.id
509 โ ? reviewCache.expandedFileIdsBySection[selectedSection.id]
510 โ : undefined,
511 โ cachedViewedFileIds: selectedSection?.id
512 โ ? reviewCache.viewedFileIdsBySection[selectedSection.id]
513 โ : undefined,
514 โ });
515 โ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
516 โ const commentSelection = useReviewCommentSelectionController({
517 โ environmentId,
518 โ threadId,
519 โ selectedSection,
520 โ nativeReviewDiffData,
521 โ });
522 โ const nativeBridge = useNativeReviewDiffBridge({
523 โ threadKey: reviewCache.threadKey,
524 โ sectionId: selectedSection?.id ?? null,
525 โ diff: selectedSection?.diff,
526 โ data: nativeReviewDiffData,
527 โ collapsedFileIds,
528 โ viewedFileIds,
529 โ selectedRowIds: commentSelection.selectedRowIds,
530 โ canHighlight: parsedDiff.kind === "files",
531 โ });
532 โ const showcaseReviewKey =
533 โ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
534 โ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
535 โ : null;
536 โ const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
537 โ nativeBridge.onDebug(event);
538 โ if (
539 โ showcaseReviewKey === null ||
540 โ showcasedReviewDrawRef.current === showcaseReviewKey ||
541 โ !isNativeReviewDiffDrawEvent(event.nativeEvent)
542 โ ) {
543 โ return;
544 โ }
545 โ showcasedReviewDrawRef.current = showcaseReviewKey;
546 โ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
547 โ };
548 โ
549 โ const handleSelectFile = async (fileId: string | null) => {
550 โ loadVisibleFile(fileId, true);
551 โ commentSelection.clearSelection();
552 โ if (fileId !== null && collapsedFileIds.includes(fileId)) {
553 โ toggleExpandedFile(fileId);
554 โ }
555 โ const nativeView = nativeReviewDiffViewRef.current;
556 โ if (!nativeView) return;
557 โ const result = await settlePromise(() =>
558 โ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
559 โ );
560 โ if (AsyncResult.isFailure(result)) {
561 โ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
562 โ }
563 โ };
564 โ const handleVisibleFileChange = (
565 โ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
566 โ ) => {
567 โ loadVisibleFile(event.nativeEvent.fileId ?? null);
568 โ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
569 โ };
570 โ const renderInspector = () => (
571 โ <ReviewFileNavigator
572 โ ref={reviewFileNavigatorRef}
573 โ files={nativeReviewDiffData.files}
574 โ headerInset={insets.top}
575 โ sectionId={selectedSection?.id ?? null}
576 โ onSelectFile={(fileId) => void handleSelectFile(fileId)}
577 โ />
578 โ );
579 โ
580 โ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
581 โ const { fileId } = event.nativeEvent;
582 โ if (fileId) {
583 โ loadVisibleFile(fileId, true);
584 โ toggleExpandedFile(fileId);
585 โ }
586 โ };
587 โ
588 โ const handleNativeToggleViewedFile = (
589 โ event: NativeSyntheticEvent<{ readonly fileId?: string }>,
590 โ ) => {
591 โ const { fileId } = event.nativeEvent;
592 โ if (fileId) {
593 โ toggleViewedFile(fileId);
594 โ }
595 โ };
596 โ
597 โ const parsedDiffNotice =
598 โ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
599 โ const hasCachedSelectedDiff = selectedSection?.diff != null;
600 โ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
601 โ const sectionMenu = buildReviewSectionMenu(reviewSections);
602 โ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
603 โ hasEnvironmentPresentation: environment.isReady,
604 โ isEnvironmentConnected: isEnvironmentReady,
605 โ hasCachedSelectedDiff,
606 โ hasAnyCachedDiff,
607 โ });
608 โ const handleRetryEnvironment = () => {
609 โ void retryEnvironment(environmentId);
610 โ };
611 โ const handleReturnToThread = () => {
612 โ if (navigation.canGoBack()) {
613 โ navigation.goBack();
614 โ return;
615 โ }
616 โ navigation.navigate("Thread", {
617 โ environmentId: String(environmentId),
618 โ threadId: String(threadId),
619 โ });
620 โ };
621 โ const androidHeaderSubtitle = [
622 โ selectedSection?.title,
623 โ headerDiffSummary.additions,
624 โ headerDiffSummary.deletions,
625 โ ]
626 โ .filter((part): part is string => Boolean(part))
627 โ .join(" ยท ");
628 โ
629 โ const showChangedFilesPane =
630 โ !showConnectionNotice &&
631 โ selectedSection !== null &&
632 โ parsedDiff.kind === "files" &&
633 โ NativeReviewDiffView !== null;
634 โ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
635 โ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
636 โ
637 โ const listHeader = (() => {
638 โ const children: ReactElement[] = [];
639 โ
640 โ if (error) {
641 โ children.push(
642 โ <View
643 โ key="review-error"
644 โ className={cn(
645 โ "bg-card px-4 py-3",
646 โ Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
647 โ )}
648 โ >
649 โ <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
650 โ <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
651 โ </View>,
652 โ );
653 โ }
654 โ
655 โ if (parsedDiffNotice) {
656 โ children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
657 โ }
658 โ
659 โ if (children.length === 0) {
660 โ return null;
661 โ }
662 โ
663 โ return <>{children}</>;
664 โ })();
665 โ const headerSubtitle = [
666 โ headerDiffSummary.additions,
667 โ headerDiffSummary.deletions,
668 โ pendingReviewCommentCount > 0
669 โ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
670 โ : null,
671 โ ]
672 โ .filter(Boolean)
673 โ .join(" ยท ");
674 โ const headerTitleText = selectedSection?.title ?? "Review changes";
675 โ
676 โ return (
677 โ <>
678 โ <ReviewHeader
679 โ environmentId={environmentId}
680 โ threadId={threadId}
681 โ title={headerTitleText}
682 โ subtitle={headerSubtitle}
683 โ androidSubtitle={androidHeaderSubtitle}
684 โ iconColor={headerIcon}
685 โ selectedThreadCwd={selectedThreadCwd}
686 โ sectionMenu={sectionMenu}
687 โ selectedSection={selectedSection}
688 โ showSectionToolbar={showSectionToolbar}
689 โ showChangedFilesToggle={showChangedFilesToggle}
690 โ onRefresh={handlePullToRefresh}
691 โ onSelectSection={selectSection}
692 โ onReturnToThread={handleReturnToThread}
693 โ />
694 โ
695 โ <ScreenContent>
696 โ <View className="flex-1 bg-sheet android:bg-sheet-solid">
697 โ {showConnectionNotice ? (
698 โ <View className="flex-1" style={{ paddingTop: topContentInset }}>
699 โ <EnvironmentConnectionNotice
700 โ environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
701 โ connection={
702 โ environment.presentation?.connection ?? {
703 โ phase: "available",
704 โ error: null,
705 โ traceId: null,
706 โ }
707 โ }
708 โ resourceName="review"
709 โ onRetry={handleRetryEnvironment}
710 โ />
711 โ </View>
712 โ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
713 โ <View
714 โ className="flex-1"
715 โ style={{
716 โ backgroundColor: nativeBridge.theme.background,
717 โ }}
718 โ >
719 โ <View
720 โ className="min-w-0 flex-1"
721 โ style={listHeader ? { paddingTop: topContentInset } : undefined}
722 โ >
723 โ {listHeader}
724 โ <View className="min-w-0 flex-1" collapsable={false}>
725 โ <NativeReviewDiffView
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ This component is created during render
726 โ collapsable={false}
โฐโโโโ
help: Components created during render will reset their state each time they are created. Declare components outside of render
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
โ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used.
โญโ[apps/server/src/checkpointing/Utils.ts:12:10]
11 โ
12 โ function resolveThreadWorkspaceCwd(input: {
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ 'resolveThreadWorkspaceCwd' is declared here
13 โ readonly thread: {
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used.
โญโ[apps/server/src/ws.ts:10:13]
9 โ import * as Effect from "effect/Effect";
10 โ import * as Fiber from "effect/Fiber";
ยท โโโฌโโ
ยท โฐโโ 'Fiber' is imported here
11 โ import * as FileSystem from "effect/FileSystem";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used.
โญโ[apps/server/src/ws.ts:17:13]
16 โ import * as Ref from "effect/Ref";
17 โ import * as Schedule from "effect/Schedule";
ยท โโโโโฌโโโ
ยท โฐโโ 'Schedule' is imported here
18 โ import * as Schema from "effect/Schema";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/ws.ts:1285:13]
1284 โ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources;
1285 โ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner;
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'projectSetupScriptRunner' is declared here
1286 โ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker;
โฐโโโโ
help: Consider removing this declaration.
โ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
โญโ[packages/client-runtime/src/state/usageAccess.ts:3:8]
2 โ AuthDiagnosticsReadScope,
3 โ type AuthSessionState,
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'AuthSessionState' is imported here
4 โ sessionGrantsScope,
โฐโโโโ
help: Consider removing this import.
โ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret.
โญโ[apps/server/src/vcs/GitVcsDriverCore.ts:509:11]
508 โ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) ||
509 โ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)),
ยท โโโโโโโโโโโโโโโ
510 โ )
โฐโโโโ
help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`.
โ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
โญโ[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
520 โ })).delivery;
521 โ โญโโถ while (delivery.outcome === "accepted") {
522 โ โ yield* Effect.yieldNow;
523 โ โ delivery = (yield* service.getWebhookDelivery({
524 โ โ id: task.id,
525 โ โ deliveryId: deliveryId!,
526 โ โ })).delivery;
527 โ โฐโโถ }
528 โ assert.equal(delivery.outcome, "dispatch_failed");
โฐโโโโ
โ react(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
โ 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-inline-schema-compile): Hoist Schema.decodeEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34]
1785 โ const stat = branch.files!.find((file) => file.path === path)!;
1786 โ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({
ยท โโโโโโโโโโโโโโโโโโโ
1787 โ cwd,
โฐโโโโ
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/review/ReviewCommentComposerSheet.tsx:103:7]
100 โ
101 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
102 โ if (!target || selectedLines.length === 0) {
103 โ setHighlightedLinesById({});
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
104 โ return;
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/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(purity): Cannot call impure function during render
โญโ[apps/web/src/components/CommandPalette.tsx:1996:20]
1995 โ title: inferProjectTitleFromPath(destinationPath),
1996 โ createdAt: new Date().toISOString(),
ยท โโโโโโฌโโโโ
ยท โฐโโ Cannot call impure function
1997 โ remoteUrl: addProjectCloneFlow.remoteUrl,
โฐโโโโ
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
โ 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
โ 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-unused-vars): Function 'nonEmptyString' is declared but never used.
โญโ[packages/client-runtime/src/work-log/presentation.ts:234:10]
233 โ
234 โ function nonEmptyString(value: unknown): string | null {
ยท โโโโโโโโฌโโโโโโ
ยท โฐโโ 'nonEmptyString' is declared here
235 โ return typeof value === "string" && value.trim().length > 0 ? value : null;
โฐโโโโ
help: Consider removing this declaration.
โ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
โญโ[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19]
472 โ onFilters,
473 โ authorOptions = [],
ยท โโ
474 โ labelOptions = [],
โฐโโโโ
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
โ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
โญโ[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18]
473 โ authorOptions = [],
474 โ labelOptions = [],
ยท โโ
475 โ optionScope,
โฐโโโโ
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
โ react(capitalized-calls): Capitalized function called without JSX
โญโ[apps/mobile/src/lib/useHoverGesture.ts:8:15]
7 โ () =>
8 โ Gesture.Hover()
ยท โโโฌโโ
ยท โฐโโ `Hover` may be a component
9 โ .manualActivation(true)
โฐโโโโ
help: Render `Hover` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
note: `Hover` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15]
87 โ <li
88 โ key={`${index}:${check.name}`}
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
89 โ className="col-span-full grid grid-cols-subgrid items-center text-xs"
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[apps/mobile/src/lib/markdownDocument.ts:259:28]
258 โ visit(parser.parse(markdown), false, false);
259 โ for (const edit of edits.reverse())
ยท โโโโโโโ
260 โ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
โฐโโโโ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[apps/mobile/src/lib/markdownDocument.ts:290:28]
289 โ visit(parser.parse(markdown));
290 โ for (const edit of edits.reverse())
ยท โโโโโโโ
291 โ markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
โฐโโโโ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[apps/mobile/src/lib/markdownDocument.ts:344:38]
343 โ visit(parser.parse(markdown));
344 โ for (const lineStart of lineStarts.reverse()) {
ยท โโโโโโโ
345 โ // The header row may be a lazy line without its container markers (`>` or list indent),
โฐโโโโ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
โ 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.
โ 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.
โ 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 โ },
โฐโโโโ
โ 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/threads/ThreadRouteScreen.tsx:400:5]
398 โ
399 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
400 โ setInspectorSelection((current) => {
ยท โโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
401 โ if (props.renderInspector === undefined) {
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(no-unstable-nested-components): Do not define components during render.
โญโ[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24]
527 โ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
528 โ โญโโถ const GitInspector = () => (
529 โ โ <GitOverviewSheet
530 โ โ headerInset={inspectorHeaderInset}
531 โ โ presentation="inspector"
532 โ โ route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
533 โ โ />
534 โ โฐโโถ );
535 โ const FilesInspector = () =>
โฐโโโโ
help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
โ react(no-unstable-nested-components): Do not define components during render.
โญโ[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26]
534 โ );
535 โ โญโโถ const FilesInspector = () =>
536 โ โ selectedThread !== null && selectedThreadCwd !== null ? (
537 โ โ <ThreadFileNavigatorPane
538 โ โ cwd={selectedThreadCwd}
539 โ โ environmentId={selectedThread.environmentId}
540 โ โ headerInset={inspectorHeaderInset}
541 โ โ projectName={selectedThreadProject?.title ?? "Files"}
542 โ โ selectedPath={null}
543 โ โ onSelectFile={handleSelectInspectorFile}
544 โ โ />
545 โ โฐโโถ ) : null;
546 โ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
โฐโโโโ
help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
โ eslint(no-unused-vars): Type 'Scope' is imported but never used.
โญโ[apps/server/src/provider/ProviderAuthService.ts:15:18]
14 โ import * as Layer from "effect/Layer";
15 โ import type * as Scope from "effect/Scope";
ยท โโโฌโโ
ยท โฐโโ 'Scope' is imported here
16 โ import * as Stream from "effect/Stream";
โฐโโโโ
help: Consider removing this import.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40]
28 โ const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live);
29 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
30 โ if (snapshot && snapshot !== live) setHeld({ key, snapshot });
ยท โโโโฌโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
31 โ }, [key, live, snapshot]);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ 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(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
โ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
โญโ[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7]
248 โ mountedRef.current = false;
249 โ flow.setBranchQuery("");
ยท โโโฌโ
ยท โฐโโ Missing dependency `flow`
250 โ };
251 โ }, [flow.setBranchQuery]);
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Overly precise dependency `flow.setBranchQuery`, use `flow` instead
252 โ
โฐโโโโ
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
โญโ[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9]
264 โ ): boolean {
265 โ const labels = entry.labels.map((label) => label.name.trim().toLowerCase());
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
266 โ const holds = (label: string) => labels.includes(label.trim().toLowerCase());
โฐโโโโ
help: Switch to `Set`
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5]
434 โ : null;
435 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
436 โ if (
437 โ props.active === false ||
438 โ activeDraftKey !== null ||
439 โ editingPendingTask !== null ||
440 โ selectedProject === null
441 โ ) {
442 โ return;
443 โ }
444 โ setActiveDraftKey(
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
445 โ createNewTaskDraft({
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
โญโ[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36]
1243 โ <ActiveNewTaskContext value={activeNewTask}>
1244 โ <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>
ยท โโโโโโโโโโโโโ
1245 โ </ActiveNewTaskContext>
โฐโโโโ
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
638 โ
639 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
640 โ if (pendingLaunchEntry.key === launchTargetKey) {
641 โ return;
642 โ }
643 โ setPendingLaunchEntry({
ยท โโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
644 โ key: launchTargetKey,
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5]
648 โ
649 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
650 โ if (initialAttachGridEntry.key === launchTargetKey) {
651 โ return;
652 โ }
653 โ setInitialAttachGridEntry({
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
654 โ key: launchTargetKey,
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7]
743 โ
744 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
745 โ if (!routeEnvironmentId || !routeThreadId) {
746 โ setLastGridSize({
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
747 โ cols: DEFAULT_TERMINAL_COLS,
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24]
537 โ });
538 โ }, [terminal.buffer, terminal.buffer.length, terminalKey]);
ยท โโโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
539 โ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7]
708 โ sentInitialInputKeyRef.current = null;
709 โ }, [terminalKey]);
ยท โโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `terminalKey`
710 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52]
799 โ };
800 โ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ โโโโโโฌโโโโโ
ยท โ โฐโโ Unnecessary dependency `terminalKey`
ยท โฐโโ Unnecessary dependency `terminal.lifecycleVersion`
801 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(refs): Cannot access refs during render
โญโ[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
792 โ }
793 โ const pasteSession = pasteSessionRef.current;
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Cannot access ref value during render
794 โ
โฐโโโโ
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
โ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7]
772 โ if (settingsSheetPresentation.isActive) {
773 โ settingsRoutePresentation.present(settingsRouteSession);
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ Missing dependency `settingsRoutePresentation`
774 โ }
775 โ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]);
ยท โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโ
ยท โฐโโ Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead
776 โ
โฐโโโโ
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(immutability): This value cannot be modified
โญโ[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5]
387 โ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0;
388 โ const animatedBorderRadius = useSharedValue(targetBorderRadius);
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ `animatedBorderRadius` originates here
389 โ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android";
390 โ useLayoutEffect(() => {
391 โ animatedBorderRadius.value = shouldAnimate
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ `animatedBorderRadius` cannot be modified
392 โ ? withTiming(targetBorderRadius, {
โฐโโโโ
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
โ 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);
โฐโโโโ
โ react(static-components): Cannot create components during render
โญโ[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
196 โ const { onInput, onResize } = props;
197 โ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
ยท โโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
ยท โฐโโ The component is created during render here
198 โ const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
199 โ
200 โ useEffect(() => {
201 โ terminalDebugLog("native:surface", {
202 โ terminalKey: props.terminalKey,
203 โ native: hasNativeSurface,
204 โ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
205 โ bufferLen: props.buffer.length,
206 โ isRunning: props.isRunning,
207 โ });
208 โ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
209 โ const handleNativeInput = useCallback(
210 โ (event: NativeSyntheticEvent<TerminalInputEvent>) => {
211 โ if (!props.isRunning || props.readOnly) {
212 โ return;
213 โ }
214 โ terminalDebugLog("native:onInput", {
215 โ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
216 โ });
217 โ onInput(event.nativeEvent.data);
218 โ },
219 โ [onInput, props.isRunning, props.readOnly],
220 โ );
221 โ const handleNativeResize = useCallback(
222 โ (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
223 โ onResize({
224 โ cols: event.nativeEvent.cols,
225 โ rows: event.nativeEvent.rows,
226 โ });
227 โ },
228 โ [onResize],
229 โ );
230 โ
231 โ if (NativeTerminalSurfaceView) {
232 โ return (
233 โ <View style={props.style}>
234 โ <NativeTerminalSurfaceView
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโโ
ยท โฐโโ This component is created during render
235 โ appearanceScheme={themeAppearance}
โฐโโโโ
help: Components created during render will reset their state each time they are created. Declare components outside of render
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
โ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
โญโ[packages/client-runtime/src/rpc/session.test.ts:226:3]
225 โ ) {
226 โ โญโโถ for (let attempt = 0; attempt < 100; attempt += 1) {
227 โ โ const socket = sockets[index];
228 โ โ if (socket) {
229 โ โ return socket;
230 โ โ }
231 โ โ yield* Effect.yieldNow;
232 โ โฐโโถ }
233 โ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket."));
โฐโโโโ
โ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
โญโ[packages/client-runtime/src/rpc/session.test.ts:240:3]
239 โ ) {
240 โ โญโโถ for (let attempt = 0; attempt < 100; attempt += 1) {
241 โ โ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index];
242 โ โ if (request) {
243 โ โ return request;
244 โ โ }
245 โ โ yield* Effect.yieldNow;
246 โ โฐโโถ }
247 โ return yield* Effect.die(new Error("Expected the RPC protocol to send a request."));
โฐโโโโ
โ react(capitalized-calls): Capitalized function called without JSX
โญโ[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27]
601 โ const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success));
602 โ const gesture = Gesture.Pan()
ยท โโฌโ
ยท โฐโโ `Pan` may be a component
603 โ .enabled(!props.disabled)
โฐโโโโ
help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
โ react(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-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-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.
โ 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): Identifier 'HookForwarder' is imported but never used.
โญโ[infra/relay/src/http/Api.ts:69:13]
68 โ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts";
69 โ import * as HookForwarder from "../hooks/HookForwarder.ts";
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ 'HookForwarder' is imported here
70 โ import * as HeldHooks from "../hooks/HeldHooks.ts";
โฐโโโโ
help: Consider removing this import.
โ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
โญโ[packages/client-runtime/src/connection/supervisor.test.ts:135:3]
134 โ let lastState = yield* SubscriptionRef.get(state);
135 โ โญโโถ for (let iteration = 0; iteration < 100; iteration += 1) {
136 โ โ lastState = yield* SubscriptionRef.get(state);
137 โ โ if (predicate(lastState)) {
138 โ โ return lastState;
139 โ โ }
140 โ โ yield* Effect.yieldNow;
141 โ โฐโโถ }
142 โ return yield* Effect.die(
โฐโโโโ
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17]
813 โ <div
814 โ key={`${index}:${check.name}:${check.url ?? ""}`}
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
815 โ className="group flex items-center gap-2 rounded-md pr-1 hover:bg-accent/60"
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2139:5]
2137 โ );
2138 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
2139 โ setExpandedVideo(null);
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
2140 โ setExpandedFile(null);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10]
65 โ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
66 โ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'isMarkdownFileLinkLabel' is imported here
67 โ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'createContext' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3]
91 โ import {
92 โ createContext,
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ 'createContext' is imported here
93 โ memo,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3]
107 โ import {
108 โ ActivityIndicator,
ยท โโโโโโโโโฌโโโโโโโโ
ยท โฐโโ 'ActivityIndicator' is imported here
109 โ Image,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3]
114 โ Pressable,
115 โ ScrollView,
ยท โโโโโโฌโโโโ
ยท โฐโโ 'ScrollView' is imported here
116 โ StyleSheet,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11]
116 โ StyleSheet,
117 โ Text as NativeText,
ยท โโโโโโฌโโโโ
ยท โฐโโ 'NativeText' is imported here
118 โ type ColorValue,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10]
139 โ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
140 โ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
ยท โโโโโโโโโโฌโโโโโโโโ
ยท โฐโโ 'tryOpenExternalUrl' is imported here
141 โ import { downloadAndShareAttachment } from "../../lib/attachmentDownload";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10]
142 โ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
143 โ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ 'faviconUrlForOrigin' is imported here
144 โ import {
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10]
156 โ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
157 โ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'MediaVideoPlayer' is imported here
158 โ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3]
160 โ attachmentVideoPreviewSource,
161 โ mediaVideoPreviewUri,
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ 'mediaVideoPreviewUri' is imported here
162 โ mediaVideoThumbnailKey,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3]
161 โ mediaVideoPreviewUri,
162 โ mediaVideoThumbnailKey,
ยท โโโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ 'mediaVideoThumbnailKey' is imported here
163 โ type MediaVideoPreviewSource,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8]
162 โ mediaVideoThumbnailKey,
163 โ type MediaVideoPreviewSource,
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'MediaVideoPreviewSource' is imported here
164 โ } from "../../lib/videoPreviewSource";
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15]
170 โ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection";
171 โ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter";
ยท โโโโโโโโฌโโโโโโโ
ยท โฐโโ 'ReviewDiffTheme' is imported here
172 โ import {
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3]
185 โ import {
186 โ resolveMarkdownFontSizes,
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'resolveMarkdownFontSizes' is imported here
187 โ resolveNativeMarkdownTypography,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10]
190 โ import { PierreEntryIcon } from "../../components/PierreEntryIcon";
191 โ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons";
ยท โโโโโโโโโโโโฌโโโโโโโโโโ
ยท โฐโโ 'markdownLinkIconSource' is imported here
192 โ import {
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3]
193 โ normalizeNativeMarkdownUrl,
194 โ resolveMarkdownInlineCodePresentation,
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโ
ยท โฐโโ 'resolveMarkdownInlineCodePresentation' is imported here
195 โ resolveMarkdownLinkIcon,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3]
194 โ resolveMarkdownInlineCodePresentation,
195 โ resolveMarkdownLinkIcon,
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'resolveMarkdownLinkIcon' is imported here
196 โ resolveMarkdownLinkPresentation,
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:234:10]
233 โ import { ThreadMcpApp } from "./McpAppWebView";
234 โ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState";
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ 'useMarkdownCodeHighlight' is imported here
235 โ import {
โฐโโโโ
help: Consider removing this import.
โ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:238:3]
237 โ useAssetUrl,
238 โ useAssetUrlState,
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'useAssetUrlState' is imported here
239 โ useRefreshAssetUrl,
โฐโโโโ
help: Consider removing this import.
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2141:7]
2140 โ setExpandedFile(null);
2141 โ }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
ยท โโโโโโโโโโฌโโโโโโโโโ โโโโโโโโฌโโโโโโ โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโ
ยท โ โ โฐโโ Unnecessary dependency `props.contentPresentation.kind`
ยท โ โฐโโ Unnecessary dependency `props.threadId`
ยท โฐโโ Unnecessary dependency `props.environmentId`
2142 โ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16;
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2609:7]
2608 โ reportHeaderMaterialVisibility(false);
2609 โ }, [feedThreadKey, reportHeaderMaterialVisibility]);
ยท โโโโโโโฌโโโโโโ
ยท โฐโโ Unnecessary dependency `feedThreadKey`
2610 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2625:7]
2624 โ }
2625 โ }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `listMountKey`
2626 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:2782:7]
2781 โ }
2782 โ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
ยท โโโโโโโโฌโโโโโโโ โโโโโโโโโโฌโโโโโโโโ โโโโโโโโโฌโโโโโโโ
ยท โ โ โฐโโ Unnecessary dependency `expandedWorkRows`
ยท โ โฐโโ Unnecessary dependency `expandedWorkGroups`
ยท โฐโโ Unnecessary dependency `expandedTurnIds`
2783 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(memo-dependencies): Found extra memoization dependencies
โญโ[apps/mobile/src/features/threads/ThreadFeed.tsx:613:9]
612 โ };
613 โ }, [props.environmentId, attachment.id, httpBaseUrl]),
ยท โโโโโโโโโโฌโโโโโโโโโ โโโโโโโฌโโโโโโ โโโโโโฌโโโโโ
ยท โ โ โฐโโ Unnecessary dependency `httpBaseUrl`
ยท โ โฐโโ Unnecessary dependency `attachment.id`
ยท โฐโโ Unnecessary dependency `props.environmentId`
614 โ );
โฐโโโโ
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7]
211 โ };
212 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
213 โ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null;
214 โ if (inserted) {
215 โ setSelection((current) =>
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
216 โ current.start === inserted.start && current.end === inserted.end ? current : inserted,
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7]
284 โ }, [hasWorkspaceSnapshot]);
285 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
286 โ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return;
287 โ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`;
288 โ const now = Date.now();
289 โ const lastRequest = workspaceRefreshKeyRef.current;
290 โ if (
291 โ lastRequest?.key === key &&
292 โ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS
293 โ )
294 โ return;
295 โ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) {
296 โ setWorkspaceRefreshRetry(null);
ยท โโโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
297 โ return;
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5]
325 โ }, [
326 โ draftMessage,
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `draftMessage`
327 โ environmentId,
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ 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);
โฐโโโโ
โ 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.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
150 โ
151 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
152 โ if (!controlledSelectedPath) {
153 โ return;
154 โ }
155 โ setExpandedPaths((current) => {
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
156 โ const ancestors = ancestorPaths(controlledSelectedPath);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ eslint(no-unused-vars): Parameter '_' is declared but never used.
โญโ[packages/shared/src/qrCode.ts:458:44]
457 โ ): Array<byte> {
458 โ let result: Array<byte> = divisor.map((_) => 0);
ยท โฌ
ยท โฐโโ '_' is declared here
459 โ for (const b of data) {
โฐโโโโ
help: Consider removing this parameter.
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
256 โ return () => cancelAnimationFrame(frame);
257 โ }, [props.path, targetIndex]);
ยท โโโโโโฌโโโโ
ยท โฐโโ Unnecessary dependency `props.path`
258 โ
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
292 โ <SourceText
293 โ key={`${index}:${tokenIndex}`}
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
294 โ style={{
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ react(no-array-index-key): Usage of Array index in keys is not allowed
โญโ[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
308 โ return (
309 โ <SourceText key={index}>
ยท โโโโโโโโโโโ
310 โ {body}
โฐโโโโ
help: Use a unique data-dependent key to avoid unnecessary rerenders
โ eslint(no-empty-pattern): Empty object binding pattern
โญโ[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14]
465 โ
466 โ for (const {} of ["direct", "wrapper"] as const) {
ยท โโ
467 โ }
โฐโโโโ
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/features/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/pull-requests/PullRequestRouteScreen.tsx:329:7]
324 โ };
325 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
326 โ if (!guidesEnabled && section === "guide") {
327 โ requestedSection.current = "overview";
328 โ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
329 โ setSection("overview");
ยท โโโโโโฌโโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
330 โ }
โฐโโโโ
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:331:6]
326 โ if (!guidesEnabled && section === "guide") {
327 โ 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
328 โ 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
329 โ setSection("overview");
330 โ }
331 โ }, [guidesEnabled, section, insets.top]);
ยท โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ
ยท โฐโโ This dependency list is missing values used by the callback
332 โ 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:868:6]
851 โ if (
852 โ 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
853 โ lastSelection.current.id === route.params.fileSelectionId
854 โ )
855 โ return;
856 โ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId };
857 โ if (route.params.focus) navigation.setParams({ focus: undefined });
858 โ setJumpPath(route.params.path);
859 โ setSelectedRowId(null);
860 โ jumpStarted.current = false;
861 โ const file = data.files.find((entry) => entry.path === route.params.path);
862 โ 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
863 โ setCollapsedIds((ids) => ids.filter((id) => id !== file.id));
864 โ jumpStarted.current = true;
865 โ void nativeView.current.scrollToFile(file.id, false).catch(() => {
866 โ jumpStarted.current = false;
867 โ });
868 โ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]);
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
ยท โฐโโ This dependency list is missing values used by the callback
869 โ 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 '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-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(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx:114:33]
113 โ return () => cancelAnimationFrame(frame);
114 โ }, [restoreSearch, tabActive, bottomSearch]);
ยท โโโโโโโฌโโโโโ
ยท โฐโโ Unnecessary dependency `bottomSearch`
115 โ const composeButton = nativeToolbarCompose ? (
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'.
โญโ[apps/server/src/orchestration-v2/Orchestrator.ts:12366:7]
12365 โ
12366 โ const layerUnavailable: Layer.Layer<OrchestratorV2> = Layer.succeed(
ยท โโโโโโโโโฌโโโโโโโ
ยท โฐโโ 'layerUnavailable' is declared here
12367 โ OrchestratorV2,
โฐโโโโ
help: Consider removing this declaration.
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[scripts/lib/cli-external-packages.test.ts:114:11]
113 โ const declared = {
114 โ ...(manifest.dependencies ?? {}),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
115 โ ...(manifest.optionalDependencies ?? {}),
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[scripts/lib/cli-external-packages.test.ts:115:11]
114 โ ...(manifest.dependencies ?? {}),
115 โ ...(manifest.optionalDependencies ?? {}),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
116 โ ...(manifest.peerDependencies ?? {}),
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[scripts/lib/cli-external-packages.test.ts:116:11]
115 โ ...(manifest.optionalDependencies ?? {}),
116 โ ...(manifest.peerDependencies ?? {}),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
117 โ };
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[apps/mobile/src/state/use-model-option-memory.ts:21:7]
20 โ [instanceId]: {
21 โ ...(state[instanceId] ?? {}),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
22 โ [model]: options,
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/state/thread-order.ts:29:7]
28 โ getPendingThreadOrder();
29 โ }, [nowMinute, snoozeWakeTick]);
ยท โโโโโฌโโโโ โโโโโโโโฌโโโโโโ
ยท โ โฐโโ Unnecessary dependency `snoozeWakeTick`
ยท โฐโโ Unnecessary dependency `nowMinute`
30 โ return pending;
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ react(memo-dependencies): Found extra memoization dependencies
โญโ[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34]
115 โ return [...commands];
116 โ }, [activeThreadRef, pathname, registrationVersion, navigation]);
ยท โโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ Unnecessary dependency `registrationVersion`
117 โ
โฐโโโโ
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(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(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
โ 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
โ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownOption(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
โญโ[packages/shared/src/otelEnvironment.ts:146:14]
145 โ name,
146 โ (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโ
147 โ `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`,
โฐโโโโ
โ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
โญโ[apps/mobile/src/state/use-vcs-action-state.ts:86:5]
83 โ const [nowMs, setNowMs] = useState(() => Date.now());
84 โ useEffect(() => {
ยท โโโโโฌโโโโ
ยท โฐโโ This is the containing effect
85 โ if (!actionState.isRunning) return;
86 โ setNowMs(Date.now());
ยท โโโโโฌโโโ
ยท โฐโโ Avoid calling setState() directly within an effect
87 โ const interval = setInterval(() => setNowMs(Date.now()), 1000);
โฐโโโโ
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[apps/mobile/src/state/use-composer-drafts.ts:1022:15]
1021 โ instanceId,
1022 โ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models },
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1023 โ ]),
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ react(exhaustive-effect-dependencies): Found extra effect dependencies
โญโ[apps/mobile/src/state/use-thread-outbox-drain.ts:1315:5]
1314 โ queuedMessagesByThreadKey,
1315 โ retryTick,
ยท โโโโโฌโโโโ
ยท โฐโโ Unnecessary dependency `retryTick`
1316 โ restoreQueuedMessage,
โฐโโโโ
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
โ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
โญโ[packages/shared/src/composerContextLegacySend.ts:19:45]
18 โ const occurrences = collectComposerContextReferences(text);
19 โ for (const occurrence of [...occurrences].reverse()) {
ยท โโโโโโโ
20 โ const record = recordsById.get(occurrence.contextId);
โฐโโโโ
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
โ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression
โญโ[packages/shared/src/serverSettings.test.ts:35:7]
34 โ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) =>
35 โ instanceId === configured ? true : false,
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
36 โ );
โฐโโโโ
help: Remove this ternary operator
โ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
โญโ[packages/shared/src/serverSettings.ts:346:9]
345 โ const entry: ProjectSettingsOverrides = {
346 โ ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}),
ยท โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
347 โ };
โฐโโโโ
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
โ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce()
โญโ[packages/shared/src/serverSettings.ts:448:24]
447 โ const favorites =
448 โ setModelFavorites?.reduce((current, change) => {
ยท โโโโฌโโ
ยท โฐโโ For this reduce
449 โ const exists = current.some(
450 โ (favorite) => favorite.provider === change.provider && favorite.model === change.model,
451 โ );
452 โ return change.favorite
453 โ ? exists
454 โ ? current
455 โ : [...current, { provider: change.provider, model: change.model }]
ยท โโโโโโฌโโโโ
ยท โฐโโ From this spread
456 โ : current.filter(
โฐโโโโ
help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead.
note: Using spreads within accumulators leads to `O(n^2)` time complexity.
โ oxc(no-accumulating-spread): Do not spread accumulators in loops
โญโ[packages/shared/src/serverSettings.ts:466:3]
464 โ null;
465 โ let nextModelPreferences = initialModelPreferences;
ยท โโโโโโโโโโโฌโโโโโโโโโ
ยท โฐโโ From this accumulator
466 โ for (const change of setModelsHidden ?? []) {
ยท โโฌโ
ยท โฐโโ For this loop
467 โ const preferences = nextModelPreferences?.[change.provider] ?? {
468 โ hiddenModels: [],
469 โ modelOrder: [],
470 โ };
471 โ const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model);
472 โ if (change.hidden) hiddenModels.push(change.model);
473 โ nextModelPreferences = {
474 โ ...nextModelPreferences,
ยท โโโโโโโโโโโโฌโโโโโโโโโโโ
ยท โฐโโ From this spread
475 โ [change.provider]: { ...preferences, hiddenModels },
โฐโโโโ
help: Consider using `Object.assign()` to mutate the accumulator instead.
note: Using spreads within accumulators leads to `O(n^2)` time complexity.
โ 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
Found 0 errors and 362 warnings in 5420 files (6.0s, 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=__b88136b0-188f-47ed-8ca5-e35bb2b63fb1.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-8600a8d4a7fcc9519d421cef0c77201c793c5d8afbbef2897636b5b9305a9b7d, not saving cache.
##[end-action id=__b88136b0-188f-47ed-8ca5-e35bb2b63fb1.__actions_cache;outcome=success;conclusion=success;duration_ms=119]
##[start-action display=Cache Vite+;id=__b88136b0-188f-47ed-8ca5-e35bb2b63fb1.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=__b88136b0-188f-47ed-8ca5-e35bb2b63fb1.vp_cache;outcome=success;conclusion=success;duration_ms=59]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/bde825dd-ba79-4937-bfb5-8ee285da746d' 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: 187
BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 406
BLACKSMITH_CHECK_RUN_ID: 120801109398
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