GitHub check
256 KB of 604 KB loaded Download the full log (604 KB)
348 KB of earlier output not loaded
e),
193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
194 │ iconUri: contextChipIconUri(icon),
195 │ tintsIcon: icon.kind === "chip",
196 │ };
197 │ }),
198 │ );
199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]);
· ───────────────────────────────┬───────────────────────────────
· ╰── This dependency list is missing values used by the callback
200 │ // Every render resolves against the snapshot history, so a render whose
╰────
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(memo-dependencies): Found missing memoization dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5]
253 │ mostRecentEventCountRef.current = acknowledgedEventCount;
254 │ nativeEventSnapshotsRef.current.push({
· ───────────┬───────────
· ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
255 │ eventCount: acknowledgedEventCount,
256 │ value,
257 │ selection: nextSelection,
258 │ });
259 │ return acknowledgedEventCount;
260 │ },
261 │ [],
· ─┬
· ╰── This dependency list is missing values used by the callback
262 │ );
╰────
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(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 array binding pattern
╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12]
1436 │
1437 │ for (const [] of [
· ──
1438 │ ["github", "github.com"],
╰────
help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable.
⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[packages/effect-acp/src/schema.test.ts:18:12]
17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } };
18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true);
· ─────────
19 │ expect(
╰────
⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[packages/effect-acp/src/schema.test.ts:20:7]
19 │ expect(
20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }),
· ─────────
21 │ ).toBe(true);
╰────
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/review/ReviewSheet.tsx:454:7]
453 │ showAuxiliaryPane("inspector");
454 │ }, [environmentId, showAuxiliaryPane, threadId]);
· ──────┬────── ────┬───
· │ ╰── Unnecessary dependency `threadId`
· ╰── Unnecessary dependency `environmentId`
455 │ const {
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(static-components): Cannot create components during render
╭─[apps/mobile/src/features/review/ReviewSheet.tsx:725:20]
492 │ // same check.
493 │ const NativeReviewDiffView = resolveNativeReviewDiffView();
· ─────────────┬─────────────
· ╰── The component is created during render here
494 │ const nativeReviewDiffViewRef = useRef<NativeReviewDiffViewHandle>(null);
495 │ const showcasedReviewDrawRef = useRef<string | null>(null);
496 │ const [isPullRefreshing, setIsPullRefreshing] = useState(false);
497 │ const handlePullToRefresh = async () => {
498 │ setIsPullRefreshing(true);
499 │ await refreshSelectedSection();
500 │ setIsPullRefreshing(false);
501 │ };
502 │ const reviewFileNavigatorRef = useRef<ReviewFileNavigatorHandle>(null);
503 │ const reviewFiles = parsedDiff.kind === "files" ? parsedDiff.files : [];
504 │ const fileVisibility = useReviewFileVisibility({
505 │ threadKey: reviewCache.threadKey,
506 │ sectionId: selectedSection?.id ?? null,
507 │ files: reviewFiles,
508 │ cachedExpandedFileIds: selectedSection?.id
509 │ ? reviewCache.expandedFileIdsBySection[selectedSection.id]
510 │ : undefined,
511 │ cachedViewedFileIds: selectedSection?.id
512 │ ? reviewCache.viewedFileIdsBySection[selectedSection.id]
513 │ : undefined,
514 │ });
515 │ const { collapsedFileIds, toggleExpandedFile, toggleViewedFile, viewedFileIds } = fileVisibility;
516 │ const commentSelection = useReviewCommentSelectionController({
517 │ environmentId,
518 │ threadId,
519 │ selectedSection,
520 │ nativeReviewDiffData,
521 │ });
522 │ const nativeBridge = useNativeReviewDiffBridge({
523 │ threadKey: reviewCache.threadKey,
524 │ sectionId: selectedSection?.id ?? null,
525 │ diff: selectedSection?.diff,
526 │ data: nativeReviewDiffData,
527 │ collapsedFileIds,
528 │ viewedFileIds,
529 │ selectedRowIds: commentSelection.selectedRowIds,
530 │ canHighlight: parsedDiff.kind === "files",
531 │ });
532 │ const showcaseReviewKey =
533 │ SHOWCASE_ENABLED && parsedDiff.kind === "files" && selectedSection
534 │ ? `${reviewCache.threadKey}:${selectedSection.id}:${nativeBridge.tokensResetKey}:${nativeBridge.themeId}`
535 │ : null;
536 │ const handleNativeDebug = (event: NativeSyntheticEvent<Record<string, unknown>>) => {
537 │ nativeBridge.onDebug(event);
538 │ if (
539 │ showcaseReviewKey === null ||
540 │ showcasedReviewDrawRef.current === showcaseReviewKey ||
541 │ !isNativeReviewDiffDrawEvent(event.nativeEvent)
542 │ ) {
543 │ return;
544 │ }
545 │ showcasedReviewDrawRef.current = showcaseReviewKey;
546 │ reportShowcaseSceneRendered({ scene: "review", themeId: nativeBridge.themeId });
547 │ };
548 │
549 │ const handleSelectFile = async (fileId: string | null) => {
550 │ loadVisibleFile(fileId, true);
551 │ commentSelection.clearSelection();
552 │ if (fileId !== null && collapsedFileIds.includes(fileId)) {
553 │ toggleExpandedFile(fileId);
554 │ }
555 │ const nativeView = nativeReviewDiffViewRef.current;
556 │ if (!nativeView) return;
557 │ const result = await settlePromise(() =>
558 │ fileId === null ? nativeView.scrollToTop(true) : nativeView.scrollToFile(fileId, true),
559 │ );
560 │ if (AsyncResult.isFailure(result)) {
561 │ console.error("[review] Failed to navigate to diff file", squashAtomCommandFailure(result));
562 │ }
563 │ };
564 │ const handleVisibleFileChange = (
565 │ event: NativeSyntheticEvent<{ readonly fileId?: string | null }>,
566 │ ) => {
567 │ loadVisibleFile(event.nativeEvent.fileId ?? null);
568 │ reviewFileNavigatorRef.current?.setVisibleFile(event.nativeEvent.fileId ?? null);
569 │ };
570 │ const renderInspector = () => (
571 │ <ReviewFileNavigator
572 │ ref={reviewFileNavigatorRef}
573 │ files={nativeReviewDiffData.files}
574 │ headerInset={insets.top}
575 │ sectionId={selectedSection?.id ?? null}
576 │ onSelectFile={(fileId) => void handleSelectFile(fileId)}
577 │ />
578 │ );
579 │
580 │ const handleNativeToggleFile = (event: NativeSyntheticEvent<{ readonly fileId?: string }>) => {
581 │ const { fileId } = event.nativeEvent;
582 │ if (fileId) {
583 │ loadVisibleFile(fileId, true);
584 │ toggleExpandedFile(fileId);
585 │ }
586 │ };
587 │
588 │ const handleNativeToggleViewedFile = (
589 │ event: NativeSyntheticEvent<{ readonly fileId?: string }>,
590 │ ) => {
591 │ const { fileId } = event.nativeEvent;
592 │ if (fileId) {
593 │ toggleViewedFile(fileId);
594 │ }
595 │ };
596 │
597 │ const parsedDiffNotice =
598 │ parsedDiff.kind === "files" || parsedDiff.kind === "raw" ? parsedDiff.notice : null;
599 │ const hasCachedSelectedDiff = selectedSection?.diff != null;
600 │ const hasAnyCachedDiff = reviewSections.some((section) => section.diff != null);
601 │ const sectionMenu = buildReviewSectionMenu(reviewSections);
602 │ const { showConnectionNotice, showSectionToolbar } = resolveReviewAvailability({
603 │ hasEnvironmentPresentation: environment.isReady,
604 │ isEnvironmentConnected: isEnvironmentReady,
605 │ hasCachedSelectedDiff,
606 │ hasAnyCachedDiff,
607 │ });
608 │ const handleRetryEnvironment = () => {
609 │ void retryEnvironment(environmentId);
610 │ };
611 │ const handleReturnToThread = () => {
612 │ if (navigation.canGoBack()) {
613 │ navigation.goBack();
614 │ return;
615 │ }
616 │ navigation.navigate("Thread", {
617 │ environmentId: String(environmentId),
618 │ threadId: String(threadId),
619 │ });
620 │ };
621 │ const androidHeaderSubtitle = [
622 │ selectedSection?.title,
623 │ headerDiffSummary.additions,
624 │ headerDiffSummary.deletions,
625 │ ]
626 │ .filter((part): part is string => Boolean(part))
627 │ .join(" · ");
628 │
629 │ const showChangedFilesPane =
630 │ !showConnectionNotice &&
631 │ selectedSection !== null &&
632 │ parsedDiff.kind === "files" &&
633 │ NativeReviewDiffView !== null;
634 │ useRegisterWorkspaceInspector(showChangedFilesPane ? renderInspector : undefined);
635 │ const showChangedFilesToggle = panes.supportsAuxiliaryPane && showChangedFilesPane;
636 │
637 │ const listHeader = (() => {
638 │ const children: ReactElement[] = [];
639 │
640 │ if (error) {
641 │ children.push(
642 │ <View
643 │ key="review-error"
644 │ className={cn(
645 │ "bg-card px-4 py-3",
646 │ Platform.OS === "android" ? "m-2 rounded-[20px]" : "border-b border-border",
647 │ )}
648 │ >
649 │ <Text className="text-sm font-t3-bold text-foreground">Review unavailable</Text>
650 │ <Text className="text-xs leading-normal text-foreground-muted">{error}</Text>
651 │ </View>,
652 │ );
653 │ }
654 │
655 │ if (parsedDiffNotice) {
656 │ children.push(<ReviewNotice key="review-notice" notice={parsedDiffNotice} />);
657 │ }
658 │
659 │ if (children.length === 0) {
660 │ return null;
661 │ }
662 │
663 │ return <>{children}</>;
664 │ })();
665 │ const headerSubtitle = [
666 │ headerDiffSummary.additions,
667 │ headerDiffSummary.deletions,
668 │ pendingReviewCommentCount > 0
669 │ ? `${pendingReviewCommentCount} comment${pendingReviewCommentCount === 1 ? "" : "s"}`
670 │ : null,
671 │ ]
672 │ .filter(Boolean)
673 │ .join(" · ");
674 │ const headerTitleText = selectedSection?.title ?? "Review changes";
675 │
676 │ return (
677 │ <>
678 │ <ReviewHeader
679 │ environmentId={environmentId}
680 │ threadId={threadId}
681 │ title={headerTitleText}
682 │ subtitle={headerSubtitle}
683 │ androidSubtitle={androidHeaderSubtitle}
684 │ iconColor={headerIcon}
685 │ selectedThreadCwd={selectedThreadCwd}
686 │ sectionMenu={sectionMenu}
687 │ selectedSection={selectedSection}
688 │ showSectionToolbar={showSectionToolbar}
689 │ showChangedFilesToggle={showChangedFilesToggle}
690 │ onRefresh={handlePullToRefresh}
691 │ onSelectSection={selectSection}
692 │ onReturnToThread={handleReturnToThread}
693 │ />
694 │
695 │ <ScreenContent>
696 │ <View className="flex-1 bg-sheet android:bg-sheet-solid">
697 │ {showConnectionNotice ? (
698 │ <View className="flex-1" style={{ paddingTop: topContentInset }}>
699 │ <EnvironmentConnectionNotice
700 │ environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
701 │ connection={
702 │ environment.presentation?.connection ?? {
703 │ phase: "available",
704 │ error: null,
705 │ traceId: null,
706 │ }
707 │ }
708 │ resourceName="review"
709 │ onRetry={handleRetryEnvironment}
710 │ />
711 │ </View>
712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
713 │ <View
714 │ className="flex-1"
715 │ style={{
716 │ backgroundColor: nativeBridge.theme.background,
717 │ }}
718 │ >
719 │ <View
720 │ className="min-w-0 flex-1"
721 │ style={listHeader ? { paddingTop: topContentInset } : undefined}
722 │ >
723 │ {listHeader}
724 │ <View className="min-w-0 flex-1" collapsable={false}>
725 │ <NativeReviewDiffView
· ──────────┬─────────
· ╰── This component is created during render
726 │ collapsable={false}
╰────
help: Components created during render will reset their state each time they are created. Declare components outside of render
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
⚠ react(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/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
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
╭─[packages/effect-acp/src/protocol.test.ts:500:31]
499 │
500 │ const response = yield* Schema.decodeUnknownEffect(
· ──────────────────────────
501 │ Schema.fromJsonString(JsonRpcErrorResponse),
╰────
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
╭─[packages/effect-acp/src/errors.test.ts:129:28]
128 │ const secret = "acp-summary-secret";
129 │ const cause = yield* Schema.decodeUnknownEffect(
· ──────────────────────────
130 │ Schema.Struct({
╰────
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/StackHeader.tsx:185:9]
184 │ "options",
185 │ latestOptionFunctionsRef.current,
· ────────────────┬───────────────
· ╰── Passing a ref to a function may read its value during render
186 │ optionFunctionWrappersRef.current,
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/StackHeader.tsx:186:9]
185 │ latestOptionFunctionsRef.current,
186 │ optionFunctionWrappersRef.current,
· ────────────────┬────────────────
· ╰── Passing a ref to a function may read its value during render
187 │ ) as NativeStackNavigationOptions)
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[packages/effect-acp/src/client.ts:1269:11]
1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
· ──────────────────────────
1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11]
132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor;
133 │ ╭─▶ for (
134 │ │ let attempt = 0;
135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true";
136 │ │ attempt += 1
137 │ │ ) {
138 │ │ yield* Effect.yieldNow;
139 │ ╰─▶ }
140 │ expect((yield* monitor.snapshot).onBattery).toBe("true");
╰────
⚠ 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
⚠ 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.
⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/usage/UsageService.ts:169:7]
168 │
169 │ const layerTest = Layer.succeed(
· ────┬────
· ╰── 'layerTest' is declared here
170 │ UsageService,
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7]
913 │
914 │ const layerDaemon: Layer.Layer<never, never, OrchestrationEffectWorkerV2> = Layer.effectDiscard(
· ─────┬─────
· ╰── 'layerDaemon' is declared here
915 │ runDaemon.pipe(Effect.forkScoped),
╰────
help: Consider removing this declaration.
⚠ 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
⚠ 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.
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/usage/UsageService.test.ts:2615:7]
2614 │ let orphanedAt: number | undefined;
2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) {
2616 │ │ const tasks: Array<() => void> = [];
2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = {
2618 │ │ scheduleTask: (task) => tasks.push(task),
2619 │ │ flush: () => {
2620 │ │ let task: (() => void) | undefined;
2621 │ │ while ((task = tasks.shift()) !== undefined) task();
2622 │ │ },
2623 │ │ };
2624 │ │
2625 │ │ let requestFiber: Fiber.Fiber<unknown, unknown> | undefined;
2626 │ │ let requestChecks = 0;
2627 │ │ const scheduler: Scheduler.Scheduler = {
2628 │ │ executionMode: "async",
2629 │ │ makeDispatcher: () => dispatcher,
2630 │ │ shouldYield: (fiber) => {
2631 │ │ if (fiber !== requestFiber) return false;
2632 │ │ requestChecks += 1;
2633 │ │ if (requestChecks !== interruptAt) return false;
2634 │ │ fiber.interruptUnsafe();
2635 │ │ return true;
2636 │ │ },
2637 │ │ };
2638 │ │
2639 │ │ const input: UsageSummaryInput = {
2640 │ │ ...WINDOW,
2641 │ │ sinceDay: UsageDay.make("2026-09-01"),
2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`),
2643 │ │ };
2644 │ │ const first = yield* service
2645 │ │ .readSummary(input)
2646 │ │ .pipe(
2647 │ │ Effect.exit,
2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler),
2649 │ │ Effect.forkChild,
2650 │ │ );
2651 │ │ requestFiber = first;
2652 │ │ yield* Effect.yieldNow;
2653 │ │ dispatcher.flush();
2654 │ │
2655 │ │ const second = yield* service.readSummary(input).pipe(
2656 │ │ Effect.match({
2657 │ │ onFailure: (error) => error.reason,
2658 │ │ onSuccess: () => "success" as const,
2659 │ │ }),
2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler),
2661 │ │ Effect.forkChild,
2662 │ │ );
2663 │ │ yield* Effect.yieldNow;
2664 │ │ dispatcher.flush();
2665 │ │ const secondExit = second.pollUnsafe();
2666 │ │ if (secondExit === undefined) {
2667 │ │ second.interruptUnsafe();
2668 │ │ orphanedAt = interruptAt;
2669 │ │ break;
2670 │ │ }
2671 │ │ if (Exit.isFailure(secondExit)) {
2672 │ │ assert.fail("the matching request fiber was interrupted");
2673 │ │ }
2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow");
2675 │ ╰─▶ }
2676 │
╰────
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/threads/thread-work-log.tsx:174:5]
170 │ const expandedAngle = props.collapsedDirection === "right" ? 90 : 180;
171 │ const rotation = useSharedValue(props.expanded ? expandedAngle : 0);
· ────┬───
· ╰── `rotation` originates here
172 │
173 │ useLayoutEffect(() => {
174 │ rotation.value = withTiming(props.expanded ? expandedAngle : 0, {
· ────┬───
· ╰── `rotation` cannot be modified
175 │ duration: THREAD_DISCLOSURE_TRANSITION_MS,
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
╭─[apps/mobile/src/features/threads/thread-work-log.tsx:1246:23]
1245 │ <Text
1246 │ key={`${index}:${line}`}
· ────────────────────────
1247 │ selectable
╰────
help: Use a unique data-dependent key to avoid unnecessary rerenders
⚠ eslint(no-unused-vars): Identifier 'HostProcess' is imported but never used.
╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:25:13]
24 │ import * as Schema from "effect/Schema";
25 │ import * as HostProcess from "@t3tools/shared/HostProcess";
· ─────┬─────
· ╰── 'HostProcess' is imported here
26 │
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Variable 'serverConfig' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:124:11]
123 │ const path = yield* Path.Path;
124 │ const serverConfig = yield* ServerConfig.ServerConfig;
· ──────┬─────
· ╰── 'serverConfig' is declared here
125 │ const serverSettings = yield* ServerSettings.ServerSettingsService;
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Variable 'serverSettings' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/orchestration-v2/ProviderTurnStartService.ts:125:11]
124 │ const serverConfig = yield* ServerConfig.ServerConfig;
125 │ const serverSettings = yield* ServerSettings.ServerSettingsService;
· ───────┬──────
· ╰── 'serverSettings' is declared here
126 │ const gitWorkflow = yield* GitWorkflowService.GitWorkflowService;
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'.
╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7]
14 │
15 │ const legacyCredentials = {
· ────────┬────────
· ╰── 'legacyCredentials' is declared here
16 │ version: 1 as const,
╰────
help: Consider removing this declaration.
⚠ eslint(no-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.
⚠ 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
⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
╭─[packages/provider-pi/src/server/adapter.ts:3405:7]
3404 │
3405 │ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, PiAdapterV2DriverEnv> =
· ──┬──
· ╰── 'layer' is declared here
3406 │ Layer.effect(
╰────
help: Consider removing this declaration.
⚠ 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): Identifier 'Duration' is imported but never used.
╭─[packages/provider-pi/src/server/adapter.test.ts:24:13]
23 │ import * as Deferred from "effect/Deferred";
24 │ import * as Duration from "effect/Duration";
· ────┬───
· ╰── 'Duration' is imported here
25 │ import * as Effect from "effect/Effect";
╰────
help: Consider removing this import.
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5]
404 │
405 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
406 │ setInspectorSelection((current) => {
· ──────────┬──────────
· ╰── Avoid calling setState() directly within an effect
407 │ 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:534:24]
533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
534 │ ╭─▶ const GitInspector = () => (
535 │ │ <GitOverviewSheet
536 │ │ headerInset={inspectorHeaderInset}
537 │ │ presentation="inspector"
538 │ │ route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
539 │ │ />
540 │ ╰─▶ );
541 │ 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:541:26]
540 │ );
541 │ ╭─▶ const FilesInspector = () =>
542 │ │ selectedThread !== null && selectedThreadCwd !== null ? (
543 │ │ <ThreadFileNavigatorPane
544 │ │ cwd={selectedThreadCwd}
545 │ │ environmentId={selectedThread.environmentId}
546 │ │ headerInset={inspectorHeaderInset}
547 │ │ projectName={selectedThreadProject?.title ?? "Files"}
548 │ │ selectedPath={null}
549 │ │ onSelectFile={handleSelectInspectorFile}
550 │ │ />
551 │ ╰─▶ ) : null;
552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
╰────
help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7]
53 │ function usePulseAnimation(pulse: boolean) {
54 │ const pulseProgress = useSharedValue(0);
· ──────┬──────
· ╰── `pulseProgress` originates here
55 │
56 │ useEffect(() => {
57 │ if (pulse) {
58 │ pulseProgress.value = withRepeat(
· ──────┬──────
· ╰── `pulseProgress` cannot be modified
59 │ withTiming(1, {
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5]
76 │
77 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
78 │ const { host, code } = parsePairingUrl(connectionPairingUrl);
79 │ setHostInput(host);
· ──────┬─────
· ╰── Avoid calling setState() directly within an effect
80 │ setCodeInput(code);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5]
82 │
83 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
84 │ if (routePairingUrl.length === 0) {
85 │ return;
86 │ }
87 │
88 │ const { host, code } = parsePairingUrl(routePairingUrl);
89 │ setHostInput(host);
· ──────┬─────
· ╰── Avoid calling setState() directly within an effect
90 │ setCodeInput(code);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7]
92 │
93 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
94 │ if (pairingConnectionError) {
95 │ setIsSubmitting(false);
· ───────┬───────
· ╰── Avoid calling setState() directly within an effect
96 │ }
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(purity): Cannot call impure function during render
╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:698:76]
697 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
698 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
· ─────┬────
· ╰── Cannot call impure function
699 │ 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:719:71]
718 │ const snoozePresets = useMemo(
719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
· ─────┬────
· ╰── Cannot call impure function
720 │ [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:720:6]
719 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
720 │ [props.snoozePresetMinute, swipeActions.secondary],
· ────────────┬───────────
· ╰── Unnecessary dependency `props.snoozePresetMinute`
721 │ );
╰────
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:766:7]
765 │ thread.pinnedAt,
766 │ variant,
· ───┬───
· ╰── Unnecessary dependency `variant`
767 │ ],
╰────
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:1216:21]
1215 │ {providerDrivers.slice(0, -1).map((driver, index) => (
1216 │ <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
· ──────────────────────────
1217 │ <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 '_'.
╭─[packages/provider-cursor/src/server/auth.ts:249:20]
248 │ },
249 │ (effect, flow, stopSessions) =>
· ──────┬─────
· ╰── 'stopSessions' is declared here
250 │ effect.pipe(
╰────
help: Consider removing this parameter.
⚠ react(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
⚠ eslint(no-unused-vars): Function 'layerClaudeAgentSdkReplayQueryRunner' is declared but never used.
╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.testkit.ts:960:10]
959 │
960 │ function layerClaudeAgentSdkReplayQueryRunner(
· ──────────────────┬─────────────────
· ╰── 'layerClaudeAgentSdkReplayQueryRunner' is declared here
961 │ transcript: ClaudeAgentSdkReplayTranscript,
╰────
help: Consider removing this declaration.
⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:1998:15]
1997 │ assert.equal(
1998 │ items.filter((item) => item.type === "assistant_message").at(-1)?.text,
· ──────
1999 │ "authoritative answer",
╰────
help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:3951:7]
3950 │ const closeFiber = yield* Scope.close(sessionScope, Exit.void).pipe(Effect.forkScoped);
3951 │ ╭─▶ while (!responseLifecycle.includes("failed")) {
3952 │ │ yield* Effect.yieldNow;
3953 │ ╰─▶ }
3954 │ const responseExit = yield* Fiber.join(responseFiber);
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6062:9]
6061 │ .pipe(Effect.forkScoped);
6062 │ ╭─▶ while (promptGates.length < 1) {
6063 │ │ yield* Effect.yieldNow;
6064 │ ╰─▶ }
6065 │ assert.isDefined(sessionUpdateHandler, "session update handler must be wired");
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/orchestration-v2/Adapters/AcpAdapterV2.test.ts:6197:9]
6196 │ .pipe(Effect.forkScoped);
6197 │ ╭─▶ while (promptGates.length < 2) {
6198 │ │ yield* Effect.yieldNow;
6199 │ ╰─▶ }
6200 │ if (sessionUpdateHandler === undefined || capturedMutation.current === null) {
╰────
⚠ eslint(no-empty-pattern): Empty object binding pattern
╭─[apps/server/src/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(purity): Cannot call impure function during render
╭─[apps/web/src/components/Sidebar.tsx:1136:11]
1135 │ foldSearchQuery(threadSearchQuery),
1136 │ Date.now(),
· ─────┬────
· ╰── Cannot call impure function
1137 │ // A list filter, as on mobile: a pick would move rows unexplained.
╰────
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:279:5]
277 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0);
278 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
279 │ setNow(new Date().toISOString());
· ───┬──
· ╰── Avoid calling setState() directly within an effect
280 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ eslint(no-unused-vars): Type 'EnvironmentThreadSearchMatch' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:13:8]
12 │ threadSearchMatchKey,
13 │ type EnvironmentThreadSearchMatch,
· ──────────────┬─────────────
· ╰── 'EnvironmentThreadSearchMatch' is imported here
14 │ } from "@t3tools/client-runtime/state/thread-search";
╰────
help: Consider removing this import.
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:359:25]
358 │ // range) the boundary string is identical and the chain would die.
359 │ }, [nextSnoozeWakeAt, snoozeWakeTick]);
· ───────┬──────
· ╰── Unnecessary dependency `snoozeWakeTick`
360 │ const listItems = ((): readonly SidebarListItem[] => {
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(purity): Cannot call impure function during render
╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:350:53]
349 │ if (Number.isNaN(wakeAtMs)) return;
350 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
· ─────┬────
· ╰── Cannot call impure function
351 │ const id = setTimeout(() => {
╰────
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5]
35 │
36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0);
· ────────┬────────
· ╰── `inspectorProgress` originates here
37 │ const { renderedInspectorWidth } = props;
38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
39 │
40 │ const onClosed = props.onClosed;
41 │ useEffect(() => {
42 │ inspectorProgress.value = withTiming(
· ────────┬────────
· ╰── `inspectorProgress` cannot be modified
43 │ inspectorVisible ? 1 : 0,
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7]
37 │ const { renderedInspectorWidth } = props;
38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
· ──────────┬─────────
· ╰── `renderedContentWidth` originates here
39 │
40 │ const onClosed = props.onClosed;
41 │ useEffect(() => {
42 │ inspectorProgress.value = withTiming(
43 │ inspectorVisible ? 1 : 0,
44 │ WORKSPACE_PANE_TIMING,
45 │ (finished) => {
46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) {
47 │ runOnJS(onClosed)();
48 │ }
49 │ },
50 │ );
51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0;
52 │ renderedInspectorWidth.set(
53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING),
54 │ );
55 │ }, [
56 │ inspectorProgress,
57 │ inspectorVisible,
58 │ inspectorWidth,
59 │ onClosed,
60 │ renderedInspectorWidth,
61 │ resizing,
62 │ ]);
63 │
64 │ useEffect(() => {
65 │ const targetWidth = inspectorWidth ?? 0;
66 │ if (!inspectorVisible || resizing) {
67 │ renderedContentWidth.value = targetWidth;
· ──────────┬─────────
· ╰── `renderedContentWidth` cannot be modified
68 │ return;
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:10578:7]
10577 │
10578 │ const layer: Layer.Layer<
· ──┬──
· ╰── 'layer' is declared here
10579 │ ProviderAdapter.ProviderAdapterV2,
╰────
help: Consider removing this declaration.
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:155:7]
154 │ }
155 │ }, [wrappedRender]);
· ──────┬──────
· ╰── Unnecessary dependency `wrappedRender`
156 │
╰────
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(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:800:42]
799 │ >
800 │ <AdaptiveWorkspaceContext.Provider value={contextValue}>
· ────────────────────
801 │ <WindowHingeContext value={windowHinge}>
╰────
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50]
289 │ return (
290 │ <ExistingThreadSettingsRouteContext.Provider value={value}>
· ─────────────
291 │ {props.children}
╰────
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44]
653 │ return (
654 │ <ThreadSettingsSessionContext.Provider value={value}>
· ─────────────
655 │ {props.children}
╰────
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55]
1461 │ return (
1462 │ <ThreadSettingsPickerPresentationContext.Provider value={presentation}>
· ────────────────────
1463 │ <ThreadSettingsPickerStack.Navigator
╰────
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
⚠ eslint(no-unused-vars): Variable 'layerCodexAppServerClientFactoryCommand' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1444:7]
1443 │
1444 │ const layerCodexAppServerClientFactoryCommand = (
· ───────────────────┬───────────────────
· ╰── 'layerCodexAppServerClientFactoryCommand' is declared here
1445 │ options: CodexClient.CodexAppServerClientOptions & {
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts:1680:7]
1679 │
1680 │ const layer: Layer.Layer<
· ──┬──
· ╰── 'layer' is declared here
1681 │ ProviderAdapter.ProviderAdapterV2,
╰────
help: Consider removing this declaration.
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5]
55 │
56 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
57 │ setDecodedSize(null);
· ───────┬──────
· ╰── Avoid calling setState() directly within an effect
58 │ }, [props.sourceKey]);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5]
59 │
60 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
61 │ setFailedUri(null);
· ──────┬─────
· ╰── Avoid calling setState() directly within an effect
62 │ }, [props.uri]);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10]
6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg";
7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native";
· ────────┬────────
· ╰── 'ActivityIndicator' is imported here
8 │
╰────
help: Consider removing this import.
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7]
57 │ setDecodedSize(null);
58 │ }, [props.sourceKey]);
· ───────┬───────
· ╰── Unnecessary dependency `props.sourceKey`
59 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7]
61 │ setFailedUri(null);
62 │ }, [props.uri]);
· ────┬────
· ╰── Unnecessary dependency `props.uri`
63 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5]
37 │ const [initialized, setInitialized] = useState(false);
38 │ useLayoutEffect(() => {
· ───────┬───────
· ╰── This is the containing effect
39 │ reset();
40 │ setInitialized(true);
· ───────┬──────
· ╰── Avoid calling setState() directly within an effect
41 │ }, [reset]);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5]
88 │
89 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
91 │ const branchName = initialProjectRef.branch;
92 │ let active = true;
93 │ setPendingCheckouts((count) => count + 1);
· ─────────┬─────────
· ╰── Avoid calling setState() directly within an effect
94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5]
107 │ );
108 │ const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0);
· ─────────┬────────
· ╰── `separationProgress` originates here
109 │
110 │ useEffect(() => {
111 │ separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING);
· ─────────┬────────
· ╰── `separationProgress` cannot be modified
112 │ }, [props.showScrollToEnd, separationProgress]);
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
128 │ // and repeatedly retargets the animation as it grows.
129 │ const capsuleWidth = useSharedValue<number | null>(null);
· ──────┬─────
· ╰── `capsuleWidth` originates here
130 │ const measuredWidthRef = useRef<number | null>(null);
131 │ const handleLabelLayout = (event: LayoutChangeEvent) => {
132 │ const width = event.nativeEvent.layout.width;
133 │ if (width === measuredWidthRef.current) {
134 │ return;
135 │ }
136 │ const first = measuredWidthRef.current === null;
137 │ measuredWidthRef.current = width;
138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
· ──────┬─────
· ╰── `capsuleWidth` cannot be modified
139 │ };
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
128 │ // and repeatedly retargets the animation as it grows.
129 │ const capsuleWidth = useSharedValue<number | null>(null);
· ──────┬─────
· ╰── `capsuleWidth` originates here
130 │ const measuredWidthRef = useRef<number | null>(null);
131 │ const handleLabelLayout = (event: LayoutChangeEvent) => {
132 │ const width = event.nativeEvent.layout.width;
133 │ if (width === measuredWidthRef.current) {
134 │ return;
135 │ }
136 │ const first = measuredWidthRef.current === null;
137 │ measuredWidthRef.current = width;
138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
139 │ };
140 │ const hasStatus = props.status !== null;
141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
142 │ useEffect(() => {
143 │ if (!hasStatus) {
144 │ measuredWidthRef.current = null;
145 │ capsuleWidth.value = null;
· ──────┬─────
· ╰── `capsuleWidth` cannot be modified
146 │ }
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(immutability): Cannot modify local variables after render completes
╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
142 │ useEffect(() => {
· ───┬───
· ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
143 │ if (!hasStatus) {
144 │ measuredWidthRef.current = null;
145 │ capsuleWidth.value = null;
· ──────┬─────
· ╰── This modifies `capsuleWidth`
146 │ }
╰────
help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(immutability): Cannot modify local variables after render completes
╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
130 │ const measuredWidthRef = useRef<number | null>(null);
131 │ const handleLabelLayout = (event: LayoutChangeEvent) => {
· ───────────────┬───────────────
· ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
132 │ const width = event.nativeEvent.layout.width;
133 │ if (width === measuredWidthRef.current) {
134 │ return;
135 │ }
136 │ const first = measuredWidthRef.current === null;
137 │ measuredWidthRef.current = width;
138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
· ──────┬─────
· ╰── This modifies `capsuleWidth`
139 │ };
╰────
help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
╭─[packages/client-runtime/src/operations/projects.ts:238:51]
237 │ ): string {
238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? "";
· ──────
239 │ return target.owner ? `${target.owner}/${folderName}` : folderName;
╰────
help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47]
371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props;
372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : [];
· ─────┬────
· ╰── Cannot call impure function
373 │ return (
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39]
852 │ if (snoozeGateClock.thread !== thread) {
853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() });
· ─────┬────
· ╰── Cannot call impure function
854 │ }
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2146:5]
2144 │ );
2145 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
2146 │ setExpandedVideo(null);
· ────────┬───────
· ╰── Avoid calling setState() directly within an effect
2147 │ setExpandedFile(null);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2647:9]
2638 │ const stopFollowingEnd = useEffectEvent(() => setEndFollow(false));
2639 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
2640 │ if (!jumpToMessageId || loadedListKey !== listMountKey) return;
2641 │ const index = presentedFeed.findIndex(
2642 │ (entry) => entry.type === "message" && entry.id === jumpToMessageId,
2643 │ );
2644 │ if (index === -1) {
2645 │ const runId = messageFoldRunId(props.feed, jumpToMessageId);
2646 │ if (runId && !expandedTurnIds.has(runId)) {
2647 │ setInteractionState((current) => ({
· ─────────┬─────────
· ╰── Avoid calling setState() directly within an effect
2648 │ ...current,
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx: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 'resolveMarkdownInlineCodePresentation' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:193:3]
192 │ normalizeNativeMarkdownUrl,
193 │ resolveMarkdownInlineCodePresentation,
· ──────────────────┬──────────────────
· ╰── 'resolveMarkdownInlineCodePresentation' is imported here
194 │ resolveMarkdownLinkPresentation,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:233:10]
232 │ import { ThreadMcpApp } from "./McpAppWebView";
233 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState";
· ────────────┬───────────
· ╰── 'useMarkdownCodeHighlight' is imported here
234 │ import {
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:237:3]
236 │ useAssetUrl,
237 │ useAssetUrlState,
· ────────┬───────
· ╰── 'useAssetUrlState' is imported here
238 │ useRefreshAssetUrl,
╰────
help: Consider removing this import.
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2148:7]
2147 │ setExpandedFile(null);
2148 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
· ─────────┬───────── ───────┬────── ───────────────┬──────────────
· │ │ ╰── Unnecessary dependency `props.contentPresentation.kind`
· │ ╰── Unnecessary dependency `props.threadId`
· ╰── Unnecessary dependency `props.environmentId`
2149 │ 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:2616:7]
2615 │ reportHeaderMaterialVisibility(false);
2616 │ }, [feedThreadKey, reportHeaderMaterialVisibility]);
· ──────┬──────
· ╰── Unnecessary dependency `feedThreadKey`
2617 │
╰────
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:2632:7]
2631 │ }
2632 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
· ──────┬─────
· ╰── Unnecessary dependency `listMountKey`
2633 │ // Opening at a message: its run unfolds, the list stops following the end
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2828:7]
2827 │ }
2828 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
· ───────┬─────── ─────────┬──────── ────────┬───────
· │ │ ╰── Unnecessary dependency `expandedWorkRows`
· │ ╰── Unnecessary dependency `expandedWorkGroups`
· ╰── Unnecessary dependency `expandedTurnIds`
2829 │
╰────
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:618:9]
617 │ };
618 │ }, [props.environmentId, attachment.id, httpBaseUrl]),
· ─────────┬───────── ──────┬────── ─────┬─────
· │ │ ╰── Unnecessary dependency `httpBaseUrl`
· │ ╰── Unnecessary dependency `attachment.id`
· ╰── Unnecessary dependency `props.environmentId`
619 │ );
╰────
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ eslint(no-unused-vars): Type '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.
⚠ 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): Function 'nonEmptyString' is declared but never used.
╭─[packages/client-runtime/src/work-log/presentation.ts:237:10]
236 │
237 │ function nonEmptyString(value: unknown): string | null {
· ───────┬──────
· ╰── 'nonEmptyString' is declared here
238 │ return typeof value === "string" && value.trim().length > 0 ? value : null;
╰────
help: Consider removing this declaration.
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7]
355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]);
356 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
357 │ if (!isReturningToProjectPicker) {
358 │ return;
359 │ }
360 │ if (requestedInitialProjectAvailable) {
361 │ setIsReturningToProjectPicker(false);
· ──────────────┬──────────────
· ╰── Avoid calling setState() directly within an effect
362 │ return;
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9]
447 │
448 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
449 │ if (props.pendingTaskId || props.draftId) {
450 │ return;
451 │ }
452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) {
453 │ lastInitialProjectRefRef.current = props.initialProjectRef;
454 │ appliedInitialProjectKeyRef.current = null;
455 │ }
456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId;
457 │ const initialProjectId = props.initialProjectRef?.projectId;
458 │ if (initialEnvironmentId && initialProjectId) {
459 │ const directProject =
460 │ projects.find(
461 │ (project) =>
462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId,
463 │ ) ?? null;
464 │
465 │ if (directProject) {
466 │ // Apply the route's project once. Re-applying on every change would
467 │ // instantly revert environment/project switches made in the picker.
468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`;
469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) {
470 │ return;
471 │ }
472 │ if (props.initialProjectRef?.branch) {
473 │ if (
474 │ selectedProject?.environmentId !== directProject.environmentId ||
475 │ selectedProject.id !== directProject.id
476 │ ) {
477 │ setProject(directProject);
478 │ return;
479 │ }
480 │ if (!flow.draftKey) return;
481 │ // The route completes checkout before mounting this composer. Local
482 │ // mode reuses an existing worktree; worktree mode would create another.
483 │ updateComposerDraftSettings(flow.draftKey, {
484 │ workspaceSelection: {
485 │ mode: "local",
486 │ branch: props.initialProjectRef.branch,
487 │ worktreePath: props.initialProjectRef.worktreePath ?? null,
488 │ startFromOrigin: false,
489 │ },
490 │ });
491 │ }
492 │ appliedInitialProjectKeyRef.current = directProjectKey;
493 │ if (
494 │ selectedProject?.environmentId === directProject.environmentId &&
495 │ selectedProject.id === directProject.id
496 │ ) {
497 │ return;
498 │ }
499 │ setProject(directProject);
500 │ return;
501 │ }
502 │
503 │ if (projects.length > 0) {
504 │ setIsReturningToProjectPicker(true);
· ──────────────┬──────────────
· ╰── Avoid calling setState() directly within an effect
505 │ }
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5]
545 │
546 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
547 │ const shareId = props.incomingShareId;
548 │ const draftKey = flow.draftKey;
549 │ const destinationProject = selectedProject;
550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId;
551 │ const initialProjectId = props.initialProjectRef?.projectId;
552 │ const selectedProjectMatchesRoute =
553 │ !initialEnvironmentId ||
554 │ !initialProjectId ||
555 │ (destinationProject?.environmentId === initialEnvironmentId &&
556 │ destinationProject.id === initialProjectId);
557 │ if (
558 │ !shareId ||
559 │ !draftKey ||
560 │ !destinationProject ||
561 │ !selectedProjectMatchesRoute ||
562 │ cancelledIncomingShareId === shareId
563 │ ) {
564 │ return;
565 │ }
566 │ const importKey = `${shareId}:${draftKey}`;
567 │ if (
568 │ startedShareImportKeyRef.current === importKey ||
569 │ cancellingShareImportKeyRef.current === importKey
570 │ ) {
571 │ return;
572 │ }
573 │
574 │ if (!incomingShare) {
575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) {
576 │ alertedUnavailableIncomingShareIdRef.current = shareId;
577 │ Dialog.alert(
578 │ "Shared content unavailable",
579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.",
580 │ );
581 │ }
582 │ return;
583 │ }
584 │
585 │ if (
586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") &&
587 │ selectedEnvironmentServerConfig === null
588 │ ) {
589 │ return;
590 │ }
591 │
592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) {
593 │ alertedUnavailableIncomingShareIdRef.current = null;
594 │ }
595 │ startedShareImportKeyRef.current = importKey;
596 │ const draftBackup =
597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey);
598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup);
599 │ const importToken = Symbol(importKey);
600 │ let didReserveShare = false;
601 │ let didConsumeShare = false;
602 │ let needsDraftRestore = false;
603 │ activeShareImportTokenRef.current = importToken;
604 │ setImportingShareKey(importKey);
· ──────────┬─────────
· ╰── Avoid calling setState() directly within an effect
605 │ void (async () => {
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5]
523 │ props.initialProjectRef,
524 │ props.incomingShareId,
· ──────────┬──────────
· ╰── Unnecessary dependency `props.incomingShareId`
525 │ props.pendingTaskId,
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5]
542 │ loadedBranchesProjectKeyRef.current = projectKey;
543 │ flow.loadBranches();
· ──┬─
· ╰── Missing dependency `flow`
544 │ }, [flow.loadBranches, selectedProject]);
· ────────┬────────
· ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead
545 │
╰────
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5]
765 │ flow.draftKey,
766 │ hasImportedIncomingShare,
· ────────────┬───────────
· ╰── Unnecessary dependency `hasImportedIncomingShare`
767 │ incomingShare,
768 │ isIncomingShareInboxLoading,
· ─────────────┬─────────────
· ╰── Unnecessary dependency `isIncomingShareInboxLoading`
769 │ isIncomingShareUnavailable,
770 │ props.incomingShareId,
771 │ props.initialProjectRef?.environmentId,
772 │ props.initialProjectRef?.projectId,
773 │ releaseShareReservation,
774 │ reserveShare,
775 │ selectedEnvironmentServerConfig,
776 │ selectedProject,
777 │ shareImportAttempt,
· ─────────┬────────
· ╰── Unnecessary dependency `shareImportAttempt`
778 │ ]);
╰────
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.
╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3]
27 │ ) {
28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
29 │ │ const available = yield* service.peek(workspaceRoot);
30 │ │ if (predicate(available)) return available;
31 │ │ yield* Effect.yieldNow;
32 │ ╰─▶ }
33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`);
╰────
⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24]
162 │ keys,
163 │ overridingProjects = [],
· ──
164 │ onClearOverrides,
╰────
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
⚠ eslint(no-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.
⚠ 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(
╰────
⚠ eslint(no-new): Do not use 'new' for side effects.
╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3]
167 │ // @ts-expect-error a declaration constructed directly
168 │ new McpToolAccess.Declaration(unchecked);
· ─────────────────────────────
169 │ // @ts-expect-error a handlers layer built outside McpToolAccess
╰────
help: Assign the result of 'new' to a variable or compare it to a reference.
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[apps/server/src/assets/AssetAccess.test.ts:975:35]
974 │ // Every client and server release spells the resource this way on the wire.
975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({
· ──────────────────────────
976 │ resource: { _tag: "github-media", cwd: "/repo", url },
╰────
⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32]
1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError");
1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error);
· ───────────────────
1013 │ expect(encoded).not.toContain(url);
╰────
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27]
120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"]));
121 │ const dispatch = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
122 │ (options.dispatchGate ?? Effect.void).pipe(
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39]
133 │ );
134 │ const listLocalBranchNames = vi.fn((_: string) =>
· ┬
· ╰── '_' is declared here
135 │ Effect.succeed(
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31]
177 │ });
178 │ const sendToThread = vi.fn((_: unknown) => {
· ┬
· ╰── '_' is declared here
179 │ switch (options.continuation ?? "queued") {
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33]
202 │ );
203 │ const removeWorktree = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
204 │ options.removeWorktreeFails
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36]
207 │ );
208 │ const deleteLocalBranch = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
209 │ options.deleteLocalBranchFails
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42]
212 │ );
213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
214 │ options.fetchWorktreeBaseFails
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30]
253 │ );
254 │ const localStatus = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
255 │ Effect.succeed({
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32]
263 │ );
264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub"));
· ┬
· ╰── '_' is declared here
265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => {
╰────
help: Consider removing this parameter.
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7]
168 │ });
169 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break;
171 │ │ yield* Effect.yieldNow;
172 │ ╰─▶ }
173 │
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7]
177 │ yield* Deferred.succeed(releaseSave, undefined);
178 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
179 │ │ if ((yield* Ref.get(saved)).length > 0) break;
180 │ │ yield* Effect.yieldNow;
181 │ ╰─▶ }
182 │
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7]
306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined);
307 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
308 │ │ const values = yield* Ref.get(saved);
309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) {
310 │ │ break;
311 │ │ }
312 │ │ yield* Effect.yieldNow;
313 │ ╰─▶ }
314 │
╰────
⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
╭─[packages/client-runtime/src/state/usageAccess.ts:3:8]
2 │ AuthDiagnosticsReadScope,
3 │ type AuthSessionState,
· ────────┬───────
· ╰── 'AuthSessionState' is imported here
4 │ sessionGrantsScope,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8]
3 │ AuthProvidersManageScope,
4 │ type AuthSessionState,
· ────────┬───────
· ╰── 'AuthSessionState' is imported here
5 │ type EnvironmentId,
╰────
help: Consider removing this import.
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7]
1679 │ yield* harness.replaceSession;
1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) {
1682 │ │ break;
1683 │ │ }
1684 │ │ yield* Effect.yieldNow;
1685 │ ╰─▶ }
1686 │ yield* Queue.offer(
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7]
1788 │ yield* harness.replaceSession;
1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break;
1791 │ │ yield* Effect.yieldNow;
1792 │ ╰─▶ }
1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2);
╰────
⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops
╭─[packages/client-runtime/src/state/shell.ts:189:5]
186 │ let waiting = yield* Ref.get(awaitingCompletion);
187 │ let next = initial;
· ──┬─
· ╰── From this accumulator
188 │ let receivedSnapshot = false;
189 │ for (const item of items) {
· ─┬─
· ╰── For this loop
190 │ if (item.kind === "synchronized") {
191 │ waiting = false;
192 │ if (Option.isSome(next.snapshot)) {
193 │ next = { ...next, status: "live", error: Option.none() };
· ───┬───
· ╰── 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(purity): Cannot call impure function during render
╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58]
151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) {
152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now());
· ─────┬────
· ╰── Cannot call impure function
153 │ }
╰────
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
╭─[packages/client-runtime/src/state/filesystem.ts:3:8]
2 │ AuthFilesystemReadScope,
3 │ type AuthSessionState,
· ────────┬───────
· ╰── 'AuthSessionState' is imported here
4 │ type FilesystemBrowseEntry,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used.
╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3]
1 │ import type {
2 │ EnvironmentId,
· ──────┬──────
· ╰── 'EnvironmentId' is imported here
3 │ ExecutionEnvironmentCapabilities,
╰────
help: Consider removing this import.
⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts.
╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14]
11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) {
12 │ this.onmessage = listener;
· ─────────
13 │ }
╰────
help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on<event>` replaces any previously registered handler.
⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9]
15 │ constructor() {
16 │ source = this;
· ──────
17 │ }
╰────
help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well.
⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used.
╭─[packages/client-runtime/src/state/threadSort.ts:4:13]
3 │ import type { EnvironmentThreadShell } from "./models.ts";
4 │ import * as Arr from "effect/Array";
· ─┬─
· ╰── 'Arr' is imported here
5 │ import * as Order from "effect/Order";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used.
╭─[packages/client-runtime/src/state/threadSort.ts:5:13]
4 │ import * as Arr from "effect/Array";
5 │ import * as Order from "effect/Order";
· ──┬──
· ╰── 'Order' is imported here
6 │
╰────
help: Consider removing this import.
⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
╭─[apps/web/src/components/chat/useComposerSend.ts:985:13]
984 │ const changedBeforeDecline = draftChangedSinceSend();
985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map(
986 │ │ (approval) => approval.requestId,
987 │ ╰─▶ );
988 │ const approvalResponding = approvalsToDecline.some((approval) =>
╰────
help: Switch to `Set`
⚠ eslint(no-unused-vars): 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.
⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret.
╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11]
516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) ||
517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)),
· ───────────────
518 │ )
╰────
help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`.
⚠ 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,
╰────
⚠ 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.
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[apps/server/src/auth/RpcAuthorization.ts:237:17]
236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => {
237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload);
· ────────────────────────
238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch);
╰────
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[apps/server/src/auth/RpcAuthorization.ts:256:26]
255 │ if (method === WS_METHODS.assetsCreateUrl) {
256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload);
· ────────────────────────
257 │ return [
╰────
⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
╭─[apps/mobile/modules/t3-source-text/src/SourceText.tsx:36:9]
35 │ <T3SourceTextRunNativeComponent
36 │ key={index}
· ───────────
37 │ style={flattenedStyle}
╰────
help: Use a unique data-dependent key to avoid unnecessary rerenders
⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used.
╭─[apps/server/src/auth/http.ts:28:10]
27 │ import * as Schema from "effect/Schema";
28 │ import { identity } from "effect/Function";
· ────┬───
· ╰── 'identity' is imported here
29 │ import * as Layer from "effect/Layer";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
60 │ ) {
61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
· ──────┬──────
· ╰── 'useDragRegion' is declared here
62 │ const isInline = props.mode === "inline";
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7]
217 │
218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect<void> =>
· ──────────┬──────────
· ╰── 'revokeActiveMcpThread' is declared here
219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void;
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7]
220 │
221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect<void> =>
· ──────────────┬──────────────
· ╰── 'revokeAllActiveMcpCredentials' is declared here
222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void;
╰────
help: Consider removing this declaration.
⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`.
╭─[apps/web/src/terminal/ghostty/core.ts:194:19]
193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start);
194 │ const codes = new Array<number>(count);
· ────────────────────────
195 │ for (let index = 0; index < count; index += 1) {
╰────
help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`.
⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used.
╭─[apps/web/src/types.ts:22:3]
21 │ EnvironmentThreadShell,
22 │ ThreadRunSummary,
· ────────┬───────
· ╰── 'ThreadRunSummary' is imported here
23 │ ThreadRuntimeSummary,
╰────
help: Consider removing this import.
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/hooks/useThreadActions.ts:821:56]
820 │ const resolved = resolveThreadTarget(target);
821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) {
· ─────┬────
· ╰── Cannot call impure function
822 │ return AsyncResult.failure(
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/hooks/useThreadActions.ts:709:46]
708 │ const wokeAt = resolved
709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() })
· ─────┬────
· ╰── Cannot call impure function
710 │ : null;
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
Found 0 errors and 367 warnings in 5477 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=__48c6f2dc-6752-4976-b7f5-fb336e52ecb5.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-fa50cf9b003d547cd32552f61b874eb4abe5dace3fdb4b1abd9610da2da24074, not saving cache.
##[end-action id=__48c6f2dc-6752-4976-b7f5-fb336e52ecb5.__actions_cache;outcome=success;conclusion=success;duration_ms=99]
##[start-action display=Cache Vite+;id=__48c6f2dc-6752-4976-b7f5-fb336e52ecb5.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=__48c6f2dc-6752-4976-b7f5-fb336e52ecb5.vp_cache;outcome=success;conclusion=success;duration_ms=72]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/94c41c10-167b-4dab-9d3f-45c0fa0ade31' 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: 150
BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 397
BLACKSMITH_CHECK_RUN_ID: 120896785339
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