GitHub check

256 KB of 598 KB loaded Download the full log (598 KB)
342 KB of earlier output not loaded
     ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31]
 177 β”‚   });
 178 β”‚   const sendToThread = vi.fn((_: unknown) => {
     Β·                               ┬
     Β·                               ╰── '_' is declared here
 179 β”‚     switch (options.continuation ?? "queued") {
     ╰────
  help: Consider removing this parameter.

  ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
     ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33]
 202 β”‚   );
 203 β”‚   const removeWorktree = vi.fn((_: unknown) =>
     Β·                                 ┬
     Β·                                 ╰── '_' is declared here
 204 β”‚     options.removeWorktreeFails
     ╰────
  help: Consider removing this parameter.

  ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
     ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36]
 207 β”‚   );
 208 β”‚   const deleteLocalBranch = vi.fn((_: unknown) =>
     Β·                                    ┬
     Β·                                    ╰── '_' is declared here
 209 β”‚     options.deleteLocalBranchFails
     ╰────
  help: Consider removing this parameter.

  ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
     ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42]
 212 β”‚   );
 213 β”‚   const fetchWorktreeBaseCommit = vi.fn((_: unknown) =>
     Β·                                          ┬
     Β·                                          ╰── '_' is declared here
 214 β”‚     options.fetchWorktreeBaseFails
     ╰────
  help: Consider removing this parameter.

  ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
     ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30]
 253 β”‚   );
 254 β”‚   const localStatus = vi.fn((_: unknown) =>
     Β·                              ┬
     Β·                              ╰── '_' is declared here
 255 β”‚     Effect.succeed({
     ╰────
  help: Consider removing this parameter.

  ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
     ╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32]
 263 β”‚   );
 264 β”‚   const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub"));
     Β·                                ┬
     Β·                                ╰── '_' is declared here
 265 β”‚   const runForThread = vi.fn((input: { readonly worktreePath: string }) => {
     ╰────
  help: Consider removing this parameter.

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:400:5]
 398 β”‚
 399 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 400 β”‚     setInspectorSelection((current) => {
     Β·     ──────────┬──────────
     Β·               ╰── Avoid calling setState() directly within an effect
 401 β”‚       if (props.renderInspector === undefined) {
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(no-unstable-nested-components): Do not define components during render.
     ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:528:24]
 527 β”‚       const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
 528 β”‚ ╭─▢   const GitInspector = () => (
 529 β”‚ β”‚       <GitOverviewSheet
 530 β”‚ β”‚         headerInset={inspectorHeaderInset}
 531 β”‚ β”‚         presentation="inspector"
 532 β”‚ β”‚         route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
 533 β”‚ β”‚       />
 534 β”‚ ╰─▢   );
 535 β”‚       const FilesInspector = () =>
     ╰────
  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.

  ⚠ react(no-unstable-nested-components): Do not define components during render.
     ╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:535:26]
 534 β”‚       );
 535 β”‚ ╭─▢   const FilesInspector = () =>
 536 β”‚ β”‚       selectedThread !== null && selectedThreadCwd !== null ? (
 537 β”‚ β”‚         <ThreadFileNavigatorPane
 538 β”‚ β”‚           cwd={selectedThreadCwd}
 539 β”‚ β”‚           environmentId={selectedThread.environmentId}
 540 β”‚ β”‚           headerInset={inspectorHeaderInset}
 541 β”‚ β”‚           projectName={selectedThreadProject?.title ?? "Files"}
 542 β”‚ β”‚           selectedPath={null}
 543 β”‚ β”‚           onSelectFile={handleSelectInspectorFile}
 544 β”‚ β”‚         />
 545 β”‚ ╰─▢     ) : null;
 546 β”‚       const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
     ╰────
  help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.

  ⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used.
    ╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10]
 21 β”‚
 22 β”‚ function summarizePayload(payload: unknown): Readonly<Record<string, unknown>> {
    Β·          ────────┬───────
    Β·                  ╰── 'summarizePayload' is declared here
 23 β”‚   if (payload === null) return { valueType: "null" };
    ╰────
  help: Consider removing this declaration.

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:512:5]
 510 β”‚   }, []);
 511 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 512 β”‚     setKeyboardStateSuspect(false);
     Β·     ───────────┬───────────
     Β·                ╰── Avoid calling setState() directly within an effect
 513 β”‚   }, [isKeyboardVisible, liveKeyboardHeight]);
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:872:7]
 869 β”‚   const [lastKnownKeyboardHeight, setLastKnownKeyboardHeight] = useState(0);
 870 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 871 β”‚     if (liveKeyboardHeight > 0 && liveKeyboardHeight !== lastKnownKeyboardHeight) {
 872 β”‚       setLastKnownKeyboardHeight(liveKeyboardHeight);
     Β·       ─────────────┬────────────
     Β·                    ╰── Avoid calling setState() directly within an effect
 873 β”‚     }
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1119:5]
 1117 β”‚
 1118 β”‚   useEffect(() => {
      Β·   ────┬────
      Β·       ╰── This is the containing effect
 1119 β”‚     setAnchorMessageId(null);
      Β·     ─────────┬────────
      Β·              ╰── Avoid calling setState() directly within an effect
 1120 β”‚     setSubmittedMessageId(null);
      ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
     ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:513:7]
 512 β”‚     setKeyboardStateSuspect(false);
 513 β”‚   }, [isKeyboardVisible, liveKeyboardHeight]);
     Β·       ────────┬────────  ─────────┬────────
     Β·               β”‚                   ╰── Unnecessary dependency `liveKeyboardHeight`
     Β·               ╰── Unnecessary dependency `isKeyboardVisible`
 514 β”‚   const handleOwnedInputFocusChange = (focused: boolean) => {
     ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1067:7]
 1066 β”‚     userInputInsetProgress.set(1);
 1067 β”‚   }, [activeUserInputRequestId, userInputCardProgress, userInputInsetProgress]);
      Β·       ────────────┬───────────
      Β·                   ╰── Unnecessary dependency `activeUserInputRequestId`
 1068 β”‚   const showContent = props.showContent ?? true;
      ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
      ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:1125:15]
 1124 β”‚     freeze.set(false);
 1125 β”‚   }, [freeze, selectedThreadKey]);
      Β·               ────────┬────────
      Β·                       ╰── Unnecessary dependency `selectedThreadKey`
 1126 β”‚
      ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(immutability): This value cannot be modified
     ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:955:5]
 950 β”‚   const composerPopoverHeight = useSharedValue(0);
 951 β”‚   const floatingControlCoverage = useSharedValue(
     Β·         ───────────┬───────────
     Β·                    ╰── `floatingControlCoverage` originates here
 952 β”‚     showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
 953 β”‚   );
 954 β”‚   useEffect(() => {
 955 β”‚     floatingControlCoverage.value = withTiming(
     Β·     ───────────┬───────────
     Β·                ╰── `floatingControlCoverage` cannot be modified
 956 β”‚       showFloatingStatus ? FLOATING_WORKING_CONTROL_COVERAGE : 0,
     ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): This value cannot be modified
     ╭─[apps/mobile/src/features/threads/ThreadDetailScreen.tsx:973:7]
 963 β”‚   const userInputCoverageApplies = Platform.OS === "ios" && activeUserInputRequestId !== null;
 964 β”‚   const combinedContentInsetEndAdjustment = useSharedValue(
     Β·         ────────────────┬────────────────
     Β·                         ╰── `combinedContentInsetEndAdjustment` originates here
 965 β”‚     Math.max(0, estimatedOverlayHeight - nativeInsetOvercount),
 966 β”‚   );
 967 β”‚   useAnimatedReaction(
 968 β”‚     () =>
 969 β”‚       contentInsetEndAdjustment.value +
 970 β”‚       floatingControlCoverage.value +
 971 β”‚       (userInputCoverageApplies ? userInputInsetProgress.value * userInputCardCoverage.value : 0),
 972 β”‚     (value) => {
 973 β”‚       combinedContentInsetEndAdjustment.value = value;
     Β·       ────────────────┬────────────────
     Β·                       ╰── `combinedContentInsetEndAdjustment` cannot be modified
 974 β”‚     },
     ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownOption(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
     ╭─[packages/shared/src/otelEnvironment.ts:146:14]
 145 β”‚     name,
 146 β”‚     (raw) => Schema.decodeUnknownOption(OtlpProtocol)(raw.toLowerCase()),
     Β·              ──────────────────────────
 147 β”‚     `${name} is not http/protobuf or http/json, ${NOT_EXPORTED}`,
     ╰────

  ⚠ eslint(require-yield): This generator function does not have `yield`
     ╭─[packages/provider-acp/src/server/mcpOverAcpBridge.ts:81:78]
  80 β”‚
  81 β”‚ ╭─▢ export const makeAcpMcpOverAcpBridge = Effect.fn("AcpMcpOverAcpBridge.make")(function* (
  82 β”‚ β”‚     options: AcpMcpOverAcpBridgeOptions,
  83 β”‚ β”‚   ): Effect.fn.Return<AcpMcpOverAcpBridge> {
  84 β”‚ β”‚     const fetchImplementation = options.fetchImplementation ?? fetch;
  85 β”‚ β”‚     const connections = new Map<string, Connection>();
  86 β”‚ β”‚
  87 β”‚ β”‚     const connectionFor = (connectionId: string): Effect.Effect<Connection, AcpMcpOverAcpError> =>
  88 β”‚ β”‚       Effect.suspend(() => {
  89 β”‚ β”‚         const connection = connections.get(connectionId);
  90 β”‚ β”‚         return connection === undefined
  91 β”‚ β”‚           ? Effect.fail(new AcpMcpOverAcpError(`Unknown MCP-over-ACP connection "${connectionId}".`))
  92 β”‚ β”‚           : Effect.succeed(connection);
  93 β”‚ β”‚       });
  94 β”‚ β”‚
  95 β”‚ β”‚     const send = (
  96 β”‚ β”‚       connection: Connection,
  97 β”‚ β”‚       message: unknown,
  98 β”‚ β”‚     ): Effect.Effect<ReadonlyArray<unknown>, AcpMcpOverAcpError> =>
  99 β”‚ β”‚       connection.mutex.withPermits(1)(
 100 β”‚ β”‚         Effect.gen(function* () {
 101 β”‚ β”‚           const body = JSON.stringify(message);
 102 β”‚ β”‚           if (Buffer.byteLength(body) > MAX_MESSAGE_BYTES) {
 103 β”‚ β”‚             return yield* Effect.fail(new AcpMcpOverAcpError("MCP-over-ACP message exceeds 8 MiB."));
 104 β”‚ β”‚           }
 105 β”‚ β”‚           const response = yield* Effect.tryPromise({
 106 β”‚ β”‚             try: (signal) =>
 107 β”‚ β”‚               fetchImplementation(options.endpoint, {
 108 β”‚ β”‚                 method: "POST",
 109 β”‚ β”‚                 signal,
 110 β”‚ β”‚                 headers: {
 111 β”‚ β”‚                   "content-type": "application/json",
 112 β”‚ β”‚                   accept: "application/json, text/event-stream",
 113 β”‚ β”‚                   authorization: options.authorization,
 114 β”‚ β”‚                   ...(connection.sessionId === null
 115 β”‚ β”‚                     ? {}
 116 β”‚ β”‚                     : { "mcp-session-id": connection.sessionId }),
 117 β”‚ β”‚                   ...(connection.protocolVersion === null
 118 β”‚ β”‚                     ? {}
 119 β”‚ β”‚                     : { "mcp-protocol-version": connection.protocolVersion }),
 120 β”‚ β”‚                 },
 121 β”‚ β”‚                 body,
 122 β”‚ β”‚               }),
 123 β”‚ β”‚             catch: bridgeError,
 124 β”‚ β”‚           });
 125 β”‚ β”‚           connection.sessionId = response.headers.get("mcp-session-id") ?? connection.sessionId;
 126 β”‚ β”‚           if (!response.ok) {
 127 β”‚ β”‚             yield* Effect.promise(
 128 β”‚ β”‚               () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
 129 β”‚ β”‚             );
 130 β”‚ β”‚             return yield* Effect.fail(
 131 β”‚ β”‚               new AcpMcpOverAcpError(`T3 Code MCP endpoint responded with HTTP ${response.status}.`),
 132 β”‚ β”‚             );
 133 β”‚ β”‚           }
 134 β”‚ β”‚           const payloads = [...(yield* Stream.runCollect(responsePayloads(response, bridgeError)))];
 135 β”‚ β”‚           for (const payload of payloads) {
 136 β”‚ β”‚             connection.protocolVersion = protocolVersionOf(payload) ?? connection.protocolVersion;
 137 β”‚ β”‚           }
 138 β”‚ β”‚           return payloads;
 139 β”‚ β”‚         }).pipe(Effect.mapError(bridgeError)),
 140 β”‚ β”‚       );
 141 β”‚ β”‚
 142 β”‚ β”‚     const disconnect = Effect.fn("mcpOverAcpBridge.disconnect")(function* (
 143 β”‚ β”‚       request: AcpSchema.DisconnectMcpRequest,
 144 β”‚ β”‚     ): Effect.fn.Return<AcpSchema.DisconnectMcpResponse, AcpMcpOverAcpError> {
 145 β”‚ β”‚       const connection = yield* connectionFor(request.connectionId);
 146 β”‚ β”‚       connections.delete(request.connectionId);
 147 β”‚ β”‚       const sessionId = connection.sessionId;
 148 β”‚ β”‚       if (sessionId !== null) {
 149 β”‚ β”‚         const response = yield* Effect.tryPromise({
 150 β”‚ β”‚           try: (signal) =>
 151 β”‚ β”‚             fetchImplementation(options.endpoint, {
 152 β”‚ β”‚               method: "DELETE",
 153 β”‚ β”‚               signal,
 154 β”‚ β”‚               headers: {
 155 β”‚ β”‚                 authorization: options.authorization,
 156 β”‚ β”‚                 "mcp-session-id": sessionId,
 157 β”‚ β”‚                 ...(connection.protocolVersion === null
 158 β”‚ β”‚                   ? {}
 159 β”‚ β”‚                   : { "mcp-protocol-version": connection.protocolVersion }),
 160 β”‚ β”‚               },
 161 β”‚ β”‚             }),
 162 β”‚ β”‚           catch: bridgeError,
 163 β”‚ β”‚         });
 164 β”‚ β”‚         if (!response.ok && response.status !== 404) {
 165 β”‚ β”‚           return yield* Effect.fail(
 166 β”‚ β”‚             new AcpMcpOverAcpError(
 167 β”‚ β”‚               `T3 Code MCP endpoint rejected disconnect with HTTP ${response.status}.`,
 168 β”‚ β”‚             ),
 169 β”‚ β”‚           );
 170 β”‚ β”‚         }
 171 β”‚ β”‚         yield* Effect.promise(
 172 β”‚ β”‚           () => response.body?.cancel().catch(() => undefined) ?? Promise.resolve(),
 173 β”‚ β”‚         );
 174 β”‚ β”‚       }
 175 β”‚ β”‚       return {};
 176 β”‚ β”‚     });
 177 β”‚ β”‚
 178 β”‚ β”‚     return {
 179 β”‚ β”‚       connect: Effect.fn("mcpOverAcpBridge.connect")(function* (request) {
 180 β”‚ β”‚         if (request.serverId !== "t3-code") {
 181 β”‚ β”‚           return yield* Effect.fail(
 182 β”‚ β”‚             new AcpMcpOverAcpError(`Unknown ACP MCP server "${request.serverId}".`),
 183 β”‚ β”‚           );
 184 β”‚ β”‚         }
 185 β”‚ β”‚         if (connections.size >= MAX_CONNECTIONS) {
 186 β”‚ β”‚           return yield* Effect.fail(new AcpMcpOverAcpError("Too many MCP-over-ACP connections."));
 187 β”‚ β”‚         }
 188 β”‚ β”‚         const connectionId = yield* options.allocateConnectionId;
 189 β”‚ β”‚         connections.set(connectionId, {
 190 β”‚ β”‚           mutex: yield* Semaphore.make(1),
 191 β”‚ β”‚           sessionId: null,
 192 β”‚ β”‚           protocolVersion: null,
 193 β”‚ β”‚           nextRequestId: 0,
 194 β”‚ β”‚         });
 195 β”‚ β”‚         return { connectionId };
 196 β”‚ β”‚       }),
 197 β”‚ β”‚       message: Effect.fn("mcpOverAcpBridge.message")(function* (request) {
 198 β”‚ β”‚         const connection = yield* connectionFor(request.connectionId);
 199 β”‚ β”‚         const id = ++connection.nextRequestId;
 200 β”‚ β”‚         const payloads = yield* send(connection, {
 201 β”‚ β”‚           jsonrpc: "2.0",
 202 β”‚ β”‚           id,
 203 β”‚ β”‚           method: request.method,
 204 β”‚ β”‚           ...(request.params == null ? {} : { params: request.params }),
 205 β”‚ β”‚         });
 206 β”‚ β”‚         const response = payloads.find((payload) => asEnvelope(payload)?.id === id);
 207 β”‚ β”‚         const envelope = asEnvelope(response);
 208 β”‚ β”‚         if (envelope === null) {
 209 β”‚ β”‚           return yield* Effect.fail(
 210 β”‚ β”‚             new AcpMcpOverAcpError("MCP server did not return a matching response."),
 211 β”‚ β”‚           );
 212 β”‚ β”‚         }
 213 β”‚ β”‚         if (envelope.error !== undefined) {
 214 β”‚ β”‚           return yield* Effect.fail(new AcpMcpOverAcpError(errorMessage(envelope.error)));
 215 β”‚ β”‚         }
 216 β”‚ β”‚         return (envelope.result ?? null) as AcpSchema.MessageMcpResponse;
 217 β”‚ β”‚       }),
 218 β”‚ β”‚       notification: Effect.fn("mcpOverAcpBridge.notification")(function* (request) {
 219 β”‚ β”‚         const connection = yield* connectionFor(request.connectionId);
 220 β”‚ β”‚         yield* send(connection, {
 221 β”‚ β”‚           jsonrpc: "2.0",
 222 β”‚ β”‚           method: request.method,
 223 β”‚ β”‚           ...(request.params == null ? {} : { params: request.params }),
 224 β”‚ β”‚         });
 225 β”‚ β”‚       }),
 226 β”‚ β”‚       disconnect,
 227 β”‚ β”‚       dispose: Effect.suspend(() =>
 228 β”‚ β”‚         Effect.forEach(
 229 β”‚ β”‚           [...connections.keys()],
 230 β”‚ β”‚           (connectionId) => disconnect({ connectionId }).pipe(Effect.ignore),
 231 β”‚ β”‚           { discard: true },
 232 β”‚ β”‚         ),
 233 β”‚ β”‚       ),
 234 β”‚ β”‚     };
 235 β”‚ ╰─▢ });
     ╰────
  help: Add a `yield` expression inside the generator body, or convert it to a regular function if iteration behavior is not needed.

  ⚠ eslint(no-empty-pattern): Empty object binding pattern
    ╭─[packages/provider-opencode/src/server/OpenCodeRuntime.environment.test.ts:53:14]
 52 β”‚
 53 β”‚   for (const {} of [
    Β·              ──
 54 β”‚     { healthy: true },
    ╰────
  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.

  ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
    ╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15]
 87 β”‚             <li
 88 β”‚               key={`${index}:${check.name}`}
    Β·               ──────────────────────────────
 89 β”‚               className="col-span-full grid grid-cols-subgrid items-center text-xs"
    ╰────
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
     ╭─[packages/shared/src/serverSettings.ts:346:9]
 345 β”‚       const entry: ProjectSettingsOverrides = {
 346 β”‚         ...(entries.get(projectId) ?? currentEntries[projectId] ?? {}),
     Β·         ──────────────────────────────────────────────────────────────
 347 β”‚       };
     ╰────
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  ⚠ oxc(no-accumulating-spread): Do not spread accumulators in Array.prototype.reduce()
     ╭─[packages/shared/src/serverSettings.ts:448:24]
 447 β”‚   const favorites =
 448 β”‚     setModelFavorites?.reduce((current, change) => {
     Β·                        ───┬──
     Β·                           ╰── For this reduce
 449 β”‚       const exists = current.some(
 450 β”‚         (favorite) => favorite.provider === change.provider && favorite.model === change.model,
 451 β”‚       );
 452 β”‚       return change.favorite
 453 β”‚         ? exists
 454 β”‚           ? current
 455 β”‚           : [...current, { provider: change.provider, model: change.model }]
     Β·              ─────┬────
     Β·                   ╰── From this spread
 456 β”‚         : current.filter(
     ╰────
  help: Consider using `Object.assign()` or `Array.prototype.push()` to mutate the accumulator instead.
  note: Using spreads within accumulators leads to `O(n^2)` time complexity.

  ⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops
     ╭─[packages/shared/src/serverSettings.ts:466:3]
 464 β”‚     null;
 465 β”‚   let nextModelPreferences = initialModelPreferences;
     Β·       ──────────┬─────────
     Β·                 ╰── From this accumulator
 466 β”‚   for (const change of setModelsHidden ?? []) {
     Β·   ─┬─
     Β·    ╰── For this loop
 467 β”‚     const preferences = nextModelPreferences?.[change.provider] ?? {
 468 β”‚       hiddenModels: [],
 469 β”‚       modelOrder: [],
 470 β”‚     };
 471 β”‚     const hiddenModels = preferences.hiddenModels.filter((model) => model !== change.model);
 472 β”‚     if (change.hidden) hiddenModels.push(change.model);
 473 β”‚     nextModelPreferences = {
 474 β”‚       ...nextModelPreferences,
     Β·       ───────────┬───────────
     Β·                  ╰── From this spread
 475 β”‚       [change.provider]: { ...preferences, hiddenModels },
     ╰────
  help: Consider using `Object.assign()` to mutate the accumulator instead.
  note: Using spreads within accumulators leads to `O(n^2)` time complexity.

  ⚠ eslint(no-control-regex): Unexpected control character
     ╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46]
 219 β”‚               <Text selectable className="font-mono text-sm text-foreground">
 220 β”‚                 {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")}
     Β·                                              ──┬─
     Β·                                                ╰── 'U+001B' is a control character.
 221 β”‚               </Text>
     ╰────
  help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression.

  ⚠ react(capitalized-calls): Capitalized function called without JSX
     ╭─[apps/mobile/src/features/threads/ThreadQueueControl.tsx:602:27]
 601 β”‚   const onEnd = useEffectEvent((y: number, success: boolean) => props.onEnd(y, success));
 602 β”‚   const gesture = Gesture.Pan()
     Β·                           ─┬─
     Β·                            ╰── `Pan` may be a component
 603 β”‚     .enabled(!props.disabled)
     ╰────
  help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
  note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10]
 117 β”‚
 118 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 119 β”‚     void refreshNotifications();
     Β·          ──────────┬─────────
     Β·                    ╰── Avoid calling setState() directly within an effect
 120 β”‚     const subscription = AppState.addEventListener("change", (state) => {
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7]
 125 β”‚
 126 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 127 β”‚     if (!isLoaded) {
 128 β”‚       setLiveActivityStatus("checking");
     Β·       ──────────┬──────────
     Β·                 ╰── Avoid calling setState() directly within an effect
 129 β”‚       return;
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    ╭─[apps/mobile/src/features/threads/thread-inspector-content-stack.tsx:60:5]
 58 β”‚
 59 β”‚   useEffect(() => {
    Β·   ────┬────
    Β·       ╰── This is the containing effect
 60 β”‚     setMountedModes((current) => {
    Β·     ───────┬───────
    Β·            ╰── Avoid calling setState() directly within an effect
 61 β”‚       if (current.has(props.mode)) {
    ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used.
      ╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10]
 1619 β”‚
 1620 β”‚ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean {
      Β·          ──────────────────┬──────────────────
      Β·                            ╰── 'promptResponseHasMissingXAiStopReason' is declared here
 1621 β”‚   const meta = response._meta;
      ╰────
  help: Consider removing this declaration.

  ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
      ╭─[packages/provider-opencode/src/server/adapter.ts:3755:7]
 3754 β”‚
 3755 β”‚ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, OpenCodeAdapterV2DriverEnv> =
      Β·       ──┬──
      Β·         ╰── 'layer' is declared here
 3756 β”‚   Layer.effect(
      ╰────
  help: Consider removing this declaration.

  ⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'.
     ╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7]
 217 β”‚
 218 β”‚ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect<void> =>
     Β·       ──────────┬──────────
     Β·                 ╰── 'revokeActiveMcpThread' is declared here
 219 β”‚   activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void;
     ╰────
  help: Consider removing this declaration.

  ⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'.
     ╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7]
 220 β”‚
 221 β”‚ const revokeAllActiveMcpCredentials = (): Effect.Effect<void> =>
     Β·       ──────────────┬──────────────
     Β·                     ╰── 'revokeAllActiveMcpCredentials' is declared here
 222 β”‚   activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void;
     ╰────
  help: Consider removing this declaration.

  ⚠ react(immutability): This value cannot be modified
     ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:111:5]
 107 β”‚   );
 108 β”‚   const separationProgress = useSharedValue(props.showScrollToEnd ? 1 : 0);
     Β·         ─────────┬────────
     Β·                  ╰── `separationProgress` originates here
 109 β”‚
 110 β”‚   useEffect(() => {
 111 β”‚     separationProgress.value = withTiming(props.showScrollToEnd ? 1 : 0, CONTROL_TIMING);
     Β·     ─────────┬────────
     Β·              ╰── `separationProgress` cannot be modified
 112 β”‚   }, [props.showScrollToEnd, separationProgress]);
     ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): This value cannot be modified
     ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
 128 β”‚   // and repeatedly retargets the animation as it grows.
 129 β”‚   const capsuleWidth = useSharedValue<number | null>(null);
     Β·         ──────┬─────
     Β·               ╰── `capsuleWidth` originates here
 130 β”‚   const measuredWidthRef = useRef<number | null>(null);
 131 β”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
 132 β”‚     const width = event.nativeEvent.layout.width;
 133 β”‚     if (width === measuredWidthRef.current) {
 134 β”‚       return;
 135 β”‚     }
 136 β”‚     const first = measuredWidthRef.current === null;
 137 β”‚     measuredWidthRef.current = width;
 138 β”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
     Β·     ──────┬─────
     Β·           ╰── `capsuleWidth` cannot be modified
 139 β”‚   };
     ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): This value cannot be modified
     ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
 128 β”‚   // and repeatedly retargets the animation as it grows.
 129 β”‚   const capsuleWidth = useSharedValue<number | null>(null);
     Β·         ──────┬─────
     Β·               ╰── `capsuleWidth` originates here
 130 β”‚   const measuredWidthRef = useRef<number | null>(null);
 131 β”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
 132 β”‚     const width = event.nativeEvent.layout.width;
 133 β”‚     if (width === measuredWidthRef.current) {
 134 β”‚       return;
 135 β”‚     }
 136 β”‚     const first = measuredWidthRef.current === null;
 137 β”‚     measuredWidthRef.current = width;
 138 β”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
 139 β”‚   };
 140 β”‚   const hasStatus = props.status !== null;
 141 β”‚   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
 142 β”‚   useEffect(() => {
 143 β”‚     if (!hasStatus) {
 144 β”‚       measuredWidthRef.current = null;
 145 β”‚       capsuleWidth.value = null;
     Β·       ──────┬─────
     Β·             ╰── `capsuleWidth` cannot be modified
 146 β”‚     }
     ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): Cannot modify local variables after render completes
     ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:145:7]
 141 β”‚   const hasCapsule = hasStatus || hasQueue || hasAgents || hasPreview;
 142 β”‚   useEffect(() => {
     Β·             ───┬───
     Β·                ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
 143 β”‚     if (!hasStatus) {
 144 β”‚       measuredWidthRef.current = null;
 145 β”‚       capsuleWidth.value = null;
     Β·       ──────┬─────
     Β·             ╰── This modifies `capsuleWidth`
 146 β”‚     }
     ╰────
  help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): Cannot modify local variables after render completes
     ╭─[apps/mobile/src/features/threads/floating-working-control.tsx:138:5]
 130 β”‚   const measuredWidthRef = useRef<number | null>(null);
 131 β”‚   const handleLabelLayout = (event: LayoutChangeEvent) => {
     Β·                             ───────────────┬───────────────
     Β·                                            ╰── This function may (indirectly) reassign or modify `capsuleWidth` after render
 132 β”‚     const width = event.nativeEvent.layout.width;
 133 β”‚     if (width === measuredWidthRef.current) {
 134 β”‚       return;
 135 β”‚     }
 136 β”‚     const first = measuredWidthRef.current === null;
 137 β”‚     measuredWidthRef.current = width;
 138 β”‚     capsuleWidth.value = first ? width : withTiming(width, CONTROL_TIMING);
     Β·     ──────┬─────
     Β·           ╰── This modifies `capsuleWidth`
 139 β”‚   };
     ╰────
  help: This argument is a function which may reassign or mutate `capsuleWidth` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
     ╭─[scripts/lib/cli-external-packages.test.ts:114:11]
 113 β”‚         const declared = {
 114 β”‚           ...(manifest.dependencies ?? {}),
     Β·           ────────────────────────────────
 115 β”‚           ...(manifest.optionalDependencies ?? {}),
     ╰────
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
     ╭─[scripts/lib/cli-external-packages.test.ts:115:11]
 114 β”‚           ...(manifest.dependencies ?? {}),
 115 β”‚           ...(manifest.optionalDependencies ?? {}),
     Β·           ────────────────────────────────────────
 116 β”‚           ...(manifest.peerDependencies ?? {}),
     ╰────
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  ⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
     ╭─[scripts/lib/cli-external-packages.test.ts:116:11]
 115 β”‚           ...(manifest.optionalDependencies ?? {}),
 116 β”‚           ...(manifest.peerDependencies ?? {}),
     Β·           ────────────────────────────────────
 117 β”‚         };
     ╰────
  help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.

  ⚠ react(refs): Cannot access refs during render
    ╭─[apps/mobile/src/features/voice-input/useVoiceInputController.ts:27:14]
 26 β”‚   const latestInput = useRef(input);
 27 β”‚   latestInput.current = input;
    Β·   ─────┬─────────┬───
    Β·        β”‚         ╰── Cannot update ref value during render
    Β·        ╰── This value is a ref
 28 β”‚   const mounted = useRef(true);
    ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:122:38]
 121 β”‚   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
 122 β”‚   const audioLevels = useSharedValue(audioLevelsRef.current);
     Β·                                      ───────────┬──────────
     Β·                                                 ╰── Cannot access ref value during render
 123 β”‚   const sessionRef = useRef<VoiceInputSession | null>(null);
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:8]
 125 β”‚
 126 β”‚   if (!sessionRef.current || !recorderRef.current) {
     Β·        ─────────┬────────
     Β·                 ╰── Cannot access ref value during render
 127 β”‚     const recorder = createLazyVoiceRecorder({
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:7]
 125 β”‚
 126 β”‚   if (!sessionRef.current || !recorderRef.current) {
     Β·       ─────────┬─────────
     Β·                ╰── Cannot access ref value during render
 127 β”‚     const recorder = createLazyVoiceRecorder({
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:31]
 125 β”‚
 126 β”‚   if (!sessionRef.current || !recorderRef.current) {
     Β·                               ─────────┬─────────
     Β·                                        ╰── Cannot access ref value during render
 127 β”‚     const recorder = createLazyVoiceRecorder({
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:126:30]
 125 β”‚
 126 β”‚   if (!sessionRef.current || !recorderRef.current) {
     Β·                              ──────────┬─────────
     Β·                                        ╰── Cannot access ref value during render
 127 β”‚     const recorder = createLazyVoiceRecorder({
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:127:46]
 126 β”‚       if (!sessionRef.current || !recorderRef.current) {
 127 β”‚ ╭─▢     const recorder = createLazyVoiceRecorder({
 128 β”‚ β”‚         create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
 129 β”‚ β”‚         onStatus: (status: RecordingStatus) => {
 130 β”‚ β”‚           sessionRef.current?.controller.handleRecorderStatus({
 131 β”‚ β”‚             isFinished: status.isFinished,
 132 β”‚ β”‚             hasError: status.hasError || status.mediaServicesDidReset === true,
 133 β”‚ β”‚             error: status.error,
 134 β”‚ β”‚             url: status.url,
 135 β”‚ β”‚           });
 136 β”‚ β”‚         },
 137 β”‚ β”‚         // Read when recording starts so preference changes do not re-render every composer.
 138 β”‚ β”‚         selectInput: (inputs) => {
 139 β”‚ β”‚           const preferences = registry.get(mobilePreferencesAtom);
 140 β”‚ β”‚           if (!AsyncResult.isSuccess(preferences)) return null;
 141 β”‚ β”‚           const known = microphoneOrder(preferences.value.microphones);
 142 β”‚ β”‚           const order = rememberMicrophones(known, inputs);
 143 β”‚ β”‚           if (order !== known) {
 144 β”‚ β”‚             registry.set(updateMobilePreferencesAtom, {
 145 β”‚ β”‚               transform: (current) => ({
 146 β”‚ β”‚                 microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
 147 β”‚ β”‚               }),
 148 β”‚ β”‚             });
 149 β”‚ β”‚           }
 150 β”‚ β”‚           return preferredMicrophoneInput(inputs, order);
 151 β”‚ β”‚         },
 152 β”‚ β”œβ”€β–Ά     });
     Β· ╰──── Passing a ref to a function may read its value during render
 153 β”‚         recorderRef.current = recorder;
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:153:16]
 152 β”‚     });
 153 β”‚     recorderRef.current = recorder;
     Β·     ─────┬─────────┬───
     Β·          β”‚         ╰── Cannot update ref value during render
     Β·          ╰── This value is a ref
 154 β”‚     sessionRef.current = new VoiceInputSession({
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:48]
 153 β”‚         recorderRef.current = recorder;
 154 β”‚ ╭─▢     sessionRef.current = new VoiceInputSession({
 155 β”‚ β”‚         recorder,
 156 β”‚ β”‚         getTranscriber: getLocalVoiceTranscriber,
 157 β”‚ β”‚         requestPermission: async () => {
 158 β”‚ β”‚           const permission = await requestRecordingPermissionsAsync();
 159 β”‚ β”‚           return { granted: permission.granted, canAskAgain: permission.canAskAgain };
 160 β”‚ β”‚         },
 161 β”‚ β”‚         configureRecording: configureVoiceRecordingAudio,
 162 β”‚ β”‚         releaseRecording: releaseVoiceRecordingAudio,
 163 β”‚ β”‚         deleteRecording: (uri) => new File(uri).delete(),
 164 β”‚ β”‚         onStateChange: (nextState) =>
 165 β”‚ β”‚           setState({
 166 β”‚ β”‚             state: nextState,
 167 β”‚ β”‚             ownerKey: sessionRef.current?.ownerKey ?? null,
 168 β”‚ β”‚             label: sessionRef.current?.label ?? null,
 169 β”‚ β”‚           }),
 170 β”‚ β”œβ”€β–Ά     });
     Β· ╰──── Cannot access ref value during render
 171 β”‚       }
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:154:15]
 153 β”‚     recorderRef.current = recorder;
 154 β”‚     sessionRef.current = new VoiceInputSession({
     Β·     ─────┬────────┬───
     Β·          β”‚        ╰── Cannot update ref value during render
     Β·          ╰── This value is a ref
 155 β”‚       recorder,
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:7]
 184 β”‚     return () => subscription.remove();
 185 β”‚   }, [controller]);
     Β·       ─────┬────
     Β·            ╰── Cannot access ref value during render
 186 β”‚
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:185:6]
 184 β”‚     return () => subscription.remove();
 185 β”‚   }, [controller]);
     Β·      ──────┬─────
     Β·            ╰── Cannot access ref value during render
 186 β”‚
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:6]
 191 β”‚     },
 192 β”‚     [controller, recorder],
     Β·      ─────┬────
     Β·           ╰── Cannot access ref value during render
 193 β”‚   );
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:175:20]
 174 β”‚   const controller = session.controller;
 175 β”‚   const recorder = recorderRef.current;
     Β·                    ─────────┬─────────
     Β·                             ╰── Cannot access ref value during render
 176 β”‚
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:192:5]
 191 β”‚     },
 192 β”‚     [controller, recorder],
     Β·     ───────────┬──────────
     Β·                ╰── Cannot access ref value during render
 193 β”‚   );
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:20]
 245 β”‚     return () => clearInterval(intervalId);
 246 β”‚   }, [audioLevels, controller, recorder, state.phase]);
     Β·                    ─────┬────
     Β·                         ╰── Cannot access ref value during render
 247 β”‚
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:246:6]
 245 β”‚     return () => clearInterval(intervalId);
 246 β”‚   }, [audioLevels, controller, recorder, state.phase]);
     Β·      ────────────────────────┬───────────────────────
     Β·                              ╰── Cannot access ref value during render
 247 β”‚
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:261:5]
 260 β”‚     setOwnerFocused,
 261 β”‚     session,
     Β·     ───┬───
     Β·        ╰── Cannot access ref value during render
 262 β”‚     stop,
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:251:10]
 250 β”‚
 251 β”‚ ╭─▢   return {
 252 β”‚ β”‚       isAvailable: getLocalVoiceTranscriber() !== null || getNativeShowcaseScene() !== null,
 253 β”‚ β”‚       state,
 254 β”‚ β”‚       audioLevels,
 255 β”‚ β”‚       elapsedSeconds,
 256 β”‚ β”‚       isBusy: voiceInputBlocksSubmission(state),
 257 β”‚ β”‚       ownerKey,
 258 β”‚ β”‚       label,
 259 β”‚ β”‚       focusedOwners,
 260 β”‚ β”‚       setOwnerFocused,
 261 β”‚ β”‚       session,
 262 β”‚ β”‚       stop,
 263 β”‚ β”‚       cancel,
 264 β”‚ β”œβ”€β–Ά   };
     Β· ╰──── Cannot access ref value during render
 265 β”‚     }
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(immutability): This value cannot be modified
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
 121 β”‚   const audioLevelsRef = useRef(Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0));
 122 β”‚   const audioLevels = useSharedValue(audioLevelsRef.current);
     Β·         ─────┬─────
     Β·              ╰── `audioLevels` originates here
 123 β”‚   const sessionRef = useRef<VoiceInputSession | null>(null);
 124 β”‚   const recorderRef = useRef<LazyVoiceRecorder<RecorderState> | null>(null);
 125 β”‚
 126 β”‚   if (!sessionRef.current || !recorderRef.current) {
 127 β”‚     const recorder = createLazyVoiceRecorder({
 128 β”‚       create: () => new AudioModule.AudioRecorder(VOICE_RECORDING_OPTIONS),
 129 β”‚       onStatus: (status: RecordingStatus) => {
 130 β”‚         sessionRef.current?.controller.handleRecorderStatus({
 131 β”‚           isFinished: status.isFinished,
 132 β”‚           hasError: status.hasError || status.mediaServicesDidReset === true,
 133 β”‚           error: status.error,
 134 β”‚           url: status.url,
 135 β”‚         });
 136 β”‚       },
 137 β”‚       // Read when recording starts so preference changes do not re-render every composer.
 138 β”‚       selectInput: (inputs) => {
 139 β”‚         const preferences = registry.get(mobilePreferencesAtom);
 140 β”‚         if (!AsyncResult.isSuccess(preferences)) return null;
 141 β”‚         const known = microphoneOrder(preferences.value.microphones);
 142 β”‚         const order = rememberMicrophones(known, inputs);
 143 β”‚         if (order !== known) {
 144 β”‚           registry.set(updateMobilePreferencesAtom, {
 145 β”‚             transform: (current) => ({
 146 β”‚               microphones: rememberMicrophones(microphoneOrder(current.microphones), inputs),
 147 β”‚             }),
 148 β”‚           });
 149 β”‚         }
 150 β”‚         return preferredMicrophoneInput(inputs, order);
 151 β”‚       },
 152 β”‚     });
 153 β”‚     recorderRef.current = recorder;
 154 β”‚     sessionRef.current = new VoiceInputSession({
 155 β”‚       recorder,
 156 β”‚       getTranscriber: getLocalVoiceTranscriber,
 157 β”‚       requestPermission: async () => {
 158 β”‚         const permission = await requestRecordingPermissionsAsync();
 159 β”‚         return { granted: permission.granted, canAskAgain: permission.canAskAgain };
 160 β”‚       },
 161 β”‚       configureRecording: configureVoiceRecordingAudio,
 162 β”‚       releaseRecording: releaseVoiceRecordingAudio,
 163 β”‚       deleteRecording: (uri) => new File(uri).delete(),
 164 β”‚       onStateChange: (nextState) =>
 165 β”‚         setState({
 166 β”‚           state: nextState,
 167 β”‚           ownerKey: sessionRef.current?.ownerKey ?? null,
 168 β”‚           label: sessionRef.current?.label ?? null,
 169 β”‚         }),
 170 β”‚     });
 171 β”‚   }
 172 β”‚
 173 β”‚   const session = sessionRef.current;
 174 β”‚   const controller = session.controller;
 175 β”‚   const recorder = recorderRef.current;
 176 β”‚
 177 β”‚   useEffect(() => {
 178 β”‚     const subscription = AppState.addEventListener("change", (nextState) => {
 179 β”‚       // iOS reports `inactive` while its permission dialog is open. Only the
 180 β”‚       // real background state cancels preparation; recorder status handles
 181 β”‚       // calls and route interruptions during capture.
 182 β”‚       if (nextState === "background") controller.appMovedToBackground();
 183 β”‚     });
 184 β”‚     return () => subscription.remove();
 185 β”‚   }, [controller]);
 186 β”‚
 187 β”‚   useEffect(
 188 β”‚     () => () => {
 189 β”‚       controller.dispose();
 190 β”‚       recorder.release();
 191 β”‚     },
 192 β”‚     [controller, recorder],
 193 β”‚   );
 194 β”‚
 195 β”‚   useEffect(() => {
 196 β”‚     if (state.phase !== "recording") return;
 197 β”‚
 198 β”‚     const tag = `voice-input:${keepAwakeId}:${++keepAwakeSessionRef.current}`;
 199 β”‚     const activation = activateKeepAwakeAsync(tag);
 200 β”‚     void activation.catch(() => {});
 201 β”‚     return () => {
 202 β”‚       // Release after activation settles, even if the recording ends immediately.
 203 β”‚       void activation.then(() => deactivateKeepAwake(tag)).catch(() => {});
 204 β”‚     };
 205 β”‚   }, [keepAwakeId, state.phase]);
 206 β”‚
 207 β”‚   useEffect(() => {
 208 β”‚     if (state.phase !== "preparing" && state.phase !== "recording") return;
 209 β”‚
 210 β”‚     if (audioLevelsRef.current.some((level) => level !== 0)) {
 211 β”‚       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
 212 β”‚       audioLevels.value = audioLevelsRef.current;
     Β·       ─────┬─────
     Β·            ╰── `audioLevels` cannot be modified
 213 β”‚     }
     ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): Cannot modify local variables after render completes
     ╭─[apps/mobile/src/features/voice-input/VoiceInputProvider.tsx:212:7]
 206 β”‚
 207 β”‚   useEffect(() => {
     Β·             ───┬───
     Β·                ╰── This function may (indirectly) reassign or modify `audioLevels` after render
 208 β”‚     if (state.phase !== "preparing" && state.phase !== "recording") return;
 209 β”‚
 210 β”‚     if (audioLevelsRef.current.some((level) => level !== 0)) {
 211 β”‚       audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
 212 β”‚       audioLevels.value = audioLevelsRef.current;
     Β·       ─────┬─────
     Β·            ╰── This modifies `audioLevels`
 213 β”‚     }
     ╰────
  help: This argument is a function which may reassign or mutate `audioLevels` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): This value cannot be modified
    ╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
 65 β”‚   const [expanded, setExpanded] = useState(false);
 66 β”‚   const progress = useSharedValue(0);
    Β·         ────┬───
    Β·             ╰── `progress` originates here
 67 β”‚   useEffect(() => {
 68 β”‚     progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
    Β·     ────┬───
    Β·         ╰── `progress` cannot be modified
 69 β”‚   }, [expanded, progress]);
    ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ eslint(no-new): Do not use 'new' for side effects.
     ╭─[apps/server/src/mcp/McpToolAccess.test.ts:168:3]
 167 β”‚   // @ts-expect-error a declaration constructed directly
 168 β”‚   new McpToolAccess.Declaration(unchecked);
     Β·   ─────────────────────────────
 169 β”‚   // @ts-expect-error a handlers layer built outside McpToolAccess
     ╰────
  help: Assign the result of 'new' to a variable or compare it to a reference.

  ⚠ react(immutability): This value cannot be modified
    ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:93:5]
 90 β”‚ }) {
 91 β”‚   const rotation = useSharedValue(props.hidden ? 1 : 0);
    Β·         ────┬───
    Β·             ╰── `rotation` originates here
 92 β”‚   useLayoutEffect(() => {
 93 β”‚     rotation.value = withTiming(props.hidden ? 1 : 0, TOOLBAR_FLIP_TIMING);
    Β·     ────┬───
    Β·         ╰── `rotation` cannot be modified
 94 β”‚   }, [props.hidden, rotation]);
    ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): This value cannot be modified
     ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:269:5]
 266 β”‚   const variant = props.variant ?? "plain";
 267 β”‚   const loadingVisibility = useSharedValue(props.loading ? 1 : 0);
     Β·         ────────┬────────
     Β·                 ╰── `loadingVisibility` originates here
 268 β”‚   useLayoutEffect(() => {
 269 β”‚     loadingVisibility.value = withTiming(props.loading ? 1 : 0, DICTATION_TIMING);
     Β·     ────────┬────────
     Β·             ╰── `loadingVisibility` cannot be modified
 270 β”‚   }, [loadingVisibility, props.loading]);
     ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): This value cannot be modified
     ╭─[apps/mobile/src/features/voice-input/ComposerDictationControl.tsx:328:5]
 325 β”‚ }) {
 326 β”‚   const recordingVisibility = useSharedValue(props.phase === "recording" ? 1 : 0);
     Β·         ─────────┬─────────
     Β·                  ╰── `recordingVisibility` originates here
 327 β”‚   useLayoutEffect(() => {
 328 β”‚     recordingVisibility.value = withTiming(props.phase === "recording" ? 1 : 0, DICTATION_TIMING);
     Β·     ─────────┬─────────
     Β·              ╰── `recordingVisibility` cannot be modified
 329 β”‚   }, [props.phase, recordingVisibility]);
     ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/diffs/nativeReviewDiffSurface.ts:277:39]
 276 β”‚
 277 β”‚ ╭─▢   return createElement(RawNativeView, {
 278 β”‚ β”‚       ...nativeProps,
 279 β”‚ β”‚       refreshEnabled: props.onPullToRefresh !== undefined,
 280 β”‚ β”‚       ref: nativeRef,
 281 β”‚ β”œβ”€β–Ά   });
     Β· ╰──── Passing a ref to a function may read its value during render
 282 β”‚     }
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
     ╭─[packages/provider-grok/src/server/adapter.ts:408:7]
 407 β”‚
 408 β”‚ const layer: Layer.Layer<
     Β·       ──┬──
     Β·         ╰── 'layer' is declared here
 409 β”‚   ProviderAdapter.ProviderAdapterV2,
     ╰────
  help: Consider removing this declaration.

  ⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used.
    ╭─[apps/server/src/auth/http.ts:28:10]
 27 β”‚ import * as Schema from "effect/Schema";
 28 β”‚ import { identity } from "effect/Function";
    Β·          ────┬───
    Β·              ╰── 'identity' is imported here
 29 β”‚ import * as Layer from "effect/Layer";
    ╰────
  help: Consider removing this import.

  ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
     ╭─[apps/server/src/auth/RpcAuthorization.ts:236:17]
 235 β”‚ const requiredScopesForSettingsUpdate = (payload: unknown) => {
 236 β”‚   const input = Schema.decodeUnknownSync(SettingsUpdate)(payload);
     Β·                 ────────────────────────
 237 β”‚   const scopes = requiredScopesForServerSettingsPatch(input.patch);
     ╰────

  ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
     ╭─[apps/server/src/auth/RpcAuthorization.ts:255:26]
 254 β”‚   if (method === WS_METHODS.assetsCreateUrl) {
 255 β”‚     const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload);
     Β·                          ────────────────────────
 256 β”‚     return [
     ╰────

  ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
     ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:387:19]
 386 β”‚   onFilters,
 387 β”‚   authorOptions = [],
     Β·                   ──
 388 β”‚   labelOptions = [],
     ╰────
  help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.

  ⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
     ╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:388:18]
 387 β”‚   authorOptions = [],
 388 β”‚   labelOptions = [],
     Β·                  ──
 389 β”‚   host,
     ╰────
  help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.

  ⚠ react(memo-dependencies): Found extra memoization dependencies
     ╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34]
 115 β”‚     return [...commands];
 116 β”‚   }, [activeThreadRef, pathname, registrationVersion, navigation]);
     Β·                                  ─────────┬─────────
     Β·                                           ╰── Unnecessary dependency `registrationVersion`
 117 β”‚
     ╰────
  help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
     ╭─[apps/server/src/orchestration-v2/ThreadPullRequestService.ts:413:7]
 412 β”‚
 413 β”‚ const layer = Layer.effect(ThreadPullRequestServiceV2, make);
     Β·       ──┬──
     Β·         ╰── 'layer' is declared here
     ╰────
  help: Consider removing this declaration.

  ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
     ╭─[packages/effect-acp/src/protocol.test.ts:500:31]
 499 β”‚
 500 β”‚       const response = yield* Schema.decodeUnknownEffect(
     Β·                               ──────────────────────────
 501 β”‚         Schema.fromJsonString(JsonRpcErrorResponse),
     ╰────

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
 638 β”‚
 639 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 640 β”‚     if (pendingLaunchEntry.key === launchTargetKey) {
 641 β”‚       return;
 642 β”‚     }
 643 β”‚     setPendingLaunchEntry({
     Β·     ──────────┬──────────
     Β·               ╰── Avoid calling setState() directly within an effect
 644 β”‚       key: launchTargetKey,
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5]
 648 β”‚
 649 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 650 β”‚     if (initialAttachGridEntry.key === launchTargetKey) {
 651 β”‚       return;
 652 β”‚     }
 653 β”‚     setInitialAttachGridEntry({
     Β·     ────────────┬────────────
     Β·                 ╰── Avoid calling setState() directly within an effect
 654 β”‚       key: launchTargetKey,
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7]
 743 β”‚
 744 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 745 β”‚     if (!routeEnvironmentId || !routeThreadId) {
 746 β”‚       setLastGridSize({
     Β·       ───────┬───────
     Β·              ╰── Avoid calling setState() directly within an effect
 747 β”‚         cols: DEFAULT_TERMINAL_COLS,
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
     ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24]
 537 β”‚     });
 538 β”‚   }, [terminal.buffer, terminal.buffer.length, terminalKey]);
     Β·                        ───────────┬──────────
     Β·                                   ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
 539 β”‚   const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
     ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
     ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7]
 708 β”‚     sentInitialInputKeyRef.current = null;
 709 β”‚   }, [terminalKey]);
     Β·       ─────┬─────
     Β·            ╰── Unnecessary dependency `terminalKey`
 710 β”‚
     ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
     ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52]
 799 β”‚     };
 800 β”‚   }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
     Β·                                                    ────────────┬────────────  ─────┬─────
     Β·                                                                β”‚                   ╰── Unnecessary dependency `terminalKey`
     Β·                                                                ╰── Unnecessary dependency `terminal.lifecycleVersion`
 801 β”‚
     ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
 792 β”‚   }
 793 β”‚   const pasteSession = pasteSessionRef.current;
     Β·                        ───────────┬───────────
     Β·                                   ╰── Cannot access ref value during render
 794 β”‚
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
      ╭─[packages/effect-acp/src/client.ts:1269:11]
 1268 β”‚         extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
 1269 β”‚           Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
      Β·           ──────────────────────────
 1270 β”‚             Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
      ╰────

  ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    ╭─[packages/effect-acp/src/schema.test.ts:18:12]
 17 β”‚     const command = { name: "plan", description: "Make a plan", input: { hint: "Task" } };
 18 β”‚     expect(Schema.is(V1.AvailableCommand)(command)).toBe(true);
    Β·            ─────────
 19 β”‚     expect(
    ╰────

  ⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
    ╭─[packages/effect-acp/src/schema.test.ts:20:7]
 19 β”‚     expect(
 20 β”‚       Schema.is(V2.AvailableCommand)({ ...command, input: { type: "text", hint: "Task" } }),
    Β·       ─────────
 21 β”‚     ).toBe(true);
    ╰────

  ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
     ╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:814:17]
 813 β”‚               <div
 814 β”‚                 key={`${index}:${check.name}:${check.url ?? ""}`}
     Β·                 ─────────────────────────────────────────────────
 815 β”‚                 className="group flex items-center gap-2 rounded-md pr-1 hover:bg-accent/60"
     ╰────
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
     ╭─[packages/effect-acp/src/errors.test.ts:129:28]
 128 β”‚       const secret = "acp-summary-secret";
 129 β”‚       const cause = yield* Schema.decodeUnknownEffect(
     Β·                            ──────────────────────────
 130 β”‚         Schema.Struct({
     ╰────

  ⚠ react(static-components): Cannot create components during render
     ╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
 196 β”‚   const { onInput, onResize } = props;
 197 β”‚   const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
     Β·                                     ────────────────┬───────────────
     Β·                                                     ╰── The component is created during render here
 198 β”‚   const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
 199 β”‚
 200 β”‚   useEffect(() => {
 201 β”‚     terminalDebugLog("native:surface", {
 202 β”‚       terminalKey: props.terminalKey,
 203 β”‚       native: hasNativeSurface,
 204 β”‚       hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
 205 β”‚       bufferLen: props.buffer.length,
 206 β”‚       isRunning: props.isRunning,
 207 β”‚     });
 208 β”‚   }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
 209 β”‚   const handleNativeInput = useCallback(
 210 β”‚     (event: NativeSyntheticEvent<TerminalInputEvent>) => {
 211 β”‚       if (!props.isRunning || props.readOnly) {
 212 β”‚         return;
 213 β”‚       }
 214 β”‚       terminalDebugLog("native:onInput", {
 215 β”‚         codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
 216 β”‚       });
 217 β”‚       onInput(event.nativeEvent.data);
 218 β”‚     },
 219 β”‚     [onInput, props.isRunning, props.readOnly],
 220 β”‚   );
 221 β”‚   const handleNativeResize = useCallback(
 222 β”‚     (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
 223 β”‚       onResize({
 224 β”‚         cols: event.nativeEvent.cols,
 225 β”‚         rows: event.nativeEvent.rows,
 226 β”‚       });
 227 β”‚     },
 228 β”‚     [onResize],
 229 β”‚   );
 230 β”‚
 231 β”‚   if (NativeTerminalSurfaceView) {
 232 β”‚     return (
 233 β”‚       <View style={props.style}>
 234 β”‚         <NativeTerminalSurfaceView
     Β·          ────────────┬────────────
     Β·                      ╰── This component is created during render
 235 β”‚           appearanceScheme={themeAppearance}
     ╰────
  help: Components created during render will reset their state each time they are created. Declare components outside of render
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5]
 112 β”‚   const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate }));
 113 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 114 β”‚     if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) {
 115 β”‚       return;
 116 β”‚     }
 117 β”‚     setEntry({ key: input.targetKey, location: candidate });
     Β·     ────┬───
     Β·         ╰── Avoid calling setState() directly within an effect
 118 β”‚   }, [candidate, entry.key, entry.location, input.targetKey]);
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
    ╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15]
 71 β”‚             <Pressable
 72 β”‚               key={index}
    Β·               ───────────
 73 β”‚               accessibilityRole="button"
    ╰────
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    ╭─[apps/mobile/src/features/threads/use-worktree-setup.ts:30:40]
 28 β”‚   const snapshot = resolveWorktreeSetupSnapshot(input.threadId, query.data, live);
 29 β”‚   useEffect(() => {
    Β·   ────┬────
    Β·       ╰── This is the containing effect
 30 β”‚     if (snapshot && snapshot !== live) setHeld({ key, snapshot });
    Β·                                        ───┬───
    Β·                                           ╰── Avoid calling setState() directly within an effect
 31 β”‚   }, [key, live, snapshot]);
    ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'.
     ╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7]
 913 β”‚
 914 β”‚ const layerDaemon: Layer.Layer<never, never, OrchestrationEffectWorkerV2> = Layer.effectDiscard(
     Β·       ─────┬─────
     Β·            ╰── 'layerDaemon' is declared here
 915 β”‚   runDaemon.pipe(Effect.forkScoped),
     ╰────
  help: Consider removing this declaration.

  ⚠ react(immutability): This value cannot be modified
    ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5]
 35 β”‚
 36 β”‚   const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0);
    Β·         ────────┬────────
    Β·                 ╰── `inspectorProgress` originates here
 37 β”‚   const { renderedInspectorWidth } = props;
 38 β”‚   const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
 39 β”‚
 40 β”‚   const onClosed = props.onClosed;
 41 β”‚   useEffect(() => {
 42 β”‚     inspectorProgress.value = withTiming(
    Β·     ────────┬────────
    Β·             ╰── `inspectorProgress` cannot be modified
 43 β”‚       inspectorVisible ? 1 : 0,
    ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(immutability): This value cannot be modified
    ╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7]
 37 β”‚   const { renderedInspectorWidth } = props;
 38 β”‚   const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
    Β·         ──────────┬─────────
    Β·                   ╰── `renderedContentWidth` originates here
 39 β”‚
 40 β”‚   const onClosed = props.onClosed;
 41 β”‚   useEffect(() => {
 42 β”‚     inspectorProgress.value = withTiming(
 43 β”‚       inspectorVisible ? 1 : 0,
 44 β”‚       WORKSPACE_PANE_TIMING,
 45 β”‚       (finished) => {
 46 β”‚         if (finished === true && !inspectorVisible && onClosed !== undefined) {
 47 β”‚           runOnJS(onClosed)();
 48 β”‚         }
 49 β”‚       },
 50 β”‚     );
 51 β”‚     const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0;
 52 β”‚     renderedInspectorWidth.set(
 53 β”‚       resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING),
 54 β”‚     );
 55 β”‚   }, [
 56 β”‚     inspectorProgress,
 57 β”‚     inspectorVisible,
 58 β”‚     inspectorWidth,
 59 β”‚     onClosed,
 60 β”‚     renderedInspectorWidth,
 61 β”‚     resizing,
 62 β”‚   ]);
 63 β”‚
 64 β”‚   useEffect(() => {
 65 β”‚     const targetWidth = inspectorWidth ?? 0;
 66 β”‚     if (!inspectorVisible || resizing) {
 67 β”‚       renderedContentWidth.value = targetWidth;
    Β·       ──────────┬─────────
    Β·                 ╰── `renderedContentWidth` cannot be modified
 68 β”‚       return;
    ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
     ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:215:7]
 214 β”‚     }
 215 β”‚   }, [wrappedRender]);
     Β·       ──────┬──────
     Β·             ╰── Unnecessary dependency `wrappedRender`
 216 β”‚
     ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
     ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:817:35]
 816 β”‚       >
 817 β”‚         <AdaptiveWorkspaceContext value={contextValue}>
     Β·                                   ────────────────────
 818 β”‚           <NativeWorkspaceInspectorContext
     ╰────
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
     ╭─[apps/mobile/src/features/layout/AdaptiveWorkspaceLayout.tsx:832:42]
 831 β”‚     >
 832 β”‚       <AdaptiveWorkspaceContext.Provider value={contextValue}>
     Β·                                          ────────────────────
 833 β”‚         <WindowHingeContext value={windowHinge}>
     ╰────
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
 259 β”‚     .join("|");
 260 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 261 β”‚     stop();
     Β·     ──┬─
     Β·       ╰── Avoid calling setState() directly within an effect
 262 β”‚   }, [orderVersion]);
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:261:5]
 260 β”‚   useEffect(() => {
 261 β”‚     stop();
     Β·     ──┬─
     Β·       ╰── Missing dependency `stop`
 262 β”‚   }, [orderVersion]);
     Β·       ──────┬─────
     Β·             ╰── Unnecessary dependency `orderVersion`
 263 β”‚   useEffect(
     ╰────
  help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(refs): Cannot access refs during render
    ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:96:9]
 95 β”‚   const latest = useRef(props);
 96 β”‚   latest.current = props;
    Β·   ───┬──────┬───
    Β·      β”‚      ╰── Cannot update ref value during render
    Β·      ╰── This value is a ref
 97 β”‚   const gesture = useMemo(
    ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:104:18]
 103 β”‚         .runOnJS(true)
 104 β”‚         .onStart(() => latest.current.onStart())
     Β·                  ───────────────┬──────────────
     Β·                                 ╰── Passing a ref to a function may read its value during render
 105 β”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:105:19]
 104 β”‚         .onStart(() => latest.current.onStart())
 105 β”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
     Β·                   ──────────────────────────┬─────────────────────────
     Β·                                             ╰── Passing a ref to a function may read its value during render
 106 β”‚         .onEnd((event) => latest.current.onMove(event.translationY))
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:106:16]
 105 β”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
 106 β”‚         .onEnd((event) => latest.current.onMove(event.translationY))
     Β·                ──────────────────────────┬─────────────────────────
     Β·                                          ╰── Passing a ref to a function may read its value during render
 107 β”‚         .onFinalize((_, success) => latest.current.onEnd(!success)),
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:107:21]
 106 β”‚         .onEnd((event) => latest.current.onMove(event.translationY))
 107 β”‚         .onFinalize((_, success) => latest.current.onEnd(!success)),
     Β·                     ───────────────────────┬──────────────────────
     Β·                                            ╰── Passing a ref to a function may read its value during render
 108 β”‚     [props.disabled],
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:249:9]
 248 β”‚   const latest = useRef({ rows, planners, moveThread });
 249 β”‚   latest.current = { rows, planners, moveThread };
     Β·   ───┬──────┬───
     Β·      β”‚      ╰── Cannot update ref value during render
     Β·      ╰── This value is a ref
 250 β”‚
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(refs): Cannot access refs during render
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:247:22]
 246 β”‚   const [preview, setPreview] = useState<Drag | null>(null);
 247 β”‚   const translateY = useRef(new Animated.Value(0)).current;
     Β·                      ──────────────────┬──────────────────
     Β·                                        ╰── Cannot access ref value during render
 248 β”‚   const latest = useRef({ rows, planners, moveThread });
     ╰────
  help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs

  ⚠ react(purity): Cannot call impure function during render
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:324:16]
 323 β”‚     update(0);
 324 β”‚     let last = performance.now();
     Β·                ────────┬────────
     Β·                        ╰── Cannot call impure function
 325 β”‚     const tick = () => {
     ╰────
  help: `performance.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  ⚠ react(capitalized-calls): Capitalized function called without JSX
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:99:15]
  98 β”‚     () =>
  99 β”‚       Gesture.Pan()
     Β·               ─┬─
     Β·                ╰── `Pan` may be a component
 100 β”‚         .enabled(!props.disabled)
     ╰────
  help: Render `Pan` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
  note: `Pan` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components

  ⚠ react(memo-dependencies): Found missing memoization dependencies
     ╭─[apps/mobile/src/features/threads/ThreadArrangementSheet.tsx:108:5]
 103 β”‚         .runOnJS(true)
 104 β”‚         .onStart(() => latest.current.onStart())
     Β·                        ───┬──
     Β·                           ╰── 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
 105 β”‚         .onUpdate((event) => latest.current.onMove(event.translationY))
 106 β”‚         .onEnd((event) => latest.current.onMove(event.translationY))
 107 β”‚         .onFinalize((_, success) => latest.current.onEnd(!success)),
 108 β”‚     [props.disabled],
     Β·     ────────┬───────
     Β·             ╰── This dependency list is missing values used by the callback
 109 β”‚   );
     ╰────
  help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
     ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7]
 565 β”‚           let afterSequence = created[0]!.sequence;
 566 β”‚ ╭─▢       for (let index = 1; index <= 32; index += 1) {
 567 β”‚ β”‚           const nextEvent = {
 568 β”‚ β”‚             id: EventId.make(`event:foundation-stream-race:${index}`),
 569 β”‚ β”‚             type: "thread.metadata-updated" as const,
 570 β”‚ β”‚             threadId,
 571 β”‚ β”‚             providerInstanceId,
 572 β”‚ β”‚             occurredAt: now,
 573 β”‚ β”‚             payload: { ...thread, title: `Race update ${index}` },
 574 β”‚ β”‚           } satisfies OrchestrationV2DomainEvent;
 575 β”‚ β”‚           const reader = yield* eventSink
 576 β”‚ β”‚             .stream({ threadId, afterSequence })
 577 β”‚ β”‚             .pipe(Stream.runHead, Effect.forkChild);
 578 β”‚ β”‚           yield* Effect.yieldNow;
 579 β”‚ β”‚           const written = yield* eventSink.write({ events: [nextEvent] });
 580 β”‚ β”‚           const received = yield* Fiber.join(reader);
 581 β”‚ β”‚           if (Option.isNone(received)) {
 582 β”‚ β”‚             return yield* Effect.die("The event stream ended before delivering the live event.");
 583 β”‚ β”‚           }
 584 β”‚ β”‚           assert.equal(received.value.sequence, written[0]?.sequence);
 585 β”‚ β”‚           assert.equal(received.value.event.id, nextEvent.id);
 586 β”‚ β”‚           afterSequence = received.value.sequence;
 587 β”‚ ╰─▢       }
 588 β”‚         }),
     ╰────

  ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
      ╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9]
 2326 β”‚             let settled = false;
 2327 β”‚ ╭─▢         while (!settled) {
 2328 β”‚ β”‚             settled = (yield* outbox.listByCommandId(commandId)).every(
 2329 β”‚ β”‚               (effect) => effect.status === "succeeded",
 2330 β”‚ β”‚             );
 2331 β”‚ β”‚             if (!settled) yield* Effect.yieldNow;
 2332 β”‚ ╰─▢         }
 2333 β”‚           }).pipe(Effect.provide(layerWorker), Effect.scoped);
      ╰────

  ⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
    ╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
 60 β”‚ ) {
 61 β”‚   const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
    Β·         ──────┬──────
    Β·               ╰── 'useDragRegion' is declared here
 62 β”‚   const isInline = props.mode === "inline";
    ╰────
  help: Consider removing this declaration.

  ⚠ react(immutability): This value cannot be modified
    ╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7]
 53 β”‚ function usePulseAnimation(pulse: boolean) {
 54 β”‚   const pulseProgress = useSharedValue(0);
    Β·         ──────┬──────
    Β·               ╰── `pulseProgress` originates here
 55 β”‚
 56 β”‚   useEffect(() => {
 57 β”‚     if (pulse) {
 58 β”‚       pulseProgress.value = withRepeat(
    Β·       ──────┬──────
    Β·             ╰── `pulseProgress` cannot be modified
 59 β”‚         withTiming(1, {
    ╰────
  help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability

  ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
     ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50]
 289 β”‚   return (
 290 β”‚     <ExistingThreadSettingsRouteContext.Provider value={value}>
     Β·                                                  ─────────────
 291 β”‚       {props.children}
     ╰────
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
     ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44]
 653 β”‚   return (
 654 β”‚     <ThreadSettingsSessionContext.Provider value={value}>
     Β·                                            ─────────────
 655 β”‚       {props.children}
     ╰────
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  ⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
      ╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55]
 1461 β”‚   return (
 1462 β”‚     <ThreadSettingsPickerPresentationContext.Provider value={presentation}>
      Β·                                                       ────────────────────
 1463 β”‚       <ThreadSettingsPickerStack.Navigator
      ╰────
  help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
        Alternatively, move the value outside the render function if it doesn't depend on props or state.

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5]
 55 β”‚
 56 β”‚   useEffect(() => {
    Β·   ────┬────
    Β·       ╰── This is the containing effect
 57 β”‚     setDecodedSize(null);
    Β·     ───────┬──────
    Β·            ╰── Avoid calling setState() directly within an effect
 58 β”‚   }, [props.sourceKey]);
    ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5]
 59 β”‚
 60 β”‚   useEffect(() => {
    Β·   ────┬────
    Β·       ╰── This is the containing effect
 61 β”‚     setFailedUri(null);
    Β·     ──────┬─────
    Β·           ╰── Avoid calling setState() directly within an effect
 62 β”‚   }, [props.uri]);
    ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
   ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10]
 6 β”‚ import { parse, SvgAst, type JsxAST } from "react-native-svg";
 7 β”‚ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native";
   Β·          ────────┬────────
   Β·                  ╰── 'ActivityIndicator' is imported here
 8 β”‚
   ╰────
  help: Consider removing this import.

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
    ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7]
 57 β”‚     setDecodedSize(null);
 58 β”‚   }, [props.sourceKey]);
    Β·       ───────┬───────
    Β·              ╰── Unnecessary dependency `props.sourceKey`
 59 β”‚
    ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
    ╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7]
 61 β”‚     setFailedUri(null);
 62 β”‚   }, [props.uri]);
    Β·       ────┬────
    Β·           ╰── Unnecessary dependency `props.uri`
 63 β”‚
    ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
     ╭─[apps/web/src/components/pullRequest/pullRequestList.logic.ts:187:9]
 186 β”‚ ): boolean {
 187 β”‚   const labels = entry.labels.map((label) => label.name.trim().toLowerCase());
     Β·         ─────────────────────────────────────────────────────────────────────
 188 β”‚   const holds = (label: string) => labels.includes(label.trim().toLowerCase());
     ╰────
  help: Switch to `Set`

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5]
 76 β”‚
 77 β”‚   useEffect(() => {
    Β·   ────┬────
    Β·       ╰── This is the containing effect
 78 β”‚     const { host, code } = parsePairingUrl(connectionPairingUrl);
 79 β”‚     setHostInput(host);
    Β·     ──────┬─────
    Β·           ╰── Avoid calling setState() directly within an effect
 80 β”‚     setCodeInput(code);
    ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5]
 82 β”‚
 83 β”‚   useEffect(() => {
    Β·   ────┬────
    Β·       ╰── This is the containing effect
 84 β”‚     if (routePairingUrl.length === 0) {
 85 β”‚       return;
 86 β”‚     }
 87 β”‚
 88 β”‚     const { host, code } = parsePairingUrl(routePairingUrl);
 89 β”‚     setHostInput(host);
    Β·     ──────┬─────
    Β·           ╰── Avoid calling setState() directly within an effect
 90 β”‚     setCodeInput(code);
    ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
    ╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7]
 92 β”‚
 93 β”‚   useEffect(() => {
    Β·   ────┬────
    Β·       ╰── This is the containing effect
 94 β”‚     if (pairingConnectionError) {
 95 β”‚       setIsSubmitting(false);
    Β·       ───────┬───────
    Β·              ╰── Avoid calling setState() directly within an effect
 96 β”‚     }
    ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
    ╭─[apps/web/src/contextMenuFallback.test.ts:38:9]
 37 β”‚   get isConnected() {
 38 β”‚     let current: FakeElement | null = this;
    Β·         ───────
 39 β”‚     while (current?.parent) {
    ╰────
  help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well.

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7]
 118 β”‚
 119 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 120 β”‚     if (orientationSettled) return;
 121 β”‚     const orientation = getNativeShowcaseOrientation();
 122 β”‚     if (orientation === null) {
 123 β”‚       setOrientationSettled(true);
     Β·       ──────────┬──────────
     Β·                 ╰── Avoid calling setState() directly within an effect
 124 β”‚       return;
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7]
 292 β”‚
 293 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 294 β”‚     if (
 295 β”‚       scene === null ||
 296 β”‚       requestedScene === null ||
 297 β”‚       scene !== requestedScene ||
 298 β”‚       !hasFixture ||
 299 β”‚       !orientationSettled ||
 300 β”‚       !themeApplied ||
 301 β”‚       (scene === "agent-activity" && !agentActivityStaged) ||
 302 β”‚       !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
 303 β”‚     ) {
 304 β”‚       setReadyScene(null);
     Β·       ──────┬──────
     Β·             ╰── Avoid calling setState() directly within an effect
 305 β”‚       return;
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
     ╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9]
 127 β”‚     let cancelled = false;
 128 β”‚     let lastOutcome: string | null = null;
     Β·         ─────┬─────
     Β·              ╰── 'lastOutcome' is declared here
 129 β”‚     void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
     ╰────
  help: Consider removing this declaration.

  ⚠ react(purity): Cannot call impure function during render
     ╭─[apps/web/src/hooks/useThreadActions.ts:821:56]
 820 β”‚     const resolved = resolveThreadTarget(target);
 821 β”‚     if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) {
     Β·                                                        ─────┬────
     Β·                                                             ╰── Cannot call impure function
 822 β”‚       return AsyncResult.failure(
     ╰────
  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  ⚠ react(purity): Cannot call impure function during render
     ╭─[apps/web/src/hooks/useThreadActions.ts:709:46]
 708 β”‚     const wokeAt = resolved
 709 β”‚       ? threadWokeAt(resolved.thread, { now: new Date().toISOString() })
     Β·                                              ─────┬────
     Β·                                                   ╰── Cannot call impure function
 710 β”‚       : null;
     ╰────
  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  ⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
     ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:257:7]
 256 β”‚     return () => cancelAnimationFrame(frame);
 257 β”‚   }, [props.path, targetIndex]);
     Β·       ─────┬────
     Β·            ╰── Unnecessary dependency `props.path`
 258 β”‚
     ╰────
  help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps

  ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
     ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:293:23]
 292 β”‚                     <SourceText
 293 β”‚                       key={`${index}:${tokenIndex}`}
     Β·                       ──────────────────────────────
 294 β”‚                       style={{
     ╰────
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  ⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
     ╭─[apps/mobile/src/features/files/SourceFileSurface.tsx:309:27]
 308 β”‚             return (
 309 β”‚               <SourceText key={index}>
     Β·                           ───────────
 310 β”‚                 {body}
     ╰────
  help: Use a unique data-dependent key to avoid unnecessary rerenders

  ⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
     ╭─[apps/mobile/src/features/files/FileTreeBrowser.tsx:155:5]
 150 β”‚
 151 β”‚   useEffect(() => {
     Β·   ────┬────
     Β·       ╰── This is the containing effect
 152 β”‚     if (!controlledSelectedPath) {
 153 β”‚       return;
 154 β”‚     }
 155 β”‚     setExpandedPaths((current) => {
     Β·     ────────┬───────
     Β·             ╰── Avoid calling setState() directly within an effect
 156 β”‚       const ancestors = ancestorPaths(controlledSelectedPath);
     ╰────
  help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect

  ⚠ eslint(no-empty-pattern): Empty object binding pattern
     ╭─[apps/server/src/processRunner.test.ts:266:14]
 265 β”‚
 266 β”‚   for (const {} of ["timeout", "success"] as const) {
     Β·              ──
 267 β”‚   }
     ╰────
  help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.

  ⚠ unicorn(prefer-set-has): should be a `Set`, and use `.has()` to check existence or non-existence.
     ╭─[apps/web/src/components/chat/useComposerSend.ts:985:13]
 984 β”‚           const changedBeforeDecline = draftChangedSinceSend();
 985 β”‚ ╭─▢       const pendingIdsBeforeDecline = pendingApprovalsRef.current.map(
 986 β”‚ β”‚           (approval) => approval.requestId,
 987 β”‚ ╰─▢       );
 988 β”‚           const approvalResponding = approvalsToDecline.some((approval) =>
     ╰────
  help: Switch to `Set`

  ⚠ react(purity): Cannot call impure function during render
     ╭─[apps/web/src/components/CustomSnoozeDialog.tsx:140:58]
 139 β”‚                             {...(weekStartsOn === undefined ? {} : { weekStartsOn })}
 140 β”‚                             disabled={{ before: new Date(new Date().setHours(0, 0, 0, 0)) }}
     Β·                                                          ─────┬────
     Β·                                                               ╰── Cannot call impure function
 141 β”‚                             onSelect={(selected) => {
     ╰────
  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
     ╭─[apps/mobile/src/features/agent-awareness/remoteRegistration.test.ts:223:5]
 222 β”‚         let idlePasses = 0;
 223 β”‚ ╭─▢     for (;;) {
 224 β”‚ β”‚         yield* Effect.promise(() => Promise.resolve());
 225 β”‚ β”‚         const pending = backgroundRuntime.pending.shift();
 226 β”‚ β”‚         if (!pending) {
 227 β”‚ β”‚           idlePasses++;
 228 β”‚ β”‚           if (idlePasses >= 3) {
 229 β”‚ β”‚             return;
 230 β”‚ β”‚           }
 231 β”‚ β”‚           continue;
 232 β”‚ β”‚         }
 233 β”‚ β”‚         idlePasses = 0;
 234 β”‚ β”‚         const exit = yield* Effect.exit(
 235 β”‚ β”‚           pending.operation as Effect.Effect<unknown, unknown, ManagedRelay.ManagedRelayClient>,
 236 β”‚ β”‚         );
 237 β”‚ β”‚         yield* Effect.sync(() => {
 238 β”‚ β”‚           pending.resolve(exit);
 239 β”‚ β”‚         });
 240 β”‚ ╰─▢     }
 241 β”‚       },
     ╰────

  ⚠ eslint(no-empty-pattern): Empty array binding pattern
      ╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1429:12]
 1428 β”‚
 1429 β”‚ for (const [] of [
      Β·            ──
 1430 β”‚   ["github", "github.com"],
      ╰────
  help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable.

  ⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
     ╭─[packages/shared/src/qrCode.ts:458:44]
 457 β”‚   ): Array<byte> {
 458 β”‚     let result: Array<byte> = divisor.map((_) => 0);
     Β·                                            ┬
     Β·                                            ╰── '_' is declared here
 459 β”‚     for (const b of data) {
     ╰────
  help: Consider removing this parameter.

  ⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'.
    ╭─[packages/shared/src/model.test.ts:36:7]
 35 β”‚
 36 β”‚ const claudeCaps: ModelCapabilities = createModelCapabilities({
    Β·       ─────┬────
    Β·            ╰── 'claudeCaps' is declared here
 37 β”‚   optionDescriptors: [
    ╰────
  help: Consider removing this declaration.

  ⚠ eslint(no-unused-vars): Function 'describeSchedule' is declared but never used.
    ╭─[apps/server/src/scheduledTasks/Schedule.ts:79:10]
 78 β”‚
 79 β”‚ function describeSchedule(schedule: ScheduledTaskSchedule): string {
    Β·          ────────┬───────
    Β·                  ╰── 'describeSchedule' is declared here
 80 β”‚   if (schedule.type === "webhook") return "On webhook";
    ╰────
  help: Consider removing this declaration.

  ⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
     ╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
 520 β”‚                 })).delivery;
 521 β”‚ ╭─▢             while (delivery.outcome === "accepted") {
 522 β”‚ β”‚                 yield* Effect.yieldNow;
 523 β”‚ β”‚                 delivery = (yield* service.getWebhookDelivery({
 524 β”‚ β”‚                   id: task.id,
 525 β”‚ β”‚                   deliveryId: deliveryId!,
 526 β”‚ β”‚                 })).delivery;
 527 β”‚ ╰─▢             }
 528 β”‚                 assert.equal(delivery.outcome, "dispatch_failed");
     ╰────

  ⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret.
     ╭─[apps/server/src/vcs/GitVcsDriverCore.ts:509:11]
 508 β”‚         GIT_DIAGNOSTIC_LINE_PATTERN.test(line) ||
 509 β”‚         (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)),
     Β·           ───────────────
 510 β”‚     )
     ╰────
  help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`.

  ⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used.
    ╭─[infra/relay/src/http/Api.ts:69:13]
 68 β”‚ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts";
 69 β”‚ import * as HookForwarder from "../hooks/HookForwarder.ts";
    Β·             ──────┬──────
    Β·                   ╰── 'HookForwarder' is imported here
 70 β”‚ import * as HeldHooks from "../hooks/HeldHooks.ts";
    ╰────
  help: Consider removing this import.

  ⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
      ╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34]
 1785 β”‚           const stat = branch.files!.find((file) => file.path === path)!;
 1786 β”‚           const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({
      Β·                                  ───────────────────
 1787 β”‚             cwd,
      ╰────

  ⚠ react(purity): Cannot call impure function during render
     ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47]
 371 β”‚   const { open, onOpenChange, onSnooze, timestampFormat } = props;
 372 β”‚   const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : [];
     Β·                                               ─────┬────
     Β·                                                    ╰── Cannot call impure function
 373 β”‚   return (
     ╰────
  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  ⚠ react(purity): Cannot call impure function during render
     ╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39]
 852 β”‚   if (snoozeGateClock.thread !== thread) {
 853 β”‚     setSnoozeGateClock({ thread, now: new Date().toISOString() });
     Β·                                       ─────┬────
     Β·                                            ╰── Cannot call impure function
 854 β”‚   }
     ╰────
  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

  ⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used.
    ╭─[apps/web/src/lib/terminalContext.ts:56:10]
 55 β”‚
 56 β”‚ function normalizeTerminalContextSelection(
    Β·          ────────────────┬────────────────
    Β·                          ╰── 'normalizeTerminalContextSelection' is declared here
 57 β”‚   selection: TerminalContextSelection,
    ╰────
  help: Consider removing this declaration.

  ⚠ eslint(no-unused-vars): Function 'assertUserMessagesExclude' is declared but never used.
      ╭─[apps/server/src/orchestration-v2/testkit/fixtures/shared.ts:1398:10]
 1397 β”‚
 1398 β”‚ function assertUserMessagesExclude(
      Β·          ────────────┬────────────
      Β·                      ╰── 'assertUserMessagesExclude' is declared here
 1399 β”‚   projection: OrchestrationV2ThreadProjection,
      ╰────
  help: Consider removing this declaration.

  ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
    ╭─[apps/web/src/lib/composerContextReferences.ts:90:40]
 89 β”‚   let cursor = prompt.length;
 90 β”‚   for (const occurrence of occurrences.reverse()) {
    Β·                                        ───────
 91 β”‚     let { start, end } = occurrence;
    ╰────
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  ⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`.
     ╭─[apps/web/src/terminal/ghostty/core.ts:194:19]
 193 β”‚     const count = Math.min(CHUNK_SIZE, graphemeLength - start);
 194 β”‚     const codes = new Array<number>(count);
     Β·                   ────────────────────────
 195 β”‚     for (let index = 0; index < count; index += 1) {
     ╰────
  help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`.

  ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
     ╭─[apps/mobile/src/lib/markdownDocument.ts:138:28]
 137 β”‚   visit(parser.parse(markdown));
 138 β”‚   for (const edit of edits.reverse())
     Β·                            ───────
 139 β”‚     markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
     ╰────
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
     ╭─[apps/mobile/src/lib/markdownDocument.ts:169:28]
 168 β”‚   visit(parser.parse(markdown));
 169 β”‚   for (const edit of edits.reverse())
     Β·                            ───────
 170 β”‚     markdown = markdown.slice(0, edit.start) + edit.content + markdown.slice(edit.end);
     ╰────
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  ⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
     ╭─[apps/mobile/src/lib/markdownDocument.ts:223:38]
 222 β”‚   visit(parser.parse(markdown));
 223 β”‚   for (const lineStart of lineStarts.reverse()) {
     Β·                                      ───────
 224 β”‚     // The header row may be a lazy line without its container markers (`>` or list indent),
     ╰────
  help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.

  ⚠ react(purity): Cannot call impure function during render
      ╭─[apps/web/src/components/CommandPalette.tsx:1996:20]
 1995 β”‚         title: inferProjectTitleFromPath(destinationPath),
 1996 β”‚         createdAt: new Date().toISOString(),
      Β·                    ─────┬────
      Β·                         ╰── Cannot call impure function
 1997 β”‚         remoteUrl: addProjectCloneFlow.remoteUrl,
      ╰────
  help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
  note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity

Found 0 errors and 362 warnings in 5400 files (5.7s, 8 threads)
Post job cleanup.
Cache hit occurred on the primary key electron-Linux-X64-854e11ddd491bd4f350eebb67a74265df119376a3984c8e153cfe5fc8ced6309, not saving cache.
Post job cleanup.
##[start-action display=Cache full pnpm store;id=__08625919-59f3-45d0-89fc-0ed337f0e1d3.__actions_cache]
Post job cleanup.
[command]/usr/bin/tar --posix -cf cache.tzst --exclude cache.tzst -P -C /home/runner/_work/t3code/t3code --files-from manifest.txt --use-compress-program zstdmt
Sent 994310451 of 994310451 (100.0%), 2017.5 MBs/sec
Cache saved with key: pnpm-full-v1-Linux-X64-3cb0b4d7cff93dc8fe33f2ea73cac71ca25a36270fcb648b9b4a9320151012ef
##[end-action id=__08625919-59f3-45d0-89fc-0ed337f0e1d3.__actions_cache;outcome=success;conclusion=success;duration_ms=4825]
##[start-action display=Cache Vite+;id=__08625919-59f3-45d0-89fc-0ed337f0e1d3.vp_cache]
Post job cleanup.
Cache hit occurred on the primary key vite-plus-home-v2-Linux-X64-1.3.0-node26.12.1-pnpm@12.14.0, not saving cache.
##[end-action id=__08625919-59f3-45d0-89fc-0ed337f0e1d3.vp_cache;outcome=success;conclusion=success;duration_ms=75]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/dd17dbf2-7c73-472f-a5f8-c32e08f70e94' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
[command]/usr/local/bin/git config --global --add safe.directory /home/runner/_work/t3code/t3code
Removing SSH command configuration
[command]/usr/local/bin/git config --local --name-only --get-regexp core\.sshCommand
[command]/usr/local/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
fatal: No url found for submodule path '.repos/alchemy-effect/submodules/distilled' in .gitmodules
Warning: The process '/usr/local/bin/git' failed with exit code 128
A job completed hook has been configured by the self-hosted runner administrator
β–Έ Run '/job_completed.sh'
shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
env:
  BLACKSMITH_RUNNER_MESSAGE_WAIT_MS: 201
  BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 516
  BLACKSMITH_CHECK_RUN_ID: 120670937783
  BLACKSMITH_JOB_DISPLAY_NAME: Lint
  GITHUB_ACTIONS_CACHE_MODE: write
Docker container cache not activated, skipping hash computation.
No active SSH sessions detected. Proceeding with shutdown immediately.
Cleaning up orphan processes