GitHub check
256 KB of 603 KB loaded Download the full log (603 KB)
347 KB of earlier output not loaded
10-24T22:24:37.0021434Z 208 │ if (state.phase !== "preparing" && state.phase !== "recording") return;
209 │
210 │ if (audioLevelsRef.current.some((level) => level !== 0)) {
211 │ audioLevelsRef.current = Array<number>(VOICE_WAVEFORM_SAMPLE_COUNT).fill(0);
212 │ audioLevels.value = audioLevelsRef.current;
· ─────┬─────
· ╰── This modifies `audioLevels`
213 │ }
╰────
help: This argument is a function which may reassign or mutate `audioLevels` after render, which can cause inconsistent behavior on subsequent renders. Consider using state instead
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/voice-input/GlobalVoiceInputControl.tsx:68:5]
65 │ const [expanded, setExpanded] = useState(false);
66 │ const progress = useSharedValue(0);
· ────┬───
· ╰── `progress` originates here
67 │ useEffect(() => {
68 │ progress.value = withTiming(expanded ? 1 : 0, MORPH_TIMING);
· ────┬───
· ╰── `progress` cannot be modified
69 │ }, [expanded, progress]);
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/state/thread-order.ts:29:7]
28 │ getPendingThreadOrder();
29 │ }, [nowMinute, snoozeWakeTick]);
· ────┬──── ───────┬──────
· │ ╰── Unnecessary dependency `snoozeWakeTick`
· ╰── Unnecessary dependency `nowMinute`
30 │ return pending;
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
╭─[apps/mobile/src/state/use-model-option-memory.ts:21:7]
20 │ [instanceId]: {
21 │ ...(state[instanceId] ?? {}),
· ────────────────────────────
22 │ [model]: options,
╰────
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
⚠ react(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
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:123:7]
118 │
119 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
120 │ if (orientationSettled) return;
121 │ const orientation = getNativeShowcaseOrientation();
122 │ if (orientation === null) {
123 │ setOrientationSettled(true);
· ──────────┬──────────
· ╰── Avoid calling setState() directly within an effect
124 │ return;
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:304:7]
292 │
293 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
294 │ if (
295 │ scene === null ||
296 │ requestedScene === null ||
297 │ scene !== requestedScene ||
298 │ !hasFixture ||
299 │ !orientationSettled ||
300 │ !themeApplied ||
301 │ (scene === "agent-activity" && !agentActivityStaged) ||
302 │ !isShowcaseNativeContentReady({ scene, themeId, renderSignal })
303 │ ) {
304 │ setReadyScene(null);
· ──────┬──────
· ╰── Avoid calling setState() directly within an effect
305 │ return;
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ eslint(no-unused-vars): Variable 'lastOutcome' is declared but never used. Unused variables should start with a '_'.
╭─[apps/mobile/src/features/showcase/ShowcaseCaptureCoordinator.tsx:128:9]
127 │ let cancelled = false;
128 │ let lastOutcome: string | null = null;
· ─────┬─────
· ╰── 'lastOutcome' is declared here
129 │ void retryShowcaseOperation(async () => applyNativeShowcaseOrientation(orientation), {
╰────
help: Consider removing this declaration.
⚠ react(no-unstable-nested-components): Do not define components during render.
╭─[apps/mobile/src/Stack.tsx:1079:21]
1078 │ <Navigator
1079 │ screenLayout={(props) => <GuardedScreenLayout {...props} />}
· ─────────────────────────────────────────────
1080 │ screenOptions={({ route }) =>
╰────
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.
⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
╭─[apps/web/src/components/settings/SettingInheritance.tsx:163:24]
162 │ keys,
163 │ overridingProjects = [],
· ──
164 │ onClearOverrides,
╰────
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
⚠ react(memo-dependencies): Found extra memoization dependencies
╭─[apps/mobile/src/features/keyboard/HardwareKeyboardCommandProvider.tsx:116:34]
115 │ return [...commands];
116 │ }, [activeThreadRef, pathname, registrationVersion, navigation]);
· ─────────┬─────────
· ╰── Unnecessary dependency `registrationVersion`
117 │
╰────
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ eslint(no-control-regex): Unexpected control character
╭─[apps/mobile/src/features/settings/SettingsProviderAccountsRouteScreen.tsx:220:46]
219 │ <Text selectable className="font-mono text-sm text-foreground">
220 │ {interaction.output.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "")}
· ──┬─
· ╰── 'U+001B' is a control character.
221 │ </Text>
╰────
help: Avoid matching control characters in regular expressions. If intentional, disable this rule for the expression.
⚠ eslint(no-unused-vars): Variable 'layerDaemon' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/orchestration-v2/EffectWorker.ts:914:7]
913 │
914 │ const layerDaemon: Layer.Layer<never, never, OrchestrationEffectWorkerV2> = Layer.effectDiscard(
· ─────┬─────
· ╰── 'layerDaemon' is declared here
915 │ runDaemon.pipe(Effect.forkScoped),
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:555:70]
554 │ assert.deepStrictEqual(
555 │ (yield* Ref.get(fixture.syncCommands)).map(({ commandId: _, ...rest }) => rest),
· ┬
· ╰── '_' is declared here
556 │ [
╰────
help: Consider removing this parameter.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts:1155:70]
1154 │ assert.deepStrictEqual(
1155 │ (yield* Ref.get(fixture.linkCommands)).map(({ commandId: _, ...rest }) => rest),
· ┬
· ╰── '_' is declared here
1156 │ [
╰────
help: Consider removing this parameter.
⚠ unicorn(no-new-array): Do not use `new Array(singleArgument)`.
╭─[apps/web/src/terminal/ghostty/core.ts:194:19]
193 │ const count = Math.min(CHUNK_SIZE, graphemeLength - start);
194 │ const codes = new Array<number>(count);
· ────────────────────────
195 │ for (let index = 0; index < count; index += 1) {
╰────
help: It's not clear whether the argument is meant to be the length of the array or the only element. If the argument is the array's length, consider using `Array.from({ length: n })`. If the argument is the only element, use `[element]`.
⚠ 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
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[packages/effect-acp/src/client.ts:1269:11]
1268 │ extNotificationHandlers.set(CLIENT_METHODS.mcp_message, (params) =>
1269 │ Schema.decodeUnknownEffect(AcpSchemaV2.MessageMcpNotification)(params).pipe(
· ──────────────────────────
1270 │ Effect.mapError(() => AcpError.AcpRequestError.invalidParams()),
╰────
⚠ typescript(no-this-alias): Unexpected aliasing of 'this' to local variable.
╭─[apps/web/src/contextMenuFallback.test.ts:38:9]
37 │ get isConnected() {
38 │ let current: FakeElement | null = this;
· ───────
39 │ while (current?.parent) {
╰────
help: Assigning a variable to this instead of properly using arrow lambdas may be a symptom of pre-ES2015 practices or not managing scope well.
⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
╭─[apps/mobile/src/features/terminal/TerminalContextSheet.tsx:72:15]
71 │ <Pressable
72 │ key={index}
· ───────────
73 │ accessibilityRole="button"
╰────
help: Use a unique data-dependent key to avoid unnecessary rerenders
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/terminal/terminalLaunchContext.ts:117:5]
112 │ const [entry, setEntry] = useState(() => ({ key: input.targetKey, location: candidate }));
113 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
114 │ if (entry.key === input.targetKey && (entry.location !== null || candidate === null)) {
115 │ return;
116 │ }
117 │ setEntry({ key: input.targetKey, location: candidate });
· ────┬───
· ╰── Avoid calling setState() directly within an effect
118 │ }, [candidate, entry.key, entry.location, input.targetKey]);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(memo-dependencies): Found extra memoization dependencies
╭─[apps/mobile/src/features/settings/scheduled-task-editor.tsx:100:85]
99 │ const startEditor = startScheduledTaskEditor;
100 │ const resetEditor = useCallback(() => startEditor(defaultEditor), [defaultEditor, startEditor]);
· ─────┬─────
· ╰── Unnecessary dependency `startEditor`
101 │ const readEditor = useCallback(
╰────
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/settings/scheduled-task-editor.tsx:121:7]
120 │ setEditor,
121 │ startEditor,
· ─────┬─────
· ╰── Unnecessary dependency `startEditor`
122 │ hasChanges,
╰────
help: Extra dependencies can cause a value to update more often than it should, resulting in performance problems such as excessive renders or effects firing too often
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:119:10]
117 │
118 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
119 │ void refreshNotifications();
· ──────────┬─────────
· ╰── Avoid calling setState() directly within an effect
120 │ const subscription = AppState.addEventListener("change", (state) => {
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/settings/SettingsNotificationsRouteScreen.tsx:128:7]
125 │
126 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
127 │ if (!isLoaded) {
128 │ setLiveActivityStatus("checking");
· ──────────┬──────────
· ╰── Avoid calling setState() directly within an effect
129 │ return;
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ eslint(no-unused-vars): Identifier 'HookForwarder' is imported but never used.
╭─[infra/relay/src/http/Api.ts:69:13]
68 │ import * as EnvironmentLinks from "../environments/EnvironmentLinks.ts";
69 │ import * as HookForwarder from "../hooks/HookForwarder.ts";
· ──────┬──────
· ╰── 'HookForwarder' is imported here
70 │ import * as HeldHooks from "../hooks/HeldHooks.ts";
╰────
help: Consider removing this import.
⚠ unicorn(no-useless-fallback-in-spread): Empty fallbacks in spreads are unnecessary
╭─[apps/mobile/src/state/use-composer-drafts.ts:1022:15]
1021 │ instanceId,
1022 │ { ...(persisted.modelOptionMemory[instanceId] ?? {}), ...models },
· ──────────────────────────────────────────────────
1023 │ ]),
╰────
help: Spreading falsy values in object literals won't add any unexpected properties, so it's unnecessary to add an empty object as fallback.
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:79:5]
76 │
77 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
78 │ const { host, code } = parsePairingUrl(connectionPairingUrl);
79 │ setHostInput(host);
· ──────┬─────
· ╰── Avoid calling setState() directly within an effect
80 │ setCodeInput(code);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:89:5]
82 │
83 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
84 │ if (routePairingUrl.length === 0) {
85 │ return;
86 │ }
87 │
88 │ const { host, code } = parsePairingUrl(routePairingUrl);
89 │ setHostInput(host);
· ──────┬─────
· ╰── Avoid calling setState() directly within an effect
90 │ setCodeInput(code);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/connection/ConnectionsNewRouteScreen.tsx:95:7]
92 │
93 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
94 │ if (pairingConnectionError) {
95 │ setIsSubmitting(false);
· ───────┬───────
· ╰── Avoid calling setState() directly within an effect
96 │ }
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:643:5]
638 │
639 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
640 │ if (pendingLaunchEntry.key === launchTargetKey) {
641 │ return;
642 │ }
643 │ setPendingLaunchEntry({
· ──────────┬──────────
· ╰── Avoid calling setState() directly within an effect
644 │ key: launchTargetKey,
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:653:5]
648 │
649 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
650 │ if (initialAttachGridEntry.key === launchTargetKey) {
651 │ return;
652 │ }
653 │ setInitialAttachGridEntry({
· ────────────┬────────────
· ╰── Avoid calling setState() directly within an effect
654 │ key: launchTargetKey,
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:746:7]
743 │
744 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
745 │ if (!routeEnvironmentId || !routeThreadId) {
746 │ setLastGridSize({
· ───────┬───────
· ╰── Avoid calling setState() directly within an effect
747 │ cols: DEFAULT_TERMINAL_COLS,
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:538:24]
537 │ });
538 │ }, [terminal.buffer, terminal.buffer.length, terminalKey]);
· ───────────┬──────────
· ╰── Overly precise dependency `terminal.buffer.length`, use `terminal.buffer` instead
539 │ const cwd = terminal.summary?.cwd ?? selectedThreadProject?.workspaceRoot ?? null;
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:709:7]
708 │ sentInitialInputKeyRef.current = null;
709 │ }, [terminalKey]);
· ─────┬─────
· ╰── Unnecessary dependency `terminalKey`
710 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found extra effect dependencies
╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:800:52]
799 │ };
800 │ }, [canOperateTerminal, isRunning, pasteSession, terminal.lifecycleVersion, terminalKey]);
· ────────────┬──────────── ─────┬─────
· │ ╰── Unnecessary dependency `terminalKey`
· ╰── Unnecessary dependency `terminal.lifecycleVersion`
801 │
╰────
help: Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx:793:24]
792 │ }
793 │ const pasteSession = pasteSessionRef.current;
· ───────────┬───────────
· ╰── Cannot access ref value during render
794 │
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(static-components): Cannot create components during render
╭─[apps/mobile/src/features/terminal/NativeTerminalSurface.tsx:234:10]
196 │ const { onInput, onResize } = props;
197 │ const NativeTerminalSurfaceView = resolveNativeTerminalSurfaceView();
· ────────────────┬───────────────
· ╰── The component is created during render here
198 │ const hasNativeSurface = Boolean(NativeTerminalSurfaceView);
199 │
200 │ useEffect(() => {
201 │ terminalDebugLog("native:surface", {
202 │ terminalKey: props.terminalKey,
203 │ native: hasNativeSurface,
204 │ hardwareKeyRevision: getNativeTerminalHardwareKeyRevision(),
205 │ bufferLen: props.buffer.length,
206 │ isRunning: props.isRunning,
207 │ });
208 │ }, [hasNativeSurface, props.buffer.length, props.isRunning, props.terminalKey]);
209 │ const handleNativeInput = useCallback(
210 │ (event: NativeSyntheticEvent<TerminalInputEvent>) => {
211 │ if (!props.isRunning || props.readOnly) {
212 │ return;
213 │ }
214 │ terminalDebugLog("native:onInput", {
215 │ codes: Array.from(event.nativeEvent.data, (char) => char.codePointAt(0)),
216 │ });
217 │ onInput(event.nativeEvent.data);
218 │ },
219 │ [onInput, props.isRunning, props.readOnly],
220 │ );
221 │ const handleNativeResize = useCallback(
222 │ (event: NativeSyntheticEvent<TerminalResizeEvent>) => {
223 │ onResize({
224 │ cols: event.nativeEvent.cols,
225 │ rows: event.nativeEvent.rows,
226 │ });
227 │ },
228 │ [onResize],
229 │ );
230 │
231 │ if (NativeTerminalSurfaceView) {
232 │ return (
233 │ <View style={props.style}>
234 │ <NativeTerminalSurfaceView
· ────────────┬────────────
· ╰── This component is created during render
235 │ appearanceScheme={themeAppearance}
╰────
help: Components created during render will reset their state each time they are created. Declare components outside of render
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/static-components
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/connection/ConnectionStatusDot.tsx:58:7]
53 │ function usePulseAnimation(pulse: boolean) {
54 │ const pulseProgress = useSharedValue(0);
· ──────┬──────
· ╰── `pulseProgress` originates here
55 │
56 │ useEffect(() => {
57 │ if (pulse) {
58 │ pulseProgress.value = withRepeat(
· ──────┬──────
· ╰── `pulseProgress` cannot be modified
59 │ withTiming(1, {
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:566:7]
565 │ let afterSequence = created[0]!.sequence;
566 │ ╭─▶ for (let index = 1; index <= 32; index += 1) {
567 │ │ const nextEvent = {
568 │ │ id: EventId.make(`event:foundation-stream-race:${index}`),
569 │ │ type: "thread.metadata-updated" as const,
570 │ │ threadId,
571 │ │ providerInstanceId,
572 │ │ occurredAt: now,
573 │ │ payload: { ...thread, title: `Race update ${index}` },
574 │ │ } satisfies OrchestrationV2DomainEvent;
575 │ │ const reader = yield* eventSink
576 │ │ .stream({ threadId, afterSequence })
577 │ │ .pipe(Stream.runHead, Effect.forkChild);
578 │ │ yield* Effect.yieldNow;
579 │ │ const written = yield* eventSink.write({ events: [nextEvent] });
580 │ │ const received = yield* Fiber.join(reader);
581 │ │ if (Option.isNone(received)) {
582 │ │ return yield* Effect.die("The event stream ended before delivering the live event.");
583 │ │ }
584 │ │ assert.equal(received.value.sequence, written[0]?.sequence);
585 │ │ assert.equal(received.value.event.id, nextEvent.id);
586 │ │ afterSequence = received.value.sequence;
587 │ ╰─▶ }
588 │ }),
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/orchestration-v2/FoundationPersistence.test.ts:2327:9]
2326 │ let settled = false;
2327 │ ╭─▶ while (!settled) {
2328 │ │ settled = (yield* outbox.listByCommandId(commandId)).every(
2329 │ │ (effect) => effect.status === "succeeded",
2330 │ │ );
2331 │ │ if (!settled) yield* Effect.yieldNow;
2332 │ ╰─▶ }
2333 │ }).pipe(Effect.provide(layerWorker), Effect.scoped);
╰────
⚠ eslint(no-unused-vars): Variable 'layerUnavailable' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/orchestration-v2/Orchestrator.ts:12395:7]
12394 │
12395 │ const layerUnavailable: Layer.Layer<OrchestratorV2> = Layer.succeed(
· ────────┬───────
· ╰── 'layerUnavailable' is declared here
12396 │ OrchestratorV2,
╰────
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/NewTaskDraftRouteScreen.tsx:40:5]
37 │ const [initialized, setInitialized] = useState(false);
38 │ useLayoutEffect(() => {
· ───────┬───────
· ╰── This is the containing effect
39 │ reset();
40 │ setInitialized(true);
· ───────┬──────
· ╰── Avoid calling setState() directly within an effect
41 │ }, [reset]);
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/NewTaskDraftRouteScreen.tsx:93:5]
88 │
89 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
90 │ if (!needsPreparation || !initialProjectRef.branch || waitingForProject) return;
91 │ const branchName = initialProjectRef.branch;
92 │ let active = true;
93 │ setPendingCheckouts((count) => count + 1);
· ─────────┬─────────
· ╰── Avoid calling setState() directly within an effect
94 │ // Serialize replacements: ignoring a stale result cannot undo its Git mutation.
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ eslint(no-unused-vars): Function 'nonEmptyString' is declared but never used.
╭─[packages/client-runtime/src/work-log/presentation.ts:237:10]
236 │
237 │ function nonEmptyString(value: unknown): string | null {
· ───────┬──────
· ╰── 'nonEmptyString' is declared here
238 │ return typeof value === "string" && value.trim().length > 0 ? value : null;
╰────
help: Consider removing this declaration.
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:406:5]
404 │
405 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
406 │ setInspectorSelection((current) => {
· ──────────┬──────────
· ╰── Avoid calling setState() directly within an effect
407 │ if (props.renderInspector === undefined) {
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(no-unstable-nested-components): Do not define components during render.
╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:534:24]
533 │ const inspectorHeaderInset = Platform.OS === "ios" ? 0 : safeAreaInsets.top;
534 │ ╭─▶ const GitInspector = () => (
535 │ │ <GitOverviewSheet
536 │ │ headerInset={inspectorHeaderInset}
537 │ │ presentation="inspector"
538 │ │ route={{ params: { environmentId: environmentId!, threadId: threadId! } }}
539 │ │ />
540 │ ╰─▶ );
541 │ const FilesInspector = () =>
╰────
help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
⚠ react(no-unstable-nested-components): Do not define components during render.
╭─[apps/mobile/src/features/threads/ThreadRouteScreen.tsx:541:26]
540 │ );
541 │ ╭─▶ const FilesInspector = () =>
542 │ │ selectedThread !== null && selectedThreadCwd !== null ? (
543 │ │ <ThreadFileNavigatorPane
544 │ │ cwd={selectedThreadCwd}
545 │ │ environmentId={selectedThread.environmentId}
546 │ │ headerInset={inspectorHeaderInset}
547 │ │ projectName={selectedThreadProject?.title ?? "Files"}
548 │ │ selectedPath={null}
549 │ │ onSelectFile={handleSelectInspectorFile}
550 │ │ />
551 │ ╰─▶ ) : null;
552 │ const RouteInspector = () => props.renderInspector?.(inspectorHeaderInset);
╰────
help: Move this component definition out of the parent component `ThreadRouteContent` and pass data as props.
⚠ react(set-state-in-effect): Calling setState synchronously within an effect can trigger cascading renders
╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:333:7]
328 │ };
329 │ useEffect(() => {
· ────┬────
· ╰── This is the containing effect
330 │ if (!guidesEnabled && section === "guide") {
331 │ requestedSection.current = "overview";
332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
333 │ setSection("overview");
· ─────┬────
· ╰── Avoid calling setState() directly within an effect
334 │ }
╰────
help: Effects should synchronize React with external systems. Calling setState synchronously inside an effect starts another render and is usually unnecessary. Derive the value during render, initialize state directly, or update it from the event that caused the change. Use an effect only when synchronizing with an external system.
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/set-state-in-effect
⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:335:6]
330 │ if (!guidesEnabled && section === "guide") {
331 │ requestedSection.current = "overview";
· ────────┬───────
· ╰── Missing dependency `requestedSection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
332 │ currentScrollOffset.current = scrollOffsets.current.overview ?? -insets.top;
· ─────────┬───────── ──────┬──────
· │ ╰── Missing dependency `scrollOffsets`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
· ╰── Missing dependency `currentScrollOffset`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
333 │ setSection("overview");
334 │ }
335 │ }, [guidesEnabled, section, insets.top]);
· ──────────────────┬─────────────────
· ╰── This dependency list is missing values used by the callback
336 │ const tabContent = activityContent;
╰────
help: Missing dependencies can cause an effect to fire less often than it should
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
╭─[apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx:877:6]
860 │ if (
861 │ lastSelection.current.path === route.params.path &&
· ──────┬──────
· ╰── Missing dependency `lastSelection`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
862 │ lastSelection.current.id === route.params.fileSelectionId
863 │ )
864 │ return;
865 │ lastSelection.current = { path: route.params.path, id: route.params.fileSelectionId };
866 │ if (route.params.focus) navigation.setParams({ focus: undefined });
867 │ setJumpPath(route.params.path);
868 │ setSelectedRowId(null);
869 │ jumpStarted.current = false;
870 │ const file = data.files.find((entry) => entry.path === route.params.path);
871 │ if (!file || !nativeView.current) return;
· ─────┬────
· ╰── Missing dependency `nativeView`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
872 │ setCollapsedIds((ids) => ids.filter((id) => id !== file.id));
873 │ jumpStarted.current = true;
874 │ void nativeView.current.scrollToFile(file.id, false).catch(() => {
875 │ jumpStarted.current = false;
876 │ });
877 │ }, [route.params.path, route.params.fileSelectionId, route.params.focus, data.files, navigation]);
· ──────────────────────────────────────────────┬──────────────────────────────────────────────
· ╰── This dependency list is missing values used by the callback
878 │ const appliedFilter = useRef(filter.hideTestFiles);
╰────
help: Missing dependencies can cause an effect to fire less often than it should
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/hooks/useThreadActions.ts:821:56]
820 │ const resolved = resolveThreadTarget(target);
821 │ if (resolved && !canSnooze(resolved.thread, { now: new Date().toISOString() })) {
· ─────┬────
· ╰── Cannot call impure function
822 │ return AsyncResult.failure(
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/hooks/useThreadActions.ts:709:46]
708 │ const wokeAt = resolved
709 │ ? threadWokeAt(resolved.thread, { now: new Date().toISOString() })
· ─────┬────
· ╰── Cannot call impure function
710 │ : null;
╰────
help: `Date` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:773:7]
772 │ if (settingsSheetPresentation.isActive) {
773 │ settingsRoutePresentation.present(settingsRouteSession);
· ────────────┬────────────
· ╰── Missing dependency `settingsRoutePresentation`
774 │ }
775 │ }, [settingsRoutePresentation.present, settingsRouteSession, settingsSheetPresentation.isActive]);
· ────────────────┬────────────────
· ╰── Overly precise dependency `settingsRoutePresentation.present`, use `settingsRoutePresentation` instead
776 │
╰────
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(immutability): This value cannot be modified
╭─[apps/mobile/src/features/threads/ThreadComposer.tsx:391:5]
387 │ typeof props.style.borderRadius === "number" ? props.style.borderRadius : 0;
388 │ const animatedBorderRadius = useSharedValue(targetBorderRadius);
· ──────────┬─────────
· ╰── `animatedBorderRadius` originates here
389 │ const shouldAnimate = props.animateLayout !== false && Platform.OS !== "android";
390 │ useLayoutEffect(() => {
391 │ animatedBorderRadius.value = shouldAnimate
· ──────────┬─────────
· ╰── `animatedBorderRadius` cannot be modified
392 │ ? withTiming(targetBorderRadius, {
╰────
help: Modifying a value returned from a hook is not allowed. Consider moving the modification into the hook where the value is constructed
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/immutability
⚠ eslint(no-unsafe-optional-chaining): Unsafe usage of optional chaining
╭─[apps/server/src/orchestration-v2/ThreadLaunchService.test.ts:1783:8]
1782 │ assert.equal(
1783 │ (stored.context?.records[0] as { attachmentId: string }).attachmentId,
· ──────────────────────────
1784 │ stored.attachments[0]?.id,
╰────
help: If this short-circuits with 'undefined' the evaluation will throw TypeError
⚠ react(exhaustive-effect-dependencies): Found missing/extra effect dependencies
╭─[apps/mobile/src/features/threads/NewTaskContextPickerScreens.tsx:249:7]
248 │ mountedRef.current = false;
249 │ flow.setBranchQuery("");
· ──┬─
· ╰── Missing dependency `flow`
250 │ };
251 │ }, [flow.setBranchQuery]);
· ─────────┬─────────
· ╰── Overly precise dependency `flow.setBranchQuery`, use `flow` instead
252 │
╰────
help: Missing dependencies can cause an effect to fire less often than it should. Extra dependencies can cause an effect to fire more often than it should, resulting in performance problems such as excessive renders and side effects
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
╭─[packages/client-runtime/src/state/usageAccess.ts:3:8]
2 │ AuthDiagnosticsReadScope,
3 │ type AuthSessionState,
· ────────┬───────
· ╰── 'AuthSessionState' is imported here
4 │ sessionGrantsScope,
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): 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.
⚠ unicorn(prefer-array-find): Prefer `find` over filtering and accessing the first result.
╭─[packages/client-runtime/src/operations/projects.ts:238:51]
237 │ ): string {
238 │ const folderName = workspaceRoot.split(/[\\/]/).filter(Boolean).at(-1) ?? "";
· ──────
239 │ return target.owner ? `${target.owner}/${folderName}` : folderName;
╰────
help: Use `find(predicate)` instead of `filter(predicate)[0]` or similar patterns.
⚠ eslint(no-unused-vars): Parameter '_' is declared but never used.
╭─[packages/shared/src/qrCode.ts:458:44]
457 │ ): Array<byte> {
458 │ let result: Array<byte> = divisor.map((_) => 0);
· ┬
· ╰── '_' is declared here
459 │ for (const b of data) {
╰────
help: Consider removing this parameter.
⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:290:50]
289 │ return (
290 │ <ExistingThreadSettingsRouteContext.Provider value={value}>
· ─────────────
291 │ {props.children}
╰────
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:654:44]
653 │ return (
654 │ <ThreadSettingsSessionContext.Provider value={value}>
· ─────────────
655 │ {props.children}
╰────
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
⚠ react(jsx-no-constructed-context-values): The Context `value` prop should not be constructed.
╭─[apps/mobile/src/features/threads/ThreadSettingsSheet.tsx:1462:55]
1461 │ return (
1462 │ <ThreadSettingsPickerPresentationContext.Provider value={presentation}>
· ────────────────────
1463 │ <ThreadSettingsPickerStack.Navigator
╰────
help: Wrap the `value` prop in useMemo() or useCallback(), or use a constant value to prevent unnecessary re-renders.
Alternatively, move the value outside the render function if it doesn't depend on props or state.
⚠ eslint(no-unused-vars): Variable 'claudeCaps' is declared but never used. Unused variables should start with a '_'.
╭─[packages/shared/src/model.test.ts:36:7]
35 │
36 │ const claudeCaps: ModelCapabilities = createModelCapabilities({
· ─────┬────
· ╰── 'claudeCaps' is declared here
37 │ optionDescriptors: [
╰────
help: Consider removing this declaration.
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/connection/supervisor.test.ts:135:3]
134 │ let lastState = yield* SubscriptionRef.get(state);
135 │ ╭─▶ for (let iteration = 0; iteration < 100; iteration += 1) {
136 │ │ lastState = yield* SubscriptionRef.get(state);
137 │ │ if (predicate(lastState)) {
138 │ │ return lastState;
139 │ │ }
140 │ │ yield* Effect.yieldNow;
141 │ ╰─▶ }
142 │ return yield* Effect.die(
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/background/HostPowerMonitor.test.ts:133:11]
132 │ const monitor = yield* HostPowerMonitor.HostPowerMonitor;
133 │ ╭─▶ for (
134 │ │ let attempt = 0;
135 │ │ attempt < 100 && (yield* monitor.snapshot).onBattery !== "true";
136 │ │ attempt += 1
137 │ │ ) {
138 │ │ yield* Effect.yieldNow;
139 │ ╰─▶ }
140 │ expect((yield* monitor.snapshot).onBattery).toBe("true");
╰────
⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
╭─[apps/web/src/components/settings/ProviderSettingsPanel.logic.ts:4:8]
3 │ AuthProvidersManageScope,
4 │ type AuthSessionState,
· ────────┬───────
· ╰── 'AuthSessionState' is imported here
5 │ type EnvironmentId,
╰────
help: Consider removing this import.
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/StackHeader.tsx:185:9]
184 │ "options",
185 │ latestOptionFunctionsRef.current,
· ────────────────┬───────────────
· ╰── Passing a ref to a function may read its value during render
186 │ optionFunctionWrappersRef.current,
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ react(refs): Cannot access refs during render
╭─[apps/mobile/src/native/StackHeader.tsx:186:9]
185 │ latestOptionFunctionsRef.current,
186 │ optionFunctionWrappersRef.current,
· ────────────────┬────────────────
· ╰── Passing a ref to a function may read its value during render
187 │ ) as NativeStackNavigationOptions)
╰────
help: React refs are values that are not needed for rendering. Refs should only be accessed outside of render, such as in event handlers or effects. Accessing a ref value (the `current` property) during render can cause your component not to update as expected
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/refs
⚠ 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-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/project/ProjectEnrichmentService.test.ts:28:3]
27 │ ) {
28 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
29 │ │ const available = yield* service.peek(workspaceRoot);
30 │ │ if (predicate(available)) return available;
31 │ │ yield* Effect.yieldNow;
32 │ ╰─▶ }
33 │ return yield* Effect.die(`Project metadata for ${workspaceRoot} was not resolved in time.`);
╰────
⚠ 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(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.
⚠ react(exhaustive-effect-dependencies): Found missing effect dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:231:6]
227 │ nativeEventSnapshotsRef.current = pruneAcknowledgedComposerNativeEvents(
228 │ 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
229 │ mostRecentEventCount,
230 │ );
231 │ }, [acknowledgesLatestNativeEvent, mostRecentEventCount]);
· ──────────────────────────┬──────────────────────────
· ╰── This dependency list is missing values used by the callback
232 │ 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:239:7]
238 │ nativeEventSnapshotsRef.current = assumeComposerControlledState(
239 │ 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
240 │ controlledEventCount,
241 │ assumedValue,
242 │ );
243 │ }, [assumedValue, controlledEventCount, isNativeEcho, controlledDocumentJson]);
· ───────────┬──────────
· ╰── Unnecessary dependency `controlledDocumentJson`
244 │ 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:164:29]
163 │ const tokens = collectComposerInlineTokens(props.value, {
164 │ preserveTrailingFrom: confirmedTokensRef.current,
· ─────────────┬────────────
· ╰── Cannot access ref value during render
165 │ });
╰────
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:29]
163 │ const tokens = collectComposerInlineTokens(props.value, {
164 │ preserveTrailingFrom: confirmedTokensRef.current,
· ─────────────┬────────────
· ╰── Passing a ref to a function may read its value during render
165 │ });
╰────
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:166:23]
165 │ });
166 │ confirmedTokensRef.current = tokens;
· ─────────┬────────────┬───
· │ ╰── Cannot update ref value during render
· ╰── This value is a ref
167 │ 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:208:5]
207 │ mostRecentEventCount,
208 │ nativeEventSnapshotsRef.current,
· ───────────────┬───────────────
· ╰── Passing a ref to a function may read its value during render
209 │ );
╰────
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:214:5]
213 │ mostRecentEventCount,
214 │ nativeEventSnapshotsRef.current,
· ───────────────┬───────────────
· ╰── Passing a ref to a function may read its value during render
215 │ );
╰────
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:199:6]
163 │ const tokens = collectComposerInlineTokens(props.value, {
164 │ 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
165 │ });
166 │ confirmedTokensRef.current = tokens;
167 │ return JSON.stringify(
168 │ composerContextEditorTokens(props.value, tokens, skillLabels).map((token) => {
169 │ const record =
170 │ token.type === "context"
171 │ ? props.context?.records.find((record) => record.contextId === token.contextId)
172 │ : undefined;
173 │ const presentation = contextChipPresentation(
174 │ token.type === "context" ? token.kind : token.type,
175 │ record,
176 │ );
177 │ const icon = contextChipIcon(
178 │ presentation,
179 │ token.type === "mention" ? token.value : contextRecordFileName(record),
180 │ );
181 │ return {
182 │ type: token.type,
183 │ source: token.source,
184 │ start: token.start,
185 │ end: token.end,
186 │ accent: contextChipAccent(presentation.accent, theme, chipTextColor),
187 │ label:
188 │ token.type === "skill"
189 │ ? (skillLabels.get(token.value) ?? token.value)
190 │ : token.type === "context"
191 │ ? `${token.label}${props.context?.records.some((record) => record.contextId === token.contextId) ? "" : " · unavailable"}`
192 │ : basename(token.value),
193 │ detail: token.type === "context" ? composerChipSizeSuffix(record) : "",
194 │ iconUri: contextChipIconUri(icon),
195 │ tintsIcon: icon.kind === "chip",
196 │ };
197 │ }),
198 │ );
199 │ }, [props.value, props.context, skillLabels, theme, chipTextColor]);
· ───────────────────────────────┬───────────────────────────────
· ╰── This dependency list is missing values used by the callback
200 │ // Every render resolves against the snapshot history, so a render whose
╰────
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ react(memo-dependencies): Found missing memoization dependencies
╭─[apps/mobile/src/native/T3ComposerEditor.ios.tsx:261:5]
253 │ mostRecentEventCountRef.current = acknowledgedEventCount;
254 │ nativeEventSnapshotsRef.current.push({
· ───────────┬───────────
· ╰── Missing dependency `nativeEventSnapshotsRef`. Refs, setState functions, and other "stable" values generally do not need to be added as dependencies, but this variable may change over time to point to different values
255 │ eventCount: acknowledgedEventCount,
256 │ value,
257 │ selection: nextSelection,
258 │ });
259 │ return acknowledgedEventCount;
260 │ },
261 │ [],
· ─┬
· ╰── This dependency list is missing values used by the callback
262 │ );
╰────
help: Missing dependencies can cause a value to update less often than it should, resulting in stale UI
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/exhaustive-deps
⚠ 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: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.native.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.native.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.native.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.native.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.native.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.native.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.native.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: contextChipAccent(presentation.accent, theme, chipTextColor),
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, theme, chipTextColor]);
· ───────────────────────────────┬───────────────────────────────
· ╰── 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.native.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
⚠ 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-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/project/ProjectService.test.ts:94:3]
93 │ ) {
94 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
95 │ │ const project = Option.getOrThrow(yield* service.getById(projectId));
96 │ │ if (predicate(project)) return project;
97 │ │ yield* Effect.yieldNow;
98 │ ╰─▶ }
99 │ return yield* Effect.die(`Project ${projectId} was not enriched in time.`);
╰────
⚠ eslint(no-unused-vars): Function 'summarizePayload' is declared but never used.
╭─[packages/provider-acp/src/server/nativeLogging.ts:22:10]
21 │
22 │ function summarizePayload(payload: unknown): Readonly<Record<string, unknown>> {
· ────────┬───────
· ╰── 'summarizePayload' is declared here
23 │ if (payload === null) return { valueType: "null" };
╰────
help: Consider removing this declaration.
⚠ react(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(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(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
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/components/CommandPaletteThreadItems.tsx:152:58]
151 │ if (threadSearchQuery.trim().length > 0 && !threadSearchQuery.startsWith(">") && !isOpen) {
152 │ claimThreadOpen(thread.environmentId, thread.id, Date.now());
· ─────┬────
· ╰── Cannot call impure function
153 │ }
╰────
help: `Date.now` is an impure function. Calling an impure function can produce unstable results that update unpredictably when the component re-renders
note: React Compiler skipped optimizing this component or hook. Additional guidance: https://react.dev/reference/eslint-plugin-react-hooks/lints/purity
⚠ eslint(no-unneeded-ternary): Unnecessary use of boolean literals in conditional expression
╭─[packages/shared/src/serverSettings.test.ts:35:7]
34 │ const fallback = fallbackTextGenerationModelSelection(providerInstances, (instanceId) =>
35 │ instanceId === configured ? true : false,
· ────────────────────────────────────────
36 │ );
╰────
help: Remove this ternary operator
⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
╭─[packages/shared/src/composerContextLegacySend.ts:19:45]
18 │ const occurrences = collectComposerContextReferences(text);
19 │ for (const occurrence of [...occurrences].reverse()) {
· ───────
20 │ const record = recordsById.get(occurrence.contextId);
╰────
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
⚠ eslint(no-unused-vars): Parameter 'stopSessions' is declared but never used. Unused parameters should start with a '_'.
╭─[packages/provider-cursor/src/server/auth.ts:249:20]
248 │ },
249 │ (effect, flow, stopSessions) =>
· ──────┬─────
· ╰── 'stopSessions' is declared here
250 │ effect.pipe(
╰────
help: Consider removing this parameter.
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[apps/server/src/auth/RpcAuthorization.ts:237:17]
236 │ const requiredScopesForSettingsUpdate = (payload: unknown) => {
237 │ const input = Schema.decodeUnknownSync(SettingsUpdate)(payload);
· ────────────────────────
238 │ const scopes = requiredScopesForServerSettingsPatch(input.patch);
╰────
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownSync(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[apps/server/src/auth/RpcAuthorization.ts:256:26]
255 │ if (method === WS_METHODS.assetsCreateUrl) {
256 │ const { resource } = Schema.decodeUnknownSync(AssetCreateUrlInput)(payload);
· ────────────────────────
257 │ return [
╰────
⚠ react(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
⚠ eslint(no-unused-vars): Identifier 'identity' is imported but never used.
╭─[apps/server/src/auth/http.ts:28:10]
27 │ import * as Schema from "effect/Schema";
28 │ import { identity } from "effect/Function";
· ────┬───
· ╰── 'identity' is imported here
29 │ import * as Layer from "effect/Layer";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): 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.
⚠ eslint(no-unused-vars): Identifier 'Arr' is imported but never used.
╭─[packages/client-runtime/src/state/threadSort.ts:4:13]
3 │ import type { EnvironmentThreadShell } from "./models.ts";
4 │ import * as Arr from "effect/Array";
· ─┬─
· ╰── 'Arr' is imported here
5 │ import * as Order from "effect/Order";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'Order' is imported but never used.
╭─[packages/client-runtime/src/state/threadSort.ts:5:13]
4 │ import * as Arr from "effect/Array";
5 │ import * as Order from "effect/Order";
· ──┬──
· ╰── 'Order' is imported here
6 │
╰────
help: Consider removing this import.
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/shell-sync.test.ts:169:7]
168 │ });
169 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
170 │ │ if ((yield* SubscriptionRef.get(shellState)).status === "synchronizing") break;
171 │ │ yield* Effect.yieldNow;
172 │ ╰─▶ }
173 │
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/shell-sync.test.ts:178:7]
177 │ yield* Deferred.succeed(releaseSave, undefined);
178 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
179 │ │ if ((yield* Ref.get(saved)).length > 0) break;
180 │ │ yield* Effect.yieldNow;
181 │ ╰─▶ }
182 │
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/shell-sync.test.ts:307:7]
306 │ yield* Deferred.succeed(releaseUnenrichedSave, undefined);
307 │ ╭─▶ for (let index = 0; index < 100; index += 1) {
308 │ │ const values = yield* Ref.get(saved);
309 │ │ if (values.length > 0 && values.at(-1)?.projects[0]?.repositoryIdentity != null) {
310 │ │ break;
311 │ │ }
312 │ │ yield* Effect.yieldNow;
313 │ ╰─▶ }
314 │
╰────
⚠ 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 │ });
╰────
⚠ eslint(no-unused-vars): Type 'AuthSessionState' is imported but never used.
╭─[packages/client-runtime/src/state/filesystem.ts:3:8]
2 │ AuthFilesystemReadScope,
3 │ type AuthSessionState,
· ────────┬───────
· ╰── 'AuthSessionState' is imported here
4 │ type FilesystemBrowseEntry,
╰────
help: Consider removing this import.
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/threads-sync.test.ts:1680:7]
1679 │ yield* harness.replaceSession;
1680 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
1681 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) {
1682 │ │ break;
1683 │ │ }
1684 │ │ yield* Effect.yieldNow;
1685 │ ╰─▶ }
1686 │ yield* Queue.offer(
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/client-runtime/src/state/threads-sync.test.ts:1789:7]
1788 │ yield* harness.replaceSession;
1789 │ ╭─▶ for (let attempt = 0; attempt < 100; attempt += 1) {
1790 │ │ if ((yield* Ref.get(harness.subscriptionCount)) >= 2) break;
1791 │ │ yield* Effect.yieldNow;
1792 │ ╰─▶ }
1793 │ expect(yield* Ref.get(harness.subscriptionCount)).toBe(2);
╰────
⚠ oxc(no-accumulating-spread): Do not spread accumulators in loops
╭─[packages/client-runtime/src/state/shell.ts:189:5]
186 │ let waiting = yield* Ref.get(awaitingCompletion);
187 │ let next = initial;
· ──┬─
· ╰── From this accumulator
188 │ let receivedSnapshot = false;
189 │ for (const item of items) {
· ─┬─
· ╰── For this loop
190 │ if (item.kind === "synchronized") {
191 │ waiting = false;
192 │ if (Option.isSome(next.snapshot)) {
193 │ next = { ...next, status: "live", error: Option.none() };
· ───┬───
· ╰── From this spread
194 │ }
╰────
help: Consider using `Object.assign()` to mutate the accumulator instead.
note: Using spreads within accumulators leads to `O(n^2)` time complexity.
⚠ eslint(no-unused-vars): Identifier 'Fiber' is imported but never used.
╭─[apps/server/src/ws.ts:10:13]
9 │ import * as Effect from "effect/Effect";
10 │ import * as Fiber from "effect/Fiber";
· ──┬──
· ╰── 'Fiber' is imported here
11 │ import * as FileSystem from "effect/FileSystem";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Identifier 'Schedule' is imported but never used.
╭─[apps/server/src/ws.ts:17:13]
16 │ import * as Ref from "effect/Ref";
17 │ import * as Schedule from "effect/Schedule";
· ────┬───
· ╰── 'Schedule' is imported here
18 │ import * as Schema from "effect/Schema";
╰────
help: Consider removing this import.
⚠ eslint(no-unused-vars): Variable 'projectSetupScriptRunner' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/ws.ts:1286:13]
1285 │ const usageLimitSources = yield* UsageLimitSources.UsageLimitSources;
1286 │ const projectSetupScriptRunner = yield* ProjectSetupScriptRunner.ProjectSetupScriptRunner;
· ────────────┬───────────
· ╰── 'projectSetupScriptRunner' is declared here
1287 │ const worktreeSetupTracker = yield* WorktreeSetupTracker.WorktreeSetupTracker;
╰────
help: Consider removing this declaration.
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeUnknownEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[apps/server/src/assets/AssetAccess.test.ts:975:35]
974 │ // Every client and server release spells the resource this way on the wire.
975 │ const { resource } = yield* Schema.decodeUnknownEffect(AssetCreateUrlInput)({
· ──────────────────────────
976 │ resource: { _tag: "github-media", cwd: "/repo", url },
╰────
⚠ t3code(no-inline-schema-compile): Hoist Schema.encodeEffect(...) to module scope: both the inline schema literal and the compiled function are rebuilt on every call. Move the compiled function to a module-level const.
╭─[apps/server/src/assets/AssetAccess.test.ts:1012:32]
1011 │ expect(error._tag).toBe("AssetGitHubMediaUrlValidationError");
1012 │ const encoded = yield* Schema.encodeEffect(Schema.fromJsonString(AssetAccessError))(error);
· ───────────────────
1013 │ expect(encoded).not.toContain(url);
╰────
⚠ eslint(no-unused-vars): 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.
⚠ 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 │
╰────
help: Remove empty braces
⚠ unicorn(no-array-reverse): Use `Array#toReversed()` instead of `Array#reverse()`.
╭─[apps/web/src/lib/announce.browser.test.ts:41:46]
40 │
41 │ expect(regionTexts()).toEqual([...first].reverse());
· ───────
42 │ expect(regionTexts()).toContain("Claude");
╰────
help: `Array#reverse()` mutates the original array. Use `Array#toReversed()` to return a new reversed array without modifying the original.
⚠ unicorn(prefer-string-starts-ends-with): Prefer String#startsWith over a regex with a caret.
╭─[apps/server/src/vcs/GitVcsDriverCore.ts:517:11]
516 │ GIT_DIAGNOSTIC_LINE_PATTERN.test(line) ||
517 │ (!/^remote:/.test(line) && SSH_TRANSPORT_REFUSAL_PATTERN.test(line)),
· ───────────────
518 │ )
╰────
help: Replace `/^remote:/.test(line)` with `line.startsWith('remote:')`.
⚠ 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.
⚠ eslint(no-unused-vars): Variable 'useDragRegion' is declared but never used. Unused variables should start with a '_'.
╭─[apps/web/src/components/preview/PreviewPanelShell.tsx:61:9]
60 │ ) {
61 │ const useDragRegion = isElectron && props.mode !== "sheet" && props.mode !== "embedded";
· ──────┬──────
· ╰── 'useDragRegion' is declared here
62 │ const isInline = props.mode === "inline";
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Variable 'layer' is declared but never used. Unused variables should start with a '_'.
╭─[apps/server/src/serverRuntimeStartup.ts:728:7]
727 │
728 │ const layer = layerWithOptions();
· ──┬──
· ╰── 'layer' is declared here
╰────
help: Consider removing this declaration.
⚠ t3code(no-inline-schema-compile): Hoist Schema.decodeEffect(...) to module scope: the compiled function is rebuilt on every call. Move it to a module-level const.
╭─[apps/server/src/vcs/GitVcsDriverCore.test.ts:1786:34]
1785 │ const stat = branch.files!.find((file) => file.path === path)!;
1786 │ const request = yield* Schema.decodeEffect(ReviewDiffPreviewInput)({
· ───────────────────
1787 │ cwd,
╰────
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[apps/server/src/usage/UsageService.test.ts:2615:7]
2614 │ let orphanedAt: number | undefined;
2615 │ ╭─▶ for (let interruptAt = 1; interruptAt <= 31; interruptAt += 1) {
2616 │ │ const tasks: Array<() => void> = [];
2617 │ │ const dispatcher: Scheduler.SchedulerDispatcher = {
2618 │ │ scheduleTask: (task) => tasks.push(task),
2619 │ │ flush: () => {
2620 │ │ let task: (() => void) | undefined;
2621 │ │ while ((task = tasks.shift()) !== undefined) task();
2622 │ │ },
2623 │ │ };
2624 │ │
2625 │ │ let requestFiber: Fiber.Fiber<unknown, unknown> | undefined;
2626 │ │ let requestChecks = 0;
2627 │ │ const scheduler: Scheduler.Scheduler = {
2628 │ │ executionMode: "async",
2629 │ │ makeDispatcher: () => dispatcher,
2630 │ │ shouldYield: (fiber) => {
2631 │ │ if (fiber !== requestFiber) return false;
2632 │ │ requestChecks += 1;
2633 │ │ if (requestChecks !== interruptAt) return false;
2634 │ │ fiber.interruptUnsafe();
2635 │ │ return true;
2636 │ │ },
2637 │ │ };
2638 │ │
2639 │ │ const input: UsageSummaryInput = {
2640 │ │ ...WINDOW,
2641 │ │ sinceDay: UsageDay.make("2026-09-01"),
2642 │ │ untilDay: UsageDay.make(`2026-08-${String(interruptAt).padStart(2, "0")}`),
2643 │ │ };
2644 │ │ const first = yield* service
2645 │ │ .readSummary(input)
2646 │ │ .pipe(
2647 │ │ Effect.exit,
2648 │ │ Effect.provideService(Scheduler.Scheduler, scheduler),
2649 │ │ Effect.forkChild,
2650 │ │ );
2651 │ │ requestFiber = first;
2652 │ │ yield* Effect.yieldNow;
2653 │ │ dispatcher.flush();
2654 │ │
2655 │ │ const second = yield* service.readSummary(input).pipe(
2656 │ │ Effect.match({
2657 │ │ onFailure: (error) => error.reason,
2658 │ │ onSuccess: () => "success" as const,
2659 │ │ }),
2660 │ │ Effect.provideService(Scheduler.Scheduler, scheduler),
2661 │ │ Effect.forkChild,
2662 │ │ );
2663 │ │ yield* Effect.yieldNow;
2664 │ │ dispatcher.flush();
2665 │ │ const secondExit = second.pollUnsafe();
2666 │ │ if (secondExit === undefined) {
2667 │ │ second.interruptUnsafe();
2668 │ │ orphanedAt = interruptAt;
2669 │ │ break;
2670 │ │ }
2671 │ │ if (Exit.isFailure(secondExit)) {
2672 │ │ assert.fail("the matching request fiber was interrupted");
2673 │ │ }
2674 │ │ assert.strictEqual(secondExit.value, "invalidWindow");
2675 │ ╰─▶ }
2676 │
╰────
⚠ react(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): 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.
⚠ 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
⚠ eslint(no-empty-pattern): Empty array binding pattern
╭─[apps/server/src/pullRequest/PullRequestService.test.ts:1437:12]
1436 │
1437 │ for (const [] of [
· ──
1438 │ ["github", "github.com"],
╰────
help: Passing non-iterable values (null, undefined, numbers, booleans, etc.) will result in a runtime error because these values are not iterable.
⚠ eslint(no-unused-vars): Function 'normalizeTerminalContextSelection' is declared but never used.
╭─[apps/web/src/lib/terminalContext.ts:56:10]
55 │
56 │ function normalizeTerminalContextSelection(
· ────────────────┬────────────────
· ╰── 'normalizeTerminalContextSelection' is declared here
57 │ selection: TerminalContextSelection,
╰────
help: Consider removing this declaration.
⚠ eslint(no-unused-vars): Function '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/components/ProjectFavicon.tsx:172:5]
167 │ const [activeFaviconRequest, setActiveFaviconRequest] = useState<typeof faviconRequest>(null);
168 │ useLayoutEffect(() => {
· ───────┬───────
· ╰── This is the containing effect
169 │ if (faviconRequest === null) return;
170 │
171 │ const endRequest = beginProjectFaviconRequest(faviconRequest);
172 │ setActiveFaviconRequest(faviconRequest);
· ───────────┬───────────
· ╰── Avoid calling setState() directly within an effect
173 │ 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
⚠ 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)),
╰────
⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
╭─[apps/mobile/src/components/ComposerContextSheet.tsx:272:25]
271 │ {record.elements?.map((element, index) => (
272 │ <View key={`${element.selector ?? element.tagName}:${index}`} className="gap-3">
· ───────────────────────────────────────────────────────
273 │ <ContextField
╰────
help: Use a unique data-dependent key to avoid unnecessary rerenders
⚠ 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
⚠ 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(no-array-index-key): Usage of Array index in keys is not allowed
╭─[apps/web/src/components/pullRequest/PullRequestSummaryTab.tsx:818:17]
817 │ <div
818 │ key={`${index}:${check.name}:${check.url ?? ""}`}
· ─────────────────────────────────────────────────
819 │ className="group flex items-center gap-2 rounded-md pr-1 hover:bg-accent/60"
╰────
help: Use a unique data-dependent key to avoid unnecessary rerenders
⚠ eslint(no-unused-vars): Function 'promptResponseHasMissingXAiStopReason' is declared but never used.
╭─[packages/provider-grok/src/server/xaiAcpExtension.ts:1620:10]
1619 │
1620 │ function promptResponseHasMissingXAiStopReason(response: EffectAcpSchema.PromptResponse): boolean {
· ──────────────────┬──────────────────
· ╰── 'promptResponseHasMissingXAiStopReason' is declared here
1621 │ const meta = response._meta;
╰────
help: Consider removing this declaration.
⚠ t3code(no-polling-loop-in-tests): Polling loop in a test. Spinning on `yieldNow`/`sleep` is scheduler- and load-dependent. Await the `Deferred`, `Queue.take`, `Stream` element, `drain()`, or `expect.poll` that marks the milestone.
╭─[packages/shared/src/atomicWrite.test.ts:139:5]
138 │ Effect.gen(function* () {
139 │ ╭─▶ while (fiber.pollUnsafe() === undefined) {
140 │ │ yield* TestClock.adjust("100 millis");
141 │ │ // oxlint-disable-next-line t3code/no-real-time-wait-in-tests -- a macrotask boundary so the real stat I/O can finish; time moves only via TestClock
142 │ │ yield* Effect.promise(() => new Promise((resolve) => setImmediate(resolve)));
143 │ ╰─▶ }
144 │ return yield* Fiber.join(fiber);
╰────
⚠ eslint(no-unused-vars): Identifier 'Duration' is imported but never used.
╭─[packages/provider-pi/src/server/adapter.test.ts:24:13]
23 │ import * as Deferred from "effect/Deferred";
24 │ import * as Duration from "effect/Duration";
· ────┬───
· ╰── 'Duration' is imported here
25 │ import * as Effect from "effect/Effect";
╰────
help: Consider removing this import.
⚠ react(purity): Cannot call impure function during render
╭─[apps/web/src/components/CommandPalette.tsx:2037:20]
2036 │ title: inferProjectTitleFromPath(destinationPath),
2037 │ createdAt: new Date().toISOString(),
· ─────┬────
· ╰── Cannot call impure function
2038 │ 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
⚠ 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.
⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:473:19]
472 │ onFilters,
473 │ authorOptions = [],
· ──
474 │ labelOptions = [],
╰────
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
⚠ react(no-object-type-as-default-prop): Do not use an array literal as default prop value. Use a stable reference instead.
╭─[apps/web/src/components/pullRequest/PullRequestListFilters.tsx:474:18]
473 │ authorOptions = [],
474 │ labelOptions = [],
· ──
475 │ optionScope,
╰────
help: Default values are re-created on every render and break referential equality, causing unnecessary re-renders. Move the value out of the component or memoize it.
⚠ eslint(no-unused-vars): Type 'EnvironmentId' is imported but never used.
╭─[packages/client-runtime/src/state/sharedSettings.ts:2:3]
1 │ import type {
2 │ EnvironmentId,
· ──────┬──────
· ╰── 'EnvironmentId' is imported here
3 │ ExecutionEnvironmentCapabilities,
╰────
help: Consider removing this import.
⚠ react(no-array-index-key): Usage of Array index in keys is not allowed
╭─[apps/web/src/components/pullRequest/PullRequestChecksPopover.tsx:88:15]
87 │ <li
88 │ key={`${index}:${check.name}`}
· ──────────────────────────────
89 │ className="col-span-full grid grid-cols-subgrid items-center text-xs"
╰────
help: Use a unique data-dependent key to avoid unnecessary rerenders
Found 0 errors and 367 warnings in 5479 files (5.6s, 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=__8fbc7866-6847-4078-928b-d8c687612d62.__actions_cache]
Post job cleanup.
Cache hit occurred on the primary key pnpm-full-v1-Linux-X64-bab31c3827e90e1352d302da4c761fd1b91963ae565f5f0ea70972d0942af1f6, not saving cache.
##[end-action id=__8fbc7866-6847-4078-928b-d8c687612d62.__actions_cache;outcome=success;conclusion=success;duration_ms=120]
##[start-action display=Cache Vite+;id=__8fbc7866-6847-4078-928b-d8c687612d62.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=__8fbc7866-6847-4078-928b-d8c687612d62.vp_cache;outcome=success;conclusion=success;duration_ms=64]
Post job cleanup.
[command]/usr/local/bin/git version
git version 2.55.0
Temporarily overriding HOME='/home/runner/_work/_temp/0e6cd1d6-eefb-4706-b004-33a1451f0891' 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: 175
BLACKSMITH_RUNNER_ACQUIRE_JOB_MS: 485
BLACKSMITH_CHECK_RUN_ID: 121004670553
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