GitHub check
256 KB of 597 KB loaded Download the full log (597 KB)
341 KB of earlier output not loaded
T19:48:14.6481258Z 687 │ selectedSection={selectedSection}
688 │ showSectionToolbar={showSectionToolbar}
689 │ showChangedFilesToggle={showChangedFilesToggle}
690 │ onRefresh={handlePullToRefresh}
691 │ onSelectSection={selectSection}
692 │ onReturnToThread={handleReturnToThread}
693 │ />
694 │
695 │ <ScreenContent>
696 │ <View className="flex-1 bg-sheet android:bg-sheet-solid">
697 │ {showConnectionNotice ? (
698 │ <View className="flex-1" style={{ paddingTop: topContentInset }}>
699 │ <EnvironmentConnectionNotice
700 │ environmentLabel={environment.presentation?.entry.target.label ?? "Environment"}
701 │ connection={
702 │ environment.presentation?.connection ?? {
703 │ phase: "available",
704 │ error: null,
705 │ traceId: null,
706 │ }
707 │ }
708 │ resourceName="review"
709 │ onRetry={handleRetryEnvironment}
710 │ />
711 │ </View>
712 │ ) : selectedSection && parsedDiff.kind === "files" && NativeReviewDiffView ? (
713 │ <View
714 │ className="flex-1"
715 │ style={{
716 │ backgroundColor: nativeBridge.theme.background,
717 │ }}
718 │ >
719 │ <View
720 │ className="min-w-0 flex-1"
721 │ style={listHeader ? { paddingTop: topContentInset } : undefined}
722 │ >
723 │ {listHeader}
724 │ <View className="min-w-0 flex-1" collapsable={false}>
725 │ <NativeReviewDiffView
· ──────────┬─────────
· ╰── This component is created during render
726 │ collapsable={false}
╰────
help: Components created during render will reset their state each time they are created. Declare components outside of render
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
⚠ eslint(no-empty-pattern): Empty object binding pattern
╭─[apps/server/src/process/externalLauncher.test.ts:186:12]
185 │
186 │ for (const {} of ["darwin", "linux"] as const) {
· ──
187 │ }
╰────
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
⚠ eslint(no-empty-pattern): Empty object binding pattern
╭─[apps/server/src/process/externalLauncher.test.ts:189:12]
188 │
189 │ for (const {} of [
· ──
190 │ { kind: "browser", folderVerb: "none" },
╰────
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
⚠ eslint(no-empty-pattern): Empty object binding pattern
╭─[apps/server/src/process/externalLauncher.test.ts:311:12]
310 │
311 │ for (const {} of ["rejected", "spawn-error", "stalled"] as const) {
· ──
312 │ }
╰────
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
⚠ eslint(no-empty-pattern): Empty object binding pattern
╭─[apps/server/src/process/externalLauncher.test.ts:314:12]
313 │
314 │ for (const {} of [
· ──
315 │ {
╰────
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed
╭─[apps/server/src/sourceControl/SourceControlProviderRegistry.ts:15:13]
14 │ } from "@t3tools/contracts";
15 │ import type {} from "@t3tools/contracts";
· ──
16 │ import { detectSourceControlProviderFromRemoteUrl } from "@t3tools/shared/sourceControl";
╰────
help: Remove empty braces
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:60:5]
55 │
56 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
57 │ scheduler.reset();
58 │ highlightedRowIdsRef.current = new Set();
59 │ visibleChunkIndexRef.current = 0;
60 │ setVisibleRange({ firstRowIndex: 0, lastRowIndex: 80 });
· ───────┬───────
· ╰── Avoid calling setState() directly within an effect
61 │ setTokensPatchJson(createEmptyTokenPatch(resetKey));
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/review/useNativeReviewDiffHighlighting.ts:63:7]
62 │ return () => scheduler.cancel();
63 │ }, [enabled, resetKey, rows.length, scheduler]);
· ───┬─── ─────┬─────
· │ ╰── Unnecessary dependency `rows.length`
· ╰── Unnecessary dependency `enabled`
64 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/StackHeader.tsx:184:9]
183 │ "options",
184 │ latestOptionFunctionsRef.current,
· ────────────────┬───────────────
· ╰── Passing a ref to a function may read its value during render
185 │ optionFunctionWrappersRef.current,
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/StackHeader.tsx:185:9]
184 │ latestOptionFunctionsRef.current,
185 │ optionFunctionWrappersRef.current,
· ────────────────┬────────────────
· ╰── Passing a ref to a function may read its value during render
186 │ ) as NativeStackNavigationOptions)
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ 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.
⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
╭─[apps/server/src/terminal/Manager.test.ts:731:31]
730 │ );
731 │ const snapshot = events.filter((event) => event.type === "snapshot").at(-1)?.snapshot;
· ──────
732 │ expect(snapshot?.history).toBe("aa😀\rEND");
╰────
help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeUnknownSync(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
╭─[packages/contracts/src/baseSchemas.test.ts:39:9]
38 │ JSON.stringify(
39 │ Schema.encodeUnknownSync(Schema.toCodecJson(Named))([
· ────────────────────────
40 │ { name: "a" },
╰────
⚠ 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.
⚠ 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-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts:521:13]
520 │ })).delivery;
521 │ ╭─▶ while (delivery.outcome === "accepted") {
522 │ │ yield* Effect.yieldNow;
523 │ │ delivery = (yield* service.getWebhookDelivery({
524 │ │ id: task.id,
525 │ │ deliveryId: deliveryId!,
526 │ │ })).delivery;
527 │ ╰─▶ }
528 │ assert.equal(delivery.outcome, "dispatch_failed");
╰────
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[packages/contracts/src/auth.test.ts:17:12]
16 │ it("decodes legacy review credentials without offering them in new grants", () => {
17 │ expect(Schema.decodeUnknownSync(AuthEnvironmentScopes)(["review:write"])).toEqual([
· ────────────────────────
18 │ "review:write",
╰────
⚠ 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.
╭─[packages/contracts/src/auth.test.ts:20:18]
19 │ ]);
20 │ expect(() => Schema.decodeUnknownSync(AuthGrantScopes)(["review:write"])).toThrow();
· ────────────────────────
21 │ expect(AuthStandardClientScopes).not.toContain("review:write");
╰────
⚠ 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.
╭─[packages/contracts/src/auth.test.ts:58:21]
57 │ it("ignores unknown response permissions without falling back to broader scopes", () => {
58 │ const session = Schema.decodeUnknownSync(AuthSessionState)({
· ────────────────────────
59 │ authenticated: true,
╰────
⚠ eslint(no-unused-vars): Variable 'revokeActiveMcpThread' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/mcp/McpSessionRegistry.ts:218:7]
217 │
218 │ const revokeActiveMcpThread = (threadId: ThreadId): Effect.Effect<void> =>
· ──────────┬──────────
· ╰── 'revokeActiveMcpThread' is declared here
219 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeThread(threadId) : Effect.void;
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Variable 'revokeAllActiveMcpCredentials' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/mcp/McpSessionRegistry.ts:221:7]
220 │
221 │ const revokeAllActiveMcpCredentials = (): Effect.Effect<void> =>
· ──────────────┬──────────────
· ╰── 'revokeAllActiveMcpCredentials' is declared here
222 │ activeMcpSessionRegistry ? activeMcpSessionRegistry.revokeAll : Effect.void;
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:121:27]
120 │ const scope = makeScope(options.capabilities ?? new Set(["preview", "worktree"]));
121 │ const dispatch = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
122 │ (options.dispatchGate ?? Effect.void).pipe(
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:134:39]
133 │ );
134 │ const listLocalBranchNames = vi.fn((_: string) =>
· ┬
· ╰── '_' is declared here
135 │ Effect.succeed(
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:178:31]
177 │ });
178 │ const sendToThread = vi.fn((_: unknown) => {
· ┬
· ╰── '_' is declared here
179 │ switch (options.continuation ?? "queued") {
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:203:33]
202 │ );
203 │ const removeWorktree = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
204 │ options.removeWorktreeFails
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:208:36]
207 │ );
208 │ const deleteLocalBranch = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
209 │ options.deleteLocalBranchFails
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:213:42]
212 │ );
213 │ const fetchWorktreeBaseCommit = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
214 │ options.fetchWorktreeBaseFails
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:254:30]
253 │ );
254 │ const localStatus = vi.fn((_: unknown) =>
· ┬
· ╰── '_' is declared here
255 │ Effect.succeed({
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/mcp/WorktreeMcpService.test.ts:264:32]
263 │ );
264 │ const refreshStatus = vi.fn((_: string) => Effect.die("refreshStatus stub"));
· ┬
· ╰── '_' is declared here
265 │ const runForThread = vi.fn((input: { readonly worktreePath: string }) => {
╰────
help: Consider removing this parameter.
⚠ t3code(no-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(immutability): This value cannot be modified
╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:42:5]
35 │
36 │ const inspectorProgress = useSharedValue(inspectorVisible ? 1 : 0);
· ────────┬────────
· ╰── `inspectorProgress` originates here
37 │ const { renderedInspectorWidth } = props;
38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
39 │
40 │ const onClosed = props.onClosed;
41 │ useEffect(() => {
42 │ inspectorProgress.value = withTiming(
· ────────┬────────
· ╰── `inspectorProgress` cannot be modified
43 │ inspectorVisible ? 1 : 0,
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/layout/workspace-inspector-pane.tsx:67:7]
37 │ const { renderedInspectorWidth } = props;
38 │ const renderedContentWidth = useSharedValue(inspectorWidth ?? 0);
· ──────────┬─────────
· ╰── `renderedContentWidth` originates here
39 │
40 │ const onClosed = props.onClosed;
41 │ useEffect(() => {
42 │ inspectorProgress.value = withTiming(
43 │ inspectorVisible ? 1 : 0,
44 │ WORKSPACE_PANE_TIMING,
45 │ (finished) => {
46 │ if (finished === true && !inspectorVisible && onClosed !== undefined) {
47 │ runOnJS(onClosed)();
48 │ }
49 │ },
50 │ );
51 │ const targetWidth = inspectorVisible ? (inspectorWidth ?? 0) : 0;
52 │ renderedInspectorWidth.set(
53 │ resizing ? targetWidth : withTiming(targetWidth, WORKSPACE_PANE_TIMING),
54 │ );
55 │ }, [
56 │ inspectorProgress,
57 │ inspectorVisible,
58 │ inspectorWidth,
59 │ onClosed,
60 │ renderedInspectorWidth,
61 │ resizing,
62 │ ]);
63 │
64 │ useEffect(() => {
65 │ const targetWidth = inspectorWidth ?? 0;
66 │ if (!inspectorVisible || resizing) {
67 │ renderedContentWidth.value = targetWidth;
· ──────────┬─────────
· ╰── `renderedContentWidth` cannot be modified
68 │ return;
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/usage/UsageService.ts:169:7]
168 │
169 │ const layerTest = Layer.succeed(
· ────┬────
· ╰── 'layerTest' is declared here
170 │ UsageService,
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Type 'Scope' is imported but never used.
╭─[apps/server/src/provider/ProviderAuthService.ts:15:18]
14 │ import * as Layer from "effect/Layer";
15 │ import type * as Scope from "effect/Scope";
· ──┬──
· ╰── 'Scope' is imported here
16 │ import * as Stream from "effect/Stream";
╰────
help: Consider removing this import.
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/usage/UsageService.test.ts:2383:7]
2382 │ let orphanedAt: number | undefined;
2383 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) {
2384 │ │ const tasks: Array<() => void> = [];
2385 │ │ const dispatcher: Scheduler.SchedulerDispatcher = {
2386 │ │ scheduleTask: (task) => tasks.push(task),
2387 │ │ flush: () => {
2388 │ │ let task: (() => void) | undefined;
2389 │ │ while ((task = tasks.shift()) !== undefined) task();
2390 │ │ },
2391 │ │ };
2392 │ │
2393 │ │ let requestFiber: Fiber.Fiber<unknown, unknown> | undefined;
2394 │ │ let requestChecks = 0;
2395 │ │ const scheduler: Scheduler.Scheduler = {
2396 │ │ executionMode: "async",
2397 │ │ makeDispatcher: () => dispatcher,
2398 │ │ shouldYield: (fiber) => {
2399 │ │ if (fiber !== requestFiber) return false;
2400 │ │ requestChecks += 1;
2401 │ │ if (requestChecks !== interruptAt) return false;
2402 │ │ fiber.interruptUnsafe();
2403 │ │ return true;
2404 │ │ },
2405 │ │ };
2406 │ │
2407 │ │ const input: UsageSummaryInput = {
2408 │ │ ...WINDOW,
2409 │ │ sinceDay: UsageDay.make("2026-09-01"),
2410 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`),
2411 │ │ };
2412 │ │ const first = yield* service
2413 │ │ .readSummary(input)
2414 │ │ .pipe(
2415 │ │ Effect.exit,
2416 │ │ Effect.provideService(Scheduler.Scheduler, scheduler),
2417 │ │ Effect.forkChild,
2418 │ │ );
2419 │ │ requestFiber = first;
2420 │ │ yield* Effect.yieldNow;
2421 │ │ dispatcher.flush();
2422 │ │
2423 │ │ const second = yield* service.readSummary(input).pipe(
2424 │ │ Effect.match({
2425 │ │ onFailure: (error) => error.reason,
2426 │ │ onSuccess: () => "success" as const,
2427 │ │ }),
2428 │ │ Effect.provideService(Scheduler.Scheduler, scheduler),
2429 │ │ Effect.forkChild,
2430 │ │ );
2431 │ │ yield* Effect.yieldNow;
2432 │ │ dispatcher.flush();
2433 │ │ const secondExit = second.pollUnsafe();
2434 │ │ if (secondExit === undefined) {
2435 │ │ second.interruptUnsafe();
2436 │ │ orphanedAt = interruptAt;
2437 │ │ break;
2438 │ │ }
2439 │ │ if (Exit.isFailure(secondExit)) {
2440 │ │ assert.fail("the matching request fiber was interrupted");
2441 │ │ }
2442 │ │ assert.strictEqual(secondExit.value, "invalidWindow");
2443 │ ╰─▶ }
2444 │
╰────
⚠ unicorn(require-module-specifiers): Empty import specifier is not allowed
╭─[packages/contracts/src/rpc.ts:295:8]
294 │ } from "./device.ts";
295 │ import {} from "./previewAutomation.ts";
· ──
296 │ import {
╰────
help: Remove empty braces
⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7]
20 │ [instanceId]: {
21 │ ...(state[instanceId] ?? {}),
· ────────────────────────────
22 │ [model]: options,
╰────
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeUnknownSync(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
╭─[packages/contracts/src/composerContext.test.ts:181:18]
180 │ it("sends a message without the records the wire cannot carry", () => {
181 │ const wire = Schema.encodeUnknownSync(Schema.toCodecJson(OrchestrationMessageContext))({
· ────────────────────────
182 │ version: 1,
╰────
⚠ 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.
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/state/use-vcs-action-state.ts:86:5]
83 │ const [nowMs, setNowMs] = useState(() => Date.now());
84 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
85 │ if (!actionState.isRunning) return;
86 │ setNowMs(Date.now());
· ────┬───
· ╰── Avoid calling setState() directly within an effect
87 │ const interval = setInterval(() => setNowMs(Date.now()), 1000);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ 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-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-empty-pattern): Empty object binding pattern
╭─[apps/server/src/processRunner.test.ts:266:14]
265 │
266 │ for (const {} of ["timeout", "success"] as const) {
· ──
267 │ }
╰────
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
⚠ eslint(no-unused-vars): Variable 'layerTest' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/telemetry/AnalyticsService.ts:340:7]
339 │
340 │ const layerTest = AnalyticsService.layerTest;
· ────┬────
· ╰── 'layerTest' is declared here
╰────
help: Consider removing this declaration.
⚠ eslint(no-empty-pattern): Empty object binding pattern
╭─[apps/server/src/provider/Drivers/CodexDriver.test.ts:466:14]
465 │
466 │ for (const {} of ["direct", "wrapper"] as const) {
· ──
467 │ }
╰────
help: Passing `null` or `undefined` will result in runtime error because `null` and `undefined` cannot be destructured.
⚠ 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): 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.
⚠ react(no-unstable-nested-components): Do not define components during render.
╭─[apps/mobile/src/Stack.tsx:1044:21]
1043 │ <Navigator
1044 │ screenLayout={(props) => <GuardedScreenLayout {...props} />}
· ─────────────────────────────────────────────
1045 │ screenListeners={{
╰────
help: Move this component definition out of the parent component `AdaptiveRootStack` and pass data as props. If you want to allow component creation in props, set `allowAsProps` option to true.
⚠ eslint(no-unused-vars): Variable 'layerFromProviderAdapter' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts:346:7]
345 │
346 │ const layerFromProviderAdapter: Layer.Layer<
· ────────────┬───────────
· ╰── 'layerFromProviderAdapter' is declared here
347 │ ProviderAdapterRegistryV2,
╰────
help: Consider removing this declaration.
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:361:7]
355 │ }, [cancelledIncomingShareId, navigation, props.incomingShareId]);
356 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
357 │ if (!isReturningToProjectPicker) {
358 │ return;
359 │ }
360 │ if (requestedInitialProjectAvailable) {
361 │ setIsReturningToProjectPicker(false);
· ──────────────┬──────────────
· ╰── Avoid calling setState() directly within an effect
362 │ return;
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:504:9]
447 │
448 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
449 │ if (props.pendingTaskId || props.draftId) {
450 │ return;
451 │ }
452 │ if (lastInitialProjectRefRef.current !== props.initialProjectRef) {
453 │ lastInitialProjectRefRef.current = props.initialProjectRef;
454 │ appliedInitialProjectKeyRef.current = null;
455 │ }
456 │ const initialEnvironmentId = props.initialProjectRef?.environmentId;
457 │ const initialProjectId = props.initialProjectRef?.projectId;
458 │ if (initialEnvironmentId && initialProjectId) {
459 │ const directProject =
460 │ projects.find(
461 │ (project) =>
462 │ project.environmentId === initialEnvironmentId && project.id === initialProjectId,
463 │ ) ?? null;
464 │
465 │ if (directProject) {
466 │ // Apply the route's project once. Re-applying on every change would
467 │ // instantly revert environment/project switches made in the picker.
468 │ const directProjectKey = `${directProject.environmentId}:${directProject.id}`;
469 │ if (appliedInitialProjectKeyRef.current === directProjectKey) {
470 │ return;
471 │ }
472 │ if (props.initialProjectRef?.branch) {
473 │ if (
474 │ selectedProject?.environmentId !== directProject.environmentId ||
475 │ selectedProject.id !== directProject.id
476 │ ) {
477 │ setProject(directProject);
478 │ return;
479 │ }
480 │ if (!flow.draftKey) return;
481 │ // The route completes checkout before mounting this composer. Local
482 │ // mode reuses an existing worktree; worktree mode would create another.
483 │ updateComposerDraftSettings(flow.draftKey, {
484 │ workspaceSelection: {
485 │ mode: "local",
486 │ branch: props.initialProjectRef.branch,
487 │ worktreePath: props.initialProjectRef.worktreePath ?? null,
488 │ startFromOrigin: false,
489 │ },
490 │ });
491 │ }
492 │ appliedInitialProjectKeyRef.current = directProjectKey;
493 │ if (
494 │ selectedProject?.environmentId === directProject.environmentId &&
495 │ selectedProject.id === directProject.id
496 │ ) {
497 │ return;
498 │ }
499 │ setProject(directProject);
500 │ return;
501 │ }
502 │
503 │ if (projects.length > 0) {
504 │ setIsReturningToProjectPicker(true);
· ──────────────┬──────────────
· ╰── Avoid calling setState() directly within an effect
505 │ }
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:604:5]
545 │
546 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
547 │ const shareId = props.incomingShareId;
548 │ const draftKey = flow.draftKey;
549 │ const destinationProject = selectedProject;
550 │ const initialEnvironmentId = props.initialProjectRef?.environmentId;
551 │ const initialProjectId = props.initialProjectRef?.projectId;
552 │ const selectedProjectMatchesRoute =
553 │ !initialEnvironmentId ||
554 │ !initialProjectId ||
555 │ (destinationProject?.environmentId === initialEnvironmentId &&
556 │ destinationProject.id === initialProjectId);
557 │ if (
558 │ !shareId ||
559 │ !draftKey ||
560 │ !destinationProject ||
561 │ !selectedProjectMatchesRoute ||
562 │ cancelledIncomingShareId === shareId
563 │ ) {
564 │ return;
565 │ }
566 │ const importKey = `${shareId}:${draftKey}`;
567 │ if (
568 │ startedShareImportKeyRef.current === importKey ||
569 │ cancellingShareImportKeyRef.current === importKey
570 │ ) {
571 │ return;
572 │ }
573 │
574 │ if (!incomingShare) {
575 │ if (isIncomingShareUnavailable && alertedUnavailableIncomingShareIdRef.current !== shareId) {
576 │ alertedUnavailableIncomingShareIdRef.current = shareId;
577 │ Dialog.alert(
578 │ "Shared content unavailable",
579 │ "The shared content is no longer in the inbox. You can continue editing this task draft.",
580 │ );
581 │ }
582 │ return;
583 │ }
584 │
585 │ if (
586 │ incomingShare.attachments.some((attachment) => attachment.type === "file") &&
587 │ selectedEnvironmentServerConfig === null
588 │ ) {
589 │ return;
590 │ }
591 │
592 │ if (alertedUnavailableIncomingShareIdRef.current === shareId) {
593 │ alertedUnavailableIncomingShareIdRef.current = null;
594 │ }
595 │ startedShareImportKeyRef.current = importKey;
596 │ const draftBackup =
597 │ shareImportDraftBackupRef.current.get(importKey) ?? getComposerDraftSnapshot(draftKey);
598 │ shareImportDraftBackupRef.current.set(importKey, draftBackup);
599 │ const importToken = Symbol(importKey);
600 │ let didReserveShare = false;
601 │ let didConsumeShare = false;
602 │ let needsDraftRestore = false;
603 │ activeShareImportTokenRef.current = importToken;
604 │ setImportingShareKey(importKey);
· ──────────┬─────────
· ╰── Avoid calling setState() directly within an effect
605 │ void (async () => {
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:524:5]
523 │ props.initialProjectRef,
524 │ props.incomingShareId,
· ──────────┬──────────
· ╰── Unnecessary dependency `props.incomingShareId`
525 │ props.pendingTaskId,
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:543:5]
542 │ loadedBranchesProjectKeyRef.current = projectKey;
543 │ flow.loadBranches();
· ──┬─
· ╰── Missing dependency `flow`
544 │ }, [flow.loadBranches, selectedProject]);
· ────────┬────────
· ╰── Overly precise dependency `flow.loadBranches`, use `flow` instead
545 │
╰────
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/NewTaskDraftScreen.tsx:766:5]
765 │ flow.draftKey,
766 │ hasImportedIncomingShare,
· ────────────┬───────────
· ╰── Unnecessary dependency `hasImportedIncomingShare`
767 │ incomingShare,
768 │ isIncomingShareInboxLoading,
· ─────────────┬─────────────
· ╰── Unnecessary dependency `isIncomingShareInboxLoading`
769 │ isIncomingShareUnavailable,
770 │ props.incomingShareId,
771 │ props.initialProjectRef?.environmentId,
772 │ props.initialProjectRef?.projectId,
773 │ releaseShareReservation,
774 │ reserveShare,
775 │ selectedEnvironmentServerConfig,
776 │ selectedProject,
777 │ shareImportAttempt,
· ─────────┬────────
· ╰── Unnecessary dependency `shareImportAttempt`
778 │ ]);
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
╭─[apps/server/src/provider/AntigravityAuth.ts:285:20]
284 │ },
285 │ (effect, flow, stopSessions) =>
· ──────┬─────
· ╰── 'stopSessions' is declared here
286 │ effect.pipe(
╰────
help: Consider removing this parameter.
⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:370:7]
369 │ mountedRef.current = false;
370 │ flow.setBranchQuery("");
· ──┬─
· ╰── Missing dependency `flow`
371 │ };
372 │ }, [flow.setBranchQuery]);
· ─────────┬─────────
· ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead
373 │
╰────
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ t3code(no-inline-schema-compile): Hoist Schema.is(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
╭─[apps/server/src/provider/acp/AntigravityProtocol.ts:263:20]
262 │ ...(update._meta !== undefined
263 │ ? { _meta: Schema.is(Schema.Record(Schema.String, Schema.Json))(meta) ? meta : null }
· ─────────
264 │ : {}),
╰────
⚠ eslint(no-unused-vars): Function '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.
⚠ 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.
⚠ 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-codex-app-server/src/schema.test.ts:50:18]
49 │ for (const tool of ["sendMessage", "followupTask", "interruptAgent", "listAgents"]) {
50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true);
· ─────────
51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true);
╰────
⚠ 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-codex-app-server/src/schema.test.ts:51:18]
50 │ assert.equal(Schema.is(CodexSchema.ServerNotification__CollabAgentTool)(tool), true);
51 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentTool)(tool), true);
· ─────────
52 │ }
╰────
⚠ 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-codex-app-server/src/schema.test.ts:55:5]
54 │ assert.equal(
55 │ Schema.is(CodexSchema.ServerNotification__CollabAgentToolCallStatus)("interrupted"),
· ─────────
56 │ true,
╰────
⚠ 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-codex-app-server/src/schema.test.ts:59:5]
58 │ assert.equal(
59 │ Schema.is(CodexSchema.V2ThreadResumeResponse__CollabAgentToolCallStatus)("interrupted"),
· ─────────
60 │ true,
╰────
⚠ 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-codex-app-server/src/schema.test.ts:103:16]
102 │
103 │ assert.equal(Schema.is(CodexSchema.V2ThreadResumeResponse)(resumeResponse), true);
· ─────────
104 │ });
╰────
⚠ 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 '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-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(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/threads/ThreadNavigationSidebar.tsx:285:5]
283 │ const [snoozeWakeTick, bumpSnoozeWakeTick] = useState(0);
284 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
285 │ setNow(new Date().toISOString());
· ───┬──
· ╰── Avoid calling setState() directly within an effect
286 │ const id = setInterval(() => setNow(new Date().toISOString()), 60_000);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:365:25]
364 │ // range) the boundary string is identical and the chain would die.
365 │ }, [nextSnoozeWakeAt, snoozeWakeTick]);
· ───────┬──────
· ╰── Unnecessary dependency `snoozeWakeTick`
366 │ const listItems = ((): readonly SidebarListItem[] => {
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(purity): Cannot call impure function during render
╭─[apps/mobile/src/features/threads/ThreadNavigationSidebar.tsx:356:53]
355 │ if (Number.isNaN(wakeAtMs)) return;
356 │ const delayMs = Math.min(Math.max(0, wakeAtMs - Date.now()) + 50, 2_147_483_647);
· ─────┬────
· ╰── Cannot call impure function
357 │ const id = setTimeout(() => {
╰────
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
╭─[apps/server/src/serverSettings.test.ts:1741:32]
1740 │ const model = createModelSelection(ProviderInstanceId.make("codex"), "gpt-5.5");
1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
· ───────────────────
1742 │ const scriptsJson = yield* Schema.encodeEffect(
╰────
⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
╭─[apps/server/src/serverSettings.test.ts:1742:34]
1741 │ const modelJson = yield* Schema.encodeEffect(Schema.fromJsonString(ModelSelection))(model);
1742 │ const scriptsJson = yield* Schema.encodeEffect(
· ───────────────────
1743 │ Schema.fromJsonString(Schema.Array(ProjectScript)),
╰────
⚠ eslint(no-unused-vars): Identifier 'Image' is imported but never used.
╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:17:10]
16 │ import type { NativeSyntheticEvent, ViewProps } from "react-native";
17 │ import { Image, Platform, StyleSheet } from "react-native";
· ──┬──
· ╰── 'Image' is imported here
18 │
╰────
help: Consider removing this import.
⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:227:6]
223 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
224 │ nativeEventSnapshotsRef.current,
· ───────────┬───────────
· ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
225 │ mostRecentEventCount,
226 │ );
227 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
· ──────────────────────────┬──────────────────────────
· ╰── This dependency list is missing values used by the callback
228 │ const assumedValue = props.value;
╰────
help: Missing dependencies can cause an effect to fire less often than it should
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:235:7]
234 │ nativeEventSnapshotsRef.current = assumeComposerControlledState(
235 │ nativeEventSnapshotsRef.current,
· ───────────┬───────────
· ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
236 │ controlledEventCount,
237 │ assumedValue,
238 │ );
239 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
· ───────────┬──────────
· ╰── Unnecessary dependency `controlledDocumentJson`
240 │ const acceptNativeEvent = useCallback(
╰────
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/native/T3ComposerEditor.native.tsx:160:29]
159 │ const tokens = collectComposerInlineTokens(props.value, {
160 │ preserveTrailingFrom: confirmedTokensRef.current,
· ─────────────┬────────────
· ╰── Cannot access ref value during render
161 │ });
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:160:29]
159 │ const tokens = collectComposerInlineTokens(props.value, {
160 │ preserveTrailingFrom: confirmedTokensRef.current,
· ─────────────┬────────────
· ╰── Passing a ref to a function may read its value during render
161 │ });
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:162:23]
161 │ });
162 │ confirmedTokensRef.current = tokens;
· ─────────┬────────────┬───
· │ ╰── Cannot update ref value during render
· ╰── This value is a ref
163 │ return JSON.stringify(
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:204:5]
203 │ mostRecentEventCount,
204 │ nativeEventSnapshotsRef.current,
· ───────────────┬───────────────
· ╰── Passing a ref to a function may read its value during render
205 │ );
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:210:5]
209 │ mostRecentEventCount,
210 │ nativeEventSnapshotsRef.current,
· ───────────────┬───────────────
· ╰── Passing a ref to a function may read its value during render
211 │ );
╰────
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(memo-dependencies): Found missing memoization dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:195:6]
159 │ const tokens = collectComposerInlineTokens(props.value, {
160 │ preserveTrailingFrom: confirmedTokensRef.current,
· ─────────┬────────
· ╰── Missing dependency `confirmedTokensRef`. 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
161 │ });
162 │ confirmedTokensRef.current = tokens;
163 │ return JSON.stringify(
164 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
165 │ const record =
166 │ token.type === "context"
167 │ ? props.context?.records.find((record) => record.contextId === token.contextId)
168 │ : undefined;
169 │ const presentation = contextChipPresentation(
170 │ token.type === "context" ? token.kind : token.type,
171 │ record,
172 │ );
173 │ const icon = contextChipIcon(
174 │ presentation,
175 │ token.type === "mention" ? token.value : contextRecordFileName(record),
176 │ );
177 │ return {
178 │ type: token.type,
179 │ source: token.source,
180 │ start: token.start,
181 │ end: token.end,
182 │ accent: presentation.accent,
183 │ label:
184 │ token.type === "skill"
185 │ ? (skillLabels.get(token.value) ?? token.value)
186 │ : token.type === "context"
187 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}`
188 │ : basename(token.value),
189 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
190 │ iconUri: contextChipIconUri(icon),
191 │ tintsIcon: icon.kind === "chip",
192 │ };
193 │ }),
194 │ );
195 │ }, [props.value, props.context, skillLabels]);
· ────────────────────┬────────────────────
· ╰── This dependency list is missing values used by the callback
196 │ // Every render resolves against the snapshot history, so a render whose
╰────
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(memo-dependencies): Found missing memoization dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.native.tsx:257:5]
249 │ mostRecentEventCountRef.current = acknowledgedEventCount;
250 │ nativeEventSnapshotsRef.current.push({
· ───────────┬───────────
· ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
251 │ eventCount: acknowledgedEventCount,
252 │ value,
253 │ selection: nextSelection,
254 │ });
255 │ return acknowledgedEventCount;
256 │ },
257 │ [],
· ─┬
· ╰── This dependency list is missing values used by the callback
258 │ );
╰────
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
⚠ eslint(no-unused-vars): Function 'resolveThreadWorkspaceCwd' is declared but never used.
╭─[apps/server/src/checkpointing/Utils.ts:12:10]
11 │
12 │ function resolveThreadWorkspaceCwd(input: {
· ────────────┬────────────
· ╰── 'resolveThreadWorkspaceCwd' is declared here
13 │ readonly thread: {
╰────
help: Consider removing this declaration.
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2109:5]
2107 │ );
2108 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
2109 │ setExpandedVideo(null);
· ────────┬───────
· ╰── Avoid calling setState() directly within an effect
2110 │ setExpandedFile(null);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ eslint(no-unused-vars): Identifier 'isMarkdownFileLinkLabel' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:62:10]
61 │ import { resolveAssetUrl } from "@t3tools/client-runtime/state/assets";
62 │ import { isMarkdownFileLinkLabel } from "@t3tools/shared/markdownLinks";
· ───────────┬───────────
· ╰── 'isMarkdownFileLinkLabel' is imported here
63 │ import { formatAttachmentSize } from "@t3tools/client-runtime/state/attachments";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'createContext' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:88:3]
87 │ import {
88 │ createContext,
· ──────┬──────
· ╰── 'createContext' is imported here
89 │ memo,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:103:3]
102 │ import {
103 │ ActivityIndicator,
· ────────┬────────
· ╰── 'ActivityIndicator' is imported here
104 │ Image,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'ScrollView' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:110:3]
109 │ Pressable,
110 │ ScrollView,
· ─────┬────
· ╰── 'ScrollView' is imported here
111 │ StyleSheet,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'NativeText' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:112:11]
111 │ StyleSheet,
112 │ Text as NativeText,
· ─────┬────
· ╰── 'NativeText' is imported here
113 │ type ColorValue,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'tryOpenExternalUrl' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:134:10]
133 │ import { copyTextWithHaptic } from "../../lib/copyTextWithHaptic";
134 │ import { tryOpenExternalUrl } from "../../lib/openExternalUrl";
· ─────────┬────────
· ╰── 'tryOpenExternalUrl' is imported here
135 │ import { downloadAndShareAttachment } from "../../lib/attachmentDownload";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'faviconUrlForOrigin' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:137:10]
136 │ import { hasWideMarkdownBlock } from "../../lib/wideMarkdownBlocks";
137 │ import { faviconUrlForOrigin } from "@t3tools/shared/favicon";
· ─────────┬─────────
· ╰── 'faviconUrlForOrigin' is imported here
138 │ import {
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'MediaVideoPlayer' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:151:10]
150 │ import { VideoAttachmentTile } from "../../components/VideoAttachmentTile";
151 │ import { MediaVideoPlayer } from "../../components/MediaVideoPlayer";
· ────────┬───────
· ╰── 'MediaVideoPlayer' is imported here
152 │ import { resolveMarkdownMediaPreview } from "../../lib/markdownMedia";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'mediaVideoPreviewUri' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:155:3]
154 │ attachmentVideoPreviewSource,
155 │ mediaVideoPreviewUri,
· ──────────┬─────────
· ╰── 'mediaVideoPreviewUri' is imported here
156 │ mediaVideoThumbnailKey,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'mediaVideoThumbnailKey' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:156:3]
155 │ mediaVideoPreviewUri,
156 │ mediaVideoThumbnailKey,
· ───────────┬──────────
· ╰── 'mediaVideoThumbnailKey' is imported here
157 │ type MediaVideoPreviewSource,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Type 'MediaVideoPreviewSource' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:157:8]
156 │ mediaVideoThumbnailKey,
157 │ type MediaVideoPreviewSource,
· ───────────┬───────────
· ╰── 'MediaVideoPreviewSource' is imported here
158 │ } from "../../lib/videoPreviewSource";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Type 'ReviewDiffTheme' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:165:15]
164 │ import { parseReviewCommentMessageSegments } from "../review/reviewCommentSelection";
165 │ import type { ReviewDiffTheme } from "../review/shikiReviewHighlighter";
· ───────┬───────
· ╰── 'ReviewDiffTheme' is imported here
166 │ import {
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownFontSizes' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:180:3]
179 │ import {
180 │ resolveMarkdownFontSizes,
· ────────────┬───────────
· ╰── 'resolveMarkdownFontSizes' is imported here
181 │ resolveNativeMarkdownTypography,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'markdownLinkIconSource' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:185:10]
184 │ import { PierreEntryIcon } from "../../components/PierreEntryIcon";
185 │ import { markdownLinkIconSource } from "../../lib/markdownLinkIcons";
· ───────────┬──────────
· ╰── 'markdownLinkIconSource' is imported here
186 │ import {
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownInlineCodePresentation' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:188:3]
187 │ normalizeNativeMarkdownUrl,
188 │ resolveMarkdownInlineCodePresentation,
· ──────────────────┬──────────────────
· ╰── 'resolveMarkdownInlineCodePresentation' is imported here
189 │ resolveMarkdownLinkIcon,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'resolveMarkdownLinkIcon' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:189:3]
188 │ resolveMarkdownInlineCodePresentation,
189 │ resolveMarkdownLinkIcon,
· ───────────┬───────────
· ╰── 'resolveMarkdownLinkIcon' is imported here
190 │ resolveMarkdownLinkPresentation,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'useMarkdownCodeHighlight' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:228:10]
227 │ import { ThreadMcpApp } from "./McpAppWebView";
228 │ import { useMarkdownCodeHighlight } from "./markdownCodeHighlightState";
· ────────────┬───────────
· ╰── 'useMarkdownCodeHighlight' is imported here
229 │ import {
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'useAssetUrlState' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:232:3]
231 │ useAssetUrl,
232 │ useAssetUrlState,
· ────────┬───────
· ╰── 'useAssetUrlState' is imported here
233 │ useRefreshAssetUrl,
╰────
help: Consider removing this import.
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2111:7]
2110 │ setExpandedFile(null);
2111 │ }, [props.environmentId, props.threadId, props.contentPresentation.kind]);
· ─────────┬───────── ───────┬────── ───────────────┬──────────────
· │ │ ╰── Unnecessary dependency `props.contentPresentation.kind`
· │ ╰── Unnecessary dependency `props.threadId`
· ╰── Unnecessary dependency `props.environmentId`
2112 │ const horizontalPadding = props.layoutVariant === "split" ? 20 : 16;
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2578:7]
2577 │ reportHeaderMaterialVisibility(false);
2578 │ }, [feedThreadKey, reportHeaderMaterialVisibility]);
· ──────┬──────
· ╰── Unnecessary dependency `feedThreadKey`
2579 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2594:7]
2593 │ }
2594 │ }, [listMountKey, props.contentInsetEndAdjustment, listRef]);
· ──────┬─────
· ╰── Unnecessary dependency `listMountKey`
2595 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:2751:7]
2750 │ }
2751 │ }, [expandedTurnIds, expandedWorkGroups, expandedWorkRows, settleDisclosureAfterLayout]);
· ───────┬─────── ─────────┬──────── ────────┬───────
· │ │ ╰── Unnecessary dependency `expandedWorkRows`
· │ ╰── Unnecessary dependency `expandedWorkGroups`
· ╰── Unnecessary dependency `expandedTurnIds`
2752 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(memo-dependencies): Found extra memoization dependencies
╭─[apps/mobile/src/features/threads/ThreadFeed.tsx:603:9]
602 │ };
603 │ }, [props.environmentId, attachment.id, httpBaseUrl]),
· ─────────┬───────── ──────┬────── ─────┬─────
· │ │ ╰── Unnecessary dependency `httpBaseUrl`
· │ ╰── Unnecessary dependency `attachment.id`
· ╰── Unnecessary dependency `props.environmentId`
604 │ );
╰────
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
⚠ typescript(no-extraneous-class): Unexpected class with only a constructor.
╭─[apps/desktop/src/preview/Manager.test.ts:158:18]
157 │ BrowserWindow: browserWindowConstructor,
158 │ ╭─▶ ClipboardItem: class {
159 │ │ constructor(data: Record<string, unknown>) {
160 │ │ clipboardItemConstructor(data);
161 │ │ }
162 │ ╰─▶ },
163 │ clipboard: {
╰────
help: Try replacing this class with a standalone function or deleting it entirely
⚠ react(purity): Cannot call impure function during render
╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:697:76]
696 │ const [snoozeGateClock, setSnoozeGateClock] = useState(() => ({ thread, now: Date.now() }));
697 │ if (snoozeGateClock.thread !== thread) setSnoozeGateClock({ thread, now: Date.now() });
· ─────┬────
· ╰── Cannot call impure function
698 │ const snoozeGateNow = new Date(snoozeGateClock.now).toISOString();
╰────
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(purity): Cannot call impure function during render
╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:718:71]
717 │ const snoozePresets = useMemo(
718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
· ─────┬────
· ╰── Cannot call impure function
719 │ [props.snoozePresetMinute, swipeActions.secondary],
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(memo-dependencies): Found extra memoization dependencies
╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:719:6]
718 │ () => (swipeActions.secondary === "snooze" ? resolveSnoozePresets(new Date()) : ([] as const)),
719 │ [props.snoozePresetMinute, swipeActions.secondary],
· ────────────┬───────────
· ╰── Unnecessary dependency `props.snoozePresetMinute`
720 │ );
╰────
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(memo-dependencies): Found extra memoization dependencies
╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:765:7]
764 │ thread.pinnedAt,
765 │ variant,
· ───┬───
· ╰── Unnecessary dependency `variant`
766 │ ],
╰────
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
╭─[apps/mobile/src/features/threads/thread-list-v2-items.tsx:1215:21]
1214 │ {providerDrivers.slice(0, -1).map((driver, index) => (
1215 │ <View key={`${driver}:${index}`} className="-mr-1 opacity-30">
· ──────────────────────────
1216 │ <ProviderIcon provider={driver} size={12} />
╰────
help: Use a unique data-dependent key to avoid unnecessary rerenders
⚠ 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
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/components/MediaVideoPlayer.tsx:60:5]
57 │
58 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
59 │ const controller = new AbortController();
60 │ setLoadState("pending");
· ──────┬─────
· ╰── Avoid calling setState() directly within an effect
61 │ // A renewed signature is used on Retry, not as a reason to reset the native player.
╰────
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/components/MediaVideoPlayer.tsx:71:7]
70 │ return () => controller.abort();
71 │ }, [player, props.playRequested, attempt]);
· ───┬── ─────────┬───────── ───┬───
· │ │ ╰── Unnecessary dependency `attempt`
· │ ╰── Unnecessary dependency `props.playRequested`
· ╰── Unnecessary dependency `player_0`
72 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/components/CommandPalette.tsx:1996:20]
1995 │ title: inferProjectTitleFromPath(destinationPath),
1996 │ createdAt: new Date().toISOString(),
· ─────┬────
· ╰── Cannot call impure function
1997 │ remoteUrl: addProjectCloneFlow.remoteUrl,
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:372:47]
371 │ const { open, onOpenChange, onSnooze, timestampFormat } = props;
372 │ const presets = open ? resolveSnoozePresets(new Date(), timestampFormat) : [];
· ─────┬────
· ╰── Cannot call impure function
373 │ return (
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/components/sidebar/SidebarThreadRow.tsx:853:39]
852 │ if (snoozeGateClock.thread !== thread) {
853 │ setSnoozeGateClock({ thread, now: new Date().toISOString() });
· ─────┬────
· ╰── Cannot call impure function
854 │ }
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/components/ProjectFavicon.tsx:158:5]
153 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState<typeof faviconRequest>(null);
154 │ useLayoutEffect(() => {
· ───────┬───────
· ╰── This is the containing effect
155 │ if (faviconRequest === null) return;
156 │
157 │ const endRequest = beginProjectFaviconRequest(faviconRequest);
158 │ setActiveFaviconRequest(faviconRequest);
· ───────────┬───────────
· ╰── Avoid calling setState() directly within an effect
159 │ return endRequest;
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(purity): Cannot call impure function during render
╭─[apps/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
⚠ 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.
⚠ unicorn(prefer-add-event-listener): Prefer `addEventListener()` over their `on`-function counterparts.
╭─[apps/web/src/components/device/deviceHubApi.test.ts:12:14]
11 │ addEventListener(_type: string, listener: (event: { data: string }) => void) {
12 │ this.onmessage = listener;
· ─────────
13 │ }
╰────
help: `addEventListener()` can register multiple handlers and accepts options such as `{ once: true }`; assigning to `on<event>` replaces any previously registered handler.
⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
╭─[apps/web/src/components/device/deviceHubApi.test.ts:16:9]
15 │ constructor() {
16 │ source = this;
· ──────
17 │ }
╰────
help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well.
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:152:27]
151 │ <View ref={anchorRef} collapsable={false} className={props.className} style={props.style}>
152 │ {props.children(open)}
· ──┬─
· ╰── Cannot access ref value during render
153 │ </View>
╰────
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(memo-dependencies): Found missing/extra memoization dependencies
╭─[apps/mobile/src/components/ui/AndroidAnchoredMenu.tsx:140:9]
139 │ if (action.id !== undefined) {
140 │ props.onPressAction?.({
· ──┬──
· ╰── Missing dependency `props`
141 │ nativeEvent: { event: action.id },
142 │ } as Parameters<NonNullable<MenuComponentProps["onPressAction"]>>[0]);
143 │ }
144 │ },
145 │ [close, props.onPressAction],
· ─────────┬─────────
· ╰── Overly precise dependency `props.onPressAction`, use `props` instead
146 │ );
╰────
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI. 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): 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.
⚠ eslint(no-unused-vars): Type 'ThreadRunSummary' is imported but never used.
╭─[apps/web/src/types.ts:22:3]
21 │ EnvironmentThreadShell,
22 │ ThreadRunSummary,
· ────────┬───────
· ╰── 'ThreadRunSummary' is imported here
23 │ ThreadRuntimeSummary,
╰────
help: Consider removing this import.
⚠ react(capitalized-calls): Capitalized function called without JSX
╭─[apps/mobile/src/lib/useHoverGesture.ts:8:15]
7 │ () =>
8 │ Gesture.Hover()
· ──┬──
· ╰── `Hover` may be a component
9 │ .manualActivation(true)
╰────
help: Render `Hover` with JSX if it is a component; otherwise rename it to start with a lowercase letter or allowlist it in the compiler configuration
note: `Hover` is treated as a component because it begins with an uppercase letter; React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:229:6]
225 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
226 │ nativeEventSnapshotsRef.current,
· ───────────┬───────────
· ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
227 │ mostRecentEventCount,
228 │ );
229 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
· ──────────────────────────┬──────────────────────────
· ╰── This dependency list is missing values used by the callback
230 │ const assumedValue = props.value;
╰────
help: Missing dependencies can cause an effect to fire less often than it should
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:237:7]
236 │ nativeEventSnapshotsRef.current = assumeComposerControlledState(
237 │ nativeEventSnapshotsRef.current,
· ───────────┬───────────
· ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
238 │ controlledEventCount,
239 │ assumedValue,
240 │ );
241 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
· ───────────┬──────────
· ╰── Unnecessary dependency `controlledDocumentJson`
242 │ const acceptNativeEvent = useCallback(
╰────
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/native/T3ComposerEditor.ios.tsx:162:29]
161 │ const tokens = collectComposerInlineTokens(props.value, {
162 │ preserveTrailingFrom: confirmedTokensRef.current,
· ─────────────┬────────────
· ╰── Cannot access ref value during render
163 │ });
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:162:29]
161 │ const tokens = collectComposerInlineTokens(props.value, {
162 │ preserveTrailingFrom: confirmedTokensRef.current,
· ─────────────┬────────────
· ╰── Passing a ref to a function may read its value during render
163 │ });
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:164:23]
163 │ });
164 │ confirmedTokensRef.current = tokens;
· ─────────┬────────────┬───
· │ ╰── Cannot update ref value during render
· ╰── This value is a ref
165 │ return JSON.stringify(
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:206:5]
205 │ mostRecentEventCount,
206 │ nativeEventSnapshotsRef.current,
· ───────────────┬───────────────
· ╰── Passing a ref to a function may read its value during render
207 │ );
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:212:5]
211 │ mostRecentEventCount,
212 │ nativeEventSnapshotsRef.current,
· ───────────────┬───────────────
· ╰── Passing a ref to a function may read its value during render
213 │ );
╰────
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(memo-dependencies): Found missing memoization dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:197:6]
161 │ const tokens = collectComposerInlineTokens(props.value, {
162 │ preserveTrailingFrom: confirmedTokensRef.current,
· ─────────┬────────
· ╰── Missing dependency `confirmedTokensRef`. 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
163 │ });
164 │ confirmedTokensRef.current = tokens;
165 │ return JSON.stringify(
166 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
167 │ const record =
168 │ token.type === "context"
169 │ ? props.context?.records.find((record) => record.contextId === token.contextId)
170 │ : undefined;
171 │ const presentation = contextChipPresentation(
172 │ token.type === "context" ? token.kind : token.type,
173 │ record,
174 │ );
175 │ const icon = contextChipIcon(
176 │ presentation,
177 │ token.type === "mention" ? token.value : contextRecordFileName(record),
178 │ );
179 │ return {
180 │ type: token.type,
181 │ source: token.source,
182 │ start: token.start,
183 │ end: token.end,
184 │ accent: presentation.accent,
185 │ label:
186 │ token.type === "skill"
187 │ ? (skillLabels.get(token.value) ?? token.value)
188 │ : token.type === "context"
189 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}`
190 │ : basename(token.value),
191 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
192 │ iconUri: contextChipIconUri(icon),
193 │ tintsIcon: icon.kind === "chip",
194 │ };
195 │ }),
196 │ );
197 │ }, [props.value, props.context, skillLabels]);
· ────────────────────┬────────────────────
· ╰── This dependency list is missing values used by the callback
198 │ // Every render resolves against the snapshot history, so a render whose
╰────
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(memo-dependencies): Found missing memoization dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:259:5]
251 │ mostRecentEventCountRef.current = acknowledgedEventCount;
252 │ nativeEventSnapshotsRef.current.push({
· ───────────┬───────────
· ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
253 │ eventCount: acknowledgedEventCount,
254 │ value,
255 │ selection: nextSelection,
256 │ });
257 │ return acknowledgedEventCount;
258 │ },
259 │ [],
· ─┬
· ╰── This dependency list is missing values used by the callback
260 │ );
╰────
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
⚠ 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(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/components/ComposerEditor.tsx:82:6]
81 │ },
82 │ [draftKey],
· ────┬───
· ╰── Unnecessary dependency `draftKey`
83 │ );
╰────
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/components/ui/Menu.tsx:54:36]
53 │ const child = children as ReactElement<Pick<PressableProps, "onTouchStart" | "onPress">>;
54 │ ╭─▶ children = cloneElement(child, {
55 │ │ onTouchStart: (event) => {
56 │ │ // Reset for a new touch, not onPressIn, which also fires when a
57 │ │ // finger moves out of the row and back during the same gesture.
58 │ │ menuPress.current.isPreparing = false;
59 │ │ menuPress.current.suppressPress = menuPress.current.isOpen;
60 │ │ pendingPress.current = null;
61 │ │ child.props.onTouchStart?.(event);
62 │ │ },
63 │ │ onPress: (event) => {
64 │ │ // Accessibility clicks have no touch identifier and must not inherit
65 │ │ // cancellation from a previous physical gesture.
66 │ │ const isTouch = typeof event.nativeEvent.identifier === "number";
67 │ │ if (isTouch ? menuPress.current.suppressPress : menuPress.current.isOpen) {
68 │ │ return;
69 │ │ }
70 │ │ if (isTouch && menuPress.current.isPreparing) {
71 │ │ // A release can arrive between native menu preparation and display.
72 │ │ // Let UIKit's display/cancel callback decide this press's outcome.
73 │ │ event.persist();
74 │ │ pendingPress.current = () => child.props.onPress?.(event);
75 │ │ return;
76 │ │ }
77 │ │ child.props.onPress?.(event);
78 │ │ },
79 │ ├─▶ });
· ╰──── Passing a ref to a function may read its value during render
80 │ menuProps.onMenuInteractionStart = () => {
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:57:5]
55 │
56 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
57 │ setDecodedSize(null);
· ───────┬──────
· ╰── Avoid calling setState() directly within an effect
58 │ }, [props.sourceKey]);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:61:5]
59 │
60 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
61 │ setFailedUri(null);
· ──────┬─────
· ╰── Avoid calling setState() directly within an effect
62 │ }, [props.uri]);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ eslint(no-unused-vars): Identifier 'ActivityIndicator' is imported but never used.
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:7:10]
6 │ import { parse, SvgAst, type JsxAST } from "react-native-svg";
7 │ import { ActivityIndicator, Pressable, StyleSheet, View, type ViewStyle } from "react-native";
· ────────┬────────
· ╰── 'ActivityIndicator' is imported here
8 │
╰────
help: Consider removing this import.
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:58:7]
57 │ setDecodedSize(null);
58 │ }, [props.sourceKey]);
· ───────┬───────
· ╰── Unnecessary dependency `props.sourceKey`
59 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadMarkdownImage.tsx:62:7]
61 │ setFailedUri(null);
62 │ }, [props.uri]);
· ────┬────
· ╰── Unnecessary dependency `props.uri`
63 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/components/chat/useThreadLifecycle.tsx:178:58]
177 │ if (snoozeClockState.shell !== activeThreadShell) {
178 │ setSnoozeClockState({ shell: activeThreadShell, now: new Date().toISOString() });
· ─────┬────
· ╰── Cannot call impure function
179 │ }
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/components/VideoPreviewModal.tsx:68:5]
66 │ const { id: attachmentId, fileUri } = attachment;
67 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
68 │ setUri(null);
· ───┬──
· ╰── Avoid calling setState() directly within an effect
69 │ setError(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/components/VideoPreviewModal.tsx:91:7]
90 │ };
91 │ }, [attachmentId, fileUri]);
· ──────┬───── ───┬───
· │ ╰── Unnecessary dependency `fileUri`
· ╰── Unnecessary dependency `attachmentId`
92 │ const mimeType = videoMimeType(attachment) ?? attachment.mimeType;
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
╭─[apps/mobile/src/components/VideoPreviewModal.tsx:213:34]
212 │ useEffect(() => {
213 │ if (!isFocused && hasSource) props.onRequestClose();
· ──┬──
· ╰── Missing dependency `props`
214 │ }, [isFocused, hasSource, props.onRequestClose]);
· ──────────┬─────────
· ╰── Overly precise dependency `props.onRequestClose`, use `props` instead
215 │ const { source } = props;
╰────
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(no-array-index-key): Usage of Array index in keys is not allowed
╭─[apps/mobile/src/components/ComposerContextSheet.tsx:267:25]
266 │ {record.elements?.map((element, index) => (
267 │ <View key={`${element.selector ?? element.tagName}:${index}`} className="gap-3">
· ───────────────────────────────────────────────────────
268 │ <ContextField
╰────
help: Use a unique data-dependent key to avoid unnecessary rerenders
⚠ 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/components/VideoPreviewModal.ios.tsx:63:55]
61 │ }, []);
62 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
63 │ if (playbackUrl === null && resolvedUrl !== null) setPlaybackUrl(resolvedUrl);
· ───────┬──────
· ╰── Avoid calling setState() directly within an effect
64 │ }, [playbackUrl, resolvedUrl]);
╰────
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
Found 0 errors and 362 warnings in 5399 files (5.9s, 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=__0bd4640d-a8ec-4f83-94e7-ab63db728c64.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-2baa264059789b1dde4bbc8fdc5b8342f31f2fc8e6176e5c5e486efdd242b36c, not saving cache.
##[end-action id=__0bd4640d-a8ec-4f83-94e7-ab63db728c64.__actions_cache;outcome=success;conclusion=success;duration_ms=107]
##[start-action display=Cache Vite+;id=__0bd4640d-a8ec-4f83-94e7-ab63db728c64.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=__0bd4640d-a8ec-4f83-94e7-ab63db728c64.vp_cache;outcome=success;conclusion=success;duration_ms=71]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/8cba991d-d5fe-4de1-b661-1d9fe3412dd9' 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: 256
BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 372
BLACKSMITH_CHECK_RUN_ID: 120621802502
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