GitHub check
256 KB of 596 KB loaded Download the full log (596 KB)
340 KB of earlier output not loaded
ef.current) {
2026-10-24T03:18:47.2050025Z 134 │ return;
2026-10-24T03:18:47.2050083Z 135 │ }
2026-10-24T03:18:47.2050194Z 136 │ const first = measuredWidthRef.current === null;
2026-10-24T03:18:47.2050279Z 137 │ measuredWidthRef.current = width;
2026-10-24T03:18:47.2050427Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-24T03:18:47.2050507Z · ──────┬─────
2026-10-24T03:18:47.2050652Z · ╰── `capsuleWidth` cannot be modified
2026-10-24T03:18:47.2050707Z 139 │ };
2026-10-24T03:18:47.2050762Z ╰────
2026-10-24T03:18:47.2051042Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2051364Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2051367Z
2026-10-24T03:18:47.2051530Z ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2051697Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
2026-10-24T03:18:47.2051810Z 128 │ // and repeatedly retargets the animation as it grows.
2026-10-24T03:18:47.2051929Z 129 │ const capsuleWidth = useSharedValue<number | null>(null);
2026-10-24T03:18:47.2052012Z · ──────┬─────
2026-10-24T03:18:47.2052151Z · ╰── `capsuleWidth` originates here
2026-10-24T03:18:47.2052266Z 130 │ const measuredWidthRef = useRef<number | null>(null);
2026-10-24T03:18:47.2052384Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-24T03:18:47.2052491Z 132 │ const width = event.nativeEvent.layout.width;
2026-10-24T03:18:47.2052587Z 133 │ if (width === measuredWidthRef.current) {
2026-10-24T03:18:47.2052651Z 134 │ return;
2026-10-24T03:18:47.2052708Z 135 │ }
2026-10-24T03:18:47.2052815Z 136 │ const first = measuredWidthRef.current === null;
2026-10-24T03:18:47.2052899Z 137 │ measuredWidthRef.current = width;
2026-10-24T03:18:47.2053043Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-24T03:18:47.2053099Z 139 │ };
2026-10-24T03:18:47.2053192Z 140 │ const hasStatus = props.status !== null;
2026-10-24T03:18:47.2053404Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
2026-10-24T03:18:47.2053529Z 142 │ useEffect(() => {
2026-10-24T03:18:47.2053620Z 143 │ if (!hasStatus) {
2026-10-24T03:18:47.2053710Z 144 │ measuredWidthRef.current = null;
2026-10-24T03:18:47.2053788Z 145 │ capsuleWidth.value = null;
2026-10-24T03:18:47.2053868Z · ──────┬─────
2026-10-24T03:18:47.2054013Z · ╰── `capsuleWidth` cannot be modified
2026-10-24T03:18:47.2054068Z 146 │ }
2026-10-24T03:18:47.2054123Z ╰────
2026-10-24T03:18:47.2054468Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2054786Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2054792Z
2026-10-24T03:18:47.2054998Z ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T03:18:47.2055161Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
2026-10-24T03:18:47.2055299Z 141 │ const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
2026-10-24T03:18:47.2055366Z 142 │ useEffect(() => {
2026-10-24T03:18:47.2055446Z · ───┬───
2026-10-24T03:18:47.2055671Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
2026-10-24T03:18:47.2055739Z 143 │ if (!hasStatus) {
2026-10-24T03:18:47.2055828Z 144 │ measuredWidthRef.current = null;
2026-10-24T03:18:47.2055907Z 145 │ capsuleWidth.value = null;
2026-10-24T03:18:47.2055990Z · ──────┬─────
2026-10-24T03:18:47.2056131Z · ╰── This modifies `capsuleWidth`
2026-10-24T03:18:47.2056188Z 146 │ }
2026-10-24T03:18:47.2056242Z ╰────
2026-10-24T03:18:47.2056585Z 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
2026-10-24T03:18:47.2057078Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2057082Z
2026-10-24T03:18:47.2057287Z ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T03:18:47.2057524Z ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
2026-10-24T03:18:47.2057723Z 130 │ const measuredWidthRef = useRef<number | null>(null);
2026-10-24T03:18:47.2057848Z 131 │ const handleLabelLayout = (event: LayoutChangeEvent) => {
2026-10-24T03:18:47.2057977Z · ───────────────┬───────────────
2026-10-24T03:18:47.2058223Z · ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
2026-10-24T03:18:47.2058331Z 132 │ const width = event.nativeEvent.layout.width;
2026-10-24T03:18:47.2058469Z 133 │ if (width === measuredWidthRef.current) {
2026-10-24T03:18:47.2058558Z 134 │ return;
2026-10-24T03:18:47.2058614Z 135 │ }
2026-10-24T03:18:47.2058723Z 136 │ const first = measuredWidthRef.current === null;
2026-10-24T03:18:47.2058808Z 137 │ measuredWidthRef.current = width;
2026-10-24T03:18:47.2058958Z 138 │ capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
2026-10-24T03:18:47.2059041Z · ──────┬─────
2026-10-24T03:18:47.2059178Z · ╰── This modifies `capsuleWidth`
2026-10-24T03:18:47.2059231Z 139 │ };
2026-10-24T03:18:47.2059287Z ╰────
2026-10-24T03:18:47.2059630Z 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
2026-10-24T03:18:47.2059947Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2059950Z
2026-10-24T03:18:47.2060426Z ⚠ 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.
2026-10-24T03:18:47.2060615Z ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
2026-10-24T03:18:47.2060689Z 520 │ })).delivery;
2026-10-24T03:18:47.2060894Z 521 │ ╭─▶ while (delivery.outcome === "accepted") {
2026-10-24T03:18:47.2061014Z 522 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2061162Z 523 │ │ delivery = (yield* service.getWebhookDelivery({
2026-10-24T03:18:47.2061266Z 524 │ │ id: task.id,
2026-10-24T03:18:47.2061386Z 525 │ │ deliveryId: deliveryId!,
2026-10-24T03:18:47.2061494Z 526 │ │ })).delivery;
2026-10-24T03:18:47.2061635Z 527 │ ╰─▶ }
2026-10-24T03:18:47.2061756Z 528 │ assert.equal(delivery.outcome, "dispatch_failed");
2026-10-24T03:18:47.2061811Z ╰────
2026-10-24T03:18:47.2061813Z
2026-10-24T03:18:47.2061984Z ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2062126Z ╭─[apps/server/src/process/externalLauncher.test.ts:186:12]
2026-10-24T03:18:47.2062182Z 185 │
2026-10-24T03:18:47.2062285Z 186 │ for (const {} of ["darwin", "linux"] as const) {
2026-10-24T03:18:47.2062358Z · ──
2026-10-24T03:18:47.2062413Z 187 │ }
2026-10-24T03:18:47.2062467Z ╰────
2026-10-24T03:18:47.2062774Z help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2062806Z
2026-10-24T03:18:47.2063031Z ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2063170Z ╭─[apps/server/src/process/externalLauncher.test.ts:189:12]
2026-10-24T03:18:47.2063225Z 188 │
2026-10-24T03:18:47.2063292Z 189 │ for (const {} of [
2026-10-24T03:18:47.2063365Z · ──
2026-10-24T03:18:47.2063458Z 190 │ { kind: "browser", folderVerb: "none" },
2026-10-24T03:18:47.2066322Z ╰────
2026-10-24T03:18:47.2066575Z help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2066578Z
2026-10-24T03:18:47.2066844Z ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2067035Z ╭─[apps/server/src/process/externalLauncher.test.ts:311:12]
2026-10-24T03:18:47.2067092Z 310 │
2026-10-24T03:18:47.2067221Z 311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) {
2026-10-24T03:18:47.2067293Z · ──
2026-10-24T03:18:47.2067346Z 312 │ }
2026-10-24T03:18:47.2067397Z ╰────
2026-10-24T03:18:47.2067626Z help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2067629Z
2026-10-24T03:18:47.2067797Z ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2067937Z ╭─[apps/server/src/process/externalLauncher.test.ts:314:12]
2026-10-24T03:18:47.2067989Z 313 │
2026-10-24T03:18:47.2068054Z 314 │ for (const {} of [
2026-10-24T03:18:47.2068128Z · ──
2026-10-24T03:18:47.2068186Z 315 │ {
2026-10-24T03:18:47.2068236Z ╰────
2026-10-24T03:18:47.2068470Z help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2068473Z
2026-10-24T03:18:47.2068947Z ⚠ 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.
2026-10-24T03:18:47.2069125Z ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5]
2026-10-24T03:18:47.2069194Z 222 │ let idlePasses = 0;
2026-10-24T03:18:47.2069340Z 223 │ ╭─▶ for (;;) {
2026-10-24T03:18:47.2069483Z 224 │ │ yield* Effect.promise(() => Promise.resolve());
2026-10-24T03:18:47.2069632Z 225 │ │ const pending = backgroundRuntime.pending.shift();
2026-10-24T03:18:47.2069730Z 226 │ │ if (!pending) {
2026-10-24T03:18:47.2069825Z 227 │ │ idlePasses++;
2026-10-24T03:18:47.2069933Z 228 │ │ if (idlePasses >= 3) {
2026-10-24T03:18:47.2070022Z 229 │ │ return;
2026-10-24T03:18:47.2070100Z 230 │ │ }
2026-10-24T03:18:47.2070185Z 231 │ │ continue;
2026-10-24T03:18:47.2070263Z 232 │ │ }
2026-10-24T03:18:47.2070355Z 233 │ │ idlePasses = 0;
2026-10-24T03:18:47.2070573Z 234 │ │ const exit = yield* Effect.exit(
2026-10-24T03:18:47.2070904Z 235 │ │ pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
2026-10-24T03:18:47.2070985Z 236 │ │ );
2026-10-24T03:18:47.2071094Z 237 │ │ yield* Effect.sync(() => {
2026-10-24T03:18:47.2071201Z 238 │ │ pending.resolve(exit);
2026-10-24T03:18:47.2071278Z 239 │ │ });
2026-10-24T03:18:47.2071413Z 240 │ ╰─▶ }
2026-10-24T03:18:47.2071505Z 241 │ },
2026-10-24T03:18:47.2071584Z ╰────
2026-10-24T03:18:47.2071590Z
2026-10-24T03:18:47.2071789Z ⚠ react(static-components): Cannot create components during render
2026-10-24T03:18:47.2071965Z ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
2026-10-24T03:18:47.2072055Z 196 │ const { onInput, onResize } = props;
2026-10-24T03:18:47.2072204Z 197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
2026-10-24T03:18:47.2072338Z · ────────────────┬───────────────
2026-10-24T03:18:47.2072532Z · ╰── The component is created during render here
2026-10-24T03:18:47.2072661Z 198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
2026-10-24T03:18:47.2072715Z 199 │
2026-10-24T03:18:47.2072781Z 200 │ useEffect(() => {
2026-10-24T03:18:47.2072873Z 201 │ terminalDebugLog("native:surface", {
2026-10-24T03:18:47.2072961Z 202 │ terminalKey: props.terminalKey,
2026-10-24T03:18:47.2073038Z 203 │ native: hasNativeSurface,
2026-10-24T03:18:47.2073178Z 204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
2026-10-24T03:18:47.2073267Z 205 │ bufferLen: props.buffer.length,
2026-10-24T03:18:47.2073347Z 206 │ isRunning: props.isRunning,
2026-10-24T03:18:47.2073404Z 207 │ });
2026-10-24T03:18:47.2073562Z 208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
2026-10-24T03:18:47.2073652Z 209 │ const handleNativeInput = useCallback(
2026-10-24T03:18:47.2073769Z 210 │ (event: NativeSyntheticEvent<TerminalInputEvent>) => {
2026-10-24T03:18:47.2073867Z 211 │ if (!props.isRunning || props.readOnly) {
2026-10-24T03:18:47.2073928Z 212 │ return;
2026-10-24T03:18:47.2073985Z 213 │ }
2026-10-24T03:18:47.2074076Z 214 │ terminalDebugLog("native:onInput", {
2026-10-24T03:18:47.2074233Z 215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
2026-10-24T03:18:47.2074296Z 216 │ });
2026-10-24T03:18:47.2074383Z 217 │ onInput(event.nativeEvent.data);
2026-10-24T03:18:47.2074440Z 218 │ },
2026-10-24T03:18:47.2074537Z 219 │ [onInput, props.isRunning, props.readOnly],
2026-10-24T03:18:47.2074594Z 220 │ );
2026-10-24T03:18:47.2074684Z 221 │ const handleNativeResize = useCallback(
2026-10-24T03:18:47.2074800Z 222 │ (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
2026-10-24T03:18:47.2074863Z 223 │ onResize({
2026-10-24T03:18:47.2074948Z 224 │ cols: event.nativeEvent.cols,
2026-10-24T03:18:47.2075032Z 225 │ rows: event.nativeEvent.rows,
2026-10-24T03:18:47.2075091Z 226 │ });
2026-10-24T03:18:47.2075147Z 227 │ },
2026-10-24T03:18:47.2075210Z 228 │ [onResize],
2026-10-24T03:18:47.2075267Z 229 │ );
2026-10-24T03:18:47.2075320Z 230 │
2026-10-24T03:18:47.2075484Z 231 │ if (NativeTerminalSurfaceView) {
2026-10-24T03:18:47.2075603Z 232 │ return (
2026-10-24T03:18:47.2075710Z 233 │ <View style={props.style}>
2026-10-24T03:18:47.2075791Z 234 │ <NativeTerminalSurfaceView
2026-10-24T03:18:47.2075900Z · ────────────┬────────────
2026-10-24T03:18:47.2076066Z · ╰── This component is created during render
2026-10-24T03:18:47.2076164Z 235 │ appearanceScheme={themeAppearance}
2026-10-24T03:18:47.2076216Z ╰────
2026-10-24T03:18:47.2076551Z help: Components created during render will reset their state each time they are created. Declare components outside of render
2026-10-24T03:18:47.2077066Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
2026-10-24T03:18:47.2077074Z
2026-10-24T03:18:47.2077487Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2077632Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2139:5]
2026-10-24T03:18:47.2077689Z 2137 │ );
2026-10-24T03:18:47.2077758Z 2138 │ useEffect(() => {
2026-10-24T03:18:47.2077833Z · ────┬────
2026-10-24T03:18:47.2077969Z · ╰── This is the containing effect
2026-10-24T03:18:47.2078044Z 2139 │ setExpandedVideo(null);
2026-10-24T03:18:47.2078128Z · ────────┬───────
2026-10-24T03:18:47.2078307Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2078391Z 2140 │ setExpandedFile(null);
2026-10-24T03:18:47.2078447Z ╰────
2026-10-24T03:18:47.2079084Z 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.
2026-10-24T03:18:47.2079427Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2079430Z
2026-10-24T03:18:47.2079675Z ⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
2026-10-24T03:18:47.2079815Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:66:10]
2026-10-24T03:18:47.2079961Z 65 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
2026-10-24T03:18:47.2080110Z 66 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
2026-10-24T03:18:47.2080210Z · ───────────┬───────────
2026-10-24T03:18:47.2080380Z · ╰── 'isMarkdownFileLinkLabel' is imported here
2026-10-24T03:18:47.2080540Z 67 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments";
2026-10-24T03:18:47.2080594Z ╰────
2026-10-24T03:18:47.2080695Z help: Consider removing this import.
2026-10-24T03:18:47.2080698Z
2026-10-24T03:18:47.2080914Z ⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used.
2026-10-24T03:18:47.2081048Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:92:3]
2026-10-24T03:18:47.2081199Z 91 │ import {
2026-10-24T03:18:47.2081321Z 92 │ createContext,
2026-10-24T03:18:47.2081427Z · ──────┬──────
2026-10-24T03:18:47.2081564Z · ╰── 'createContext' is imported here
2026-10-24T03:18:47.2081623Z 93 │ memo,
2026-10-24T03:18:47.2081677Z ╰────
2026-10-24T03:18:47.2081778Z help: Consider removing this import.
2026-10-24T03:18:47.2081781Z
2026-10-24T03:18:47.2081998Z ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
2026-10-24T03:18:47.2082208Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:108:3]
2026-10-24T03:18:47.2082269Z 107 │ import {
2026-10-24T03:18:47.2082339Z 108 │ ActivityIndicator,
2026-10-24T03:18:47.2082420Z · ────────┬────────
2026-10-24T03:18:47.2082577Z · ╰── 'ActivityIndicator' is imported here
2026-10-24T03:18:47.2082639Z 109 │ Image,
2026-10-24T03:18:47.2082693Z ╰────
2026-10-24T03:18:47.2082789Z help: Consider removing this import.
2026-10-24T03:18:47.2082791Z
2026-10-24T03:18:47.2083000Z ⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
2026-10-24T03:18:47.2083135Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:115:3]
2026-10-24T03:18:47.2083198Z 114 │ Pressable,
2026-10-24T03:18:47.2083260Z 115 │ ScrollView,
2026-10-24T03:18:47.2083335Z · ─────┬────
2026-10-24T03:18:47.2083471Z · ╰── 'ScrollView' is imported here
2026-10-24T03:18:47.2083534Z 116 │ StyleSheet,
2026-10-24T03:18:47.2083585Z ╰────
2026-10-24T03:18:47.2083690Z help: Consider removing this import.
2026-10-24T03:18:47.2083695Z
2026-10-24T03:18:47.2083903Z ⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
2026-10-24T03:18:47.2084038Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:117:11]
2026-10-24T03:18:47.2084098Z 116 │ StyleSheet,
2026-10-24T03:18:47.2084167Z 117 │ Text as NativeText,
2026-10-24T03:18:47.2084249Z · ─────┬────
2026-10-24T03:18:47.2084390Z · ╰── 'NativeText' is imported here
2026-10-24T03:18:47.2084457Z 118 │ type ColorValue,
2026-10-24T03:18:47.2084509Z ╰────
2026-10-24T03:18:47.2084608Z help: Consider removing this import.
2026-10-24T03:18:47.2084610Z
2026-10-24T03:18:47.2084909Z ⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used.
2026-10-24T03:18:47.2085130Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:140:10]
2026-10-24T03:18:47.2085270Z 139 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
2026-10-24T03:18:47.2085399Z 140 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
2026-10-24T03:18:47.2085490Z · ─────────┬────────
2026-10-24T03:18:47.2085648Z · ╰── 'tryOpenExternalUrl' is imported here
2026-10-24T03:18:47.2085949Z 141 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload";
2026-10-24T03:18:47.2086005Z ╰────
2026-10-24T03:18:47.2086102Z help: Consider removing this import.
2026-10-24T03:18:47.2086105Z
2026-10-24T03:18:47.2086336Z ⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used.
2026-10-24T03:18:47.2086470Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:143:10]
2026-10-24T03:18:47.2086607Z 142 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
2026-10-24T03:18:47.2086804Z 143 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
2026-10-24T03:18:47.2086945Z · ─────────┬─────────
2026-10-24T03:18:47.2087156Z · ╰── 'faviconUrlForOrigin' is imported here
2026-10-24T03:18:47.2087217Z 144 │ import {
2026-10-24T03:18:47.2087270Z ╰────
2026-10-24T03:18:47.2087366Z help: Consider removing this import.
2026-10-24T03:18:47.2087368Z
2026-10-24T03:18:47.2087582Z ⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
2026-10-24T03:18:47.2087723Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:10]
2026-10-24T03:18:47.2087878Z 156 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
2026-10-24T03:18:47.2088018Z 157 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
2026-10-24T03:18:47.2088106Z · ────────┬───────
2026-10-24T03:18:47.2088259Z · ╰── 'MediaVideoPlayer' is imported here
2026-10-24T03:18:47.2088399Z 158 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia";
2026-10-24T03:18:47.2088452Z ╰────
2026-10-24T03:18:47.2088548Z help: Consider removing this import.
2026-10-24T03:18:47.2088550Z
2026-10-24T03:18:47.2088781Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used.
2026-10-24T03:18:47.2088921Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:161:3]
2026-10-24T03:18:47.2089008Z 160 │ attachmentVideoPreviewSource,
2026-10-24T03:18:47.2089080Z 161 │ mediaVideoPreviewUri,
2026-10-24T03:18:47.2089167Z · ──────────┬─────────
2026-10-24T03:18:47.2089323Z · ╰── 'mediaVideoPreviewUri' is imported here
2026-10-24T03:18:47.2089398Z 162 │ mediaVideoThumbnailKey,
2026-10-24T03:18:47.2089449Z ╰────
2026-10-24T03:18:47.2089546Z help: Consider removing this import.
2026-10-24T03:18:47.2089548Z
2026-10-24T03:18:47.2089774Z ⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
2026-10-24T03:18:47.2089908Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:162:3]
2026-10-24T03:18:47.2089977Z 161 │ mediaVideoPreviewUri,
2026-10-24T03:18:47.2090146Z 162 │ mediaVideoThumbnailKey,
2026-10-24T03:18:47.2090313Z · ───────────┬──────────
2026-10-24T03:18:47.2090499Z · ╰── 'mediaVideoThumbnailKey' is imported here
2026-10-24T03:18:47.2090579Z 163 │ type MediaVideoPreviewSource,
2026-10-24T03:18:47.2090634Z ╰────
2026-10-24T03:18:47.2090731Z help: Consider removing this import.
2026-10-24T03:18:47.2090734Z
2026-10-24T03:18:47.2090954Z ⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used.
2026-10-24T03:18:47.2091151Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:163:8]
2026-10-24T03:18:47.2091231Z 162 │ mediaVideoThumbnailKey,
2026-10-24T03:18:47.2091312Z 163 │ type MediaVideoPreviewSource,
2026-10-24T03:18:47.2091408Z · ───────────┬───────────
2026-10-24T03:18:47.2091581Z · ╰── 'MediaVideoPreviewSource' is imported here
2026-10-24T03:18:47.2091673Z 164 │ } from "../../lib/videoPreviewSource";
2026-10-24T03:18:47.2091726Z ╰────
2026-10-24T03:18:47.2091822Z help: Consider removing this import.
2026-10-24T03:18:47.2091824Z
2026-10-24T03:18:47.2092023Z ⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used.
2026-10-24T03:18:47.2092158Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:171:15]
2026-10-24T03:18:47.2092339Z 170 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection";
2026-10-24T03:18:47.2092483Z 171 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter";
2026-10-24T03:18:47.2092576Z · ───────┬───────
2026-10-24T03:18:47.2092733Z · ╰── 'ReviewDiffTheme' is imported here
2026-10-24T03:18:47.2092796Z 172 │ import {
2026-10-24T03:18:47.2092850Z ╰────
2026-10-24T03:18:47.2092945Z help: Consider removing this import.
2026-10-24T03:18:47.2092948Z
2026-10-24T03:18:47.2093179Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
2026-10-24T03:18:47.2093310Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:186:3]
2026-10-24T03:18:47.2093370Z 185 │ import {
2026-10-24T03:18:47.2093447Z 186 │ resolveMarkdownFontSizes,
2026-10-24T03:18:47.2093538Z · ────────────┬───────────
2026-10-24T03:18:47.2093702Z · ╰── 'resolveMarkdownFontSizes' is imported here
2026-10-24T03:18:47.2093796Z 187 │ resolveNativeMarkdownTypography,
2026-10-24T03:18:47.2093851Z ╰────
2026-10-24T03:18:47.2093945Z help: Consider removing this import.
2026-10-24T03:18:47.2093947Z
2026-10-24T03:18:47.2094178Z ⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used.
2026-10-24T03:18:47.2094312Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:191:10]
2026-10-24T03:18:47.2094450Z 190 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon";
2026-10-24T03:18:47.2094588Z 191 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons";
2026-10-24T03:18:47.2094685Z · ───────────┬──────────
2026-10-24T03:18:47.2094850Z · ╰── 'markdownLinkIconSource' is imported here
2026-10-24T03:18:47.2094910Z 192 │ import {
2026-10-24T03:18:47.2094961Z ╰────
2026-10-24T03:18:47.2095135Z help: Consider removing this import.
2026-10-24T03:18:47.2095171Z
2026-10-24T03:18:47.2095498Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
2026-10-24T03:18:47.2095633Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:194:3]
2026-10-24T03:18:47.2095710Z 193 │ normalizeNativeMarkdownUrl,
2026-10-24T03:18:47.2095807Z 194 │ resolveMarkdownInlineCodePresentation,
2026-10-24T03:18:47.2095921Z · ──────────────────┬──────────────────
2026-10-24T03:18:47.2096201Z · ╰── 'resolveMarkdownInlineCodePresentation' is imported here
2026-10-24T03:18:47.2096275Z 195 │ resolveMarkdownLinkIcon,
2026-10-24T03:18:47.2096329Z ╰────
2026-10-24T03:18:47.2096433Z help: Consider removing this import.
2026-10-24T03:18:47.2096438Z
2026-10-24T03:18:47.2096720Z ⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used.
2026-10-24T03:18:47.2096925Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:195:3]
2026-10-24T03:18:47.2097048Z 194 │ resolveMarkdownInlineCodePresentation,
2026-10-24T03:18:47.2097122Z 195 │ resolveMarkdownLinkIcon,
2026-10-24T03:18:47.2097213Z · ───────────┬───────────
2026-10-24T03:18:47.2097372Z · ╰── 'resolveMarkdownLinkIcon' is imported here
2026-10-24T03:18:47.2097460Z 196 │ resolveMarkdownLinkPresentation,
2026-10-24T03:18:47.2097514Z ╰────
2026-10-24T03:18:47.2097610Z help: Consider removing this import.
2026-10-24T03:18:47.2097612Z
2026-10-24T03:18:47.2097847Z ⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used.
2026-10-24T03:18:47.2097984Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:234:10]
2026-10-24T03:18:47.2098089Z 233 │ import { ThreadMcpApp } from "./McpAppWebView";
2026-10-24T03:18:47.2098238Z 234 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState";
2026-10-24T03:18:47.2098340Z · ────────────┬───────────
2026-10-24T03:18:47.2098507Z · ╰── 'useMarkdownCodeHighlight' is imported here
2026-10-24T03:18:47.2098567Z 235 │ import {
2026-10-24T03:18:47.2098621Z ╰────
2026-10-24T03:18:47.2098716Z help: Consider removing this import.
2026-10-24T03:18:47.2098719Z
2026-10-24T03:18:47.2098940Z ⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
2026-10-24T03:18:47.2099077Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:238:3]
2026-10-24T03:18:47.2099143Z 237 │ useAssetUrl,
2026-10-24T03:18:47.2099212Z 238 │ useAssetUrlState,
2026-10-24T03:18:47.2099291Z · ────────┬───────
2026-10-24T03:18:47.2099437Z · ╰── 'useAssetUrlState' is imported here
2026-10-24T03:18:47.2099508Z 239 │ useRefreshAssetUrl,
2026-10-24T03:18:47.2099561Z ╰────
2026-10-24T03:18:47.2099654Z help: Consider removing this import.
2026-10-24T03:18:47.2099656Z
2026-10-24T03:18:47.2099866Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2100005Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2141:7]
2026-10-24T03:18:47.2100166Z 2140 │ setExpandedFile(null);
2026-10-24T03:18:47.2100417Z 2141 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
2026-10-24T03:18:47.2100649Z · ─────────┬───────── ───────┬────── ───────────────┬──────────────
2026-10-24T03:18:47.2100953Z · │ │ ╰── Unnecessary dependency `props.contentPresentation.kind`
2026-10-24T03:18:47.2101237Z · │ ╰── Unnecessary dependency `props.threadId`
2026-10-24T03:18:47.2101409Z · ╰── Unnecessary dependency `props.environmentId`
2026-10-24T03:18:47.2101552Z 2142 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16;
2026-10-24T03:18:47.2101616Z ╰────
2026-10-24T03:18:47.2101921Z 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
2026-10-24T03:18:47.2102241Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2102244Z
2026-10-24T03:18:47.2102449Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2102587Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2609:7]
2026-10-24T03:18:47.2102687Z 2608 │ reportHeaderMaterialVisibility(false);
2026-10-24T03:18:47.2102804Z 2609 │ }, [feedThreadKey, reportHeaderMaterialVisibility]);
2026-10-24T03:18:47.2102885Z · ──────┬──────
2026-10-24T03:18:47.2103047Z · ╰── Unnecessary dependency `feedThreadKey`
2026-10-24T03:18:47.2103106Z 2610 │
2026-10-24T03:18:47.2103160Z ╰────
2026-10-24T03:18:47.2103457Z 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
2026-10-24T03:18:47.2103770Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2103773Z
2026-10-24T03:18:47.2103976Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2104116Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2625:7]
2026-10-24T03:18:47.2104173Z 2624 │ }
2026-10-24T03:18:47.2104381Z 2625 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
2026-10-24T03:18:47.2104523Z · ──────┬─────
2026-10-24T03:18:47.2104697Z · ╰── Unnecessary dependency `listMountKey`
2026-10-24T03:18:47.2104752Z 2626 │
2026-10-24T03:18:47.2104806Z ╰────
2026-10-24T03:18:47.2105108Z 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
2026-10-24T03:18:47.2105509Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2105512Z
2026-10-24T03:18:47.2105714Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2105858Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2782:7]
2026-10-24T03:18:47.2105920Z 2781 │ }
2026-10-24T03:18:47.2106108Z 2782 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
2026-10-24T03:18:47.2106315Z · ───────┬─────── ─────────┬──────── ────────┬───────
2026-10-24T03:18:47.2106572Z · │ │ ╰── Unnecessary dependency `expandedWorkRows`
2026-10-24T03:18:47.2106904Z · │ ╰── Unnecessary dependency `expandedWorkGroups`
2026-10-24T03:18:47.2107112Z · ╰── Unnecessary dependency `expandedTurnIds`
2026-10-24T03:18:47.2107168Z 2783 │
2026-10-24T03:18:47.2107227Z ╰────
2026-10-24T03:18:47.2107536Z 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
2026-10-24T03:18:47.2107859Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2107861Z
2026-10-24T03:18:47.2108046Z ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T03:18:47.2108184Z ╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:613:9]
2026-10-24T03:18:47.2108242Z 612 │ };
2026-10-24T03:18:47.2108362Z 613 │ }, [props.environmentId, attachment.id, httpBaseUrl]),
2026-10-24T03:18:47.2108564Z · ─────────┬───────── ──────┬────── ─────┬─────
2026-10-24T03:18:47.2108818Z · │ │ ╰── Unnecessary dependency `httpBaseUrl`
2026-10-24T03:18:47.2109020Z · │ ╰── Unnecessary dependency `attachment.id`
2026-10-24T03:18:47.2109192Z · ╰── Unnecessary dependency `props.environmentId`
2026-10-24T03:18:47.2109249Z 614 │ );
2026-10-24T03:18:47.2109302Z ╰────
2026-10-24T03:18:47.2109624Z 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
2026-10-24T03:18:47.2110023Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2110062Z
2026-10-24T03:18:47.2110294Z ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2110457Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76]
2026-10-24T03:18:47.2110640Z 696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
2026-10-24T03:18:47.2110808Z 697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
2026-10-24T03:18:47.2111006Z · ─────┬────
2026-10-24T03:18:47.2111216Z · ╰── Cannot call impure function
2026-10-24T03:18:47.2111362Z 698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
2026-10-24T03:18:47.2111416Z ╰────
2026-10-24T03:18:47.2111710Z help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2112017Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2112019Z
2026-10-24T03:18:47.2112192Z ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2112353Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71]
2026-10-24T03:18:47.2112433Z 717 │ const snoozePresets = useMemo(
2026-10-24T03:18:47.2112623Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-24T03:18:47.2112762Z · ─────┬────
2026-10-24T03:18:47.2112946Z · ╰── Cannot call impure function
2026-10-24T03:18:47.2113065Z 719 │ [props.snoozePresetMinute, swipeActions.secondary],
2026-10-24T03:18:47.2113119Z ╰────
2026-10-24T03:18:47.2113407Z help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2113713Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2113716Z
2026-10-24T03:18:47.2113908Z ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T03:18:47.2114068Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6]
2026-10-24T03:18:47.2114249Z 718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
2026-10-24T03:18:47.2114368Z 719 │ [props.snoozePresetMinute, swipeActions.secondary],
2026-10-24T03:18:47.2114466Z · ────────────┬───────────
2026-10-24T03:18:47.2114646Z · ╰── Unnecessary dependency `props.snoozePresetMinute`
2026-10-24T03:18:47.2114704Z 720 │ );
2026-10-24T03:18:47.2114757Z ╰────
2026-10-24T03:18:47.2115074Z 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
2026-10-24T03:18:47.2115466Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2115563Z
2026-10-24T03:18:47.2115783Z ⚠ react(memo-dependencies): Found extra memoization dependencies
2026-10-24T03:18:47.2115940Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7]
2026-10-24T03:18:47.2116011Z 764 │ thread.pinnedAt,
2026-10-24T03:18:47.2116074Z 765 │ variant,
2026-10-24T03:18:47.2116150Z · ───┬───
2026-10-24T03:18:47.2116299Z · ╰── Unnecessary dependency `variant`
2026-10-24T03:18:47.2116386Z 766 │ ],
2026-10-24T03:18:47.2116464Z ╰────
2026-10-24T03:18:47.2116912Z 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
2026-10-24T03:18:47.2117423Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2117426Z
2026-10-24T03:18:47.2117625Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T03:18:47.2117788Z ╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21]
2026-10-24T03:18:47.2117923Z 1214 │ {providerDrivers.slice(0, -1).map((driver, index) => (
2026-10-24T03:18:47.2118063Z 1215 │ <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
2026-10-24T03:18:47.2118182Z · ──────────────────────────
2026-10-24T03:18:47.2118302Z 1216 │ <ProviderIcon provider={driver} size={12} />
2026-10-24T03:18:47.2118356Z ╰────
2026-10-24T03:18:47.2118505Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T03:18:47.2118507Z
2026-10-24T03:18:47.2118771Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2118935Z ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5]
2026-10-24T03:18:47.2119109Z 112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate }));
2026-10-24T03:18:47.2119178Z 113 │ useEffect(() => {
2026-10-24T03:18:47.2119252Z · ────┬────
2026-10-24T03:18:47.2119387Z · ╰── This is the containing effect
2026-10-24T03:18:47.2119556Z 114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) {
2026-10-24T03:18:47.2119621Z 115 │ return;
2026-10-24T03:18:47.2119678Z 116 │ }
2026-10-24T03:18:47.2119798Z 117 │ setEntry({ key: input.targetKey, location: candidate });
2026-10-24T03:18:47.2119869Z · ────┬───
2026-10-24T03:18:47.2120043Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2120166Z 118 │ }, [candidate, entry.key, entry.location, input.targetKey]);
2026-10-24T03:18:47.2120218Z ╰────
2026-10-24T03:18:47.2120850Z 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.
2026-10-24T03:18:47.2121260Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2121296Z
2026-10-24T03:18:47.2121572Z ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used.
2026-10-24T03:18:47.2121715Z ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10]
2026-10-24T03:18:47.2121770Z 21 │
2026-10-24T03:18:47.2121929Z 22 │ function summarizePayload(payload: unknown): Readonly<Record<string, unknown>> {
2026-10-24T03:18:47.2122021Z · ────────┬───────
2026-10-24T03:18:47.2122218Z · ╰── 'summarizePayload' is declared here
2026-10-24T03:18:47.2122352Z 23 │ if (payload === null) return { valueType: "null" };
2026-10-24T03:18:47.2122409Z ╰────
2026-10-24T03:18:47.2122521Z help: Consider removing this declaration.
2026-10-24T03:18:47.2122523Z
2026-10-24T03:18:47.2122787Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2122951Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:444:5]
2026-10-24T03:18:47.2123013Z 434 │ : null;
2026-10-24T03:18:47.2123079Z 435 │ useEffect(() => {
2026-10-24T03:18:47.2123153Z · ────┬────
2026-10-24T03:18:47.2123285Z · ╰── This is the containing effect
2026-10-24T03:18:47.2123343Z 436 │ if (
2026-10-24T03:18:47.2123423Z 437 │ props.active === false ||
2026-10-24T03:18:47.2123502Z 438 │ activeDraftKey !== null ||
2026-10-24T03:18:47.2123591Z 439 │ editingPendingTask !== null ||
2026-10-24T03:18:47.2123669Z 440 │ selectedProject === null
2026-10-24T03:18:47.2123727Z 441 │ ) {
2026-10-24T03:18:47.2123789Z 442 │ return;
2026-10-24T03:18:47.2123845Z 443 │ }
2026-10-24T03:18:47.2123914Z 444 │ setActiveDraftKey(
2026-10-24T03:18:47.2124002Z · ────────┬────────
2026-10-24T03:18:47.2124180Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2124254Z 445 │ createNewTaskDraft({
2026-10-24T03:18:47.2124306Z ╰────
2026-10-24T03:18:47.2125020Z 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.
2026-10-24T03:18:47.2125432Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2125434Z
2026-10-24T03:18:47.2125687Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-24T03:18:47.2125973Z ╭─[apps/mobile/src/features/threads/new-task-flow-provider.tsx:1244:36]
2026-10-24T03:18:47.2126081Z 1243 │ <ActiveNewTaskContext value={activeNewTask}>
2026-10-24T03:18:47.2126278Z 1244 │ <NewTaskFlowContext.Provider value={value}>{props.children}</NewTaskFlowContext.Provider>
2026-10-24T03:18:47.2126396Z · ─────────────
2026-10-24T03:18:47.2126472Z 1245 │ </ActiveNewTaskContext>
2026-10-24T03:18:47.2126530Z ╰────
2026-10-24T03:18:47.2126846Z help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-24T03:18:47.2127070Z Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-24T03:18:47.2127073Z
2026-10-24T03:18:47.2127350Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2127523Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
2026-10-24T03:18:47.2127576Z 638 │
2026-10-24T03:18:47.2127645Z 639 │ useEffect(() => {
2026-10-24T03:18:47.2127717Z · ────┬────
2026-10-24T03:18:47.2127849Z · ╰── This is the containing effect
2026-10-24T03:18:47.2127967Z 640 │ if (pendingLaunchEntry.key === launchTargetKey) {
2026-10-24T03:18:47.2128031Z 641 │ return;
2026-10-24T03:18:47.2128087Z 642 │ }
2026-10-24T03:18:47.2128160Z 643 │ setPendingLaunchEntry({
2026-10-24T03:18:47.2128252Z · ──────────┬──────────
2026-10-24T03:18:47.2128430Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2128502Z 644 │ key: launchTargetKey,
2026-10-24T03:18:47.2128555Z ╰────
2026-10-24T03:18:47.2129189Z 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.
2026-10-24T03:18:47.2129531Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2129536Z
2026-10-24T03:18:47.2129802Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2129977Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5]
2026-10-24T03:18:47.2130029Z 648 │
2026-10-24T03:18:47.2130096Z 649 │ useEffect(() => {
2026-10-24T03:18:47.2130168Z · ────┬────
2026-10-24T03:18:47.2130300Z · ╰── This is the containing effect
2026-10-24T03:18:47.2130416Z 650 │ if (initialAttachGridEntry.key === launchTargetKey) {
2026-10-24T03:18:47.2130477Z 651 │ return;
2026-10-24T03:18:47.2130622Z 652 │ }
2026-10-24T03:18:47.2130780Z 653 │ setInitialAttachGridEntry({
2026-10-24T03:18:47.2130899Z · ────────────┬────────────
2026-10-24T03:18:47.2131075Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2131149Z 654 │ key: launchTargetKey,
2026-10-24T03:18:47.2131202Z ╰────
2026-10-24T03:18:47.2131894Z 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.
2026-10-24T03:18:47.2132234Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2132239Z
2026-10-24T03:18:47.2132498Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2132672Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7]
2026-10-24T03:18:47.2132727Z 743 │
2026-10-24T03:18:47.2132791Z 744 │ useEffect(() => {
2026-10-24T03:18:47.2132863Z · ────┬────
2026-10-24T03:18:47.2132995Z · ╰── This is the containing effect
2026-10-24T03:18:47.2133099Z 745 │ if (!routeEnvironmentId || !routeThreadId) {
2026-10-24T03:18:47.2133167Z 746 │ setLastGridSize({
2026-10-24T03:18:47.2133252Z · ───────┬───────
2026-10-24T03:18:47.2133429Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2133518Z 747 │ cols: DEFAULT_TERMINAL_COLS,
2026-10-24T03:18:47.2133569Z ╰────
2026-10-24T03:18:47.2134194Z 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.
2026-10-24T03:18:47.2134527Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2134530Z
2026-10-24T03:18:47.2134741Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2134921Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24]
2026-10-24T03:18:47.2134980Z 537 │ });
2026-10-24T03:18:47.2135106Z 538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]);
2026-10-24T03:18:47.2135219Z · ───────────┬──────────
2026-10-24T03:18:47.2135471Z · ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
2026-10-24T03:18:47.2135635Z 539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
2026-10-24T03:18:47.2135689Z ╰────
2026-10-24T03:18:47.2135997Z 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
2026-10-24T03:18:47.2136390Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2136430Z
2026-10-24T03:18:47.2136730Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2137001Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7]
2026-10-24T03:18:47.2137117Z 708 │ sentInitialInputKeyRef.current = null;
2026-10-24T03:18:47.2137187Z 709 │ }, [terminalKey]);
2026-10-24T03:18:47.2137298Z · ─────┬─────
2026-10-24T03:18:47.2137483Z · ╰── Unnecessary dependency `terminalKey`
2026-10-24T03:18:47.2137539Z 710 │
2026-10-24T03:18:47.2137593Z ╰────
2026-10-24T03:18:47.2137901Z 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
2026-10-24T03:18:47.2138224Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2138226Z
2026-10-24T03:18:47.2138433Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2138605Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52]
2026-10-24T03:18:47.2138663Z 799 │ };
2026-10-24T03:18:47.2138842Z 800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
2026-10-24T03:18:47.2139025Z · ────────────┬──────────── ─────┬─────
2026-10-24T03:18:47.2139267Z · │ ╰── Unnecessary dependency `terminalKey`
2026-10-24T03:18:47.2139485Z · ╰── Unnecessary dependency `terminal.lifecycleVersion`
2026-10-24T03:18:47.2139539Z 801 │
2026-10-24T03:18:47.2139590Z ╰────
2026-10-24T03:18:47.2139893Z 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
2026-10-24T03:18:47.2140217Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2140220Z
2026-10-24T03:18:47.2140367Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2140539Z ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
2026-10-24T03:18:47.2140597Z 792 │ }
2026-10-24T03:18:47.2140707Z 793 │ const pasteSession = pasteSessionRef.current;
2026-10-24T03:18:47.2140824Z · ───────────┬───────────
2026-10-24T03:18:47.2140988Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2141043Z 794 │
2026-10-24T03:18:47.2141096Z ╰────
2026-10-24T03:18:47.2141572Z 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
2026-10-24T03:18:47.2141936Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2141973Z
2026-10-24T03:18:47.2142231Z ⚠ eslint(require-yield): This generator function does not have `yield`
2026-10-24T03:18:47.2142384Z ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78]
2026-10-24T03:18:47.2142442Z 80 │
2026-10-24T03:18:47.2142726Z 81 │ ╭─▶ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* (
2026-10-24T03:18:47.2142884Z 82 │ │ options: AcpMcpOverAcpBridgeOptions,
2026-10-24T03:18:47.2143048Z 83 │ │ ): Effect.fn.Return<AcpMcpOverAcpBridge> {
2026-10-24T03:18:47.2143221Z 84 │ │ const fetchImplementation = options.fetchImplementation ?? fetch;
2026-10-24T03:18:47.2143367Z 85 │ │ const connections = new Map<string, Connection>();
2026-10-24T03:18:47.2143439Z 86 │ │
2026-10-24T03:18:47.2143656Z 87 │ │ const connectionFor = (connectionId: string): Effect.Effect<Connection, AcpMcpOverAcpError> =>
2026-10-24T03:18:47.2143760Z 88 │ │ Effect.suspend(() => {
2026-10-24T03:18:47.2143902Z 89 │ │ const connection = connections.get(connectionId);
2026-10-24T03:18:47.2144016Z 90 │ │ return connection === undefined
2026-10-24T03:18:47.2144235Z 91 │ │ ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`))
2026-10-24T03:18:47.2144348Z 92 │ │ : Effect.succeed(connection);
2026-10-24T03:18:47.2144428Z 93 │ │ });
2026-10-24T03:18:47.2144504Z 94 │ │
2026-10-24T03:18:47.2144593Z 95 │ │ const send = (
2026-10-24T03:18:47.2144696Z 96 │ │ connection: Connection,
2026-10-24T03:18:47.2144791Z 97 │ │ message: unknown,
2026-10-24T03:18:47.2144952Z 98 │ │ ): Effect.Effect<ReadonlyArray<unknown>, AcpMcpOverAcpError> =>
2026-10-24T03:18:47.2145067Z 99 │ │ connection.mutex.withPermits(1)(
2026-10-24T03:18:47.2145176Z 100 │ │ Effect.gen(function* () {
2026-10-24T03:18:47.2145303Z 101 │ │ const body = JSON.stringify(message);
2026-10-24T03:18:47.2145448Z 102 │ │ if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) {
2026-10-24T03:18:47.2145667Z 103 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB."));
2026-10-24T03:18:47.2145750Z 104 │ │ }
2026-10-24T03:18:47.2145886Z 105 │ │ const response = yield* Effect.tryPromise({
2026-10-24T03:18:47.2145987Z 106 │ │ try: (signal) =>
2026-10-24T03:18:47.2146119Z 107 │ │ fetchImplementation(options.endpoint, {
2026-10-24T03:18:47.2146224Z 108 │ │ method: "POST",
2026-10-24T03:18:47.2146317Z 109 │ │ signal,
2026-10-24T03:18:47.2146417Z 110 │ │ headers: {
2026-10-24T03:18:47.2146544Z 111 │ │ "content-type": "application/json",
2026-10-24T03:18:47.2146823Z 112 │ │ accept: "application/json, text/event-stream",
2026-10-24T03:18:47.2147065Z 113 │ │ authorization: options.authorization,
2026-10-24T03:18:47.2147196Z 114 │ │ ...(connection.sessionId === null
2026-10-24T03:18:47.2147291Z 115 │ │ ? {}
2026-10-24T03:18:47.2147439Z 116 │ │ : { "mcp-session-id": connection.sessionId }),
2026-10-24T03:18:47.2147577Z 117 │ │ ...(connection.protocolVersion === null
2026-10-24T03:18:47.2147686Z 118 │ │ ? {}
2026-10-24T03:18:47.2147914Z 119 │ │ : { "mcp-protocol-version": connection.protocolVersion }),
2026-10-24T03:18:47.2148003Z 120 │ │ },
2026-10-24T03:18:47.2148101Z 121 │ │ body,
2026-10-24T03:18:47.2148190Z 122 │ │ }),
2026-10-24T03:18:47.2148293Z 123 │ │ catch: bridgeError,
2026-10-24T03:18:47.2148375Z 124 │ │ });
2026-10-24T03:18:47.2148593Z 125 │ │ connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId;
2026-10-24T03:18:47.2148696Z 126 │ │ if (!response.ok) {
2026-10-24T03:18:47.2148803Z 127 │ │ yield* Effect.promise(
2026-10-24T03:18:47.2148993Z 128 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
2026-10-24T03:18:47.2149076Z 129 │ │ );
2026-10-24T03:18:47.2149190Z 130 │ │ return yield* Effect.fail(
2026-10-24T03:18:47.2149411Z 131 │ │ new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`),
2026-10-24T03:18:47.2149494Z 132 │ │ );
2026-10-24T03:18:47.2149573Z 133 │ │ }
2026-10-24T03:18:47.2149786Z 134 │ │ const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))];
2026-10-24T03:18:47.2149908Z 135 │ │ for (const payload of payloads) {
2026-10-24T03:18:47.2150125Z 136 │ │ connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion;
2026-10-24T03:18:47.2150203Z 137 │ │ }
2026-10-24T03:18:47.2150304Z 138 │ │ return payloads;
2026-10-24T03:18:47.2150434Z 139 │ │ }).pipe(Effect.mapError(bridgeError)),
2026-10-24T03:18:47.2150511Z 140 │ │ );
2026-10-24T03:18:47.2150582Z 141 │ │
2026-10-24T03:18:47.2150760Z 142 │ │ const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* (
2026-10-24T03:18:47.2150888Z 143 │ │ request: AcpSchema.DisconnectMcpRequest,
2026-10-24T03:18:47.2151076Z 144 │ │ ): Effect.fn.Return<AcpSchema.DisconnectMcpResponse, AcpMcpOverAcpError> {
2026-10-24T03:18:47.2151245Z 145 │ │ const connection = yield* connectionFor(request.connectionId);
2026-10-24T03:18:47.2151373Z 146 │ │ connections.delete(request.connectionId);
2026-10-24T03:18:47.2151495Z 147 │ │ const sessionId = connection.sessionId;
2026-10-24T03:18:47.2151670Z 148 │ │ if (sessionId !== null) {
2026-10-24T03:18:47.2151890Z 149 │ │ const response = yield* Effect.tryPromise({
2026-10-24T03:18:47.2151990Z 150 │ │ try: (signal) =>
2026-10-24T03:18:47.2152123Z 151 │ │ fetchImplementation(options.endpoint, {
2026-10-24T03:18:47.2152223Z 152 │ │ method: "DELETE",
2026-10-24T03:18:47.2152315Z 153 │ │ signal,
2026-10-24T03:18:47.2152410Z 154 │ │ headers: {
2026-10-24T03:18:47.2152567Z 155 │ │ authorization: options.authorization,
2026-10-24T03:18:47.2152736Z 156 │ │ "mcp-session-id": sessionId,
2026-10-24T03:18:47.2152871Z 157 │ │ ...(connection.protocolVersion === null
2026-10-24T03:18:47.2152970Z 158 │ │ ? {}
2026-10-24T03:18:47.2153140Z 159 │ │ : { "mcp-protocol-version": connection.protocolVersion }),
2026-10-24T03:18:47.2153223Z 160 │ │ },
2026-10-24T03:18:47.2153307Z 161 │ │ }),
2026-10-24T03:18:47.2153407Z 162 │ │ catch: bridgeError,
2026-10-24T03:18:47.2153487Z 163 │ │ });
2026-10-24T03:18:47.2153621Z 164 │ │ if (!response.ok && response.status !== 404) {
2026-10-24T03:18:47.2153733Z 165 │ │ return yield* Effect.fail(
2026-10-24T03:18:47.2153844Z 166 │ │ new AcpMcpOverAcpError(
2026-10-24T03:18:47.2154038Z 167 │ │ `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`,
2026-10-24T03:18:47.2154122Z 168 │ │ ),
2026-10-24T03:18:47.2154200Z 169 │ │ );
2026-10-24T03:18:47.2154277Z 170 │ │ }
2026-10-24T03:18:47.2154381Z 171 │ │ yield* Effect.promise(
2026-10-24T03:18:47.2154561Z 172 │ │ () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
2026-10-24T03:18:47.2154638Z 173 │ │ );
2026-10-24T03:18:47.2154713Z 174 │ │ }
2026-10-24T03:18:47.2154798Z 175 │ │ return {};
2026-10-24T03:18:47.2154870Z 176 │ │ });
2026-10-24T03:18:47.2154938Z 177 │ │
2026-10-24T03:18:47.2155018Z 178 │ │ return {
2026-10-24T03:18:47.2155272Z 179 │ │ connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) {
2026-10-24T03:18:47.2155475Z 180 │ │ if (request.serverId !== "t3-code") {
2026-10-24T03:18:47.2155589Z 181 │ │ return yield* Effect.fail(
2026-10-24T03:18:47.2155781Z 182 │ │ new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`),
2026-10-24T03:18:47.2155860Z 183 │ │ );
2026-10-24T03:18:47.2155936Z 184 │ │ }
2026-10-24T03:18:47.2156064Z 185 │ │ if (connections.size >= MAX_CONNECTIONS) {
2026-10-24T03:18:47.2156355Z 186 │ │ return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections."));
2026-10-24T03:18:47.2156431Z 187 │ │ }
2026-10-24T03:18:47.2156595Z 188 │ │ const connectionId = yield* options.allocateConnectionId;
2026-10-24T03:18:47.2156774Z 189 │ │ connections.set(connectionId, {
2026-10-24T03:18:47.2156966Z 190 │ │ mutex: yield* Semaphore.make(1),
2026-10-24T03:18:47.2157124Z 191 │ │ sessionId: null,
2026-10-24T03:18:47.2157291Z 192 │ │ protocolVersion: null,
2026-10-24T03:18:47.2157446Z 193 │ │ nextRequestId: 0,
2026-10-24T03:18:47.2157531Z 194 │ │ });
2026-10-24T03:18:47.2157636Z 195 │ │ return { connectionId };
2026-10-24T03:18:47.2157712Z 196 │ │ }),
2026-10-24T03:18:47.2157889Z 197 │ │ message: Effect.fn("mcpOverAcpBridge.message")(function* (request) {
2026-10-24T03:18:47.2158060Z 198 │ │ const connection = yield* connectionFor(request.connectionId);
2026-10-24T03:18:47.2158188Z 199 │ │ const id = ++connection.nextRequestId;
2026-10-24T03:18:47.2158317Z 200 │ │ const payloads = yield* send(connection, {
2026-10-24T03:18:47.2158416Z 201 │ │ jsonrpc: "2.0",
2026-10-24T03:18:47.2158498Z 202 │ │ id,
2026-10-24T03:18:47.2158603Z 203 │ │ method: request.method,
2026-10-24T03:18:47.2158766Z 204 │ │ ...(request.params == null ? {} : { params: request.params }),
2026-10-24T03:18:47.2158843Z 205 │ │ });
2026-10-24T03:18:47.2159034Z 206 │ │ const response = payloads.find((payload) => asEnvelope(payload)?.id === id);
2026-10-24T03:18:47.2159163Z 207 │ │ const envelope = asEnvelope(response);
2026-10-24T03:18:47.2159269Z 208 │ │ if (envelope === null) {
2026-10-24T03:18:47.2159376Z 209 │ │ return yield* Effect.fail(
2026-10-24T03:18:47.2159566Z 210 │ │ new AcpMcpOverAcpError("MCP server did not return a matching response."),
2026-10-24T03:18:47.2159646Z 211 │ │ );
2026-10-24T03:18:47.2159722Z 212 │ │ }
2026-10-24T03:18:47.2159841Z 213 │ │ if (envelope.error !== undefined) {
2026-10-24T03:18:47.2160041Z 214 │ │ return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error)));
2026-10-24T03:18:47.2160116Z 215 │ │ }
2026-10-24T03:18:47.2160365Z 216 │ │ return (envelope.result ?? null) as AcpSchema.MessageMcpResponse;
2026-10-24T03:18:47.2160510Z 217 │ │ }),
2026-10-24T03:18:47.2160740Z 218 │ │ notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) {
2026-10-24T03:18:47.2160906Z 219 │ │ const connection = yield* connectionFor(request.connectionId);
2026-10-24T03:18:47.2161011Z 220 │ │ yield* send(connection, {
2026-10-24T03:18:47.2161109Z 221 │ │ jsonrpc: "2.0",
2026-10-24T03:18:47.2161222Z 222 │ │ method: request.method,
2026-10-24T03:18:47.2161449Z 223 │ │ ...(request.params == null ? {} : { params: request.params }),
2026-10-24T03:18:47.2161528Z 224 │ │ });
2026-10-24T03:18:47.2161608Z 225 │ │ }),
2026-10-24T03:18:47.2161698Z 226 │ │ disconnect,
2026-10-24T03:18:47.2161808Z 227 │ │ dispose: Effect.suspend(() =>
2026-10-24T03:18:47.2161905Z 228 │ │ Effect.forEach(
2026-10-24T03:18:47.2162012Z 229 │ │ [...connections.keys()],
2026-10-24T03:18:47.2162185Z 230 │ │ (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore),
2026-10-24T03:18:47.2162287Z 231 │ │ { discard: true },
2026-10-24T03:18:47.2162364Z 232 │ │ ),
2026-10-24T03:18:47.2162439Z 233 │ │ ),
2026-10-24T03:18:47.2162511Z 234 │ │ };
2026-10-24T03:18:47.2162641Z 235 │ ╰─▶ });
2026-10-24T03:18:47.2162701Z ╰────
2026-10-24T03:18:47.2162959Z help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed.
2026-10-24T03:18:47.2162964Z
2026-10-24T03:18:47.2163159Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T03:18:47.2163321Z ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15]
2026-10-24T03:18:47.2163389Z 71 │ <Pressable
2026-10-24T03:18:47.2163457Z 72 │ key={index}
2026-10-24T03:18:47.2163542Z · ───────────
2026-10-24T03:18:47.2163628Z 73 │ accessibilityRole="button"
2026-10-24T03:18:47.2163683Z ╰────
2026-10-24T03:18:47.2163833Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T03:18:47.2163836Z
2026-10-24T03:18:47.2164103Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2164284Z ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5]
2026-10-24T03:18:47.2164339Z 58 │
2026-10-24T03:18:47.2164407Z 59 │ useEffect(() => {
2026-10-24T03:18:47.2164478Z · ────┬────
2026-10-24T03:18:47.2164610Z · ╰── This is the containing effect
2026-10-24T03:18:47.2164691Z 60 │ setMountedModes((current) => {
2026-10-24T03:18:47.2164772Z · ───────┬───────
2026-10-24T03:18:47.2164943Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2165026Z 61 │ if (current.has(props.mode)) {
2026-10-24T03:18:47.2165172Z ╰────
2026-10-24T03:18:47.2166005Z 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.
2026-10-24T03:18:47.2166332Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2166336Z
2026-10-24T03:18:47.2166599Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2166871Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7]
2026-10-24T03:18:47.2166953Z 118 │
2026-10-24T03:18:47.2167046Z 119 │ useEffect(() => {
2026-10-24T03:18:47.2167120Z · ────┬────
2026-10-24T03:18:47.2167254Z · ╰── This is the containing effect
2026-10-24T03:18:47.2167337Z 120 │ if (orientationSettled) return;
2026-10-24T03:18:47.2167451Z 121 │ const orientation = getNativeShowcaseOrientation();
2026-10-24T03:18:47.2167524Z 122 │ if (orientation === null) {
2026-10-24T03:18:47.2167607Z 123 │ setOrientationSettled(true);
2026-10-24T03:18:47.2167699Z · ──────────┬──────────
2026-10-24T03:18:47.2167875Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2167937Z 124 │ return;
2026-10-24T03:18:47.2167991Z ╰────
2026-10-24T03:18:47.2168597Z 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.
2026-10-24T03:18:47.2168936Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2168939Z
2026-10-24T03:18:47.2169196Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2169368Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7]
2026-10-24T03:18:47.2169423Z 292 │
2026-10-24T03:18:47.2169488Z 293 │ useEffect(() => {
2026-10-24T03:18:47.2169561Z · ────┬────
2026-10-24T03:18:47.2169695Z · ╰── This is the containing effect
2026-10-24T03:18:47.2169757Z 294 │ if (
2026-10-24T03:18:47.2169823Z 295 │ scene === null ||
2026-10-24T03:18:47.2169899Z 296 │ requestedScene === null ||
2026-10-24T03:18:47.2169978Z 297 │ scene !== requestedScene ||
2026-10-24T03:18:47.2170044Z 298 │ !hasFixture ||
2026-10-24T03:18:47.2170117Z 299 │ !orientationSettled ||
2026-10-24T03:18:47.2170185Z 300 │ !themeApplied ||
2026-10-24T03:18:47.2170304Z 301 │ (scene === "agent-activity" && !agentActivityStaged) ||
2026-10-24T03:18:47.2170444Z 302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
2026-10-24T03:18:47.2170501Z 303 │ ) {
2026-10-24T03:18:47.2170569Z 304 │ setReadyScene(null);
2026-10-24T03:18:47.2170651Z · ──────┬──────
2026-10-24T03:18:47.2170917Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2171042Z 305 │ return;
2026-10-24T03:18:47.2171120Z ╰────
2026-10-24T03:18:47.2171768Z 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.
2026-10-24T03:18:47.2172161Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2172164Z
2026-10-24T03:18:47.2172450Z ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2172625Z ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9]
2026-10-24T03:18:47.2172694Z 127 │ let cancelled = false;
2026-10-24T03:18:47.2172787Z 128 │ let lastOutcome: string | null = null;
2026-10-24T03:18:47.2172868Z · ─────┬─────
2026-10-24T03:18:47.2173007Z · ╰── 'lastOutcome' is declared here
2026-10-24T03:18:47.2173188Z 129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
2026-10-24T03:18:47.2173242Z ╰────
2026-10-24T03:18:47.2173350Z help: Consider removing this declaration.
2026-10-24T03:18:47.2173353Z
2026-10-24T03:18:47.2173567Z ⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed
2026-10-24T03:18:47.2173743Z ╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13]
2026-10-24T03:18:47.2173821Z 14 │ } from "@t3tools/contracts";
2026-10-24T03:18:47.2173913Z 15 │ import type {} from "@t3tools/contracts";
2026-10-24T03:18:47.2173984Z · ──
2026-10-24T03:18:47.2174168Z 16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl";
2026-10-24T03:18:47.2174222Z ╰────
2026-10-24T03:18:47.2174306Z help: Remove empty braces
2026-10-24T03:18:47.2174309Z
2026-10-24T03:18:47.2174587Z ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2174735Z ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
2026-10-24T03:18:47.2174788Z 60 │ ) {
2026-10-24T03:18:47.2174963Z 61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
2026-10-24T03:18:47.2175047Z · ──────┬──────
2026-10-24T03:18:47.2175188Z · ╰── 'useDragRegion' is declared here
2026-10-24T03:18:47.2175279Z 62 │ const isInline = props.mode === "inline";
2026-10-24T03:18:47.2175331Z ╰────
2026-10-24T03:18:47.2175439Z help: Consider removing this declaration.
2026-10-24T03:18:47.2175441Z
2026-10-24T03:18:47.2175597Z ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2175759Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5]
2026-10-24T03:18:47.2175813Z 35 │
2026-10-24T03:18:47.2175955Z 36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0);
2026-10-24T03:18:47.2176121Z · ────────┬────────
2026-10-24T03:18:47.2176359Z · ╰── `inspectorProgress` originates here
2026-10-24T03:18:47.2176454Z 37 │ const { renderedInspectorWidth } = props;
2026-10-24T03:18:47.2176591Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
2026-10-24T03:18:47.2176645Z 39 │
2026-10-24T03:18:47.2176793Z 40 │ const onClosed = props.onClosed;
2026-10-24T03:18:47.2176896Z 41 │ useEffect(() => {
2026-10-24T03:18:47.2177035Z 42 │ inspectorProgress.value = withTiming(
2026-10-24T03:18:47.2177162Z · ────────┬────────
2026-10-24T03:18:47.2177334Z · ╰── `inspectorProgress` cannot be modified
2026-10-24T03:18:47.2177414Z 43 │ inspectorVisible ? 1 : 0,
2026-10-24T03:18:47.2177467Z ╰────
2026-10-24T03:18:47.2177744Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2178065Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2178068Z
2026-10-24T03:18:47.2178229Z ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2178393Z ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7]
2026-10-24T03:18:47.2178486Z 37 │ const { renderedInspectorWidth } = props;
2026-10-24T03:18:47.2178616Z 38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
2026-10-24T03:18:47.2178708Z · ──────────┬─────────
2026-10-24T03:18:47.2178872Z · ╰── `renderedContentWidth` originates here
2026-10-24T03:18:47.2178928Z 39 │
2026-10-24T03:18:47.2179006Z 40 │ const onClosed = props.onClosed;
2026-10-24T03:18:47.2179071Z 41 │ useEffect(() => {
2026-10-24T03:18:47.2179161Z 42 │ inspectorProgress.value = withTiming(
2026-10-24T03:18:47.2179238Z 43 │ inspectorVisible ? 1 : 0,
2026-10-24T03:18:47.2179308Z 44 │ WORKSPACE_PANE_TIMING,
2026-10-24T03:18:47.2179376Z 45 │ (finished) => {
2026-10-24T03:18:47.2179517Z 46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) {
2026-10-24T03:18:47.2179592Z 47 │ runOnJS(onClosed)();
2026-10-24T03:18:47.2179649Z 48 │ }
2026-10-24T03:18:47.2179707Z 49 │ },
2026-10-24T03:18:47.2179763Z 50 │ );
2026-10-24T03:18:47.2179897Z 51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0;
2026-10-24T03:18:47.2180048Z 52 │ renderedInspectorWidth.set(
2026-10-24T03:18:47.2180278Z 53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING),
2026-10-24T03:18:47.2180334Z 54 │ );
2026-10-24T03:18:47.2180387Z 55 │ }, [
2026-10-24T03:18:47.2180457Z 56 │ inspectorProgress,
2026-10-24T03:18:47.2180525Z 57 │ inspectorVisible,
2026-10-24T03:18:47.2180590Z 58 │ inspectorWidth,
2026-10-24T03:18:47.2180650Z 59 │ onClosed,
2026-10-24T03:18:47.2180724Z 60 │ renderedInspectorWidth,
2026-10-24T03:18:47.2180785Z 61 │ resizing,
2026-10-24T03:18:47.2180841Z 62 │ ]);
2026-10-24T03:18:47.2180900Z 63 │
2026-10-24T03:18:47.2181000Z 64 │ useEffect(() => {
2026-10-24T03:18:47.2181121Z 65 │ const targetWidth = inspectorWidth ?? 0;
2026-10-24T03:18:47.2181208Z 66 │ if (!inspectorVisible || resizing) {
2026-10-24T03:18:47.2181312Z 67 │ renderedContentWidth.value = targetWidth;
2026-10-24T03:18:47.2181405Z · ──────────┬─────────
2026-10-24T03:18:47.2181570Z · ╰── `renderedContentWidth` cannot be modified
2026-10-24T03:18:47.2181630Z 68 │ return;
2026-10-24T03:18:47.2181681Z ╰────
2026-10-24T03:18:47.2181954Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2182274Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2182276Z
2026-10-24T03:18:47.2182451Z ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2182650Z ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14]
2026-10-24T03:18:47.2182708Z 52 │
2026-10-24T03:18:47.2182774Z 53 │ for (const {} of [
2026-10-24T03:18:47.2182848Z · ──
2026-10-24T03:18:47.2182913Z 54 │ { healthy: true },
2026-10-24T03:18:47.2182967Z ╰────
2026-10-24T03:18:47.2183200Z help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2183203Z
2026-10-24T03:18:47.2183470Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2183614Z ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7]
2026-10-24T03:18:47.2183671Z 3754 │
2026-10-24T03:18:47.2183878Z 3755 │ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, OpenCodeAdapterV2DriverEnv> =
2026-10-24T03:18:47.2183953Z · ──┬──
2026-10-24T03:18:47.2184080Z · ╰── 'layer' is declared here
2026-10-24T03:18:47.2184146Z 3756 │ Layer.effect(
2026-10-24T03:18:47.2184199Z ╰────
2026-10-24T03:18:47.2184306Z help: Consider removing this declaration.
2026-10-24T03:18:47.2184308Z
2026-10-24T03:18:47.2184514Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2184681Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7]
2026-10-24T03:18:47.2184738Z 214 │ }
2026-10-24T03:18:47.2184808Z 215 │ }, [wrappedRender]);
2026-10-24T03:18:47.2184887Z · ──────┬──────
2026-10-24T03:18:47.2185121Z · ╰── Unnecessary dependency `wrappedRender`
2026-10-24T03:18:47.2185218Z 216 │
2026-10-24T03:18:47.2185295Z ╰────
2026-10-24T03:18:47.2185619Z 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
2026-10-24T03:18:47.2185946Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2185949Z
2026-10-24T03:18:47.2186270Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-24T03:18:47.2186434Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35]
2026-10-24T03:18:47.2186493Z 816 │ >
2026-10-24T03:18:47.2186607Z 817 │ <AdaptiveWorkspaceContext value={contextValue}>
2026-10-24T03:18:47.2186790Z · ────────────────────
2026-10-24T03:18:47.2186942Z 818 │ <NativeWorkspaceInspectorContext
2026-10-24T03:18:47.2187024Z ╰────
2026-10-24T03:18:47.2187272Z help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-24T03:18:47.2187418Z Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-24T03:18:47.2187421Z
2026-10-24T03:18:47.2187669Z ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
2026-10-24T03:18:47.2187836Z ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:832:42]
2026-10-24T03:18:47.2187891Z 831 │ >
2026-10-24T03:18:47.2188026Z 832 │ <AdaptiveWorkspaceContext.Provider value={contextValue}>
2026-10-24T03:18:47.2188154Z · ────────────────────
2026-10-24T03:18:47.2188256Z 833 │ <WindowHingeContext value={windowHinge}>
2026-10-24T03:18:47.2188307Z ╰────
2026-10-24T03:18:47.2188533Z help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
2026-10-24T03:18:47.2188671Z Alternatively, move the value outside the render function if it doesn't depend on props or state.
2026-10-24T03:18:47.2188674Z
2026-10-24T03:18:47.2188935Z ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2189062Z ╭─[apps/server/src/serverRuntimeStartup.ts:728:7]
2026-10-24T03:18:47.2189115Z 727 │
2026-10-24T03:18:47.2189203Z 728 │ const layer = layerWithOptions();
2026-10-24T03:18:47.2189278Z · ──┬──
2026-10-24T03:18:47.2189406Z · ╰── 'layer' is declared here
2026-10-24T03:18:47.2189457Z ╰────
2026-10-24T03:18:47.2189564Z help: Consider removing this declaration.
2026-10-24T03:18:47.2189566Z
2026-10-24T03:18:47.2190055Z ⚠ 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.
2026-10-24T03:18:47.2190179Z ╭─[packages/effect-acp/src/errors.test.ts:129:28]
2026-10-24T03:18:47.2190272Z 128 │ const secret = "acp-summary-secret";
2026-10-24T03:18:47.2190386Z 129 │ const cause = yield* Schema.decodeUnknownEffect(
2026-10-24T03:18:47.2190579Z · ──────────────────────────
2026-10-24T03:18:47.2190711Z 130 │ Schema.Struct({
2026-10-24T03:18:47.2190789Z ╰────
2026-10-24T03:18:47.2190792Z
2026-10-24T03:18:47.2191148Z ⚠ 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.
2026-10-24T03:18:47.2191272Z ╭─[packages/effect-acp/src/schema.test.ts:18:12]
2026-10-24T03:18:47.2191455Z 17 │ const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } };
2026-10-24T03:18:47.2191639Z 18 │ expect(Schema.is(V1.AvailableCommand)(command)).toBe(true);
2026-10-24T03:18:47.2191718Z · ─────────
2026-10-24T03:18:47.2191780Z 19 │ expect(
2026-10-24T03:18:47.2191833Z ╰────
2026-10-24T03:18:47.2191836Z
2026-10-24T03:18:47.2192182Z ⚠ 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.
2026-10-24T03:18:47.2192304Z ╭─[packages/effect-acp/src/schema.test.ts:20:7]
2026-10-24T03:18:47.2192365Z 19 │ expect(
2026-10-24T03:18:47.2192540Z 20 │ Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }),
2026-10-24T03:18:47.2192616Z · ─────────
2026-10-24T03:18:47.2192678Z 21 │ ).toBe(true);
2026-10-24T03:18:47.2192731Z ╰────
2026-10-24T03:18:47.2192734Z
2026-10-24T03:18:47.2192969Z ⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used.
2026-10-24T03:18:47.2193087Z ╭─[apps/server/src/checkpointing/Utils.ts:12:10]
2026-10-24T03:18:47.2193139Z 11 │
2026-10-24T03:18:47.2193243Z 12 │ function resolveThreadWorkspaceCwd(input: {
2026-10-24T03:18:47.2193350Z · ────────────┬────────────
2026-10-24T03:18:47.2193524Z · ╰── 'resolveThreadWorkspaceCwd' is declared here
2026-10-24T03:18:47.2193590Z 13 │ readonly thread: {
2026-10-24T03:18:47.2193644Z ╰────
2026-10-24T03:18:47.2193750Z help: Consider removing this declaration.
2026-10-24T03:18:47.2193752Z
2026-10-24T03:18:47.2194222Z ⚠ 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.
2026-10-24T03:18:47.2194347Z ╭─[packages/effect-acp/src/protocol.test.ts:500:31]
2026-10-24T03:18:47.2194401Z 499 │
2026-10-24T03:18:47.2194524Z 500 │ const response = yield* Schema.decodeUnknownEffect(
2026-10-24T03:18:47.2194648Z · ──────────────────────────
2026-10-24T03:18:47.2194757Z 501 │ Schema.fromJsonString(JsonRpcErrorResponse),
2026-10-24T03:18:47.2194811Z ╰────
2026-10-24T03:18:47.2194814Z
2026-10-24T03:18:47.2195272Z ⚠ 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.
2026-10-24T03:18:47.2195398Z ╭─[apps/server/src/serverSettings.test.ts:1741:32]
2026-10-24T03:18:47.2195572Z 1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5");
2026-10-24T03:18:47.2195836Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
2026-10-24T03:18:47.2196083Z · ───────────────────
2026-10-24T03:18:47.2196197Z 1742 │ const scriptsJson = yield* Schema.encodeEffect(
2026-10-24T03:18:47.2196252Z ╰────
2026-10-24T03:18:47.2196255Z
2026-10-24T03:18:47.2196780Z ⚠ 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.
2026-10-24T03:18:47.2196944Z ╭─[apps/server/src/serverSettings.test.ts:1742:34]
2026-10-24T03:18:47.2197132Z 1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
2026-10-24T03:18:47.2197242Z 1742 │ const scriptsJson = yield* Schema.encodeEffect(
2026-10-24T03:18:47.2197363Z · ───────────────────
2026-10-24T03:18:47.2197485Z 1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)),
2026-10-24T03:18:47.2197539Z ╰────
2026-10-24T03:18:47.2197542Z
2026-10-24T03:18:47.2197770Z ⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
2026-10-24T03:18:47.2197892Z ╭─[apps/server/src/terminal/Manager.test.ts:731:31]
2026-10-24T03:18:47.2197950Z 730 │ );
2026-10-24T03:18:47.2198126Z 731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot;
2026-10-24T03:18:47.2198226Z · ──────
2026-10-24T03:18:47.2198348Z 732 │ expect(snapshot?.history).toBe("aa😀\rEND");
2026-10-24T03:18:47.2198400Z ╰────
2026-10-24T03:18:47.2198590Z help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
2026-10-24T03:18:47.2198596Z
2026-10-24T03:18:47.2198761Z ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2198928Z ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7]
2026-10-24T03:18:47.2199027Z 53 │ function usePulseAnimation(pulse: boolean) {
2026-10-24T03:18:47.2199123Z 54 │ const pulseProgress = useSharedValue(0);
2026-10-24T03:18:47.2199208Z · ──────┬──────
2026-10-24T03:18:47.2199352Z · ╰── `pulseProgress` originates here
2026-10-24T03:18:47.2199406Z 55 │
2026-10-24T03:18:47.2199474Z 56 │ useEffect(() => {
2026-10-24T03:18:47.2199540Z 57 │ if (pulse) {
2026-10-24T03:18:47.2199630Z 58 │ pulseProgress.value = withRepeat(
2026-10-24T03:18:47.2199716Z · ──────┬──────
2026-10-24T03:18:47.2199867Z · ╰── `pulseProgress` cannot be modified
2026-10-24T03:18:47.2199938Z 59 │ withTiming(1, {
2026-10-24T03:18:47.2199991Z ╰────
2026-10-24T03:18:47.2200258Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2200571Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2200573Z
2026-10-24T03:18:47.2200949Z ⚠ 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.
2026-10-24T03:18:47.2201145Z ╭─[packages/effect-acp/src/client.ts:1269:11]
2026-10-24T03:18:47.2201385Z 1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
2026-10-24T03:18:47.2201564Z 1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
2026-10-24T03:18:47.2201672Z · ──────────────────────────
2026-10-24T03:18:47.2201825Z 1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
2026-10-24T03:18:47.2201877Z ╰────
2026-10-24T03:18:47.2201882Z
2026-10-24T03:18:47.2202169Z ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
2026-10-24T03:18:47.2202307Z ╭─[apps/web/src/lib/composerContextReferences.ts:90:40]
2026-10-24T03:18:47.2202384Z 89 │ let cursor = prompt.length;
2026-10-24T03:18:47.2202493Z 90 │ for (const occurrence of occurrences.reverse()) {
2026-10-24T03:18:47.2202603Z · ───────
2026-10-24T03:18:47.2202689Z 91 │ let { start, end } = occurrence;
2026-10-24T03:18:47.2202744Z ╰────
2026-10-24T03:18:47.2203007Z help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
2026-10-24T03:18:47.2203010Z
2026-10-24T03:18:47.2203271Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2203445Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5]
2026-10-24T03:18:47.2203500Z 76 │
2026-10-24T03:18:47.2203567Z 77 │ useEffect(() => {
2026-10-24T03:18:47.2203639Z · ────┬────
2026-10-24T03:18:47.2203778Z · ╰── This is the containing effect
2026-10-24T03:18:47.2203911Z 78 │ const { host, code } = parsePairingUrl(connectionPairingUrl);
2026-10-24T03:18:47.2203982Z 79 │ setHostInput(host);
2026-10-24T03:18:47.2204058Z · ──────┬─────
2026-10-24T03:18:47.2204229Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2204298Z 80 │ setCodeInput(code);
2026-10-24T03:18:47.2204351Z ╰────
2026-10-24T03:18:47.2204956Z 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.
2026-10-24T03:18:47.2205369Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2205404Z
2026-10-24T03:18:47.2205805Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2206009Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5]
2026-10-24T03:18:47.2206064Z 82 │
2026-10-24T03:18:47.2206128Z 83 │ useEffect(() => {
2026-10-24T03:18:47.2206200Z · ────┬────
2026-10-24T03:18:47.2206333Z · ╰── This is the containing effect
2026-10-24T03:18:47.2206425Z 84 │ if (routePairingUrl.length === 0) {
2026-10-24T03:18:47.2206485Z 85 │ return;
2026-10-24T03:18:47.2206541Z 86 │ }
2026-10-24T03:18:47.2206594Z 87 │
2026-10-24T03:18:47.2206776Z 88 │ const { host, code } = parsePairingUrl(routePairingUrl);
2026-10-24T03:18:47.2206876Z 89 │ setHostInput(host);
2026-10-24T03:18:47.2206990Z · ──────┬─────
2026-10-24T03:18:47.2207266Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2207369Z 90 │ setCodeInput(code);
2026-10-24T03:18:47.2207456Z ╰────
2026-10-24T03:18:47.2208164Z 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.
2026-10-24T03:18:47.2208498Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2208503Z
2026-10-24T03:18:47.2208763Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2208933Z ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7]
2026-10-24T03:18:47.2208984Z 92 │
2026-10-24T03:18:47.2209049Z 93 │ useEffect(() => {
2026-10-24T03:18:47.2209120Z · ────┬────
2026-10-24T03:18:47.2209249Z · ╰── This is the containing effect
2026-10-24T03:18:47.2209335Z 94 │ if (pairingConnectionError) {
2026-10-24T03:18:47.2209409Z 95 │ setIsSubmitting(false);
2026-10-24T03:18:47.2209491Z · ───────┬───────
2026-10-24T03:18:47.2209667Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2209727Z 96 │ }
2026-10-24T03:18:47.2209780Z ╰────
2026-10-24T03:18:47.2210380Z 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.
2026-10-24T03:18:47.2210702Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2210705Z
2026-10-24T03:18:47.2210998Z ⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
2026-10-24T03:18:47.2211224Z ╭─[packages/provider-cursor/src/server/auth.ts:249:20]
2026-10-24T03:18:47.2211366Z 248 │ },
2026-10-24T03:18:47.2211482Z 249 │ (effect, flow, stopSessions) =>
2026-10-24T03:18:47.2211578Z · ──────┬─────
2026-10-24T03:18:47.2211732Z · ╰── 'stopSessions' is declared here
2026-10-24T03:18:47.2211798Z 250 │ effect.pipe(
2026-10-24T03:18:47.2211850Z ╰────
2026-10-24T03:18:47.2211953Z help: Consider removing this parameter.
2026-10-24T03:18:47.2211956Z
2026-10-24T03:18:47.2212127Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2212337Z ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39]
2026-10-24T03:18:47.2212394Z 276 │
2026-10-24T03:18:47.2212587Z 277 │ ╭─▶ return createElement(RawNativeView, {
2026-10-24T03:18:47.2212688Z 278 │ │ ...nativeProps,
2026-10-24T03:18:47.2212840Z 279 │ │ refreshEnabled: props.onPullToRefresh !== undefined,
2026-10-24T03:18:47.2212933Z 280 │ │ ref: nativeRef,
2026-10-24T03:18:47.2213065Z 281 │ ├─▶ });
2026-10-24T03:18:47.2213310Z · ╰──── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2213368Z 282 │ }
2026-10-24T03:18:47.2213422Z ╰────
2026-10-24T03:18:47.2213908Z 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
2026-10-24T03:18:47.2214214Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2214217Z
2026-10-24T03:18:47.2214511Z ⚠ eslint(no-unused-vars): Variable 'legacyCredentials' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2214670Z ╭─[packages/provider-cursor/src/server/credentialStore.test.ts:15:7]
2026-10-24T03:18:47.2214724Z 14 │
2026-10-24T03:18:47.2214795Z 15 │ const legacyCredentials = {
2026-10-24T03:18:47.2214882Z · ────────┬────────
2026-10-24T03:18:47.2215033Z · ╰── 'legacyCredentials' is declared here
2026-10-24T03:18:47.2215109Z 16 │ version: 1 as const,
2026-10-24T03:18:47.2215162Z ╰────
2026-10-24T03:18:47.2215271Z help: Consider removing this declaration.
2026-10-24T03:18:47.2215273Z
2026-10-24T03:18:47.2215531Z ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used.
2026-10-24T03:18:47.2215648Z ╭─[apps/web/src/lib/terminalContext.ts:56:10]
2026-10-24T03:18:47.2215700Z 55 │
2026-10-24T03:18:47.2215801Z 56 │ function normalizeTerminalContextSelection(
2026-10-24T03:18:47.2215915Z · ────────────────┬────────────────
2026-10-24T03:18:47.2216109Z · ╰── 'normalizeTerminalContextSelection' is declared here
2026-10-24T03:18:47.2216198Z 57 │ selection: TerminalContextSelection,
2026-10-24T03:18:47.2216249Z ╰────
2026-10-24T03:18:47.2216429Z help: Consider removing this declaration.
2026-10-24T03:18:47.2216464Z
2026-10-24T03:18:47.2216888Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2217082Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:215:7]
2026-10-24T03:18:47.2217137Z 211 │ };
2026-10-24T03:18:47.2217206Z 212 │ useEffect(() => {
2026-10-24T03:18:47.2217297Z · ────┬────
2026-10-24T03:18:47.2217489Z · ╰── This is the containing effect
2026-10-24T03:18:47.2217668Z 213 │ const inserted = ownerKey ? readComposerDraftSelection(ownerKey, draftMessage) : null;
2026-10-24T03:18:47.2217737Z 214 │ if (inserted) {
2026-10-24T03:18:47.2217816Z 215 │ setSelection((current) =>
2026-10-24T03:18:47.2217904Z · ──────┬─────
2026-10-24T03:18:47.2218078Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2218250Z 216 │ current.start === inserted.start && current.end === inserted.end ? current : inserted,
2026-10-24T03:18:47.2218304Z ╰────
2026-10-24T03:18:47.2218909Z 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.
2026-10-24T03:18:47.2219236Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2219242Z
2026-10-24T03:18:47.2219504Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2219674Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:296:7]
2026-10-24T03:18:47.2219752Z 284 │ }, [hasWorkspaceSnapshot]);
2026-10-24T03:18:47.2219817Z 285 │ useEffect(() => {
2026-10-24T03:18:47.2219888Z · ────┬────
2026-10-24T03:18:47.2220021Z · ╰── This is the containing effect
2026-10-24T03:18:47.2220172Z 286 │ if (!environmentId || !projectCwd || !selectedProviderInstanceId) return;
2026-10-24T03:18:47.2220324Z 287 │ const key = `${environmentId}:${selectedProviderInstanceId}:${projectCwd}`;
2026-10-24T03:18:47.2220395Z 288 │ const now = Date.now();
2026-10-24T03:18:47.2220513Z 289 │ const lastRequest = workspaceRefreshKeyRef.current;
2026-10-24T03:18:47.2220578Z 290 │ if (
2026-10-24T03:18:47.2220660Z 291 │ lastRequest?.key === key &&
2026-10-24T03:18:47.2220800Z 292 │ now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS
2026-10-24T03:18:47.2220858Z 293 │ )
2026-10-24T03:18:47.2220922Z 294 │ return;
2026-10-24T03:18:47.2221100Z 295 │ if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, projectCwd, now)) {
2026-10-24T03:18:47.2221186Z 296 │ setWorkspaceRefreshRetry(null);
2026-10-24T03:18:47.2221285Z · ────────────┬───────────
2026-10-24T03:18:47.2221466Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2221529Z 297 │ return;
2026-10-24T03:18:47.2221582Z ╰────
2026-10-24T03:18:47.2222283Z 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.
2026-10-24T03:18:47.2222698Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2222701Z
2026-10-24T03:18:47.2222907Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2223074Z ╭─[apps/mobile/src/features/threads/use-composer-command-menu.ts:326:5]
2026-10-24T03:18:47.2223147Z 325 │ }, [
2026-10-24T03:18:47.2223248Z 326 │ draftMessage,
2026-10-24T03:18:47.2223344Z · ──────┬─────
2026-10-24T03:18:47.2223497Z · ╰── Unnecessary dependency `draftMessage`
2026-10-24T03:18:47.2223567Z 327 │ environmentId,
2026-10-24T03:18:47.2223622Z ╰────
2026-10-24T03:18:47.2223929Z 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
2026-10-24T03:18:47.2224258Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2224261Z
2026-10-24T03:18:47.2224517Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2224676Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
2026-10-24T03:18:47.2224744Z 259 │ .join("|");
2026-10-24T03:18:47.2224812Z 260 │ useEffect(() => {
2026-10-24T03:18:47.2224882Z · ────┬────
2026-10-24T03:18:47.2225014Z · ╰── This is the containing effect
2026-10-24T03:18:47.2225077Z 261 │ stop();
2026-10-24T03:18:47.2225148Z · ──┬─
2026-10-24T03:18:47.2225314Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2225381Z 262 │ }, [orderVersion]);
2026-10-24T03:18:47.2225435Z ╰────
2026-10-24T03:18:47.2226067Z 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.
2026-10-24T03:18:47.2226400Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2226405Z
2026-10-24T03:18:47.2226627Z ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
2026-10-24T03:18:47.2226898Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
2026-10-24T03:18:47.2226982Z 260 │ useEffect(() => {
2026-10-24T03:18:47.2227043Z 261 │ stop();
2026-10-24T03:18:47.2227112Z · ──┬─
2026-10-24T03:18:47.2227241Z · ╰── Missing dependency `stop`
2026-10-24T03:18:47.2227309Z 262 │ }, [orderVersion]);
2026-10-24T03:18:47.2227389Z · ──────┬─────
2026-10-24T03:18:47.2227612Z · ╰── Unnecessary dependency `orderVersion`
2026-10-24T03:18:47.2227722Z 263 │ useEffect(
2026-10-24T03:18:47.2227803Z ╰────
2026-10-24T03:18:47.2228255Z 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
2026-10-24T03:18:47.2228654Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2228657Z
2026-10-24T03:18:47.2228805Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2228967Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9]
2026-10-24T03:18:47.2229049Z 95 │ const latest = useRef(props);
2026-10-24T03:18:47.2229119Z 96 │ latest.current = props;
2026-10-24T03:18:47.2229225Z · ───┬──────┬───
2026-10-24T03:18:47.2229407Z · │ ╰── Cannot update ref value during render
2026-10-24T03:18:47.2229524Z · ╰── This value is a ref
2026-10-24T03:18:47.2229591Z 97 │ const gesture = useMemo(
2026-10-24T03:18:47.2229644Z ╰────
2026-10-24T03:18:47.2230133Z 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
2026-10-24T03:18:47.2230441Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2230446Z
2026-10-24T03:18:47.2230592Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2230750Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18]
2026-10-24T03:18:47.2230817Z 103 │ .runOnJS(true)
2026-10-24T03:18:47.2230920Z 104 │ .onStart(() => latest.current.onStart())
2026-10-24T03:18:47.2231038Z · ───────────────┬──────────────
2026-10-24T03:18:47.2231241Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2231379Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2231432Z ╰────
2026-10-24T03:18:47.2231997Z 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
2026-10-24T03:18:47.2232376Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2232379Z
2026-10-24T03:18:47.2232521Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2232681Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19]
2026-10-24T03:18:47.2232777Z 104 │ .onStart(() => latest.current.onStart())
2026-10-24T03:18:47.2232968Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2233130Z · ──────────────────────────┬─────────────────────────
2026-10-24T03:18:47.2233350Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2233477Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2233529Z ╰────
2026-10-24T03:18:47.2233992Z 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
2026-10-24T03:18:47.2234293Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2234295Z
2026-10-24T03:18:47.2234444Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2234607Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16]
2026-10-24T03:18:47.2234738Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2234860Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2235008Z · ──────────────────────────┬─────────────────────────
2026-10-24T03:18:47.2235220Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2235348Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-24T03:18:47.2235399Z ╰────
2026-10-24T03:18:47.2235892Z 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
2026-10-24T03:18:47.2236193Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2236195Z
2026-10-24T03:18:47.2239125Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2239297Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21]
2026-10-24T03:18:47.2239425Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2239548Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-24T03:18:47.2239687Z · ───────────────────────┬──────────────────────
2026-10-24T03:18:47.2240007Z · ╰── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2240139Z 108 │ [props.disabled],
2026-10-24T03:18:47.2240217Z ╰────
2026-10-24T03:18:47.2240716Z 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
2026-10-24T03:18:47.2241101Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2241104Z
2026-10-24T03:18:47.2241253Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2241422Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9]
2026-10-24T03:18:47.2241538Z 248 │ const latest = useRef({ rows, planners, moveThread });
2026-10-24T03:18:47.2241645Z 249 │ latest.current = { rows, planners, moveThread };
2026-10-24T03:18:47.2241752Z · ───┬──────┬───
2026-10-24T03:18:47.2241937Z · │ ╰── Cannot update ref value during render
2026-10-24T03:18:47.2242052Z · ╰── This value is a ref
2026-10-24T03:18:47.2242107Z 250 │
2026-10-24T03:18:47.2242160Z ╰────
2026-10-24T03:18:47.2242624Z 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
2026-10-24T03:18:47.2242924Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2242929Z
2026-10-24T03:18:47.2243083Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2243246Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22]
2026-10-24T03:18:47.2243366Z 246 │ const [preview, setPreview] = useState<Drag | null>(null);
2026-10-24T03:18:47.2243483Z 247 │ const translateY = useRef(new Animated.Value(0)).current;
2026-10-24T03:18:47.2243611Z · ──────────────────┬──────────────────
2026-10-24T03:18:47.2243787Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2243905Z 248 │ const latest = useRef({ rows, planners, moveThread });
2026-10-24T03:18:47.2243961Z ╰────
2026-10-24T03:18:47.2244442Z 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
2026-10-24T03:18:47.2244742Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2244744Z
2026-10-24T03:18:47.2244919Z ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2245082Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16]
2026-10-24T03:18:47.2245151Z 323 │ update(0);
2026-10-24T03:18:47.2245309Z 324 │ let last = performance.now();
2026-10-24T03:18:47.2245466Z · ────────┬────────
2026-10-24T03:18:47.2245633Z · ╰── Cannot call impure function
2026-10-24T03:18:47.2245779Z 325 │ const tick = () => {
2026-10-24T03:18:47.2245858Z ╰────
2026-10-24T03:18:47.2246190Z help: `performance.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2246498Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2246500Z
2026-10-24T03:18:47.2246741Z ⚠ react(capitalized-calls): Capitalized function called without JSX
2026-10-24T03:18:47.2247004Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15]
2026-10-24T03:18:47.2247071Z 98 │ () =>
2026-10-24T03:18:47.2247139Z 99 │ Gesture.Pan()
2026-10-24T03:18:47.2247217Z · ─┬─
2026-10-24T03:18:47.2247351Z · ╰── `Pan` may be a component
2026-10-24T03:18:47.2247435Z 100 │ .enabled(!props.disabled)
2026-10-24T03:18:47.2247487Z ╰────
2026-10-24T03:18:47.2247768Z 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
2026-10-24T03:18:47.2248219Z 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
2026-10-24T03:18:47.2248222Z
2026-10-24T03:18:47.2248417Z ⚠ react(memo-dependencies): Found missing memoization dependencies
2026-10-24T03:18:47.2248582Z ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5]
2026-10-24T03:18:47.2248651Z 103 │ .runOnJS(true)
2026-10-24T03:18:47.2248754Z 104 │ .onStart(() => latest.current.onStart())
2026-10-24T03:18:47.2248842Z · ───┬──
2026-10-24T03:18:47.2249281Z · ╰── Missing dependency `latest`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
2026-10-24T03:18:47.2249416Z 105 │ .onUpdate((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2249548Z 106 │ .onEnd((event) => latest.current.onMove(event.translationY))
2026-10-24T03:18:47.2249675Z 107 │ .onFinalize((_, success) => latest.current.onEnd(!success)),
2026-10-24T03:18:47.2249743Z 108 │ [props.disabled],
2026-10-24T03:18:47.2249827Z · ────────┬───────
2026-10-24T03:18:47.2250020Z · ╰── This dependency list is missing values used by the callback
2026-10-24T03:18:47.2250076Z 109 │ );
2026-10-24T03:18:47.2250129Z ╰────
2026-10-24T03:18:47.2250335Z help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
2026-10-24T03:18:47.2250651Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2250654Z
2026-10-24T03:18:47.2251021Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2251286Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5]
2026-10-24T03:18:47.2251342Z 398 │
2026-10-24T03:18:47.2251409Z 399 │ useEffect(() => {
2026-10-24T03:18:47.2251484Z · ────┬────
2026-10-24T03:18:47.2251615Z · ╰── This is the containing effect
2026-10-24T03:18:47.2251708Z 400 │ setInspectorSelection((current) => {
2026-10-24T03:18:47.2251798Z · ──────────┬──────────
2026-10-24T03:18:47.2252032Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2252151Z 401 │ if (props.renderInspector === undefined) {
2026-10-24T03:18:47.2252205Z ╰────
2026-10-24T03:18:47.2252821Z 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.
2026-10-24T03:18:47.2253159Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2253162Z
2026-10-24T03:18:47.2253386Z ⚠ react(no-unstable-nested-components): Do not define components during render.
2026-10-24T03:18:47.2253541Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24]
2026-10-24T03:18:47.2253705Z 527 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
2026-10-24T03:18:47.2253886Z 528 │ ╭─▶ const GitInspector = () => (
2026-10-24T03:18:47.2253988Z 529 │ │ <GitOverviewSheet
2026-10-24T03:18:47.2254112Z 530 │ │ headerInset={inspectorHeaderInset}
2026-10-24T03:18:47.2254222Z 531 │ │ presentation="inspector"
2026-10-24T03:18:47.2254408Z 532 │ │ route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
2026-10-24T03:18:47.2254485Z 533 │ │ />
2026-10-24T03:18:47.2254613Z 534 │ ╰─▶ );
2026-10-24T03:18:47.2254696Z 535 │ const FilesInspector = () =>
2026-10-24T03:18:47.2254749Z ╰────
2026-10-24T03:18:47.2255053Z help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
2026-10-24T03:18:47.2255087Z
2026-10-24T03:18:47.2255358Z ⚠ react(no-unstable-nested-components): Do not define components during render.
2026-10-24T03:18:47.2255514Z ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26]
2026-10-24T03:18:47.2255574Z 534 │ );
2026-10-24T03:18:47.2255747Z 535 │ ╭─▶ const FilesInspector = () =>
2026-10-24T03:18:47.2255917Z 536 │ │ selectedThread !== null && selectedThreadCwd !== null ? (
2026-10-24T03:18:47.2256077Z 537 │ │ <ThreadFileNavigatorPane
2026-10-24T03:18:47.2256186Z 538 │ │ cwd={selectedThreadCwd}
2026-10-24T03:18:47.2256327Z 539 │ │ environmentId={selectedThread.environmentId}
2026-10-24T03:18:47.2256457Z 540 │ │ headerInset={inspectorHeaderInset}
2026-10-24T03:18:47.2256607Z 541 │ │ projectName={selectedThreadProject?.title ?? "Files"}
2026-10-24T03:18:47.2256771Z 542 │ │ selectedPath={null}
2026-10-24T03:18:47.2256981Z 543 │ │ onSelectFile={handleSelectInspectorFile}
2026-10-24T03:18:47.2257099Z 544 │ │ />
2026-10-24T03:18:47.2257318Z 545 │ ╰─▶ ) : null;
2026-10-24T03:18:47.2257557Z 546 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
2026-10-24T03:18:47.2257612Z ╰────
2026-10-24T03:18:47.2257840Z help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
2026-10-24T03:18:47.2257843Z
2026-10-24T03:18:47.2258092Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
2026-10-24T03:18:47.2258235Z ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13]
2026-10-24T03:18:47.2258361Z 984 │ const changedBeforeDecline = draftChangedSinceSend();
2026-10-24T03:18:47.2258607Z 985 │ ╭─▶ const pendingIdsBeforeDecline = pendingApprovalsRef.current.map(
2026-10-24T03:18:47.2258730Z 986 │ │ (approval) => approval.requestId,
2026-10-24T03:18:47.2258863Z 987 │ ╰─▶ );
2026-10-24T03:18:47.2259003Z 988 │ const approvalResponding = approvalsToDecline.some((approval) =>
2026-10-24T03:18:47.2259056Z ╰────
2026-10-24T03:18:47.2259138Z help: Switch to `Set`
2026-10-24T03:18:47.2259145Z
2026-10-24T03:18:47.2259405Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2259568Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:40:5]
2026-10-24T03:18:47.2259681Z 37 │ const [initialized, setInitialized] = useState(false);
2026-10-24T03:18:47.2259750Z 38 │ useLayoutEffect(() => {
2026-10-24T03:18:47.2259830Z · ───────┬───────
2026-10-24T03:18:47.2259965Z · ╰── This is the containing effect
2026-10-24T03:18:47.2260028Z 39 │ reset();
2026-10-24T03:18:47.2260098Z 40 │ setInitialized(true);
2026-10-24T03:18:47.2260175Z · ───────┬──────
2026-10-24T03:18:47.2260429Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2260541Z 41 │ }, [reset]);
2026-10-24T03:18:47.2260621Z ╰────
2026-10-24T03:18:47.2261276Z 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.
2026-10-24T03:18:47.2261671Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2261674Z
2026-10-24T03:18:47.2261933Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2262101Z ╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5]
2026-10-24T03:18:47.2262158Z 88 │
2026-10-24T03:18:47.2262222Z 89 │ useEffect(() => {
2026-10-24T03:18:47.2262295Z · ────┬────
2026-10-24T03:18:47.2262426Z · ╰── This is the containing effect
2026-10-24T03:18:47.2262587Z 90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
2026-10-24T03:18:47.2262691Z 91 │ const branchName = initialProjectRef.branch;
2026-10-24T03:18:47.2262759Z 92 │ let active = true;
2026-10-24T03:18:47.2262858Z 93 │ setPendingCheckouts((count) => count + 1);
2026-10-24T03:18:47.2262943Z · ─────────┬─────────
2026-10-24T03:18:47.2263118Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2263280Z 94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
2026-10-24T03:18:47.2263336Z ╰────
2026-10-24T03:18:47.2263963Z 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.
2026-10-24T03:18:47.2264294Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2264299Z
2026-10-24T03:18:47.2264557Z ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
2026-10-24T03:18:47.2264708Z ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
2026-10-24T03:18:47.2264765Z 150 │
2026-10-24T03:18:47.2264831Z 151 │ useEffect(() => {
2026-10-24T03:18:47.2264903Z · ────┬────
2026-10-24T03:18:47.2265036Z · ╰── This is the containing effect
2026-10-24T03:18:47.2265122Z 152 │ if (!controlledSelectedPath) {
2026-10-24T03:18:47.2265183Z 153 │ return;
2026-10-24T03:18:47.2265239Z 154 │ }
2026-10-24T03:18:47.2265324Z 155 │ setExpandedPaths((current) => {
2026-10-24T03:18:47.2265407Z · ────────┬───────
2026-10-24T03:18:47.2265579Z · ╰── Avoid calling setState() directly within an effect
2026-10-24T03:18:47.2265706Z 156 │ const ancestors = ancestorPaths(controlledSelectedPath);
2026-10-24T03:18:47.2265759Z ╰────
2026-10-24T03:18:47.2266471Z 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.
2026-10-24T03:18:47.2267048Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
2026-10-24T03:18:47.2267052Z
2026-10-24T03:18:47.2267280Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
2026-10-24T03:18:47.2267471Z ╭─[apps/web/src/contextMenuFallback.test.ts:38:9]
2026-10-24T03:18:47.2267547Z 37 │ get isConnected() {
2026-10-24T03:18:47.2267642Z 38 │ let current: FakeElement | null = this;
2026-10-24T03:18:47.2267720Z · ───────
2026-10-24T03:18:47.2267797Z 39 │ while (current?.parent) {
2026-10-24T03:18:47.2267850Z ╰────
2026-10-24T03:18:47.2268137Z 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.
2026-10-24T03:18:47.2268139Z
2026-10-24T03:18:47.2268322Z ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`.
2026-10-24T03:18:47.2268446Z ╭─[apps/web/src/terminal/ghostty/core.ts:194:19]
2026-10-24T03:18:47.2268574Z 193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start);
2026-10-24T03:18:47.2268668Z 194 │ const codes = new Array<number>(count);
2026-10-24T03:18:47.2268781Z · ────────────────────────
2026-10-24T03:18:47.2268892Z 195 │ for (let index = 0; index < count; index += 1) {
2026-10-24T03:18:47.2268947Z ╰────
2026-10-24T03:18:47.2269370Z 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]`.
2026-10-24T03:18:47.2269373Z
2026-10-24T03:18:47.2269577Z ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
2026-10-24T03:18:47.2269723Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
2026-10-24T03:18:47.2269821Z 256 │ return () => cancelAnimationFrame(frame);
2026-10-24T03:18:47.2269903Z 257 │ }, [props.path, targetIndex]);
2026-10-24T03:18:47.2269979Z · ─────┬────
2026-10-24T03:18:47.2270132Z · ╰── Unnecessary dependency `props.path`
2026-10-24T03:18:47.2270189Z 258 │
2026-10-24T03:18:47.2270242Z ╰────
2026-10-24T03:18:47.2270539Z 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
2026-10-24T03:18:47.2270861Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
2026-10-24T03:18:47.2270866Z
2026-10-24T03:18:47.2271058Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T03:18:47.2271210Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
2026-10-24T03:18:47.2271284Z 292 │ <SourceText
2026-10-24T03:18:47.2271384Z 293 │ key={`${index}:${tokenIndex}`}
2026-10-24T03:18:47.2271577Z · ──────────────────────────────
2026-10-24T03:18:47.2271705Z 294 │ style={{
2026-10-24T03:18:47.2271784Z ╰────
2026-10-24T03:18:47.2271941Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T03:18:47.2271946Z
2026-10-24T03:18:47.2272139Z ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
2026-10-24T03:18:47.2272286Z ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
2026-10-24T03:18:47.2272352Z 308 │ return (
2026-10-24T03:18:47.2272452Z 309 │ <SourceText key={index}>
2026-10-24T03:18:47.2272605Z · ───────────
2026-10-24T03:18:47.2272673Z 310 │ {body}
2026-10-24T03:18:47.2272728Z ╰────
2026-10-24T03:18:47.2272882Z help: Use a unique data-dependent key to avoid unnecessary rerenders
2026-10-24T03:18:47.2272887Z
2026-10-24T03:18:47.2273095Z ⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used.
2026-10-24T03:18:47.2273189Z ╭─[apps/web/src/types.ts:22:3]
2026-10-24T03:18:47.2273262Z 21 │ EnvironmentThreadShell,
2026-10-24T03:18:47.2273329Z 22 │ ThreadRunSummary,
2026-10-24T03:18:47.2273406Z · ────────┬───────
2026-10-24T03:18:47.2273550Z · ╰── 'ThreadRunSummary' is imported here
2026-10-24T03:18:47.2273621Z 23 │ ThreadRuntimeSummary,
2026-10-24T03:18:47.2273674Z ╰────
2026-10-24T03:18:47.2273773Z help: Consider removing this import.
2026-10-24T03:18:47.2273776Z
2026-10-24T03:18:47.2273941Z ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2274117Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5]
2026-10-24T03:18:47.2274174Z 90 │ }) {
2026-10-24T03:18:47.2274287Z 91 │ const rotation = useSharedValue(props.hidden ? 1 : 0);
2026-10-24T03:18:47.2274363Z · ────┬───
2026-10-24T03:18:47.2274497Z · ╰── `rotation` originates here
2026-10-24T03:18:47.2274566Z 92 │ useLayoutEffect(() => {
2026-10-24T03:18:47.2274708Z 93 │ rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING);
2026-10-24T03:18:47.2274781Z · ────┬───
2026-10-24T03:18:47.2274916Z · ╰── `rotation` cannot be modified
2026-10-24T03:18:47.2274993Z 94 │ }, [props.hidden, rotation]);
2026-10-24T03:18:47.2275043Z ╰────
2026-10-24T03:18:47.2275319Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2275630Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2275633Z
2026-10-24T03:18:47.2275793Z ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2275963Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5]
2026-10-24T03:18:47.2276058Z 266 │ const variant = props.variant ?? "plain";
2026-10-24T03:18:47.2276192Z 267 │ const loadingVisibility = useSharedValue(props.loading ? 1 : 0);
2026-10-24T03:18:47.2276280Z · ────────┬────────
2026-10-24T03:18:47.2276509Z · ╰── `loadingVisibility` originates here
2026-10-24T03:18:47.2276642Z 268 │ useLayoutEffect(() => {
2026-10-24T03:18:47.2276866Z 269 │ loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING);
2026-10-24T03:18:47.2276951Z · ────────┬────────
2026-10-24T03:18:47.2277101Z · ╰── `loadingVisibility` cannot be modified
2026-10-24T03:18:47.2277194Z 270 │ }, [loadingVisibility, props.loading]);
2026-10-24T03:18:47.2277247Z ╰────
2026-10-24T03:18:47.2277597Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2277905Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2277913Z
2026-10-24T03:18:47.2278071Z ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2278244Z ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5]
2026-10-24T03:18:47.2278302Z 325 │ }) {
2026-10-24T03:18:47.2278468Z 326 │ const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0);
2026-10-24T03:18:47.2278556Z · ─────────┬─────────
2026-10-24T03:18:47.2278712Z · ╰── `recordingVisibility` originates here
2026-10-24T03:18:47.2278782Z 327 │ useLayoutEffect(() => {
2026-10-24T03:18:47.2278972Z 328 │ recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING);
2026-10-24T03:18:47.2279058Z · ─────────┬─────────
2026-10-24T03:18:47.2279220Z · ╰── `recordingVisibility` cannot be modified
2026-10-24T03:18:47.2279315Z 329 │ }, [props.phase, recordingVisibility]);
2026-10-24T03:18:47.2279368Z ╰────
2026-10-24T03:18:47.2279638Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2279958Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2279961Z
2026-10-24T03:18:47.2280109Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2280270Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38]
2026-10-24T03:18:47.2280537Z 121 │ const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T03:18:47.2280748Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T03:18:47.2280874Z · ───────────┬──────────
2026-10-24T03:18:47.2281054Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2281175Z 123 │ const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T03:18:47.2281226Z ╰────
2026-10-24T03:18:47.2281786Z 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
2026-10-24T03:18:47.2282085Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2282090Z
2026-10-24T03:18:47.2282236Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2282396Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8]
2026-10-24T03:18:47.2282449Z 125 │
2026-10-24T03:18:47.2282560Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2282650Z · ─────────┬────────
2026-10-24T03:18:47.2282800Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2282901Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2282955Z ╰────
2026-10-24T03:18:47.2283430Z 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
2026-10-24T03:18:47.2283730Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2283733Z
2026-10-24T03:18:47.2283877Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2284039Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7]
2026-10-24T03:18:47.2284093Z 125 │
2026-10-24T03:18:47.2284201Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2284287Z · ─────────┬─────────
2026-10-24T03:18:47.2284442Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2284550Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2284604Z ╰────
2026-10-24T03:18:47.2285071Z 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
2026-10-24T03:18:47.2285362Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2285365Z
2026-10-24T03:18:47.2285509Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2285670Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31]
2026-10-24T03:18:47.2285811Z 125 │
2026-10-24T03:18:47.2286018Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2286362Z · ─────────┬─────────
2026-10-24T03:18:47.2286533Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2286632Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2286730Z ╰────
2026-10-24T03:18:47.2287411Z 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
2026-10-24T03:18:47.2287710Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2287712Z
2026-10-24T03:18:47.2287863Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2288023Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30]
2026-10-24T03:18:47.2288077Z 125 │
2026-10-24T03:18:47.2288184Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2288299Z · ──────────┬─────────
2026-10-24T03:18:47.2288468Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2288570Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2288623Z ╰────
2026-10-24T03:18:47.2289093Z 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
2026-10-24T03:18:47.2289395Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2289398Z
2026-10-24T03:18:47.2289539Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2289700Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46]
2026-10-24T03:18:47.2289813Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2290014Z 127 │ ╭─▶ const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2290191Z 128 │ │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T03:18:47.2290325Z 129 │ │ onStatus: (status: RecordingStatus) => {
2026-10-24T03:18:47.2290485Z 130 │ │ sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T03:18:47.2290605Z 131 │ │ isFinished: status.isFinished,
2026-10-24T03:18:47.2290783Z 132 │ │ hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T03:18:47.2290888Z 133 │ │ error: status.error,
2026-10-24T03:18:47.2290988Z 134 │ │ url: status.url,
2026-10-24T03:18:47.2291072Z 135 │ │ });
2026-10-24T03:18:47.2291150Z 136 │ │ },
2026-10-24T03:18:47.2291350Z 137 │ │ // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T03:18:47.2291537Z 138 │ │ selectInput: (inputs) => {
2026-10-24T03:18:47.2291791Z 139 │ │ const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T03:18:47.2291941Z 140 │ │ if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T03:18:47.2292107Z 141 │ │ const known = microphoneOrder(preferences.value.microphones);
2026-10-24T03:18:47.2292250Z 142 │ │ const order = rememberMicrophones(known, inputs);
2026-10-24T03:18:47.2292353Z 143 │ │ if (order !== known) {
2026-10-24T03:18:47.2292559Z 144 │ │ registry.set(updateMobilePreferencesAtom, {
2026-10-24T03:18:47.2292682Z 145 │ │ transform: (current) => ({
2026-10-24T03:18:47.2292897Z 146 │ │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T03:18:47.2292988Z 147 │ │ }),
2026-10-24T03:18:47.2293070Z 148 │ │ });
2026-10-24T03:18:47.2293148Z 149 │ │ }
2026-10-24T03:18:47.2293292Z 150 │ │ return preferredMicrophoneInput(inputs, order);
2026-10-24T03:18:47.2293370Z 151 │ │ },
2026-10-24T03:18:47.2293504Z 152 │ ├─▶ });
2026-10-24T03:18:47.2293744Z · ╰──── Passing a ref to a function may read its value during render
2026-10-24T03:18:47.2293831Z 153 │ recorderRef.current = recorder;
2026-10-24T03:18:47.2293884Z ╰────
2026-10-24T03:18:47.2294359Z 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
2026-10-24T03:18:47.2294663Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2294666Z
2026-10-24T03:18:47.2294813Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2294979Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16]
2026-10-24T03:18:47.2295040Z 152 │ });
2026-10-24T03:18:47.2295123Z 153 │ recorderRef.current = recorder;
2026-10-24T03:18:47.2295237Z · ─────┬─────────┬───
2026-10-24T03:18:47.2295433Z · │ ╰── Cannot update ref value during render
2026-10-24T03:18:47.2295554Z · ╰── This value is a ref
2026-10-24T03:18:47.2295663Z 154 │ sessionRef.current = new VoiceInputSession({
2026-10-24T03:18:47.2295715Z ╰────
2026-10-24T03:18:47.2296204Z 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
2026-10-24T03:18:47.2296507Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2296509Z
2026-10-24T03:18:47.2296656Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2297037Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48]
2026-10-24T03:18:47.2297209Z 153 │ recorderRef.current = recorder;
2026-10-24T03:18:47.2297438Z 154 │ ╭─▶ sessionRef.current = new VoiceInputSession({
2026-10-24T03:18:47.2297524Z 155 │ │ recorder,
2026-10-24T03:18:47.2297655Z 156 │ │ getTranscriber: getLocalVoiceTranscriber,
2026-10-24T03:18:47.2297772Z 157 │ │ requestPermission: async () => {
2026-10-24T03:18:47.2297980Z 158 │ │ const permission = await requestRecordingPermissionsAsync();
2026-10-24T03:18:47.2298210Z 159 │ │ return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T03:18:47.2298294Z 160 │ │ },
2026-10-24T03:18:47.2298437Z 161 │ │ configureRecording: configureVoiceRecordingAudio,
2026-10-24T03:18:47.2298575Z 162 │ │ releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T03:18:47.2298710Z 163 │ │ deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T03:18:47.2298823Z 164 │ │ onStateChange: (nextState) =>
2026-10-24T03:18:47.2298913Z 165 │ │ setState({
2026-10-24T03:18:47.2299016Z 166 │ │ state: nextState,
2026-10-24T03:18:47.2299155Z 167 │ │ ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T03:18:47.2299284Z 168 │ │ label: sessionRef.current?.label ?? null,
2026-10-24T03:18:47.2299364Z 169 │ │ }),
2026-10-24T03:18:47.2299500Z 170 │ ├─▶ });
2026-10-24T03:18:47.2299705Z · ╰──── Cannot access ref value during render
2026-10-24T03:18:47.2299763Z 171 │ }
2026-10-24T03:18:47.2299814Z ╰────
2026-10-24T03:18:47.2300293Z 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
2026-10-24T03:18:47.2300596Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2300598Z
2026-10-24T03:18:47.2300750Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2300915Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15]
2026-10-24T03:18:47.2300997Z 153 │ recorderRef.current = recorder;
2026-10-24T03:18:47.2301101Z 154 │ sessionRef.current = new VoiceInputSession({
2026-10-24T03:18:47.2301213Z · ─────┬────────┬───
2026-10-24T03:18:47.2301397Z · │ ╰── Cannot update ref value during render
2026-10-24T03:18:47.2301513Z · ╰── This value is a ref
2026-10-24T03:18:47.2301579Z 155 │ recorder,
2026-10-24T03:18:47.2301631Z ╰────
2026-10-24T03:18:47.2302175Z 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
2026-10-24T03:18:47.2302562Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2302566Z
2026-10-24T03:18:47.2302708Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2302868Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7]
2026-10-24T03:18:47.2302956Z 184 │ return () => subscription.remove();
2026-10-24T03:18:47.2303035Z 185 │ }, [controller]);
2026-10-24T03:18:47.2303150Z · ─────┬────
2026-10-24T03:18:47.2303316Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2303371Z 186 │
2026-10-24T03:18:47.2303429Z ╰────
2026-10-24T03:18:47.2303913Z 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
2026-10-24T03:18:47.2304217Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2304219Z
2026-10-24T03:18:47.2304364Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2304524Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6]
2026-10-24T03:18:47.2304611Z 184 │ return () => subscription.remove();
2026-10-24T03:18:47.2304675Z 185 │ }, [controller]);
2026-10-24T03:18:47.2304760Z · ──────┬─────
2026-10-24T03:18:47.2304907Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2304962Z 186 │
2026-10-24T03:18:47.2305013Z ╰────
2026-10-24T03:18:47.2305498Z 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
2026-10-24T03:18:47.2305800Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2305803Z
2026-10-24T03:18:47.2305946Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2306108Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6]
2026-10-24T03:18:47.2306168Z 191 │ },
2026-10-24T03:18:47.2306241Z 192 │ [controller, recorder],
2026-10-24T03:18:47.2306318Z · ─────┬────
2026-10-24T03:18:47.2306459Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2306515Z 193 │ );
2026-10-24T03:18:47.2306568Z ╰────
2026-10-24T03:18:47.2307291Z 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
2026-10-24T03:18:47.2307588Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2307591Z
2026-10-24T03:18:47.2307808Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2308056Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20]
2026-10-24T03:18:47.2308151Z 174 │ const controller = session.controller;
2026-10-24T03:18:47.2308239Z 175 │ const recorder = recorderRef.current;
2026-10-24T03:18:47.2308344Z · ─────────┬─────────
2026-10-24T03:18:47.2308505Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2308559Z 176 │
2026-10-24T03:18:47.2308612Z ╰────
2026-10-24T03:18:47.2309164Z 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
2026-10-24T03:18:47.2309457Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2309460Z
2026-10-24T03:18:47.2309603Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2309759Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5]
2026-10-24T03:18:47.2309816Z 191 │ },
2026-10-24T03:18:47.2309886Z 192 │ [controller, recorder],
2026-10-24T03:18:47.2309978Z · ───────────┬──────────
2026-10-24T03:18:47.2310128Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2310183Z 193 │ );
2026-10-24T03:18:47.2310234Z ╰────
2026-10-24T03:18:47.2310720Z 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
2026-10-24T03:18:47.2311019Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2311021Z
2026-10-24T03:18:47.2311166Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2311325Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20]
2026-10-24T03:18:47.2311419Z 245 │ return () => clearInterval(intervalId);
2026-10-24T03:18:47.2311531Z 246 │ }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T03:18:47.2311622Z · ─────┬────
2026-10-24T03:18:47.2311851Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2311959Z 247 │
2026-10-24T03:18:47.2312039Z ╰────
2026-10-24T03:18:47.2312534Z 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
2026-10-24T03:18:47.2312912Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2312915Z
2026-10-24T03:18:47.2313058Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2313217Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6]
2026-10-24T03:18:47.2313313Z 245 │ return () => clearInterval(intervalId);
2026-10-24T03:18:47.2313426Z 246 │ }, [audioLevels, controller, recorder, state.phase]);
2026-10-24T03:18:47.2313556Z · ────────────────────────┬───────────────────────
2026-10-24T03:18:47.2313719Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2313773Z 247 │
2026-10-24T03:18:47.2313826Z ╰────
2026-10-24T03:18:47.2314290Z 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
2026-10-24T03:18:47.2314586Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2314591Z
2026-10-24T03:18:47.2314739Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2314897Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5]
2026-10-24T03:18:47.2314969Z 260 │ setOwnerFocused,
2026-10-24T03:18:47.2315029Z 261 │ session,
2026-10-24T03:18:47.2315102Z · ───┬───
2026-10-24T03:18:47.2315241Z · ╰── Cannot access ref value during render
2026-10-24T03:18:47.2315302Z 262 │ stop,
2026-10-24T03:18:47.2315353Z ╰────
2026-10-24T03:18:47.2315841Z 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
2026-10-24T03:18:47.2316147Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2316152Z
2026-10-24T03:18:47.2316298Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2316456Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10]
2026-10-24T03:18:47.2316515Z 250 │
2026-10-24T03:18:47.2316659Z 251 │ ╭─▶ return {
2026-10-24T03:18:47.2317077Z 252 │ │ isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null,
2026-10-24T03:18:47.2317163Z 253 │ │ state,
2026-10-24T03:18:47.2317252Z 254 │ │ audioLevels,
2026-10-24T03:18:47.2317426Z 255 │ │ elapsedSeconds,
2026-10-24T03:18:47.2317611Z 256 │ │ isBusy: voiceInputBlocksSubmission(state),
2026-10-24T03:18:47.2317723Z 257 │ │ ownerKey,
2026-10-24T03:18:47.2317804Z 258 │ │ label,
2026-10-24T03:18:47.2317897Z 259 │ │ focusedOwners,
2026-10-24T03:18:47.2317994Z 260 │ │ setOwnerFocused,
2026-10-24T03:18:47.2318075Z 261 │ │ session,
2026-10-24T03:18:47.2318156Z 262 │ │ stop,
2026-10-24T03:18:47.2318238Z 263 │ │ cancel,
2026-10-24T03:18:47.2318400Z 264 │ ├─▶ };
2026-10-24T03:18:47.2318653Z · ╰──── Cannot access ref value during render
2026-10-24T03:18:47.2318714Z 265 │ }
2026-10-24T03:18:47.2318770Z ╰────
2026-10-24T03:18:47.2319240Z 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
2026-10-24T03:18:47.2319535Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2319538Z
2026-10-24T03:18:47.2319698Z ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2319860Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T03:18:47.2320031Z 121 │ const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
2026-10-24T03:18:47.2320159Z 122 │ const audioLevels = useSharedValue(audioLevelsRef.current);
2026-10-24T03:18:47.2320238Z · ─────┬─────
2026-10-24T03:18:47.2320378Z · ╰── `audioLevels` originates here
2026-10-24T03:18:47.2320499Z 123 │ const sessionRef = useRef<VoiceInputSession | null>(null);
2026-10-24T03:18:47.2320647Z 124 │ const recorderRef = useRef<LazyVoiceRecorder<RecorderState> | null>(null);
2026-10-24T03:18:47.2320700Z 125 │
2026-10-24T03:18:47.2320808Z 126 │ if (!sessionRef.current || !recorderRef.current) {
2026-10-24T03:18:47.2320910Z 127 │ const recorder = createLazyVoiceRecorder({
2026-10-24T03:18:47.2321051Z 128 │ create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
2026-10-24T03:18:47.2321145Z 129 │ onStatus: (status: RecordingStatus) => {
2026-10-24T03:18:47.2321275Z 130 │ sessionRef.current?.controller.handleRecorderStatus({
2026-10-24T03:18:47.2321365Z 131 │ isFinished: status.isFinished,
2026-10-24T03:18:47.2321509Z 132 │ hasError: status.hasError || status.mediaServicesDidReset === true,
2026-10-24T03:18:47.2321583Z 133 │ error: status.error,
2026-10-24T03:18:47.2321654Z 134 │ url: status.url,
2026-10-24T03:18:47.2321715Z 135 │ });
2026-10-24T03:18:47.2321773Z 136 │ },
2026-10-24T03:18:47.2321938Z 137 │ // Read when recording starts so preference changes do not re-render every composer.
2026-10-24T03:18:47.2322016Z 138 │ selectInput: (inputs) => {
2026-10-24T03:18:47.2322140Z 139 │ const preferences = registry.get(mobilePreferencesAtom);
2026-10-24T03:18:47.2322255Z 140 │ if (!AsyncResult.isSuccess(preferences)) return null;
2026-10-24T03:18:47.2322459Z 141 │ const known = microphoneOrder(preferences.value.microphones);
2026-10-24T03:18:47.2322619Z 142 │ const order = rememberMicrophones(known, inputs);
2026-10-24T03:18:47.2322726Z 143 │ if (order !== known) {
2026-10-24T03:18:47.2322836Z 144 │ registry.set(updateMobilePreferencesAtom, {
2026-10-24T03:18:47.2322919Z 145 │ transform: (current) => ({
2026-10-24T03:18:47.2323096Z 146 │ microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
2026-10-24T03:18:47.2323159Z 147 │ }),
2026-10-24T03:18:47.2323221Z 148 │ });
2026-10-24T03:18:47.2323279Z 149 │ }
2026-10-24T03:18:47.2323432Z 150 │ return preferredMicrophoneInput(inputs, order);
2026-10-24T03:18:47.2323518Z 151 │ },
2026-10-24T03:18:47.2323576Z 152 │ });
2026-10-24T03:18:47.2323662Z 153 │ recorderRef.current = recorder;
2026-10-24T03:18:47.2323770Z 154 │ sessionRef.current = new VoiceInputSession({
2026-10-24T03:18:47.2323833Z 155 │ recorder,
2026-10-24T03:18:47.2323934Z 156 │ getTranscriber: getLocalVoiceTranscriber,
2026-10-24T03:18:47.2324019Z 157 │ requestPermission: async () => {
2026-10-24T03:18:47.2324155Z 158 │ const permission = await requestRecordingPermissionsAsync();
2026-10-24T03:18:47.2324315Z 159 │ return { granted: permission.granted, canAskAgain: permission.canAskAgain };
2026-10-24T03:18:47.2324372Z 160 │ },
2026-10-24T03:18:47.2324480Z 161 │ configureRecording: configureVoiceRecordingAudio,
2026-10-24T03:18:47.2324587Z 162 │ releaseRecording: releaseVoiceRecordingAudio,
2026-10-24T03:18:47.2324690Z 163 │ deleteRecording: (uri) => new File(uri).delete(),
2026-10-24T03:18:47.2324771Z 164 │ onStateChange: (nextState) =>
2026-10-24T03:18:47.2324842Z 165 │ setState({
2026-10-24T03:18:47.2324915Z 166 │ state: nextState,
2026-10-24T03:18:47.2325021Z 167 │ ownerKey: sessionRef.current?.ownerKey ?? null,
2026-10-24T03:18:47.2325119Z 168 │ label: sessionRef.current?.label ?? null,
2026-10-24T03:18:47.2325178Z 169 │ }),
2026-10-24T03:18:47.2325236Z 170 │ });
2026-10-24T03:18:47.2325291Z 171 │ }
2026-10-24T03:18:47.2325343Z 172 │
2026-10-24T03:18:47.2325430Z 173 │ const session = sessionRef.current;
2026-10-24T03:18:47.2325519Z 174 │ const controller = session.controller;
2026-10-24T03:18:47.2325606Z 175 │ const recorder = recorderRef.current;
2026-10-24T03:18:47.2325658Z 176 │
2026-10-24T03:18:47.2325814Z 177 │ useEffect(() => {
2026-10-24T03:18:47.2325973Z 178 │ const subscription = AppState.addEventListener("change", (nextState) => {
2026-10-24T03:18:47.2326126Z 179 │ // iOS reports `inactive` while its permission dialog is open. Only the
2026-10-24T03:18:47.2326269Z 180 │ // real background state cancels preparation; recorder status handles
2026-10-24T03:18:47.2326377Z 181 │ // calls and route interruptions during capture.
2026-10-24T03:18:47.2326516Z 182 │ if (nextState === "background") controller.appMovedToBackground();
2026-10-24T03:18:47.2326573Z 183 │ });
2026-10-24T03:18:47.2326657Z 184 │ return () => subscription.remove();
2026-10-24T03:18:47.2326809Z 185 │ }, [controller]);
2026-10-24T03:18:47.2326891Z 186 │
2026-10-24T03:18:47.2326967Z 187 │ useEffect(
2026-10-24T03:18:47.2327029Z 188 │ () => () => {
2026-10-24T03:18:47.2327103Z 189 │ controller.dispose();
2026-10-24T03:18:47.2327172Z 190 │ recorder.release();
2026-10-24T03:18:47.2327226Z 191 │ },
2026-10-24T03:18:47.2327386Z 192 │ [controller, recorder],
2026-10-24T03:18:47.2327488Z 193 │ );
2026-10-24T03:18:47.2327571Z 194 │
2026-10-24T03:18:47.2327668Z 195 │ useEffect(() => {
2026-10-24T03:18:47.2327787Z 196 │ if (state.phase !== "recording") return;
2026-10-24T03:18:47.2327841Z 197 │
2026-10-24T03:18:47.2327993Z 198 │ const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`;
2026-10-24T03:18:47.2328097Z 199 │ const activation = activateKeepAwakeAsync(tag);
2026-10-24T03:18:47.2328180Z 200 │ void activation.catch(() => {});
2026-10-24T03:18:47.2328244Z 201 │ return () => {
2026-10-24T03:18:47.2328488Z 202 │ // Release after activation settles, even if the recording ends immediately.
2026-10-24T03:18:47.2328650Z 203 │ void activation.then(() => deactivateKeepAwake(tag)).catch(() => {});
2026-10-24T03:18:47.2328707Z 204 │ };
2026-10-24T03:18:47.2328794Z 205 │ }, [keepAwakeId, state.phase]);
2026-10-24T03:18:47.2328850Z 206 │
2026-10-24T03:18:47.2328912Z 207 │ useEffect(() => {
2026-10-24T03:18:47.2329047Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T03:18:47.2329099Z 209 │
2026-10-24T03:18:47.2329222Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T03:18:47.2329375Z 211 │ audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T03:18:47.2329479Z 212 │ audioLevels.value = audioLevelsRef.current;
2026-10-24T03:18:47.2329558Z · ─────┬─────
2026-10-24T03:18:47.2329701Z · ╰── `audioLevels` cannot be modified
2026-10-24T03:18:47.2329755Z 213 │ }
2026-10-24T03:18:47.2329809Z ╰────
2026-10-24T03:18:47.2330087Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2330402Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2330404Z
2026-10-24T03:18:47.2330608Z ⚠ react(immutability): Cannot modify local variables after render completes
2026-10-24T03:18:47.2330771Z ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
2026-10-24T03:18:47.2330825Z 206 │
2026-10-24T03:18:47.2330889Z 207 │ useEffect(() => {
2026-10-24T03:18:47.2330966Z · ───┬───
2026-10-24T03:18:47.2331190Z · ╰── This function may (indirectly) reassign or modify `audioLevels` after render
2026-10-24T03:18:47.2331331Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return;
2026-10-24T03:18:47.2331387Z 209 │
2026-10-24T03:18:47.2331508Z 210 │ if (audioLevelsRef.current.some((level) => level !== 0)) {
2026-10-24T03:18:47.2331662Z 211 │ audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
2026-10-24T03:18:47.2331766Z 212 │ audioLevels.value = audioLevelsRef.current;
2026-10-24T03:18:47.2331844Z · ─────┬─────
2026-10-24T03:18:47.2331977Z · ╰── This modifies `audioLevels`
2026-10-24T03:18:47.2332033Z 213 │ }
2026-10-24T03:18:47.2332085Z ╰────
2026-10-24T03:18:47.2332430Z help: This argument is a function which may reassign or mutate `audioLevels` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
2026-10-24T03:18:47.2332818Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2332853Z
2026-10-24T03:18:47.2333068Z ⚠ react(immutability): This value cannot be modified
2026-10-24T03:18:47.2333239Z ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
2026-10-24T03:18:47.2333345Z 65 │ const [expanded, setExpanded] = useState(false);
2026-10-24T03:18:47.2333431Z 66 │ const progress = useSharedValue(0);
2026-10-24T03:18:47.2333505Z · ────┬───
2026-10-24T03:18:47.2333638Z · ╰── `progress` originates here
2026-10-24T03:18:47.2333728Z 67 │ useEffect(() => {
2026-10-24T03:18:47.2333903Z 68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
2026-10-24T03:18:47.2333979Z · ────┬───
2026-10-24T03:18:47.2334117Z · ╰── `progress` cannot be modified
2026-10-24T03:18:47.2334190Z 69 │ }, [expanded, progress]);
2026-10-24T03:18:47.2334242Z ╰────
2026-10-24T03:18:47.2334512Z help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
2026-10-24T03:18:47.2334820Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
2026-10-24T03:18:47.2334824Z
2026-10-24T03:18:47.2334972Z ⚠ react(refs): Cannot access refs during render
2026-10-24T03:18:47.2335140Z ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14]
2026-10-24T03:18:47.2335227Z 26 │ const latestInput = useRef(input);
2026-10-24T03:18:47.2335306Z 27 │ latestInput.current = input;
2026-10-24T03:18:47.2335419Z · ─────┬─────────┬───
2026-10-24T03:18:47.2335606Z · │ ╰── Cannot update ref value during render
2026-10-24T03:18:47.2335724Z · ╰── This value is a ref
2026-10-24T03:18:47.2335801Z 28 │ const mounted = useRef(true);
2026-10-24T03:18:47.2335854Z ╰────
2026-10-24T03:18:47.2336327Z 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
2026-10-24T03:18:47.2336627Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
2026-10-24T03:18:47.2336633Z
2026-10-24T03:18:47.2336986Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T03:18:47.2337227Z ╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8]
2026-10-24T03:18:47.2337302Z 3 │ AuthProvidersManageScope,
2026-10-24T03:18:47.2337373Z 4 │ type AuthSessionState,
2026-10-24T03:18:47.2337459Z · ────────┬───────
2026-10-24T03:18:47.2337607Z · ╰── 'AuthSessionState' is imported here
2026-10-24T03:18:47.2337675Z 5 │ type EnvironmentId,
2026-10-24T03:18:47.2337728Z ╰────
2026-10-24T03:18:47.2337827Z help: Consider removing this import.
2026-10-24T03:18:47.2337830Z
2026-10-24T03:18:47.2338075Z ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2338279Z ╭─[apps/web/src/hooks/useThreadActions.ts:821:56]
2026-10-24T03:18:47.2338399Z 820 │ const resolved = resolveThreadTarget(target);
2026-10-24T03:18:47.2338557Z 821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) {
2026-10-24T03:18:47.2338683Z · ─────┬────
2026-10-24T03:18:47.2338857Z · ╰── Cannot call impure function
2026-10-24T03:18:47.2338948Z 822 │ return AsyncResult.failure(
2026-10-24T03:18:47.2339026Z ╰────
2026-10-24T03:18:47.2339355Z help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2339662Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2339664Z
2026-10-24T03:18:47.2339838Z ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2339960Z ╭─[apps/web/src/hooks/useThreadActions.ts:709:46]
2026-10-24T03:18:47.2340031Z 708 │ const wokeAt = resolved
2026-10-24T03:18:47.2340171Z 709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() })
2026-10-24T03:18:47.2340288Z · ─────┬────
2026-10-24T03:18:47.2340453Z · ╰── Cannot call impure function
2026-10-24T03:18:47.2340519Z 710 │ : null;
2026-10-24T03:18:47.2340577Z ╰────
2026-10-24T03:18:47.2340855Z help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2341159Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2341162Z
2026-10-24T03:18:47.2341634Z ⚠ 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.
2026-10-24T03:18:47.2341769Z ╭─[packages/client-runtime/src/rpc/session.test.ts:226:3]
2026-10-24T03:18:47.2341827Z 225 │ ) {
2026-10-24T03:18:47.2342108Z 226 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T03:18:47.2342296Z 227 │ │ const socket = sockets[index];
2026-10-24T03:18:47.2342397Z 228 │ │ if (socket) {
2026-10-24T03:18:47.2342492Z 229 │ │ return socket;
2026-10-24T03:18:47.2342567Z 230 │ │ }
2026-10-24T03:18:47.2342671Z 231 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2342797Z 232 │ ╰─▶ }
2026-10-24T03:18:47.2342993Z 233 │ return yield* Effect.die(new Error("Expected the RPC protocol to create a websocket."));
2026-10-24T03:18:47.2343075Z ╰────
2026-10-24T03:18:47.2343080Z
2026-10-24T03:18:47.2343576Z ⚠ 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.
2026-10-24T03:18:47.2343715Z ╭─[packages/client-runtime/src/rpc/session.test.ts:240:3]
2026-10-24T03:18:47.2343772Z 239 │ ) {
2026-10-24T03:18:47.2343978Z 240 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T03:18:47.2344201Z 241 │ │ const request = socket.sent.map((message) => decodeJson(message)).filter(isRpcRequest)[index];
2026-10-24T03:18:47.2344293Z 242 │ │ if (request) {
2026-10-24T03:18:47.2344388Z 243 │ │ return request;
2026-10-24T03:18:47.2344463Z 244 │ │ }
2026-10-24T03:18:47.2344571Z 245 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2344701Z 246 │ ╰─▶ }
2026-10-24T03:18:47.2344868Z 247 │ return yield* Effect.die(new Error("Expected the RPC protocol to send a request."));
2026-10-24T03:18:47.2344922Z ╰────
2026-10-24T03:18:47.2344924Z
2026-10-24T03:18:47.2345387Z ⚠ 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.
2026-10-24T03:18:47.2345523Z ╭─[packages/client-runtime/src/rpc/client.test.ts:131:9]
2026-10-24T03:18:47.2345583Z 130 │ ) {
2026-10-24T03:18:47.2345798Z 131 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
2026-10-24T03:18:47.2345930Z 132 │ │ if (subscriptions.length >= count) {
2026-10-24T03:18:47.2346025Z 133 │ │ return;
2026-10-24T03:18:47.2346105Z 134 │ │ }
2026-10-24T03:18:47.2346213Z 135 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2346347Z 136 │ ╰─▶ }
2026-10-24T03:18:47.2346514Z 137 │ return yield* Effect.die(new Error(`Expected ${count} durable subscriptions.`));
2026-10-24T03:18:47.2346564Z ╰────
2026-10-24T03:18:47.2346569Z
2026-10-24T03:18:47.2347313Z ⚠ 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.
2026-10-24T03:18:47.2347538Z ╭─[packages/client-runtime/src/rpc/client.test.ts:252:7]
2026-10-24T03:18:47.2347703Z 251 │ yield* SubscriptionRef.set(activeSession, Option.some(session(firstClient)));
2026-10-24T03:18:47.2347955Z 252 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 1; attempt += 1) {
2026-10-24T03:18:47.2348060Z 253 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2348224Z 254 │ ╰─▶ }
2026-10-24T03:18:47.2348396Z 255 │ yield* SubscriptionRef.set(activeSession, Option.none());
2026-10-24T03:18:47.2348450Z ╰────
2026-10-24T03:18:47.2348452Z
2026-10-24T03:18:47.2348939Z ⚠ 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.
2026-10-24T03:18:47.2349076Z ╭─[packages/client-runtime/src/rpc/client.test.ts:258:7]
2026-10-24T03:18:47.2349134Z 257 │
2026-10-24T03:18:47.2349386Z 258 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
2026-10-24T03:18:47.2349493Z 259 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2349623Z 260 │ ╰─▶ }
2026-10-24T03:18:47.2349730Z 261 │ yield* Fiber.interrupt(subscriptionFiber);
2026-10-24T03:18:47.2349784Z ╰────
2026-10-24T03:18:47.2349786Z
2026-10-24T03:18:47.2350251Z ⚠ 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.
2026-10-24T03:18:47.2350384Z ╭─[packages/client-runtime/src/rpc/client.test.ts:322:7]
2026-10-24T03:18:47.2350446Z 321 │ );
2026-10-24T03:18:47.2350708Z 322 │ ╭─▶ for (let attempt = 0; attempt < 100 && observedFailures.length < 1; attempt += 1) {
2026-10-24T03:18:47.2350813Z 323 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2350944Z 324 │ ╰─▶ }
2026-10-24T03:18:47.2350998Z 325 │
2026-10-24T03:18:47.2351051Z ╰────
2026-10-24T03:18:47.2351054Z
2026-10-24T03:18:47.2351520Z ⚠ 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.
2026-10-24T03:18:47.2351656Z ╭─[packages/client-runtime/src/rpc/client.test.ts:330:7]
2026-10-24T03:18:47.2351821Z 329 │ yield* SubscriptionRef.set(activeSession, Option.some(session(secondClient)));
2026-10-24T03:18:47.2352077Z 330 │ ╭─▶ for (let attempt = 0; attempt < 100 && subscriptions.length < 2; attempt += 1) {
2026-10-24T03:18:47.2352182Z 331 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2352313Z 332 │ ╰─▶ }
2026-10-24T03:18:47.2352417Z 333 │ yield* Fiber.interrupt(subscriptionFiber);
2026-10-24T03:18:47.2352470Z ╰────
2026-10-24T03:18:47.2352547Z
2026-10-24T03:18:47.2352843Z ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used.
2026-10-24T03:18:47.2352951Z ╭─[apps/server/src/auth/http.ts:28:10]
2026-10-24T03:18:47.2353039Z 27 │ import * as Schema from "effect/Schema";
2026-10-24T03:18:47.2353134Z 28 │ import { identity } from "effect/Function";
2026-10-24T03:18:47.2353212Z · ────┬───
2026-10-24T03:18:47.2353349Z · ╰── 'identity' is imported here
2026-10-24T03:18:47.2353464Z 29 │ import * as Layer from "effect/Layer";
2026-10-24T03:18:47.2353546Z ╰────
2026-10-24T03:18:47.2353659Z help: Consider removing this import.
2026-10-24T03:18:47.2353662Z
2026-10-24T03:18:47.2354045Z ⚠ 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.
2026-10-24T03:18:47.2354180Z ╭─[apps/server/src/auth/RpcAuthorization.ts:237:17]
2026-10-24T03:18:47.2354317Z 236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => {
2026-10-24T03:18:47.2354453Z 237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload);
2026-10-24T03:18:47.2354562Z · ────────────────────────
2026-10-24T03:18:47.2354704Z 238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch);
2026-10-24T03:18:47.2354755Z ╰────
2026-10-24T03:18:47.2354757Z
2026-10-24T03:18:47.2355130Z ⚠ 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.
2026-10-24T03:18:47.2355266Z ╭─[apps/server/src/auth/RpcAuthorization.ts:256:26]
2026-10-24T03:18:47.2355369Z 255 │ if (method === WS_METHODS.assetsCreateUrl) {
2026-10-24T03:18:47.2355526Z 256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload);
2026-10-24T03:18:47.2355641Z · ────────────────────────
2026-10-24T03:18:47.2355703Z 257 │ return [
2026-10-24T03:18:47.2355755Z ╰────
2026-10-24T03:18:47.2355758Z
2026-10-24T03:18:47.2355927Z ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2356076Z ╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58]
2026-10-24T03:18:47.2356189Z 177 │ if (snoozeClockState.shell !== activeThreadShell) {
2026-10-24T03:18:47.2356358Z 178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() });
2026-10-24T03:18:47.2356487Z · ─────┬────
2026-10-24T03:18:47.2356702Z · ╰── Cannot call impure function
2026-10-24T03:18:47.2356785Z 179 │ }
2026-10-24T03:18:47.2356864Z ╰────
2026-10-24T03:18:47.2357202Z help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2357501Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2357503Z
2026-10-24T03:18:47.2357743Z ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
2026-10-24T03:18:47.2357979Z ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:265:9]
2026-10-24T03:18:47.2358093Z 264 │ ): boolean {
2026-10-24T03:18:47.2358287Z 265 │ const labels = entry.labels.map((label) => label.name.trim().toLowerCase());
2026-10-24T03:18:47.2358457Z · ─────────────────────────────────────────────────────────────────────
2026-10-24T03:18:47.2358609Z 266 │ const holds = (label: string) => labels.includes(label.trim().toLowerCase());
2026-10-24T03:18:47.2358662Z ╰────
2026-10-24T03:18:47.2358739Z help: Switch to `Set`
2026-10-24T03:18:47.2358742Z
2026-10-24T03:18:47.2358973Z ⚠ react(purity): Cannot call impure function during render
2026-10-24T03:18:47.2359127Z ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58]
2026-10-24T03:18:47.2359271Z 139 │ {...(weekStartsOn === undefined ? {} : { weekStartsOn })}
2026-10-24T03:18:47.2359426Z 140 │ disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }}
2026-10-24T03:18:47.2359549Z · ─────┬────
2026-10-24T03:18:47.2359723Z · ╰── Cannot call impure function
2026-10-24T03:18:47.2359822Z 141 │ onSelect={(selected) => {
2026-10-24T03:18:47.2359875Z ╰────
2026-10-24T03:18:47.2360157Z help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
2026-10-24T03:18:47.2360454Z note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
2026-10-24T03:18:47.2360462Z
2026-10-24T03:18:47.2360744Z ⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
2026-10-24T03:18:47.2360879Z ╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7]
2026-10-24T03:18:47.2360933Z 339 │
2026-10-24T03:18:47.2361038Z 340 │ const layerTest = AnalyticsService.layerTest;
2026-10-24T03:18:47.2361114Z · ────┬────
2026-10-24T03:18:47.2361250Z · ╰── 'layerTest' is declared here
2026-10-24T03:18:47.2361300Z ╰────
2026-10-24T03:18:47.2361409Z help: Consider removing this declaration.
2026-10-24T03:18:47.2361412Z
2026-10-24T03:18:47.2361583Z ⚠ eslint(no-empty-pattern): Empty object binding pattern
2026-10-24T03:18:47.2361713Z ╭─[apps/server/src/processRunner.test.ts:266:14]
2026-10-24T03:18:47.2361769Z 265 │
2026-10-24T03:18:47.2361876Z 266 │ for (const {} of ["timeout", "success"] as const) {
2026-10-24T03:18:47.2361948Z · ──
2026-10-24T03:18:47.2362004Z 267 │ }
2026-10-24T03:18:47.2362055Z ╰────
2026-10-24T03:18:47.2362289Z help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
2026-10-24T03:18:47.2362293Z
2026-10-24T03:18:47.2362484Z ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops
2026-10-24T03:18:47.2362611Z ╭─[packages/client-runtime/src/state/shell.ts:189:5]
2026-10-24T03:18:47.2362720Z 186 │ let waiting = yield* Ref.get(awaitingCompletion);
2026-10-24T03:18:47.2362788Z 187 │ let next = initial;
2026-10-24T03:18:47.2362980Z · ──┬─
2026-10-24T03:18:47.2363186Z · ╰── From this accumulator
2026-10-24T03:18:47.2363271Z 188 │ let receivedSnapshot = false;
2026-10-24T03:18:47.2363349Z 189 │ for (const item of items) {
2026-10-24T03:18:47.2363419Z · ─┬─
2026-10-24T03:18:47.2363528Z · ╰── For this loop
2026-10-24T03:18:47.2363618Z 190 │ if (item.kind === "synchronized") {
2026-10-24T03:18:47.2363687Z 191 │ waiting = false;
2026-10-24T03:18:47.2363779Z 192 │ if (Option.isSome(next.snapshot)) {
2026-10-24T03:18:47.2363958Z 193 │ next = { ...next, status: "live", error: Option.none() };
2026-10-24T03:18:47.2364057Z · ───┬───
2026-10-24T03:18:47.2364198Z · ╰── From this spread
2026-10-24T03:18:47.2364261Z 194 │ }
2026-10-24T03:18:47.2364313Z ╰────
2026-10-24T03:18:47.2364469Z help: Consider using `Object.assign()` to mutate the accumulator instead.
2026-10-24T03:18:47.2364631Z note: Using spreads within accumulators leads to `O(n^2)` time complexity.
2026-10-24T03:18:47.2364635Z
2026-10-24T03:18:47.2364899Z ⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts.
2026-10-24T03:18:47.2365048Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14]
2026-10-24T03:18:47.2365208Z 11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) {
2026-10-24T03:18:47.2365288Z 12 │ this.onmessage = listener;
2026-10-24T03:18:47.2365369Z · ─────────
2026-10-24T03:18:47.2365434Z 13 │ }
2026-10-24T03:18:47.2365487Z ╰────
2026-10-24T03:18:47.2365975Z help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on<event>` replaces any previously registered handler.
2026-10-24T03:18:47.2365979Z
2026-10-24T03:18:47.2366193Z ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
2026-10-24T03:18:47.2366341Z ╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9]
2026-10-24T03:18:47.2366408Z 15 │ constructor() {
2026-10-24T03:18:47.2366472Z 16 │ source = this;
2026-10-24T03:18:47.2366546Z · ──────
2026-10-24T03:18:47.2366603Z 17 │ }
2026-10-24T03:18:47.2366655Z ╰────
2026-10-24T03:18:47.2367073Z 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.
2026-10-24T03:18:47.2367078Z
2026-10-24T03:18:47.2367289Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T03:18:47.2367426Z ╭─[packages/client-runtime/src/state/usageAccess.ts:3:8]
2026-10-24T03:18:47.2367503Z 2 │ AuthDiagnosticsReadScope,
2026-10-24T03:18:47.2367572Z 3 │ type AuthSessionState,
2026-10-24T03:18:47.2367657Z · ────────┬───────
2026-10-24T03:18:47.2367808Z · ╰── 'AuthSessionState' is imported here
2026-10-24T03:18:47.2367878Z 4 │ sessionGrantsScope,
2026-10-24T03:18:47.2367929Z ╰────
2026-10-24T03:18:47.2368030Z help: Consider removing this import.
2026-10-24T03:18:47.2368033Z
2026-10-24T03:18:47.2368613Z ⚠ 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.
2026-10-24T03:18:47.2368872Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7]
2026-10-24T03:18:47.2368934Z 168 │ });
2026-10-24T03:18:47.2369138Z 169 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
2026-10-24T03:18:47.2369338Z 170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break;
2026-10-24T03:18:47.2369447Z 171 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2369638Z 172 │ ╰─▶ }
2026-10-24T03:18:47.2369705Z 173 │
2026-10-24T03:18:47.2369765Z ╰────
2026-10-24T03:18:47.2369770Z
2026-10-24T03:18:47.2370257Z ⚠ 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.
2026-10-24T03:18:47.2370407Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7]
2026-10-24T03:18:47.2370518Z 177 │ yield* Deferred.succeed(releaseSave, undefined);
2026-10-24T03:18:47.2370716Z 178 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
2026-10-24T03:18:47.2370852Z 179 │ │ if ((yield* Ref.get(saved)).length > 0) break;
2026-10-24T03:18:47.2370958Z 180 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2371094Z 181 │ ╰─▶ }
2026-10-24T03:18:47.2371152Z 182 │
2026-10-24T03:18:47.2371205Z ╰────
2026-10-24T03:18:47.2371208Z
2026-10-24T03:18:47.2371668Z ⚠ 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.
2026-10-24T03:18:47.2371817Z ╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7]
2026-10-24T03:18:47.2371944Z 306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined);
2026-10-24T03:18:47.2372137Z 307 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
2026-10-24T03:18:47.2372261Z 308 │ │ const values = yield* Ref.get(saved);
2026-10-24T03:18:47.2372529Z 309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) {
2026-10-24T03:18:47.2372668Z 310 │ │ break;
2026-10-24T03:18:47.2372772Z 311 │ │ }
2026-10-24T03:18:47.2372879Z 312 │ │ yield* Effect.yieldNow;
2026-10-24T03:18:47.2373012Z 313 │ ╰─▶ }
2026-10-24T03:18:47.2373066Z 314 │
2026-10-24T03:18:47.2373118Z ╰────
2026-10-24T03:18:47.2373121Z
2026-10-24T03:18:47.2373326Z ⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
2026-10-24T03:18:47.2373523Z ╭─[packages/client-runtime/src/state/filesystem.ts:3:8]
2026-10-24T03:18:47.2373607Z 2 │ AuthFilesystemReadScope,
2026-10-24T03:18:47.2373684Z 3 │ type AuthSessionState,
2026-10-24T03:18:47.2373772Z · ────────┬───────
2026-10-24T03:18:47.2373922Z · ╰── 'AuthSessionState' is imported here
2026-10-24T03:18:47.2373997Z 4 │ type FilesystemBrowseEntry,
2026-10-24T03:18:47.2374049Z ╰────
2026-10-24T03:18:47.2374150Z help: Consider removing this import.
2026-10-24T03:18:47.2374153Z
2026-10-24T03:18:47.2374369Z ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used.
2026-10-24T03:18:47.2374473Z ╭─[infra/relay/src/http/Api.ts:69:13]
2026-10-24T03:18:47.2374618Z 68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts";
2026-10-24T03:18:47.2374737Z 69 │ import * as HookForwarder from "../hooks/HookForwarder.ts";
2026-10-24T03:18:47.2374830Z · ──────┬──────
2026-10-24T03:18:47.2374979Z · ╰── 'HookForwarder' is imported here
2026-10-24T03:18:47.2375086Z 70 │ import * as HeldHooks from "../hooks/HeldHooks.ts";
2026-10-24T03:18:47.2375139Z ╰────
2026-10-24T03:18:47.2375239Z help: Consider removing this import.
2026-10-24T03:18:47.2375241Z
2026-10-24T03:18:47.2375326Z Found 0 errors and 360 warnings in 5409 files (5.2s, 8 threads)
2026-10-24T03:18:47.2892134Z Post job cleanup.
2026-10-24T03:18:47.3558167Z Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
2026-10-24T03:18:47.3637379Z Post job cleanup.
2026-10-24T03:18:47.3646479Z ##[start-action display=Cache full pnpm store;id=__9b546d06-f711-4b8b-896f-c9fcda459c8d.__actions_cache]
2026-10-24T03:18:47.3990563Z Post job cleanup.
2026-10-24T03:18:47.4926271Z Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-045caa51c4b226597018f0d0c699ccc3936ad58bb7e4b01dc2f26bb9d6fd8aef, not saving cache.
2026-10-24T03:18:47.4964518Z ##[end-action id=__9b546d06-f711-4b8b-896f-c9fcda459c8d.__actions_cache;outcome=success;conclusion=success;duration_ms=131]
2026-10-24T03:18:47.4966450Z ##[start-action display=Cache Vite+;id=__9b546d06-f711-4b8b-896f-c9fcda459c8d.vp_cache]
2026-10-24T03:18:47.4986829Z Post job cleanup.
2026-10-24T03:18:47.5627252Z 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.
2026-10-24T03:18:47.5664338Z ##[end-action id=__9b546d06-f711-4b8b-896f-c9fcda459c8d.vp_cache;outcome=success;conclusion=success;duration_ms=69]
2026-10-24T03:18:47.5701365Z Post job cleanup.
2026-10-24T03:18:47.6122158Z [command]/usr/local/bin/git version
2026-10-24T03:18:47.6151655Z git version 2.55.0
2026-10-24T03:18:47.6169079Z Temporarily overriding HOME='/home/runner/_work/_temp/7e153447-df7e-46dc-92a3-5292c4e66757' before making global git config changes
2026-10-24T03:18:47.6169649Z Adding repository directory to the temporary git global config as a safe directory
2026-10-24T03:18:47.6172067Z [command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
2026-10-24T03:18:47.6192722Z Removing SSH command configuration
2026-10-24T03:18:47.6195649Z [command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
2026-10-24T03:18:47.6217954Z [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' || :"
2026-10-24T03:18:47.6348698Z fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
2026-10-24T03:18:47.6402267Z ##[warning]The process '/usr/local/bin/git' failed with exit code 128
2026-10-24T03:18:47.6439254Z A job completed hook has been configured by the self-hosted runner administrator
2026-10-24T03:18:47.6455909Z ##[group]Run '/job_completed.sh'
2026-10-24T03:18:47.6462433Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
2026-10-24T03:18:47.6462602Z env:
2026-10-24T03:18:47.6462715Z BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 223
2026-10-24T03:18:47.6462864Z BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 385
2026-10-24T03:18:47.6463005Z BLACKSMITH_CHECK_RUN_ID: 120764327339
2026-10-24T03:18:47.6463144Z BLACKSMITH_JOB_DISPLAY_NAME: Lint
2026-10-24T03:18:47.6463281Z GITHUB_ACTIONS_CACHE_MODE: write
2026-10-24T03:18:47.6463415Z ##[endgroup]
2026-10-24T03:18:47.6542446Z Docker container cache not activated, skipping hash computation.
2026-10-24T03:18:47.6855448Z No active SSH sessions detected. Proceeding with shutdown immediately.
2026-10-24T03:18:47.7283788Z Cleaning up orphan processes