fix(chat): disable markdown file-reference probing on mobile

The file-reference annotation pass issues filesystem stat probes
(fileReferenceExists -> /api/fs/stat) to decide which inline-code/link tokens
become openable file links. On mobile surfaces this feature is disabled
entirely: gate the annotation effect on !isMobileSurfaceRuntime() so the pass
short-circuits before scheduling, guaranteeing no probe requests are ever sent
from a mobile runtime.
This commit is contained in:
Bohdan Triapitsyn
2026-06-30 03:05:33 +03:00
parent 9e6d0df942
commit ea34ca4b92
@@ -16,6 +16,7 @@ import { useEffectiveDirectory } from '@/hooks/useEffectiveDirectory';
import { useRuntimeAPIs } from '@/hooks/useRuntimeAPIs'; import { useRuntimeAPIs } from '@/hooks/useRuntimeAPIs';
import type { EditorAPI } from '@/lib/api/types'; import type { EditorAPI } from '@/lib/api/types';
import { isDesktopLocalOriginActive, isDesktopShell, isVSCodeRuntime } from '@/lib/desktop'; import { isDesktopLocalOriginActive, isDesktopShell, isVSCodeRuntime } from '@/lib/desktop';
import { isMobileSurfaceRuntime } from '@/lib/runtimeSurface';
import { ensureOutsideFileGrantForDesktop } from '@/lib/outsideFileGrants'; import { ensureOutsideFileGrantForDesktop } from '@/lib/outsideFileGrants';
import { getDirectoryForFilePath, isAbsoluteFilePath, isFilePathWithinDirectory, normalizeFilePath, toAbsoluteFilePath } from '@/lib/path-utils'; import { getDirectoryForFilePath, isAbsoluteFilePath, isFilePathWithinDirectory, normalizeFilePath, toAbsoluteFilePath } from '@/lib/path-utils';
import { renderMarkdownBlocks, renderMarkdownSync } from './markdown/markdownCore'; import { renderMarkdownBlocks, renderMarkdownSync } from './markdown/markdownCore';
@@ -570,6 +571,11 @@ const useFileReferenceInteractions = ({
} }
let cancelled = false; let cancelled = false;
const fileReferenceLinkLimit = getFileReferenceLinkLimit(); const fileReferenceLinkLimit = getFileReferenceLinkLimit();
// On mobile surfaces, file-reference highlighting is disabled entirely — not
// just visually. The annotation pass is what issues the filesystem `stat`
// probes (fileReferenceExists → /api/fs/stat), so skipping it here guarantees
// no probe requests are ever sent from a mobile runtime.
const fileReferencesEnabled = enabled && !isMobileSurfaceRuntime();
const clearFileLinkAttributes = (candidate: HTMLElement) => { const clearFileLinkAttributes = (candidate: HTMLElement) => {
candidate.removeAttribute('data-openchamber-file-link'); candidate.removeAttribute('data-openchamber-file-link');
@@ -592,7 +598,7 @@ const useFileReferenceInteractions = ({
unwrapBlockCodePathTokens(container); unwrapBlockCodePathTokens(container);
}; };
if (!enabled) { if (!fileReferencesEnabled) {
clearAnnotatedFileLinks(); clearAnnotatedFileLinks();
return; return;
} }
@@ -616,7 +622,7 @@ const useFileReferenceInteractions = ({
}; };
const annotateFileLinks = () => { const annotateFileLinks = () => {
if (enabled) { if (fileReferencesEnabled) {
wrapBlockCodePathTokens(container); wrapBlockCodePathTokens(container);
} }
const candidates = container.querySelectorAll<HTMLElement>( const candidates = container.querySelectorAll<HTMLElement>(