@tutti-os/workspace-file-reference 0.0.58 → 0.0.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui/index.js +12 -0
- package/dist/ui/index.js.map +1 -1
- package/package.json +5 -5
package/dist/ui/index.js
CHANGED
|
@@ -3150,6 +3150,18 @@ function ReferenceNodeIcon({
|
|
|
3150
3150
|
node
|
|
3151
3151
|
}) {
|
|
3152
3152
|
const entry = useMemo2(() => referenceNodeToWorkspaceFileEntry(node), [node]);
|
|
3153
|
+
if (node.kind === "folder") {
|
|
3154
|
+
return /* @__PURE__ */ jsx4(
|
|
3155
|
+
"span",
|
|
3156
|
+
{
|
|
3157
|
+
className: cn3(
|
|
3158
|
+
"grid flex-none place-items-center text-[var(--rich-text-folder)]",
|
|
3159
|
+
frameClassName
|
|
3160
|
+
),
|
|
3161
|
+
children: /* @__PURE__ */ jsx4(FolderFilledIcon3, { className: iconClassName })
|
|
3162
|
+
}
|
|
3163
|
+
);
|
|
3164
|
+
}
|
|
3153
3165
|
return /* @__PURE__ */ jsx4(
|
|
3154
3166
|
WorkspaceFileEntryIcon,
|
|
3155
3167
|
{
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/internal/reference/WorkspaceFileReferencePicker.tsx","../../src/ui/internal/reference/WorkspaceFileReferencePickerSections.tsx","../../src/ui/internal/reference/WorkspaceFileReferencePickerTree.tsx","../../src/ui/internal/reference/ReferenceSourcePicker.tsx","../../src/react/internal/reference/useReferenceSourcePickerView.ts","../../src/ui/internal/reference/referenceSourcePickerPresentation.ts"],"sourcesContent":["import {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n cn\n} from \"@tutti-os/ui-system\";\nimport { useEffect } from \"react\";\nimport type {\n WorkspaceFileReferenceAdapter,\n WorkspaceFileReference,\n WorkspaceFileReferenceCopy\n} from \"../../../contracts/index.ts\";\nimport { useWorkspaceFileReferencePickerView } from \"../../../react/index.ts\";\nimport {\n WorkspaceFileReferencePickerFooter,\n WorkspaceFileReferencePickerPreviewPane\n} from \"./WorkspaceFileReferencePickerSections.tsx\";\nimport { WorkspaceFileReferencePickerBrowserPane } from \"./WorkspaceFileReferencePickerTree.tsx\";\n\nexport interface WorkspaceFileReferencePickerProps {\n copy: WorkspaceFileReferenceCopy;\n fileAdapter?: WorkspaceFileReferenceAdapter;\n initialPath?: string | null;\n onClose: () => void;\n onConfirm: (refs: WorkspaceFileReference[]) => void;\n open: boolean;\n /**\n * When true, the dialog is rendered inline (non-portaled, absolutely\n * positioned) so it stays clipped within the nearest positioned ancestor —\n * e.g. an agent GUI node window — instead of covering the whole viewport.\n * Defaults to false (portal to body + cover the viewport).\n */\n scoped?: boolean;\n workspaceId: string;\n}\n\nexport function WorkspaceFileReferencePicker({\n copy,\n fileAdapter,\n initialPath,\n onClose,\n onConfirm,\n open,\n scoped = false,\n workspaceId\n}: WorkspaceFileReferencePickerProps) {\n const {\n browseRootEntries,\n directoryStateByPath,\n expandedFolderPaths,\n focusedEntry,\n focusedPath,\n isLoading,\n mode,\n previewState,\n searchQuery,\n selectedRefs,\n visibleEntries,\n setFocusedPath,\n setSearchQuery,\n toggleFolder,\n toggleRef\n } = useWorkspaceFileReferencePickerView({\n fileAdapter,\n initialPath,\n onClose,\n onConfirm,\n open,\n workspaceId\n });\n useEffect(() => {\n if (!open) {\n return;\n }\n const handleEscapeKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== \"Escape\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n onClose();\n };\n document.addEventListener(\"keydown\", handleEscapeKeyDown, {\n capture: true\n });\n return () => {\n document.removeEventListener(\"keydown\", handleEscapeKeyDown, {\n capture: true\n });\n };\n }, [onClose, open]);\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <DialogContent\n // Radix infers the description; this picker has none.\n aria-describedby={undefined}\n className={cn(\n \"nodrag flex h-[min(88vh,44rem)] w-full max-w-5xl flex-col gap-0 overflow-hidden border-[var(--line-1)] bg-[var(--background-fronted)] p-0 text-[var(--text-primary)] shadow-panel [-webkit-app-region:no-drag] sm:h-[min(82vh,44rem)] sm:max-w-5xl\"\n )}\n onEscapeKeyDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n }}\n // When scoped, both overlay and content stay clipped within the nearest\n // positioned ancestor (the node window) instead of covering the viewport.\n overlayClassName={cn(\"nodrag\", scoped && \"!absolute\")}\n portaled={!scoped}\n >\n <DialogHeader className=\"flex-none border-b border-[var(--line-1)] px-4 py-4 sm:px-6 sm:py-5\">\n <DialogTitle>{copy.t(\"referencePicker.title\")}</DialogTitle>\n </DialogHeader>\n <div className=\"grid min-h-0 flex-1 grid-rows-[minmax(0,1fr)_auto] gap-0 overflow-hidden p-0 lg:grid-cols-[minmax(0,1.15fr)_minmax(20rem,0.85fr)] lg:grid-rows-1\">\n <WorkspaceFileReferencePickerBrowserPane\n browseRootEntries={browseRootEntries}\n copy={copy}\n directoryStateByPath={directoryStateByPath}\n expandedFolderPaths={expandedFolderPaths}\n focusedPath={focusedPath}\n isLoading={isLoading}\n mode={mode}\n searchQuery={searchQuery}\n selectedRefs={selectedRefs}\n setSearchQuery={setSearchQuery}\n visibleEntries={visibleEntries}\n onFocusPath={setFocusedPath}\n onToggleFolder={toggleFolder}\n onToggleRef={toggleRef}\n />\n <WorkspaceFileReferencePickerPreviewPane\n copy={copy}\n focusedEntry={focusedEntry}\n mode={mode}\n previewState={previewState}\n />\n </div>\n <WorkspaceFileReferencePickerFooter\n copy={copy}\n onClose={onClose}\n onConfirm={() => onConfirm(selectedRefs)}\n selectedRefs={selectedRefs}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","import { useId, useState, type JSX, type ReactNode } from \"react\";\nimport {\n Badge,\n Button,\n FileIcon,\n FolderFilledIcon,\n LoadingIcon\n} from \"@tutti-os/ui-system\";\nimport { formatWorkspacePreviewByteLimit } from \"@tutti-os/workspace-file-preview\";\nimport { WorkspaceFilePreviewSurface as SharedWorkspaceFilePreviewSurface } from \"@tutti-os/workspace-file-preview/react\";\nimport type { WorkspaceFilePreviewSurfaceState } from \"@tutti-os/workspace-file-preview/react\";\nimport type {\n WorkspaceFileReference,\n WorkspaceFileReferenceCopy\n} from \"../../../contracts/index.ts\";\nimport type { WorkspaceFileReferencePreviewState } from \"../../../react/internal/reference/useWorkspaceFileReferencePickerView.ts\";\nimport { resolveWorkspaceFileReferenceLabel } from \"./WorkspaceFileReferencePickerTree.tsx\";\n\nconst workspaceFileReferencePickerSelectedBadgeClassName =\n \"max-w-[14rem] rounded-[4px] border-transparent bg-[var(--transparency-block)] text-[var(--text-primary)]\";\n\nexport function WorkspaceFileReferencePickerPreviewPane({\n copy,\n focusedEntry,\n mode,\n previewState\n}: {\n copy: WorkspaceFileReferenceCopy;\n focusedEntry: WorkspaceFileReference | null;\n mode: \"browse\" | \"search\";\n previewState: WorkspaceFileReferencePreviewState;\n}): JSX.Element {\n return (\n <aside className=\"flex shrink-0 flex-col border-t border-[var(--line-1)] bg-[var(--background-fronted)] lg:min-h-0 lg:flex-1 lg:border-t-0\">\n <div className=\"flex min-h-0 flex-1 flex-col p-2\">\n {focusedEntry ? (\n <div className=\"flex min-h-0 flex-col gap-4 lg:flex-1 lg:gap-5\">\n <WorkspaceFileReferencePreviewSurface\n copy={copy}\n focusedEntry={focusedEntry}\n previewState={previewState}\n />\n <div className=\"space-y-2 px-2 lg:space-y-3\">\n <div className=\"space-y-1.5\">\n <p className=\"truncate text-[15px] font-semibold text-[var(--text-primary)]\">\n {resolveWorkspaceFileReferenceLabel(focusedEntry)}\n </p>\n <p className=\"line-clamp-3 text-[13px] text-[var(--text-secondary)] [overflow-wrap:anywhere]\">\n {focusedEntry.path}\n </p>\n </div>\n </div>\n </div>\n ) : (\n <WorkspaceFileReferencePickerFeedback>\n {mode === \"search\"\n ? copy.t(\"referencePicker.emptySearch\")\n : copy.t(\"referencePicker.emptyDirectory\")}\n </WorkspaceFileReferencePickerFeedback>\n )}\n </div>\n </aside>\n );\n}\n\nfunction WorkspaceFileReferencePreviewSurface({\n copy,\n focusedEntry,\n previewState\n}: {\n copy: WorkspaceFileReferenceCopy;\n focusedEntry: WorkspaceFileReference;\n previewState: WorkspaceFileReferencePreviewState;\n}): JSX.Element {\n return (\n <SharedWorkspaceFilePreviewSurface\n directoryMessage={copy.t(\"referencePicker.previewFolder\")}\n emptyMessage={copy.t(\"referencePicker.previewUnavailable\")}\n frameClassName=\"flex aspect-[3/2] w-full flex-col items-center justify-center overflow-hidden rounded-[8px] border border-[var(--line-2,var(--border-2))] bg-[var(--transparency-block)] p-0 text-center\"\n htmlFrameClassName=\"items-stretch justify-stretch bg-white\"\n htmlTitle={resolveWorkspaceFileReferenceLabel}\n imageAlt={resolveWorkspaceFileReferenceLabel}\n imageFrameClassName=\"p-3\"\n loadingIndicator={\n <span className=\"mx-auto grid size-11 place-items-center rounded-[6px] bg-[var(--transparency-block)]\">\n <LoadingIcon className=\"size-4 animate-spin\" />\n </span>\n }\n loadingMessage={copy.t(\"referencePicker.previewLoading\")}\n messageClassName=\"mx-auto max-w-[24ch] text-[13px] leading-5 text-[var(--text-secondary)] [overflow-wrap:anywhere]\"\n renderIcon={(entry) =>\n entry.kind === \"folder\" ? (\n <FolderFilledIcon className=\"mx-auto size-9 text-[var(--rich-text-folder)]\" />\n ) : (\n <FileIcon className=\"mx-auto size-9 text-[var(--text-tertiary)]\" />\n )\n }\n state={resolveWorkspaceFileReferenceSurfaceState(\n copy,\n focusedEntry,\n previewState\n )}\n textClassName=\"h-full overflow-auto p-3 text-left text-[11px] leading-5 whitespace-pre-wrap break-words text-[var(--text-primary)]\"\n textFrameClassName=\"items-stretch justify-stretch\"\n />\n );\n}\n\nfunction resolveWorkspaceFileReferenceSurfaceState(\n copy: WorkspaceFileReferenceCopy,\n focusedEntry: WorkspaceFileReference,\n previewState: WorkspaceFileReferencePreviewState\n): WorkspaceFilePreviewSurfaceState<WorkspaceFileReference> {\n if (focusedEntry.kind === \"folder\") {\n return {\n entry: focusedEntry,\n status: \"directory\" as const\n };\n }\n\n if (\n !(\"reference\" in previewState) ||\n previewState.reference.path !== focusedEntry.path\n ) {\n return {\n entry: focusedEntry,\n message: focusedEntry.path,\n status: \"unsupported\" as const\n };\n }\n\n switch (previewState.status) {\n case \"loading\":\n case \"image\":\n case \"video\":\n case \"text\":\n case \"html\":\n return {\n ...previewState,\n entry: focusedEntry\n };\n case \"readonly\":\n return {\n entry: focusedEntry,\n message: resolveWorkspaceFileReferencePreviewReadonlyMessage(\n copy,\n previewState\n ),\n status: \"readonly\" as const\n };\n case \"error\":\n return {\n entry: focusedEntry,\n message: copy.t(\"referencePicker.previewError\"),\n status: \"error\" as const\n };\n case \"unsupported\":\n return {\n entry: focusedEntry,\n message: copy.t(\"referencePicker.previewUnsupported\"),\n status: \"unsupported\" as const\n };\n case \"unavailable\":\n return {\n entry: focusedEntry,\n message: copy.t(\"referencePicker.previewUnavailable\"),\n status: \"unsupported\" as const\n };\n case \"directory\":\n return {\n entry: focusedEntry,\n status: \"directory\" as const\n };\n }\n}\n\nfunction resolveWorkspaceFileReferencePreviewReadonlyMessage(\n copy: WorkspaceFileReferenceCopy,\n previewState: Extract<\n WorkspaceFileReferencePreviewState,\n { status: \"readonly\" }\n >\n): string {\n switch (previewState.reason) {\n case \"binary\":\n return copy.t(\"referencePicker.previewBinary\");\n case \"decode_failed\":\n return copy.t(\"referencePicker.previewDecodeFailed\");\n case \"file_too_large\":\n return copy.t(\"referencePicker.previewFileTooLarge\", {\n maxSize: formatWorkspacePreviewByteLimit(previewState.maxSizeBytes ?? 0)\n });\n case \"text_too_large\":\n return copy.t(\"referencePicker.previewTextTooLarge\", {\n maxSize: formatWorkspacePreviewByteLimit(previewState.maxSizeBytes ?? 0)\n });\n }\n}\n\nexport function WorkspaceFileReferencePickerFooter({\n copy,\n onClose,\n onConfirm,\n selectedRefs\n}: {\n copy: WorkspaceFileReferenceCopy;\n onClose: () => void;\n onConfirm: () => void;\n selectedRefs: readonly WorkspaceFileReference[];\n}): JSX.Element {\n const selectedRefsTooltipId = useId();\n const [selectedRefsTooltipOpen, setSelectedRefsTooltipOpen] = useState(false);\n const selectedRefsLabel = selectedRefs\n .map((ref) => resolveWorkspaceFileReferenceLabel(ref))\n .join(\"\\n\");\n\n return (\n <div className=\"nodrag flex flex-col gap-3 border-t border-[var(--line-1)] px-4 py-4 [-webkit-app-region:no-drag] sm:px-6 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2 lg:flex-1\">\n <span className=\"text-[13px] text-[var(--text-secondary)]\">\n {copy.t(\"referencePicker.selectedCount\", {\n count: selectedRefs.length\n })}\n </span>\n {selectedRefs.slice(0, 2).map((ref) => (\n <Badge\n className={workspaceFileReferencePickerSelectedBadgeClassName}\n key={ref.path}\n variant=\"secondary\"\n >\n <span className=\"truncate\">\n {resolveWorkspaceFileReferenceLabel(ref)}\n </span>\n </Badge>\n ))}\n {selectedRefs.length > 2 ? (\n <span\n className=\"relative inline-flex\"\n onBlur={() => setSelectedRefsTooltipOpen(false)}\n onFocus={() => setSelectedRefsTooltipOpen(true)}\n onMouseEnter={() => setSelectedRefsTooltipOpen(true)}\n onMouseLeave={() => setSelectedRefsTooltipOpen(false)}\n >\n <Badge\n asChild\n className={`${workspaceFileReferencePickerSelectedBadgeClassName} cursor-default`}\n variant=\"secondary\"\n >\n <button\n aria-describedby={selectedRefsTooltipId}\n aria-label={selectedRefsLabel}\n type=\"button\"\n >\n +{selectedRefs.length - 2}\n </button>\n </Badge>\n <span\n aria-hidden={!selectedRefsTooltipOpen}\n className=\"pointer-events-none absolute bottom-[calc(100%+8px)] left-0 z-[var(--z-tooltip,100700)] max-h-[min(20rem,calc(100vh-96px))] w-max max-w-[min(28rem,calc(100vw-32px))] overflow-auto whitespace-pre-line rounded-md border border-[var(--border-1)] bg-[var(--background-fronted)] px-2 py-1 text-left text-[13px] leading-[1.3] text-[var(--text-primary)] shadow-soft transition-opacity duration-100 [overflow-wrap:anywhere]\"\n id={selectedRefsTooltipId}\n role=\"tooltip\"\n style={{\n opacity: selectedRefsTooltipOpen ? 1 : 0,\n visibility: selectedRefsTooltipOpen ? \"visible\" : \"hidden\"\n }}\n >\n {selectedRefsLabel}\n </span>\n </span>\n ) : null}\n </div>\n <div className=\"flex w-full items-center justify-end gap-2 lg:w-auto lg:shrink-0\">\n <Button\n className=\"nodrag [-webkit-app-region:no-drag]\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onClose}\n >\n {copy.t(\"actions.cancel\")}\n </Button>\n <Button\n className=\"nodrag [-webkit-app-region:no-drag]\"\n disabled={selectedRefs.length === 0}\n type=\"button\"\n onClick={onConfirm}\n >\n {copy.t(\"referencePicker.confirm\")}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction WorkspaceFileReferencePickerFeedback({\n children\n}: {\n children: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center px-4 text-center text-[13px] text-[var(--text-secondary)]\">\n {children}\n </div>\n );\n}\n","import { useEffect, useState, type JSX, type ReactNode } from \"react\";\nimport { useComposedInputValue } from \"@tutti-os/ui-react-hooks\";\nimport {\n ArrowRightIcon,\n Button,\n CheckIcon,\n FileIcon,\n FolderFilledIcon,\n Input,\n ScrollArea,\n SearchIcon,\n Spinner,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport { AddIcon as AddLinedIcon } from \"@tutti-os/ui-system/icons\";\nimport type {\n WorkspaceFileReference,\n WorkspaceFileReferenceCopy\n} from \"../../../contracts/index.ts\";\nimport {\n normalizeDirectoryPath,\n type WorkspaceFileReferenceDirectoryState\n} from \"../../../react/index.ts\";\n\n// 每级缩进 = 箭头列宽(20px)+ 间距(8px),使子级文件图标对齐到父文件夹图标下方。\nconst workspaceFileReferenceTreeIndent = 28;\nconst workspaceFileReferenceTreeCollapseDurationMs = 200;\n\nexport function WorkspaceFileReferencePickerBrowserPane({\n browseRootEntries,\n copy,\n directoryStateByPath,\n expandedFolderPaths,\n focusedPath,\n isLoading,\n mode,\n searchQuery,\n selectedRefs,\n setSearchQuery,\n visibleEntries,\n onFocusPath,\n onToggleFolder,\n onToggleRef\n}: {\n browseRootEntries: readonly WorkspaceFileReference[];\n copy: WorkspaceFileReferenceCopy;\n directoryStateByPath: Record<string, WorkspaceFileReferenceDirectoryState>;\n expandedFolderPaths: Record<string, boolean>;\n focusedPath: string | null;\n isLoading: boolean;\n mode: \"browse\" | \"search\";\n searchQuery: string;\n selectedRefs: readonly WorkspaceFileReference[];\n setSearchQuery: (query: string) => void;\n visibleEntries: readonly WorkspaceFileReference[];\n onFocusPath: (path: string) => void;\n onToggleFolder: (entry: WorkspaceFileReference) => void;\n onToggleRef: (entry: WorkspaceFileReference) => void;\n}): JSX.Element {\n return (\n <section className=\"nodrag flex min-h-0 flex-col border-b border-[var(--line-1)] [-webkit-app-region:no-drag] lg:border-r lg:border-b-0\">\n <div className=\"border-b border-[var(--line-1)] p-3\">\n <WorkspaceFileReferencePickerSearchInput\n placeholder={copy.t(\"referencePicker.searchPlaceholder\")}\n value={searchQuery}\n onChange={setSearchQuery}\n />\n </div>\n {isLoading ? (\n <WorkspaceFileReferencePickerFeedback>\n <Spinner className=\"text-[var(--text-secondary)]\" size={16} />\n </WorkspaceFileReferencePickerFeedback>\n ) : visibleEntries.length === 0 ? (\n <WorkspaceFileReferencePickerFeedback>\n {mode === \"search\"\n ? copy.t(\"referencePicker.emptySearch\")\n : copy.t(\"referencePicker.emptyDirectory\")}\n </WorkspaceFileReferencePickerFeedback>\n ) : (\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"flex flex-col gap-[2px] p-3\">\n {mode === \"browse\" ? (\n <div className=\"space-y-0.5\">\n {browseRootEntries.map((entry) => (\n <WorkspaceFileReferencePickerTreeEntry\n childDepth={1}\n copy={copy}\n directoryStateByPath={directoryStateByPath}\n entry={entry}\n expandedFolderPaths={expandedFolderPaths}\n focusedPath={focusedPath}\n key={entry.path}\n selectedRefs={selectedRefs}\n onFocusPath={onFocusPath}\n onToggleFolder={onToggleFolder}\n onToggleRef={onToggleRef}\n />\n ))}\n </div>\n ) : (\n visibleEntries.map((entry) => (\n <WorkspaceFileReferencePickerSearchEntry\n entry={entry}\n focused={focusedPath === entry.path}\n key={entry.path}\n selected={selectedRefs.some(\n (item) => item.path === entry.path\n )}\n onFocusPath={onFocusPath}\n onToggleRef={onToggleRef}\n />\n ))\n )}\n </div>\n </ScrollArea>\n )}\n </section>\n );\n}\n\nfunction WorkspaceFileReferencePickerSearchInput({\n onChange,\n placeholder,\n value\n}: {\n onChange: (value: string) => void;\n placeholder: string;\n value: string;\n}): JSX.Element {\n const searchInput = useComposedInputValue({ onCommit: onChange, value });\n\n return (\n <div className=\"relative\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-[var(--text-tertiary)]\" />\n <Input\n className=\"pl-9\"\n placeholder={placeholder}\n value={searchInput.value}\n onBlur={searchInput.onBlur}\n onChange={searchInput.onChange}\n onCompositionEnd={searchInput.onCompositionEnd}\n onCompositionStart={searchInput.onCompositionStart}\n />\n </div>\n );\n}\n\nfunction WorkspaceFileReferencePickerTreeEntry({\n childDepth,\n copy,\n directoryStateByPath,\n entry,\n expandedFolderPaths,\n focusedPath,\n selectedRefs,\n onFocusPath,\n onToggleFolder,\n onToggleRef\n}: {\n childDepth: number;\n copy: WorkspaceFileReferenceCopy;\n directoryStateByPath: Record<string, WorkspaceFileReferenceDirectoryState>;\n entry: WorkspaceFileReference;\n expandedFolderPaths: Record<string, boolean>;\n focusedPath: string | null;\n selectedRefs: readonly WorkspaceFileReference[];\n onFocusPath: (path: string) => void;\n onToggleFolder: (entry: WorkspaceFileReference) => void;\n onToggleRef: (entry: WorkspaceFileReference) => void;\n}): JSX.Element {\n const selected = selectedRefs.some((item) => item.path === entry.path);\n const focused = focusedPath === entry.path;\n const isFolder = entry.kind === \"folder\";\n const folderKey = normalizeDirectoryPath(entry.path);\n const expanded = expandedFolderPaths[folderKey] ?? false;\n const childState = directoryStateByPath[folderKey];\n const childEntries = childState?.entries ?? [];\n const [shouldRenderChildContent, setShouldRenderChildContent] =\n useState(expanded);\n\n useEffect(() => {\n if (expanded) {\n setShouldRenderChildContent(true);\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n setShouldRenderChildContent(false);\n }, workspaceFileReferenceTreeCollapseDurationMs);\n\n return () => window.clearTimeout(timeoutId);\n }, [expanded]);\n\n const handleRowSelect = () => {\n onFocusPath(entry.path);\n if (isFolder) {\n onToggleFolder(entry);\n }\n };\n\n const shouldBuildChildContent = expanded || shouldRenderChildContent;\n const childContent = shouldBuildChildContent ? (\n childState?.loading ? (\n <div\n className=\"flex items-center gap-2 px-2 py-2 text-[11px] text-[var(--text-secondary)]\"\n style={{\n paddingLeft: `${childDepth * workspaceFileReferenceTreeIndent + 12}px`\n }}\n >\n <Spinner className=\"text-[var(--text-secondary)]\" size={14} />\n <span>{copy.t(\"referencePicker.loading\")}</span>\n </div>\n ) : childEntries.length > 0 ? (\n <div className=\"space-y-0.5\">\n {childEntries.map((childEntry) => (\n <WorkspaceFileReferencePickerTreeEntry\n childDepth={childDepth + 1}\n copy={copy}\n directoryStateByPath={directoryStateByPath}\n entry={childEntry}\n expandedFolderPaths={expandedFolderPaths}\n focusedPath={focusedPath}\n key={childEntry.path}\n selectedRefs={selectedRefs}\n onFocusPath={onFocusPath}\n onToggleFolder={onToggleFolder}\n onToggleRef={onToggleRef}\n />\n ))}\n </div>\n ) : childState?.loaded ? (\n <div\n className=\"px-2 py-2 text-[11px] text-[var(--text-secondary)]\"\n style={{\n paddingLeft: `${childDepth * workspaceFileReferenceTreeIndent + 12}px`\n }}\n >\n {copy.t(\"referencePicker.emptyDirectory\")}\n </div>\n ) : null\n ) : null;\n\n return (\n <div>\n <div\n aria-current={focused ? \"true\" : undefined}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-[6px] py-1.5 pr-1 transition-colors select-none\",\n \"nodrag [-webkit-app-region:no-drag]\",\n focused || selected\n ? \"bg-transparency-block\"\n : \"hover:bg-transparency-block\"\n )}\n role=\"button\"\n tabIndex={0}\n style={{\n paddingLeft: `${(childDepth - 1) * workspaceFileReferenceTreeIndent + 8}px`\n }}\n onClick={handleRowSelect}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleRowSelect();\n }\n }}\n >\n {isFolder ? (\n <button\n aria-label={resolveWorkspaceFileReferenceLabel(entry)}\n className=\"nodrag grid size-5 shrink-0 place-items-center rounded-sm text-[var(--text-secondary)] [-webkit-app-region:no-drag] hover:bg-[var(--transparency-hover)]\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onToggleFolder(entry);\n }}\n >\n <ArrowRightIcon\n className={cn(\n \"size-3.5 transition-transform\",\n expanded && \"rotate-90\"\n )}\n />\n </button>\n ) : null}\n <div className=\"flex min-w-0 flex-1 items-center gap-2 text-left\">\n {isFolder ? (\n <FolderFilledIcon className=\"size-4 shrink-0 text-[var(--rich-text-folder)]\" />\n ) : (\n <FileIcon className=\"size-4 shrink-0 text-[var(--text-tertiary)]\" />\n )}\n <span className=\"truncate text-[13px] text-[var(--text-primary)]\">\n {resolveWorkspaceFileReferenceLabel(entry)}\n </span>\n </div>\n <Button\n aria-label={resolveWorkspaceFileReferenceLabel(entry)}\n aria-pressed={selected}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n className=\"nodrag shrink-0 [-webkit-app-region:no-drag]\"\n onClick={(event) => {\n event.stopPropagation();\n onFocusPath(entry.path);\n onToggleRef(entry);\n }}\n >\n {selected ? (\n <CheckIcon size={14} />\n ) : (\n <AddLinedIcon className=\"text-[var(--text-secondary)]\" size={16} />\n )}\n </Button>\n </div>\n {isFolder ? (\n <div\n className={cn(\n \"grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none\",\n expanded ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\",\n childContent && \"mt-[2px]\"\n )}\n >\n <div\n aria-hidden={expanded ? undefined : \"true\"}\n className={cn(\n \"min-h-0 overflow-hidden transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none\",\n expanded\n ? \"translate-y-0 opacity-100\"\n : \"-translate-y-1 opacity-0\"\n )}\n inert={expanded ? undefined : true}\n >\n {childContent}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction WorkspaceFileReferencePickerSearchEntry({\n entry,\n focused,\n selected,\n onFocusPath,\n onToggleRef\n}: {\n entry: WorkspaceFileReference;\n focused: boolean;\n selected: boolean;\n onFocusPath: (path: string) => void;\n onToggleRef: (entry: WorkspaceFileReference) => void;\n}): JSX.Element {\n const isFolder = entry.kind === \"folder\";\n\n return (\n <div\n aria-current={focused ? \"true\" : undefined}\n className={cn(\n \"grid cursor-pointer grid-cols-[minmax(0,1fr)_auto] items-center gap-3 rounded-[6px] border py-2.5 pr-1 pl-3 transition-colors select-none\",\n \"nodrag [-webkit-app-region:no-drag]\",\n focused || selected\n ? \"border-border bg-transparency-block\"\n : \"border-transparent bg-transparent hover:border-border/70 hover:bg-transparency-block\"\n )}\n role=\"button\"\n tabIndex={0}\n onClick={() => onFocusPath(entry.path)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onFocusPath(entry.path);\n }\n }}\n >\n <div className=\"nodrag flex min-w-0 items-center gap-3 text-left [-webkit-app-region:no-drag]\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-lg bg-[var(--transparency-block)] text-[var(--text-tertiary)]\">\n {isFolder ? (\n <FolderFilledIcon className=\"size-4 text-[var(--rich-text-folder)]\" />\n ) : (\n <FileIcon className=\"size-4 text-[var(--text-tertiary)]\" />\n )}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-[13px] font-medium text-[var(--text-primary)]\">\n {resolveWorkspaceFileReferenceLabel(entry)}\n </span>\n <Tooltip delayDuration={300}>\n <TooltipTrigger asChild>\n <span className=\"block truncate text-[11px] text-[var(--text-secondary)]\">\n {entry.path}\n </span>\n </TooltipTrigger>\n <TooltipContent\n className=\"max-w-[min(520px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n side=\"top\"\n >\n {entry.path}\n </TooltipContent>\n </Tooltip>\n </span>\n </div>\n <Button\n aria-label={resolveWorkspaceFileReferenceLabel(entry)}\n aria-pressed={selected}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n className=\"nodrag [-webkit-app-region:no-drag]\"\n onClick={(event) => {\n event.stopPropagation();\n onFocusPath(entry.path);\n onToggleRef(entry);\n }}\n >\n {selected ? (\n <CheckIcon size={14} />\n ) : (\n <AddLinedIcon className=\"text-[var(--text-secondary)]\" size={16} />\n )}\n </Button>\n </div>\n );\n}\n\nfunction WorkspaceFileReferencePickerFeedback({\n children\n}: {\n children: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center px-4 text-center text-[13px] text-[var(--text-secondary)]\">\n {children}\n </div>\n );\n}\n\nexport function resolveWorkspaceFileReferenceLabel(\n ref: WorkspaceFileReference\n): string {\n return (\n ref.displayName || ref.path.split(\"/\").filter(Boolean).at(-1) || ref.path\n );\n}\n","import {\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent,\n type ReactNode,\n type RefObject\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useComposedInputValue } from \"@tutti-os/ui-react-hooks\";\nimport {\n ArrowRightIcon,\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CheckIcon,\n ChevronDownIcon,\n CloseIcon,\n FolderFilledIcon,\n Input,\n IssueIcon,\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n ScrollArea,\n SearchIcon,\n Spinner,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport { AddLinedIcon } from \"@tutti-os/ui-system/icons\";\nimport {\n WorkspaceFilePreviewSurface,\n type WorkspaceFilePreviewSurfaceState\n} from \"@tutti-os/workspace-file-preview/react\";\nimport {\n WorkspaceFileEntryIcon,\n useWorkspaceFileEntryIconUrls,\n WorkspaceFileManagerContextMenu,\n resolveRevealInFolderLabel,\n type WorkspaceFileEntry,\n type WorkspaceFileManagerI18nRuntime,\n type WorkspaceFileOpenWithApplication\n} from \"@tutti-os/workspace-file-manager\";\nimport type {\n NodeRef,\n ReferenceLocateTarget,\n ReferenceNode\n} from \"../../../contracts/referenceSource.ts\";\nimport type {\n WorkspaceFileReference,\n WorkspaceFileReferenceCopy\n} from \"../../../contracts/index.ts\";\nimport type { ReferenceSourceAggregator } from \"../../../core/referenceSourceAggregator.ts\";\nimport {\n base64UrlDecode,\n nodeRefKey,\n type ReferenceFilterCategory\n} from \"../../../core/index.ts\";\nimport {\n useReferenceSourcePickerView,\n type ReferenceNodePreviewState,\n type ReferenceGroupedSelection\n} from \"../../../react/internal/reference/useReferenceSourcePickerView.ts\";\nimport {\n formatReferenceNodePathText,\n formatReferencePreviewDateTime,\n resolveReferencePreviewTimestampMs,\n resolveReferencePreviewSizeBytes\n} from \"./referenceSourcePickerPresentation.ts\";\n\nexport interface ReferenceSourcePickerProps {\n aggregator: ReferenceSourceAggregator;\n copy: WorkspaceFileReferenceCopy;\n /** 可选:打开时直达某事项/应用分组(展开并聚焦)。 */\n initialTarget?: ReferenceLocateTarget | null;\n isNodeSelectable?: (node: ReferenceNode) => boolean;\n fileManagerCopy?: WorkspaceFileManagerI18nRuntime;\n hostOs?: NodeJS.Platform;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => JSX.Element | null;\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n onClose: () => void;\n onConfirm: (refs: WorkspaceFileReference[]) => void;\n /**\n * 可选:启用「文件夹=一个 bundle 节点」确认形态。提供时确认走 confirmGrouped,\n * navigable 源的选中文件夹折叠成 bundle 回调,其余仍为单条文件。\n */\n onConfirmBundles?: (result: ReferenceGroupedSelection) => void;\n open: boolean;\n workspaceId: string;\n}\n\n/**\n * 左栏二级分组(应用/任务列表)默认最多展示的条目数;超出则折叠在「拉取更多」之后。\n * 点击「拉取更多」先展开已加载的隐藏分组;已加载分组全部可见后,若源端仍有续页(cursor),\n * 再复用同一入口拉取下一页。\n */\nconst SIDEBAR_GROUP_PAGE_SIZE = 5;\n\ntype PickerView = ReturnType<typeof useReferenceSourcePickerView>;\ntype ReferenceNodeIconUrlState = ReturnType<\n typeof useWorkspaceFileEntryIconUrls\n>;\ninterface ReferenceSourceContextMenuState {\n node: ReferenceNode;\n x: number;\n y: number;\n}\n\n/** react-resizable-panels 命令式句柄(只用到 resize)。 */\ntype ResizablePanelHandle = { resize: (size: number) => void };\n\n/**\n * 双击分割线:把 panel 自动适配到内容自然宽度。\n * 量 `[data-autofit-label]`(truncate 元素的 scrollWidth = 完整文本宽度)的最右边缘,\n * 加上尾部控件/内边距,折算成占整体宽度的百分比;resize 内部会按 minSize 再做夹取。\n */\nfunction autoFitPanelWidth(\n groupEl: HTMLElement | null,\n contentEl: HTMLElement | null,\n panel: ResizablePanelHandle | null,\n trailingPx: number\n): void {\n if (!groupEl || !contentEl || !panel) {\n return;\n }\n const groupWidth = groupEl.clientWidth;\n if (groupWidth <= 0) {\n return;\n }\n const contentLeft = contentEl.getBoundingClientRect().left;\n const labels = contentEl.querySelectorAll<HTMLElement>(\n \"[data-autofit-label]\"\n );\n let maxRight = 0;\n labels.forEach((label) => {\n const right =\n label.getBoundingClientRect().left - contentLeft + label.scrollWidth;\n if (right > maxRight) {\n maxRight = right;\n }\n });\n if (maxRight <= 0) {\n return;\n }\n const naturalWidth = maxRight + trailingPx;\n panel.resize(Math.min(80, (naturalWidth / groupWidth) * 100));\n}\n\nexport function ReferenceSourcePicker({\n aggregator,\n copy,\n fileManagerCopy,\n hostOs = \"darwin\",\n initialTarget,\n isNodeSelectable,\n onClose,\n onConfirm,\n onConfirmBundles,\n open,\n resolveEntryIconUrl,\n resolveOpenWithApplicationIcon,\n workspaceId\n}: ReferenceSourcePickerProps): JSX.Element | null {\n const titleId = useId();\n const view = useReferenceSourcePickerView({\n aggregator,\n workspaceId,\n open,\n workspaceRootGroupLabel: copy.t(\"referencePicker.workspaceRootGroup\"),\n initialTarget,\n isNodeSelectable,\n onClose,\n onConfirm,\n onConfirmBundles\n });\n\n // 文件类型筛选已下沉为查询参数(view.activeFilters);此处只做切换/清空的转发。\n const activeFilterSet = new Set(view.activeFilters);\n const toggleFilter = (id: string) => {\n const next = new Set(activeFilterSet);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n view.setFilters([...next]);\n };\n const clearFilters = () => view.setFilters([]);\n const searchInput = useComposedInputValue({\n onCommit: view.setSearchQuery,\n value: view.searchQuery\n });\n useEffect(() => {\n if (!open) {\n return;\n }\n const handleEscapeKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== \"Escape\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n onClose();\n };\n document.addEventListener(\"keydown\", handleEscapeKeyDown, {\n capture: true\n });\n return () => {\n document.removeEventListener(\"keydown\", handleEscapeKeyDown, {\n capture: true\n });\n };\n }, [onClose, open]);\n\n // 三栏可拖拽 + 双击自动适配:layoutRef 量整体宽度,content/panel ref 用于双击适配。\n const layoutRef = useRef<HTMLDivElement | null>(null);\n const menuBoundaryRef = useRef<HTMLDivElement | null>(null);\n const contextMenuRef = useRef<HTMLDivElement | null>(null);\n const sidebarContentRef = useRef<HTMLDivElement | null>(null);\n const middleContentRef = useRef<HTMLDivElement | null>(null);\n const sidebarPanelRef = useRef<ResizablePanelHandle | null>(null);\n const middlePanelRef = useRef<ResizablePanelHandle | null>(null);\n const [contextMenu, setContextMenu] =\n useState<ReferenceSourceContextMenuState | null>(null);\n const [openWithApplications, setOpenWithApplications] = useState<\n WorkspaceFileOpenWithApplication[]\n >([]);\n const [openWithLoading, setOpenWithLoading] = useState(false);\n const retainedIconEntries = useMemo(\n () =>\n collectReferenceNodeIconEntries({\n childrenByKey: view.childrenByKey,\n currentEntries: view.currentEntries,\n expandedKeys: view.expandedKeys,\n focusedNode: view.focusedNode,\n searchResults: view.searchResults,\n selection: view.selection,\n sidebarGroupsBySource: view.sidebarGroupsBySource\n }),\n [\n view.childrenByKey,\n view.currentEntries,\n view.expandedKeys,\n view.focusedNode,\n view.searchResults,\n view.selection,\n view.sidebarGroupsBySource\n ]\n );\n const iconUrls = useWorkspaceFileEntryIconUrls({\n entries: retainedIconEntries,\n includeImageThumbnails: resolveEntryIconUrl !== undefined,\n resolveEntryIconUrl\n });\n\n useEffect(() => {\n if (!contextMenu || !fileManagerCopy) {\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n return;\n }\n\n let cancelled = false;\n const cachedApplications = view.getCachedOpenWithApplications(\n contextMenu.node\n );\n if (cachedApplications) {\n setOpenWithApplications(cachedApplications);\n setOpenWithLoading(false);\n return;\n }\n\n setOpenWithApplications([]);\n setOpenWithLoading(true);\n void view\n .listOpenWithApplications(contextMenu.node)\n .then((applications) => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications(applications);\n setOpenWithLoading(false);\n })\n .catch(() => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [contextMenu?.node, fileManagerCopy]);\n\n useEffect(() => {\n if (!contextMenu) {\n return;\n }\n\n function handlePointerDown(event: globalThis.PointerEvent): void {\n const target = event.target;\n if (target instanceof Node && contextMenuRef.current?.contains(target)) {\n return;\n }\n if (\n target instanceof Element &&\n target.closest(\"[data-workspace-file-manager-submenu]\")\n ) {\n return;\n }\n setContextMenu(null);\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n setContextMenu(null);\n }\n }\n\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [contextMenu]);\n\n const openReferenceContextMenu = (\n event: MouseEvent<HTMLElement>,\n node: ReferenceNode\n ): void => {\n if (!fileManagerCopy || node.kind !== \"file\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n view.setFocusedNode(node);\n setContextMenu({\n node,\n x: event.clientX,\n y: event.clientY\n });\n };\n\n if (!open) {\n return null;\n }\n\n const hasSelectedGroup = view.selectedGroupKey != null;\n const fitSidebar = () =>\n autoFitPanelWidth(\n layoutRef.current,\n sidebarContentRef.current,\n sidebarPanelRef.current,\n 36\n );\n const fitMiddle = () =>\n autoFitPanelWidth(\n layoutRef.current,\n middleContentRef.current,\n middlePanelRef.current,\n 56\n );\n const handleReferencePickerKeyDownCapture = (\n event: ReactKeyboardEvent<HTMLDivElement>\n ): void => {\n if (event.key !== \"Escape\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n onClose();\n };\n\n const dialog = (\n <div\n className=\"nodrag fixed inset-0 grid place-items-center bg-[var(--backdrop)] px-3 py-4 backdrop-blur-md [-webkit-app-region:no-drag] sm:px-6 sm:py-8\"\n style={{ zIndex: \"var(--z-panel)\" }}\n onClick={onClose}\n onKeyDownCapture={handleReferencePickerKeyDownCapture}\n >\n <Card\n aria-labelledby={titleId}\n aria-modal=\"true\"\n className=\"nodrag flex h-[min(88vh,46rem)] w-full max-w-5xl flex-col gap-0 overflow-hidden border-[var(--line-1)] bg-[var(--background-fronted)] py-0 text-[var(--text-primary)] shadow-panel [-webkit-app-region:no-drag]\"\n role=\"dialog\"\n onClick={(event) => event.stopPropagation()}\n >\n <CardHeader className=\"gap-3 px-4 pt-4 pb-4 sm:px-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <CardTitle id={titleId}>\n {copy.t(\"referencePicker.title\")}\n </CardTitle>\n <Button\n aria-label={copy.t(\"actions.cancel\")}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n >\n <CloseIcon size={16} />\n </Button>\n </div>\n </CardHeader>\n\n <CardContent className=\"flex min-h-0 flex-1 overflow-hidden border-t border-[var(--line-1)] p-0\">\n <div ref={layoutRef} className=\"flex min-h-0 min-w-0 flex-1\">\n <ResizablePanelGroup\n className=\"min-h-0 min-w-0 flex-1\"\n orientation=\"horizontal\"\n // 三栏初始占比(侧边栏更窄,类 Finder)。v4 在三面板下 `defaultSize` 初始布局会因注册时序被忽略而回退等分,\n // 这里用 `defaultLayout`(按 panel id 指定 flexGrow 权重)作为权威初始布局。\n defaultLayout={{ sidebar: 2.5, middle: 4.5, preview: 3 }}\n >\n <ResizablePanel\n id=\"sidebar\"\n className=\"min-h-0 min-w-0\"\n defaultSize={15}\n minSize=\"150px\"\n panelRef={(handle) => {\n sidebarPanelRef.current = handle;\n }}\n >\n <SourceSidebar\n contentRef={sidebarContentRef}\n copy={copy}\n view={view}\n />\n </ResizablePanel>\n <ResizableHandle\n disableDoubleClick\n withHandle\n className=\"after:bg-[var(--line-1)]\"\n onDoubleClick={fitSidebar}\n />\n <ResizablePanel\n id=\"middle\"\n className=\"min-h-0 min-w-0\"\n defaultSize={50}\n minSize=\"260px\"\n panelRef={(handle) => {\n middlePanelRef.current = handle;\n }}\n >\n <div\n ref={menuBoundaryRef}\n className=\"relative flex h-full min-h-0 flex-col\"\n data-slot=\"viewport-menu-boundary\"\n data-workspace-file-menu-boundary=\"\"\n style={\n {\n \"--workspace-file-manager-dialog-overlay-z-index\":\n \"100710\"\n } as CSSProperties\n }\n >\n <div className=\"flex items-center gap-2 border-b border-[var(--line-1)] p-3\">\n <div className=\"relative flex-1\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-[var(--text-tertiary)]\" />\n <Input\n className=\"pl-9\"\n placeholder={copy.t(\n \"referencePicker.searchPlaceholder\"\n )}\n value={searchInput.value}\n onBlur={searchInput.onBlur}\n onChange={searchInput.onChange}\n onCompositionEnd={searchInput.onCompositionEnd}\n onCompositionStart={searchInput.onCompositionStart}\n />\n </div>\n {view.capabilities?.filterable &&\n view.filterCategories.length > 0 ? (\n <FilterCategoryFilter\n categories={view.filterCategories}\n copy={copy}\n selected={activeFilterSet}\n onClear={clearFilters}\n onToggle={toggleFilter}\n />\n ) : null}\n </div>\n <ScrollArea\n className=\"min-h-0 flex-1\"\n viewportProps={{\n // 拉到底部(距底 <120px)自动加载更多 —— 查询态走增长式分页,\n // 浏览态走 cursor 续页。已在加载/无更多时由 loadMore 内部 no-op。\n onScroll: (event) => {\n const el = event.currentTarget;\n if (\n view.hasMore &&\n !view.isLoading &&\n !view.isLoadingMore &&\n el.scrollHeight - el.scrollTop - el.clientHeight < 120\n ) {\n view.loadMore();\n }\n }\n }}\n >\n <div\n ref={middleContentRef}\n className=\"flex flex-col gap-[2px] p-3\"\n >\n {view.isLoading ? (\n <Feedback>\n <Spinner size={16} />\n </Feedback>\n ) : view.isQuery ? (\n // 查询态(关键词或筛选):扁平结果\n view.searchResults.length === 0 ? (\n <Feedback>\n {copy.t(\"referencePicker.emptySearch\")}\n </Feedback>\n ) : (\n view.searchResults.map((node) => (\n <SearchResultRow\n key={nodeRefKey(node.ref)}\n focused={isFocused(view.focusedNode, node)}\n iconUrls={iconUrls}\n node={node}\n selected={view.isSelected(node)}\n onFocus={view.setFocusedNode}\n onContextMenu={openReferenceContextMenu}\n onOpen={view.openNode}\n selectable={view.isSelectable(node)}\n onSingleSelect={\n view.toggleSingleSelectionAndExpand\n }\n onToggle={view.toggleSelection}\n />\n ))\n )\n ) : view.currentEntries.length === 0 ? (\n <Feedback>\n {copy.t(\n hasSelectedGroup\n ? \"referencePicker.emptyDirectory\"\n : \"referencePicker.selectGroupHint\"\n )}\n </Feedback>\n ) : (\n // 浏览:就地递归展开树(复刻 agent 引用面板文件树交互)\n view.currentEntries.map((node) => (\n <TreeNodeRow\n key={nodeRefKey(node.ref)}\n copy={copy}\n depth={0}\n iconUrls={iconUrls}\n node={node}\n onContextMenu={openReferenceContextMenu}\n view={view}\n />\n ))\n )}\n {view.hasMore && (view.isQuery || hasSelectedGroup) ? (\n <Button\n className=\"mt-1 w-full\"\n disabled={view.isLoadingMore}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={view.loadMore}\n >\n {view.isLoadingMore ? (\n <Spinner className=\"text-current\" size={14} />\n ) : null}\n {copy.t(\"referencePicker.loadMore\")}\n </Button>\n ) : null}\n </div>\n </ScrollArea>\n {fileManagerCopy ? (\n <WorkspaceFileManagerContextMenu\n busy={view.isOpeningReference}\n contextMenu={\n contextMenu\n ? {\n entry: referenceNodeToWorkspaceFileEntry(\n contextMenu.node\n ),\n x: contextMenu.x,\n y: contextMenu.y\n }\n : null\n }\n contextMenuRef={contextMenuRef}\n copy={fileManagerCopy}\n openWithApplications={openWithApplications}\n openWithLoading={openWithLoading}\n positionMode=\"viewport\"\n revealInFolderLabel={resolveRevealInFolderLabel(\n fileManagerCopy,\n hostOs\n )}\n resolveOpenWithApplicationIcon={\n resolveOpenWithApplicationIcon\n }\n showCopyAction={false}\n showCopyPathAction={false}\n showCreateAction={false}\n showDeleteAction={false}\n showExportAction={false}\n showImportAction={false}\n showOpenInAppBrowserAction={false}\n showOpenInDefaultBrowserAction={false}\n showOpenInFileViewerAction={false}\n showOpenWithAction={true}\n showOpenWithOtherAction={true}\n showRevealInFolderAction={true}\n showRenameAction={false}\n onClose={() => setContextMenu(null)}\n onCopy={noopAsync}\n onCopyPath={noopAsync}\n onCreateDirectory={noopVoid}\n onCreateFile={noopVoid}\n onDelete={noopVoid}\n onExport={noopAsync}\n onImport={noopAsync}\n onOpen={async () => {\n if (contextMenu) {\n await view.openNode(contextMenu.node);\n }\n }}\n onOpenInAppBrowser={noopAsync}\n onOpenInDefaultBrowser={noopAsync}\n onOpenInFileViewer={noopAsync}\n onOpenWithApplication={async (applicationPath) => {\n if (contextMenu) {\n await view.openWithApplication(\n contextMenu.node,\n applicationPath\n );\n }\n }}\n onOpenWithOtherApplication={async () => {\n if (contextMenu) {\n await view.openWithOtherApplication(\n contextMenu.node,\n fileManagerCopy.t(\"openWithOtherPickerPrompt\")\n );\n }\n }}\n onRevealInFolder={async () => {\n if (contextMenu) {\n await view.revealNode(contextMenu.node);\n }\n }}\n onRename={noopVoid}\n />\n ) : null}\n </div>\n </ResizablePanel>\n <ResizableHandle\n disableDoubleClick\n withHandle\n className=\"after:bg-[var(--line-1)]\"\n onDoubleClick={fitMiddle}\n />\n <ResizablePanel\n id=\"preview\"\n className=\"min-h-0 min-w-0\"\n defaultSize={30}\n minSize=\"200px\"\n >\n <PreviewInfoPane\n copy={copy}\n hierarchy={view.breadcrumb}\n iconUrls={iconUrls}\n node={view.focusedNode}\n previewState={view.previewState}\n sourceLabel={view.activeTabLabel}\n />\n </ResizablePanel>\n </ResizablePanelGroup>\n </div>\n </CardContent>\n\n <Footer\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmLabel={copy.t(\"referencePicker.confirm\")}\n countLabel={copy.t(\"referencePicker.selectedCount\", {\n count: view.selectionCount\n })}\n disabled={view.selectionCount === 0}\n loading={view.isConfirming}\n selection={view.selection}\n onClose={onClose}\n onConfirm={() => void view.confirm()}\n />\n </Card>\n </div>\n );\n\n if (typeof document === \"undefined\") {\n return dialog;\n }\n return createPortal(dialog, document.body);\n}\n\nexport interface ReferenceSourceContentPaneProps {\n aggregator: ReferenceSourceAggregator;\n className?: string;\n copy: WorkspaceFileReferenceCopy;\n fileManagerCopy?: WorkspaceFileManagerI18nRuntime;\n hostOs?: NodeJS.Platform;\n initialNodeRef?: NodeRef | null;\n initialTarget?: ReferenceLocateTarget | null;\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => JSX.Element | null;\n workspaceId: string;\n}\n\nexport function ReferenceSourceContentPane({\n aggregator,\n className,\n copy,\n fileManagerCopy,\n hostOs = \"darwin\",\n initialNodeRef = null,\n initialTarget = null,\n resolveEntryIconUrl,\n resolveOpenWithApplicationIcon,\n workspaceId\n}: ReferenceSourceContentPaneProps): JSX.Element {\n const view = useReferenceSourcePickerView({\n aggregator,\n workspaceId,\n open: true,\n workspaceRootGroupLabel: copy.t(\"referencePicker.workspaceRootGroup\"),\n initialTarget,\n isNodeSelectable: () => false,\n onClose: noopVoid,\n onConfirm: noopVoid\n });\n useEffect(() => {\n if (!initialNodeRef) {\n return;\n }\n if (view.selectedGroupKey === nodeRefKey(initialNodeRef)) {\n return;\n }\n const group = view.sidebarGroupsBySource[initialNodeRef.sourceId]?.find(\n (item) => item.ref.nodeId === initialNodeRef.nodeId\n );\n if (!group) {\n return;\n }\n view.selectGroup(group);\n }, [\n initialNodeRef,\n view.selectedGroupKey,\n view.sidebarGroupsBySource,\n view.selectGroup\n ]);\n const activeFilterSet = new Set(view.activeFilters);\n const toggleFilter = (id: string) => {\n const next = new Set(activeFilterSet);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n view.setFilters([...next]);\n };\n const clearFilters = () => view.setFilters([]);\n const searchInput = useComposedInputValue({\n onCommit: view.setSearchQuery,\n value: view.searchQuery\n });\n const contextMenuRef = useRef<HTMLDivElement | null>(null);\n const [contextMenu, setContextMenu] =\n useState<ReferenceSourceContextMenuState | null>(null);\n const [openWithApplications, setOpenWithApplications] = useState<\n WorkspaceFileOpenWithApplication[]\n >([]);\n const [openWithLoading, setOpenWithLoading] = useState(false);\n const retainedIconEntries = useMemo(\n () =>\n collectReferenceNodeIconEntries({\n childrenByKey: view.childrenByKey,\n currentEntries: view.currentEntries,\n expandedKeys: view.expandedKeys,\n focusedNode: view.focusedNode,\n searchResults: view.searchResults,\n selection: view.selection,\n sidebarGroupsBySource: view.sidebarGroupsBySource\n }),\n [\n view.childrenByKey,\n view.currentEntries,\n view.expandedKeys,\n view.focusedNode,\n view.searchResults,\n view.selection,\n view.sidebarGroupsBySource\n ]\n );\n const iconUrls = useWorkspaceFileEntryIconUrls({\n entries: retainedIconEntries,\n includeImageThumbnails: resolveEntryIconUrl !== undefined,\n resolveEntryIconUrl\n });\n\n useEffect(() => {\n if (!contextMenu || !fileManagerCopy) {\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n return;\n }\n\n let cancelled = false;\n const cachedApplications = view.getCachedOpenWithApplications(\n contextMenu.node\n );\n if (cachedApplications) {\n setOpenWithApplications(cachedApplications);\n setOpenWithLoading(false);\n return;\n }\n\n setOpenWithApplications([]);\n setOpenWithLoading(true);\n void view\n .listOpenWithApplications(contextMenu.node)\n .then((applications) => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications(applications);\n setOpenWithLoading(false);\n })\n .catch(() => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [contextMenu?.node, fileManagerCopy]);\n\n useEffect(() => {\n if (!contextMenu) {\n return;\n }\n\n function handlePointerDown(event: globalThis.PointerEvent): void {\n const target = event.target;\n if (target instanceof Node && contextMenuRef.current?.contains(target)) {\n return;\n }\n if (\n target instanceof Element &&\n target.closest(\"[data-workspace-file-manager-submenu]\")\n ) {\n return;\n }\n setContextMenu(null);\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n setContextMenu(null);\n }\n }\n\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [contextMenu]);\n\n const openReferenceContextMenu = (\n event: MouseEvent<HTMLElement>,\n node: ReferenceNode\n ): void => {\n if (!fileManagerCopy || node.kind !== \"file\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n view.setFocusedNode(node);\n setContextMenu({\n node,\n x: event.clientX,\n y: event.clientY\n });\n };\n const hasSelectedGroup = view.selectedGroupKey != null;\n\n return (\n <div\n className={cn(\n \"relative flex min-h-0 min-w-0 flex-1 overflow-hidden bg-[var(--background-fronted)]\",\n className\n )}\n data-slot=\"viewport-menu-boundary\"\n data-workspace-file-menu-boundary=\"\"\n style={\n {\n \"--workspace-file-manager-dialog-overlay-z-index\": \"20\"\n } as CSSProperties\n }\n >\n <div className=\"flex min-h-0 min-w-0 flex-[1.7] flex-col border-r border-[var(--line-1)]\">\n <div className=\"flex items-center gap-2 border-b border-[var(--line-1)] p-3\">\n <div className=\"relative flex-1\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-[var(--text-tertiary)]\" />\n <Input\n className=\"pl-9\"\n placeholder={copy.t(\"referencePicker.searchPlaceholder\")}\n value={searchInput.value}\n onBlur={searchInput.onBlur}\n onChange={searchInput.onChange}\n onCompositionEnd={searchInput.onCompositionEnd}\n onCompositionStart={searchInput.onCompositionStart}\n />\n </div>\n {view.capabilities?.filterable && view.filterCategories.length > 0 ? (\n <FilterCategoryFilter\n categories={view.filterCategories}\n copy={copy}\n selected={activeFilterSet}\n onClear={clearFilters}\n onToggle={toggleFilter}\n />\n ) : null}\n </div>\n <ScrollArea\n className=\"min-h-0 flex-1\"\n viewportProps={{\n onScroll: (event) => {\n const el = event.currentTarget;\n if (\n view.hasMore &&\n !view.isLoading &&\n !view.isLoadingMore &&\n el.scrollHeight - el.scrollTop - el.clientHeight < 120\n ) {\n view.loadMore();\n }\n }\n }}\n >\n <div className=\"flex flex-col gap-[2px] p-3\">\n {view.isLoading ? (\n <Feedback>\n <Spinner size={16} />\n </Feedback>\n ) : view.isQuery ? (\n view.searchResults.length === 0 ? (\n <Feedback>{copy.t(\"referencePicker.emptySearch\")}</Feedback>\n ) : (\n view.searchResults.map((node) => (\n <SearchResultRow\n key={nodeRefKey(node.ref)}\n focused={isFocused(view.focusedNode, node)}\n iconUrls={iconUrls}\n node={node}\n selected={view.isSelected(node)}\n onFocus={view.setFocusedNode}\n onContextMenu={openReferenceContextMenu}\n onOpen={view.openNode}\n selectable={view.isSelectable(node)}\n onSingleSelect={view.toggleSingleSelectionAndExpand}\n onToggle={view.toggleSelection}\n />\n ))\n )\n ) : view.currentEntries.length === 0 ? (\n <Feedback>\n {copy.t(\n hasSelectedGroup\n ? \"referencePicker.emptyDirectory\"\n : \"referencePicker.selectGroupHint\"\n )}\n </Feedback>\n ) : (\n view.currentEntries.map((node) => (\n <TreeNodeRow\n key={nodeRefKey(node.ref)}\n copy={copy}\n depth={0}\n iconUrls={iconUrls}\n node={node}\n onContextMenu={openReferenceContextMenu}\n view={view}\n />\n ))\n )}\n {view.hasMore && (view.isQuery || hasSelectedGroup) ? (\n <Button\n className=\"mt-1 w-full\"\n disabled={view.isLoadingMore}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={view.loadMore}\n >\n {view.isLoadingMore ? (\n <Spinner className=\"text-current\" size={14} />\n ) : null}\n {copy.t(\"referencePicker.loadMore\")}\n </Button>\n ) : null}\n </div>\n </ScrollArea>\n {fileManagerCopy ? (\n <WorkspaceFileManagerContextMenu\n busy={view.isOpeningReference}\n contextMenu={\n contextMenu\n ? {\n entry: referenceNodeToWorkspaceFileEntry(contextMenu.node),\n x: contextMenu.x,\n y: contextMenu.y\n }\n : null\n }\n contextMenuRef={contextMenuRef}\n copy={fileManagerCopy}\n openWithApplications={openWithApplications}\n openWithLoading={openWithLoading}\n positionMode=\"viewport\"\n revealInFolderLabel={resolveRevealInFolderLabel(\n fileManagerCopy,\n hostOs\n )}\n resolveOpenWithApplicationIcon={resolveOpenWithApplicationIcon}\n showCopyAction={false}\n showCopyPathAction={false}\n showCreateAction={false}\n showDeleteAction={false}\n showExportAction={false}\n showImportAction={false}\n showOpenInAppBrowserAction={false}\n showOpenInDefaultBrowserAction={false}\n showOpenInFileViewerAction={false}\n showOpenWithAction={true}\n showOpenWithOtherAction={true}\n showRevealInFolderAction={true}\n showRenameAction={false}\n onClose={() => setContextMenu(null)}\n onCopy={noopAsync}\n onCopyPath={noopAsync}\n onCreateDirectory={noopVoid}\n onCreateFile={noopVoid}\n onDelete={noopVoid}\n onExport={noopAsync}\n onImport={noopAsync}\n onOpen={async () => {\n if (contextMenu) {\n await view.openNode(contextMenu.node);\n }\n }}\n onOpenInAppBrowser={noopAsync}\n onOpenInDefaultBrowser={noopAsync}\n onOpenInFileViewer={noopAsync}\n onOpenWithApplication={async (applicationPath) => {\n if (contextMenu) {\n await view.openWithApplication(\n contextMenu.node,\n applicationPath\n );\n }\n }}\n onOpenWithOtherApplication={async () => {\n if (contextMenu) {\n await view.openWithOtherApplication(\n contextMenu.node,\n fileManagerCopy.t(\"openWithOtherPickerPrompt\")\n );\n }\n }}\n onRevealInFolder={async () => {\n if (contextMenu) {\n await view.revealNode(contextMenu.node);\n }\n }}\n onRename={noopVoid}\n />\n ) : null}\n </div>\n <div className=\"@max-[760px]/workspace-file-manager:hidden min-h-0 min-w-[220px] flex-1\">\n <PreviewInfoPane\n copy={copy}\n hierarchy={view.breadcrumb}\n iconUrls={iconUrls}\n node={view.focusedNode}\n previewState={view.previewState}\n sourceLabel={view.activeTabLabel}\n />\n </div>\n </div>\n );\n}\n\n/**\n * 二级分组无自带 iconUrl 时的兜底图标:按源 metadata.icon 令牌选取。\n * 议题源(icon: \"issue\")用「事项」应用图标,其余回退到文件夹图标。\n */\nfunction GroupFallbackIcon({\n icon,\n className\n}: {\n icon?: string;\n className: string;\n}): JSX.Element {\n if (icon === \"issue\") {\n return <IssueIcon className={className} />;\n }\n return <FolderFilledIcon className={className} />;\n}\n\n/**\n * 左侧边栏(类 macOS Finder 边栏):\n * 一级源(本地/应用/任务)作为常驻分组标题、默认全部展开、无折叠箭头;\n * 其下二级目录分组与标题左对齐(无额外缩进),靠图标区分层级。\n */\nfunction SourceSidebar({\n copy,\n view,\n contentRef\n}: {\n copy: WorkspaceFileReferenceCopy;\n view: PickerView;\n contentRef: RefObject<HTMLDivElement | null>;\n}): JSX.Element {\n // 选中分组(含 initialTarget 定位结果)变化时,把它滚入可视区。\n const selectedGroupRef = useRef<HTMLButtonElement | null>(null);\n useEffect(() => {\n selectedGroupRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [view.selectedGroupKey]);\n // 每个源已展示的分组上限(默认一页);点「拉取更多」按页累加。源切换/重开会重置。\n const [shownBySource, setShownBySource] = useState<Record<string, number>>(\n {}\n );\n const loadMoreGroups = (sourceId: string) => {\n const groups = view.sidebarGroupsBySource[sourceId] ?? [];\n const limit = shownBySource[sourceId] ?? SIDEBAR_GROUP_PAGE_SIZE;\n // 点「查看更多」先展示全部已加载项;已全部可见时,同一入口再拉源端下一页。\n const visibleCount = Math.max(groups.length, limit);\n if (groups.length > limit) {\n setShownBySource((prev) => ({ ...prev, [sourceId]: visibleCount }));\n return;\n }\n if (view.sidebarHasMoreBySource[sourceId] ?? false) {\n view.loadMoreSidebarGroups(sourceId);\n }\n };\n return (\n <ScrollArea className=\"h-full min-h-0 w-full\">\n <div ref={contentRef} className=\"flex flex-col gap-0.5 p-2\">\n <p className=\"px-2 py-1 text-[11px] font-semibold text-[var(--text-tertiary)]\">\n {copy.t(\"referencePicker.sourceColumn\")}\n </p>\n {view.tabs.map((tab) => {\n const groups = view.sidebarGroupsBySource[tab.sourceId] ?? [];\n const limit = shownBySource[tab.sourceId] ?? SIDEBAR_GROUP_PAGE_SIZE;\n // 当前选中分组(如 initialTarget 定位到靠后的项)始终展示,避免「选中却被折叠」。\n const selectedIndex = groups.findIndex(\n (group) => nodeRefKey(group.ref) === view.selectedGroupKey\n );\n const effectiveLimit =\n selectedIndex >= limit ? selectedIndex + 1 : limit;\n const visibleGroups = groups.slice(0, effectiveLimit);\n const loadingMore =\n view.sidebarLoadingMoreBySource[tab.sourceId] ?? false;\n // 还能拉取更多 = 已加载分组超出当前展示上限,或源端仍有续页未取。\n const hasMore =\n groups.length > effectiveLimit ||\n (view.sidebarHasMoreBySource[tab.sourceId] ?? false);\n return (\n <div key={tab.sourceId} className=\"flex flex-col gap-0.5\">\n {/* 一级源:Finder 风格分区标题,无箭头、不可折叠。 */}\n <p\n className=\"px-2 pt-1.5 pb-0.5 text-[11px] font-semibold text-[var(--text-tertiary)]\"\n data-autofit-label\n >\n {tab.label}\n </p>\n {groups.length === 0 ? (\n view.isLoadingTabs ? (\n <p className=\"px-2 py-1 text-[12px] text-[var(--text-tertiary)]\">\n …\n </p>\n ) : null\n ) : (\n visibleGroups.map((group) => {\n const key = nodeRefKey(group.ref);\n const selected = key === view.selectedGroupKey;\n return (\n <button\n key={key}\n ref={selected ? selectedGroupRef : undefined}\n aria-current={selected ? \"true\" : undefined}\n className={cn(\n \"flex items-center gap-2 rounded-[6px] px-2 py-1.5 text-left text-[13px] transition-colors\",\n selected\n ? \"bg-primary/10 font-medium text-[var(--text-primary)] hover:bg-primary/15\"\n : \"text-[var(--text-secondary)] hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)]\"\n )}\n type=\"button\"\n onClick={() => view.selectGroup(group)}\n >\n {group.iconUrl ? (\n <img\n alt=\"\"\n className=\"size-4 shrink-0 rounded-[3px] object-cover\"\n src={group.iconUrl}\n />\n ) : (\n <GroupFallbackIcon\n className=\"size-4 shrink-0 text-[var(--rich-text-folder)]\"\n icon={tab.icon}\n />\n )}\n <FullTextTooltip content={group.displayName}>\n <span\n className=\"min-w-0 flex-1 truncate\"\n data-autofit-label\n >\n {group.displayName}\n </span>\n </FullTextTooltip>\n {group.childCount != null ? (\n <span className=\"shrink-0 text-[11px] text-[var(--text-tertiary)]\">\n {group.childCount}\n </span>\n ) : null}\n </button>\n );\n })\n )}\n {hasMore ? (\n <button\n className=\"flex items-center gap-1.5 rounded-[6px] px-2 py-1.5 text-left text-[12px] text-[var(--text-secondary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)] disabled:opacity-60\"\n disabled={loadingMore}\n type=\"button\"\n onClick={() => loadMoreGroups(tab.sourceId)}\n >\n {loadingMore ? (\n <Spinner\n className=\"text-[var(--text-secondary)]\"\n size={12}\n />\n ) : (\n <ChevronDownIcon\n className=\"shrink-0 text-[var(--text-secondary)]\"\n size={12}\n />\n )}\n <span>{copy.t(\"referencePicker.loadMoreGroups\")}</span>\n </button>\n ) : null}\n </div>\n );\n })}\n </div>\n </ScrollArea>\n );\n}\n\nfunction SearchResultRow({\n node,\n focused,\n iconUrls,\n selected,\n selectable,\n onFocus,\n onContextMenu,\n onSingleSelect,\n onOpen,\n onToggle\n}: {\n node: ReferenceNode;\n focused: boolean;\n iconUrls: ReferenceNodeIconUrlState;\n selected: boolean;\n selectable: boolean;\n onFocus: (node: ReferenceNode) => void;\n onContextMenu: (event: MouseEvent<HTMLElement>, node: ReferenceNode) => void;\n onOpen: (node: ReferenceNode) => Promise<void>;\n onSingleSelect: (node: ReferenceNode) => void;\n onToggle: (node: ReferenceNode) => void;\n}): JSX.Element {\n const contextLabel = node.contextLabel ?? node.ref.nodeId;\n const active = selected || (focused && selectable);\n return (\n <div\n className={cn(\n \"grid cursor-pointer grid-cols-[minmax(0,1fr)_auto] items-center gap-3 rounded-[6px] border py-2.5 pr-1 pl-3 transition-colors\",\n active\n ? \"border-border bg-transparency-block\"\n : \"border-transparent bg-transparent hover:border-border/70 hover:bg-transparency-block\"\n )}\n onClick={() => {\n onFocus(node);\n onSingleSelect(node);\n }}\n onContextMenu={(event) => onContextMenu(event, node)}\n onDoubleClick={(event) => {\n if (node.kind !== \"file\") {\n return;\n }\n event.stopPropagation();\n onFocus(node);\n void onOpen(node);\n }}\n >\n <div className=\"flex min-w-0 items-center gap-3 text-left\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-lg bg-[var(--transparency-block)] text-[var(--text-tertiary)]\">\n <ReferenceNodeIcon\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrls={iconUrls}\n node={node}\n />\n </span>\n <span className=\"min-w-0\">\n <FullTextTooltip content={node.displayName}>\n <span className=\"block truncate text-[13px] font-medium text-[var(--text-primary)]\">\n {node.displayName}\n </span>\n </FullTextTooltip>\n <FullTextTooltip content={contextLabel}>\n <span className=\"block truncate text-[11px] text-[var(--text-secondary)]\">\n {contextLabel}\n </span>\n </FullTextTooltip>\n </span>\n </div>\n {selectable ? (\n <Button\n aria-label={node.displayName}\n aria-pressed={selected}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n onFocus(node);\n onToggle(node);\n }}\n onDoubleClick={(event) => event.stopPropagation()}\n >\n {selected ? (\n <CheckIcon size={14} />\n ) : (\n <AddLinedIcon className=\"text-[var(--text-secondary)]\" size={16} />\n )}\n </Button>\n ) : null}\n </div>\n );\n}\n\n/**\n * 把 hook 的 node-keyed 预览态映射成共享预览组件的 surface state,补上本地化文案。\n * previewState 可能短暂滞后于 node(异步加载间隙),不匹配时回退到 loading/directory。\n */\nfunction toPreviewSurfaceState(\n node: ReferenceNode,\n previewState: ReferenceNodePreviewState,\n copy: WorkspaceFileReferenceCopy\n): WorkspaceFilePreviewSurfaceState<ReferenceNode> {\n if (\n !(\"node\" in previewState) ||\n nodeRefKey(previewState.node.ref) !== nodeRefKey(node.ref)\n ) {\n return node.kind === \"folder\"\n ? { entry: node, status: \"directory\" }\n : { entry: node, status: \"loading\" };\n }\n switch (previewState.status) {\n case \"directory\":\n return { entry: node, status: \"directory\" };\n case \"loading\":\n return { entry: node, status: \"loading\" };\n case \"image\":\n return {\n entry: node,\n objectUrl: previewState.objectUrl,\n status: \"image\"\n };\n case \"video\":\n return {\n entry: node,\n objectUrl: previewState.objectUrl,\n status: \"video\"\n };\n case \"text\":\n return { content: previewState.content, entry: node, status: \"text\" };\n case \"html\":\n return { content: previewState.content, entry: node, status: \"html\" };\n case \"readonly\":\n return {\n entry: node,\n message:\n previewState.reason === \"binary\"\n ? copy.t(\"referencePicker.previewBinary\")\n : previewState.reason === \"file_too_large\" ||\n previewState.reason === \"text_too_large\"\n ? copy.t(\"referencePicker.previewTooLarge\")\n : copy.t(\"referencePicker.previewUnsupported\"),\n status: \"readonly\"\n };\n case \"error\":\n return {\n entry: node,\n message: copy.t(\"referencePicker.previewError\"),\n status: \"error\"\n };\n case \"unsupported\":\n return {\n entry: node,\n message: copy.t(\"referencePicker.previewUnsupported\"),\n status: \"unsupported\"\n };\n }\n}\n\n/**\n * 产出来源徽标配色:按一级源给「产出来源」徽标着色,复用 rich-text mention\n * 的语义 token(本地文件 / 应用产物 / 事项产物各自的 @mention 同色),保持\n * 全局一致。未知源回退到默认 secondary 徽标(返回 undefined)。\n * sourceId 取值见 contracts/referenceSource.ts 的枚举说明。\n * 注意:class 必须写成完整字面量,Tailwind JIT 不扫描拼接出来的类名。\n */\nfunction sourceBadgeClassName(sourceId: string): string | undefined {\n return SOURCE_BADGE_CLASSES[sourceId];\n}\n\nconst SOURCE_BADGE_CLASSES: Record<string, string> = {\n \"workspace-file\":\n \"bg-[color-mix(in_srgb,var(--rich-text-mention-file)_12%,transparent)] text-[var(--rich-text-mention-file)]\",\n \"app-artifact\":\n \"bg-[color-mix(in_srgb,var(--rich-text-mention-app)_12%,transparent)] text-[var(--rich-text-mention-app)]\",\n \"issue-file\":\n \"bg-[color-mix(in_srgb,var(--rich-text-mention-issue)_12%,transparent)] text-[var(--rich-text-mention-issue)]\"\n};\n\nfunction FullTextTooltip({\n children,\n content\n}: {\n children: ReactNode;\n content: string;\n}): JSX.Element {\n return (\n <Tooltip delayDuration={300}>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent\n className=\"max-w-[min(520px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n side=\"top\"\n style={{\n maxWidth: \"min(520px, calc(100vw - 32px))\",\n overflowWrap: \"anywhere\",\n whiteSpace: \"normal\",\n backgroundColor: \"var(--background-fronted)\",\n border: \"1px solid var(--border-1)\",\n borderRadius: 6,\n boxShadow: \"var(--shadow-soft)\",\n color: \"var(--text-primary)\",\n padding: \"4px 8px\"\n }}\n >\n {content}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction PreviewInfoPane({\n copy,\n hierarchy,\n iconUrls,\n node,\n previewState,\n sourceLabel\n}: {\n copy: WorkspaceFileReferenceCopy;\n hierarchy: readonly ReferenceNode[];\n iconUrls: ReferenceNodeIconUrlState;\n node: ReferenceNode | null;\n previewState: ReferenceNodePreviewState;\n sourceLabel: string;\n}): JSX.Element {\n const sizeBytes = node\n ? resolveReferencePreviewSizeBytes(node, previewState)\n : null;\n const timestampMs = node ? resolveReferencePreviewTimestampMs(node) : null;\n return (\n <aside className=\"flex h-full min-h-0 w-full flex-col bg-[var(--background-fronted)]\">\n {node ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4 p-4\">\n {/* 文件查看面板:复用 file-manager 的共享预览组件,真实渲染图片/文本内容。 */}\n <WorkspaceFilePreviewSurface<ReferenceNode>\n directoryMessage={copy.t(\"referencePicker.previewFolder\")}\n emptyMessage={copy.t(\"referencePicker.emptyPreview\")}\n frameClassName=\"flex aspect-[3/2] w-full flex-col items-center justify-center overflow-hidden rounded-[8px] border border-[var(--line-2,var(--border-2))] bg-[var(--transparency-block)] p-0 text-center\"\n imageAlt={(entry) => entry.displayName}\n htmlFrameClassName=\"items-stretch justify-stretch bg-white\"\n htmlTitle={(entry) => entry.displayName}\n imageFrameClassName=\"p-3\"\n loadingIndicator={<Spinner size={16} />}\n loadingMessage={copy.t(\"referencePicker.previewLoading\")}\n messageClassName=\"mx-auto max-w-[24ch] text-[13px] leading-5 text-[var(--text-secondary)] [overflow-wrap:anywhere]\"\n renderIcon={(entry) => (\n <ReferenceNodeIcon\n frameClassName=\"size-10\"\n iconClassName=\"size-9\"\n iconUrls={iconUrls}\n node={entry}\n />\n )}\n state={toPreviewSurfaceState(node, previewState, copy)}\n textClassName=\"h-full w-full overflow-auto p-3 text-left text-[11px] leading-5 whitespace-pre-wrap break-words text-[var(--text-primary)]\"\n textFrameClassName=\"items-stretch justify-stretch\"\n />\n <div className=\"space-y-1\">\n <p className=\"truncate text-[15px] font-semibold\">\n {node.displayName}\n </p>\n <ReferencePathText hierarchy={hierarchy} node={node} />\n </div>\n <dl className=\"space-y-2 text-[13px]\">\n <InfoRow label={copy.t(\"referencePicker.previewSource\")}>\n <Badge\n variant=\"secondary\"\n className={sourceBadgeClassName(node.ref.sourceId)}\n >\n {sourceLabel}\n </Badge>\n </InfoRow>\n {timestampMs != null ? (\n <InfoRow label={copy.t(\"referencePicker.previewModified\")}>\n {formatReferencePreviewDateTime(timestampMs)}\n </InfoRow>\n ) : null}\n {sizeBytes != null ? (\n <InfoRow label={copy.t(\"referencePicker.previewSize\")}>\n {formatBytes(sizeBytes)}\n </InfoRow>\n ) : null}\n </dl>\n </div>\n ) : (\n <Feedback>{copy.t(\"referencePicker.emptyPreview\")}</Feedback>\n )}\n </aside>\n );\n}\n\nfunction ReferencePathText({\n hierarchy,\n node\n}: {\n hierarchy: readonly ReferenceNode[];\n node: ReferenceNode;\n}): JSX.Element {\n const pathText = getReferenceNodePathText(node, hierarchy);\n const lastSlashIndex = pathText.lastIndexOf(\"/\");\n if (lastSlashIndex <= 0 || lastSlashIndex === pathText.length - 1) {\n return (\n <p\n className=\"truncate text-[12px] leading-5 text-[var(--text-tertiary)]\"\n title={pathText}\n >\n {pathText}\n </p>\n );\n }\n\n return (\n <p\n className=\"flex min-w-0 items-center text-[12px] leading-5 text-[var(--text-tertiary)]\"\n title={pathText}\n >\n <span className=\"min-w-0 truncate\">\n {pathText.slice(0, lastSlashIndex + 1)}\n </span>\n <span className=\"max-w-[65%] shrink-0 truncate\">\n {pathText.slice(lastSlashIndex + 1)}\n </span>\n </p>\n );\n}\n\nfunction getReferenceNodePathText(\n node: ReferenceNode,\n hierarchy: readonly ReferenceNode[]\n): string {\n return formatReferenceNodePathText(node, hierarchy);\n}\n\nfunction InfoRow({\n label,\n children\n}: {\n label: string;\n children: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <dt className=\"text-[var(--text-secondary)]\">{label}</dt>\n <dd className=\"min-w-0 truncate text-right text-[var(--text-primary)]\">\n {children}\n </dd>\n </div>\n );\n}\n\nfunction Footer({\n cancelLabel,\n confirmLabel,\n countLabel,\n disabled,\n loading = false,\n selection,\n onClose,\n onConfirm\n}: {\n cancelLabel: string;\n confirmLabel: string;\n countLabel: string;\n disabled: boolean;\n loading?: boolean;\n selection: readonly ReferenceNode[];\n onClose: () => void;\n onConfirm: () => void;\n}): JSX.Element {\n const selectionTooltipId = useId();\n const [selectionTooltipOpen, setSelectionTooltipOpen] = useState(false);\n const selectionTooltipLabel = selection\n .map((node) => node.displayName)\n .join(\"\\n\");\n\n return (\n <div className=\"flex items-center justify-between gap-3 border-t border-[var(--line-1)] px-4 py-3 sm:px-6\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"shrink-0 text-[13px] text-[var(--text-secondary)]\">\n {countLabel}\n </span>\n {selection.slice(0, 2).map((node) => (\n <Badge\n key={nodeRefKey(node.ref)}\n className=\"min-w-0 max-w-[12rem]\"\n variant=\"secondary\"\n >\n <FullTextTooltip content={node.displayName}>\n <span className=\"truncate\">{node.displayName}</span>\n </FullTextTooltip>\n </Badge>\n ))}\n {selection.length > 2 ? (\n <span\n className=\"relative inline-flex shrink-0\"\n onBlur={() => setSelectionTooltipOpen(false)}\n onFocus={() => setSelectionTooltipOpen(true)}\n onMouseEnter={() => setSelectionTooltipOpen(true)}\n onMouseLeave={() => setSelectionTooltipOpen(false)}\n >\n <Badge\n asChild\n className=\"shrink-0 cursor-default\"\n variant=\"secondary\"\n >\n <button\n aria-describedby={selectionTooltipId}\n aria-label={selectionTooltipLabel}\n type=\"button\"\n >\n +{selection.length - 2}\n </button>\n </Badge>\n <span\n aria-hidden={!selectionTooltipOpen}\n className=\"pointer-events-none absolute bottom-[calc(100%+8px)] left-0 z-[var(--z-tooltip,100700)] max-h-[min(20rem,calc(100vh-96px))] w-max max-w-[min(28rem,calc(100vw-32px))] overflow-auto whitespace-pre-line rounded-md border border-[var(--border-1)] bg-[var(--background-fronted)] px-2 py-1 text-left text-[13px] leading-[1.3] text-[var(--text-primary)] shadow-soft transition-opacity duration-100 [overflow-wrap:anywhere]\"\n id={selectionTooltipId}\n role=\"tooltip\"\n style={{\n opacity: selectionTooltipOpen ? 1 : 0,\n visibility: selectionTooltipOpen ? \"visible\" : \"hidden\"\n }}\n >\n {selectionTooltipLabel}\n </span>\n </span>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {cancelLabel}\n </Button>\n <Button\n disabled={disabled || loading}\n type=\"button\"\n onClick={onConfirm}\n >\n {loading ? <Spinner className=\"text-current\" size={14} /> : null}\n {confirmLabel}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction Feedback({ children }: { children: ReactNode }): JSX.Element {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center px-4 py-8 text-center text-[13px] text-[var(--text-secondary)]\">\n {children}\n </div>\n );\n}\n\n/**\n * 文件类型多选筛选(搜索框右侧)。自实现的轻量 popover —— 不用设计系统的 Radix\n * DropdownMenu:本下拉嵌在自定义遮罩对话框(createPortal 到 body)里,Radix 菜单项\n * 的 select 在「portal + modal=false」组合下点击无法触发(hover 高亮正常但点了不勾选),\n * 表现为「筛选选了完全没反应」。改用原生 `<button onClick>`,点击必然触发 toggle。\n *\n * 弹层就地(absolute)渲染在触发器下方、不再 portal:对话框很高、弹层短且贴顶,\n * 不会被 overflow 裁切;省去手动定位与 z 层冲突。未选时按钮显示「全部类型」,已选时\n * 按固定顺序拼出已选分类名(过宽则截断,完整列表见 title 悬浮提示),并附数量徽章。\n *\n * 触发器固定宽度、固定 h-8(与左侧搜索框 Input 同高,父行 items-center 居中对齐):\n * 选中文案再长也只在内部截断成「…」,不撑宽控件、不挤动搜索框。有选中时,触发器右侧的\n * 箭头位让位给「清除」按钮:点击一键清空全部筛选(也可在弹层里逐项取消勾选)。\n */\nfunction FilterCategoryFilter({\n categories,\n copy,\n selected,\n onClear,\n onToggle\n}: {\n categories: readonly ReferenceFilterCategory[];\n copy: WorkspaceFileReferenceCopy;\n selected: ReadonlySet<string>;\n onClear: () => void;\n onToggle: (id: string) => void;\n}): JSX.Element {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // 打开期间:点击容器外部或按 Esc 收起。pointerdown 用捕获阶段,先于其它处理生效;\n // 容器内的点击(触发器/选项)不收起,以支持连续多选。\n useEffect(() => {\n if (!open) {\n return;\n }\n const onPointerDown = (event: PointerEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [open]);\n\n // 按 categories 的固定顺序收集已选标签,保证展示顺序稳定。\n const selectedLabels = categories\n .filter((category) => selected.has(category.id))\n .map((category) => copy.t(category.labelKey));\n const count = selectedLabels.length;\n const labelText =\n count > 0\n ? selectedLabels.join(copy.t(\"referencePicker.fileTypeSeparator\"))\n : copy.t(\"referencePicker.fileTypeAll\");\n\n return (\n // shrink-0:不被搜索框挤压;固定宽度让控件不随选中文案变宽。\n <div ref={containerRef} className=\"relative w-[124px] shrink-0\">\n <Button\n aria-expanded={open}\n aria-haspopup=\"menu\"\n // h-8:与左侧搜索框(Input size=default 同为 h-8/32px)显式等高对齐。\n // 不用 h-full —— flex 项内的百分比高度无法可靠地依 items-stretch 求值,\n // 会塌到按钮内容高度,导致与搜索框高度不一致。\n // w-full + justify-between:固定宽度容器内,文案占据中间并截断,箭头贴右。\n className=\"h-8 w-full justify-between gap-1.5 border-0 px-2.5\"\n size=\"default\"\n type=\"button\"\n variant=\"secondary\"\n onClick={() => setOpen((current) => !current)}\n >\n <span className=\"min-w-0 flex-1 truncate text-left\" title={labelText}>\n {labelText}\n </span>\n {count > 1 ? (\n <Badge className=\"shrink-0 px-1.5\" variant=\"secondary\">\n {count}\n </Badge>\n ) : null}\n {count > 0 ? (\n // 有选中时,右侧箭头位让位给「清除」:role=button 的 span(避免 button 嵌\n // button 的非法结构),stopPropagation 让点击只清空筛选、不触发触发器的开合。\n <span\n aria-label={copy.t(\"referencePicker.clearFilter\")}\n className=\"grid size-4 shrink-0 cursor-pointer place-items-center rounded-full text-[var(--text-tertiary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)]\"\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n onClear();\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n event.stopPropagation();\n onClear();\n }\n }}\n >\n <CloseIcon size={12} />\n </span>\n ) : (\n <ChevronDownIcon className=\"size-3.5 shrink-0 text-[var(--text-tertiary)]\" />\n )}\n </Button>\n {open ? (\n <div\n className=\"absolute top-[calc(100%+4px)] right-0 min-w-40 overflow-hidden rounded-[8px] border border-[var(--line-1)] bg-[var(--background-fronted)] p-1 shadow-panel\"\n role=\"menu\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n >\n {categories.map((category) => {\n const checked = selected.has(category.id);\n return (\n <button\n key={category.id}\n aria-checked={checked}\n className=\"flex w-full items-center gap-2 rounded-[6px] px-2 py-1.5 text-left text-[13px] text-[var(--text-primary)] transition-colors hover:bg-[var(--transparency-hover)]\"\n role=\"menuitemcheckbox\"\n type=\"button\"\n onClick={() => onToggle(category.id)}\n >\n <span className=\"grid size-4 shrink-0 place-items-center\">\n {checked ? (\n <CheckIcon className=\"size-3.5 text-[var(--tutti-purple)]\" />\n ) : null}\n </span>\n <span className=\"flex-1\">{copy.t(category.labelKey)}</span>\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\n// 每级缩进 = 箭头列宽(20px)+ 间距(8px)。文件没有箭头列,因此其图标恰好落在\n// 父文件夹图标的正下方;更深层级仍逐级缩进以体现层级关系。\nconst TREE_INDENT = 28;\nconst TREE_COLLAPSE_DURATION_MS = 200;\n\nfunction isFocused(\n focused: ReferenceNode | null,\n node: ReferenceNode\n): boolean {\n return focused ? nodeRefKey(focused.ref) === nodeRefKey(node.ref) : false;\n}\n\n/**\n * 递归文件树节点,交互复刻 main 分支 `WorkspaceFileReferencePickerTreeEntry`:\n * 24px 缩进、folder 箭头旋转、点名称展开/收起、grid-rows 展开动画、add/check 勾选。\n * 可选性由业务侧按 source/kind 注入,例如 host 本地目录可浏览但不可引用。\n */\nfunction TreeNodeRow({\n node,\n depth,\n iconUrls,\n onContextMenu,\n view,\n copy\n}: {\n node: ReferenceNode;\n depth: number;\n iconUrls: ReferenceNodeIconUrlState;\n onContextMenu: (event: MouseEvent<HTMLElement>, node: ReferenceNode) => void;\n view: PickerView;\n copy: WorkspaceFileReferenceCopy;\n}): JSX.Element {\n const key = nodeRefKey(node.ref);\n const isFolder = node.kind === \"folder\";\n const expanded = view.expandedKeys[key] ?? false;\n const childState = view.childrenByKey[key];\n const childEntries = view.sortNodes(childState?.entries ?? []);\n const selected = view.isSelected(node);\n const selectable = view.isSelectable(node);\n const focused = isFocused(view.focusedNode, node);\n const active = selected || (focused && selectable);\n const focusedRowRef = useRef<HTMLDivElement | null>(null);\n\n const [shouldRenderChildContent, setShouldRenderChildContent] =\n useState(expanded);\n\n useEffect(() => {\n if (focused) {\n focusedRowRef.current?.scrollIntoView({ block: \"nearest\" });\n }\n }, [focused]);\n\n useEffect(() => {\n if (expanded) {\n setShouldRenderChildContent(true);\n return;\n }\n const timeoutId = window.setTimeout(() => {\n setShouldRenderChildContent(false);\n }, TREE_COLLAPSE_DURATION_MS);\n return () => window.clearTimeout(timeoutId);\n }, [expanded]);\n\n const shouldBuildChildContent = expanded || shouldRenderChildContent;\n const childContent = shouldBuildChildContent ? (\n childState?.loading ? (\n <div\n className=\"flex items-center gap-2 px-2 py-2 text-[11px] text-[var(--text-secondary)]\"\n style={{ paddingLeft: `${(depth + 1) * TREE_INDENT + 12}px` }}\n >\n <Spinner className=\"text-[var(--text-secondary)]\" size={14} />\n <span>{copy.t(\"referencePicker.loading\")}</span>\n </div>\n ) : childEntries.length > 0 ? (\n <div className=\"space-y-0.5\">\n {childEntries.map((child) => (\n <TreeNodeRow\n key={nodeRefKey(child.ref)}\n copy={copy}\n depth={depth + 1}\n iconUrls={iconUrls}\n node={child}\n onContextMenu={onContextMenu}\n view={view}\n />\n ))}\n </div>\n ) : childState?.loaded ? (\n <div\n className=\"px-2 py-2 text-[11px] text-[var(--text-secondary)]\"\n style={{ paddingLeft: `${(depth + 1) * TREE_INDENT + 12}px` }}\n >\n {copy.t(\"referencePicker.emptyDirectory\")}\n </div>\n ) : null\n ) : null;\n\n return (\n <div>\n {/* 整行可点:点击监听挂在父级行 div 上,使可点热区与 hover 高亮区一致;\n 内层箭头/选中按钮 stopPropagation 各管各的,避免冒泡到行点击。 */}\n <div\n ref={focused ? focusedRowRef : undefined}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-[6px] py-1.5 pr-1 transition-colors\",\n active ? \"bg-transparency-block\" : \"hover:bg-transparency-block\"\n )}\n style={{ paddingLeft: `${depth * TREE_INDENT + 8}px` }}\n onClick={() => {\n view.setFocusedNode(node);\n view.toggleSingleSelectionAndExpand(node);\n }}\n onContextMenu={(event) => onContextMenu(event, node)}\n onDoubleClick={(event) => {\n if (node.kind !== \"file\") {\n return;\n }\n event.stopPropagation();\n view.setFocusedNode(node);\n void view.openNode(node);\n }}\n >\n {isFolder ? (\n <button\n aria-label={node.displayName}\n className=\"grid size-5 shrink-0 place-items-center rounded-sm text-[var(--text-secondary)] hover:bg-[var(--transparency-hover)]\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n view.setFocusedNode(node);\n view.toggleNode(node);\n }}\n >\n <ArrowRightIcon\n className={cn(\n \"size-3.5 transition-transform\",\n expanded && \"rotate-90\"\n )}\n />\n </button>\n ) : null}\n <ReferenceNodeIcon\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrls={iconUrls}\n node={node}\n />\n <FullTextTooltip content={node.displayName}>\n <span\n className=\"min-w-0 flex-1 truncate text-[13px] text-[var(--text-primary)]\"\n data-autofit-label\n >\n {node.displayName}\n </span>\n </FullTextTooltip>\n {selectable ? (\n <Button\n aria-label={node.displayName}\n aria-pressed={selected}\n className=\"shrink-0\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n view.setFocusedNode(node);\n view.toggleSelection(node);\n }}\n onDoubleClick={(event) => event.stopPropagation()}\n >\n {selected ? (\n <CheckIcon size={14} />\n ) : (\n <AddLinedIcon\n className=\"text-[var(--text-secondary)]\"\n size={16}\n />\n )}\n </Button>\n ) : null}\n </div>\n {isFolder ? (\n <div\n className={cn(\n \"grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none\",\n expanded ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\",\n childContent && \"mt-[2px]\"\n )}\n >\n <div\n aria-hidden={expanded ? undefined : \"true\"}\n className={cn(\n \"min-h-0 overflow-hidden transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none\",\n expanded\n ? \"translate-y-0 opacity-100\"\n : \"-translate-y-1 opacity-0\"\n )}\n inert={expanded ? undefined : true}\n >\n {childContent}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n return `${value.toFixed(1)} ${units[unitIndex]}`;\n}\n\nfunction ReferenceNodeIcon({\n frameClassName,\n iconClassName,\n iconUrls,\n node\n}: {\n frameClassName?: string;\n iconClassName: string;\n iconUrls: ReferenceNodeIconUrlState;\n node: ReferenceNode;\n}): JSX.Element {\n const entry = useMemo(() => referenceNodeToWorkspaceFileEntry(node), [node]);\n return (\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName={frameClassName}\n iconClassName={iconClassName}\n iconUrlByCacheKey={iconUrls.iconUrlByCacheKey}\n onViewportEnter={iconUrls.reportEntryIconViewportEnter}\n onViewportLeave={iconUrls.reportEntryIconViewportLeave}\n />\n );\n}\n\nfunction collectReferenceNodeIconEntries(input: {\n childrenByKey: PickerView[\"childrenByKey\"];\n currentEntries: readonly ReferenceNode[];\n expandedKeys: PickerView[\"expandedKeys\"];\n focusedNode: ReferenceNode | null;\n searchResults: readonly ReferenceNode[];\n selection: readonly ReferenceNode[];\n sidebarGroupsBySource: PickerView[\"sidebarGroupsBySource\"];\n}): WorkspaceFileEntry[] {\n const byKey = new Map<string, ReferenceNode>();\n const retain = (node: ReferenceNode): void => {\n byKey.set(nodeRefKey(node.ref), node);\n };\n const retainTree = (node: ReferenceNode): void => {\n retain(node);\n const key = nodeRefKey(node.ref);\n if (!input.expandedKeys[key]) {\n return;\n }\n for (const child of input.childrenByKey[key]?.entries ?? []) {\n retainTree(child);\n }\n };\n\n input.currentEntries.forEach(retainTree);\n input.searchResults.forEach(retain);\n input.selection.forEach(retain);\n if (input.focusedNode) {\n retain(input.focusedNode);\n }\n for (const groups of Object.values(input.sidebarGroupsBySource)) {\n groups.forEach(retain);\n }\n\n return [...byKey.values()].map(referenceNodeToWorkspaceFileEntry);\n}\n\nfunction referenceNodeToWorkspaceFileEntry(\n node: ReferenceNode\n): WorkspaceFileEntry {\n return {\n hasChildren: node.kind === \"folder\",\n kind: node.kind === \"folder\" ? \"directory\" : \"file\",\n mtimeMs: node.mtimeMs ?? null,\n name: node.displayName,\n path: resolveReferenceNodeIconPath(node),\n sizeBytes: node.sizeBytes ?? null\n };\n}\n\nfunction resolveReferenceNodeIconPath(node: ReferenceNode): string {\n if (node.kind === \"file\" && node.ref.nodeId.startsWith(\"f:\")) {\n try {\n return base64UrlDecode(node.ref.nodeId.slice(2));\n } catch {\n return node.ref.nodeId;\n }\n }\n return node.ref.nodeId;\n}\n\nfunction noopVoid(): void {}\n\nasync function noopAsync(): Promise<void> {}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport type {\n ReferenceHandle,\n ReferenceLocateTarget,\n ReferenceNode,\n ReferenceScope,\n SelectedReference,\n WorkspaceFileReference\n} from \"../../../contracts/index.ts\";\nimport {\n REFERENCE_FILTER_CATEGORIES,\n WORKSPACE_ROOT_GROUP_NODE_ID,\n nodeRefKey,\n selectedReferenceToWorkspaceFileReference\n} from \"../../../core/index.ts\";\nimport type { ReferenceSourceAggregator } from \"../../../core/referenceSourceAggregator.ts\";\nimport {\n resolveWorkspaceFileOpenWithCacheKey,\n sortWorkspaceFileEntriesForArrangeMode,\n WorkspaceFileOpenWithApplicationsCache,\n type WorkspaceFileEntry,\n type WorkspaceFileManagerArrangeMode\n} from \"@tutti-os/workspace-file-manager/services\";\nimport {\n createWorkspaceFilePreviewLoadedState,\n type WorkspaceFilePreviewReadonlyReason\n} from \"@tutti-os/workspace-file-preview\";\nimport {\n ROOT_CHILDREN_KEY,\n createReferenceSourcePickerController\n} from \"./referenceSourcePickerController.ts\";\n\nexport type { WorkspaceFileManagerArrangeMode };\n\nexport { WORKSPACE_ROOT_GROUP_NODE_ID } from \"../../../core/index.ts\";\n\nfunction referenceNodeToOpenWithCacheEntry(\n node: ReferenceNode\n): Pick<WorkspaceFileEntry, \"kind\" | \"name\" | \"path\"> {\n return {\n kind: node.kind === \"folder\" ? \"directory\" : \"file\",\n name: node.displayName,\n path: node.displayName\n };\n}\n\n/**\n * 焦点节点的预览态(node-keyed)。复用 file-manager / file-preview 的分类逻辑\n * (createWorkspaceFilePreviewLoadedState),但只携带状态、不含已本地化文案 ——\n * 文案由 UI 层(ReferenceSourcePicker)按 status/reason 映射,保持 hook 与 i18n 解耦。\n */\nexport type ReferenceNodePreviewState =\n | { status: \"empty\" }\n | { node: ReferenceNode; status: \"directory\" }\n | { node: ReferenceNode; status: \"loading\" }\n | {\n content: string;\n node: ReferenceNode;\n previewSizeBytes?: number;\n status: \"text\";\n }\n | {\n content: string;\n node: ReferenceNode;\n previewSizeBytes?: number;\n status: \"html\";\n }\n | {\n node: ReferenceNode;\n objectUrl: string;\n previewSizeBytes?: number;\n status: \"image\";\n }\n | {\n node: ReferenceNode;\n objectUrl: string;\n previewSizeBytes?: number;\n status: \"video\";\n }\n | {\n maxSizeBytes?: number;\n node: ReferenceNode;\n previewSizeBytes?: number;\n reason: WorkspaceFilePreviewReadonlyReason;\n status: \"readonly\";\n }\n | { node: ReferenceNode; status: \"unsupported\" }\n | { node: ReferenceNode; status: \"error\" };\n\n/** 一个 navigable 源文件夹的折叠选区(文件已映射为 WorkspaceFileReference)。 */\nexport interface ReferenceBundleSelection {\n sourceId: string;\n nodeId: string;\n displayName: string;\n iconUrl?: string | null;\n /**\n * 可被 agent 解析的领域句柄(见 ReferenceHandle)。发给 agent 的\n * `mention://workspace-reference/...` 由它构造;源未解码出句柄时为 null。\n */\n handle: ReferenceHandle | null;\n /** 该 bundle 下文件数(展示用,取节点 childCount;不再展开文件)。 */\n fileCount: number;\n}\n\nexport interface ReferenceGroupedSelection {\n files: WorkspaceFileReference[];\n bundles: ReferenceBundleSelection[];\n}\n\nexport interface UseReferenceSourcePickerViewInput {\n aggregator: ReferenceSourceAggregator;\n workspaceId: string;\n open: boolean;\n /**\n * 本地源「工作区根」二级节点展示名(仅源未自带分组时的回退用)。\n * 由 UI 层注入已本地化文案,保持 hook 与 i18n 解耦。\n */\n workspaceRootGroupLabel: string;\n /** 可选:打开时直达某事项/应用分组(展开并聚焦)。 */\n initialTarget?: ReferenceLocateTarget | null;\n onClose: () => void;\n onConfirm: (refs: WorkspaceFileReference[]) => void;\n isNodeSelectable?: (node: ReferenceNode) => boolean;\n /**\n * 可选:启用「文件夹=一个 bundle」确认形态。提供时,confirm 改用 confirmGrouped,\n * navigable 源的选中文件夹折叠成一个 bundle,其余仍作为单条文件。\n */\n onConfirmBundles?: (result: ReferenceGroupedSelection) => void;\n}\n\n/**\n * 多源 picker 的视图 hook。\n * controller 负责数据/缓存/分页/选中;hook 负责 UI 导航态(当前面包屑、焦点节点)。\n */\nexport function useReferenceSourcePickerView({\n aggregator,\n workspaceId,\n open,\n workspaceRootGroupLabel,\n initialTarget = null,\n onClose,\n onConfirm,\n isNodeSelectable,\n onConfirmBundles\n}: UseReferenceSourcePickerViewInput) {\n const readSnapshot = useSnapshot as <T extends object>(store: T) => T;\n const scope = useMemo<ReferenceScope>(() => ({ workspaceId }), [workspaceId]);\n\n const controller = useMemo(\n () => createReferenceSourcePickerController({ aggregator, scope }),\n [aggregator, scope]\n );\n const snapshot = readSnapshot(controller.store);\n\n // UI 导航态:每个源各一条面包屑栈([] = 源根)。\n const [breadcrumbBySource, setBreadcrumbBySource] = useState<\n Record<string, ReferenceNode[]>\n >({});\n const [focusedNode, setFocusedNode] = useState<ReferenceNode | null>(null);\n const [arrangeMode, setArrangeMode] =\n useState<WorkspaceFileManagerArrangeMode>(\"none\");\n const openWithApplicationsCache = useRef(\n new WorkspaceFileOpenWithApplicationsCache()\n );\n\n // 复用 file-manager 的排序能力:把 ReferenceNode 映射成 WorkspaceFileEntry 排序后映射回。\n const sortNodes = useCallback(\n (nodes: readonly ReferenceNode[]): ReferenceNode[] => {\n if (arrangeMode === \"none\") {\n return [...nodes];\n }\n const byKey = new Map<string, ReferenceNode>();\n const fileEntries: WorkspaceFileEntry[] = nodes.map((node) => {\n const key = nodeRefKey(node.ref);\n byKey.set(key, node);\n return {\n hasChildren: node.kind === \"folder\",\n kind: node.kind === \"folder\" ? \"directory\" : \"file\",\n mtimeMs: node.mtimeMs ?? null,\n name: node.displayName,\n path: key,\n sizeBytes: node.sizeBytes ?? null\n };\n });\n return sortWorkspaceFileEntriesForArrangeMode(fileEntries, arrangeMode)\n .map((entry) => byKey.get(entry.path))\n .filter((node): node is ReferenceNode => node !== undefined);\n },\n [arrangeMode]\n );\n // 每次打开对话框内,已自动进入过首个分组的源(避免覆盖用户手动导航/回到根)。\n const autoEnteredSourcesRef = useRef<Set<string>>(new Set());\n // 「打开即定位」一次性应用标记:每个 initialTarget 仅应用一次,应用后不再干预用户导航。\n const appliedInitialTargetRef = useRef<ReferenceLocateTarget | null>(null);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n controller.reset();\n controller.open();\n setBreadcrumbBySource({});\n setFocusedNode(null);\n autoEnteredSourcesRef.current = new Set();\n appliedInitialTargetRef.current = null;\n return () => {\n controller.close();\n };\n }, [controller, open]);\n\n // 「打开即定位」:一次性把 initialTarget 解析为真实节点路径并应用导航,之后不再干预。\n // - path[0] = 左栏二级分组(topic / app):作为面包屑根项进入 → 左栏选中 + 中间栏展示其内容;\n // - path[last] 更深(如事项):在该分组内容里 setFocusedNode 高亮。\n // 解析(含等待 tabs 就绪、逐层取真实节点)全在 controller.locatePath 内完成;这里只应用结果一次。\n useEffect(() => {\n const target = initialTarget;\n if (!open || !target || appliedInitialTargetRef.current === target) {\n return;\n }\n appliedInitialTargetRef.current = target;\n // 让默认「自动进入首个分组」对该源让位,改由本次定位接管。\n autoEnteredSourcesRef.current.add(target.sourceId);\n let canceled = false;\n void controller\n .locatePath(target)\n .then((path) => {\n if (canceled) {\n return;\n }\n const group = path[0];\n if (!group) {\n // 未解析到分组:撤销让位,退回默认(进入首个分组)。\n autoEnteredSourcesRef.current.delete(target.sourceId);\n return;\n }\n controller.setActiveSource(target.sourceId);\n setBreadcrumbBySource((current) => ({\n ...current,\n [group.ref.sourceId]: [group]\n }));\n controller.ensureChildren(group);\n for (const node of path.slice(1)) {\n controller.expandNode(node);\n }\n const deepest = path[path.length - 1];\n setFocusedNode(path.length > 1 && deepest ? deepest : null);\n })\n .catch(() => {\n autoEnteredSourcesRef.current.delete(target.sourceId);\n });\n return () => {\n canceled = true;\n };\n }, [open, initialTarget, controller]);\n\n const activeSourceId = snapshot.activeSourceId;\n const activeTab = useMemo(\n () => snapshot.tabs.find((tab) => tab.sourceId === activeSourceId) ?? null,\n [activeSourceId, snapshot.tabs]\n );\n const capabilities = activeTab?.capabilities ?? null;\n\n const breadcrumb = activeSourceId\n ? (breadcrumbBySource[activeSourceId] ?? [])\n : [];\n const currentNode = breadcrumb.at(-1) ?? null;\n const currentKey = currentNode\n ? nodeRefKey(currentNode.ref)\n : ROOT_CHILDREN_KEY;\n\n const activeTabState = activeSourceId\n ? snapshot.bySource[activeSourceId]\n : undefined;\n // 已选文件类型筛选分类(与 searchQuery 一起构成「查询」)。\n const activeFilters = activeTabState?.searchFilters ?? [];\n // 查询态 = 关键词或筛选任一非空(controller 已据此置 mode)。命中即平铺结果。\n const isQuery =\n activeTabState?.mode === \"search\" &&\n (activeTabState.searchQuery.trim() !== \"\" || activeFilters.length > 0);\n\n const currentChildren = activeTabState?.childrenByKey[currentKey];\n\n // 浏览态内容区:当前选中二级节点(currentNode,本地根时为 null → 源根)的子节点,\n // 递归就地展开成文件树。搜索态:扁平搜索结果。\n const currentEntries = useMemo(\n () => sortNodes(currentChildren?.entries ?? []),\n [currentChildren?.entries, sortNodes]\n );\n const searchResults = useMemo(\n () => sortNodes(activeTabState?.searchEntries ?? []),\n [activeTabState?.searchEntries, sortNodes]\n );\n\n // 每个源的左栏二级分组(左栏可多源同时展开,故按源全量计算):\n // - 源自带分组(listSidebarGroups,如本地源的 最近访问/下载/文稿/桌面/个人)优先;\n // - 否则取该源根下的 folder;非 navigable 源额外合成「工作区根」入口保住根级散文件可达。\n // 依赖 snapshot.tabs(getLoadedSource 在 tabs 加载后才有值)与 snapshot.bySource(根加载)。\n const sidebarGroupsBySource = useMemo<Record<string, ReferenceNode[]>>(() => {\n const result: Record<string, ReferenceNode[]> = {};\n for (const tab of snapshot.tabs) {\n const sourceId = tab.sourceId;\n const provided = aggregator\n .getLoadedSource(sourceId)\n ?.listSidebarGroups?.(scope);\n if (provided && provided.length > 0) {\n result[sourceId] = provided;\n continue;\n }\n const root =\n snapshot.bySource[sourceId]?.childrenByKey[ROOT_CHILDREN_KEY];\n const folders = (root?.entries ?? []).filter(\n (node) => node.kind === \"folder\"\n );\n if (tab.capabilities.navigable) {\n result[sourceId] = folders;\n } else {\n const workspaceRoot: ReferenceNode = {\n ref: { sourceId, nodeId: WORKSPACE_ROOT_GROUP_NODE_ID },\n kind: \"folder\",\n displayName: workspaceRootGroupLabel\n };\n result[sourceId] = [workspaceRoot, ...folders];\n }\n }\n return result;\n }, [\n snapshot.tabs,\n snapshot.bySource,\n aggregator,\n scope,\n workspaceRootGroupLabel\n ]);\n\n // 左栏二级分组「是否还能继续拉取」(分页用)。\n // - 自带分组的源(本地源:最近访问/下载/… 固定「位置」)不分页,恒 false;\n // - 其余 navigable 源分组取自源根 children,源根带 nextCursor 即可继续拉取。\n const sidebarHasMoreBySource = useMemo<Record<string, boolean>>(() => {\n const result: Record<string, boolean> = {};\n for (const tab of snapshot.tabs) {\n const sourceId = tab.sourceId;\n const provided = aggregator\n .getLoadedSource(sourceId)\n ?.listSidebarGroups?.(scope);\n if (provided && provided.length > 0) {\n result[sourceId] = false;\n continue;\n }\n const root =\n snapshot.bySource[sourceId]?.childrenByKey[ROOT_CHILDREN_KEY];\n result[sourceId] = Boolean(root?.nextCursor);\n }\n return result;\n }, [snapshot.tabs, snapshot.bySource, aggregator, scope]);\n\n // 左栏二级分组「正在拉取下一页」(源根已加载过且当前在 loading = append 在途)。\n const sidebarLoadingMoreBySource = useMemo<Record<string, boolean>>(() => {\n const result: Record<string, boolean> = {};\n for (const tab of snapshot.tabs) {\n const root =\n snapshot.bySource[tab.sourceId]?.childrenByKey[ROOT_CHILDREN_KEY];\n result[tab.sourceId] = Boolean(root?.loaded && root.loading);\n }\n return result;\n }, [snapshot.tabs, snapshot.bySource]);\n\n // active 源的二级分组(供自动进入首组、选中高亮等复用)。\n const sidebarGroups = activeSourceId\n ? (sidebarGroupsBySource[activeSourceId] ?? [])\n : [];\n\n // 左栏二级分组高亮 = 当前所在的「根 most 分组」(面包屑首项),而非最深叶子节点。\n // 这样下钻进事项(topic → 事项 → 产物)时,左栏仍高亮其所属 topic;进 app 子目录时仍高亮该 app。\n // 本地根(无面包屑、非 navigable)回退到合成「工作区根」节点。\n const rootGroupNode = breadcrumb[0] ?? null;\n // 搜索限定范围 = 左栏选中的二级分组(面包屑根项)的源内 nodeId;无选中分组(本地根)→ null,\n // 退回跨整源搜索。供「只搜选中应用」而非所有应用。\n const searchScopeNodeId = rootGroupNode ? rootGroupNode.ref.nodeId : null;\n const selectedGroupKey = rootGroupNode\n ? nodeRefKey(rootGroupNode.ref)\n : activeSourceId && !capabilities?.navigable\n ? nodeRefKey({\n sourceId: activeSourceId,\n nodeId: WORKSPACE_ROOT_GROUP_NODE_ID\n })\n : null;\n\n // 搜索进行中切换左栏分组(选中应用变化)时,把搜索限定范围同步给 controller 并重搜。\n // controller 内部仅在范围实际变化且处于搜索态时才重搜,浏览态/范围未变为 no-op。\n useEffect(() => {\n controller.setSearchScope(searchScopeNodeId);\n }, [controller, searchScopeNodeId]);\n\n const setActiveSource = useCallback(\n (sourceId: string) => {\n controller.setActiveSource(sourceId);\n setFocusedNode(null);\n },\n [controller]\n );\n\n const shouldRefreshChildrenOnEnter = useCallback(\n (sourceId: string) =>\n snapshot.tabs.find((tab) => tab.sourceId === sourceId)?.capabilities\n .navigable ?? false,\n [snapshot.tabs]\n );\n\n const enterFolder = useCallback(\n (node: ReferenceNode) => {\n const sourceId = node.ref.sourceId;\n if (\n node.kind !== \"folder\" ||\n !sourceId ||\n node.ref.nodeId === WORKSPACE_ROOT_GROUP_NODE_ID\n ) {\n return;\n }\n if (shouldRefreshChildrenOnEnter(sourceId)) {\n controller.refreshChildren(node);\n } else {\n controller.ensureChildren(node);\n }\n setBreadcrumbBySource((current) => {\n const stack = current[sourceId] ?? [];\n const index = stack.findIndex(\n (item) => nodeRefKey(item.ref) === nodeRefKey(node.ref)\n );\n const nextStack =\n index >= 0 ? stack.slice(0, index + 1) : [...stack, node];\n return { ...current, [sourceId]: nextStack };\n });\n setFocusedNode(null);\n },\n [controller, shouldRefreshChildrenOnEnter]\n );\n\n // 进入某源时默认选中它的第一个二级分组,而非停在根列表:\n // - 可逐层进入的源(如「应用」/「议题」):进入第一个分组(首个 app / topic);\n // - 本地等非 navigable 源:进入第一个固定「位置」分组(本地源即「最近访问」),\n // 使从 agent GUI「+」按钮打开时默认落在「本地 - 最近访问」。\n // 每个源每次打开只自动选一次,用户回到根/手动导航后不再覆盖。\n // 非 navigable 源若无自带分组,sidebarGroups[0] 为合成「工作区根」,\n // enterFolder 对其 no-op,仍停在源根 —— 与原行为一致,无回归。\n useEffect(() => {\n if (!open || !activeSourceId) {\n return;\n }\n if (autoEnteredSourcesRef.current.has(activeSourceId)) {\n return;\n }\n const stack = breadcrumbBySource[activeSourceId] ?? [];\n if (stack.length > 0) {\n // 该源已有导航(例如此前已自动/手动进入过),视为已初始化。\n autoEnteredSourcesRef.current.add(activeSourceId);\n return;\n }\n const firstGroup = sidebarGroups[0];\n if (!firstGroup) {\n // 根分组尚未加载完,等加载后再触发。\n return;\n }\n autoEnteredSourcesRef.current.add(activeSourceId);\n enterFolder(firstGroup);\n }, [open, activeSourceId, sidebarGroups, breadcrumbBySource, enterFolder]);\n\n // 左栏一级源默认全部展开(Finder 风格,无折叠):tabs 就绪后预载每个源的根,\n // 使非自带分组的源(应用/任务,二级分组取根下 folder)其分组也立即就绪。\n useEffect(() => {\n if (!open) {\n return;\n }\n for (const tab of snapshot.tabs) {\n controller.ensureSourceRoot(tab.sourceId);\n }\n }, [open, snapshot.tabs, controller]);\n\n const navigateToBreadcrumb = useCallback(\n (index: number) => {\n if (!activeSourceId) {\n return;\n }\n setBreadcrumbBySource((current) => {\n const stack = current[activeSourceId] ?? [];\n return { ...current, [activeSourceId]: stack.slice(0, index + 1) };\n });\n const target = (breadcrumbBySource[activeSourceId] ?? [])[index] ?? null;\n if (target && shouldRefreshChildrenOnEnter(target.ref.sourceId)) {\n controller.refreshChildren(target);\n } else {\n controller.ensureChildren(target);\n }\n setFocusedNode(null);\n },\n [\n activeSourceId,\n breadcrumbBySource,\n controller,\n shouldRefreshChildrenOnEnter\n ]\n );\n\n const navigateToRoot = useCallback(\n (sourceId?: string) => {\n const sid = sourceId ?? activeSourceId;\n if (!sid) {\n return;\n }\n setBreadcrumbBySource((current) => ({ ...current, [sid]: [] }));\n controller.ensureSourceRoot(sid);\n setFocusedNode(null);\n },\n [activeSourceId, controller]\n );\n\n // 选中左栏二级分组:先切到该分组所属源(右侧内容随之切换),\n // 再:合成「工作区根」→ 回源根;其余 → 把面包屑重置为该分组。\n // 二级分组之间是同级关系(并非彼此嵌套),因此选中一个新分组时必须把面包屑\n // 重置为 [node],而非走 enterFolder 的「下钻入栈」逻辑 —— 否则点击同级分组会被\n // 当作子节点追加成 [A, B],而高亮取 breadcrumb[0] 仍停在 A,导致新分组「选不中」。\n const selectGroup = useCallback(\n (node: ReferenceNode) => {\n const sourceId = node.ref.sourceId;\n if (!sourceId) {\n return;\n }\n const nextScopeNodeId =\n node.ref.nodeId === WORKSPACE_ROOT_GROUP_NODE_ID\n ? null\n : node.ref.nodeId;\n if (sourceId !== snapshot.activeSourceId) {\n controller.setActiveSource(sourceId, nextScopeNodeId);\n }\n if (node.ref.nodeId === WORKSPACE_ROOT_GROUP_NODE_ID) {\n controller.setSearchScope(null);\n navigateToRoot(sourceId);\n return;\n }\n if (shouldRefreshChildrenOnEnter(sourceId)) {\n controller.refreshChildren(node);\n } else {\n controller.ensureChildren(node);\n }\n controller.setSearchScope(nextScopeNodeId);\n setBreadcrumbBySource((current) => ({ ...current, [sourceId]: [node] }));\n setFocusedNode(null);\n },\n [\n controller,\n snapshot.activeSourceId,\n navigateToRoot,\n shouldRefreshChildrenOnEnter\n ]\n );\n\n const isSelected = useCallback(\n (node: ReferenceNode) =>\n (isNodeSelectable?.(node) ?? true) &&\n snapshot.selection.some(\n (item) => nodeRefKey(item.ref) === nodeRefKey(node.ref)\n ),\n [isNodeSelectable, snapshot.selection]\n );\n\n const isSelectable = useCallback(\n (node: ReferenceNode) => isNodeSelectable?.(node) ?? true,\n [isNodeSelectable]\n );\n const selectableSelection = useMemo(\n () => snapshot.selection.filter(isSelectable),\n [isSelectable, snapshot.selection]\n );\n\n // app/issue 源的文件夹引用需异步递归枚举展开,故 confirm 异步;期间置 isConfirming 防重复提交。\n const [isConfirming, setIsConfirming] = useState(false);\n const [isOpeningReference, setIsOpeningReference] = useState(false);\n const runReferenceAction = useCallback(\n async (action: () => Promise<void>): Promise<void> => {\n if (isOpeningReference) {\n return;\n }\n setIsOpeningReference(true);\n try {\n await action();\n } finally {\n setIsOpeningReference(false);\n }\n },\n [isOpeningReference]\n );\n const confirm = useCallback(async () => {\n if (isConfirming) {\n return;\n }\n if (selectableSelection.length === 0) {\n controller.clearSelection();\n return;\n }\n setIsConfirming(true);\n try {\n if (onConfirmBundles) {\n const grouped = await controller.confirmGrouped(selectableSelection);\n onConfirmBundles({\n files: grouped.files.map(selectedReferenceToWorkspaceFileReference),\n bundles: grouped.bundles.map((bundle) => ({\n sourceId: bundle.root.ref.sourceId,\n nodeId: bundle.root.ref.nodeId,\n displayName: bundle.root.displayName,\n iconUrl: bundle.root.iconUrl ?? null,\n handle: bundle.handle,\n // 展示用文件数:取节点 childCount(不再展开文件);缺省回退 0。\n fileCount: bundle.root.childCount ?? 0\n }))\n });\n } else {\n const selected: SelectedReference[] =\n await controller.confirm(selectableSelection);\n onConfirm(selected.map(selectedReferenceToWorkspaceFileReference));\n }\n onClose();\n } finally {\n setIsConfirming(false);\n }\n }, [\n controller,\n isConfirming,\n onClose,\n onConfirm,\n onConfirmBundles,\n selectableSelection\n ]);\n\n // 焦点节点预览:文件夹→directory;文件→走源 readPreview,字节经 file-preview 分类\n // 成 image/text/readonly。image 用 object URL,切换/卸载时回收避免泄漏。\n const [previewState, setPreviewState] = useState<ReferenceNodePreviewState>({\n status: \"empty\"\n });\n const previewObjectUrlRef = useRef<string | null>(null);\n const revokePreviewObjectUrl = useCallback(() => {\n if (previewObjectUrlRef.current) {\n URL.revokeObjectURL(previewObjectUrlRef.current);\n previewObjectUrlRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n const node = focusedNode;\n if (!node) {\n revokePreviewObjectUrl();\n setPreviewState({ status: \"empty\" });\n return;\n }\n if (node.kind === \"folder\") {\n revokePreviewObjectUrl();\n setPreviewState({ node, status: \"directory\" });\n return;\n }\n const previewable =\n aggregator.getLoadedSource(node.ref.sourceId)?.capabilities.previewable ??\n false;\n if (!previewable) {\n revokePreviewObjectUrl();\n setPreviewState({ node, status: \"unsupported\" });\n return;\n }\n\n let cancelled = false;\n revokePreviewObjectUrl();\n setPreviewState({ node, status: \"loading\" });\n void (async () => {\n try {\n const preview = await aggregator.readPreview(scope, node);\n if (cancelled) {\n return;\n }\n if (!preview) {\n setPreviewState({ node, status: \"unsupported\" });\n return;\n }\n const previewSizeBytes = preview.bytes.byteLength;\n const loadedSizeBytes =\n node.sizeBytes != null && node.sizeBytes > 0\n ? node.sizeBytes\n : previewSizeBytes;\n const loaded = createWorkspaceFilePreviewLoadedState({\n bytes: preview.bytes,\n contentType: preview.contentType,\n entry: {\n kind: node.kind,\n name: node.displayName,\n path: node.ref.nodeId,\n mtimeMs: node.mtimeMs ?? null,\n sizeBytes: loadedSizeBytes\n },\n renderHtml: true,\n target: {\n fileKind: preview.kind,\n name: node.displayName,\n path: node.ref.nodeId,\n mtimeMs: node.mtimeMs ?? null,\n sizeBytes: loadedSizeBytes\n }\n });\n if (cancelled) {\n return;\n }\n if (loaded.status === \"image\") {\n const objectUrl = URL.createObjectURL(\n new Blob([loaded.bytes], { type: loaded.contentType })\n );\n previewObjectUrlRef.current = objectUrl;\n setPreviewState({\n node,\n objectUrl,\n previewSizeBytes,\n status: \"image\"\n });\n return;\n }\n if (loaded.status === \"video\") {\n const objectUrl = URL.createObjectURL(\n new Blob([loaded.bytes], { type: loaded.contentType })\n );\n previewObjectUrlRef.current = objectUrl;\n setPreviewState({\n node,\n objectUrl,\n previewSizeBytes,\n status: \"video\"\n });\n return;\n }\n if (loaded.status === \"text\") {\n setPreviewState({\n content: loaded.content,\n node,\n previewSizeBytes,\n status: \"text\"\n });\n return;\n }\n if (loaded.status === \"html\") {\n setPreviewState({\n content: loaded.content,\n node,\n previewSizeBytes,\n status: \"html\"\n });\n return;\n }\n setPreviewState({\n node,\n previewSizeBytes,\n reason: loaded.reason,\n ...(loaded.maxSizeBytes == null\n ? {}\n : { maxSizeBytes: loaded.maxSizeBytes }),\n status: \"readonly\"\n });\n } catch {\n if (!cancelled) {\n setPreviewState({ node, status: \"error\" });\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [aggregator, focusedNode, revokePreviewObjectUrl, scope]);\n\n // 卸载时回收最后一个 image object URL。\n useEffect(() => revokePreviewObjectUrl, [revokePreviewObjectUrl]);\n\n return {\n tabs: snapshot.tabs,\n activeSourceId,\n previewState,\n activeTabLabel: activeTab?.label ?? \"\",\n capabilities,\n // 内容区递归就地树:当前选中二级节点的子条目(本地根时为源根子条目)。\n currentEntries,\n // 搜索态:扁平搜索结果。\n searchResults,\n expandedKeys: activeTabState?.expandedKeys ?? {},\n childrenByKey: activeTabState?.childrenByKey ?? {},\n toggleNode: (node: ReferenceNode) => controller.toggleNode(node),\n sortNodes,\n isLoadingTabs: snapshot.isLoadingTabs,\n breadcrumb,\n currentNode,\n sidebarGroups,\n sidebarGroupsBySource,\n sidebarHasMoreBySource,\n sidebarLoadingMoreBySource,\n loadMoreSidebarGroups: (sourceId: string) =>\n controller.loadMoreSourceRoot(sourceId),\n selectedGroupKey,\n arrangeMode,\n setArrangeMode,\n // 查询态(关键词或筛选任一非空)→ 平铺结果;否则浏览树。\n isQuery,\n searchQuery: activeTabState?.searchQuery ?? \"\",\n // 当前源支持的文件类型筛选分类(不支持则空数组,picker 据此决定是否展示筛选下拉)。\n filterCategories: capabilities?.filterable\n ? REFERENCE_FILTER_CATEGORIES\n : [],\n activeFilters,\n // 搜索态:仅在「还没有任何结果」时显示 spinner;细化关键词(已有结果)时\n // 保留旧结果直到新结果就绪,避免内容区在 spinner/结果间反复切换造成闪烁。\n isLoading: isQuery\n ? (activeTabState?.isSearchLoading ?? false) &&\n (activeTabState?.searchEntries.length ?? 0) === 0\n : (currentChildren?.loading ?? false),\n // 查询态:增长式分页是否还有更多;浏览态:cursor 是否有下一页。\n hasMore: isQuery\n ? (activeTabState?.searchHasMore ?? false)\n : Boolean(currentChildren?.nextCursor),\n // 底部「加载更多」在途(查询态 = 增长重查;浏览态 = cursor append)。\n isLoadingMore: isQuery\n ? (activeTabState?.isSearchLoadingMore ?? false)\n : (currentChildren?.loading ?? false),\n focusedNode,\n selection: selectableSelection,\n selectionCount: selectableSelection.length,\n setActiveSource,\n enterFolder,\n selectGroup,\n navigateToBreadcrumb,\n navigateToRoot,\n setFocusedNode,\n setSearchQuery: (query: string) =>\n controller.setSearchQuery(query, searchScopeNodeId),\n setFilters: (filters: string[]) =>\n controller.setSearchFilters(filters, searchScopeNodeId),\n toggleSelection: (node: ReferenceNode) => {\n if (isSelectable(node)) {\n controller.toggleSelection(node);\n }\n },\n toggleSingleSelectionAndExpand: (node: ReferenceNode) => {\n if (isSelectable(node)) {\n controller.toggleSingleSelectionAndExpand(node);\n return;\n }\n controller.clearSelection();\n if (node.kind === \"folder\") {\n controller.toggleNode(node);\n }\n },\n loadMore: () =>\n isQuery ? controller.loadMoreSearch() : controller.loadMore(currentNode),\n isSelectable,\n isSelected,\n isOpeningReference,\n getCachedOpenWithApplications: (node: ReferenceNode) =>\n openWithApplicationsCache.current.get(\n resolveWorkspaceFileOpenWithCacheKey(\n referenceNodeToOpenWithCacheEntry(node)\n )\n ),\n listOpenWithApplications: (node: ReferenceNode) =>\n openWithApplicationsCache.current.resolve(\n resolveWorkspaceFileOpenWithCacheKey(\n referenceNodeToOpenWithCacheEntry(node)\n ),\n () => aggregator.listOpenWithApplications(scope, node)\n ),\n openNode: (node: ReferenceNode) =>\n runReferenceAction(() => aggregator.open(scope, node)),\n openWithApplication: (node: ReferenceNode, applicationPath: string) =>\n runReferenceAction(() =>\n aggregator.openWithApplication(scope, node, applicationPath)\n ),\n openWithOtherApplication: (\n node: ReferenceNode,\n applicationPickerPrompt?: string\n ) =>\n runReferenceAction(() =>\n aggregator.openWithOtherApplication(\n scope,\n node,\n applicationPickerPrompt\n )\n ),\n revealNode: (node: ReferenceNode) =>\n runReferenceAction(() => aggregator.reveal(scope, node)),\n confirm,\n isConfirming\n };\n}\n","import type { ReferenceNode } from \"../../../contracts/referenceSource.ts\";\n\nexport interface ReferencePreviewDateTimeFormatOptions {\n locale?: string;\n timeZone?: string;\n}\n\nexport function formatHierarchyTitle(\n hierarchy: readonly ReferenceNode[]\n): string | null {\n if (hierarchy.length === 0) {\n return null;\n }\n return hierarchy.map((crumb) => crumb.displayName).join(\" / \");\n}\n\nexport function formatReferenceNodePathText(\n node: ReferenceNode,\n hierarchy: readonly ReferenceNode[] = []\n): string {\n const decodedPath = decodeReferenceListFileNodeId(node.ref.nodeId);\n if (decodedPath) {\n return decodedPath;\n }\n if (node.kind === \"folder\" && node.ref.nodeId.startsWith(\"g:\")) {\n return (\n formatHierarchyTitle(completeHierarchy(hierarchy, node)) ||\n node.displayName\n );\n }\n return node.contextLabel?.trim() || node.ref.nodeId;\n}\n\nexport function formatReferencePreviewDateTime(\n ms: number,\n options: ReferencePreviewDateTimeFormatOptions = {}\n): string {\n const timeZone =\n options.timeZone ?? Intl.DateTimeFormat().resolvedOptions().timeZone;\n const formatter = new Intl.DateTimeFormat(options.locale, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hourCycle: \"h23\",\n minute: \"2-digit\",\n month: \"2-digit\",\n timeZone,\n year: \"numeric\"\n });\n const parts = Object.fromEntries(\n formatter\n .formatToParts(ms)\n .filter((part) => part.type !== \"literal\")\n .map((part) => [part.type, part.value])\n );\n return `${parts.year}-${parts.month}-${parts.day} ${parts.hour}:${parts.minute}`;\n}\n\nexport function resolveReferencePreviewTimestampMs(\n node: Pick<ReferenceNode, \"createdTimeMs\" | \"mtimeMs\">\n): number | null {\n return (\n normalizedTimestampMs(node.createdTimeMs) ??\n normalizedTimestampMs(node.mtimeMs)\n );\n}\n\nexport function resolveReferencePreviewSizeBytes(\n node: ReferenceNode,\n previewState: {\n node?: ReferenceNode;\n previewSizeBytes?: number | null;\n status?: string;\n }\n): number | null {\n const metadataSize = normalizedSizeBytes(node.sizeBytes);\n if (metadataSize != null && metadataSize > 0) {\n return metadataSize;\n }\n if (\n previewState.node &&\n previewState.node.ref.sourceId === node.ref.sourceId &&\n previewState.node.ref.nodeId === node.ref.nodeId\n ) {\n const previewSize = normalizedSizeBytes(previewState.previewSizeBytes);\n if (previewSize != null && previewSize > 0) {\n return previewSize;\n }\n }\n return metadataSize;\n}\n\nfunction normalizedTimestampMs(ms: number | null | undefined): number | null {\n return typeof ms === \"number\" && Number.isFinite(ms) && ms >= 0 ? ms : null;\n}\n\nfunction completeHierarchy(\n hierarchy: readonly ReferenceNode[],\n node: ReferenceNode\n): ReferenceNode[] {\n const last = hierarchy.at(-1);\n if (\n last &&\n last.ref.sourceId === node.ref.sourceId &&\n last.ref.nodeId === node.ref.nodeId\n ) {\n return [...hierarchy];\n }\n return [...hierarchy, node];\n}\n\nfunction decodeReferenceListFileNodeId(nodeId: string): string | null {\n if (!nodeId.startsWith(\"f:\")) {\n return null;\n }\n try {\n const normalized = nodeId.slice(2).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized.padEnd(\n normalized.length + ((4 - (normalized.length % 4)) % 4),\n \"=\"\n );\n const binary = atob(padded);\n const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));\n return new TextDecoder().decode(bytes);\n } catch {\n return null;\n }\n}\n\nfunction normalizedSizeBytes(\n sizeBytes: number | null | undefined\n): number | null {\n return typeof sizeBytes === \"number\" &&\n Number.isFinite(sizeBytes) &&\n sizeBytes >= 0\n ? sizeBytes\n : null;\n}\n"],"mappings":"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","names":["cn","useEffect","useState","Button","FileIcon","FolderFilledIcon","jsx","jsxs","WorkspaceFileReferencePickerFeedback","FolderFilledIcon","FileIcon","useState","Button","jsx","jsxs","useEffect","cn","useEffect","useId","useMemo","useRef","useState","useComposedInputValue","ArrowRightIcon","Badge","Button","CheckIcon","FolderFilledIcon","Input","ScrollArea","SearchIcon","Spinner","Tooltip","TooltipContent","TooltipTrigger","cn","AddLinedIcon","useEffect","useState","useState","useEffect","jsx","jsxs","useId","useComposedInputValue","useEffect","useRef","useState","useMemo","Button","SearchIcon","Input","ScrollArea","Spinner","cn","FolderFilledIcon","CheckIcon","AddLinedIcon","Tooltip","TooltipTrigger","TooltipContent","Badge","ArrowRightIcon"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ui/internal/reference/WorkspaceFileReferencePicker.tsx","../../src/ui/internal/reference/WorkspaceFileReferencePickerSections.tsx","../../src/ui/internal/reference/WorkspaceFileReferencePickerTree.tsx","../../src/ui/internal/reference/ReferenceSourcePicker.tsx","../../src/react/internal/reference/useReferenceSourcePickerView.ts","../../src/ui/internal/reference/referenceSourcePickerPresentation.ts"],"sourcesContent":["import {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n cn\n} from \"@tutti-os/ui-system\";\nimport { useEffect } from \"react\";\nimport type {\n WorkspaceFileReferenceAdapter,\n WorkspaceFileReference,\n WorkspaceFileReferenceCopy\n} from \"../../../contracts/index.ts\";\nimport { useWorkspaceFileReferencePickerView } from \"../../../react/index.ts\";\nimport {\n WorkspaceFileReferencePickerFooter,\n WorkspaceFileReferencePickerPreviewPane\n} from \"./WorkspaceFileReferencePickerSections.tsx\";\nimport { WorkspaceFileReferencePickerBrowserPane } from \"./WorkspaceFileReferencePickerTree.tsx\";\n\nexport interface WorkspaceFileReferencePickerProps {\n copy: WorkspaceFileReferenceCopy;\n fileAdapter?: WorkspaceFileReferenceAdapter;\n initialPath?: string | null;\n onClose: () => void;\n onConfirm: (refs: WorkspaceFileReference[]) => void;\n open: boolean;\n /**\n * When true, the dialog is rendered inline (non-portaled, absolutely\n * positioned) so it stays clipped within the nearest positioned ancestor —\n * e.g. an agent GUI node window — instead of covering the whole viewport.\n * Defaults to false (portal to body + cover the viewport).\n */\n scoped?: boolean;\n workspaceId: string;\n}\n\nexport function WorkspaceFileReferencePicker({\n copy,\n fileAdapter,\n initialPath,\n onClose,\n onConfirm,\n open,\n scoped = false,\n workspaceId\n}: WorkspaceFileReferencePickerProps) {\n const {\n browseRootEntries,\n directoryStateByPath,\n expandedFolderPaths,\n focusedEntry,\n focusedPath,\n isLoading,\n mode,\n previewState,\n searchQuery,\n selectedRefs,\n visibleEntries,\n setFocusedPath,\n setSearchQuery,\n toggleFolder,\n toggleRef\n } = useWorkspaceFileReferencePickerView({\n fileAdapter,\n initialPath,\n onClose,\n onConfirm,\n open,\n workspaceId\n });\n useEffect(() => {\n if (!open) {\n return;\n }\n const handleEscapeKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== \"Escape\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n onClose();\n };\n document.addEventListener(\"keydown\", handleEscapeKeyDown, {\n capture: true\n });\n return () => {\n document.removeEventListener(\"keydown\", handleEscapeKeyDown, {\n capture: true\n });\n };\n }, [onClose, open]);\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n if (!nextOpen) {\n onClose();\n }\n }}\n >\n <DialogContent\n // Radix infers the description; this picker has none.\n aria-describedby={undefined}\n className={cn(\n \"nodrag flex h-[min(88vh,44rem)] w-full max-w-5xl flex-col gap-0 overflow-hidden border-[var(--line-1)] bg-[var(--background-fronted)] p-0 text-[var(--text-primary)] shadow-panel [-webkit-app-region:no-drag] sm:h-[min(82vh,44rem)] sm:max-w-5xl\"\n )}\n onEscapeKeyDown={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n }}\n // When scoped, both overlay and content stay clipped within the nearest\n // positioned ancestor (the node window) instead of covering the viewport.\n overlayClassName={cn(\"nodrag\", scoped && \"!absolute\")}\n portaled={!scoped}\n >\n <DialogHeader className=\"flex-none border-b border-[var(--line-1)] px-4 py-4 sm:px-6 sm:py-5\">\n <DialogTitle>{copy.t(\"referencePicker.title\")}</DialogTitle>\n </DialogHeader>\n <div className=\"grid min-h-0 flex-1 grid-rows-[minmax(0,1fr)_auto] gap-0 overflow-hidden p-0 lg:grid-cols-[minmax(0,1.15fr)_minmax(20rem,0.85fr)] lg:grid-rows-1\">\n <WorkspaceFileReferencePickerBrowserPane\n browseRootEntries={browseRootEntries}\n copy={copy}\n directoryStateByPath={directoryStateByPath}\n expandedFolderPaths={expandedFolderPaths}\n focusedPath={focusedPath}\n isLoading={isLoading}\n mode={mode}\n searchQuery={searchQuery}\n selectedRefs={selectedRefs}\n setSearchQuery={setSearchQuery}\n visibleEntries={visibleEntries}\n onFocusPath={setFocusedPath}\n onToggleFolder={toggleFolder}\n onToggleRef={toggleRef}\n />\n <WorkspaceFileReferencePickerPreviewPane\n copy={copy}\n focusedEntry={focusedEntry}\n mode={mode}\n previewState={previewState}\n />\n </div>\n <WorkspaceFileReferencePickerFooter\n copy={copy}\n onClose={onClose}\n onConfirm={() => onConfirm(selectedRefs)}\n selectedRefs={selectedRefs}\n />\n </DialogContent>\n </Dialog>\n );\n}\n","import { useId, useState, type JSX, type ReactNode } from \"react\";\nimport {\n Badge,\n Button,\n FileIcon,\n FolderFilledIcon,\n LoadingIcon\n} from \"@tutti-os/ui-system\";\nimport { formatWorkspacePreviewByteLimit } from \"@tutti-os/workspace-file-preview\";\nimport { WorkspaceFilePreviewSurface as SharedWorkspaceFilePreviewSurface } from \"@tutti-os/workspace-file-preview/react\";\nimport type { WorkspaceFilePreviewSurfaceState } from \"@tutti-os/workspace-file-preview/react\";\nimport type {\n WorkspaceFileReference,\n WorkspaceFileReferenceCopy\n} from \"../../../contracts/index.ts\";\nimport type { WorkspaceFileReferencePreviewState } from \"../../../react/internal/reference/useWorkspaceFileReferencePickerView.ts\";\nimport { resolveWorkspaceFileReferenceLabel } from \"./WorkspaceFileReferencePickerTree.tsx\";\n\nconst workspaceFileReferencePickerSelectedBadgeClassName =\n \"max-w-[14rem] rounded-[4px] border-transparent bg-[var(--transparency-block)] text-[var(--text-primary)]\";\n\nexport function WorkspaceFileReferencePickerPreviewPane({\n copy,\n focusedEntry,\n mode,\n previewState\n}: {\n copy: WorkspaceFileReferenceCopy;\n focusedEntry: WorkspaceFileReference | null;\n mode: \"browse\" | \"search\";\n previewState: WorkspaceFileReferencePreviewState;\n}): JSX.Element {\n return (\n <aside className=\"flex shrink-0 flex-col border-t border-[var(--line-1)] bg-[var(--background-fronted)] lg:min-h-0 lg:flex-1 lg:border-t-0\">\n <div className=\"flex min-h-0 flex-1 flex-col p-2\">\n {focusedEntry ? (\n <div className=\"flex min-h-0 flex-col gap-4 lg:flex-1 lg:gap-5\">\n <WorkspaceFileReferencePreviewSurface\n copy={copy}\n focusedEntry={focusedEntry}\n previewState={previewState}\n />\n <div className=\"space-y-2 px-2 lg:space-y-3\">\n <div className=\"space-y-1.5\">\n <p className=\"truncate text-[15px] font-semibold text-[var(--text-primary)]\">\n {resolveWorkspaceFileReferenceLabel(focusedEntry)}\n </p>\n <p className=\"line-clamp-3 text-[13px] text-[var(--text-secondary)] [overflow-wrap:anywhere]\">\n {focusedEntry.path}\n </p>\n </div>\n </div>\n </div>\n ) : (\n <WorkspaceFileReferencePickerFeedback>\n {mode === \"search\"\n ? copy.t(\"referencePicker.emptySearch\")\n : copy.t(\"referencePicker.emptyDirectory\")}\n </WorkspaceFileReferencePickerFeedback>\n )}\n </div>\n </aside>\n );\n}\n\nfunction WorkspaceFileReferencePreviewSurface({\n copy,\n focusedEntry,\n previewState\n}: {\n copy: WorkspaceFileReferenceCopy;\n focusedEntry: WorkspaceFileReference;\n previewState: WorkspaceFileReferencePreviewState;\n}): JSX.Element {\n return (\n <SharedWorkspaceFilePreviewSurface\n directoryMessage={copy.t(\"referencePicker.previewFolder\")}\n emptyMessage={copy.t(\"referencePicker.previewUnavailable\")}\n frameClassName=\"flex aspect-[3/2] w-full flex-col items-center justify-center overflow-hidden rounded-[8px] border border-[var(--line-2,var(--border-2))] bg-[var(--transparency-block)] p-0 text-center\"\n htmlFrameClassName=\"items-stretch justify-stretch bg-white\"\n htmlTitle={resolveWorkspaceFileReferenceLabel}\n imageAlt={resolveWorkspaceFileReferenceLabel}\n imageFrameClassName=\"p-3\"\n loadingIndicator={\n <span className=\"mx-auto grid size-11 place-items-center rounded-[6px] bg-[var(--transparency-block)]\">\n <LoadingIcon className=\"size-4 animate-spin\" />\n </span>\n }\n loadingMessage={copy.t(\"referencePicker.previewLoading\")}\n messageClassName=\"mx-auto max-w-[24ch] text-[13px] leading-5 text-[var(--text-secondary)] [overflow-wrap:anywhere]\"\n renderIcon={(entry) =>\n entry.kind === \"folder\" ? (\n <FolderFilledIcon className=\"mx-auto size-9 text-[var(--rich-text-folder)]\" />\n ) : (\n <FileIcon className=\"mx-auto size-9 text-[var(--text-tertiary)]\" />\n )\n }\n state={resolveWorkspaceFileReferenceSurfaceState(\n copy,\n focusedEntry,\n previewState\n )}\n textClassName=\"h-full overflow-auto p-3 text-left text-[11px] leading-5 whitespace-pre-wrap break-words text-[var(--text-primary)]\"\n textFrameClassName=\"items-stretch justify-stretch\"\n />\n );\n}\n\nfunction resolveWorkspaceFileReferenceSurfaceState(\n copy: WorkspaceFileReferenceCopy,\n focusedEntry: WorkspaceFileReference,\n previewState: WorkspaceFileReferencePreviewState\n): WorkspaceFilePreviewSurfaceState<WorkspaceFileReference> {\n if (focusedEntry.kind === \"folder\") {\n return {\n entry: focusedEntry,\n status: \"directory\" as const\n };\n }\n\n if (\n !(\"reference\" in previewState) ||\n previewState.reference.path !== focusedEntry.path\n ) {\n return {\n entry: focusedEntry,\n message: focusedEntry.path,\n status: \"unsupported\" as const\n };\n }\n\n switch (previewState.status) {\n case \"loading\":\n case \"image\":\n case \"video\":\n case \"text\":\n case \"html\":\n return {\n ...previewState,\n entry: focusedEntry\n };\n case \"readonly\":\n return {\n entry: focusedEntry,\n message: resolveWorkspaceFileReferencePreviewReadonlyMessage(\n copy,\n previewState\n ),\n status: \"readonly\" as const\n };\n case \"error\":\n return {\n entry: focusedEntry,\n message: copy.t(\"referencePicker.previewError\"),\n status: \"error\" as const\n };\n case \"unsupported\":\n return {\n entry: focusedEntry,\n message: copy.t(\"referencePicker.previewUnsupported\"),\n status: \"unsupported\" as const\n };\n case \"unavailable\":\n return {\n entry: focusedEntry,\n message: copy.t(\"referencePicker.previewUnavailable\"),\n status: \"unsupported\" as const\n };\n case \"directory\":\n return {\n entry: focusedEntry,\n status: \"directory\" as const\n };\n }\n}\n\nfunction resolveWorkspaceFileReferencePreviewReadonlyMessage(\n copy: WorkspaceFileReferenceCopy,\n previewState: Extract<\n WorkspaceFileReferencePreviewState,\n { status: \"readonly\" }\n >\n): string {\n switch (previewState.reason) {\n case \"binary\":\n return copy.t(\"referencePicker.previewBinary\");\n case \"decode_failed\":\n return copy.t(\"referencePicker.previewDecodeFailed\");\n case \"file_too_large\":\n return copy.t(\"referencePicker.previewFileTooLarge\", {\n maxSize: formatWorkspacePreviewByteLimit(previewState.maxSizeBytes ?? 0)\n });\n case \"text_too_large\":\n return copy.t(\"referencePicker.previewTextTooLarge\", {\n maxSize: formatWorkspacePreviewByteLimit(previewState.maxSizeBytes ?? 0)\n });\n }\n}\n\nexport function WorkspaceFileReferencePickerFooter({\n copy,\n onClose,\n onConfirm,\n selectedRefs\n}: {\n copy: WorkspaceFileReferenceCopy;\n onClose: () => void;\n onConfirm: () => void;\n selectedRefs: readonly WorkspaceFileReference[];\n}): JSX.Element {\n const selectedRefsTooltipId = useId();\n const [selectedRefsTooltipOpen, setSelectedRefsTooltipOpen] = useState(false);\n const selectedRefsLabel = selectedRefs\n .map((ref) => resolveWorkspaceFileReferenceLabel(ref))\n .join(\"\\n\");\n\n return (\n <div className=\"nodrag flex flex-col gap-3 border-t border-[var(--line-1)] px-4 py-4 [-webkit-app-region:no-drag] sm:px-6 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2 lg:flex-1\">\n <span className=\"text-[13px] text-[var(--text-secondary)]\">\n {copy.t(\"referencePicker.selectedCount\", {\n count: selectedRefs.length\n })}\n </span>\n {selectedRefs.slice(0, 2).map((ref) => (\n <Badge\n className={workspaceFileReferencePickerSelectedBadgeClassName}\n key={ref.path}\n variant=\"secondary\"\n >\n <span className=\"truncate\">\n {resolveWorkspaceFileReferenceLabel(ref)}\n </span>\n </Badge>\n ))}\n {selectedRefs.length > 2 ? (\n <span\n className=\"relative inline-flex\"\n onBlur={() => setSelectedRefsTooltipOpen(false)}\n onFocus={() => setSelectedRefsTooltipOpen(true)}\n onMouseEnter={() => setSelectedRefsTooltipOpen(true)}\n onMouseLeave={() => setSelectedRefsTooltipOpen(false)}\n >\n <Badge\n asChild\n className={`${workspaceFileReferencePickerSelectedBadgeClassName} cursor-default`}\n variant=\"secondary\"\n >\n <button\n aria-describedby={selectedRefsTooltipId}\n aria-label={selectedRefsLabel}\n type=\"button\"\n >\n +{selectedRefs.length - 2}\n </button>\n </Badge>\n <span\n aria-hidden={!selectedRefsTooltipOpen}\n className=\"pointer-events-none absolute bottom-[calc(100%+8px)] left-0 z-[var(--z-tooltip,100700)] max-h-[min(20rem,calc(100vh-96px))] w-max max-w-[min(28rem,calc(100vw-32px))] overflow-auto whitespace-pre-line rounded-md border border-[var(--border-1)] bg-[var(--background-fronted)] px-2 py-1 text-left text-[13px] leading-[1.3] text-[var(--text-primary)] shadow-soft transition-opacity duration-100 [overflow-wrap:anywhere]\"\n id={selectedRefsTooltipId}\n role=\"tooltip\"\n style={{\n opacity: selectedRefsTooltipOpen ? 1 : 0,\n visibility: selectedRefsTooltipOpen ? \"visible\" : \"hidden\"\n }}\n >\n {selectedRefsLabel}\n </span>\n </span>\n ) : null}\n </div>\n <div className=\"flex w-full items-center justify-end gap-2 lg:w-auto lg:shrink-0\">\n <Button\n className=\"nodrag [-webkit-app-region:no-drag]\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onClose}\n >\n {copy.t(\"actions.cancel\")}\n </Button>\n <Button\n className=\"nodrag [-webkit-app-region:no-drag]\"\n disabled={selectedRefs.length === 0}\n type=\"button\"\n onClick={onConfirm}\n >\n {copy.t(\"referencePicker.confirm\")}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction WorkspaceFileReferencePickerFeedback({\n children\n}: {\n children: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center px-4 text-center text-[13px] text-[var(--text-secondary)]\">\n {children}\n </div>\n );\n}\n","import { useEffect, useState, type JSX, type ReactNode } from \"react\";\nimport { useComposedInputValue } from \"@tutti-os/ui-react-hooks\";\nimport {\n ArrowRightIcon,\n Button,\n CheckIcon,\n FileIcon,\n FolderFilledIcon,\n Input,\n ScrollArea,\n SearchIcon,\n Spinner,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport { AddIcon as AddLinedIcon } from \"@tutti-os/ui-system/icons\";\nimport type {\n WorkspaceFileReference,\n WorkspaceFileReferenceCopy\n} from \"../../../contracts/index.ts\";\nimport {\n normalizeDirectoryPath,\n type WorkspaceFileReferenceDirectoryState\n} from \"../../../react/index.ts\";\n\n// 每级缩进 = 箭头列宽(20px)+ 间距(8px),使子级文件图标对齐到父文件夹图标下方。\nconst workspaceFileReferenceTreeIndent = 28;\nconst workspaceFileReferenceTreeCollapseDurationMs = 200;\n\nexport function WorkspaceFileReferencePickerBrowserPane({\n browseRootEntries,\n copy,\n directoryStateByPath,\n expandedFolderPaths,\n focusedPath,\n isLoading,\n mode,\n searchQuery,\n selectedRefs,\n setSearchQuery,\n visibleEntries,\n onFocusPath,\n onToggleFolder,\n onToggleRef\n}: {\n browseRootEntries: readonly WorkspaceFileReference[];\n copy: WorkspaceFileReferenceCopy;\n directoryStateByPath: Record<string, WorkspaceFileReferenceDirectoryState>;\n expandedFolderPaths: Record<string, boolean>;\n focusedPath: string | null;\n isLoading: boolean;\n mode: \"browse\" | \"search\";\n searchQuery: string;\n selectedRefs: readonly WorkspaceFileReference[];\n setSearchQuery: (query: string) => void;\n visibleEntries: readonly WorkspaceFileReference[];\n onFocusPath: (path: string) => void;\n onToggleFolder: (entry: WorkspaceFileReference) => void;\n onToggleRef: (entry: WorkspaceFileReference) => void;\n}): JSX.Element {\n return (\n <section className=\"nodrag flex min-h-0 flex-col border-b border-[var(--line-1)] [-webkit-app-region:no-drag] lg:border-r lg:border-b-0\">\n <div className=\"border-b border-[var(--line-1)] p-3\">\n <WorkspaceFileReferencePickerSearchInput\n placeholder={copy.t(\"referencePicker.searchPlaceholder\")}\n value={searchQuery}\n onChange={setSearchQuery}\n />\n </div>\n {isLoading ? (\n <WorkspaceFileReferencePickerFeedback>\n <Spinner className=\"text-[var(--text-secondary)]\" size={16} />\n </WorkspaceFileReferencePickerFeedback>\n ) : visibleEntries.length === 0 ? (\n <WorkspaceFileReferencePickerFeedback>\n {mode === \"search\"\n ? copy.t(\"referencePicker.emptySearch\")\n : copy.t(\"referencePicker.emptyDirectory\")}\n </WorkspaceFileReferencePickerFeedback>\n ) : (\n <ScrollArea className=\"min-h-0 flex-1\">\n <div className=\"flex flex-col gap-[2px] p-3\">\n {mode === \"browse\" ? (\n <div className=\"space-y-0.5\">\n {browseRootEntries.map((entry) => (\n <WorkspaceFileReferencePickerTreeEntry\n childDepth={1}\n copy={copy}\n directoryStateByPath={directoryStateByPath}\n entry={entry}\n expandedFolderPaths={expandedFolderPaths}\n focusedPath={focusedPath}\n key={entry.path}\n selectedRefs={selectedRefs}\n onFocusPath={onFocusPath}\n onToggleFolder={onToggleFolder}\n onToggleRef={onToggleRef}\n />\n ))}\n </div>\n ) : (\n visibleEntries.map((entry) => (\n <WorkspaceFileReferencePickerSearchEntry\n entry={entry}\n focused={focusedPath === entry.path}\n key={entry.path}\n selected={selectedRefs.some(\n (item) => item.path === entry.path\n )}\n onFocusPath={onFocusPath}\n onToggleRef={onToggleRef}\n />\n ))\n )}\n </div>\n </ScrollArea>\n )}\n </section>\n );\n}\n\nfunction WorkspaceFileReferencePickerSearchInput({\n onChange,\n placeholder,\n value\n}: {\n onChange: (value: string) => void;\n placeholder: string;\n value: string;\n}): JSX.Element {\n const searchInput = useComposedInputValue({ onCommit: onChange, value });\n\n return (\n <div className=\"relative\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-[var(--text-tertiary)]\" />\n <Input\n className=\"pl-9\"\n placeholder={placeholder}\n value={searchInput.value}\n onBlur={searchInput.onBlur}\n onChange={searchInput.onChange}\n onCompositionEnd={searchInput.onCompositionEnd}\n onCompositionStart={searchInput.onCompositionStart}\n />\n </div>\n );\n}\n\nfunction WorkspaceFileReferencePickerTreeEntry({\n childDepth,\n copy,\n directoryStateByPath,\n entry,\n expandedFolderPaths,\n focusedPath,\n selectedRefs,\n onFocusPath,\n onToggleFolder,\n onToggleRef\n}: {\n childDepth: number;\n copy: WorkspaceFileReferenceCopy;\n directoryStateByPath: Record<string, WorkspaceFileReferenceDirectoryState>;\n entry: WorkspaceFileReference;\n expandedFolderPaths: Record<string, boolean>;\n focusedPath: string | null;\n selectedRefs: readonly WorkspaceFileReference[];\n onFocusPath: (path: string) => void;\n onToggleFolder: (entry: WorkspaceFileReference) => void;\n onToggleRef: (entry: WorkspaceFileReference) => void;\n}): JSX.Element {\n const selected = selectedRefs.some((item) => item.path === entry.path);\n const focused = focusedPath === entry.path;\n const isFolder = entry.kind === \"folder\";\n const folderKey = normalizeDirectoryPath(entry.path);\n const expanded = expandedFolderPaths[folderKey] ?? false;\n const childState = directoryStateByPath[folderKey];\n const childEntries = childState?.entries ?? [];\n const [shouldRenderChildContent, setShouldRenderChildContent] =\n useState(expanded);\n\n useEffect(() => {\n if (expanded) {\n setShouldRenderChildContent(true);\n return;\n }\n\n const timeoutId = window.setTimeout(() => {\n setShouldRenderChildContent(false);\n }, workspaceFileReferenceTreeCollapseDurationMs);\n\n return () => window.clearTimeout(timeoutId);\n }, [expanded]);\n\n const handleRowSelect = () => {\n onFocusPath(entry.path);\n if (isFolder) {\n onToggleFolder(entry);\n }\n };\n\n const shouldBuildChildContent = expanded || shouldRenderChildContent;\n const childContent = shouldBuildChildContent ? (\n childState?.loading ? (\n <div\n className=\"flex items-center gap-2 px-2 py-2 text-[11px] text-[var(--text-secondary)]\"\n style={{\n paddingLeft: `${childDepth * workspaceFileReferenceTreeIndent + 12}px`\n }}\n >\n <Spinner className=\"text-[var(--text-secondary)]\" size={14} />\n <span>{copy.t(\"referencePicker.loading\")}</span>\n </div>\n ) : childEntries.length > 0 ? (\n <div className=\"space-y-0.5\">\n {childEntries.map((childEntry) => (\n <WorkspaceFileReferencePickerTreeEntry\n childDepth={childDepth + 1}\n copy={copy}\n directoryStateByPath={directoryStateByPath}\n entry={childEntry}\n expandedFolderPaths={expandedFolderPaths}\n focusedPath={focusedPath}\n key={childEntry.path}\n selectedRefs={selectedRefs}\n onFocusPath={onFocusPath}\n onToggleFolder={onToggleFolder}\n onToggleRef={onToggleRef}\n />\n ))}\n </div>\n ) : childState?.loaded ? (\n <div\n className=\"px-2 py-2 text-[11px] text-[var(--text-secondary)]\"\n style={{\n paddingLeft: `${childDepth * workspaceFileReferenceTreeIndent + 12}px`\n }}\n >\n {copy.t(\"referencePicker.emptyDirectory\")}\n </div>\n ) : null\n ) : null;\n\n return (\n <div>\n <div\n aria-current={focused ? \"true\" : undefined}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-[6px] py-1.5 pr-1 transition-colors select-none\",\n \"nodrag [-webkit-app-region:no-drag]\",\n focused || selected\n ? \"bg-transparency-block\"\n : \"hover:bg-transparency-block\"\n )}\n role=\"button\"\n tabIndex={0}\n style={{\n paddingLeft: `${(childDepth - 1) * workspaceFileReferenceTreeIndent + 8}px`\n }}\n onClick={handleRowSelect}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleRowSelect();\n }\n }}\n >\n {isFolder ? (\n <button\n aria-label={resolveWorkspaceFileReferenceLabel(entry)}\n className=\"nodrag grid size-5 shrink-0 place-items-center rounded-sm text-[var(--text-secondary)] [-webkit-app-region:no-drag] hover:bg-[var(--transparency-hover)]\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onToggleFolder(entry);\n }}\n >\n <ArrowRightIcon\n className={cn(\n \"size-3.5 transition-transform\",\n expanded && \"rotate-90\"\n )}\n />\n </button>\n ) : null}\n <div className=\"flex min-w-0 flex-1 items-center gap-2 text-left\">\n {isFolder ? (\n <FolderFilledIcon className=\"size-4 shrink-0 text-[var(--rich-text-folder)]\" />\n ) : (\n <FileIcon className=\"size-4 shrink-0 text-[var(--text-tertiary)]\" />\n )}\n <span className=\"truncate text-[13px] text-[var(--text-primary)]\">\n {resolveWorkspaceFileReferenceLabel(entry)}\n </span>\n </div>\n <Button\n aria-label={resolveWorkspaceFileReferenceLabel(entry)}\n aria-pressed={selected}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n className=\"nodrag shrink-0 [-webkit-app-region:no-drag]\"\n onClick={(event) => {\n event.stopPropagation();\n onFocusPath(entry.path);\n onToggleRef(entry);\n }}\n >\n {selected ? (\n <CheckIcon size={14} />\n ) : (\n <AddLinedIcon className=\"text-[var(--text-secondary)]\" size={16} />\n )}\n </Button>\n </div>\n {isFolder ? (\n <div\n className={cn(\n \"grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none\",\n expanded ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\",\n childContent && \"mt-[2px]\"\n )}\n >\n <div\n aria-hidden={expanded ? undefined : \"true\"}\n className={cn(\n \"min-h-0 overflow-hidden transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none\",\n expanded\n ? \"translate-y-0 opacity-100\"\n : \"-translate-y-1 opacity-0\"\n )}\n inert={expanded ? undefined : true}\n >\n {childContent}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction WorkspaceFileReferencePickerSearchEntry({\n entry,\n focused,\n selected,\n onFocusPath,\n onToggleRef\n}: {\n entry: WorkspaceFileReference;\n focused: boolean;\n selected: boolean;\n onFocusPath: (path: string) => void;\n onToggleRef: (entry: WorkspaceFileReference) => void;\n}): JSX.Element {\n const isFolder = entry.kind === \"folder\";\n\n return (\n <div\n aria-current={focused ? \"true\" : undefined}\n className={cn(\n \"grid cursor-pointer grid-cols-[minmax(0,1fr)_auto] items-center gap-3 rounded-[6px] border py-2.5 pr-1 pl-3 transition-colors select-none\",\n \"nodrag [-webkit-app-region:no-drag]\",\n focused || selected\n ? \"border-border bg-transparency-block\"\n : \"border-transparent bg-transparent hover:border-border/70 hover:bg-transparency-block\"\n )}\n role=\"button\"\n tabIndex={0}\n onClick={() => onFocusPath(entry.path)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n onFocusPath(entry.path);\n }\n }}\n >\n <div className=\"nodrag flex min-w-0 items-center gap-3 text-left [-webkit-app-region:no-drag]\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-lg bg-[var(--transparency-block)] text-[var(--text-tertiary)]\">\n {isFolder ? (\n <FolderFilledIcon className=\"size-4 text-[var(--rich-text-folder)]\" />\n ) : (\n <FileIcon className=\"size-4 text-[var(--text-tertiary)]\" />\n )}\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-[13px] font-medium text-[var(--text-primary)]\">\n {resolveWorkspaceFileReferenceLabel(entry)}\n </span>\n <Tooltip delayDuration={300}>\n <TooltipTrigger asChild>\n <span className=\"block truncate text-[11px] text-[var(--text-secondary)]\">\n {entry.path}\n </span>\n </TooltipTrigger>\n <TooltipContent\n className=\"max-w-[min(520px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n side=\"top\"\n >\n {entry.path}\n </TooltipContent>\n </Tooltip>\n </span>\n </div>\n <Button\n aria-label={resolveWorkspaceFileReferenceLabel(entry)}\n aria-pressed={selected}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n className=\"nodrag [-webkit-app-region:no-drag]\"\n onClick={(event) => {\n event.stopPropagation();\n onFocusPath(entry.path);\n onToggleRef(entry);\n }}\n >\n {selected ? (\n <CheckIcon size={14} />\n ) : (\n <AddLinedIcon className=\"text-[var(--text-secondary)]\" size={16} />\n )}\n </Button>\n </div>\n );\n}\n\nfunction WorkspaceFileReferencePickerFeedback({\n children\n}: {\n children: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center px-4 text-center text-[13px] text-[var(--text-secondary)]\">\n {children}\n </div>\n );\n}\n\nexport function resolveWorkspaceFileReferenceLabel(\n ref: WorkspaceFileReference\n): string {\n return (\n ref.displayName || ref.path.split(\"/\").filter(Boolean).at(-1) || ref.path\n );\n}\n","import {\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent,\n type ReactNode,\n type RefObject\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useComposedInputValue } from \"@tutti-os/ui-react-hooks\";\nimport {\n ArrowRightIcon,\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CheckIcon,\n ChevronDownIcon,\n CloseIcon,\n FolderFilledIcon,\n Input,\n IssueIcon,\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n ScrollArea,\n SearchIcon,\n Spinner,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport { AddLinedIcon } from \"@tutti-os/ui-system/icons\";\nimport {\n WorkspaceFilePreviewSurface,\n type WorkspaceFilePreviewSurfaceState\n} from \"@tutti-os/workspace-file-preview/react\";\nimport {\n WorkspaceFileEntryIcon,\n useWorkspaceFileEntryIconUrls,\n WorkspaceFileManagerContextMenu,\n resolveRevealInFolderLabel,\n type WorkspaceFileEntry,\n type WorkspaceFileManagerI18nRuntime,\n type WorkspaceFileOpenWithApplication\n} from \"@tutti-os/workspace-file-manager\";\nimport type {\n NodeRef,\n ReferenceLocateTarget,\n ReferenceNode\n} from \"../../../contracts/referenceSource.ts\";\nimport type {\n WorkspaceFileReference,\n WorkspaceFileReferenceCopy\n} from \"../../../contracts/index.ts\";\nimport type { ReferenceSourceAggregator } from \"../../../core/referenceSourceAggregator.ts\";\nimport {\n base64UrlDecode,\n nodeRefKey,\n type ReferenceFilterCategory\n} from \"../../../core/index.ts\";\nimport {\n useReferenceSourcePickerView,\n type ReferenceNodePreviewState,\n type ReferenceGroupedSelection\n} from \"../../../react/internal/reference/useReferenceSourcePickerView.ts\";\nimport {\n formatReferenceNodePathText,\n formatReferencePreviewDateTime,\n resolveReferencePreviewTimestampMs,\n resolveReferencePreviewSizeBytes\n} from \"./referenceSourcePickerPresentation.ts\";\n\nexport interface ReferenceSourcePickerProps {\n aggregator: ReferenceSourceAggregator;\n copy: WorkspaceFileReferenceCopy;\n /** 可选:打开时直达某事项/应用分组(展开并聚焦)。 */\n initialTarget?: ReferenceLocateTarget | null;\n isNodeSelectable?: (node: ReferenceNode) => boolean;\n fileManagerCopy?: WorkspaceFileManagerI18nRuntime;\n hostOs?: NodeJS.Platform;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => JSX.Element | null;\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n onClose: () => void;\n onConfirm: (refs: WorkspaceFileReference[]) => void;\n /**\n * 可选:启用「文件夹=一个 bundle 节点」确认形态。提供时确认走 confirmGrouped,\n * navigable 源的选中文件夹折叠成 bundle 回调,其余仍为单条文件。\n */\n onConfirmBundles?: (result: ReferenceGroupedSelection) => void;\n open: boolean;\n workspaceId: string;\n}\n\n/**\n * 左栏二级分组(应用/任务列表)默认最多展示的条目数;超出则折叠在「拉取更多」之后。\n * 点击「拉取更多」先展开已加载的隐藏分组;已加载分组全部可见后,若源端仍有续页(cursor),\n * 再复用同一入口拉取下一页。\n */\nconst SIDEBAR_GROUP_PAGE_SIZE = 5;\n\ntype PickerView = ReturnType<typeof useReferenceSourcePickerView>;\ntype ReferenceNodeIconUrlState = ReturnType<\n typeof useWorkspaceFileEntryIconUrls\n>;\ninterface ReferenceSourceContextMenuState {\n node: ReferenceNode;\n x: number;\n y: number;\n}\n\n/** react-resizable-panels 命令式句柄(只用到 resize)。 */\ntype ResizablePanelHandle = { resize: (size: number) => void };\n\n/**\n * 双击分割线:把 panel 自动适配到内容自然宽度。\n * 量 `[data-autofit-label]`(truncate 元素的 scrollWidth = 完整文本宽度)的最右边缘,\n * 加上尾部控件/内边距,折算成占整体宽度的百分比;resize 内部会按 minSize 再做夹取。\n */\nfunction autoFitPanelWidth(\n groupEl: HTMLElement | null,\n contentEl: HTMLElement | null,\n panel: ResizablePanelHandle | null,\n trailingPx: number\n): void {\n if (!groupEl || !contentEl || !panel) {\n return;\n }\n const groupWidth = groupEl.clientWidth;\n if (groupWidth <= 0) {\n return;\n }\n const contentLeft = contentEl.getBoundingClientRect().left;\n const labels = contentEl.querySelectorAll<HTMLElement>(\n \"[data-autofit-label]\"\n );\n let maxRight = 0;\n labels.forEach((label) => {\n const right =\n label.getBoundingClientRect().left - contentLeft + label.scrollWidth;\n if (right > maxRight) {\n maxRight = right;\n }\n });\n if (maxRight <= 0) {\n return;\n }\n const naturalWidth = maxRight + trailingPx;\n panel.resize(Math.min(80, (naturalWidth / groupWidth) * 100));\n}\n\nexport function ReferenceSourcePicker({\n aggregator,\n copy,\n fileManagerCopy,\n hostOs = \"darwin\",\n initialTarget,\n isNodeSelectable,\n onClose,\n onConfirm,\n onConfirmBundles,\n open,\n resolveEntryIconUrl,\n resolveOpenWithApplicationIcon,\n workspaceId\n}: ReferenceSourcePickerProps): JSX.Element | null {\n const titleId = useId();\n const view = useReferenceSourcePickerView({\n aggregator,\n workspaceId,\n open,\n workspaceRootGroupLabel: copy.t(\"referencePicker.workspaceRootGroup\"),\n initialTarget,\n isNodeSelectable,\n onClose,\n onConfirm,\n onConfirmBundles\n });\n\n // 文件类型筛选已下沉为查询参数(view.activeFilters);此处只做切换/清空的转发。\n const activeFilterSet = new Set(view.activeFilters);\n const toggleFilter = (id: string) => {\n const next = new Set(activeFilterSet);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n view.setFilters([...next]);\n };\n const clearFilters = () => view.setFilters([]);\n const searchInput = useComposedInputValue({\n onCommit: view.setSearchQuery,\n value: view.searchQuery\n });\n useEffect(() => {\n if (!open) {\n return;\n }\n const handleEscapeKeyDown = (event: KeyboardEvent): void => {\n if (event.key !== \"Escape\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n onClose();\n };\n document.addEventListener(\"keydown\", handleEscapeKeyDown, {\n capture: true\n });\n return () => {\n document.removeEventListener(\"keydown\", handleEscapeKeyDown, {\n capture: true\n });\n };\n }, [onClose, open]);\n\n // 三栏可拖拽 + 双击自动适配:layoutRef 量整体宽度,content/panel ref 用于双击适配。\n const layoutRef = useRef<HTMLDivElement | null>(null);\n const menuBoundaryRef = useRef<HTMLDivElement | null>(null);\n const contextMenuRef = useRef<HTMLDivElement | null>(null);\n const sidebarContentRef = useRef<HTMLDivElement | null>(null);\n const middleContentRef = useRef<HTMLDivElement | null>(null);\n const sidebarPanelRef = useRef<ResizablePanelHandle | null>(null);\n const middlePanelRef = useRef<ResizablePanelHandle | null>(null);\n const [contextMenu, setContextMenu] =\n useState<ReferenceSourceContextMenuState | null>(null);\n const [openWithApplications, setOpenWithApplications] = useState<\n WorkspaceFileOpenWithApplication[]\n >([]);\n const [openWithLoading, setOpenWithLoading] = useState(false);\n const retainedIconEntries = useMemo(\n () =>\n collectReferenceNodeIconEntries({\n childrenByKey: view.childrenByKey,\n currentEntries: view.currentEntries,\n expandedKeys: view.expandedKeys,\n focusedNode: view.focusedNode,\n searchResults: view.searchResults,\n selection: view.selection,\n sidebarGroupsBySource: view.sidebarGroupsBySource\n }),\n [\n view.childrenByKey,\n view.currentEntries,\n view.expandedKeys,\n view.focusedNode,\n view.searchResults,\n view.selection,\n view.sidebarGroupsBySource\n ]\n );\n const iconUrls = useWorkspaceFileEntryIconUrls({\n entries: retainedIconEntries,\n includeImageThumbnails: resolveEntryIconUrl !== undefined,\n resolveEntryIconUrl\n });\n\n useEffect(() => {\n if (!contextMenu || !fileManagerCopy) {\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n return;\n }\n\n let cancelled = false;\n const cachedApplications = view.getCachedOpenWithApplications(\n contextMenu.node\n );\n if (cachedApplications) {\n setOpenWithApplications(cachedApplications);\n setOpenWithLoading(false);\n return;\n }\n\n setOpenWithApplications([]);\n setOpenWithLoading(true);\n void view\n .listOpenWithApplications(contextMenu.node)\n .then((applications) => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications(applications);\n setOpenWithLoading(false);\n })\n .catch(() => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [contextMenu?.node, fileManagerCopy]);\n\n useEffect(() => {\n if (!contextMenu) {\n return;\n }\n\n function handlePointerDown(event: globalThis.PointerEvent): void {\n const target = event.target;\n if (target instanceof Node && contextMenuRef.current?.contains(target)) {\n return;\n }\n if (\n target instanceof Element &&\n target.closest(\"[data-workspace-file-manager-submenu]\")\n ) {\n return;\n }\n setContextMenu(null);\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n setContextMenu(null);\n }\n }\n\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [contextMenu]);\n\n const openReferenceContextMenu = (\n event: MouseEvent<HTMLElement>,\n node: ReferenceNode\n ): void => {\n if (!fileManagerCopy || node.kind !== \"file\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n view.setFocusedNode(node);\n setContextMenu({\n node,\n x: event.clientX,\n y: event.clientY\n });\n };\n\n if (!open) {\n return null;\n }\n\n const hasSelectedGroup = view.selectedGroupKey != null;\n const fitSidebar = () =>\n autoFitPanelWidth(\n layoutRef.current,\n sidebarContentRef.current,\n sidebarPanelRef.current,\n 36\n );\n const fitMiddle = () =>\n autoFitPanelWidth(\n layoutRef.current,\n middleContentRef.current,\n middlePanelRef.current,\n 56\n );\n const handleReferencePickerKeyDownCapture = (\n event: ReactKeyboardEvent<HTMLDivElement>\n ): void => {\n if (event.key !== \"Escape\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n onClose();\n };\n\n const dialog = (\n <div\n className=\"nodrag fixed inset-0 grid place-items-center bg-[var(--backdrop)] px-3 py-4 backdrop-blur-md [-webkit-app-region:no-drag] sm:px-6 sm:py-8\"\n style={{ zIndex: \"var(--z-panel)\" }}\n onClick={onClose}\n onKeyDownCapture={handleReferencePickerKeyDownCapture}\n >\n <Card\n aria-labelledby={titleId}\n aria-modal=\"true\"\n className=\"nodrag flex h-[min(88vh,46rem)] w-full max-w-5xl flex-col gap-0 overflow-hidden border-[var(--line-1)] bg-[var(--background-fronted)] py-0 text-[var(--text-primary)] shadow-panel [-webkit-app-region:no-drag]\"\n role=\"dialog\"\n onClick={(event) => event.stopPropagation()}\n >\n <CardHeader className=\"gap-3 px-4 pt-4 pb-4 sm:px-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <CardTitle id={titleId}>\n {copy.t(\"referencePicker.title\")}\n </CardTitle>\n <Button\n aria-label={copy.t(\"actions.cancel\")}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onClose}\n >\n <CloseIcon size={16} />\n </Button>\n </div>\n </CardHeader>\n\n <CardContent className=\"flex min-h-0 flex-1 overflow-hidden border-t border-[var(--line-1)] p-0\">\n <div ref={layoutRef} className=\"flex min-h-0 min-w-0 flex-1\">\n <ResizablePanelGroup\n className=\"min-h-0 min-w-0 flex-1\"\n orientation=\"horizontal\"\n // 三栏初始占比(侧边栏更窄,类 Finder)。v4 在三面板下 `defaultSize` 初始布局会因注册时序被忽略而回退等分,\n // 这里用 `defaultLayout`(按 panel id 指定 flexGrow 权重)作为权威初始布局。\n defaultLayout={{ sidebar: 2.5, middle: 4.5, preview: 3 }}\n >\n <ResizablePanel\n id=\"sidebar\"\n className=\"min-h-0 min-w-0\"\n defaultSize={15}\n minSize=\"150px\"\n panelRef={(handle) => {\n sidebarPanelRef.current = handle;\n }}\n >\n <SourceSidebar\n contentRef={sidebarContentRef}\n copy={copy}\n view={view}\n />\n </ResizablePanel>\n <ResizableHandle\n disableDoubleClick\n withHandle\n className=\"after:bg-[var(--line-1)]\"\n onDoubleClick={fitSidebar}\n />\n <ResizablePanel\n id=\"middle\"\n className=\"min-h-0 min-w-0\"\n defaultSize={50}\n minSize=\"260px\"\n panelRef={(handle) => {\n middlePanelRef.current = handle;\n }}\n >\n <div\n ref={menuBoundaryRef}\n className=\"relative flex h-full min-h-0 flex-col\"\n data-slot=\"viewport-menu-boundary\"\n data-workspace-file-menu-boundary=\"\"\n style={\n {\n \"--workspace-file-manager-dialog-overlay-z-index\":\n \"100710\"\n } as CSSProperties\n }\n >\n <div className=\"flex items-center gap-2 border-b border-[var(--line-1)] p-3\">\n <div className=\"relative flex-1\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-[var(--text-tertiary)]\" />\n <Input\n className=\"pl-9\"\n placeholder={copy.t(\n \"referencePicker.searchPlaceholder\"\n )}\n value={searchInput.value}\n onBlur={searchInput.onBlur}\n onChange={searchInput.onChange}\n onCompositionEnd={searchInput.onCompositionEnd}\n onCompositionStart={searchInput.onCompositionStart}\n />\n </div>\n {view.capabilities?.filterable &&\n view.filterCategories.length > 0 ? (\n <FilterCategoryFilter\n categories={view.filterCategories}\n copy={copy}\n selected={activeFilterSet}\n onClear={clearFilters}\n onToggle={toggleFilter}\n />\n ) : null}\n </div>\n <ScrollArea\n className=\"min-h-0 flex-1\"\n viewportProps={{\n // 拉到底部(距底 <120px)自动加载更多 —— 查询态走增长式分页,\n // 浏览态走 cursor 续页。已在加载/无更多时由 loadMore 内部 no-op。\n onScroll: (event) => {\n const el = event.currentTarget;\n if (\n view.hasMore &&\n !view.isLoading &&\n !view.isLoadingMore &&\n el.scrollHeight - el.scrollTop - el.clientHeight < 120\n ) {\n view.loadMore();\n }\n }\n }}\n >\n <div\n ref={middleContentRef}\n className=\"flex flex-col gap-[2px] p-3\"\n >\n {view.isLoading ? (\n <Feedback>\n <Spinner size={16} />\n </Feedback>\n ) : view.isQuery ? (\n // 查询态(关键词或筛选):扁平结果\n view.searchResults.length === 0 ? (\n <Feedback>\n {copy.t(\"referencePicker.emptySearch\")}\n </Feedback>\n ) : (\n view.searchResults.map((node) => (\n <SearchResultRow\n key={nodeRefKey(node.ref)}\n focused={isFocused(view.focusedNode, node)}\n iconUrls={iconUrls}\n node={node}\n selected={view.isSelected(node)}\n onFocus={view.setFocusedNode}\n onContextMenu={openReferenceContextMenu}\n onOpen={view.openNode}\n selectable={view.isSelectable(node)}\n onSingleSelect={\n view.toggleSingleSelectionAndExpand\n }\n onToggle={view.toggleSelection}\n />\n ))\n )\n ) : view.currentEntries.length === 0 ? (\n <Feedback>\n {copy.t(\n hasSelectedGroup\n ? \"referencePicker.emptyDirectory\"\n : \"referencePicker.selectGroupHint\"\n )}\n </Feedback>\n ) : (\n // 浏览:就地递归展开树(复刻 agent 引用面板文件树交互)\n view.currentEntries.map((node) => (\n <TreeNodeRow\n key={nodeRefKey(node.ref)}\n copy={copy}\n depth={0}\n iconUrls={iconUrls}\n node={node}\n onContextMenu={openReferenceContextMenu}\n view={view}\n />\n ))\n )}\n {view.hasMore && (view.isQuery || hasSelectedGroup) ? (\n <Button\n className=\"mt-1 w-full\"\n disabled={view.isLoadingMore}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={view.loadMore}\n >\n {view.isLoadingMore ? (\n <Spinner className=\"text-current\" size={14} />\n ) : null}\n {copy.t(\"referencePicker.loadMore\")}\n </Button>\n ) : null}\n </div>\n </ScrollArea>\n {fileManagerCopy ? (\n <WorkspaceFileManagerContextMenu\n busy={view.isOpeningReference}\n contextMenu={\n contextMenu\n ? {\n entry: referenceNodeToWorkspaceFileEntry(\n contextMenu.node\n ),\n x: contextMenu.x,\n y: contextMenu.y\n }\n : null\n }\n contextMenuRef={contextMenuRef}\n copy={fileManagerCopy}\n openWithApplications={openWithApplications}\n openWithLoading={openWithLoading}\n positionMode=\"viewport\"\n revealInFolderLabel={resolveRevealInFolderLabel(\n fileManagerCopy,\n hostOs\n )}\n resolveOpenWithApplicationIcon={\n resolveOpenWithApplicationIcon\n }\n showCopyAction={false}\n showCopyPathAction={false}\n showCreateAction={false}\n showDeleteAction={false}\n showExportAction={false}\n showImportAction={false}\n showOpenInAppBrowserAction={false}\n showOpenInDefaultBrowserAction={false}\n showOpenInFileViewerAction={false}\n showOpenWithAction={true}\n showOpenWithOtherAction={true}\n showRevealInFolderAction={true}\n showRenameAction={false}\n onClose={() => setContextMenu(null)}\n onCopy={noopAsync}\n onCopyPath={noopAsync}\n onCreateDirectory={noopVoid}\n onCreateFile={noopVoid}\n onDelete={noopVoid}\n onExport={noopAsync}\n onImport={noopAsync}\n onOpen={async () => {\n if (contextMenu) {\n await view.openNode(contextMenu.node);\n }\n }}\n onOpenInAppBrowser={noopAsync}\n onOpenInDefaultBrowser={noopAsync}\n onOpenInFileViewer={noopAsync}\n onOpenWithApplication={async (applicationPath) => {\n if (contextMenu) {\n await view.openWithApplication(\n contextMenu.node,\n applicationPath\n );\n }\n }}\n onOpenWithOtherApplication={async () => {\n if (contextMenu) {\n await view.openWithOtherApplication(\n contextMenu.node,\n fileManagerCopy.t(\"openWithOtherPickerPrompt\")\n );\n }\n }}\n onRevealInFolder={async () => {\n if (contextMenu) {\n await view.revealNode(contextMenu.node);\n }\n }}\n onRename={noopVoid}\n />\n ) : null}\n </div>\n </ResizablePanel>\n <ResizableHandle\n disableDoubleClick\n withHandle\n className=\"after:bg-[var(--line-1)]\"\n onDoubleClick={fitMiddle}\n />\n <ResizablePanel\n id=\"preview\"\n className=\"min-h-0 min-w-0\"\n defaultSize={30}\n minSize=\"200px\"\n >\n <PreviewInfoPane\n copy={copy}\n hierarchy={view.breadcrumb}\n iconUrls={iconUrls}\n node={view.focusedNode}\n previewState={view.previewState}\n sourceLabel={view.activeTabLabel}\n />\n </ResizablePanel>\n </ResizablePanelGroup>\n </div>\n </CardContent>\n\n <Footer\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmLabel={copy.t(\"referencePicker.confirm\")}\n countLabel={copy.t(\"referencePicker.selectedCount\", {\n count: view.selectionCount\n })}\n disabled={view.selectionCount === 0}\n loading={view.isConfirming}\n selection={view.selection}\n onClose={onClose}\n onConfirm={() => void view.confirm()}\n />\n </Card>\n </div>\n );\n\n if (typeof document === \"undefined\") {\n return dialog;\n }\n return createPortal(dialog, document.body);\n}\n\nexport interface ReferenceSourceContentPaneProps {\n aggregator: ReferenceSourceAggregator;\n className?: string;\n copy: WorkspaceFileReferenceCopy;\n fileManagerCopy?: WorkspaceFileManagerI18nRuntime;\n hostOs?: NodeJS.Platform;\n initialNodeRef?: NodeRef | null;\n initialTarget?: ReferenceLocateTarget | null;\n resolveEntryIconUrl?: (\n entry: WorkspaceFileEntry\n ) => Promise<string | null | undefined>;\n resolveOpenWithApplicationIcon?: (\n application: WorkspaceFileOpenWithApplication\n ) => JSX.Element | null;\n workspaceId: string;\n}\n\nexport function ReferenceSourceContentPane({\n aggregator,\n className,\n copy,\n fileManagerCopy,\n hostOs = \"darwin\",\n initialNodeRef = null,\n initialTarget = null,\n resolveEntryIconUrl,\n resolveOpenWithApplicationIcon,\n workspaceId\n}: ReferenceSourceContentPaneProps): JSX.Element {\n const view = useReferenceSourcePickerView({\n aggregator,\n workspaceId,\n open: true,\n workspaceRootGroupLabel: copy.t(\"referencePicker.workspaceRootGroup\"),\n initialTarget,\n isNodeSelectable: () => false,\n onClose: noopVoid,\n onConfirm: noopVoid\n });\n useEffect(() => {\n if (!initialNodeRef) {\n return;\n }\n if (view.selectedGroupKey === nodeRefKey(initialNodeRef)) {\n return;\n }\n const group = view.sidebarGroupsBySource[initialNodeRef.sourceId]?.find(\n (item) => item.ref.nodeId === initialNodeRef.nodeId\n );\n if (!group) {\n return;\n }\n view.selectGroup(group);\n }, [\n initialNodeRef,\n view.selectedGroupKey,\n view.sidebarGroupsBySource,\n view.selectGroup\n ]);\n const activeFilterSet = new Set(view.activeFilters);\n const toggleFilter = (id: string) => {\n const next = new Set(activeFilterSet);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n view.setFilters([...next]);\n };\n const clearFilters = () => view.setFilters([]);\n const searchInput = useComposedInputValue({\n onCommit: view.setSearchQuery,\n value: view.searchQuery\n });\n const contextMenuRef = useRef<HTMLDivElement | null>(null);\n const [contextMenu, setContextMenu] =\n useState<ReferenceSourceContextMenuState | null>(null);\n const [openWithApplications, setOpenWithApplications] = useState<\n WorkspaceFileOpenWithApplication[]\n >([]);\n const [openWithLoading, setOpenWithLoading] = useState(false);\n const retainedIconEntries = useMemo(\n () =>\n collectReferenceNodeIconEntries({\n childrenByKey: view.childrenByKey,\n currentEntries: view.currentEntries,\n expandedKeys: view.expandedKeys,\n focusedNode: view.focusedNode,\n searchResults: view.searchResults,\n selection: view.selection,\n sidebarGroupsBySource: view.sidebarGroupsBySource\n }),\n [\n view.childrenByKey,\n view.currentEntries,\n view.expandedKeys,\n view.focusedNode,\n view.searchResults,\n view.selection,\n view.sidebarGroupsBySource\n ]\n );\n const iconUrls = useWorkspaceFileEntryIconUrls({\n entries: retainedIconEntries,\n includeImageThumbnails: resolveEntryIconUrl !== undefined,\n resolveEntryIconUrl\n });\n\n useEffect(() => {\n if (!contextMenu || !fileManagerCopy) {\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n return;\n }\n\n let cancelled = false;\n const cachedApplications = view.getCachedOpenWithApplications(\n contextMenu.node\n );\n if (cachedApplications) {\n setOpenWithApplications(cachedApplications);\n setOpenWithLoading(false);\n return;\n }\n\n setOpenWithApplications([]);\n setOpenWithLoading(true);\n void view\n .listOpenWithApplications(contextMenu.node)\n .then((applications) => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications(applications);\n setOpenWithLoading(false);\n })\n .catch(() => {\n if (cancelled) {\n return;\n }\n setOpenWithApplications([]);\n setOpenWithLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [contextMenu?.node, fileManagerCopy]);\n\n useEffect(() => {\n if (!contextMenu) {\n return;\n }\n\n function handlePointerDown(event: globalThis.PointerEvent): void {\n const target = event.target;\n if (target instanceof Node && contextMenuRef.current?.contains(target)) {\n return;\n }\n if (\n target instanceof Element &&\n target.closest(\"[data-workspace-file-manager-submenu]\")\n ) {\n return;\n }\n setContextMenu(null);\n }\n\n function handleKeyDown(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n setContextMenu(null);\n }\n }\n\n window.addEventListener(\"pointerdown\", handlePointerDown);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [contextMenu]);\n\n const openReferenceContextMenu = (\n event: MouseEvent<HTMLElement>,\n node: ReferenceNode\n ): void => {\n if (!fileManagerCopy || node.kind !== \"file\") {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n view.setFocusedNode(node);\n setContextMenu({\n node,\n x: event.clientX,\n y: event.clientY\n });\n };\n const hasSelectedGroup = view.selectedGroupKey != null;\n\n return (\n <div\n className={cn(\n \"relative flex min-h-0 min-w-0 flex-1 overflow-hidden bg-[var(--background-fronted)]\",\n className\n )}\n data-slot=\"viewport-menu-boundary\"\n data-workspace-file-menu-boundary=\"\"\n style={\n {\n \"--workspace-file-manager-dialog-overlay-z-index\": \"20\"\n } as CSSProperties\n }\n >\n <div className=\"flex min-h-0 min-w-0 flex-[1.7] flex-col border-r border-[var(--line-1)]\">\n <div className=\"flex items-center gap-2 border-b border-[var(--line-1)] p-3\">\n <div className=\"relative flex-1\">\n <SearchIcon className=\"pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2 text-[var(--text-tertiary)]\" />\n <Input\n className=\"pl-9\"\n placeholder={copy.t(\"referencePicker.searchPlaceholder\")}\n value={searchInput.value}\n onBlur={searchInput.onBlur}\n onChange={searchInput.onChange}\n onCompositionEnd={searchInput.onCompositionEnd}\n onCompositionStart={searchInput.onCompositionStart}\n />\n </div>\n {view.capabilities?.filterable && view.filterCategories.length > 0 ? (\n <FilterCategoryFilter\n categories={view.filterCategories}\n copy={copy}\n selected={activeFilterSet}\n onClear={clearFilters}\n onToggle={toggleFilter}\n />\n ) : null}\n </div>\n <ScrollArea\n className=\"min-h-0 flex-1\"\n viewportProps={{\n onScroll: (event) => {\n const el = event.currentTarget;\n if (\n view.hasMore &&\n !view.isLoading &&\n !view.isLoadingMore &&\n el.scrollHeight - el.scrollTop - el.clientHeight < 120\n ) {\n view.loadMore();\n }\n }\n }}\n >\n <div className=\"flex flex-col gap-[2px] p-3\">\n {view.isLoading ? (\n <Feedback>\n <Spinner size={16} />\n </Feedback>\n ) : view.isQuery ? (\n view.searchResults.length === 0 ? (\n <Feedback>{copy.t(\"referencePicker.emptySearch\")}</Feedback>\n ) : (\n view.searchResults.map((node) => (\n <SearchResultRow\n key={nodeRefKey(node.ref)}\n focused={isFocused(view.focusedNode, node)}\n iconUrls={iconUrls}\n node={node}\n selected={view.isSelected(node)}\n onFocus={view.setFocusedNode}\n onContextMenu={openReferenceContextMenu}\n onOpen={view.openNode}\n selectable={view.isSelectable(node)}\n onSingleSelect={view.toggleSingleSelectionAndExpand}\n onToggle={view.toggleSelection}\n />\n ))\n )\n ) : view.currentEntries.length === 0 ? (\n <Feedback>\n {copy.t(\n hasSelectedGroup\n ? \"referencePicker.emptyDirectory\"\n : \"referencePicker.selectGroupHint\"\n )}\n </Feedback>\n ) : (\n view.currentEntries.map((node) => (\n <TreeNodeRow\n key={nodeRefKey(node.ref)}\n copy={copy}\n depth={0}\n iconUrls={iconUrls}\n node={node}\n onContextMenu={openReferenceContextMenu}\n view={view}\n />\n ))\n )}\n {view.hasMore && (view.isQuery || hasSelectedGroup) ? (\n <Button\n className=\"mt-1 w-full\"\n disabled={view.isLoadingMore}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={view.loadMore}\n >\n {view.isLoadingMore ? (\n <Spinner className=\"text-current\" size={14} />\n ) : null}\n {copy.t(\"referencePicker.loadMore\")}\n </Button>\n ) : null}\n </div>\n </ScrollArea>\n {fileManagerCopy ? (\n <WorkspaceFileManagerContextMenu\n busy={view.isOpeningReference}\n contextMenu={\n contextMenu\n ? {\n entry: referenceNodeToWorkspaceFileEntry(contextMenu.node),\n x: contextMenu.x,\n y: contextMenu.y\n }\n : null\n }\n contextMenuRef={contextMenuRef}\n copy={fileManagerCopy}\n openWithApplications={openWithApplications}\n openWithLoading={openWithLoading}\n positionMode=\"viewport\"\n revealInFolderLabel={resolveRevealInFolderLabel(\n fileManagerCopy,\n hostOs\n )}\n resolveOpenWithApplicationIcon={resolveOpenWithApplicationIcon}\n showCopyAction={false}\n showCopyPathAction={false}\n showCreateAction={false}\n showDeleteAction={false}\n showExportAction={false}\n showImportAction={false}\n showOpenInAppBrowserAction={false}\n showOpenInDefaultBrowserAction={false}\n showOpenInFileViewerAction={false}\n showOpenWithAction={true}\n showOpenWithOtherAction={true}\n showRevealInFolderAction={true}\n showRenameAction={false}\n onClose={() => setContextMenu(null)}\n onCopy={noopAsync}\n onCopyPath={noopAsync}\n onCreateDirectory={noopVoid}\n onCreateFile={noopVoid}\n onDelete={noopVoid}\n onExport={noopAsync}\n onImport={noopAsync}\n onOpen={async () => {\n if (contextMenu) {\n await view.openNode(contextMenu.node);\n }\n }}\n onOpenInAppBrowser={noopAsync}\n onOpenInDefaultBrowser={noopAsync}\n onOpenInFileViewer={noopAsync}\n onOpenWithApplication={async (applicationPath) => {\n if (contextMenu) {\n await view.openWithApplication(\n contextMenu.node,\n applicationPath\n );\n }\n }}\n onOpenWithOtherApplication={async () => {\n if (contextMenu) {\n await view.openWithOtherApplication(\n contextMenu.node,\n fileManagerCopy.t(\"openWithOtherPickerPrompt\")\n );\n }\n }}\n onRevealInFolder={async () => {\n if (contextMenu) {\n await view.revealNode(contextMenu.node);\n }\n }}\n onRename={noopVoid}\n />\n ) : null}\n </div>\n <div className=\"@max-[760px]/workspace-file-manager:hidden min-h-0 min-w-[220px] flex-1\">\n <PreviewInfoPane\n copy={copy}\n hierarchy={view.breadcrumb}\n iconUrls={iconUrls}\n node={view.focusedNode}\n previewState={view.previewState}\n sourceLabel={view.activeTabLabel}\n />\n </div>\n </div>\n );\n}\n\n/**\n * 二级分组无自带 iconUrl 时的兜底图标:按源 metadata.icon 令牌选取。\n * 议题源(icon: \"issue\")用「事项」应用图标,其余回退到文件夹图标。\n */\nfunction GroupFallbackIcon({\n icon,\n className\n}: {\n icon?: string;\n className: string;\n}): JSX.Element {\n if (icon === \"issue\") {\n return <IssueIcon className={className} />;\n }\n return <FolderFilledIcon className={className} />;\n}\n\n/**\n * 左侧边栏(类 macOS Finder 边栏):\n * 一级源(本地/应用/任务)作为常驻分组标题、默认全部展开、无折叠箭头;\n * 其下二级目录分组与标题左对齐(无额外缩进),靠图标区分层级。\n */\nfunction SourceSidebar({\n copy,\n view,\n contentRef\n}: {\n copy: WorkspaceFileReferenceCopy;\n view: PickerView;\n contentRef: RefObject<HTMLDivElement | null>;\n}): JSX.Element {\n // 选中分组(含 initialTarget 定位结果)变化时,把它滚入可视区。\n const selectedGroupRef = useRef<HTMLButtonElement | null>(null);\n useEffect(() => {\n selectedGroupRef.current?.scrollIntoView({ block: \"nearest\" });\n }, [view.selectedGroupKey]);\n // 每个源已展示的分组上限(默认一页);点「拉取更多」按页累加。源切换/重开会重置。\n const [shownBySource, setShownBySource] = useState<Record<string, number>>(\n {}\n );\n const loadMoreGroups = (sourceId: string) => {\n const groups = view.sidebarGroupsBySource[sourceId] ?? [];\n const limit = shownBySource[sourceId] ?? SIDEBAR_GROUP_PAGE_SIZE;\n // 点「查看更多」先展示全部已加载项;已全部可见时,同一入口再拉源端下一页。\n const visibleCount = Math.max(groups.length, limit);\n if (groups.length > limit) {\n setShownBySource((prev) => ({ ...prev, [sourceId]: visibleCount }));\n return;\n }\n if (view.sidebarHasMoreBySource[sourceId] ?? false) {\n view.loadMoreSidebarGroups(sourceId);\n }\n };\n return (\n <ScrollArea className=\"h-full min-h-0 w-full\">\n <div ref={contentRef} className=\"flex flex-col gap-0.5 p-2\">\n <p className=\"px-2 py-1 text-[11px] font-semibold text-[var(--text-tertiary)]\">\n {copy.t(\"referencePicker.sourceColumn\")}\n </p>\n {view.tabs.map((tab) => {\n const groups = view.sidebarGroupsBySource[tab.sourceId] ?? [];\n const limit = shownBySource[tab.sourceId] ?? SIDEBAR_GROUP_PAGE_SIZE;\n // 当前选中分组(如 initialTarget 定位到靠后的项)始终展示,避免「选中却被折叠」。\n const selectedIndex = groups.findIndex(\n (group) => nodeRefKey(group.ref) === view.selectedGroupKey\n );\n const effectiveLimit =\n selectedIndex >= limit ? selectedIndex + 1 : limit;\n const visibleGroups = groups.slice(0, effectiveLimit);\n const loadingMore =\n view.sidebarLoadingMoreBySource[tab.sourceId] ?? false;\n // 还能拉取更多 = 已加载分组超出当前展示上限,或源端仍有续页未取。\n const hasMore =\n groups.length > effectiveLimit ||\n (view.sidebarHasMoreBySource[tab.sourceId] ?? false);\n return (\n <div key={tab.sourceId} className=\"flex flex-col gap-0.5\">\n {/* 一级源:Finder 风格分区标题,无箭头、不可折叠。 */}\n <p\n className=\"px-2 pt-1.5 pb-0.5 text-[11px] font-semibold text-[var(--text-tertiary)]\"\n data-autofit-label\n >\n {tab.label}\n </p>\n {groups.length === 0 ? (\n view.isLoadingTabs ? (\n <p className=\"px-2 py-1 text-[12px] text-[var(--text-tertiary)]\">\n …\n </p>\n ) : null\n ) : (\n visibleGroups.map((group) => {\n const key = nodeRefKey(group.ref);\n const selected = key === view.selectedGroupKey;\n return (\n <button\n key={key}\n ref={selected ? selectedGroupRef : undefined}\n aria-current={selected ? \"true\" : undefined}\n className={cn(\n \"flex items-center gap-2 rounded-[6px] px-2 py-1.5 text-left text-[13px] transition-colors\",\n selected\n ? \"bg-primary/10 font-medium text-[var(--text-primary)] hover:bg-primary/15\"\n : \"text-[var(--text-secondary)] hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)]\"\n )}\n type=\"button\"\n onClick={() => view.selectGroup(group)}\n >\n {group.iconUrl ? (\n <img\n alt=\"\"\n className=\"size-4 shrink-0 rounded-[3px] object-cover\"\n src={group.iconUrl}\n />\n ) : (\n <GroupFallbackIcon\n className=\"size-4 shrink-0 text-[var(--rich-text-folder)]\"\n icon={tab.icon}\n />\n )}\n <FullTextTooltip content={group.displayName}>\n <span\n className=\"min-w-0 flex-1 truncate\"\n data-autofit-label\n >\n {group.displayName}\n </span>\n </FullTextTooltip>\n {group.childCount != null ? (\n <span className=\"shrink-0 text-[11px] text-[var(--text-tertiary)]\">\n {group.childCount}\n </span>\n ) : null}\n </button>\n );\n })\n )}\n {hasMore ? (\n <button\n className=\"flex items-center gap-1.5 rounded-[6px] px-2 py-1.5 text-left text-[12px] text-[var(--text-secondary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)] disabled:opacity-60\"\n disabled={loadingMore}\n type=\"button\"\n onClick={() => loadMoreGroups(tab.sourceId)}\n >\n {loadingMore ? (\n <Spinner\n className=\"text-[var(--text-secondary)]\"\n size={12}\n />\n ) : (\n <ChevronDownIcon\n className=\"shrink-0 text-[var(--text-secondary)]\"\n size={12}\n />\n )}\n <span>{copy.t(\"referencePicker.loadMoreGroups\")}</span>\n </button>\n ) : null}\n </div>\n );\n })}\n </div>\n </ScrollArea>\n );\n}\n\nfunction SearchResultRow({\n node,\n focused,\n iconUrls,\n selected,\n selectable,\n onFocus,\n onContextMenu,\n onSingleSelect,\n onOpen,\n onToggle\n}: {\n node: ReferenceNode;\n focused: boolean;\n iconUrls: ReferenceNodeIconUrlState;\n selected: boolean;\n selectable: boolean;\n onFocus: (node: ReferenceNode) => void;\n onContextMenu: (event: MouseEvent<HTMLElement>, node: ReferenceNode) => void;\n onOpen: (node: ReferenceNode) => Promise<void>;\n onSingleSelect: (node: ReferenceNode) => void;\n onToggle: (node: ReferenceNode) => void;\n}): JSX.Element {\n const contextLabel = node.contextLabel ?? node.ref.nodeId;\n const active = selected || (focused && selectable);\n return (\n <div\n className={cn(\n \"grid cursor-pointer grid-cols-[minmax(0,1fr)_auto] items-center gap-3 rounded-[6px] border py-2.5 pr-1 pl-3 transition-colors\",\n active\n ? \"border-border bg-transparency-block\"\n : \"border-transparent bg-transparent hover:border-border/70 hover:bg-transparency-block\"\n )}\n onClick={() => {\n onFocus(node);\n onSingleSelect(node);\n }}\n onContextMenu={(event) => onContextMenu(event, node)}\n onDoubleClick={(event) => {\n if (node.kind !== \"file\") {\n return;\n }\n event.stopPropagation();\n onFocus(node);\n void onOpen(node);\n }}\n >\n <div className=\"flex min-w-0 items-center gap-3 text-left\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-lg bg-[var(--transparency-block)] text-[var(--text-tertiary)]\">\n <ReferenceNodeIcon\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrls={iconUrls}\n node={node}\n />\n </span>\n <span className=\"min-w-0\">\n <FullTextTooltip content={node.displayName}>\n <span className=\"block truncate text-[13px] font-medium text-[var(--text-primary)]\">\n {node.displayName}\n </span>\n </FullTextTooltip>\n <FullTextTooltip content={contextLabel}>\n <span className=\"block truncate text-[11px] text-[var(--text-secondary)]\">\n {contextLabel}\n </span>\n </FullTextTooltip>\n </span>\n </div>\n {selectable ? (\n <Button\n aria-label={node.displayName}\n aria-pressed={selected}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n onFocus(node);\n onToggle(node);\n }}\n onDoubleClick={(event) => event.stopPropagation()}\n >\n {selected ? (\n <CheckIcon size={14} />\n ) : (\n <AddLinedIcon className=\"text-[var(--text-secondary)]\" size={16} />\n )}\n </Button>\n ) : null}\n </div>\n );\n}\n\n/**\n * 把 hook 的 node-keyed 预览态映射成共享预览组件的 surface state,补上本地化文案。\n * previewState 可能短暂滞后于 node(异步加载间隙),不匹配时回退到 loading/directory。\n */\nfunction toPreviewSurfaceState(\n node: ReferenceNode,\n previewState: ReferenceNodePreviewState,\n copy: WorkspaceFileReferenceCopy\n): WorkspaceFilePreviewSurfaceState<ReferenceNode> {\n if (\n !(\"node\" in previewState) ||\n nodeRefKey(previewState.node.ref) !== nodeRefKey(node.ref)\n ) {\n return node.kind === \"folder\"\n ? { entry: node, status: \"directory\" }\n : { entry: node, status: \"loading\" };\n }\n switch (previewState.status) {\n case \"directory\":\n return { entry: node, status: \"directory\" };\n case \"loading\":\n return { entry: node, status: \"loading\" };\n case \"image\":\n return {\n entry: node,\n objectUrl: previewState.objectUrl,\n status: \"image\"\n };\n case \"video\":\n return {\n entry: node,\n objectUrl: previewState.objectUrl,\n status: \"video\"\n };\n case \"text\":\n return { content: previewState.content, entry: node, status: \"text\" };\n case \"html\":\n return { content: previewState.content, entry: node, status: \"html\" };\n case \"readonly\":\n return {\n entry: node,\n message:\n previewState.reason === \"binary\"\n ? copy.t(\"referencePicker.previewBinary\")\n : previewState.reason === \"file_too_large\" ||\n previewState.reason === \"text_too_large\"\n ? copy.t(\"referencePicker.previewTooLarge\")\n : copy.t(\"referencePicker.previewUnsupported\"),\n status: \"readonly\"\n };\n case \"error\":\n return {\n entry: node,\n message: copy.t(\"referencePicker.previewError\"),\n status: \"error\"\n };\n case \"unsupported\":\n return {\n entry: node,\n message: copy.t(\"referencePicker.previewUnsupported\"),\n status: \"unsupported\"\n };\n }\n}\n\n/**\n * 产出来源徽标配色:按一级源给「产出来源」徽标着色,复用 rich-text mention\n * 的语义 token(本地文件 / 应用产物 / 事项产物各自的 @mention 同色),保持\n * 全局一致。未知源回退到默认 secondary 徽标(返回 undefined)。\n * sourceId 取值见 contracts/referenceSource.ts 的枚举说明。\n * 注意:class 必须写成完整字面量,Tailwind JIT 不扫描拼接出来的类名。\n */\nfunction sourceBadgeClassName(sourceId: string): string | undefined {\n return SOURCE_BADGE_CLASSES[sourceId];\n}\n\nconst SOURCE_BADGE_CLASSES: Record<string, string> = {\n \"workspace-file\":\n \"bg-[color-mix(in_srgb,var(--rich-text-mention-file)_12%,transparent)] text-[var(--rich-text-mention-file)]\",\n \"app-artifact\":\n \"bg-[color-mix(in_srgb,var(--rich-text-mention-app)_12%,transparent)] text-[var(--rich-text-mention-app)]\",\n \"issue-file\":\n \"bg-[color-mix(in_srgb,var(--rich-text-mention-issue)_12%,transparent)] text-[var(--rich-text-mention-issue)]\"\n};\n\nfunction FullTextTooltip({\n children,\n content\n}: {\n children: ReactNode;\n content: string;\n}): JSX.Element {\n return (\n <Tooltip delayDuration={300}>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent\n className=\"max-w-[min(520px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n side=\"top\"\n style={{\n maxWidth: \"min(520px, calc(100vw - 32px))\",\n overflowWrap: \"anywhere\",\n whiteSpace: \"normal\",\n backgroundColor: \"var(--background-fronted)\",\n border: \"1px solid var(--border-1)\",\n borderRadius: 6,\n boxShadow: \"var(--shadow-soft)\",\n color: \"var(--text-primary)\",\n padding: \"4px 8px\"\n }}\n >\n {content}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction PreviewInfoPane({\n copy,\n hierarchy,\n iconUrls,\n node,\n previewState,\n sourceLabel\n}: {\n copy: WorkspaceFileReferenceCopy;\n hierarchy: readonly ReferenceNode[];\n iconUrls: ReferenceNodeIconUrlState;\n node: ReferenceNode | null;\n previewState: ReferenceNodePreviewState;\n sourceLabel: string;\n}): JSX.Element {\n const sizeBytes = node\n ? resolveReferencePreviewSizeBytes(node, previewState)\n : null;\n const timestampMs = node ? resolveReferencePreviewTimestampMs(node) : null;\n return (\n <aside className=\"flex h-full min-h-0 w-full flex-col bg-[var(--background-fronted)]\">\n {node ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4 p-4\">\n {/* 文件查看面板:复用 file-manager 的共享预览组件,真实渲染图片/文本内容。 */}\n <WorkspaceFilePreviewSurface<ReferenceNode>\n directoryMessage={copy.t(\"referencePicker.previewFolder\")}\n emptyMessage={copy.t(\"referencePicker.emptyPreview\")}\n frameClassName=\"flex aspect-[3/2] w-full flex-col items-center justify-center overflow-hidden rounded-[8px] border border-[var(--line-2,var(--border-2))] bg-[var(--transparency-block)] p-0 text-center\"\n imageAlt={(entry) => entry.displayName}\n htmlFrameClassName=\"items-stretch justify-stretch bg-white\"\n htmlTitle={(entry) => entry.displayName}\n imageFrameClassName=\"p-3\"\n loadingIndicator={<Spinner size={16} />}\n loadingMessage={copy.t(\"referencePicker.previewLoading\")}\n messageClassName=\"mx-auto max-w-[24ch] text-[13px] leading-5 text-[var(--text-secondary)] [overflow-wrap:anywhere]\"\n renderIcon={(entry) => (\n <ReferenceNodeIcon\n frameClassName=\"size-10\"\n iconClassName=\"size-9\"\n iconUrls={iconUrls}\n node={entry}\n />\n )}\n state={toPreviewSurfaceState(node, previewState, copy)}\n textClassName=\"h-full w-full overflow-auto p-3 text-left text-[11px] leading-5 whitespace-pre-wrap break-words text-[var(--text-primary)]\"\n textFrameClassName=\"items-stretch justify-stretch\"\n />\n <div className=\"space-y-1\">\n <p className=\"truncate text-[15px] font-semibold\">\n {node.displayName}\n </p>\n <ReferencePathText hierarchy={hierarchy} node={node} />\n </div>\n <dl className=\"space-y-2 text-[13px]\">\n <InfoRow label={copy.t(\"referencePicker.previewSource\")}>\n <Badge\n variant=\"secondary\"\n className={sourceBadgeClassName(node.ref.sourceId)}\n >\n {sourceLabel}\n </Badge>\n </InfoRow>\n {timestampMs != null ? (\n <InfoRow label={copy.t(\"referencePicker.previewModified\")}>\n {formatReferencePreviewDateTime(timestampMs)}\n </InfoRow>\n ) : null}\n {sizeBytes != null ? (\n <InfoRow label={copy.t(\"referencePicker.previewSize\")}>\n {formatBytes(sizeBytes)}\n </InfoRow>\n ) : null}\n </dl>\n </div>\n ) : (\n <Feedback>{copy.t(\"referencePicker.emptyPreview\")}</Feedback>\n )}\n </aside>\n );\n}\n\nfunction ReferencePathText({\n hierarchy,\n node\n}: {\n hierarchy: readonly ReferenceNode[];\n node: ReferenceNode;\n}): JSX.Element {\n const pathText = getReferenceNodePathText(node, hierarchy);\n const lastSlashIndex = pathText.lastIndexOf(\"/\");\n if (lastSlashIndex <= 0 || lastSlashIndex === pathText.length - 1) {\n return (\n <p\n className=\"truncate text-[12px] leading-5 text-[var(--text-tertiary)]\"\n title={pathText}\n >\n {pathText}\n </p>\n );\n }\n\n return (\n <p\n className=\"flex min-w-0 items-center text-[12px] leading-5 text-[var(--text-tertiary)]\"\n title={pathText}\n >\n <span className=\"min-w-0 truncate\">\n {pathText.slice(0, lastSlashIndex + 1)}\n </span>\n <span className=\"max-w-[65%] shrink-0 truncate\">\n {pathText.slice(lastSlashIndex + 1)}\n </span>\n </p>\n );\n}\n\nfunction getReferenceNodePathText(\n node: ReferenceNode,\n hierarchy: readonly ReferenceNode[]\n): string {\n return formatReferenceNodePathText(node, hierarchy);\n}\n\nfunction InfoRow({\n label,\n children\n}: {\n label: string;\n children: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"flex items-center justify-between gap-3\">\n <dt className=\"text-[var(--text-secondary)]\">{label}</dt>\n <dd className=\"min-w-0 truncate text-right text-[var(--text-primary)]\">\n {children}\n </dd>\n </div>\n );\n}\n\nfunction Footer({\n cancelLabel,\n confirmLabel,\n countLabel,\n disabled,\n loading = false,\n selection,\n onClose,\n onConfirm\n}: {\n cancelLabel: string;\n confirmLabel: string;\n countLabel: string;\n disabled: boolean;\n loading?: boolean;\n selection: readonly ReferenceNode[];\n onClose: () => void;\n onConfirm: () => void;\n}): JSX.Element {\n const selectionTooltipId = useId();\n const [selectionTooltipOpen, setSelectionTooltipOpen] = useState(false);\n const selectionTooltipLabel = selection\n .map((node) => node.displayName)\n .join(\"\\n\");\n\n return (\n <div className=\"flex items-center justify-between gap-3 border-t border-[var(--line-1)] px-4 py-3 sm:px-6\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"shrink-0 text-[13px] text-[var(--text-secondary)]\">\n {countLabel}\n </span>\n {selection.slice(0, 2).map((node) => (\n <Badge\n key={nodeRefKey(node.ref)}\n className=\"min-w-0 max-w-[12rem]\"\n variant=\"secondary\"\n >\n <FullTextTooltip content={node.displayName}>\n <span className=\"truncate\">{node.displayName}</span>\n </FullTextTooltip>\n </Badge>\n ))}\n {selection.length > 2 ? (\n <span\n className=\"relative inline-flex shrink-0\"\n onBlur={() => setSelectionTooltipOpen(false)}\n onFocus={() => setSelectionTooltipOpen(true)}\n onMouseEnter={() => setSelectionTooltipOpen(true)}\n onMouseLeave={() => setSelectionTooltipOpen(false)}\n >\n <Badge\n asChild\n className=\"shrink-0 cursor-default\"\n variant=\"secondary\"\n >\n <button\n aria-describedby={selectionTooltipId}\n aria-label={selectionTooltipLabel}\n type=\"button\"\n >\n +{selection.length - 2}\n </button>\n </Badge>\n <span\n aria-hidden={!selectionTooltipOpen}\n className=\"pointer-events-none absolute bottom-[calc(100%+8px)] left-0 z-[var(--z-tooltip,100700)] max-h-[min(20rem,calc(100vh-96px))] w-max max-w-[min(28rem,calc(100vw-32px))] overflow-auto whitespace-pre-line rounded-md border border-[var(--border-1)] bg-[var(--background-fronted)] px-2 py-1 text-left text-[13px] leading-[1.3] text-[var(--text-primary)] shadow-soft transition-opacity duration-100 [overflow-wrap:anywhere]\"\n id={selectionTooltipId}\n role=\"tooltip\"\n style={{\n opacity: selectionTooltipOpen ? 1 : 0,\n visibility: selectionTooltipOpen ? \"visible\" : \"hidden\"\n }}\n >\n {selectionTooltipLabel}\n </span>\n </span>\n ) : null}\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {cancelLabel}\n </Button>\n <Button\n disabled={disabled || loading}\n type=\"button\"\n onClick={onConfirm}\n >\n {loading ? <Spinner className=\"text-current\" size={14} /> : null}\n {confirmLabel}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction Feedback({ children }: { children: ReactNode }): JSX.Element {\n return (\n <div className=\"grid min-h-0 flex-1 place-items-center px-4 py-8 text-center text-[13px] text-[var(--text-secondary)]\">\n {children}\n </div>\n );\n}\n\n/**\n * 文件类型多选筛选(搜索框右侧)。自实现的轻量 popover —— 不用设计系统的 Radix\n * DropdownMenu:本下拉嵌在自定义遮罩对话框(createPortal 到 body)里,Radix 菜单项\n * 的 select 在「portal + modal=false」组合下点击无法触发(hover 高亮正常但点了不勾选),\n * 表现为「筛选选了完全没反应」。改用原生 `<button onClick>`,点击必然触发 toggle。\n *\n * 弹层就地(absolute)渲染在触发器下方、不再 portal:对话框很高、弹层短且贴顶,\n * 不会被 overflow 裁切;省去手动定位与 z 层冲突。未选时按钮显示「全部类型」,已选时\n * 按固定顺序拼出已选分类名(过宽则截断,完整列表见 title 悬浮提示),并附数量徽章。\n *\n * 触发器固定宽度、固定 h-8(与左侧搜索框 Input 同高,父行 items-center 居中对齐):\n * 选中文案再长也只在内部截断成「…」,不撑宽控件、不挤动搜索框。有选中时,触发器右侧的\n * 箭头位让位给「清除」按钮:点击一键清空全部筛选(也可在弹层里逐项取消勾选)。\n */\nfunction FilterCategoryFilter({\n categories,\n copy,\n selected,\n onClear,\n onToggle\n}: {\n categories: readonly ReferenceFilterCategory[];\n copy: WorkspaceFileReferenceCopy;\n selected: ReadonlySet<string>;\n onClear: () => void;\n onToggle: (id: string) => void;\n}): JSX.Element {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // 打开期间:点击容器外部或按 Esc 收起。pointerdown 用捕获阶段,先于其它处理生效;\n // 容器内的点击(触发器/选项)不收起,以支持连续多选。\n useEffect(() => {\n if (!open) {\n return;\n }\n const onPointerDown = (event: PointerEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [open]);\n\n // 按 categories 的固定顺序收集已选标签,保证展示顺序稳定。\n const selectedLabels = categories\n .filter((category) => selected.has(category.id))\n .map((category) => copy.t(category.labelKey));\n const count = selectedLabels.length;\n const labelText =\n count > 0\n ? selectedLabels.join(copy.t(\"referencePicker.fileTypeSeparator\"))\n : copy.t(\"referencePicker.fileTypeAll\");\n\n return (\n // shrink-0:不被搜索框挤压;固定宽度让控件不随选中文案变宽。\n <div ref={containerRef} className=\"relative w-[124px] shrink-0\">\n <Button\n aria-expanded={open}\n aria-haspopup=\"menu\"\n // h-8:与左侧搜索框(Input size=default 同为 h-8/32px)显式等高对齐。\n // 不用 h-full —— flex 项内的百分比高度无法可靠地依 items-stretch 求值,\n // 会塌到按钮内容高度,导致与搜索框高度不一致。\n // w-full + justify-between:固定宽度容器内,文案占据中间并截断,箭头贴右。\n className=\"h-8 w-full justify-between gap-1.5 border-0 px-2.5\"\n size=\"default\"\n type=\"button\"\n variant=\"secondary\"\n onClick={() => setOpen((current) => !current)}\n >\n <span className=\"min-w-0 flex-1 truncate text-left\" title={labelText}>\n {labelText}\n </span>\n {count > 1 ? (\n <Badge className=\"shrink-0 px-1.5\" variant=\"secondary\">\n {count}\n </Badge>\n ) : null}\n {count > 0 ? (\n // 有选中时,右侧箭头位让位给「清除」:role=button 的 span(避免 button 嵌\n // button 的非法结构),stopPropagation 让点击只清空筛选、不触发触发器的开合。\n <span\n aria-label={copy.t(\"referencePicker.clearFilter\")}\n className=\"grid size-4 shrink-0 cursor-pointer place-items-center rounded-full text-[var(--text-tertiary)] transition-colors hover:bg-[var(--transparency-hover)] hover:text-[var(--text-primary)]\"\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n onClear();\n }}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n event.stopPropagation();\n onClear();\n }\n }}\n >\n <CloseIcon size={12} />\n </span>\n ) : (\n <ChevronDownIcon className=\"size-3.5 shrink-0 text-[var(--text-tertiary)]\" />\n )}\n </Button>\n {open ? (\n <div\n className=\"absolute top-[calc(100%+4px)] right-0 min-w-40 overflow-hidden rounded-[8px] border border-[var(--line-1)] bg-[var(--background-fronted)] p-1 shadow-panel\"\n role=\"menu\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n >\n {categories.map((category) => {\n const checked = selected.has(category.id);\n return (\n <button\n key={category.id}\n aria-checked={checked}\n className=\"flex w-full items-center gap-2 rounded-[6px] px-2 py-1.5 text-left text-[13px] text-[var(--text-primary)] transition-colors hover:bg-[var(--transparency-hover)]\"\n role=\"menuitemcheckbox\"\n type=\"button\"\n onClick={() => onToggle(category.id)}\n >\n <span className=\"grid size-4 shrink-0 place-items-center\">\n {checked ? (\n <CheckIcon className=\"size-3.5 text-[var(--tutti-purple)]\" />\n ) : null}\n </span>\n <span className=\"flex-1\">{copy.t(category.labelKey)}</span>\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\n// 每级缩进 = 箭头列宽(20px)+ 间距(8px)。文件没有箭头列,因此其图标恰好落在\n// 父文件夹图标的正下方;更深层级仍逐级缩进以体现层级关系。\nconst TREE_INDENT = 28;\nconst TREE_COLLAPSE_DURATION_MS = 200;\n\nfunction isFocused(\n focused: ReferenceNode | null,\n node: ReferenceNode\n): boolean {\n return focused ? nodeRefKey(focused.ref) === nodeRefKey(node.ref) : false;\n}\n\n/**\n * 递归文件树节点,交互复刻 main 分支 `WorkspaceFileReferencePickerTreeEntry`:\n * 24px 缩进、folder 箭头旋转、点名称展开/收起、grid-rows 展开动画、add/check 勾选。\n * 可选性由业务侧按 source/kind 注入,例如 host 本地目录可浏览但不可引用。\n */\nfunction TreeNodeRow({\n node,\n depth,\n iconUrls,\n onContextMenu,\n view,\n copy\n}: {\n node: ReferenceNode;\n depth: number;\n iconUrls: ReferenceNodeIconUrlState;\n onContextMenu: (event: MouseEvent<HTMLElement>, node: ReferenceNode) => void;\n view: PickerView;\n copy: WorkspaceFileReferenceCopy;\n}): JSX.Element {\n const key = nodeRefKey(node.ref);\n const isFolder = node.kind === \"folder\";\n const expanded = view.expandedKeys[key] ?? false;\n const childState = view.childrenByKey[key];\n const childEntries = view.sortNodes(childState?.entries ?? []);\n const selected = view.isSelected(node);\n const selectable = view.isSelectable(node);\n const focused = isFocused(view.focusedNode, node);\n const active = selected || (focused && selectable);\n const focusedRowRef = useRef<HTMLDivElement | null>(null);\n\n const [shouldRenderChildContent, setShouldRenderChildContent] =\n useState(expanded);\n\n useEffect(() => {\n if (focused) {\n focusedRowRef.current?.scrollIntoView({ block: \"nearest\" });\n }\n }, [focused]);\n\n useEffect(() => {\n if (expanded) {\n setShouldRenderChildContent(true);\n return;\n }\n const timeoutId = window.setTimeout(() => {\n setShouldRenderChildContent(false);\n }, TREE_COLLAPSE_DURATION_MS);\n return () => window.clearTimeout(timeoutId);\n }, [expanded]);\n\n const shouldBuildChildContent = expanded || shouldRenderChildContent;\n const childContent = shouldBuildChildContent ? (\n childState?.loading ? (\n <div\n className=\"flex items-center gap-2 px-2 py-2 text-[11px] text-[var(--text-secondary)]\"\n style={{ paddingLeft: `${(depth + 1) * TREE_INDENT + 12}px` }}\n >\n <Spinner className=\"text-[var(--text-secondary)]\" size={14} />\n <span>{copy.t(\"referencePicker.loading\")}</span>\n </div>\n ) : childEntries.length > 0 ? (\n <div className=\"space-y-0.5\">\n {childEntries.map((child) => (\n <TreeNodeRow\n key={nodeRefKey(child.ref)}\n copy={copy}\n depth={depth + 1}\n iconUrls={iconUrls}\n node={child}\n onContextMenu={onContextMenu}\n view={view}\n />\n ))}\n </div>\n ) : childState?.loaded ? (\n <div\n className=\"px-2 py-2 text-[11px] text-[var(--text-secondary)]\"\n style={{ paddingLeft: `${(depth + 1) * TREE_INDENT + 12}px` }}\n >\n {copy.t(\"referencePicker.emptyDirectory\")}\n </div>\n ) : null\n ) : null;\n\n return (\n <div>\n {/* 整行可点:点击监听挂在父级行 div 上,使可点热区与 hover 高亮区一致;\n 内层箭头/选中按钮 stopPropagation 各管各的,避免冒泡到行点击。 */}\n <div\n ref={focused ? focusedRowRef : undefined}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-[6px] py-1.5 pr-1 transition-colors\",\n active ? \"bg-transparency-block\" : \"hover:bg-transparency-block\"\n )}\n style={{ paddingLeft: `${depth * TREE_INDENT + 8}px` }}\n onClick={() => {\n view.setFocusedNode(node);\n view.toggleSingleSelectionAndExpand(node);\n }}\n onContextMenu={(event) => onContextMenu(event, node)}\n onDoubleClick={(event) => {\n if (node.kind !== \"file\") {\n return;\n }\n event.stopPropagation();\n view.setFocusedNode(node);\n void view.openNode(node);\n }}\n >\n {isFolder ? (\n <button\n aria-label={node.displayName}\n className=\"grid size-5 shrink-0 place-items-center rounded-sm text-[var(--text-secondary)] hover:bg-[var(--transparency-hover)]\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n view.setFocusedNode(node);\n view.toggleNode(node);\n }}\n >\n <ArrowRightIcon\n className={cn(\n \"size-3.5 transition-transform\",\n expanded && \"rotate-90\"\n )}\n />\n </button>\n ) : null}\n <ReferenceNodeIcon\n frameClassName=\"size-7\"\n iconClassName=\"size-6\"\n iconUrls={iconUrls}\n node={node}\n />\n <FullTextTooltip content={node.displayName}>\n <span\n className=\"min-w-0 flex-1 truncate text-[13px] text-[var(--text-primary)]\"\n data-autofit-label\n >\n {node.displayName}\n </span>\n </FullTextTooltip>\n {selectable ? (\n <Button\n aria-label={node.displayName}\n aria-pressed={selected}\n className=\"shrink-0\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n view.setFocusedNode(node);\n view.toggleSelection(node);\n }}\n onDoubleClick={(event) => event.stopPropagation()}\n >\n {selected ? (\n <CheckIcon size={14} />\n ) : (\n <AddLinedIcon\n className=\"text-[var(--text-secondary)]\"\n size={16}\n />\n )}\n </Button>\n ) : null}\n </div>\n {isFolder ? (\n <div\n className={cn(\n \"grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none\",\n expanded ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\",\n childContent && \"mt-[2px]\"\n )}\n >\n <div\n aria-hidden={expanded ? undefined : \"true\"}\n className={cn(\n \"min-h-0 overflow-hidden transition-[opacity,transform] duration-200 ease-out motion-reduce:transition-none\",\n expanded\n ? \"translate-y-0 opacity-100\"\n : \"-translate-y-1 opacity-0\"\n )}\n inert={expanded ? undefined : true}\n >\n {childContent}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n return `${value.toFixed(1)} ${units[unitIndex]}`;\n}\n\nfunction ReferenceNodeIcon({\n frameClassName,\n iconClassName,\n iconUrls,\n node\n}: {\n frameClassName?: string;\n iconClassName: string;\n iconUrls: ReferenceNodeIconUrlState;\n node: ReferenceNode;\n}): JSX.Element {\n const entry = useMemo(() => referenceNodeToWorkspaceFileEntry(node), [node]);\n\n if (node.kind === \"folder\") {\n return (\n <span\n className={cn(\n \"grid flex-none place-items-center text-[var(--rich-text-folder)]\",\n frameClassName\n )}\n >\n <FolderFilledIcon className={iconClassName} />\n </span>\n );\n }\n\n return (\n <WorkspaceFileEntryIcon\n entry={entry}\n frameClassName={frameClassName}\n iconClassName={iconClassName}\n iconUrlByCacheKey={iconUrls.iconUrlByCacheKey}\n onViewportEnter={iconUrls.reportEntryIconViewportEnter}\n onViewportLeave={iconUrls.reportEntryIconViewportLeave}\n />\n );\n}\n\nfunction collectReferenceNodeIconEntries(input: {\n childrenByKey: PickerView[\"childrenByKey\"];\n currentEntries: readonly ReferenceNode[];\n expandedKeys: PickerView[\"expandedKeys\"];\n focusedNode: ReferenceNode | null;\n searchResults: readonly ReferenceNode[];\n selection: readonly ReferenceNode[];\n sidebarGroupsBySource: PickerView[\"sidebarGroupsBySource\"];\n}): WorkspaceFileEntry[] {\n const byKey = new Map<string, ReferenceNode>();\n const retain = (node: ReferenceNode): void => {\n byKey.set(nodeRefKey(node.ref), node);\n };\n const retainTree = (node: ReferenceNode): void => {\n retain(node);\n const key = nodeRefKey(node.ref);\n if (!input.expandedKeys[key]) {\n return;\n }\n for (const child of input.childrenByKey[key]?.entries ?? []) {\n retainTree(child);\n }\n };\n\n input.currentEntries.forEach(retainTree);\n input.searchResults.forEach(retain);\n input.selection.forEach(retain);\n if (input.focusedNode) {\n retain(input.focusedNode);\n }\n for (const groups of Object.values(input.sidebarGroupsBySource)) {\n groups.forEach(retain);\n }\n\n return [...byKey.values()].map(referenceNodeToWorkspaceFileEntry);\n}\n\nfunction referenceNodeToWorkspaceFileEntry(\n node: ReferenceNode\n): WorkspaceFileEntry {\n return {\n hasChildren: node.kind === \"folder\",\n kind: node.kind === \"folder\" ? \"directory\" : \"file\",\n mtimeMs: node.mtimeMs ?? null,\n name: node.displayName,\n path: resolveReferenceNodeIconPath(node),\n sizeBytes: node.sizeBytes ?? null\n };\n}\n\nfunction resolveReferenceNodeIconPath(node: ReferenceNode): string {\n if (node.kind === \"file\" && node.ref.nodeId.startsWith(\"f:\")) {\n try {\n return base64UrlDecode(node.ref.nodeId.slice(2));\n } catch {\n return node.ref.nodeId;\n }\n }\n return node.ref.nodeId;\n}\n\nfunction noopVoid(): void {}\n\nasync function noopAsync(): Promise<void> {}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport type {\n ReferenceHandle,\n ReferenceLocateTarget,\n ReferenceNode,\n ReferenceScope,\n SelectedReference,\n WorkspaceFileReference\n} from \"../../../contracts/index.ts\";\nimport {\n REFERENCE_FILTER_CATEGORIES,\n WORKSPACE_ROOT_GROUP_NODE_ID,\n nodeRefKey,\n selectedReferenceToWorkspaceFileReference\n} from \"../../../core/index.ts\";\nimport type { ReferenceSourceAggregator } from \"../../../core/referenceSourceAggregator.ts\";\nimport {\n resolveWorkspaceFileOpenWithCacheKey,\n sortWorkspaceFileEntriesForArrangeMode,\n WorkspaceFileOpenWithApplicationsCache,\n type WorkspaceFileEntry,\n type WorkspaceFileManagerArrangeMode\n} from \"@tutti-os/workspace-file-manager/services\";\nimport {\n createWorkspaceFilePreviewLoadedState,\n type WorkspaceFilePreviewReadonlyReason\n} from \"@tutti-os/workspace-file-preview\";\nimport {\n ROOT_CHILDREN_KEY,\n createReferenceSourcePickerController\n} from \"./referenceSourcePickerController.ts\";\n\nexport type { WorkspaceFileManagerArrangeMode };\n\nexport { WORKSPACE_ROOT_GROUP_NODE_ID } from \"../../../core/index.ts\";\n\nfunction referenceNodeToOpenWithCacheEntry(\n node: ReferenceNode\n): Pick<WorkspaceFileEntry, \"kind\" | \"name\" | \"path\"> {\n return {\n kind: node.kind === \"folder\" ? \"directory\" : \"file\",\n name: node.displayName,\n path: node.displayName\n };\n}\n\n/**\n * 焦点节点的预览态(node-keyed)。复用 file-manager / file-preview 的分类逻辑\n * (createWorkspaceFilePreviewLoadedState),但只携带状态、不含已本地化文案 ——\n * 文案由 UI 层(ReferenceSourcePicker)按 status/reason 映射,保持 hook 与 i18n 解耦。\n */\nexport type ReferenceNodePreviewState =\n | { status: \"empty\" }\n | { node: ReferenceNode; status: \"directory\" }\n | { node: ReferenceNode; status: \"loading\" }\n | {\n content: string;\n node: ReferenceNode;\n previewSizeBytes?: number;\n status: \"text\";\n }\n | {\n content: string;\n node: ReferenceNode;\n previewSizeBytes?: number;\n status: \"html\";\n }\n | {\n node: ReferenceNode;\n objectUrl: string;\n previewSizeBytes?: number;\n status: \"image\";\n }\n | {\n node: ReferenceNode;\n objectUrl: string;\n previewSizeBytes?: number;\n status: \"video\";\n }\n | {\n maxSizeBytes?: number;\n node: ReferenceNode;\n previewSizeBytes?: number;\n reason: WorkspaceFilePreviewReadonlyReason;\n status: \"readonly\";\n }\n | { node: ReferenceNode; status: \"unsupported\" }\n | { node: ReferenceNode; status: \"error\" };\n\n/** 一个 navigable 源文件夹的折叠选区(文件已映射为 WorkspaceFileReference)。 */\nexport interface ReferenceBundleSelection {\n sourceId: string;\n nodeId: string;\n displayName: string;\n iconUrl?: string | null;\n /**\n * 可被 agent 解析的领域句柄(见 ReferenceHandle)。发给 agent 的\n * `mention://workspace-reference/...` 由它构造;源未解码出句柄时为 null。\n */\n handle: ReferenceHandle | null;\n /** 该 bundle 下文件数(展示用,取节点 childCount;不再展开文件)。 */\n fileCount: number;\n}\n\nexport interface ReferenceGroupedSelection {\n files: WorkspaceFileReference[];\n bundles: ReferenceBundleSelection[];\n}\n\nexport interface UseReferenceSourcePickerViewInput {\n aggregator: ReferenceSourceAggregator;\n workspaceId: string;\n open: boolean;\n /**\n * 本地源「工作区根」二级节点展示名(仅源未自带分组时的回退用)。\n * 由 UI 层注入已本地化文案,保持 hook 与 i18n 解耦。\n */\n workspaceRootGroupLabel: string;\n /** 可选:打开时直达某事项/应用分组(展开并聚焦)。 */\n initialTarget?: ReferenceLocateTarget | null;\n onClose: () => void;\n onConfirm: (refs: WorkspaceFileReference[]) => void;\n isNodeSelectable?: (node: ReferenceNode) => boolean;\n /**\n * 可选:启用「文件夹=一个 bundle」确认形态。提供时,confirm 改用 confirmGrouped,\n * navigable 源的选中文件夹折叠成一个 bundle,其余仍作为单条文件。\n */\n onConfirmBundles?: (result: ReferenceGroupedSelection) => void;\n}\n\n/**\n * 多源 picker 的视图 hook。\n * controller 负责数据/缓存/分页/选中;hook 负责 UI 导航态(当前面包屑、焦点节点)。\n */\nexport function useReferenceSourcePickerView({\n aggregator,\n workspaceId,\n open,\n workspaceRootGroupLabel,\n initialTarget = null,\n onClose,\n onConfirm,\n isNodeSelectable,\n onConfirmBundles\n}: UseReferenceSourcePickerViewInput) {\n const readSnapshot = useSnapshot as <T extends object>(store: T) => T;\n const scope = useMemo<ReferenceScope>(() => ({ workspaceId }), [workspaceId]);\n\n const controller = useMemo(\n () => createReferenceSourcePickerController({ aggregator, scope }),\n [aggregator, scope]\n );\n const snapshot = readSnapshot(controller.store);\n\n // UI 导航态:每个源各一条面包屑栈([] = 源根)。\n const [breadcrumbBySource, setBreadcrumbBySource] = useState<\n Record<string, ReferenceNode[]>\n >({});\n const [focusedNode, setFocusedNode] = useState<ReferenceNode | null>(null);\n const [arrangeMode, setArrangeMode] =\n useState<WorkspaceFileManagerArrangeMode>(\"none\");\n const openWithApplicationsCache = useRef(\n new WorkspaceFileOpenWithApplicationsCache()\n );\n\n // 复用 file-manager 的排序能力:把 ReferenceNode 映射成 WorkspaceFileEntry 排序后映射回。\n const sortNodes = useCallback(\n (nodes: readonly ReferenceNode[]): ReferenceNode[] => {\n if (arrangeMode === \"none\") {\n return [...nodes];\n }\n const byKey = new Map<string, ReferenceNode>();\n const fileEntries: WorkspaceFileEntry[] = nodes.map((node) => {\n const key = nodeRefKey(node.ref);\n byKey.set(key, node);\n return {\n hasChildren: node.kind === \"folder\",\n kind: node.kind === \"folder\" ? \"directory\" : \"file\",\n mtimeMs: node.mtimeMs ?? null,\n name: node.displayName,\n path: key,\n sizeBytes: node.sizeBytes ?? null\n };\n });\n return sortWorkspaceFileEntriesForArrangeMode(fileEntries, arrangeMode)\n .map((entry) => byKey.get(entry.path))\n .filter((node): node is ReferenceNode => node !== undefined);\n },\n [arrangeMode]\n );\n // 每次打开对话框内,已自动进入过首个分组的源(避免覆盖用户手动导航/回到根)。\n const autoEnteredSourcesRef = useRef<Set<string>>(new Set());\n // 「打开即定位」一次性应用标记:每个 initialTarget 仅应用一次,应用后不再干预用户导航。\n const appliedInitialTargetRef = useRef<ReferenceLocateTarget | null>(null);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n controller.reset();\n controller.open();\n setBreadcrumbBySource({});\n setFocusedNode(null);\n autoEnteredSourcesRef.current = new Set();\n appliedInitialTargetRef.current = null;\n return () => {\n controller.close();\n };\n }, [controller, open]);\n\n // 「打开即定位」:一次性把 initialTarget 解析为真实节点路径并应用导航,之后不再干预。\n // - path[0] = 左栏二级分组(topic / app):作为面包屑根项进入 → 左栏选中 + 中间栏展示其内容;\n // - path[last] 更深(如事项):在该分组内容里 setFocusedNode 高亮。\n // 解析(含等待 tabs 就绪、逐层取真实节点)全在 controller.locatePath 内完成;这里只应用结果一次。\n useEffect(() => {\n const target = initialTarget;\n if (!open || !target || appliedInitialTargetRef.current === target) {\n return;\n }\n appliedInitialTargetRef.current = target;\n // 让默认「自动进入首个分组」对该源让位,改由本次定位接管。\n autoEnteredSourcesRef.current.add(target.sourceId);\n let canceled = false;\n void controller\n .locatePath(target)\n .then((path) => {\n if (canceled) {\n return;\n }\n const group = path[0];\n if (!group) {\n // 未解析到分组:撤销让位,退回默认(进入首个分组)。\n autoEnteredSourcesRef.current.delete(target.sourceId);\n return;\n }\n controller.setActiveSource(target.sourceId);\n setBreadcrumbBySource((current) => ({\n ...current,\n [group.ref.sourceId]: [group]\n }));\n controller.ensureChildren(group);\n for (const node of path.slice(1)) {\n controller.expandNode(node);\n }\n const deepest = path[path.length - 1];\n setFocusedNode(path.length > 1 && deepest ? deepest : null);\n })\n .catch(() => {\n autoEnteredSourcesRef.current.delete(target.sourceId);\n });\n return () => {\n canceled = true;\n };\n }, [open, initialTarget, controller]);\n\n const activeSourceId = snapshot.activeSourceId;\n const activeTab = useMemo(\n () => snapshot.tabs.find((tab) => tab.sourceId === activeSourceId) ?? null,\n [activeSourceId, snapshot.tabs]\n );\n const capabilities = activeTab?.capabilities ?? null;\n\n const breadcrumb = activeSourceId\n ? (breadcrumbBySource[activeSourceId] ?? [])\n : [];\n const currentNode = breadcrumb.at(-1) ?? null;\n const currentKey = currentNode\n ? nodeRefKey(currentNode.ref)\n : ROOT_CHILDREN_KEY;\n\n const activeTabState = activeSourceId\n ? snapshot.bySource[activeSourceId]\n : undefined;\n // 已选文件类型筛选分类(与 searchQuery 一起构成「查询」)。\n const activeFilters = activeTabState?.searchFilters ?? [];\n // 查询态 = 关键词或筛选任一非空(controller 已据此置 mode)。命中即平铺结果。\n const isQuery =\n activeTabState?.mode === \"search\" &&\n (activeTabState.searchQuery.trim() !== \"\" || activeFilters.length > 0);\n\n const currentChildren = activeTabState?.childrenByKey[currentKey];\n\n // 浏览态内容区:当前选中二级节点(currentNode,本地根时为 null → 源根)的子节点,\n // 递归就地展开成文件树。搜索态:扁平搜索结果。\n const currentEntries = useMemo(\n () => sortNodes(currentChildren?.entries ?? []),\n [currentChildren?.entries, sortNodes]\n );\n const searchResults = useMemo(\n () => sortNodes(activeTabState?.searchEntries ?? []),\n [activeTabState?.searchEntries, sortNodes]\n );\n\n // 每个源的左栏二级分组(左栏可多源同时展开,故按源全量计算):\n // - 源自带分组(listSidebarGroups,如本地源的 最近访问/下载/文稿/桌面/个人)优先;\n // - 否则取该源根下的 folder;非 navigable 源额外合成「工作区根」入口保住根级散文件可达。\n // 依赖 snapshot.tabs(getLoadedSource 在 tabs 加载后才有值)与 snapshot.bySource(根加载)。\n const sidebarGroupsBySource = useMemo<Record<string, ReferenceNode[]>>(() => {\n const result: Record<string, ReferenceNode[]> = {};\n for (const tab of snapshot.tabs) {\n const sourceId = tab.sourceId;\n const provided = aggregator\n .getLoadedSource(sourceId)\n ?.listSidebarGroups?.(scope);\n if (provided && provided.length > 0) {\n result[sourceId] = provided;\n continue;\n }\n const root =\n snapshot.bySource[sourceId]?.childrenByKey[ROOT_CHILDREN_KEY];\n const folders = (root?.entries ?? []).filter(\n (node) => node.kind === \"folder\"\n );\n if (tab.capabilities.navigable) {\n result[sourceId] = folders;\n } else {\n const workspaceRoot: ReferenceNode = {\n ref: { sourceId, nodeId: WORKSPACE_ROOT_GROUP_NODE_ID },\n kind: \"folder\",\n displayName: workspaceRootGroupLabel\n };\n result[sourceId] = [workspaceRoot, ...folders];\n }\n }\n return result;\n }, [\n snapshot.tabs,\n snapshot.bySource,\n aggregator,\n scope,\n workspaceRootGroupLabel\n ]);\n\n // 左栏二级分组「是否还能继续拉取」(分页用)。\n // - 自带分组的源(本地源:最近访问/下载/… 固定「位置」)不分页,恒 false;\n // - 其余 navigable 源分组取自源根 children,源根带 nextCursor 即可继续拉取。\n const sidebarHasMoreBySource = useMemo<Record<string, boolean>>(() => {\n const result: Record<string, boolean> = {};\n for (const tab of snapshot.tabs) {\n const sourceId = tab.sourceId;\n const provided = aggregator\n .getLoadedSource(sourceId)\n ?.listSidebarGroups?.(scope);\n if (provided && provided.length > 0) {\n result[sourceId] = false;\n continue;\n }\n const root =\n snapshot.bySource[sourceId]?.childrenByKey[ROOT_CHILDREN_KEY];\n result[sourceId] = Boolean(root?.nextCursor);\n }\n return result;\n }, [snapshot.tabs, snapshot.bySource, aggregator, scope]);\n\n // 左栏二级分组「正在拉取下一页」(源根已加载过且当前在 loading = append 在途)。\n const sidebarLoadingMoreBySource = useMemo<Record<string, boolean>>(() => {\n const result: Record<string, boolean> = {};\n for (const tab of snapshot.tabs) {\n const root =\n snapshot.bySource[tab.sourceId]?.childrenByKey[ROOT_CHILDREN_KEY];\n result[tab.sourceId] = Boolean(root?.loaded && root.loading);\n }\n return result;\n }, [snapshot.tabs, snapshot.bySource]);\n\n // active 源的二级分组(供自动进入首组、选中高亮等复用)。\n const sidebarGroups = activeSourceId\n ? (sidebarGroupsBySource[activeSourceId] ?? [])\n : [];\n\n // 左栏二级分组高亮 = 当前所在的「根 most 分组」(面包屑首项),而非最深叶子节点。\n // 这样下钻进事项(topic → 事项 → 产物)时,左栏仍高亮其所属 topic;进 app 子目录时仍高亮该 app。\n // 本地根(无面包屑、非 navigable)回退到合成「工作区根」节点。\n const rootGroupNode = breadcrumb[0] ?? null;\n // 搜索限定范围 = 左栏选中的二级分组(面包屑根项)的源内 nodeId;无选中分组(本地根)→ null,\n // 退回跨整源搜索。供「只搜选中应用」而非所有应用。\n const searchScopeNodeId = rootGroupNode ? rootGroupNode.ref.nodeId : null;\n const selectedGroupKey = rootGroupNode\n ? nodeRefKey(rootGroupNode.ref)\n : activeSourceId && !capabilities?.navigable\n ? nodeRefKey({\n sourceId: activeSourceId,\n nodeId: WORKSPACE_ROOT_GROUP_NODE_ID\n })\n : null;\n\n // 搜索进行中切换左栏分组(选中应用变化)时,把搜索限定范围同步给 controller 并重搜。\n // controller 内部仅在范围实际变化且处于搜索态时才重搜,浏览态/范围未变为 no-op。\n useEffect(() => {\n controller.setSearchScope(searchScopeNodeId);\n }, [controller, searchScopeNodeId]);\n\n const setActiveSource = useCallback(\n (sourceId: string) => {\n controller.setActiveSource(sourceId);\n setFocusedNode(null);\n },\n [controller]\n );\n\n const shouldRefreshChildrenOnEnter = useCallback(\n (sourceId: string) =>\n snapshot.tabs.find((tab) => tab.sourceId === sourceId)?.capabilities\n .navigable ?? false,\n [snapshot.tabs]\n );\n\n const enterFolder = useCallback(\n (node: ReferenceNode) => {\n const sourceId = node.ref.sourceId;\n if (\n node.kind !== \"folder\" ||\n !sourceId ||\n node.ref.nodeId === WORKSPACE_ROOT_GROUP_NODE_ID\n ) {\n return;\n }\n if (shouldRefreshChildrenOnEnter(sourceId)) {\n controller.refreshChildren(node);\n } else {\n controller.ensureChildren(node);\n }\n setBreadcrumbBySource((current) => {\n const stack = current[sourceId] ?? [];\n const index = stack.findIndex(\n (item) => nodeRefKey(item.ref) === nodeRefKey(node.ref)\n );\n const nextStack =\n index >= 0 ? stack.slice(0, index + 1) : [...stack, node];\n return { ...current, [sourceId]: nextStack };\n });\n setFocusedNode(null);\n },\n [controller, shouldRefreshChildrenOnEnter]\n );\n\n // 进入某源时默认选中它的第一个二级分组,而非停在根列表:\n // - 可逐层进入的源(如「应用」/「议题」):进入第一个分组(首个 app / topic);\n // - 本地等非 navigable 源:进入第一个固定「位置」分组(本地源即「最近访问」),\n // 使从 agent GUI「+」按钮打开时默认落在「本地 - 最近访问」。\n // 每个源每次打开只自动选一次,用户回到根/手动导航后不再覆盖。\n // 非 navigable 源若无自带分组,sidebarGroups[0] 为合成「工作区根」,\n // enterFolder 对其 no-op,仍停在源根 —— 与原行为一致,无回归。\n useEffect(() => {\n if (!open || !activeSourceId) {\n return;\n }\n if (autoEnteredSourcesRef.current.has(activeSourceId)) {\n return;\n }\n const stack = breadcrumbBySource[activeSourceId] ?? [];\n if (stack.length > 0) {\n // 该源已有导航(例如此前已自动/手动进入过),视为已初始化。\n autoEnteredSourcesRef.current.add(activeSourceId);\n return;\n }\n const firstGroup = sidebarGroups[0];\n if (!firstGroup) {\n // 根分组尚未加载完,等加载后再触发。\n return;\n }\n autoEnteredSourcesRef.current.add(activeSourceId);\n enterFolder(firstGroup);\n }, [open, activeSourceId, sidebarGroups, breadcrumbBySource, enterFolder]);\n\n // 左栏一级源默认全部展开(Finder 风格,无折叠):tabs 就绪后预载每个源的根,\n // 使非自带分组的源(应用/任务,二级分组取根下 folder)其分组也立即就绪。\n useEffect(() => {\n if (!open) {\n return;\n }\n for (const tab of snapshot.tabs) {\n controller.ensureSourceRoot(tab.sourceId);\n }\n }, [open, snapshot.tabs, controller]);\n\n const navigateToBreadcrumb = useCallback(\n (index: number) => {\n if (!activeSourceId) {\n return;\n }\n setBreadcrumbBySource((current) => {\n const stack = current[activeSourceId] ?? [];\n return { ...current, [activeSourceId]: stack.slice(0, index + 1) };\n });\n const target = (breadcrumbBySource[activeSourceId] ?? [])[index] ?? null;\n if (target && shouldRefreshChildrenOnEnter(target.ref.sourceId)) {\n controller.refreshChildren(target);\n } else {\n controller.ensureChildren(target);\n }\n setFocusedNode(null);\n },\n [\n activeSourceId,\n breadcrumbBySource,\n controller,\n shouldRefreshChildrenOnEnter\n ]\n );\n\n const navigateToRoot = useCallback(\n (sourceId?: string) => {\n const sid = sourceId ?? activeSourceId;\n if (!sid) {\n return;\n }\n setBreadcrumbBySource((current) => ({ ...current, [sid]: [] }));\n controller.ensureSourceRoot(sid);\n setFocusedNode(null);\n },\n [activeSourceId, controller]\n );\n\n // 选中左栏二级分组:先切到该分组所属源(右侧内容随之切换),\n // 再:合成「工作区根」→ 回源根;其余 → 把面包屑重置为该分组。\n // 二级分组之间是同级关系(并非彼此嵌套),因此选中一个新分组时必须把面包屑\n // 重置为 [node],而非走 enterFolder 的「下钻入栈」逻辑 —— 否则点击同级分组会被\n // 当作子节点追加成 [A, B],而高亮取 breadcrumb[0] 仍停在 A,导致新分组「选不中」。\n const selectGroup = useCallback(\n (node: ReferenceNode) => {\n const sourceId = node.ref.sourceId;\n if (!sourceId) {\n return;\n }\n const nextScopeNodeId =\n node.ref.nodeId === WORKSPACE_ROOT_GROUP_NODE_ID\n ? null\n : node.ref.nodeId;\n if (sourceId !== snapshot.activeSourceId) {\n controller.setActiveSource(sourceId, nextScopeNodeId);\n }\n if (node.ref.nodeId === WORKSPACE_ROOT_GROUP_NODE_ID) {\n controller.setSearchScope(null);\n navigateToRoot(sourceId);\n return;\n }\n if (shouldRefreshChildrenOnEnter(sourceId)) {\n controller.refreshChildren(node);\n } else {\n controller.ensureChildren(node);\n }\n controller.setSearchScope(nextScopeNodeId);\n setBreadcrumbBySource((current) => ({ ...current, [sourceId]: [node] }));\n setFocusedNode(null);\n },\n [\n controller,\n snapshot.activeSourceId,\n navigateToRoot,\n shouldRefreshChildrenOnEnter\n ]\n );\n\n const isSelected = useCallback(\n (node: ReferenceNode) =>\n (isNodeSelectable?.(node) ?? true) &&\n snapshot.selection.some(\n (item) => nodeRefKey(item.ref) === nodeRefKey(node.ref)\n ),\n [isNodeSelectable, snapshot.selection]\n );\n\n const isSelectable = useCallback(\n (node: ReferenceNode) => isNodeSelectable?.(node) ?? true,\n [isNodeSelectable]\n );\n const selectableSelection = useMemo(\n () => snapshot.selection.filter(isSelectable),\n [isSelectable, snapshot.selection]\n );\n\n // app/issue 源的文件夹引用需异步递归枚举展开,故 confirm 异步;期间置 isConfirming 防重复提交。\n const [isConfirming, setIsConfirming] = useState(false);\n const [isOpeningReference, setIsOpeningReference] = useState(false);\n const runReferenceAction = useCallback(\n async (action: () => Promise<void>): Promise<void> => {\n if (isOpeningReference) {\n return;\n }\n setIsOpeningReference(true);\n try {\n await action();\n } finally {\n setIsOpeningReference(false);\n }\n },\n [isOpeningReference]\n );\n const confirm = useCallback(async () => {\n if (isConfirming) {\n return;\n }\n if (selectableSelection.length === 0) {\n controller.clearSelection();\n return;\n }\n setIsConfirming(true);\n try {\n if (onConfirmBundles) {\n const grouped = await controller.confirmGrouped(selectableSelection);\n onConfirmBundles({\n files: grouped.files.map(selectedReferenceToWorkspaceFileReference),\n bundles: grouped.bundles.map((bundle) => ({\n sourceId: bundle.root.ref.sourceId,\n nodeId: bundle.root.ref.nodeId,\n displayName: bundle.root.displayName,\n iconUrl: bundle.root.iconUrl ?? null,\n handle: bundle.handle,\n // 展示用文件数:取节点 childCount(不再展开文件);缺省回退 0。\n fileCount: bundle.root.childCount ?? 0\n }))\n });\n } else {\n const selected: SelectedReference[] =\n await controller.confirm(selectableSelection);\n onConfirm(selected.map(selectedReferenceToWorkspaceFileReference));\n }\n onClose();\n } finally {\n setIsConfirming(false);\n }\n }, [\n controller,\n isConfirming,\n onClose,\n onConfirm,\n onConfirmBundles,\n selectableSelection\n ]);\n\n // 焦点节点预览:文件夹→directory;文件→走源 readPreview,字节经 file-preview 分类\n // 成 image/text/readonly。image 用 object URL,切换/卸载时回收避免泄漏。\n const [previewState, setPreviewState] = useState<ReferenceNodePreviewState>({\n status: \"empty\"\n });\n const previewObjectUrlRef = useRef<string | null>(null);\n const revokePreviewObjectUrl = useCallback(() => {\n if (previewObjectUrlRef.current) {\n URL.revokeObjectURL(previewObjectUrlRef.current);\n previewObjectUrlRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n const node = focusedNode;\n if (!node) {\n revokePreviewObjectUrl();\n setPreviewState({ status: \"empty\" });\n return;\n }\n if (node.kind === \"folder\") {\n revokePreviewObjectUrl();\n setPreviewState({ node, status: \"directory\" });\n return;\n }\n const previewable =\n aggregator.getLoadedSource(node.ref.sourceId)?.capabilities.previewable ??\n false;\n if (!previewable) {\n revokePreviewObjectUrl();\n setPreviewState({ node, status: \"unsupported\" });\n return;\n }\n\n let cancelled = false;\n revokePreviewObjectUrl();\n setPreviewState({ node, status: \"loading\" });\n void (async () => {\n try {\n const preview = await aggregator.readPreview(scope, node);\n if (cancelled) {\n return;\n }\n if (!preview) {\n setPreviewState({ node, status: \"unsupported\" });\n return;\n }\n const previewSizeBytes = preview.bytes.byteLength;\n const loadedSizeBytes =\n node.sizeBytes != null && node.sizeBytes > 0\n ? node.sizeBytes\n : previewSizeBytes;\n const loaded = createWorkspaceFilePreviewLoadedState({\n bytes: preview.bytes,\n contentType: preview.contentType,\n entry: {\n kind: node.kind,\n name: node.displayName,\n path: node.ref.nodeId,\n mtimeMs: node.mtimeMs ?? null,\n sizeBytes: loadedSizeBytes\n },\n renderHtml: true,\n target: {\n fileKind: preview.kind,\n name: node.displayName,\n path: node.ref.nodeId,\n mtimeMs: node.mtimeMs ?? null,\n sizeBytes: loadedSizeBytes\n }\n });\n if (cancelled) {\n return;\n }\n if (loaded.status === \"image\") {\n const objectUrl = URL.createObjectURL(\n new Blob([loaded.bytes], { type: loaded.contentType })\n );\n previewObjectUrlRef.current = objectUrl;\n setPreviewState({\n node,\n objectUrl,\n previewSizeBytes,\n status: \"image\"\n });\n return;\n }\n if (loaded.status === \"video\") {\n const objectUrl = URL.createObjectURL(\n new Blob([loaded.bytes], { type: loaded.contentType })\n );\n previewObjectUrlRef.current = objectUrl;\n setPreviewState({\n node,\n objectUrl,\n previewSizeBytes,\n status: \"video\"\n });\n return;\n }\n if (loaded.status === \"text\") {\n setPreviewState({\n content: loaded.content,\n node,\n previewSizeBytes,\n status: \"text\"\n });\n return;\n }\n if (loaded.status === \"html\") {\n setPreviewState({\n content: loaded.content,\n node,\n previewSizeBytes,\n status: \"html\"\n });\n return;\n }\n setPreviewState({\n node,\n previewSizeBytes,\n reason: loaded.reason,\n ...(loaded.maxSizeBytes == null\n ? {}\n : { maxSizeBytes: loaded.maxSizeBytes }),\n status: \"readonly\"\n });\n } catch {\n if (!cancelled) {\n setPreviewState({ node, status: \"error\" });\n }\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [aggregator, focusedNode, revokePreviewObjectUrl, scope]);\n\n // 卸载时回收最后一个 image object URL。\n useEffect(() => revokePreviewObjectUrl, [revokePreviewObjectUrl]);\n\n return {\n tabs: snapshot.tabs,\n activeSourceId,\n previewState,\n activeTabLabel: activeTab?.label ?? \"\",\n capabilities,\n // 内容区递归就地树:当前选中二级节点的子条目(本地根时为源根子条目)。\n currentEntries,\n // 搜索态:扁平搜索结果。\n searchResults,\n expandedKeys: activeTabState?.expandedKeys ?? {},\n childrenByKey: activeTabState?.childrenByKey ?? {},\n toggleNode: (node: ReferenceNode) => controller.toggleNode(node),\n sortNodes,\n isLoadingTabs: snapshot.isLoadingTabs,\n breadcrumb,\n currentNode,\n sidebarGroups,\n sidebarGroupsBySource,\n sidebarHasMoreBySource,\n sidebarLoadingMoreBySource,\n loadMoreSidebarGroups: (sourceId: string) =>\n controller.loadMoreSourceRoot(sourceId),\n selectedGroupKey,\n arrangeMode,\n setArrangeMode,\n // 查询态(关键词或筛选任一非空)→ 平铺结果;否则浏览树。\n isQuery,\n searchQuery: activeTabState?.searchQuery ?? \"\",\n // 当前源支持的文件类型筛选分类(不支持则空数组,picker 据此决定是否展示筛选下拉)。\n filterCategories: capabilities?.filterable\n ? REFERENCE_FILTER_CATEGORIES\n : [],\n activeFilters,\n // 搜索态:仅在「还没有任何结果」时显示 spinner;细化关键词(已有结果)时\n // 保留旧结果直到新结果就绪,避免内容区在 spinner/结果间反复切换造成闪烁。\n isLoading: isQuery\n ? (activeTabState?.isSearchLoading ?? false) &&\n (activeTabState?.searchEntries.length ?? 0) === 0\n : (currentChildren?.loading ?? false),\n // 查询态:增长式分页是否还有更多;浏览态:cursor 是否有下一页。\n hasMore: isQuery\n ? (activeTabState?.searchHasMore ?? false)\n : Boolean(currentChildren?.nextCursor),\n // 底部「加载更多」在途(查询态 = 增长重查;浏览态 = cursor append)。\n isLoadingMore: isQuery\n ? (activeTabState?.isSearchLoadingMore ?? false)\n : (currentChildren?.loading ?? false),\n focusedNode,\n selection: selectableSelection,\n selectionCount: selectableSelection.length,\n setActiveSource,\n enterFolder,\n selectGroup,\n navigateToBreadcrumb,\n navigateToRoot,\n setFocusedNode,\n setSearchQuery: (query: string) =>\n controller.setSearchQuery(query, searchScopeNodeId),\n setFilters: (filters: string[]) =>\n controller.setSearchFilters(filters, searchScopeNodeId),\n toggleSelection: (node: ReferenceNode) => {\n if (isSelectable(node)) {\n controller.toggleSelection(node);\n }\n },\n toggleSingleSelectionAndExpand: (node: ReferenceNode) => {\n if (isSelectable(node)) {\n controller.toggleSingleSelectionAndExpand(node);\n return;\n }\n controller.clearSelection();\n if (node.kind === \"folder\") {\n controller.toggleNode(node);\n }\n },\n loadMore: () =>\n isQuery ? controller.loadMoreSearch() : controller.loadMore(currentNode),\n isSelectable,\n isSelected,\n isOpeningReference,\n getCachedOpenWithApplications: (node: ReferenceNode) =>\n openWithApplicationsCache.current.get(\n resolveWorkspaceFileOpenWithCacheKey(\n referenceNodeToOpenWithCacheEntry(node)\n )\n ),\n listOpenWithApplications: (node: ReferenceNode) =>\n openWithApplicationsCache.current.resolve(\n resolveWorkspaceFileOpenWithCacheKey(\n referenceNodeToOpenWithCacheEntry(node)\n ),\n () => aggregator.listOpenWithApplications(scope, node)\n ),\n openNode: (node: ReferenceNode) =>\n runReferenceAction(() => aggregator.open(scope, node)),\n openWithApplication: (node: ReferenceNode, applicationPath: string) =>\n runReferenceAction(() =>\n aggregator.openWithApplication(scope, node, applicationPath)\n ),\n openWithOtherApplication: (\n node: ReferenceNode,\n applicationPickerPrompt?: string\n ) =>\n runReferenceAction(() =>\n aggregator.openWithOtherApplication(\n scope,\n node,\n applicationPickerPrompt\n )\n ),\n revealNode: (node: ReferenceNode) =>\n runReferenceAction(() => aggregator.reveal(scope, node)),\n confirm,\n isConfirming\n };\n}\n","import type { ReferenceNode } from \"../../../contracts/referenceSource.ts\";\n\nexport interface ReferencePreviewDateTimeFormatOptions {\n locale?: string;\n timeZone?: string;\n}\n\nexport function formatHierarchyTitle(\n hierarchy: readonly ReferenceNode[]\n): string | null {\n if (hierarchy.length === 0) {\n return null;\n }\n return hierarchy.map((crumb) => crumb.displayName).join(\" / \");\n}\n\nexport function formatReferenceNodePathText(\n node: ReferenceNode,\n hierarchy: readonly ReferenceNode[] = []\n): string {\n const decodedPath = decodeReferenceListFileNodeId(node.ref.nodeId);\n if (decodedPath) {\n return decodedPath;\n }\n if (node.kind === \"folder\" && node.ref.nodeId.startsWith(\"g:\")) {\n return (\n formatHierarchyTitle(completeHierarchy(hierarchy, node)) ||\n node.displayName\n );\n }\n return node.contextLabel?.trim() || node.ref.nodeId;\n}\n\nexport function formatReferencePreviewDateTime(\n ms: number,\n options: ReferencePreviewDateTimeFormatOptions = {}\n): string {\n const timeZone =\n options.timeZone ?? Intl.DateTimeFormat().resolvedOptions().timeZone;\n const formatter = new Intl.DateTimeFormat(options.locale, {\n day: \"2-digit\",\n hour: \"2-digit\",\n hourCycle: \"h23\",\n minute: \"2-digit\",\n month: \"2-digit\",\n timeZone,\n year: \"numeric\"\n });\n const parts = Object.fromEntries(\n formatter\n .formatToParts(ms)\n .filter((part) => part.type !== \"literal\")\n .map((part) => [part.type, part.value])\n );\n return `${parts.year}-${parts.month}-${parts.day} ${parts.hour}:${parts.minute}`;\n}\n\nexport function resolveReferencePreviewTimestampMs(\n node: Pick<ReferenceNode, \"createdTimeMs\" | \"mtimeMs\">\n): number | null {\n return (\n normalizedTimestampMs(node.createdTimeMs) ??\n normalizedTimestampMs(node.mtimeMs)\n );\n}\n\nexport function resolveReferencePreviewSizeBytes(\n node: ReferenceNode,\n previewState: {\n node?: ReferenceNode;\n previewSizeBytes?: number | null;\n status?: string;\n }\n): number | null {\n const metadataSize = normalizedSizeBytes(node.sizeBytes);\n if (metadataSize != null && metadataSize > 0) {\n return metadataSize;\n }\n if (\n previewState.node &&\n previewState.node.ref.sourceId === node.ref.sourceId &&\n previewState.node.ref.nodeId === node.ref.nodeId\n ) {\n const previewSize = normalizedSizeBytes(previewState.previewSizeBytes);\n if (previewSize != null && previewSize > 0) {\n return previewSize;\n }\n }\n return metadataSize;\n}\n\nfunction normalizedTimestampMs(ms: number | null | undefined): number | null {\n return typeof ms === \"number\" && Number.isFinite(ms) && ms >= 0 ? ms : null;\n}\n\nfunction completeHierarchy(\n hierarchy: readonly ReferenceNode[],\n node: ReferenceNode\n): ReferenceNode[] {\n const last = hierarchy.at(-1);\n if (\n last &&\n last.ref.sourceId === node.ref.sourceId &&\n last.ref.nodeId === node.ref.nodeId\n ) {\n return [...hierarchy];\n }\n return [...hierarchy, node];\n}\n\nfunction decodeReferenceListFileNodeId(nodeId: string): string | null {\n if (!nodeId.startsWith(\"f:\")) {\n return null;\n }\n try {\n const normalized = nodeId.slice(2).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized.padEnd(\n normalized.length + ((4 - (normalized.length % 4)) % 4),\n \"=\"\n );\n const binary = atob(padded);\n const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));\n return new TextDecoder().decode(bytes);\n } catch {\n return null;\n }\n}\n\nfunction normalizedSizeBytes(\n sizeBytes: number | null | undefined\n): number | null {\n return typeof sizeBytes === \"number\" &&\n Number.isFinite(sizeBytes) &&\n sizeBytes >= 0\n ? sizeBytes\n : null;\n}\n"],"mappings":"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","names":["cn","useEffect","useState","Button","FileIcon","FolderFilledIcon","jsx","jsxs","WorkspaceFileReferencePickerFeedback","FolderFilledIcon","FileIcon","useState","Button","jsx","jsxs","useEffect","cn","useEffect","useId","useMemo","useRef","useState","useComposedInputValue","ArrowRightIcon","Badge","Button","CheckIcon","FolderFilledIcon","Input","ScrollArea","SearchIcon","Spinner","Tooltip","TooltipContent","TooltipTrigger","cn","AddLinedIcon","useEffect","useState","useState","useEffect","jsx","jsxs","useId","useComposedInputValue","useEffect","useRef","useState","useMemo","Button","SearchIcon","Input","ScrollArea","Spinner","cn","FolderFilledIcon","CheckIcon","AddLinedIcon","Tooltip","TooltipTrigger","TooltipContent","Badge","ArrowRightIcon"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutti-os/workspace-file-reference",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.60",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"directory": "packages/workspace/file-reference"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@tutti-os/ui-react-hooks": "0.0.
|
|
40
|
-
"@tutti-os/ui-system": "0.0.
|
|
41
|
-
"@tutti-os/workspace-file-manager": "0.0.
|
|
42
|
-
"@tutti-os/workspace-file-preview": "0.0.
|
|
39
|
+
"@tutti-os/ui-react-hooks": "0.0.60",
|
|
40
|
+
"@tutti-os/ui-system": "0.0.60",
|
|
41
|
+
"@tutti-os/workspace-file-manager": "0.0.60",
|
|
42
|
+
"@tutti-os/workspace-file-preview": "0.0.60",
|
|
43
43
|
"valtio": "^2.3.2"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|