@tutti-os/agent-gui 0.0.14 → 0.0.15
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/agent-conversation/index.d.ts +1 -1
- package/dist/agent-conversation/index.js +4 -4
- package/dist/agent-message-center/index.d.ts +1 -1
- package/dist/agent-message-center/index.js +4 -4
- package/dist/agentFileMentionExtension-CM1c9bqk.d.ts +86 -0
- package/dist/app/renderer/agentactivity.css +33 -9
- package/dist/{chunk-WME2V26J.js → chunk-2CA4NPP3.js} +15 -33
- package/dist/chunk-2CA4NPP3.js.map +1 -0
- package/dist/{chunk-ZO3SZCIX.js → chunk-7CBJJNX6.js} +5 -2
- package/dist/chunk-7CBJJNX6.js.map +1 -0
- package/dist/{chunk-ASAZDEQE.js → chunk-EK5RDKG7.js} +54 -14
- package/dist/chunk-EK5RDKG7.js.map +1 -0
- package/dist/{chunk-GZHQPPK2.js → chunk-H4HT3FE6.js} +113 -36
- package/dist/chunk-H4HT3FE6.js.map +1 -0
- package/dist/{chunk-YXSO4ITT.js → chunk-HIREVEZM.js} +1 -1
- package/dist/chunk-HIREVEZM.js.map +1 -0
- package/dist/{chunk-VDNMTW2E.js → chunk-IXIGWLQY.js} +1 -1
- package/dist/chunk-IXIGWLQY.js.map +1 -0
- package/dist/{chunk-FSTZDNRM.js → chunk-KJPMZ7G5.js} +243 -167
- package/dist/chunk-KJPMZ7G5.js.map +1 -0
- package/dist/{chunk-GEXHKJK5.js → chunk-MUZMBEFO.js} +35 -17
- package/dist/chunk-MUZMBEFO.js.map +1 -0
- package/dist/{chunk-HSXDSFKB.js → chunk-OFGXNXYT.js} +2 -2
- package/dist/{chunk-3YZX5EUC.js → chunk-SVOGXWFJ.js} +53 -17
- package/dist/{chunk-3YZX5EUC.js.map → chunk-SVOGXWFJ.js.map} +1 -1
- package/dist/{chunk-MU2LODEV.js → chunk-U4F3COKL.js} +160 -10
- package/dist/chunk-U4F3COKL.js.map +1 -0
- package/dist/{chunk-KEKPOVQD.js → chunk-XHQGCP7A.js} +2 -2
- package/dist/{chunk-RLPVFX7V.js → chunk-YKDFQADM.js} +36 -7
- package/dist/chunk-YKDFQADM.js.map +1 -0
- package/dist/context-mention-palette/index.d.ts +8 -68
- package/dist/context-mention-palette/index.js +6 -6
- package/dist/context-mention-provider.d.ts +6 -1
- package/dist/context-mention-provider.js +1 -1
- package/dist/i18n/index.d.ts +239 -163
- package/dist/i18n/index.js +1 -1
- package/dist/index.d.ts +35 -2
- package/dist/index.js +1481 -997
- package/dist/index.js.map +1 -1
- package/dist/workbench/contribution.d.ts +7 -1
- package/dist/workbench/contribution.js +6 -4
- package/dist/workbench/index.d.ts +4 -2
- package/dist/workbench/index.js +6 -4
- package/dist/workbench/launch.d.ts +2 -0
- package/dist/workbench/launch.js +2 -2
- package/dist/workbench/state.d.ts +3 -2
- package/dist/workbench/state.js +1 -1
- package/dist/workbench/types.d.ts +3 -0
- package/dist/workbench/types.js +1 -1
- package/dist/workspace-agent-generated-files.js +2 -2
- package/dist/{workspaceLinkActions-BlLN8Pvz.d.ts → workspaceLinkActions-Mjktl_Be.d.ts} +3 -0
- package/package.json +15 -13
- package/dist/chunk-ASAZDEQE.js.map +0 -1
- package/dist/chunk-FSTZDNRM.js.map +0 -1
- package/dist/chunk-GEXHKJK5.js.map +0 -1
- package/dist/chunk-GZHQPPK2.js.map +0 -1
- package/dist/chunk-MU2LODEV.js.map +0 -1
- package/dist/chunk-RLPVFX7V.js.map +0 -1
- package/dist/chunk-VDNMTW2E.js.map +0 -1
- package/dist/chunk-WME2V26J.js.map +0 -1
- package/dist/chunk-YXSO4ITT.js.map +0 -1
- package/dist/chunk-ZO3SZCIX.js.map +0 -1
- /package/dist/{chunk-HSXDSFKB.js.map → chunk-OFGXNXYT.js.map} +0 -0
- /package/dist/{chunk-KEKPOVQD.js.map → chunk-XHQGCP7A.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../agent-gui/agentGuiNode/agentMentionAgentGeneratedFilesPresentation.ts","../agent-gui/agentGuiNode/agentMentionSearchDiagnostics.ts","../agent-gui/agentGuiNode/AgentMentionLabels.ts","../agent-gui/agentGuiNode/agentMentionSearchHelpers.ts","../agent-gui/agentGuiNode/AgentMentionSearchController.ts","../agent-gui/agentGuiNode/AgentFileMentionPalette.tsx","../shared/roomIssueStatusLabel.ts"],"sourcesContent":["import { translate } from \"../../i18n/index\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport type { AgentMentionFileItem } from \"./agentRichText/agentFileMentionExtension\";\n\nconst AGENT_GENERATED_FOLDER_MIN_FILES = 2;\n\nexport function presentAgentGeneratedFileMentionItems(input: {\n files: readonly AgentContextMentionItem[];\n browsePath: string | null;\n query: string;\n}): AgentContextMentionItem[] {\n const fileItems = input.files.filter(\n (item): item is AgentMentionFileItem => item.kind === \"file\"\n );\n if (input.query.trim()) {\n return fileItems;\n }\n if (input.browsePath) {\n return presentAgentGeneratedBrowseFolder(fileItems, input.browsePath);\n }\n return presentAgentGeneratedRootFolders(fileItems);\n}\n\nfunction presentAgentGeneratedRootFolders(\n files: readonly AgentMentionFileItem[]\n): AgentMentionFileItem[] {\n const filesByDirectory = new Map<string, AgentMentionFileItem[]>();\n for (const file of files) {\n const directoryPath = resolveAgentGeneratedFileDirectoryPath(file);\n const group = filesByDirectory.get(directoryPath);\n if (group) {\n group.push(file);\n continue;\n }\n filesByDirectory.set(directoryPath, [file]);\n }\n\n const presented: AgentMentionFileItem[] = [];\n for (const [directoryPath, group] of filesByDirectory) {\n if (group.length >= AGENT_GENERATED_FOLDER_MIN_FILES) {\n presented.push(createAgentGeneratedFolderItem(directoryPath, group));\n continue;\n }\n presented.push(...group);\n }\n\n return sortAgentGeneratedMentionItems(presented);\n}\n\nfunction presentAgentGeneratedBrowseFolder(\n files: readonly AgentMentionFileItem[],\n browsePath: string\n): AgentMentionFileItem[] {\n const normalizedBrowsePath = normalizeAgentGeneratedDirectoryPath(browsePath);\n const children = files.filter(\n (file) =>\n resolveAgentGeneratedFileDirectoryPath(file) === normalizedBrowsePath\n );\n return [\n createAgentGeneratedFolderBackItem(normalizedBrowsePath),\n ...sortAgentGeneratedMentionItems(children)\n ];\n}\n\nfunction createAgentGeneratedFolderItem(\n directoryPath: string,\n files: readonly AgentMentionFileItem[]\n): AgentMentionFileItem {\n const normalizedPath = normalizeAgentGeneratedDirectoryPath(directoryPath);\n const name =\n normalizedPath.split(\"/\").filter(Boolean).at(-1) ?? normalizedPath;\n return {\n kind: \"file\",\n href: `${normalizedPath}/`,\n path: normalizedPath,\n name,\n entryKind: \"directory\",\n directoryPath: parentAgentGeneratedDirectoryPath(normalizedPath),\n mentionNavigation: \"agent-generated-folder\",\n childCount: files.length\n };\n}\n\nfunction createAgentGeneratedFolderBackItem(\n browsePath: string\n): AgentMentionFileItem {\n return {\n kind: \"file\",\n href: \"\",\n path: browsePath,\n name: translate(\"agentHost.agentGui.mentionAgentGeneratedFolderBack\"),\n entryKind: \"unknown\",\n directoryPath: parentAgentGeneratedDirectoryPath(browsePath),\n mentionNavigation: \"agent-generated-folder-back\"\n };\n}\n\nfunction resolveAgentGeneratedFileDirectoryPath(\n file: AgentMentionFileItem\n): string {\n const directoryPath = file.directoryPath?.trim();\n if (directoryPath) {\n return normalizeAgentGeneratedDirectoryPath(directoryPath);\n }\n return parentAgentGeneratedDirectoryPath(file.path);\n}\n\nfunction parentAgentGeneratedDirectoryPath(path: string): string {\n const normalized = normalizeAgentGeneratedDirectoryPath(path);\n const index = normalized.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalized.slice(0, index);\n}\n\nfunction normalizeAgentGeneratedDirectoryPath(path: string): string {\n return path.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n}\n\nfunction sortAgentGeneratedMentionItems(\n items: readonly AgentMentionFileItem[]\n): AgentMentionFileItem[] {\n return [...items].sort((left, right) =>\n left.name.localeCompare(right.name, undefined, { sensitivity: \"base\" })\n );\n}\n\nexport function agentGeneratedMentionItemKey(\n item: AgentContextMentionItem\n): string {\n if (item.kind !== \"file\") {\n return item.targetId;\n }\n if (item.mentionNavigation) {\n return `${item.mentionNavigation}:${item.path}`;\n }\n return item.path;\n}\n","import type {\n AgentMentionFilterId,\n AgentMentionGroup\n} from \"./AgentMentionSearchController\";\nimport { AGENT_CONTEXT_MENTION_PROVIDER_IDS } from \"./agentContextMentionProvider\";\n\nexport type AgentMentionProviderDiagnosticStatus =\n | \"success\"\n | \"timeout\"\n | \"error\"\n | \"missing\";\n\nexport interface AgentMentionProviderQueryDiagnostic {\n durationMs: number;\n errorKind?: string;\n providerId: string;\n resultCount: number;\n status: AgentMentionProviderDiagnosticStatus;\n}\n\nexport interface AgentMentionSearchDiagnosticLog {\n debounceMs: number;\n durationMs: number;\n errorKind?: string;\n event: \"agent_gui.mention_search\";\n filter: AgentMentionFilterId;\n groupCount: number;\n itemCount: number;\n mode: \"browse\" | \"results\";\n providerResults: AgentMentionProviderQueryDiagnostic[];\n providerTimeoutMs: number;\n queryLength: number;\n requestId: number;\n status: \"ready\" | \"error\";\n workspaceId: string;\n}\n\nconst AGENT_MENTION_SEARCH_LOG_PREFIX = \"[agent-gui] mention-search\";\nconst {\n agentGeneratedFile: AGENT_GENERATED_FILE_PROVIDER_ID,\n agentSession: AGENT_SESSION_PROVIDER_ID,\n file: FILE_PROVIDER_ID,\n workspaceApp: WORKSPACE_APP_PROVIDER_ID,\n workspaceIssue: WORKSPACE_ISSUE_PROVIDER_ID\n} = AGENT_CONTEXT_MENTION_PROVIDER_IDS;\nconst AGENT_MENTION_PROVIDER_LOG_ORDER: readonly string[] = [\n FILE_PROVIDER_ID,\n AGENT_GENERATED_FILE_PROVIDER_ID,\n WORKSPACE_APP_PROVIDER_ID,\n WORKSPACE_ISSUE_PROVIDER_ID,\n AGENT_SESSION_PROVIDER_ID\n];\n\nexport function emitAgentMentionSearchDiagnostic(input: {\n debounceMs: number;\n diagnosticInfoLogger: (payload: AgentMentionSearchDiagnosticLog) => void;\n diagnosticNow: () => number;\n diagnosticSlowThresholdMs: number;\n error?: unknown;\n filter: AgentMentionFilterId;\n groups: readonly AgentMentionGroup[];\n mode: \"browse\" | \"results\";\n providerDiagnostics: readonly AgentMentionProviderQueryDiagnostic[];\n providerTimeoutMs: number;\n query: string;\n requestId: number;\n startedAt: number;\n status: \"ready\" | \"error\";\n workspaceId: string;\n}): void {\n const durationMs = elapsedAgentMentionSearchDiagnosticMs(\n input.diagnosticNow(),\n input.startedAt\n );\n const providerResults = orderAgentMentionProviderDiagnostics(\n input.providerDiagnostics\n );\n const hasProviderIssue = providerResults.some(\n (result) => result.status === \"timeout\" || result.status === \"error\"\n );\n if (\n input.status === \"ready\" &&\n !hasProviderIssue &&\n durationMs < input.diagnosticSlowThresholdMs\n ) {\n return;\n }\n const payload: AgentMentionSearchDiagnosticLog = {\n debounceMs: input.debounceMs,\n durationMs,\n ...(input.status === \"error\"\n ? { errorKind: agentMentionSearchErrorKind(input.error) }\n : {}),\n event: \"agent_gui.mention_search\",\n filter: input.filter,\n groupCount: input.groups.length,\n itemCount: input.groups.reduce((sum, group) => sum + group.items.length, 0),\n mode: input.mode,\n providerResults,\n providerTimeoutMs: input.providerTimeoutMs,\n queryLength: [...input.query].length,\n requestId: input.requestId,\n status: input.status,\n workspaceId: input.workspaceId\n };\n try {\n input.diagnosticInfoLogger(payload);\n } catch {\n // Diagnostic logging must never affect mention search state.\n }\n}\n\nexport async function queryAgentMentionProviderWithDiagnostics<T>(input: {\n diagnosticNow: () => number;\n diagnostics: AgentMentionProviderQueryDiagnostic[];\n fallback: T;\n providerId: string;\n providerTimeoutMs: number;\n query: ((abortSignal: AbortSignal) => Promise<T>) | null;\n resultCount: (result: T) => number;\n}): Promise<T> {\n if (!input.query) {\n input.diagnostics.push({\n durationMs: 0,\n providerId: input.providerId,\n resultCount: 0,\n status: \"missing\"\n });\n return input.fallback;\n }\n const startedAt = input.diagnosticNow();\n try {\n const { result, timedOut } = await runAgentMentionProviderQuery({\n fallback: input.fallback,\n providerTimeoutMs: input.providerTimeoutMs,\n query: input.query\n });\n input.diagnostics.push({\n durationMs: elapsedAgentMentionSearchDiagnosticMs(\n input.diagnosticNow(),\n startedAt\n ),\n providerId: input.providerId,\n resultCount: input.resultCount(result),\n status: timedOut ? \"timeout\" : \"success\"\n });\n return result;\n } catch (error) {\n input.diagnostics.push({\n durationMs: elapsedAgentMentionSearchDiagnosticMs(\n input.diagnosticNow(),\n startedAt\n ),\n errorKind: agentMentionSearchErrorKind(error),\n providerId: input.providerId,\n resultCount: 0,\n status: \"error\"\n });\n throw error;\n }\n}\n\nfunction elapsedAgentMentionSearchDiagnosticMs(\n now: number,\n startedAt: number\n): number {\n const durationMs = now - startedAt;\n if (!Number.isFinite(durationMs)) {\n return 0;\n }\n return Math.max(0, Math.round(durationMs));\n}\n\nfunction agentMentionSearchErrorKind(error: unknown): string {\n if (error instanceof Error && error.name.trim()) {\n return error.name.trim();\n }\n if (error === null) {\n return \"null\";\n }\n return typeof error;\n}\n\nexport function logAgentMentionSearchInfo(\n payload: AgentMentionSearchDiagnosticLog\n): void {\n console.info(AGENT_MENTION_SEARCH_LOG_PREFIX, JSON.stringify(payload));\n}\n\nfunction orderAgentMentionProviderDiagnostics(\n diagnostics: readonly AgentMentionProviderQueryDiagnostic[]\n): AgentMentionProviderQueryDiagnostic[] {\n return [...diagnostics].sort((left, right) => {\n const leftIndex = providerDiagnosticOrder(left.providerId);\n const rightIndex = providerDiagnosticOrder(right.providerId);\n return (\n leftIndex - rightIndex || left.providerId.localeCompare(right.providerId)\n );\n });\n}\n\nfunction providerDiagnosticOrder(providerId: string): number {\n const index = AGENT_MENTION_PROVIDER_LOG_ORDER.indexOf(providerId);\n return index === -1 ? AGENT_MENTION_PROVIDER_LOG_ORDER.length : index;\n}\n\nasync function runAgentMentionProviderQuery<T>(input: {\n fallback: T;\n providerTimeoutMs: number;\n query: (abortSignal: AbortSignal) => Promise<T>;\n}): Promise<{ result: T; timedOut: boolean }> {\n const abortController = new AbortController();\n let timedOut = false;\n const queryPromise = Promise.resolve().then(() =>\n input.query(abortController.signal)\n );\n const queryResultPromise = queryPromise.then(\n (result) => ({ result, timedOut: false }),\n (error) => {\n if (timedOut && abortController.signal.aborted) {\n return { result: input.fallback, timedOut: true };\n }\n throw error;\n }\n );\n\n if (\n input.providerTimeoutMs <= 0 ||\n !Number.isFinite(input.providerTimeoutMs)\n ) {\n return queryResultPromise;\n }\n\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const timeoutPromise = new Promise<{ result: T; timedOut: boolean }>(\n (resolve) => {\n timeout = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n resolve({ result: input.fallback, timedOut: true });\n }, input.providerTimeoutMs);\n }\n );\n\n try {\n return await Promise.race([queryResultPromise, timeoutPromise]);\n } finally {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n }\n}\n","import { translate } from \"../../i18n/index\";\nimport type {\n AgentMentionFilterId,\n AgentMentionGroupId\n} from \"./AgentMentionSearchController\";\n\nexport function agentMentionGroupLabel(groupId: AgentMentionGroupId): string {\n switch (groupId) {\n case \"apps\":\n return translate(\"agentHost.agentGui.mentionGroupApps\");\n case \"files\":\n return translate(\"agentHost.agentGui.mentionGroupFiles\");\n case \"opened_files\":\n return translate(\"agentHost.agentGui.mentionGroupOpenedFiles\");\n case \"agent_generated_files\":\n return translate(\"agentHost.agentGui.mentionGroupAgentGeneratedFiles\");\n case \"my_sessions\":\n return translate(\"agentHost.agentGui.mentionGroupMySessions\");\n case \"collab_sessions\":\n return translate(\"agentHost.agentGui.mentionGroupCollabSessions\");\n case \"issues\":\n return translate(\"agentHost.agentGui.mentionGroupIssues\");\n }\n}\n\nexport function agentMentionFilterLabel(filter: AgentMentionFilterId): string {\n switch (filter) {\n case \"all\":\n return translate(\"agentHost.agentGui.mentionFilterAll\");\n case \"app\":\n return translate(\"agentHost.agentGui.mentionFilterApp\");\n case \"file\":\n return translate(\"agentHost.agentGui.mentionFilterFile\");\n case \"session\":\n return translate(\"agentHost.agentGui.mentionFilterSession\");\n case \"issue\":\n return translate(\"agentHost.agentGui.mentionFilterIssue\");\n }\n}\n\nexport function agentMentionEmptyGroupLabel(\n groupId: AgentMentionGroupId,\n query: string\n): string {\n if (groupId === \"files\" || groupId === \"opened_files\") {\n return query.trim()\n ? translate(\"agentHost.agentGui.mentionNoMatchingFiles\")\n : translate(\"agentHost.agentGui.mentionEmptyDockFiles\");\n }\n if (groupId === \"agent_generated_files\") {\n return query.trim()\n ? translate(\"agentHost.agentGui.mentionNoMatchingFiles\")\n : translate(\"agentHost.agentGui.mentionEmptyAgentGeneratedFiles\");\n }\n if (groupId === \"apps\") {\n return translate(\"agentHost.agentGui.mentionEmptyApps\");\n }\n if (groupId === \"my_sessions\") {\n return translate(\"agentHost.agentGui.mentionEmptyMySessions\");\n }\n if (groupId === \"collab_sessions\") {\n return translate(\"agentHost.agentGui.mentionEmptyCollabSessions\");\n }\n return translate(\"agentHost.agentGui.mentionEmptyIssues\");\n}\n","import type { AgentHostUserInfo } from \"../../shared/contracts/dto\";\nimport { translate } from \"../../i18n/index\";\nimport { agentMentionEmptyGroupLabel } from \"./AgentMentionLabels\";\nimport {\n resolveWorkspaceAgentActivityTitle,\n resolveWorkspaceAgentActivityStatus\n} from \"../../shared/workspaceAgentActivityListViewModel\";\nimport { workspaceAgentProviderLabel } from \"../../shared/workspaceAgentProviderLabel\";\nimport { resolveDisplayableWorkspaceAgentSessionTitle } from \"../../shared/workspaceAgentSessionTitle\";\nimport { extractPlainTextWithoutFilesFromContent } from \"../../shared/richText/richTextDocument\";\nimport type {\n AgentContextMentionItem,\n AgentMentionScope,\n AgentMentionSessionItem\n} from \"./agentRichText/agentFileMentionExtension\";\nimport {\n buildAgentSessionMentionHref,\n normalizeAgentSessionMentionTitle\n} from \"./agentRichText/agentFileMentionExtension\";\nimport type {\n AgentMentionFilterId,\n AgentMentionGroup,\n AgentMentionGroupId\n} from \"./AgentMentionSearchController\";\nimport type {\n WorkspaceAgentActivityMessage,\n WorkspaceAgentActivitySession,\n WorkspaceAgentActivitySessionSummary\n} from \"../../shared/workspaceAgentActivityTypes\";\n\nexport function buildSessionMentionItem(input: {\n workspaceId: string;\n currentUserId: string;\n session: WorkspaceAgentActivitySession;\n summary: WorkspaceAgentActivitySessionSummary | null;\n userProfiles: Record<string, Pick<AgentHostUserInfo, \"name\" | \"avatar\">>;\n fallbackTitle?: string | null;\n}): AgentMentionSessionItem | null {\n const sessionUserId = input.session.userId?.trim() ?? \"\";\n const scope: AgentMentionScope =\n sessionUserId && sessionUserId === input.currentUserId\n ? \"my_sessions\"\n : \"collab_sessions\";\n const userProfile = sessionUserId\n ? input.userProfiles[sessionUserId]\n : undefined;\n const initiatorName = normalizeSessionInitiatorDisplayName(\n userProfile?.name ||\n sessionUserId ||\n translate(\"agentHost.agentGui.mentionCollaboratorFallback\")\n );\n const sessionProvider = input.session.provider?.trim() ?? \"\";\n const agentName = workspaceAgentProviderLabel(sessionProvider || \"unknown\");\n const inputPreview =\n compactText(input.summary?.latestUserRequirement) ||\n compactText(input.summary?.initialUserRequirement) ||\n firstSummaryItemText(input.summary?.latestTurn?.userItems) ||\n \"\";\n const summaryPreview =\n compactText(input.summary?.recentAgentReplies?.[0]) ||\n firstSummaryItemText(input.summary?.latestTurn?.agentItems) ||\n \"\";\n const sessionTitle = resolveDisplayableWorkspaceAgentSessionTitle(\n input.session\n );\n const fallbackTitle = compactText(input.fallbackTitle);\n const title =\n fallbackTitle ||\n sessionTitle ||\n inputPreview ||\n summaryPreview ||\n input.session.agentSessionId;\n if (!title) {\n return null;\n }\n const mentionTitle = normalizeAgentSessionMentionTitle(title);\n const status = resolveSessionDisplayStatus(input.session, input.summary);\n return {\n kind: \"session\",\n href: buildAgentSessionMentionHref(\n input.workspaceId,\n input.session.agentSessionId,\n sessionProvider\n ),\n workspaceId: input.workspaceId,\n targetId: input.session.agentSessionId,\n name: `${initiatorName} & ${agentName} ${mentionTitle}`.trim(),\n title: mentionTitle,\n scope,\n initiatorName,\n ...(userProfile?.avatar ? { initiatorAvatarUrl: userProfile.avatar } : {}),\n agentName,\n status,\n inputPreview,\n summaryPreview,\n updatedAtUnixMs:\n input.session.updatedAtUnixMs ??\n input.session.createdAtUnixMs ??\n Date.now()\n };\n}\n\nfunction normalizeSessionInitiatorDisplayName(value: string): string {\n const trimmed = value.trim();\n return trimmed.toLowerCase() === \"local\" ? \"User\" : trimmed;\n}\n\nexport function resolveSessionMentionMessageTitle(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[]\n): string {\n return compactText(\n resolveWorkspaceAgentActivityTitle(session, [...messages])\n );\n}\n\nfunction resolveSessionDisplayStatus(\n session: WorkspaceAgentActivitySession,\n summary: WorkspaceAgentActivitySessionSummary | null\n): string {\n const sessionStatus = resolveWorkspaceAgentActivityStatus(session);\n if (hasExplicitSessionStatus(session)) {\n return sessionStatus;\n }\n const status = (\n summary?.executionStatus?.currentOrFinalStatus ??\n summary?.currentOrFinalStatus ??\n session.status ??\n \"\"\n )\n .trim()\n .toLowerCase();\n if (status === \"waiting\") {\n return \"waiting\";\n }\n if (status === \"working\") {\n return \"working\";\n }\n if (status === \"completed\") {\n return \"completed\";\n }\n if (status === \"failed\") {\n return \"failed\";\n }\n return status\n ? resolveWorkspaceAgentActivityStatusFromSummary(status)\n : sessionStatus;\n}\n\nfunction hasExplicitSessionStatus(\n session: WorkspaceAgentActivitySession\n): boolean {\n return Boolean((session.status ?? \"\").trim());\n}\n\nfunction resolveWorkspaceAgentActivityStatusFromSummary(\n status: string\n): string {\n switch (status) {\n case \"waiting\":\n return \"waiting\";\n case \"working\":\n return \"working\";\n case \"completed\":\n return \"completed\";\n case \"canceled\":\n return \"canceled\";\n case \"failed\":\n return \"failed\";\n default:\n return \"idle\";\n }\n}\n\nfunction firstSummaryItemText(\n items: ReadonlyArray<{ content?: string }> | undefined\n): string {\n if (!items) {\n return \"\";\n }\n for (const item of items) {\n const text = compactText(item.content);\n if (text) {\n return text;\n }\n }\n return \"\";\n}\n\nexport function matchesSessionQuery(\n item: AgentContextMentionItem,\n rawQuery: string\n): boolean {\n if (item.kind !== \"session\") {\n return true;\n }\n const query = normalizeQuery(rawQuery);\n if (!query) {\n return true;\n }\n const haystack = [\n item.name,\n item.title,\n item.initiatorName,\n item.agentName,\n item.inputPreview ?? \"\",\n item.summaryPreview ?? \"\"\n ]\n .join(\"\\n\")\n .toLowerCase();\n return query\n .toLowerCase()\n .split(/\\s+/)\n .filter(Boolean)\n .every((token) => haystack.includes(token));\n}\n\nexport const AGENT_MENTION_FILTER_TAB_ORDER = [\n \"all\",\n \"session\",\n \"file\",\n \"issue\",\n \"app\"\n] as const satisfies readonly AgentMentionFilterId[];\n\nexport const DEFAULT_MENTION_ALL_TAB_PAGE_SIZE = 5;\nexport const DEFAULT_MENTION_GROUP_PAGE_SIZE = 10;\n\nexport function mentionGroupPageSize(\n filter: AgentMentionFilterId,\n _groupId: AgentMentionGroupId\n): number {\n return filter === \"all\"\n ? DEFAULT_MENTION_ALL_TAB_PAGE_SIZE\n : DEFAULT_MENTION_GROUP_PAGE_SIZE;\n}\n\nexport function mentionGroupExpandCount(\n group: AgentMentionGroup,\n filter: AgentMentionFilterId\n): number {\n const pageSize = mentionGroupPageSize(\n filter,\n group.id as AgentMentionGroupId\n );\n const remaining = Math.max(0, group.totalCount - group.visibleCount);\n return Math.min(pageSize, remaining);\n}\n\nexport function groupIdsForFilter(\n filter: AgentMentionFilterId\n): AgentMentionGroupId[] {\n switch (filter) {\n case \"app\":\n return [\"apps\"];\n case \"file\":\n return [\"opened_files\", \"agent_generated_files\"];\n case \"session\":\n return [\"my_sessions\"];\n case \"issue\":\n return [\"issues\"];\n case \"all\":\n default:\n return [\"my_sessions\", \"files\", \"issues\", \"apps\"];\n }\n}\n\nexport function shouldShowEmptyGroup(\n groupId: AgentMentionGroupId,\n filter: AgentMentionFilterId,\n query: string\n): boolean {\n const hasQuery = query.trim().length > 0;\n if (groupId === \"files\") {\n return filter === \"all\";\n }\n if (groupId === \"opened_files\" || groupId === \"agent_generated_files\") {\n return filter === \"file\" && !hasQuery;\n }\n if (groupId === \"apps\") {\n return filter === \"all\" || filter === \"app\";\n }\n if (groupId === \"my_sessions\") {\n return filter === \"all\" || filter === \"session\";\n }\n if (groupId === \"collab_sessions\") {\n return false;\n }\n return filter === \"all\" || filter === \"issue\";\n}\n\nexport function buildEmptyGroup(\n groupId: AgentMentionGroupId,\n query: string\n): AgentMentionGroup {\n return {\n id: groupId,\n items: [],\n totalCount: 0,\n visibleCount: 0,\n hasMore: false,\n emptyLabel: emptyGroupLabel(groupId, query)\n };\n}\n\nfunction emptyGroupLabel(groupId: AgentMentionGroupId, query: string): string {\n return agentMentionEmptyGroupLabel(groupId, query);\n}\n\nexport function shouldPrefetchBrowseFilter(\n filter: AgentMentionFilterId\n): filter is \"all\" | \"app\" | \"file\" | \"session\" | \"issue\" {\n return (\n filter === \"all\" ||\n filter === \"app\" ||\n filter === \"file\" ||\n filter === \"session\" ||\n filter === \"issue\"\n );\n}\n\nexport function filterForGroup(\n groupId: AgentMentionGroupId\n): Exclude<AgentMentionFilterId, \"all\"> {\n switch (groupId) {\n case \"apps\":\n return \"app\";\n case \"files\":\n case \"opened_files\":\n case \"agent_generated_files\":\n return \"file\";\n case \"my_sessions\":\n return \"session\";\n case \"collab_sessions\":\n return \"session\";\n case \"issues\":\n return \"issue\";\n }\n}\n\ntype AgentMentionRawGroupId = Exclude<AgentMentionGroupId, \"files\">;\n\nexport function resolveMentionGroupItems(\n groupId: AgentMentionGroupId,\n rawGroups: Record<AgentMentionRawGroupId, AgentContextMentionItem[]>\n): AgentContextMentionItem[] {\n if (groupId === \"files\") {\n return [...rawGroups.opened_files, ...rawGroups.agent_generated_files];\n }\n return rawGroups[groupId] ?? [];\n}\n\nexport function resolveMentionGroupTotalCount(\n groupId: AgentMentionGroupId,\n totalCounts: Partial<Record<AgentMentionGroupId, number>>,\n itemCount: number\n): number {\n if (groupId === \"files\") {\n return (\n (totalCounts.opened_files ?? 0) + (totalCounts.agent_generated_files ?? 0)\n );\n }\n if (groupId === \"agent_generated_files\") {\n return itemCount;\n }\n return totalCounts[groupId] ?? itemCount;\n}\n\nexport function normalizeQuery(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nexport function compactText(value: string | null | undefined): string {\n return value?.replace(/\\s+/g, \" \").trim() ?? \"\";\n}\n\nexport function issuePreviewText(value: string | null | undefined): string {\n const content = extractPlainTextWithoutFilesFromContent(value);\n return compactText(content);\n}\n\nexport function unique(values: readonly string[]): string[] {\n return [...new Set(values)];\n}\n\nexport function getOrCreateSummaryCache<T>(\n map: Map<string, Map<string, T>>,\n workspaceId: string\n): Map<string, T> {\n const existing = map.get(workspaceId);\n if (existing) {\n return existing;\n }\n const created = new Map<string, T>();\n map.set(workspaceId, created);\n return created;\n}\n","import { resolveAgentMentionFileThumbnailUrl } from \"../shared/mentionFilePresentation\";\nimport { presentAgentGeneratedFileMentionItems } from \"./agentMentionAgentGeneratedFilesPresentation\";\nimport {\n emitAgentMentionSearchDiagnostic,\n logAgentMentionSearchInfo,\n queryAgentMentionProviderWithDiagnostics,\n type AgentMentionProviderQueryDiagnostic,\n type AgentMentionSearchDiagnosticLog\n} from \"./agentMentionSearchDiagnostics\";\nimport {\n AGENT_MENTION_FILTER_TAB_ORDER,\n buildEmptyGroup,\n compactText,\n filterForGroup,\n DEFAULT_MENTION_GROUP_PAGE_SIZE,\n groupIdsForFilter,\n mentionGroupPageSize,\n normalizeQuery,\n resolveMentionGroupItems,\n resolveMentionGroupTotalCount,\n shouldPrefetchBrowseFilter,\n shouldShowEmptyGroup\n} from \"./agentMentionSearchHelpers\";\nimport { agentMentionFilterLabel } from \"./AgentMentionLabels\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport {\n buildAgentGenericMentionHref,\n buildAgentSessionMentionHref,\n buildAgentWorkspaceAppMentionHref,\n buildAgentWorkspaceIssueMentionHref,\n normalizeAgentSessionMentionTitle\n} from \"./agentRichText/agentFileMentionExtension\";\nimport type {\n AgentContextMentionInsertResult,\n AgentContextMentionProvider\n} from \"./agentContextMentionProvider\";\nimport { AGENT_CONTEXT_MENTION_PROVIDER_IDS } from \"./agentContextMentionProvider\";\nimport type {\n MentionPaletteGroup,\n MentionPaletteState\n} from \"@tutti-os/ui-rich-text/at-panel\";\n\nexport type AgentMentionFilterId = \"all\" | \"app\" | \"file\" | \"session\" | \"issue\";\nexport type AgentMentionGroupId =\n | \"apps\"\n | \"files\"\n | \"opened_files\"\n | \"agent_generated_files\"\n | \"my_sessions\"\n | \"collab_sessions\"\n | \"issues\";\n\ntype AgentMentionRawGroupId = Exclude<AgentMentionGroupId, \"files\">;\n\nexport interface AgentMentionBrowseCategory {\n id: AgentMentionFilterId;\n label: string;\n}\n\nexport type AgentMentionGroup = MentionPaletteGroup<AgentContextMentionItem>;\n\nexport type AgentMentionSearchState =\n MentionPaletteState<AgentContextMentionItem>;\n\ninterface AgentMentionSearchControllerOptions {\n contextMentionProviders?: readonly AgentContextMentionProvider[];\n debounceMs?: number;\n fileLimit?: number;\n issueLimit?: number;\n providerTimeoutMs?: number;\n diagnosticInfoLogger?: (payload: AgentMentionSearchDiagnosticLog) => void;\n diagnosticNow?: () => number;\n diagnosticSlowThresholdMs?: number;\n}\n\ntype Listener = (state: AgentMentionSearchState) => void;\n\nconst DEFAULT_DEBOUNCE_MS = 120;\nconst DEFAULT_FILE_LIMIT = 30;\nconst DEFAULT_ISSUE_LIMIT = 25;\nconst DEFAULT_SESSION_LIMIT = 30;\nconst DEFAULT_PROVIDER_TIMEOUT_MS = 3500;\nconst DEFAULT_DIAGNOSTIC_SLOW_THRESHOLD_MS = 250;\n\n// Resolve filter tab labels lazily so they reflect the active i18n locale at the\n// time a state is emitted. Computing this at module load froze the labels to the\n// default (\"en\") runtime, since the agent GUI i18n locale is only synced once the\n// AgentGuiI18nProvider renders.\nfunction buildBrowseCategories(): AgentMentionBrowseCategory[] {\n return AGENT_MENTION_FILTER_TAB_ORDER.map((id) => ({\n id,\n label: agentMentionFilterLabel(id)\n }));\n}\n\nconst {\n agentGeneratedFile: AGENT_GENERATED_FILE_PROVIDER_ID,\n agentSession: AGENT_SESSION_PROVIDER_ID,\n file: FILE_PROVIDER_ID,\n workspaceApp: WORKSPACE_APP_PROVIDER_ID,\n workspaceIssue: WORKSPACE_ISSUE_PROVIDER_ID\n} = AGENT_CONTEXT_MENTION_PROVIDER_IDS;\n\nexport class AgentMentionSearchController {\n private readonly contextMentionProviders: ReadonlyMap<\n string,\n AgentContextMentionProvider\n >;\n private readonly debounceMs: number;\n private readonly fileLimit: number;\n private readonly issueLimit: number;\n private readonly providerTimeoutMs: number;\n private readonly diagnosticInfoLogger: (\n payload: AgentMentionSearchDiagnosticLog\n ) => void;\n private readonly diagnosticNow: () => number;\n private readonly diagnosticSlowThresholdMs: number;\n private readonly listeners = new Set<Listener>();\n private readonly expandedCounts: Partial<\n Record<AgentMentionGroupId, number>\n > = {};\n private readonly totalCounts: Partial<Record<AgentMentionGroupId, number>> =\n {};\n private timer: ReturnType<typeof setTimeout> | null = null;\n private requestId = 0;\n private disposed = false;\n private activeWorkspaceId = \"\";\n private currentUserId = \"\";\n private currentFilter: AgentMentionFilterId = \"all\";\n private currentQuery = \"\";\n private currentSessionCwd = \"\";\n private currentFileSearchLimit: number;\n private currentIssueSearchLimit: number;\n private agentGeneratedBrowsePath: string | null = null;\n private rawGroups: Record<AgentMentionRawGroupId, AgentContextMentionItem[]> =\n {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n private state: AgentMentionSearchState = {\n status: \"idle\",\n query: \"\",\n mode: \"browse\",\n filter: \"all\",\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n };\n\n constructor(options: AgentMentionSearchControllerOptions) {\n this.contextMentionProviders = new Map(\n (options.contextMentionProviders ?? []).map((provider) => [\n provider.id,\n provider\n ])\n );\n this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n this.fileLimit = options.fileLimit ?? DEFAULT_FILE_LIMIT;\n this.issueLimit = options.issueLimit ?? DEFAULT_ISSUE_LIMIT;\n this.providerTimeoutMs =\n options.providerTimeoutMs ?? DEFAULT_PROVIDER_TIMEOUT_MS;\n this.diagnosticInfoLogger =\n options.diagnosticInfoLogger ?? logAgentMentionSearchInfo;\n this.diagnosticNow = options.diagnosticNow ?? Date.now;\n this.diagnosticSlowThresholdMs =\n options.diagnosticSlowThresholdMs ?? DEFAULT_DIAGNOSTIC_SLOW_THRESHOLD_MS;\n this.currentFileSearchLimit = this.fileLimit;\n this.currentIssueSearchLimit = this.issueLimit;\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n listener(this.state);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n updateQuery(input: {\n workspaceId: string;\n currentUserId?: string | null;\n query: string;\n sessionCwd?: string | null;\n }): void {\n if (this.disposed) {\n return;\n }\n this.activeWorkspaceId = input.workspaceId.trim();\n this.currentUserId = input.currentUserId?.trim() ?? \"\";\n this.currentSessionCwd = input.sessionCwd?.trim() ?? \"\";\n this.currentQuery = normalizeQuery(input.query);\n this.clearTimer();\n const requestId = ++this.requestId;\n this.resetAgentGeneratedBrowsePath();\n this.resetExpandedCounts();\n this.resetSearchLimits();\n\n if (!this.activeWorkspaceId) {\n this.setState({\n status: \"idle\",\n query: this.currentQuery,\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n });\n return;\n }\n\n if (!this.currentQuery) {\n this.startBrowseModeFetch(this.currentFilter);\n return;\n }\n\n this.setState({\n status: \"loading\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n this.timer = setTimeout(() => {\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId\n });\n }, this.debounceMs);\n }\n\n setFilter(filter: AgentMentionFilterId): void {\n if (this.disposed) {\n return;\n }\n this.currentFilter = filter;\n this.resetAgentGeneratedBrowsePath();\n this.resetExpandedCounts();\n if (!this.currentQuery) {\n this.startBrowseModeFetch(filter);\n return;\n }\n this.setState({\n status: \"ready\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n }\n\n enterCategory(category: Exclude<AgentMentionFilterId, \"all\">): void {\n if (this.disposed) {\n return;\n }\n this.currentFilter = category;\n this.resetExpandedCounts();\n this.clearTimer();\n if (!this.currentQuery) {\n this.startBrowseModeFetch(category);\n return;\n }\n if (!this.activeWorkspaceId) {\n this.emitBrowseState(\"ready\");\n return;\n }\n const requestId = ++this.requestId;\n this.setState({\n status: \"loading\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId\n });\n }\n\n selectAgentGeneratedMentionItem(item: AgentContextMentionItem): boolean {\n if (item.kind !== \"file\" || !item.mentionNavigation) {\n return false;\n }\n if (item.mentionNavigation === \"agent-generated-folder\") {\n this.agentGeneratedBrowsePath = item.path;\n this.expandedCounts.agent_generated_files = mentionGroupPageSize(\n this.currentFilter,\n \"agent_generated_files\"\n );\n this.setState({\n status: this.state.status === \"loading\" ? \"loading\" : \"ready\",\n query: this.currentQuery,\n mode: this.currentQuery ? \"results\" : \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n return true;\n }\n if (item.mentionNavigation === \"agent-generated-folder-back\") {\n this.resetAgentGeneratedBrowsePath();\n this.setState({\n status: this.state.status === \"loading\" ? \"loading\" : \"ready\",\n query: this.currentQuery,\n mode: this.currentQuery ? \"results\" : \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n return true;\n }\n return false;\n }\n\n expandGroup(groupId: AgentMentionGroupId): void {\n const pageSize = mentionGroupPageSize(this.currentFilter, groupId);\n const current = this.expandedCounts[groupId] ?? pageSize;\n this.expandedCounts[groupId] = current + pageSize;\n if (!this.currentQuery) {\n const nextFilter = filterForGroup(groupId);\n if (this.currentFilter === \"all\") {\n this.currentFilter = nextFilter;\n }\n this.setState({\n status: \"ready\",\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n return;\n }\n const needsMoreFiles =\n (groupId === \"opened_files\" ||\n groupId === \"files\" ||\n groupId === \"agent_generated_files\") &&\n (groupId === \"agent_generated_files\"\n ? this.rawGroups.agent_generated_files.length >=\n this.currentFileSearchLimit\n : this.rawGroups.opened_files.length >= this.currentFileSearchLimit);\n const needsMoreIssues =\n groupId === \"issues\" &&\n (this.totalCounts.issues ?? this.rawGroups.issues.length) >\n this.rawGroups.issues.length;\n if (needsMoreFiles) {\n this.currentFileSearchLimit += DEFAULT_MENTION_GROUP_PAGE_SIZE;\n }\n if (needsMoreIssues) {\n this.currentIssueSearchLimit += DEFAULT_MENTION_GROUP_PAGE_SIZE;\n }\n if (needsMoreFiles || needsMoreIssues) {\n this.clearTimer();\n const requestId = ++this.requestId;\n this.setState({\n status: \"loading\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId\n });\n return;\n }\n this.setState({\n status: \"ready\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n }\n\n close(): void {\n this.clearTimer();\n this.requestId += 1;\n this.currentFilter = \"all\";\n this.resetAgentGeneratedBrowsePath();\n this.resetExpandedCounts();\n this.resetSearchLimits();\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.totalCounts.apps = 0;\n this.totalCounts.opened_files = 0;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = 0;\n this.totalCounts.collab_sessions = 0;\n this.totalCounts.issues = 0;\n this.currentQuery = \"\";\n this.setState({\n status: \"idle\",\n query: \"\",\n mode: \"browse\",\n filter: \"all\",\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n });\n }\n\n dispose(): void {\n this.disposed = true;\n this.clearTimer();\n this.listeners.clear();\n this.requestId += 1;\n }\n\n private startBrowseModeFetch(filter: AgentMentionFilterId): void {\n if (!this.activeWorkspaceId || !shouldPrefetchBrowseFilter(filter)) {\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.emitBrowseState(\"ready\");\n return;\n }\n this.clearTimer();\n const requestId = ++this.requestId;\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.emitBrowseState(\"loading\");\n void this.runBrowseSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n requestId,\n filter\n });\n }\n\n private async runSearch(input: {\n workspaceId: string;\n currentUserId: string;\n query: string;\n requestId: number;\n }): Promise<void> {\n const startedAt = this.diagnosticNow();\n const providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n try {\n const [fileItems, appItems, issueItems, sessionItems] = await Promise.all(\n [\n this.queryProviderMentionItemsById({\n providerId: FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: this.currentFileSearchLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: WORKSPACE_APP_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: DEFAULT_MENTION_GROUP_PAGE_SIZE,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: WORKSPACE_ISSUE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: this.currentIssueSearchLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: AGENT_SESSION_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: DEFAULT_SESSION_LIMIT,\n diagnostics: providerDiagnostics\n })\n ]\n );\n\n if (!this.canApply(input.requestId, input.workspaceId, input.query)) {\n return;\n }\n\n this.rawGroups = {\n apps: appItems.filter((item) => item.kind === \"workspace-app\"),\n opened_files: fileItems.filter((item) => item.kind === \"file\"),\n agent_generated_files: [],\n my_sessions: sessionItems.filter(\n (item) => item.kind === \"session\" && item.scope === \"my_sessions\"\n ),\n collab_sessions: sessionItems.filter(\n (item) => item.kind === \"session\" && item.scope === \"collab_sessions\"\n ),\n issues: issueItems.filter((item) => item.kind === \"workspace-issue\")\n };\n this.totalCounts.apps = this.rawGroups.apps.length;\n this.totalCounts.opened_files = this.rawGroups.opened_files.length;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = this.rawGroups.my_sessions.length;\n this.totalCounts.collab_sessions = this.rawGroups.collab_sessions.length;\n this.totalCounts.issues = this.rawGroups.issues.length;\n const groups = this.groupsFromRawGroups();\n\n this.setState({\n status: \"ready\",\n query: input.query,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups,\n error: null\n });\n this.logSearchDiagnostic({\n filter: this.currentFilter,\n groups,\n mode: \"results\",\n providerDiagnostics,\n query: input.query,\n requestId: input.requestId,\n startedAt,\n status: \"ready\",\n workspaceId: input.workspaceId\n });\n } catch (error) {\n if (!this.canApply(input.requestId, input.workspaceId, input.query)) {\n return;\n }\n this.setState({\n status: \"error\",\n query: input.query,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: error instanceof Error ? error.message : String(error)\n });\n this.logSearchDiagnostic({\n error,\n filter: this.currentFilter,\n groups: [],\n mode: \"results\",\n providerDiagnostics,\n query: input.query,\n requestId: input.requestId,\n startedAt,\n status: \"error\",\n workspaceId: input.workspaceId\n });\n }\n }\n\n private async runBrowseSearch(input: {\n workspaceId: string;\n currentUserId: string;\n requestId: number;\n filter: AgentMentionFilterId;\n }): Promise<void> {\n const startedAt = this.diagnosticNow();\n const providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n try {\n if (input.filter === \"file\") {\n const [fileItems, agentGeneratedFileItems] = await Promise.all([\n this.queryProviderMentionItemsById({\n providerId: FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.fileLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: AGENT_GENERATED_FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.fileLimit,\n diagnostics: providerDiagnostics\n })\n ]);\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.rawGroups = {\n apps: [],\n opened_files: fileItems.filter((item) => item.kind === \"file\"),\n agent_generated_files: agentGeneratedFileItems.filter(\n (item) => item.kind === \"file\"\n ),\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.totalCounts.apps = 0;\n this.totalCounts.opened_files = this.rawGroups.opened_files.length;\n this.totalCounts.agent_generated_files =\n this.rawGroups.agent_generated_files.length;\n this.totalCounts.my_sessions = 0;\n this.totalCounts.collab_sessions = 0;\n this.totalCounts.issues = 0;\n } else if (input.filter === \"app\") {\n const appItems = await this.queryProviderMentionItemsById({\n providerId: WORKSPACE_APP_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: DEFAULT_MENTION_GROUP_PAGE_SIZE,\n diagnostics: providerDiagnostics\n });\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.rawGroups = {\n apps: appItems.filter((item) => item.kind === \"workspace-app\"),\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.totalCounts.apps = this.rawGroups.apps.length;\n this.totalCounts.opened_files = 0;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = 0;\n this.totalCounts.collab_sessions = 0;\n this.totalCounts.issues = 0;\n } else if (input.filter === \"issue\") {\n const issueItems = await this.queryProviderMentionItemsById({\n providerId: WORKSPACE_ISSUE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.currentIssueSearchLimit,\n diagnostics: providerDiagnostics\n });\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: issueItems.filter((item) => item.kind === \"workspace-issue\")\n };\n this.totalCounts.apps = 0;\n this.totalCounts.opened_files = 0;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = 0;\n this.totalCounts.collab_sessions = 0;\n this.totalCounts.issues = this.rawGroups.issues.length;\n } else if (input.filter === \"session\") {\n const sessionItems = await this.queryProviderMentionItemsById({\n providerId: AGENT_SESSION_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: DEFAULT_SESSION_LIMIT,\n diagnostics: providerDiagnostics\n });\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n const sessionMentionItems = sessionItems.filter(\n (item) => item.kind === \"session\"\n );\n const mySessionItems = sessionMentionItems\n .filter((item) =>\n input.currentUserId ? item.scope === \"my_sessions\" : true\n )\n .map((item) =>\n item.scope === \"my_sessions\"\n ? item\n : { ...item, scope: \"my_sessions\" as const }\n );\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: mySessionItems,\n collab_sessions: [],\n issues: []\n };\n this.totalCounts.apps = 0;\n this.totalCounts.opened_files = 0;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = this.rawGroups.my_sessions.length;\n this.totalCounts.collab_sessions =\n this.rawGroups.collab_sessions.length;\n this.totalCounts.issues = 0;\n } else {\n const [\n appItems,\n fileItems,\n agentGeneratedFileItems,\n issueItems,\n sessionItems\n ] = await Promise.all([\n this.queryProviderMentionItemsById({\n providerId: WORKSPACE_APP_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: DEFAULT_MENTION_GROUP_PAGE_SIZE,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.fileLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: AGENT_GENERATED_FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.fileLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: WORKSPACE_ISSUE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.currentIssueSearchLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: AGENT_SESSION_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: DEFAULT_SESSION_LIMIT,\n diagnostics: providerDiagnostics\n })\n ]);\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.rawGroups = {\n apps: appItems.filter((item) => item.kind === \"workspace-app\"),\n opened_files: fileItems.filter((item) => item.kind === \"file\"),\n agent_generated_files: agentGeneratedFileItems.filter(\n (item) => item.kind === \"file\"\n ),\n my_sessions: sessionItems.filter(\n (item) => item.kind === \"session\" && item.scope === \"my_sessions\"\n ),\n collab_sessions: sessionItems.filter(\n (item) =>\n item.kind === \"session\" && item.scope === \"collab_sessions\"\n ),\n issues: issueItems.filter((item) => item.kind === \"workspace-issue\")\n };\n this.totalCounts.apps = this.rawGroups.apps.length;\n this.totalCounts.opened_files = this.rawGroups.opened_files.length;\n this.totalCounts.agent_generated_files =\n this.rawGroups.agent_generated_files.length;\n this.totalCounts.my_sessions = this.rawGroups.my_sessions.length;\n this.totalCounts.collab_sessions =\n this.rawGroups.collab_sessions.length;\n this.totalCounts.issues = this.rawGroups.issues.length;\n }\n const groups = this.groupsFromRawGroups();\n\n this.setState({\n status: \"ready\",\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups,\n error: null\n });\n this.logSearchDiagnostic({\n filter: this.currentFilter,\n groups,\n mode: \"browse\",\n providerDiagnostics,\n query: \"\",\n requestId: input.requestId,\n startedAt,\n status: \"ready\",\n workspaceId: input.workspaceId\n });\n } catch (error) {\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.setState({\n status: \"error\",\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: error instanceof Error ? error.message : String(error)\n });\n this.logSearchDiagnostic({\n error,\n filter: this.currentFilter,\n groups: [],\n mode: \"browse\",\n providerDiagnostics,\n query: \"\",\n requestId: input.requestId,\n startedAt,\n status: \"error\",\n workspaceId: input.workspaceId\n });\n }\n }\n\n private async queryProviderMentionItems(input: {\n provider: AgentContextMentionProvider;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit: number;\n abortSignal: AbortSignal;\n }): Promise<AgentContextMentionItem[]> {\n const items = await input.provider.query({\n keyword: input.query,\n maxResults: input.limit,\n abortSignal: input.abortSignal,\n trigger: \"@\",\n context: {\n metadata: {\n currentUserId: input.currentUserId,\n sessionCwd: this.currentSessionCwd || undefined,\n target: \"agent-gui\",\n workspaceId: input.workspaceId\n }\n }\n });\n if (input.abortSignal.aborted) {\n return [];\n }\n const mentionItems = await Promise.all(\n items.map(async (item) => {\n const mentionItem = providerItemToAgentMentionItem({\n currentUserId: input.currentUserId,\n insertResult: input.provider.toInsertResult(item),\n label: input.provider.getItemLabel(item),\n providerId: input.provider.id,\n subtitle: input.provider.getItemSubtitle?.(item) ?? \"\",\n workspaceId: input.workspaceId\n });\n if (!mentionItem || mentionItem.kind !== \"file\") {\n return mentionItem;\n }\n const thumbnailUrl = await Promise.resolve(\n input.provider.getItemThumbnailUrl?.(item) ?? null\n ).catch(() => null);\n const resolvedThumbnailUrl = resolveAgentMentionFileThumbnailUrl({\n ...mentionItem,\n thumbnailUrl\n });\n if (!resolvedThumbnailUrl) {\n return mentionItem;\n }\n return {\n ...mentionItem,\n thumbnailUrl: resolvedThumbnailUrl\n };\n })\n );\n return mentionItems.filter(\n (item): item is AgentContextMentionItem => item !== null\n );\n }\n\n private async queryProviderMentionItemsById(input: {\n diagnostics: AgentMentionProviderQueryDiagnostic[];\n providerId: string;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit: number;\n }): Promise<AgentContextMentionItem[]> {\n const provider = this.contextMentionProviders.get(input.providerId);\n return queryAgentMentionProviderWithDiagnostics({\n diagnosticNow: this.diagnosticNow,\n diagnostics: input.diagnostics,\n fallback: [] as AgentContextMentionItem[],\n providerId: input.providerId,\n providerTimeoutMs: this.providerTimeoutMs,\n query: provider\n ? (abortSignal) =>\n this.queryProviderMentionItems({\n provider,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: input.limit,\n abortSignal\n })\n : null,\n resultCount: (result) => result.length\n });\n }\n\n private logSearchDiagnostic(input: {\n error?: unknown;\n filter: AgentMentionFilterId;\n groups: readonly AgentMentionGroup[];\n mode: \"browse\" | \"results\";\n providerDiagnostics: readonly AgentMentionProviderQueryDiagnostic[];\n query: string;\n requestId: number;\n startedAt: number;\n status: \"ready\" | \"error\";\n workspaceId: string;\n }): void {\n emitAgentMentionSearchDiagnostic({\n debounceMs: this.debounceMs,\n diagnosticInfoLogger: this.diagnosticInfoLogger,\n diagnosticNow: this.diagnosticNow,\n diagnosticSlowThresholdMs: this.diagnosticSlowThresholdMs,\n error: input.error,\n filter: input.filter,\n groups: input.groups,\n mode: input.mode,\n providerDiagnostics: input.providerDiagnostics,\n providerTimeoutMs: this.providerTimeoutMs,\n query: input.query,\n requestId: input.requestId,\n startedAt: input.startedAt,\n status: input.status,\n workspaceId: input.workspaceId\n });\n }\n\n private groupsFromRawGroups(): AgentMentionGroup[] {\n const orderedGroupIds = groupIdsForFilter(this.currentFilter);\n const groups = orderedGroupIds\n .map((groupId) => {\n const rawItems = resolveMentionGroupItems(groupId, this.rawGroups);\n const items =\n groupId === \"agent_generated_files\"\n ? presentAgentGeneratedFileMentionItems({\n files: rawItems,\n browsePath: this.agentGeneratedBrowsePath,\n query: this.currentQuery\n })\n : rawItems;\n if (items.length === 0) {\n if (\n !shouldShowEmptyGroup(\n groupId,\n this.currentFilter,\n this.currentQuery\n )\n ) {\n return null;\n }\n return buildEmptyGroup(groupId, this.currentQuery);\n }\n const pageSize = mentionGroupPageSize(this.currentFilter, groupId);\n const visibleCount = Math.min(\n items.length,\n this.expandedCounts[groupId] ?? pageSize\n );\n const totalCount = resolveMentionGroupTotalCount(\n groupId,\n this.totalCounts,\n items.length\n );\n return {\n id: groupId,\n items: items.slice(0, visibleCount),\n totalCount,\n visibleCount,\n hasMore:\n items.length > visibleCount ||\n ((groupId === \"opened_files\" ||\n groupId === \"files\" ||\n groupId === \"agent_generated_files\") &&\n items.length >= this.currentFileSearchLimit) ||\n totalCount > visibleCount\n } satisfies AgentMentionGroup;\n })\n .filter((group): group is AgentMentionGroup => group !== null);\n return orderMentionGroupsForFilter({\n filter: this.currentFilter,\n groups,\n query: this.currentQuery\n });\n }\n\n private emitBrowseState(status: \"ready\" | \"loading\"): void {\n this.setState({\n status,\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n });\n }\n\n private canApply(\n requestId: number,\n workspaceId: string,\n query: string\n ): boolean {\n return (\n !this.disposed &&\n requestId === this.requestId &&\n workspaceId === this.activeWorkspaceId &&\n query === this.currentQuery\n );\n }\n\n private clearTimer(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n private resetExpandedCounts(): void {\n for (const groupId of [\n \"files\",\n \"opened_files\",\n \"agent_generated_files\",\n \"my_sessions\",\n \"collab_sessions\",\n \"apps\",\n \"issues\"\n ] as const) {\n this.expandedCounts[groupId] = mentionGroupPageSize(\n this.currentFilter,\n groupId\n );\n }\n }\n\n private resetSearchLimits(): void {\n this.currentFileSearchLimit = this.fileLimit;\n this.currentIssueSearchLimit = this.issueLimit;\n }\n\n private resetAgentGeneratedBrowsePath(): void {\n this.agentGeneratedBrowsePath = null;\n }\n\n private setState(state: AgentMentionSearchState): void {\n this.state = state;\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n}\n\nfunction orderMentionGroupsForFilter(input: {\n filter: AgentMentionFilterId;\n groups: AgentMentionGroup[];\n query: string;\n}): AgentMentionGroup[] {\n if (input.filter !== \"all\") {\n return input.groups;\n }\n const query = normalizeQuery(input.query).toLowerCase();\n return input.groups\n .map((group, index) => ({\n group,\n hasItems: group.items.length > 0,\n index,\n score: mentionGroupBestMatchScore(group, query)\n }))\n .sort((left, right) => {\n if (left.hasItems !== right.hasItems) {\n return left.hasItems ? -1 : 1;\n }\n if (query && left.score !== right.score) {\n return right.score - left.score;\n }\n return left.index - right.index;\n })\n .map((entry) => entry.group);\n}\n\nfunction mentionGroupBestMatchScore(\n group: AgentMentionGroup,\n query: string\n): number {\n if (!query) {\n return 0;\n }\n return group.items.reduce(\n (bestScore, item) =>\n Math.max(bestScore, mentionItemMatchScore(item, query)),\n 0\n );\n}\n\nfunction mentionItemMatchScore(\n item: AgentContextMentionItem,\n query: string\n): number {\n const primary: string[] = [];\n const secondary: string[] = [];\n let kindBoost = 0;\n\n if (item.kind === \"workspace-app\") {\n kindBoost = 8;\n primary.push(item.name, item.appId, item.targetId);\n secondary.push(item.description ?? \"\");\n } else if (item.kind === \"file\") {\n primary.push(item.name);\n secondary.push(item.path, item.directoryPath);\n } else if (item.kind === \"session\") {\n primary.push(item.title);\n secondary.push(\n item.name,\n item.initiatorName,\n item.agentName,\n item.inputPreview ?? \"\",\n item.summaryPreview ?? \"\"\n );\n } else if (item.kind === \"workspace-issue\") {\n primary.push(item.title, item.name);\n secondary.push(\n item.creatorName ?? \"\",\n item.status ?? \"\",\n item.contentPreview ?? \"\"\n );\n } else if (item.kind === \"workspace-app-factory\") {\n primary.push(item.name, item.jobId, item.targetId);\n secondary.push(item.action ?? \"\", item.contextPath ?? \"\");\n }\n\n const primaryScore = maxTextMatchScore(primary, query, {\n contains: 60,\n exact: 100,\n prefix: 90,\n wordPrefix: 80\n });\n const secondaryScore = maxTextMatchScore(secondary, query, {\n contains: 25,\n exact: 60,\n prefix: 50,\n wordPrefix: 40\n });\n const score = Math.max(primaryScore, secondaryScore);\n return score > 0 ? score + kindBoost : 0;\n}\n\nfunction maxTextMatchScore(\n values: readonly string[],\n query: string,\n scores: {\n contains: number;\n exact: number;\n prefix: number;\n wordPrefix: number;\n }\n): number {\n return values.reduce(\n (bestScore, value) =>\n Math.max(bestScore, textMatchScore(value, query, scores)),\n 0\n );\n}\n\nfunction textMatchScore(\n value: string,\n query: string,\n scores: {\n contains: number;\n exact: number;\n prefix: number;\n wordPrefix: number;\n }\n): number {\n const normalized = normalizeQuery(value).toLowerCase();\n if (!normalized) {\n return 0;\n }\n if (normalized === query) {\n return scores.exact;\n }\n if (normalized.startsWith(query)) {\n return scores.prefix;\n }\n if (normalized.split(/[^a-z0-9]+/i).some((word) => word.startsWith(query))) {\n return scores.wordPrefix;\n }\n return normalized.includes(query) ? scores.contains : 0;\n}\n\nfunction providerItemToAgentMentionItem(input: {\n currentUserId: string;\n providerId: string;\n insertResult: AgentContextMentionInsertResult;\n label: string;\n subtitle: string;\n workspaceId: string;\n}): AgentContextMentionItem | null {\n const label = compactText(input.label);\n if (!label) {\n return null;\n }\n if (input.insertResult.kind === \"markdown-link\") {\n const href = input.insertResult.href.trim();\n return {\n kind: \"file\",\n href,\n path: href,\n name: label,\n entryKind: href.endsWith(\"/\") ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromProviderWorkspaceFileHref(href)\n };\n }\n if (input.insertResult.kind !== \"mention\") {\n return null;\n }\n\n const mention = input.insertResult.mention;\n const targetId = mention.entityId.trim();\n if (!targetId) {\n return null;\n }\n const scope = normalizeMentionScope(mention.scope);\n const presentation = mention.presentation ?? {};\n const workspaceId = scope.workspaceId || input.workspaceId;\n if (\n input.providerId === FILE_PROVIDER_ID ||\n input.providerId === AGENT_GENERATED_FILE_PROVIDER_ID\n ) {\n return {\n kind: \"file\",\n href: buildAgentGenericMentionHref(input.providerId, targetId, scope),\n path: targetId,\n name: label,\n entryKind: targetId.endsWith(\"/\") ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromProviderWorkspaceFileHref(targetId),\n thumbnailUrl: presentation.thumbnailUrl?.trim() || undefined\n };\n }\n if (input.providerId === WORKSPACE_ISSUE_PROVIDER_ID) {\n return {\n kind: \"workspace-issue\",\n href: buildAgentWorkspaceIssueMentionHref(workspaceId, targetId, {\n topicId: scope.topicId\n }),\n workspaceId,\n targetId,\n topicId: scope.topicId,\n name: label,\n title: label,\n status: presentation.status?.trim() || undefined,\n contentPreview:\n compactText(presentation.description) ||\n compactText(input.subtitle) ||\n undefined\n };\n }\n if (input.providerId === WORKSPACE_APP_PROVIDER_ID) {\n const appId = targetId;\n return {\n kind: \"workspace-app\",\n href: buildAgentWorkspaceAppMentionHref(workspaceId, appId),\n workspaceId,\n targetId: appId,\n appId,\n name: label,\n description:\n compactText(presentation.description) ||\n compactText(presentation.subtitle) ||\n compactText(input.subtitle) ||\n undefined,\n iconUrl: presentation.iconUrl?.trim() || undefined\n };\n }\n if (input.providerId === AGENT_SESSION_PROVIDER_ID) {\n const agentName = presentation.subtitle?.trim() || \"\";\n const title = normalizeAgentSessionMentionTitle(label) || label;\n const description = compactText(presentation.description);\n const summaryPreview =\n description || compactText(input.subtitle) || undefined;\n return {\n kind: \"session\",\n href: buildAgentSessionMentionHref(workspaceId, targetId),\n workspaceId,\n targetId,\n name: label,\n title,\n scope: mentionSessionScope({\n currentUserId: input.currentUserId,\n rawScope: scope.scope,\n userId: scope.userId\n }),\n initiatorName: \"\",\n agentName,\n status: presentation.status?.trim() || undefined,\n inputPreview: description || undefined,\n summaryPreview\n };\n }\n return null;\n}\n\nfunction normalizeMentionScope(\n scope?: Readonly<Record<string, string>>\n): Partial<Record<string, string>> {\n return Object.fromEntries(\n Object.entries(scope ?? {})\n .map(([key, value]) => [key.trim(), value.trim()] as const)\n .filter(([key, value]) => key.length > 0 && value.length > 0)\n );\n}\n\nfunction mentionSessionScope(input: {\n currentUserId: string;\n rawScope: string | undefined;\n userId?: string;\n}): Extract<AgentContextMentionItem, { kind: \"session\" }>[\"scope\"] {\n const rawScope = input.rawScope?.trim() ?? \"\";\n if (rawScope === \"my_sessions\" || rawScope === \"collab_sessions\") {\n return rawScope;\n }\n return input.userId && input.userId === input.currentUserId\n ? \"my_sessions\"\n : \"collab_sessions\";\n}\n\nfunction dirnameFromProviderWorkspaceFileHref(href: string): string {\n const normalized = href.replace(/\\/+$/, \"\");\n const index = normalized.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalized.slice(0, index);\n}\n","import {\n normalizeAgentActivityDisplayStatus,\n type AgentActivityDisplayStatus\n} from \"@tutti-os/agent-activity-core\";\nimport {\n MentionPalette,\n flattenMentionPaletteEntries,\n issueMentionStatusTone,\n renderMentionRow,\n type MentionPaletteEntry,\n type MentionPaletteState,\n type MentionPaletteTheme,\n type MentionRowClassNames,\n type MentionRowItem,\n type MentionRowStatusTag,\n type MentionRowStatusTone\n} from \"@tutti-os/ui-rich-text/at-panel\";\nimport { Spinner } from \"../../app/renderer/components/ui/spinner\";\nimport { userAvatarPlaceholderUrl } from \"../../shared/userAvatarPlaceholder\";\nimport { translate } from \"../../i18n/index\";\nimport { managedAgentRoundedIconUrl } from \"../../shared/managedAgentIcons\";\nimport { workspaceAgentActivityStatusLabel } from \"../../shared/workspaceAgentActivityStatusLabel\";\nimport { roomIssueStatusLabel } from \"../../shared/roomIssueStatusLabel\";\nimport {\n resolveAgentMentionFileThumbnailUrl,\n resolveAgentMentionFileVisualKind\n} from \"../shared/mentionFilePresentation\";\nimport {\n agentMentionEmptyGroupLabel,\n agentMentionFilterLabel,\n agentMentionGroupLabel\n} from \"./AgentMentionLabels\";\nimport {\n AGENT_MENTION_FILTER_TAB_ORDER,\n mentionGroupExpandCount\n} from \"./agentMentionSearchHelpers\";\nimport {\n type AgentMentionGroup,\n type AgentMentionBrowseCategory,\n type AgentMentionFilterId,\n type AgentMentionGroupId,\n type AgentMentionSearchState\n} from \"./AgentMentionSearchController\";\nimport { agentGeneratedMentionItemKey } from \"./agentMentionAgentGeneratedFilesPresentation\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\n\nexport interface AgentMentionPaletteEntry {\n key: string;\n type: \"category\" | \"item\" | \"expand\";\n categoryId?: AgentMentionBrowseCategory[\"id\"];\n groupId?: AgentMentionGroupId;\n item?: AgentContextMentionItem;\n}\n\nexport interface AgentFileMentionPaletteProps {\n state: AgentMentionSearchState;\n highlightedKey: string | null;\n label: string;\n loadingLabel: string;\n emptyLabel: string;\n errorLabel: string;\n tabHintLabel: string;\n maxHeightPx: number;\n shouldCenterHighlightedItem?: boolean;\n onHighlightChange: (key: string) => void;\n onSelectItem: (entry: AgentContextMentionItem) => void;\n onSelectCategory: (categoryId: AgentMentionBrowseCategory[\"id\"]) => void;\n onSelectFilter: (filter: AgentMentionFilterId) => void;\n onExpandGroup: (groupId: AgentMentionGroupId) => void;\n onCycleFilter: () => void;\n onMoveSelection: (delta: 1 | -1) => void;\n}\n\nconst AGENT_MENTION_PALETTE_THEME: MentionPaletteTheme = {\n classNames: {\n palette: \"agent-gui-node__mention-palette\",\n header: \"agent-gui-node__mention-palette-header\",\n footer: \"agent-gui-node__mention-palette-footer\",\n tabs: \"agent-gui-node__mention-palette-tabs\",\n scrollRegion: \"agent-gui-node__mention-palette-scroll-region\",\n scrollbar:\n \"workspace-agents-status-panel__scrollbar agent-gui-node__mention-palette-scrollbar\",\n scrollbarThumb: \"workspace-agents-status-panel__scrollbar-thumb\",\n hint: \"agent-gui-node__mention-palette-hint\",\n hintItem: \"agent-gui-node__mention-palette-hint-item\",\n hintButton: \"agent-gui-node__mention-palette-hint-button\",\n hintSeparator: \"agent-gui-node__mention-palette-hint-separator\",\n shortcut: \"agent-gui-node__mention-palette-shortcut\",\n shortcutArrow: \"agent-gui-node__mention-palette-shortcut--arrow\",\n shortcutButton: \"agent-gui-node__mention-palette-shortcut-button\",\n shortcutGroup: \"agent-gui-node__mention-palette-shortcut-group\"\n },\n testIds: {\n emptyState: \"agent-gui-mention-palette-empty-state\",\n hint: \"agent-gui-mention-palette-hint\",\n scrollbar: \"agent-gui-mention-palette-scrollbar\",\n loadingSpinner: \"agent-mention-loading-spinner\"\n },\n groupDividerAttribute: \"data-agent-mention-group-divider\"\n};\n\n/**\n * The agent composer's existing structural row class names. Passing these to\n * {@link renderMentionRow} keeps the rendered DOM byte-identical to the\n * pre-refactor markup (the agent stylesheet `agentactivity.css` owns these\n * rules and the agent spec greps them), while the shared component defaults to\n * package-owned `rich-text-at-mention-*` names for other surfaces.\n */\nconst AGENT_MENTION_ROW_CLASS_NAMES: MentionRowClassNames = {\n fileIcon: \"agent-gui-node__mention-file-icon\",\n fileThumb: \"agent-gui-node__mention-file-thumb\",\n kindIcon: \"tsh-agent-object-token__kind-icon\",\n avatarImgUserPlaceholder:\n \"workspace-agents-status-panel__avatar-img--user-placeholder\"\n};\n\n/**\n * Stable per-item key suffix. The shared shell composes the full entry key as\n * `${group.id}:${agentMentionItemKey(item)}`, matching the agent's historical\n * `${group.id}:${item.kind}:${...}` format so highlight keys stay compatible.\n */\nfunction agentMentionItemKey(item: AgentContextMentionItem): string {\n return `${item.kind}:${\n item.kind === \"file\" ? agentGeneratedMentionItemKey(item) : item.targetId\n }`;\n}\n\nexport function flattenAgentMentionPaletteEntries(\n state: AgentMentionSearchState\n): AgentMentionPaletteEntry[] {\n return flattenMentionPaletteEntries(state, (item) =>\n agentMentionItemKey(item)\n ).map((entry: MentionPaletteEntry): AgentMentionPaletteEntry => {\n if (entry.type === \"item\") {\n const item =\n entry.groupId !== undefined && entry.itemIndex !== undefined\n ? state.groups.find((group) => group.id === entry.groupId)?.items[\n entry.itemIndex\n ]\n : undefined;\n return {\n key: entry.key,\n type: \"item\",\n groupId: entry.groupId as AgentMentionGroupId | undefined,\n item\n };\n }\n return {\n key: entry.key,\n type: entry.type,\n categoryId: entry.categoryId as AgentMentionFilterId | undefined,\n groupId: entry.groupId as AgentMentionGroupId | undefined\n };\n });\n}\n\nexport function groupStartKeys(state: AgentMentionSearchState): string[] {\n if (state.mode === \"browse\") {\n return state.categories.map((category) => `category:${category.id}`);\n }\n return state.groups\n .map((group) => {\n const firstItem = group.items[0];\n if (firstItem) {\n return `${group.id}:${firstItem.kind}:${firstItem.kind === \"file\" ? firstItem.path : firstItem.targetId}`;\n }\n if (group.hasMore) {\n return `expand:${group.id}`;\n }\n return null;\n })\n .filter((key): key is string => key !== null);\n}\n\nexport function AgentFileMentionPalette({\n state,\n highlightedKey,\n label,\n loadingLabel,\n emptyLabel,\n errorLabel,\n tabHintLabel,\n maxHeightPx,\n shouldCenterHighlightedItem = false,\n onHighlightChange,\n onSelectItem,\n onSelectCategory,\n onSelectFilter,\n onExpandGroup,\n onCycleFilter,\n onMoveSelection\n}: AgentFileMentionPaletteProps): React.JSX.Element {\n \"use memo\";\n const filter = state.filter as AgentMentionFilterId;\n const highlightedBrowseCategory = highlightedKey?.startsWith(\"category:\")\n ? highlightedKey.slice(\"category:\".length)\n : null;\n const browseDisplayFilter = isBrowseCategoryId(highlightedBrowseCategory)\n ? highlightedBrowseCategory\n : filter;\n const showBrowseHint = shouldShowBrowseSearchHint({\n browseFilter: filter,\n groups: state.groups,\n highlightedBrowseCategory,\n mode: state.mode\n });\n\n // Browse mode carries its own category list (with labels); results mode tabs\n // are the fixed agent filter order. The shared shell renders a single tab\n // source, so resolve the right one here.\n const categories =\n state.mode === \"browse\"\n ? state.categories\n : AGENT_MENTION_FILTER_TAB_ORDER.map((id) => ({\n id,\n label: agentMentionFilterLabel(id)\n }));\n\n // When the agent wants the single keyboard browse hint we hand the shell an\n // empty group list so it renders its (keyboard-icon) empty state with our\n // computed hint copy. Otherwise we map the real groups, decorating each with\n // the agent-specific label / empty / expand / spacing chrome.\n const shellState: MentionPaletteState<AgentContextMentionItem> =\n showBrowseHint\n ? { ...state, categories, groups: [] }\n : {\n ...state,\n categories,\n groups: state.groups.map((group, index) =>\n decorateMentionGroup(\n group,\n index,\n state.groups,\n filter,\n state.query\n )\n )\n };\n\n const emptyLabelForShell = showBrowseHint\n ? browseHintForFilter(browseDisplayFilter)\n : resolveMentionPaletteEmptyLabel({\n emptyLabel,\n filter,\n mode: state.mode,\n query: state.query\n });\n\n const showFileSearchMoreHint = shouldShowFileSearchMoreHint({\n filter,\n groups: state.groups,\n mode: state.mode,\n query: state.query\n });\n\n return (\n <MentionPalette<AgentContextMentionItem>\n state={shellState}\n highlightedKey={highlightedKey}\n getItemKey={agentMentionItemKey}\n renderItem={(item) =>\n renderMentionRow(agentMentionItemToRowItem(item), {\n classNames: AGENT_MENTION_ROW_CLASS_NAMES,\n dataAttributeMode: \"agent\"\n })\n }\n labels={{\n loading: loadingLabel,\n empty: emptyLabelForShell,\n error: errorLabel,\n tabHint: tabHintLabel,\n listbox: label\n }}\n hintLabels={{\n cycleFilter: translate(\"agentHost.agentGui.fileMentionSwitchCategory\"),\n moveSelection: translate(\n \"agentHost.agentGui.fileMentionSwitchSelection\"\n )\n }}\n maxHeightPx={maxHeightPx}\n scrollHighlightedIntoViewCentered={shouldCenterHighlightedItem}\n loadingBanner={<MentionPaletteLoadingBanner label={loadingLabel} />}\n theme={AGENT_MENTION_PALETTE_THEME}\n renderListFooter={\n showFileSearchMoreHint ? () => <MentionFileSearchMoreHint /> : undefined\n }\n onHighlightChange={onHighlightChange}\n onSelectItem={(item) => onSelectItem(item)}\n onSelectCategory={(categoryId) =>\n onSelectCategory(categoryId as AgentMentionBrowseCategory[\"id\"])\n }\n onSelectFilter={(nextFilter) =>\n onSelectFilter(nextFilter as AgentMentionFilterId)\n }\n onExpandGroup={(groupId) => onExpandGroup(groupId as AgentMentionGroupId)}\n onCycleFilter={() => onCycleFilter()}\n onMoveSelection={onMoveSelection}\n />\n );\n}\n\nexport const AgentContextMentionPalette = AgentFileMentionPalette;\nexport type AgentContextMentionPaletteProps = AgentFileMentionPaletteProps;\n\n/**\n * Map a controller group onto the shared shell group, layering in the\n * agent-specific chrome the generic shell intentionally omits: translated\n * group / empty / expand labels, file-search chrome suppression, and the extra\n * top margin between the \"my sessions\" and \"collab sessions\" groups.\n */\nfunction decorateMentionGroup(\n group: AgentMentionGroup,\n index: number,\n groups: ReadonlyArray<AgentMentionGroup>,\n filter: AgentMentionFilterId,\n query: string\n): AgentMentionGroup {\n const groupId = group.id as AgentMentionGroupId;\n const suppressChrome = shouldSuppressFileSearchGroupChrome(filter, query);\n const followsMySessions =\n groupId === \"collab_sessions\" &&\n (groups[index - 1]?.id as AgentMentionGroupId) === \"my_sessions\";\n const showLabel = shouldRenderMentionGroupLabel({\n filter,\n groupCount: groups.length,\n groupId,\n query\n });\n return {\n ...group,\n label: showLabel ? agentMentionGroupLabel(groupId) : undefined,\n emptyLabel: suppressChrome\n ? undefined\n : agentMentionEmptyGroupLabel(groupId, query),\n expandLabel: group.hasMore\n ? translate(\"agentHost.agentGui.contextPickerExpandMore\", {\n count: mentionGroupExpandCount(group, filter)\n })\n : undefined,\n sectionClassName: followsMySessions ? \"mt-2\" : undefined,\n hideTopDivider: suppressChrome\n };\n}\n\nfunction MentionPaletteLoadingBanner({\n label\n}: {\n label: string;\n}): React.JSX.Element {\n \"use memo\";\n return (\n <div\n className=\"flex items-center gap-2 border-b border-[var(--line-1)] px-3 py-2 text-[13px] font-medium text-[var(--text-secondary)]\"\n data-testid=\"agent-mention-loading-banner\"\n >\n <Spinner\n size={14}\n className=\"text-[var(--text-secondary)]\"\n testId=\"agent-mention-loading-spinner\"\n />\n <span>{label}</span>\n </div>\n );\n}\n\nfunction MentionFileSearchMoreHint(): React.JSX.Element {\n \"use memo\";\n return (\n <p\n className=\"px-3 pb-1 pt-2 text-center text-[13px] leading-5 text-[var(--text-tertiary)]\"\n data-agent-mention-file-search-hint=\"true\"\n >\n {translate(\"agentHost.agentGui.mentionFileSearchMoreHint\")}\n </p>\n );\n}\n\nfunction shouldSuppressFileSearchGroupChrome(\n filter: AgentMentionFilterId,\n query: string\n): boolean {\n return filter === \"file\" && query.trim().length > 0;\n}\n\nfunction resolveMentionPaletteEmptyLabel(input: {\n emptyLabel: string;\n filter: AgentMentionFilterId;\n mode: AgentMentionSearchState[\"mode\"];\n query: string;\n}): string {\n if (\n input.mode === \"results\" &&\n input.filter === \"file\" &&\n input.query.trim().length > 0\n ) {\n return translate(\"agentHost.agentGui.mentionNoMatchingFiles\");\n }\n return input.emptyLabel;\n}\n\nfunction shouldRenderMentionGroupLabel(input: {\n filter: AgentMentionFilterId;\n groupCount: number;\n groupId: AgentMentionGroupId;\n query: string;\n}): boolean {\n if (shouldSuppressFileSearchGroupChrome(input.filter, input.query)) {\n return false;\n }\n if (input.filter === \"all\" || input.groupCount !== 1) {\n return true;\n }\n return (\n agentMentionGroupLabel(input.groupId) !==\n agentMentionFilterLabel(input.filter)\n );\n}\n\n/**\n * Resolve an agent mention item into the shared, display-ready\n * {@link MentionRowItem} view-model the generic {@link renderMentionRow}\n * consumes. All agent-specific bits — i18n via {@link translate}, the user\n * avatar placeholder asset, the managed-agent rounded icon, and the activity /\n * issue status labels — are resolved here so the shared renderer stays pure.\n */\nfunction agentMentionItemToRowItem(\n item: AgentContextMentionItem\n): MentionRowItem {\n if (item.kind === \"file\") {\n const visualKind = resolveAgentMentionFileVisualKind({\n entryKind: item.entryKind,\n href: item.href,\n mentionNavigation: item.mentionNavigation,\n name: item.name,\n path: item.path\n });\n const childCountLabel =\n item.mentionNavigation === \"agent-generated-folder\" &&\n typeof item.childCount === \"number\" &&\n item.childCount > 0\n ? translate(\"agentHost.agentGui.mentionAgentGeneratedFolderFileCount\", {\n count: item.childCount\n })\n : null;\n return {\n kind: \"file\",\n name: item.name,\n visualKind,\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl(item) ?? null,\n childCountLabel,\n entryKind: item.entryKind,\n mentionNavigation: item.mentionNavigation\n };\n }\n\n if (item.kind === \"session\") {\n return {\n kind: \"session\",\n participant: `${item.initiatorName} & ${item.agentName}`,\n summary: item.title,\n userAvatarUrl: item.initiatorAvatarUrl ?? null,\n userAvatarPlaceholderUrl,\n agentIconUrl: managedAgentRoundedIconUrl(\n mentionSessionAgentProvider(item) ?? item.agentName\n ),\n statusTag: agentSessionStatusTag(item.status)\n };\n }\n\n if (item.kind === \"workspace-app\") {\n return {\n kind: \"app\",\n name: item.name,\n description: item.description ?? null,\n iconUrl: item.iconUrl ?? null\n };\n }\n\n if (item.kind === \"workspace-app-factory\") {\n return {\n kind: \"app-factory\",\n name: item.name\n };\n }\n\n return {\n kind: \"issue\",\n title: item.title,\n creatorName: item.creatorName ?? null,\n statusTag: agentIssueStatusTag(item.status)\n };\n}\n\nfunction mentionSessionAgentProvider(\n item: Extract<AgentContextMentionItem, { kind: \"session\" }>\n): string | null {\n const queryStart = item.href.indexOf(\"?\");\n if (queryStart < 0) {\n return null;\n }\n return new URLSearchParams(item.href.slice(queryStart + 1)).get(\"provider\");\n}\n\nfunction agentSessionStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n const activityStatus = normalizeAgentActivityDisplayStatus(status);\n return {\n label: workspaceAgentActivityStatusLabel(activityStatus),\n tone: mentionStatusTone(activityStatus),\n pulse: activityStatus === \"working\" || activityStatus === \"waiting\",\n variant: \"activity\",\n dataStatus: activityStatus\n };\n}\n\nfunction agentIssueStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n return {\n label: roomIssueStatusLabel(status),\n tone: issueMentionStatusTone(status),\n variant: \"issue\",\n dataStatus: status.trim().toLowerCase() || \"not_started\"\n };\n}\n\nfunction mentionStatusTone(\n status: AgentActivityDisplayStatus\n): MentionRowStatusTone {\n if (status === \"working\") {\n return \"blue\";\n }\n if (status === \"waiting\" || status === \"canceled\") {\n return \"amber\";\n }\n if (status === \"completed\" || status === \"idle\") {\n return \"green\";\n }\n if (status === \"failed\") {\n return \"red\";\n }\n return \"neutral\";\n}\n\nfunction browseHintForFilter(filter: AgentMentionFilterId): string {\n if (filter === \"all\") {\n return translate(\"agentHost.agentGui.contextPickerBrowseAllHint\");\n }\n switch (filter) {\n case \"app\":\n return translate(\"agentHost.agentGui.contextPickerBrowseAppHint\");\n case \"file\":\n return translate(\"agentHost.agentGui.contextPickerBrowseFileHint\");\n case \"session\":\n return translate(\"agentHost.agentGui.contextPickerBrowseSessionHint\");\n case \"issue\":\n return translate(\"agentHost.agentGui.contextPickerBrowseIssueHint\");\n }\n}\n\nfunction isBrowseCategoryId(\n value: string | null\n): value is AgentMentionFilterId {\n return (\n value === \"all\" ||\n value === \"app\" ||\n value === \"file\" ||\n value === \"session\" ||\n value === \"issue\"\n );\n}\n\nfunction hasInteractiveGroupEntries(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n return groups.some((group) => group.items.length > 0 || group.hasMore);\n}\n\nfunction isFileBrowseGroupsOnlyEmpty(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n const fileGroups = groups.filter(\n (group) =>\n group.id === \"opened_files\" || group.id === \"agent_generated_files\"\n );\n if (fileGroups.length === 0) {\n return false;\n }\n return fileGroups.every(\n (group) => group.items.length === 0 && !group.hasMore\n );\n}\n\nfunction hasVisibleFileGroupEntries(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n return groups.some(\n (group) =>\n (group.id === \"files\" ||\n group.id === \"opened_files\" ||\n group.id === \"agent_generated_files\") &&\n (group.items.length > 0 || group.hasMore)\n );\n}\n\nfunction shouldShowFileSearchMoreHint(input: {\n filter: AgentMentionFilterId;\n groups: ReadonlyArray<AgentMentionGroup>;\n mode: AgentMentionSearchState[\"mode\"];\n query: string;\n}): boolean {\n if (input.filter !== \"file\" || input.query.trim()) {\n return false;\n }\n if (input.mode !== \"browse\" && input.mode !== \"results\") {\n return false;\n }\n return hasVisibleFileGroupEntries(input.groups);\n}\n\nfunction shouldShowBrowseSearchHint(input: {\n browseFilter: AgentMentionFilterId;\n groups: ReadonlyArray<AgentMentionGroup>;\n highlightedBrowseCategory: string | null;\n mode: AgentMentionSearchState[\"mode\"];\n}): boolean {\n if (input.mode !== \"browse\" || hasInteractiveGroupEntries(input.groups)) {\n return false;\n }\n if (input.groups.length === 0) {\n return true;\n }\n if (\n input.highlightedBrowseCategory !== null &&\n input.highlightedBrowseCategory !== input.browseFilter\n ) {\n return true;\n }\n return (\n input.browseFilter === \"file\" && isFileBrowseGroupsOnlyEmpty(input.groups)\n );\n}\n","import { translate, type TranslateFn } from \"../i18n/index\";\n\nexport function roomIssueStatusLabel(status: string, t?: TranslateFn): string {\n const translateFn = t ?? translate;\n switch (status) {\n case \"not_started\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusNotStarted\");\n case \"running\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusRunning\");\n case \"in_progress\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusInProgress\");\n case \"pending_acceptance\":\n return translateFn(\n \"agentHost.roomIssueNode.issueStatusPendingAcceptance\"\n );\n case \"completed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCompleted\");\n case \"failed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusFailed\");\n case \"canceled\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCanceled\");\n default:\n return (\n status || translateFn(\"agentHost.roomIssueNode.issueStatusUnknown\")\n );\n }\n}\n"],"mappings":"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","names":["AGENT_GENERATED_FILE_PROVIDER_ID","AGENT_SESSION_PROVIDER_ID","FILE_PROVIDER_ID","WORKSPACE_APP_PROVIDER_ID","WORKSPACE_ISSUE_PROVIDER_ID"]}
|
|
1
|
+
{"version":3,"sources":["../agent-gui/agentGuiNode/agentMentionAgentGeneratedFilesPresentation.ts","../agent-gui/agentGuiNode/agentMentionSearchDiagnostics.ts","../agent-gui/agentGuiNode/AgentMentionLabels.ts","../agent-gui/agentGuiNode/agentMentionSearchHelpers.ts","../agent-gui/agentGuiNode/AgentMentionSearchController.ts","../agent-gui/agentGuiNode/AgentFileMentionPalette.tsx","../shared/roomIssueStatusLabel.ts"],"sourcesContent":["import { translate } from \"../../i18n/index\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport type { AgentMentionFileItem } from \"./agentRichText/agentFileMentionExtension\";\n\nconst AGENT_GENERATED_FOLDER_MIN_FILES = 2;\n\nexport function presentAgentGeneratedFileMentionItems(input: {\n files: readonly AgentContextMentionItem[];\n browsePath: string | null;\n query: string;\n}): AgentContextMentionItem[] {\n const fileItems = input.files.filter(\n (item): item is AgentMentionFileItem => item.kind === \"file\"\n );\n if (input.query.trim()) {\n return fileItems;\n }\n if (input.browsePath) {\n return presentAgentGeneratedBrowseFolder(fileItems, input.browsePath);\n }\n return presentAgentGeneratedRootFolders(fileItems);\n}\n\nfunction presentAgentGeneratedRootFolders(\n files: readonly AgentMentionFileItem[]\n): AgentMentionFileItem[] {\n const filesByDirectory = new Map<string, AgentMentionFileItem[]>();\n for (const file of files) {\n const directoryPath = resolveAgentGeneratedFileDirectoryPath(file);\n const group = filesByDirectory.get(directoryPath);\n if (group) {\n group.push(file);\n continue;\n }\n filesByDirectory.set(directoryPath, [file]);\n }\n\n const presented: AgentMentionFileItem[] = [];\n for (const [directoryPath, group] of filesByDirectory) {\n if (group.length >= AGENT_GENERATED_FOLDER_MIN_FILES) {\n presented.push(createAgentGeneratedFolderItem(directoryPath, group));\n continue;\n }\n presented.push(...group);\n }\n\n return sortAgentGeneratedMentionItems(presented);\n}\n\nfunction presentAgentGeneratedBrowseFolder(\n files: readonly AgentMentionFileItem[],\n browsePath: string\n): AgentMentionFileItem[] {\n const normalizedBrowsePath = normalizeAgentGeneratedDirectoryPath(browsePath);\n const children = files.filter(\n (file) =>\n resolveAgentGeneratedFileDirectoryPath(file) === normalizedBrowsePath\n );\n return [\n createAgentGeneratedFolderBackItem(normalizedBrowsePath),\n ...sortAgentGeneratedMentionItems(children)\n ];\n}\n\nfunction createAgentGeneratedFolderItem(\n directoryPath: string,\n files: readonly AgentMentionFileItem[]\n): AgentMentionFileItem {\n const normalizedPath = normalizeAgentGeneratedDirectoryPath(directoryPath);\n const name =\n normalizedPath.split(\"/\").filter(Boolean).at(-1) ?? normalizedPath;\n return {\n kind: \"file\",\n href: `${normalizedPath}/`,\n path: normalizedPath,\n name,\n entryKind: \"directory\",\n directoryPath: parentAgentGeneratedDirectoryPath(normalizedPath),\n mentionNavigation: \"agent-generated-folder\",\n childCount: files.length\n };\n}\n\nfunction createAgentGeneratedFolderBackItem(\n browsePath: string\n): AgentMentionFileItem {\n return {\n kind: \"file\",\n href: \"\",\n path: browsePath,\n name: translate(\"agentHost.agentGui.mentionAgentGeneratedFolderBack\"),\n entryKind: \"unknown\",\n directoryPath: parentAgentGeneratedDirectoryPath(browsePath),\n mentionNavigation: \"agent-generated-folder-back\"\n };\n}\n\nfunction resolveAgentGeneratedFileDirectoryPath(\n file: AgentMentionFileItem\n): string {\n const directoryPath = file.directoryPath?.trim();\n if (directoryPath) {\n return normalizeAgentGeneratedDirectoryPath(directoryPath);\n }\n return parentAgentGeneratedDirectoryPath(file.path);\n}\n\nfunction parentAgentGeneratedDirectoryPath(path: string): string {\n const normalized = normalizeAgentGeneratedDirectoryPath(path);\n const index = normalized.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalized.slice(0, index);\n}\n\nfunction normalizeAgentGeneratedDirectoryPath(path: string): string {\n return path.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n}\n\nfunction sortAgentGeneratedMentionItems(\n items: readonly AgentMentionFileItem[]\n): AgentMentionFileItem[] {\n return [...items].sort((left, right) =>\n left.name.localeCompare(right.name, undefined, { sensitivity: \"base\" })\n );\n}\n\nexport function agentGeneratedMentionItemKey(\n item: AgentContextMentionItem\n): string {\n if (item.kind !== \"file\") {\n return item.targetId;\n }\n if (item.mentionNavigation) {\n return `${item.mentionNavigation}:${item.path}`;\n }\n return item.path;\n}\n","import type {\n AgentMentionFilterId,\n AgentMentionGroup\n} from \"./AgentMentionSearchController\";\nimport { AGENT_CONTEXT_MENTION_PROVIDER_IDS } from \"./agentContextMentionProvider\";\n\nexport type AgentMentionProviderDiagnosticStatus =\n | \"success\"\n | \"timeout\"\n | \"error\"\n | \"missing\";\n\nexport interface AgentMentionProviderQueryDiagnostic {\n durationMs: number;\n errorKind?: string;\n providerId: string;\n resultCount: number;\n status: AgentMentionProviderDiagnosticStatus;\n}\n\nexport interface AgentMentionSearchDiagnosticLog {\n debounceMs: number;\n durationMs: number;\n errorKind?: string;\n event: \"agent_gui.mention_search\";\n filter: AgentMentionFilterId;\n groupCount: number;\n itemCount: number;\n mode: \"browse\" | \"results\";\n providerResults: AgentMentionProviderQueryDiagnostic[];\n providerTimeoutMs: number;\n queryLength: number;\n requestId: number;\n status: \"ready\" | \"error\";\n workspaceId: string;\n}\n\nconst AGENT_MENTION_SEARCH_LOG_PREFIX = \"[agent-gui] mention-search\";\nconst {\n agentGeneratedFile: AGENT_GENERATED_FILE_PROVIDER_ID,\n agentSession: AGENT_SESSION_PROVIDER_ID,\n file: FILE_PROVIDER_ID,\n workspaceApp: WORKSPACE_APP_PROVIDER_ID,\n workspaceIssue: WORKSPACE_ISSUE_PROVIDER_ID\n} = AGENT_CONTEXT_MENTION_PROVIDER_IDS;\nconst AGENT_MENTION_PROVIDER_LOG_ORDER: readonly string[] = [\n FILE_PROVIDER_ID,\n AGENT_GENERATED_FILE_PROVIDER_ID,\n WORKSPACE_APP_PROVIDER_ID,\n WORKSPACE_ISSUE_PROVIDER_ID,\n AGENT_SESSION_PROVIDER_ID\n];\n\nexport function emitAgentMentionSearchDiagnostic(input: {\n debounceMs: number;\n diagnosticInfoLogger: (payload: AgentMentionSearchDiagnosticLog) => void;\n diagnosticNow: () => number;\n diagnosticSlowThresholdMs: number;\n error?: unknown;\n filter: AgentMentionFilterId;\n groups: readonly AgentMentionGroup[];\n mode: \"browse\" | \"results\";\n providerDiagnostics: readonly AgentMentionProviderQueryDiagnostic[];\n providerTimeoutMs: number;\n query: string;\n requestId: number;\n startedAt: number;\n status: \"ready\" | \"error\";\n workspaceId: string;\n}): void {\n const durationMs = elapsedAgentMentionSearchDiagnosticMs(\n input.diagnosticNow(),\n input.startedAt\n );\n const providerResults = orderAgentMentionProviderDiagnostics(\n input.providerDiagnostics\n );\n const hasProviderIssue = providerResults.some(\n (result) => result.status === \"timeout\" || result.status === \"error\"\n );\n if (\n input.status === \"ready\" &&\n !hasProviderIssue &&\n durationMs < input.diagnosticSlowThresholdMs\n ) {\n return;\n }\n const payload: AgentMentionSearchDiagnosticLog = {\n debounceMs: input.debounceMs,\n durationMs,\n ...(input.status === \"error\"\n ? { errorKind: agentMentionSearchErrorKind(input.error) }\n : {}),\n event: \"agent_gui.mention_search\",\n filter: input.filter,\n groupCount: input.groups.length,\n itemCount: input.groups.reduce((sum, group) => sum + group.items.length, 0),\n mode: input.mode,\n providerResults,\n providerTimeoutMs: input.providerTimeoutMs,\n queryLength: [...input.query].length,\n requestId: input.requestId,\n status: input.status,\n workspaceId: input.workspaceId\n };\n try {\n input.diagnosticInfoLogger(payload);\n } catch {\n // Diagnostic logging must never affect mention search state.\n }\n}\n\nexport async function queryAgentMentionProviderWithDiagnostics<T>(input: {\n diagnosticNow: () => number;\n diagnostics: AgentMentionProviderQueryDiagnostic[];\n fallback: T;\n providerId: string;\n providerTimeoutMs: number;\n query: ((abortSignal: AbortSignal) => Promise<T>) | null;\n resultCount: (result: T) => number;\n}): Promise<T> {\n if (!input.query) {\n input.diagnostics.push({\n durationMs: 0,\n providerId: input.providerId,\n resultCount: 0,\n status: \"missing\"\n });\n return input.fallback;\n }\n const startedAt = input.diagnosticNow();\n try {\n const { result, timedOut } = await runAgentMentionProviderQuery({\n fallback: input.fallback,\n providerTimeoutMs: input.providerTimeoutMs,\n query: input.query\n });\n input.diagnostics.push({\n durationMs: elapsedAgentMentionSearchDiagnosticMs(\n input.diagnosticNow(),\n startedAt\n ),\n providerId: input.providerId,\n resultCount: input.resultCount(result),\n status: timedOut ? \"timeout\" : \"success\"\n });\n return result;\n } catch (error) {\n input.diagnostics.push({\n durationMs: elapsedAgentMentionSearchDiagnosticMs(\n input.diagnosticNow(),\n startedAt\n ),\n errorKind: agentMentionSearchErrorKind(error),\n providerId: input.providerId,\n resultCount: 0,\n status: \"error\"\n });\n throw error;\n }\n}\n\nfunction elapsedAgentMentionSearchDiagnosticMs(\n now: number,\n startedAt: number\n): number {\n const durationMs = now - startedAt;\n if (!Number.isFinite(durationMs)) {\n return 0;\n }\n return Math.max(0, Math.round(durationMs));\n}\n\nfunction agentMentionSearchErrorKind(error: unknown): string {\n if (error instanceof Error && error.name.trim()) {\n return error.name.trim();\n }\n if (error === null) {\n return \"null\";\n }\n return typeof error;\n}\n\nexport function logAgentMentionSearchInfo(\n payload: AgentMentionSearchDiagnosticLog\n): void {\n console.info(AGENT_MENTION_SEARCH_LOG_PREFIX, JSON.stringify(payload));\n}\n\nfunction orderAgentMentionProviderDiagnostics(\n diagnostics: readonly AgentMentionProviderQueryDiagnostic[]\n): AgentMentionProviderQueryDiagnostic[] {\n return [...diagnostics].sort((left, right) => {\n const leftIndex = providerDiagnosticOrder(left.providerId);\n const rightIndex = providerDiagnosticOrder(right.providerId);\n return (\n leftIndex - rightIndex || left.providerId.localeCompare(right.providerId)\n );\n });\n}\n\nfunction providerDiagnosticOrder(providerId: string): number {\n const index = AGENT_MENTION_PROVIDER_LOG_ORDER.indexOf(providerId);\n return index === -1 ? AGENT_MENTION_PROVIDER_LOG_ORDER.length : index;\n}\n\nasync function runAgentMentionProviderQuery<T>(input: {\n fallback: T;\n providerTimeoutMs: number;\n query: (abortSignal: AbortSignal) => Promise<T>;\n}): Promise<{ result: T; timedOut: boolean }> {\n const abortController = new AbortController();\n let timedOut = false;\n const queryPromise = Promise.resolve().then(() =>\n input.query(abortController.signal)\n );\n const queryResultPromise = queryPromise.then(\n (result) => ({ result, timedOut: false }),\n (error) => {\n if (timedOut && abortController.signal.aborted) {\n return { result: input.fallback, timedOut: true };\n }\n throw error;\n }\n );\n\n if (\n input.providerTimeoutMs <= 0 ||\n !Number.isFinite(input.providerTimeoutMs)\n ) {\n return queryResultPromise;\n }\n\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const timeoutPromise = new Promise<{ result: T; timedOut: boolean }>(\n (resolve) => {\n timeout = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n resolve({ result: input.fallback, timedOut: true });\n }, input.providerTimeoutMs);\n }\n );\n\n try {\n return await Promise.race([queryResultPromise, timeoutPromise]);\n } finally {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n }\n}\n","import { translate } from \"../../i18n/index\";\nimport type {\n AgentMentionFilterId,\n AgentMentionGroupId\n} from \"./AgentMentionSearchController\";\n\nexport function agentMentionGroupLabel(groupId: AgentMentionGroupId): string {\n switch (groupId) {\n case \"apps\":\n return translate(\"agentHost.agentGui.mentionGroupApps\");\n case \"files\":\n return translate(\"agentHost.agentGui.mentionGroupFiles\");\n case \"opened_files\":\n return translate(\"agentHost.agentGui.mentionGroupOpenedFiles\");\n case \"agent_generated_files\":\n return translate(\"agentHost.agentGui.mentionGroupAgentGeneratedFiles\");\n case \"my_sessions\":\n return translate(\"agentHost.agentGui.mentionGroupMySessions\");\n case \"collab_sessions\":\n return translate(\"agentHost.agentGui.mentionGroupCollabSessions\");\n case \"issues\":\n return translate(\"agentHost.agentGui.mentionGroupIssues\");\n }\n}\n\nexport function agentMentionFilterLabel(filter: AgentMentionFilterId): string {\n switch (filter) {\n case \"all\":\n return translate(\"agentHost.agentGui.mentionFilterAll\");\n case \"app\":\n return translate(\"agentHost.agentGui.mentionFilterApp\");\n case \"file\":\n return translate(\"agentHost.agentGui.mentionFilterFile\");\n case \"session\":\n return translate(\"agentHost.agentGui.mentionFilterSession\");\n case \"issue\":\n return translate(\"agentHost.agentGui.mentionFilterIssue\");\n }\n}\n\nexport function agentMentionEmptyGroupLabel(\n groupId: AgentMentionGroupId,\n query: string\n): string {\n if (groupId === \"files\" || groupId === \"opened_files\") {\n return query.trim()\n ? translate(\"agentHost.agentGui.mentionNoMatchingFiles\")\n : translate(\"agentHost.agentGui.mentionEmptyDockFiles\");\n }\n if (groupId === \"agent_generated_files\") {\n return query.trim()\n ? translate(\"agentHost.agentGui.mentionNoMatchingFiles\")\n : translate(\"agentHost.agentGui.mentionEmptyAgentGeneratedFiles\");\n }\n if (groupId === \"apps\") {\n return translate(\"agentHost.agentGui.mentionEmptyApps\");\n }\n if (groupId === \"my_sessions\") {\n return translate(\"agentHost.agentGui.mentionEmptyMySessions\");\n }\n if (groupId === \"collab_sessions\") {\n return translate(\"agentHost.agentGui.mentionEmptyCollabSessions\");\n }\n return translate(\"agentHost.agentGui.mentionEmptyIssues\");\n}\n","import type { AgentHostUserInfo } from \"../../shared/contracts/dto\";\nimport { translate } from \"../../i18n/index\";\nimport { agentMentionEmptyGroupLabel } from \"./AgentMentionLabels\";\nimport {\n resolveWorkspaceAgentActivityTitle,\n resolveWorkspaceAgentActivityStatus\n} from \"../../shared/workspaceAgentActivityListViewModel\";\nimport { workspaceAgentProviderLabel } from \"../../shared/workspaceAgentProviderLabel\";\nimport { resolveDisplayableWorkspaceAgentSessionTitle } from \"../../shared/workspaceAgentSessionTitle\";\nimport { extractPlainTextWithoutFilesFromContent } from \"../../shared/richText/richTextDocument\";\nimport type {\n AgentContextMentionItem,\n AgentMentionScope,\n AgentMentionSessionItem\n} from \"./agentRichText/agentFileMentionExtension\";\nimport {\n buildAgentSessionMentionHref,\n normalizeAgentSessionMentionTitle\n} from \"./agentRichText/agentFileMentionExtension\";\nimport type {\n AgentMentionFilterId,\n AgentMentionGroup,\n AgentMentionGroupId\n} from \"./AgentMentionSearchController\";\nimport type {\n WorkspaceAgentActivityMessage,\n WorkspaceAgentActivitySession,\n WorkspaceAgentActivitySessionSummary\n} from \"../../shared/workspaceAgentActivityTypes\";\n\nexport function buildSessionMentionItem(input: {\n workspaceId: string;\n currentUserId: string;\n session: WorkspaceAgentActivitySession;\n summary: WorkspaceAgentActivitySessionSummary | null;\n userProfiles: Record<string, Pick<AgentHostUserInfo, \"name\" | \"avatar\">>;\n fallbackTitle?: string | null;\n}): AgentMentionSessionItem | null {\n const sessionUserId = input.session.userId?.trim() ?? \"\";\n const scope: AgentMentionScope =\n sessionUserId && sessionUserId === input.currentUserId\n ? \"my_sessions\"\n : \"collab_sessions\";\n const userProfile = sessionUserId\n ? input.userProfiles[sessionUserId]\n : undefined;\n const initiatorName = normalizeSessionInitiatorDisplayName(\n userProfile?.name ||\n sessionUserId ||\n translate(\"agentHost.agentGui.mentionCollaboratorFallback\")\n );\n const sessionProvider = input.session.provider?.trim() ?? \"\";\n const agentName = workspaceAgentProviderLabel(sessionProvider || \"unknown\");\n const inputPreview =\n compactText(input.summary?.latestUserRequirement) ||\n compactText(input.summary?.initialUserRequirement) ||\n firstSummaryItemText(input.summary?.latestTurn?.userItems) ||\n \"\";\n const summaryPreview =\n compactText(input.summary?.recentAgentReplies?.[0]) ||\n firstSummaryItemText(input.summary?.latestTurn?.agentItems) ||\n \"\";\n const sessionTitle = resolveDisplayableWorkspaceAgentSessionTitle(\n input.session\n );\n const fallbackTitle = compactText(input.fallbackTitle);\n const title =\n fallbackTitle ||\n sessionTitle ||\n inputPreview ||\n summaryPreview ||\n input.session.agentSessionId;\n if (!title) {\n return null;\n }\n const mentionTitle = normalizeAgentSessionMentionTitle(title);\n const status = resolveSessionDisplayStatus(input.session, input.summary);\n return {\n kind: \"session\",\n href: buildAgentSessionMentionHref(\n input.workspaceId,\n input.session.agentSessionId,\n sessionProvider\n ),\n workspaceId: input.workspaceId,\n targetId: input.session.agentSessionId,\n name: `${initiatorName} & ${agentName} ${mentionTitle}`.trim(),\n title: mentionTitle,\n scope,\n initiatorName,\n ...(userProfile?.avatar ? { initiatorAvatarUrl: userProfile.avatar } : {}),\n agentName,\n status,\n inputPreview,\n summaryPreview,\n updatedAtUnixMs:\n input.session.updatedAtUnixMs ??\n input.session.createdAtUnixMs ??\n Date.now()\n };\n}\n\nfunction normalizeSessionInitiatorDisplayName(value: string): string {\n const trimmed = value.trim();\n return trimmed.toLowerCase() === \"local\" ? \"User\" : trimmed;\n}\n\nexport function resolveSessionMentionMessageTitle(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[]\n): string {\n return compactText(\n resolveWorkspaceAgentActivityTitle(session, [...messages])\n );\n}\n\nfunction resolveSessionDisplayStatus(\n session: WorkspaceAgentActivitySession,\n summary: WorkspaceAgentActivitySessionSummary | null\n): string {\n const sessionStatus = resolveWorkspaceAgentActivityStatus(session);\n if (hasExplicitSessionStatus(session)) {\n return sessionStatus;\n }\n const status = (\n summary?.executionStatus?.currentOrFinalStatus ??\n summary?.currentOrFinalStatus ??\n session.status ??\n \"\"\n )\n .trim()\n .toLowerCase();\n if (status === \"waiting\") {\n return \"waiting\";\n }\n if (status === \"working\") {\n return \"working\";\n }\n if (status === \"completed\") {\n return \"completed\";\n }\n if (status === \"failed\") {\n return \"failed\";\n }\n return status\n ? resolveWorkspaceAgentActivityStatusFromSummary(status)\n : sessionStatus;\n}\n\nfunction hasExplicitSessionStatus(\n session: WorkspaceAgentActivitySession\n): boolean {\n return Boolean((session.status ?? \"\").trim());\n}\n\nfunction resolveWorkspaceAgentActivityStatusFromSummary(\n status: string\n): string {\n switch (status) {\n case \"waiting\":\n return \"waiting\";\n case \"working\":\n return \"working\";\n case \"completed\":\n return \"completed\";\n case \"canceled\":\n return \"canceled\";\n case \"failed\":\n return \"failed\";\n default:\n return \"idle\";\n }\n}\n\nfunction firstSummaryItemText(\n items: ReadonlyArray<{ content?: string }> | undefined\n): string {\n if (!items) {\n return \"\";\n }\n for (const item of items) {\n const text = compactText(item.content);\n if (text) {\n return text;\n }\n }\n return \"\";\n}\n\nexport function matchesSessionQuery(\n item: AgentContextMentionItem,\n rawQuery: string\n): boolean {\n if (item.kind !== \"session\") {\n return true;\n }\n const query = normalizeQuery(rawQuery);\n if (!query) {\n return true;\n }\n const haystack = [\n item.name,\n item.title,\n item.initiatorName,\n item.agentName,\n item.inputPreview ?? \"\",\n item.summaryPreview ?? \"\"\n ]\n .join(\"\\n\")\n .toLowerCase();\n return query\n .toLowerCase()\n .split(/\\s+/)\n .filter(Boolean)\n .every((token) => haystack.includes(token));\n}\n\nexport const AGENT_MENTION_FILTER_TAB_ORDER = [\n \"all\",\n \"session\",\n \"file\",\n \"issue\",\n \"app\"\n] as const satisfies readonly AgentMentionFilterId[];\n\nexport const DEFAULT_MENTION_ALL_TAB_PAGE_SIZE = 5;\nexport const DEFAULT_MENTION_GROUP_PAGE_SIZE = 10;\n\nexport function mentionGroupPageSize(\n filter: AgentMentionFilterId,\n _groupId: AgentMentionGroupId\n): number {\n return filter === \"all\"\n ? DEFAULT_MENTION_ALL_TAB_PAGE_SIZE\n : DEFAULT_MENTION_GROUP_PAGE_SIZE;\n}\n\nexport function mentionGroupExpandCount(\n group: AgentMentionGroup,\n filter: AgentMentionFilterId\n): number {\n const pageSize = mentionGroupPageSize(\n filter,\n group.id as AgentMentionGroupId\n );\n const remaining = Math.max(0, group.totalCount - group.visibleCount);\n return Math.min(pageSize, remaining);\n}\n\nexport function groupIdsForFilter(\n filter: AgentMentionFilterId\n): AgentMentionGroupId[] {\n switch (filter) {\n case \"app\":\n return [\"apps\"];\n case \"file\":\n return [\"opened_files\", \"agent_generated_files\"];\n case \"session\":\n return [\"my_sessions\"];\n case \"issue\":\n return [\"issues\"];\n case \"all\":\n default:\n return [\"my_sessions\", \"files\", \"issues\", \"apps\"];\n }\n}\n\nexport function shouldShowEmptyGroup(\n groupId: AgentMentionGroupId,\n filter: AgentMentionFilterId,\n query: string\n): boolean {\n const hasQuery = query.trim().length > 0;\n if (groupId === \"files\") {\n return filter === \"all\";\n }\n if (groupId === \"opened_files\" || groupId === \"agent_generated_files\") {\n return filter === \"file\" && !hasQuery;\n }\n if (groupId === \"apps\") {\n return filter === \"all\" || filter === \"app\";\n }\n if (groupId === \"my_sessions\") {\n return filter === \"all\" || filter === \"session\";\n }\n if (groupId === \"collab_sessions\") {\n return false;\n }\n return filter === \"all\" || filter === \"issue\";\n}\n\nexport function buildEmptyGroup(\n groupId: AgentMentionGroupId,\n query: string\n): AgentMentionGroup {\n return {\n id: groupId,\n items: [],\n totalCount: 0,\n visibleCount: 0,\n hasMore: false,\n emptyLabel: emptyGroupLabel(groupId, query)\n };\n}\n\nfunction emptyGroupLabel(groupId: AgentMentionGroupId, query: string): string {\n return agentMentionEmptyGroupLabel(groupId, query);\n}\n\nexport function shouldPrefetchBrowseFilter(\n filter: AgentMentionFilterId\n): filter is \"all\" | \"app\" | \"file\" | \"session\" | \"issue\" {\n return (\n filter === \"all\" ||\n filter === \"app\" ||\n filter === \"file\" ||\n filter === \"session\" ||\n filter === \"issue\"\n );\n}\n\nexport function filterForGroup(\n groupId: AgentMentionGroupId\n): Exclude<AgentMentionFilterId, \"all\"> {\n switch (groupId) {\n case \"apps\":\n return \"app\";\n case \"files\":\n case \"opened_files\":\n case \"agent_generated_files\":\n return \"file\";\n case \"my_sessions\":\n return \"session\";\n case \"collab_sessions\":\n return \"session\";\n case \"issues\":\n return \"issue\";\n }\n}\n\ntype AgentMentionRawGroupId = Exclude<AgentMentionGroupId, \"files\">;\n\nexport function resolveMentionGroupItems(\n groupId: AgentMentionGroupId,\n rawGroups: Record<AgentMentionRawGroupId, AgentContextMentionItem[]>\n): AgentContextMentionItem[] {\n if (groupId === \"files\") {\n return [...rawGroups.opened_files, ...rawGroups.agent_generated_files];\n }\n return rawGroups[groupId] ?? [];\n}\n\nexport function resolveMentionGroupTotalCount(\n groupId: AgentMentionGroupId,\n totalCounts: Partial<Record<AgentMentionGroupId, number>>,\n itemCount: number\n): number {\n if (groupId === \"files\") {\n return (\n (totalCounts.opened_files ?? 0) + (totalCounts.agent_generated_files ?? 0)\n );\n }\n if (groupId === \"agent_generated_files\") {\n return itemCount;\n }\n return totalCounts[groupId] ?? itemCount;\n}\n\nexport function normalizeQuery(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nexport function compactText(value: string | null | undefined): string {\n return value?.replace(/\\s+/g, \" \").trim() ?? \"\";\n}\n\nexport function issuePreviewText(value: string | null | undefined): string {\n const content = extractPlainTextWithoutFilesFromContent(value);\n return compactText(content);\n}\n\nexport function unique(values: readonly string[]): string[] {\n return [...new Set(values)];\n}\n\nexport function getOrCreateSummaryCache<T>(\n map: Map<string, Map<string, T>>,\n workspaceId: string\n): Map<string, T> {\n const existing = map.get(workspaceId);\n if (existing) {\n return existing;\n }\n const created = new Map<string, T>();\n map.set(workspaceId, created);\n return created;\n}\n","import { resolveAgentMentionFileThumbnailUrl } from \"../shared/mentionFilePresentation\";\nimport { presentAgentGeneratedFileMentionItems } from \"./agentMentionAgentGeneratedFilesPresentation\";\nimport {\n emitAgentMentionSearchDiagnostic,\n logAgentMentionSearchInfo,\n queryAgentMentionProviderWithDiagnostics,\n type AgentMentionProviderQueryDiagnostic,\n type AgentMentionSearchDiagnosticLog\n} from \"./agentMentionSearchDiagnostics\";\nimport {\n AGENT_MENTION_FILTER_TAB_ORDER,\n buildEmptyGroup,\n compactText,\n filterForGroup,\n DEFAULT_MENTION_GROUP_PAGE_SIZE,\n groupIdsForFilter,\n mentionGroupPageSize,\n normalizeQuery,\n resolveMentionGroupItems,\n resolveMentionGroupTotalCount,\n shouldPrefetchBrowseFilter,\n shouldShowEmptyGroup\n} from \"./agentMentionSearchHelpers\";\nimport { agentMentionFilterLabel } from \"./AgentMentionLabels\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport {\n buildAgentGenericMentionHref,\n buildAgentSessionMentionHref,\n buildAgentWorkspaceAppMentionHref,\n buildAgentWorkspaceIssueMentionHref,\n normalizeAgentSessionMentionTitle\n} from \"./agentRichText/agentFileMentionExtension\";\nimport type {\n AgentContextMentionInsertResult,\n AgentContextMentionProvider\n} from \"./agentContextMentionProvider\";\nimport { AGENT_CONTEXT_MENTION_PROVIDER_IDS } from \"./agentContextMentionProvider\";\nimport type {\n MentionPaletteGroup,\n MentionPaletteState\n} from \"@tutti-os/ui-rich-text/at-panel\";\n\nexport type AgentMentionFilterId = \"all\" | \"app\" | \"file\" | \"session\" | \"issue\";\nexport type AgentMentionGroupId =\n | \"apps\"\n | \"files\"\n | \"opened_files\"\n | \"agent_generated_files\"\n | \"my_sessions\"\n | \"collab_sessions\"\n | \"issues\";\n\ntype AgentMentionRawGroupId = Exclude<AgentMentionGroupId, \"files\">;\n\nexport interface AgentMentionBrowseCategory {\n id: AgentMentionFilterId;\n label: string;\n}\n\nexport type AgentMentionGroup = MentionPaletteGroup<AgentContextMentionItem>;\n\nexport type AgentMentionSearchState =\n MentionPaletteState<AgentContextMentionItem>;\n\ninterface AgentMentionSearchControllerOptions {\n contextMentionProviders?: readonly AgentContextMentionProvider[];\n debounceMs?: number;\n fileLimit?: number;\n issueLimit?: number;\n providerTimeoutMs?: number;\n diagnosticInfoLogger?: (payload: AgentMentionSearchDiagnosticLog) => void;\n diagnosticNow?: () => number;\n diagnosticSlowThresholdMs?: number;\n}\n\ntype Listener = (state: AgentMentionSearchState) => void;\n\nconst DEFAULT_DEBOUNCE_MS = 120;\nconst DEFAULT_FILE_LIMIT = 30;\nconst DEFAULT_ISSUE_LIMIT = 25;\nconst DEFAULT_SESSION_LIMIT = 30;\nconst DEFAULT_PROVIDER_TIMEOUT_MS = 3500;\nconst DEFAULT_DIAGNOSTIC_SLOW_THRESHOLD_MS = 250;\n\n// Resolve filter tab labels lazily so they reflect the active i18n locale at the\n// time a state is emitted. Computing this at module load froze the labels to the\n// default (\"en\") runtime, since the agent GUI i18n locale is only synced once the\n// AgentGuiI18nProvider renders.\nfunction buildBrowseCategories(): AgentMentionBrowseCategory[] {\n return AGENT_MENTION_FILTER_TAB_ORDER.map((id) => ({\n id,\n label: agentMentionFilterLabel(id)\n }));\n}\n\nconst {\n agentGeneratedFile: AGENT_GENERATED_FILE_PROVIDER_ID,\n agentSession: AGENT_SESSION_PROVIDER_ID,\n file: FILE_PROVIDER_ID,\n workspaceApp: WORKSPACE_APP_PROVIDER_ID,\n workspaceIssue: WORKSPACE_ISSUE_PROVIDER_ID\n} = AGENT_CONTEXT_MENTION_PROVIDER_IDS;\n\nexport class AgentMentionSearchController {\n private readonly contextMentionProviders: ReadonlyMap<\n string,\n AgentContextMentionProvider\n >;\n private readonly debounceMs: number;\n private readonly fileLimit: number;\n private readonly issueLimit: number;\n private readonly providerTimeoutMs: number;\n private readonly diagnosticInfoLogger: (\n payload: AgentMentionSearchDiagnosticLog\n ) => void;\n private readonly diagnosticNow: () => number;\n private readonly diagnosticSlowThresholdMs: number;\n private readonly listeners = new Set<Listener>();\n private readonly expandedCounts: Partial<\n Record<AgentMentionGroupId, number>\n > = {};\n private readonly totalCounts: Partial<Record<AgentMentionGroupId, number>> =\n {};\n private timer: ReturnType<typeof setTimeout> | null = null;\n private requestId = 0;\n private disposed = false;\n private activeWorkspaceId = \"\";\n private currentUserId = \"\";\n private currentFilter: AgentMentionFilterId = \"all\";\n private currentQuery = \"\";\n private currentSessionCwd = \"\";\n private currentFileSearchLimit: number;\n private currentIssueSearchLimit: number;\n private agentGeneratedBrowsePath: string | null = null;\n private rawGroups: Record<AgentMentionRawGroupId, AgentContextMentionItem[]> =\n {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n private state: AgentMentionSearchState = {\n status: \"idle\",\n query: \"\",\n mode: \"browse\",\n filter: \"all\",\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n };\n\n constructor(options: AgentMentionSearchControllerOptions) {\n this.contextMentionProviders = new Map(\n (options.contextMentionProviders ?? []).map((provider) => [\n provider.id,\n provider\n ])\n );\n this.debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n this.fileLimit = options.fileLimit ?? DEFAULT_FILE_LIMIT;\n this.issueLimit = options.issueLimit ?? DEFAULT_ISSUE_LIMIT;\n this.providerTimeoutMs =\n options.providerTimeoutMs ?? DEFAULT_PROVIDER_TIMEOUT_MS;\n this.diagnosticInfoLogger =\n options.diagnosticInfoLogger ?? logAgentMentionSearchInfo;\n this.diagnosticNow = options.diagnosticNow ?? Date.now;\n this.diagnosticSlowThresholdMs =\n options.diagnosticSlowThresholdMs ?? DEFAULT_DIAGNOSTIC_SLOW_THRESHOLD_MS;\n this.currentFileSearchLimit = this.fileLimit;\n this.currentIssueSearchLimit = this.issueLimit;\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n listener(this.state);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n updateQuery(input: {\n workspaceId: string;\n currentUserId?: string | null;\n query: string;\n sessionCwd?: string | null;\n }): void {\n if (this.disposed) {\n return;\n }\n this.activeWorkspaceId = input.workspaceId.trim();\n this.currentUserId = input.currentUserId?.trim() ?? \"\";\n this.currentSessionCwd = input.sessionCwd?.trim() ?? \"\";\n this.currentQuery = normalizeQuery(input.query);\n this.clearTimer();\n const requestId = ++this.requestId;\n this.resetAgentGeneratedBrowsePath();\n this.resetExpandedCounts();\n this.resetSearchLimits();\n\n if (!this.activeWorkspaceId) {\n this.setState({\n status: \"idle\",\n query: this.currentQuery,\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n });\n return;\n }\n\n if (!this.currentQuery) {\n this.startBrowseModeFetch(this.currentFilter);\n return;\n }\n\n this.setState({\n status: \"loading\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n this.timer = setTimeout(() => {\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId\n });\n }, this.debounceMs);\n }\n\n setFilter(filter: AgentMentionFilterId): void {\n if (this.disposed) {\n return;\n }\n this.currentFilter = filter;\n this.resetAgentGeneratedBrowsePath();\n this.resetExpandedCounts();\n if (!this.currentQuery) {\n this.startBrowseModeFetch(filter);\n return;\n }\n this.setState({\n status: \"ready\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n }\n\n enterCategory(category: Exclude<AgentMentionFilterId, \"all\">): void {\n if (this.disposed) {\n return;\n }\n this.currentFilter = category;\n this.resetExpandedCounts();\n this.clearTimer();\n if (!this.currentQuery) {\n this.startBrowseModeFetch(category);\n return;\n }\n if (!this.activeWorkspaceId) {\n this.emitBrowseState(\"ready\");\n return;\n }\n const requestId = ++this.requestId;\n this.setState({\n status: \"loading\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId\n });\n }\n\n selectAgentGeneratedMentionItem(item: AgentContextMentionItem): boolean {\n if (item.kind !== \"file\" || !item.mentionNavigation) {\n return false;\n }\n if (item.mentionNavigation === \"agent-generated-folder\") {\n this.agentGeneratedBrowsePath = item.path;\n this.expandedCounts.agent_generated_files = mentionGroupPageSize(\n this.currentFilter,\n \"agent_generated_files\"\n );\n this.setState({\n status: this.state.status === \"loading\" ? \"loading\" : \"ready\",\n query: this.currentQuery,\n mode: this.currentQuery ? \"results\" : \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n return true;\n }\n if (item.mentionNavigation === \"agent-generated-folder-back\") {\n this.resetAgentGeneratedBrowsePath();\n this.setState({\n status: this.state.status === \"loading\" ? \"loading\" : \"ready\",\n query: this.currentQuery,\n mode: this.currentQuery ? \"results\" : \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n return true;\n }\n return false;\n }\n\n expandGroup(groupId: AgentMentionGroupId): void {\n const pageSize = mentionGroupPageSize(this.currentFilter, groupId);\n const current = this.expandedCounts[groupId] ?? pageSize;\n this.expandedCounts[groupId] = current + pageSize;\n if (!this.currentQuery) {\n const nextFilter = filterForGroup(groupId);\n if (this.currentFilter === \"all\") {\n this.currentFilter = nextFilter;\n }\n this.setState({\n status: \"ready\",\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n return;\n }\n const needsMoreFiles =\n (groupId === \"opened_files\" ||\n groupId === \"files\" ||\n groupId === \"agent_generated_files\") &&\n (groupId === \"agent_generated_files\"\n ? this.rawGroups.agent_generated_files.length >=\n this.currentFileSearchLimit\n : this.rawGroups.opened_files.length >= this.currentFileSearchLimit);\n const needsMoreIssues =\n groupId === \"issues\" &&\n (this.totalCounts.issues ?? this.rawGroups.issues.length) >\n this.rawGroups.issues.length;\n if (needsMoreFiles) {\n this.currentFileSearchLimit += DEFAULT_MENTION_GROUP_PAGE_SIZE;\n }\n if (needsMoreIssues) {\n this.currentIssueSearchLimit += DEFAULT_MENTION_GROUP_PAGE_SIZE;\n }\n if (needsMoreFiles || needsMoreIssues) {\n this.clearTimer();\n const requestId = ++this.requestId;\n this.setState({\n status: \"loading\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId\n });\n return;\n }\n this.setState({\n status: \"ready\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n }\n\n close(): void {\n this.clearTimer();\n this.requestId += 1;\n this.currentFilter = \"all\";\n this.resetAgentGeneratedBrowsePath();\n this.resetExpandedCounts();\n this.resetSearchLimits();\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.totalCounts.apps = 0;\n this.totalCounts.opened_files = 0;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = 0;\n this.totalCounts.collab_sessions = 0;\n this.totalCounts.issues = 0;\n this.currentQuery = \"\";\n this.setState({\n status: \"idle\",\n query: \"\",\n mode: \"browse\",\n filter: \"all\",\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n });\n }\n\n dispose(): void {\n this.disposed = true;\n this.clearTimer();\n this.listeners.clear();\n this.requestId += 1;\n }\n\n private startBrowseModeFetch(filter: AgentMentionFilterId): void {\n if (!this.activeWorkspaceId || !shouldPrefetchBrowseFilter(filter)) {\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.emitBrowseState(\"ready\");\n return;\n }\n this.clearTimer();\n const requestId = ++this.requestId;\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.emitBrowseState(\"loading\");\n void this.runBrowseSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n requestId,\n filter\n });\n }\n\n private async runSearch(input: {\n workspaceId: string;\n currentUserId: string;\n query: string;\n requestId: number;\n }): Promise<void> {\n const startedAt = this.diagnosticNow();\n const providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n try {\n const [fileItems, appItems, issueItems, sessionItems] = await Promise.all(\n [\n this.queryProviderMentionItemsById({\n providerId: FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: this.currentFileSearchLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: WORKSPACE_APP_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: DEFAULT_MENTION_GROUP_PAGE_SIZE,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: WORKSPACE_ISSUE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: this.currentIssueSearchLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: AGENT_SESSION_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: DEFAULT_SESSION_LIMIT,\n diagnostics: providerDiagnostics\n })\n ]\n );\n\n if (!this.canApply(input.requestId, input.workspaceId, input.query)) {\n return;\n }\n\n this.rawGroups = {\n apps: appItems.filter((item) => item.kind === \"workspace-app\"),\n opened_files: fileItems.filter((item) => item.kind === \"file\"),\n agent_generated_files: [],\n my_sessions: sessionItems.filter(\n (item) => item.kind === \"session\" && item.scope === \"my_sessions\"\n ),\n collab_sessions: sessionItems.filter(\n (item) => item.kind === \"session\" && item.scope === \"collab_sessions\"\n ),\n issues: issueItems.filter((item) => item.kind === \"workspace-issue\")\n };\n this.totalCounts.apps = this.rawGroups.apps.length;\n this.totalCounts.opened_files = this.rawGroups.opened_files.length;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = this.rawGroups.my_sessions.length;\n this.totalCounts.collab_sessions = this.rawGroups.collab_sessions.length;\n this.totalCounts.issues = this.rawGroups.issues.length;\n const groups = this.groupsFromRawGroups();\n\n this.setState({\n status: \"ready\",\n query: input.query,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups,\n error: null\n });\n this.logSearchDiagnostic({\n filter: this.currentFilter,\n groups,\n mode: \"results\",\n providerDiagnostics,\n query: input.query,\n requestId: input.requestId,\n startedAt,\n status: \"ready\",\n workspaceId: input.workspaceId\n });\n } catch (error) {\n if (!this.canApply(input.requestId, input.workspaceId, input.query)) {\n return;\n }\n this.setState({\n status: \"error\",\n query: input.query,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: error instanceof Error ? error.message : String(error)\n });\n this.logSearchDiagnostic({\n error,\n filter: this.currentFilter,\n groups: [],\n mode: \"results\",\n providerDiagnostics,\n query: input.query,\n requestId: input.requestId,\n startedAt,\n status: \"error\",\n workspaceId: input.workspaceId\n });\n }\n }\n\n private async runBrowseSearch(input: {\n workspaceId: string;\n currentUserId: string;\n requestId: number;\n filter: AgentMentionFilterId;\n }): Promise<void> {\n const startedAt = this.diagnosticNow();\n const providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n try {\n if (input.filter === \"file\") {\n const [fileItems, agentGeneratedFileItems] = await Promise.all([\n this.queryProviderMentionItemsById({\n providerId: FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.fileLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: AGENT_GENERATED_FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.fileLimit,\n diagnostics: providerDiagnostics\n })\n ]);\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.rawGroups = {\n apps: [],\n opened_files: fileItems.filter((item) => item.kind === \"file\"),\n agent_generated_files: agentGeneratedFileItems.filter(\n (item) => item.kind === \"file\"\n ),\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.totalCounts.apps = 0;\n this.totalCounts.opened_files = this.rawGroups.opened_files.length;\n this.totalCounts.agent_generated_files =\n this.rawGroups.agent_generated_files.length;\n this.totalCounts.my_sessions = 0;\n this.totalCounts.collab_sessions = 0;\n this.totalCounts.issues = 0;\n } else if (input.filter === \"app\") {\n const appItems = await this.queryProviderMentionItemsById({\n providerId: WORKSPACE_APP_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: DEFAULT_MENTION_GROUP_PAGE_SIZE,\n diagnostics: providerDiagnostics\n });\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.rawGroups = {\n apps: appItems.filter((item) => item.kind === \"workspace-app\"),\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n this.totalCounts.apps = this.rawGroups.apps.length;\n this.totalCounts.opened_files = 0;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = 0;\n this.totalCounts.collab_sessions = 0;\n this.totalCounts.issues = 0;\n } else if (input.filter === \"issue\") {\n const issueItems = await this.queryProviderMentionItemsById({\n providerId: WORKSPACE_ISSUE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.currentIssueSearchLimit,\n diagnostics: providerDiagnostics\n });\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: issueItems.filter((item) => item.kind === \"workspace-issue\")\n };\n this.totalCounts.apps = 0;\n this.totalCounts.opened_files = 0;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = 0;\n this.totalCounts.collab_sessions = 0;\n this.totalCounts.issues = this.rawGroups.issues.length;\n } else if (input.filter === \"session\") {\n const sessionItems = await this.queryProviderMentionItemsById({\n providerId: AGENT_SESSION_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: DEFAULT_SESSION_LIMIT,\n diagnostics: providerDiagnostics\n });\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n const sessionMentionItems = sessionItems.filter(\n (item) => item.kind === \"session\"\n );\n const mySessionItems = sessionMentionItems\n .filter((item) =>\n input.currentUserId ? item.scope === \"my_sessions\" : true\n )\n .map((item) =>\n item.scope === \"my_sessions\"\n ? item\n : { ...item, scope: \"my_sessions\" as const }\n );\n this.rawGroups = {\n apps: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: mySessionItems,\n collab_sessions: [],\n issues: []\n };\n this.totalCounts.apps = 0;\n this.totalCounts.opened_files = 0;\n this.totalCounts.agent_generated_files = 0;\n this.totalCounts.my_sessions = this.rawGroups.my_sessions.length;\n this.totalCounts.collab_sessions =\n this.rawGroups.collab_sessions.length;\n this.totalCounts.issues = 0;\n } else {\n const [\n appItems,\n fileItems,\n agentGeneratedFileItems,\n issueItems,\n sessionItems\n ] = await Promise.all([\n this.queryProviderMentionItemsById({\n providerId: WORKSPACE_APP_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: DEFAULT_MENTION_GROUP_PAGE_SIZE,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.fileLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: AGENT_GENERATED_FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.fileLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: WORKSPACE_ISSUE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: this.currentIssueSearchLimit,\n diagnostics: providerDiagnostics\n }),\n this.queryProviderMentionItemsById({\n providerId: AGENT_SESSION_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: \"\",\n limit: DEFAULT_SESSION_LIMIT,\n diagnostics: providerDiagnostics\n })\n ]);\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.rawGroups = {\n apps: appItems.filter((item) => item.kind === \"workspace-app\"),\n opened_files: fileItems.filter((item) => item.kind === \"file\"),\n agent_generated_files: agentGeneratedFileItems.filter(\n (item) => item.kind === \"file\"\n ),\n my_sessions: sessionItems.filter(\n (item) => item.kind === \"session\" && item.scope === \"my_sessions\"\n ),\n collab_sessions: sessionItems.filter(\n (item) =>\n item.kind === \"session\" && item.scope === \"collab_sessions\"\n ),\n issues: issueItems.filter((item) => item.kind === \"workspace-issue\")\n };\n this.totalCounts.apps = this.rawGroups.apps.length;\n this.totalCounts.opened_files = this.rawGroups.opened_files.length;\n this.totalCounts.agent_generated_files =\n this.rawGroups.agent_generated_files.length;\n this.totalCounts.my_sessions = this.rawGroups.my_sessions.length;\n this.totalCounts.collab_sessions =\n this.rawGroups.collab_sessions.length;\n this.totalCounts.issues = this.rawGroups.issues.length;\n }\n const groups = this.groupsFromRawGroups();\n\n this.setState({\n status: \"ready\",\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups,\n error: null\n });\n this.logSearchDiagnostic({\n filter: this.currentFilter,\n groups,\n mode: \"browse\",\n providerDiagnostics,\n query: \"\",\n requestId: input.requestId,\n startedAt,\n status: \"ready\",\n workspaceId: input.workspaceId\n });\n } catch (error) {\n if (!this.canApply(input.requestId, input.workspaceId, \"\")) {\n return;\n }\n this.setState({\n status: \"error\",\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: error instanceof Error ? error.message : String(error)\n });\n this.logSearchDiagnostic({\n error,\n filter: this.currentFilter,\n groups: [],\n mode: \"browse\",\n providerDiagnostics,\n query: \"\",\n requestId: input.requestId,\n startedAt,\n status: \"error\",\n workspaceId: input.workspaceId\n });\n }\n }\n\n private async queryProviderMentionItems(input: {\n provider: AgentContextMentionProvider;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit: number;\n abortSignal: AbortSignal;\n }): Promise<AgentContextMentionItem[]> {\n const items = await input.provider.query({\n keyword: input.query,\n maxResults: input.limit,\n abortSignal: input.abortSignal,\n trigger: \"@\",\n context: {\n metadata: {\n currentUserId: input.currentUserId,\n sessionCwd: this.currentSessionCwd || undefined,\n target: \"agent-gui\",\n workspaceId: input.workspaceId\n }\n }\n });\n if (input.abortSignal.aborted) {\n return [];\n }\n const mentionItems = await Promise.all(\n items.map(async (item) => {\n const mentionItem = providerItemToAgentMentionItem({\n currentUserId: input.currentUserId,\n insertResult: input.provider.toInsertResult(item),\n label: input.provider.getItemLabel(item),\n providerId: input.provider.id,\n subtitle: input.provider.getItemSubtitle?.(item) ?? \"\",\n workspaceId: input.workspaceId\n });\n if (!mentionItem || mentionItem.kind !== \"file\") {\n return mentionItem;\n }\n const iconUrl = await Promise.resolve(\n input.provider.getItemIconUrl?.(item) ?? null\n ).catch(() => null);\n const resolvedThumbnailUrl = resolveAgentMentionFileThumbnailUrl({\n ...mentionItem,\n thumbnailUrl: iconUrl\n });\n if (!resolvedThumbnailUrl) {\n return mentionItem;\n }\n return {\n ...mentionItem,\n thumbnailUrl: resolvedThumbnailUrl\n };\n })\n );\n return mentionItems.filter(\n (item): item is AgentContextMentionItem => item !== null\n );\n }\n\n private async queryProviderMentionItemsById(input: {\n diagnostics: AgentMentionProviderQueryDiagnostic[];\n providerId: string;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit: number;\n }): Promise<AgentContextMentionItem[]> {\n const provider = this.contextMentionProviders.get(input.providerId);\n return queryAgentMentionProviderWithDiagnostics({\n diagnosticNow: this.diagnosticNow,\n diagnostics: input.diagnostics,\n fallback: [] as AgentContextMentionItem[],\n providerId: input.providerId,\n providerTimeoutMs: this.providerTimeoutMs,\n query: provider\n ? (abortSignal) =>\n this.queryProviderMentionItems({\n provider,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: input.limit,\n abortSignal\n })\n : null,\n resultCount: (result) => result.length\n });\n }\n\n private logSearchDiagnostic(input: {\n error?: unknown;\n filter: AgentMentionFilterId;\n groups: readonly AgentMentionGroup[];\n mode: \"browse\" | \"results\";\n providerDiagnostics: readonly AgentMentionProviderQueryDiagnostic[];\n query: string;\n requestId: number;\n startedAt: number;\n status: \"ready\" | \"error\";\n workspaceId: string;\n }): void {\n emitAgentMentionSearchDiagnostic({\n debounceMs: this.debounceMs,\n diagnosticInfoLogger: this.diagnosticInfoLogger,\n diagnosticNow: this.diagnosticNow,\n diagnosticSlowThresholdMs: this.diagnosticSlowThresholdMs,\n error: input.error,\n filter: input.filter,\n groups: input.groups,\n mode: input.mode,\n providerDiagnostics: input.providerDiagnostics,\n providerTimeoutMs: this.providerTimeoutMs,\n query: input.query,\n requestId: input.requestId,\n startedAt: input.startedAt,\n status: input.status,\n workspaceId: input.workspaceId\n });\n }\n\n private groupsFromRawGroups(): AgentMentionGroup[] {\n const orderedGroupIds = groupIdsForFilter(this.currentFilter);\n const groups = orderedGroupIds\n .map((groupId) => {\n const rawItems = resolveMentionGroupItems(groupId, this.rawGroups);\n const items =\n groupId === \"agent_generated_files\"\n ? presentAgentGeneratedFileMentionItems({\n files: rawItems,\n browsePath: this.agentGeneratedBrowsePath,\n query: this.currentQuery\n })\n : rawItems;\n if (items.length === 0) {\n if (\n !shouldShowEmptyGroup(\n groupId,\n this.currentFilter,\n this.currentQuery\n )\n ) {\n return null;\n }\n return buildEmptyGroup(groupId, this.currentQuery);\n }\n const pageSize = mentionGroupPageSize(this.currentFilter, groupId);\n const visibleCount = Math.min(\n items.length,\n this.expandedCounts[groupId] ?? pageSize\n );\n const totalCount = resolveMentionGroupTotalCount(\n groupId,\n this.totalCounts,\n items.length\n );\n return {\n id: groupId,\n items: items.slice(0, visibleCount),\n totalCount,\n visibleCount,\n hasMore:\n items.length > visibleCount ||\n ((groupId === \"opened_files\" ||\n groupId === \"files\" ||\n groupId === \"agent_generated_files\") &&\n items.length >= this.currentFileSearchLimit) ||\n totalCount > visibleCount\n } satisfies AgentMentionGroup;\n })\n .filter((group): group is AgentMentionGroup => group !== null);\n return orderMentionGroupsForFilter({\n filter: this.currentFilter,\n groups,\n query: this.currentQuery\n });\n }\n\n private emitBrowseState(status: \"ready\" | \"loading\"): void {\n this.setState({\n status,\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n });\n }\n\n private canApply(\n requestId: number,\n workspaceId: string,\n query: string\n ): boolean {\n return (\n !this.disposed &&\n requestId === this.requestId &&\n workspaceId === this.activeWorkspaceId &&\n query === this.currentQuery\n );\n }\n\n private clearTimer(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n private resetExpandedCounts(): void {\n for (const groupId of [\n \"files\",\n \"opened_files\",\n \"agent_generated_files\",\n \"my_sessions\",\n \"collab_sessions\",\n \"apps\",\n \"issues\"\n ] as const) {\n this.expandedCounts[groupId] = mentionGroupPageSize(\n this.currentFilter,\n groupId\n );\n }\n }\n\n private resetSearchLimits(): void {\n this.currentFileSearchLimit = this.fileLimit;\n this.currentIssueSearchLimit = this.issueLimit;\n }\n\n private resetAgentGeneratedBrowsePath(): void {\n this.agentGeneratedBrowsePath = null;\n }\n\n private setState(state: AgentMentionSearchState): void {\n this.state = state;\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n}\n\nfunction orderMentionGroupsForFilter(input: {\n filter: AgentMentionFilterId;\n groups: AgentMentionGroup[];\n query: string;\n}): AgentMentionGroup[] {\n if (input.filter !== \"all\") {\n return input.groups;\n }\n const query = normalizeQuery(input.query).toLowerCase();\n return input.groups\n .map((group, index) => ({\n group,\n hasItems: group.items.length > 0,\n index,\n score: mentionGroupBestMatchScore(group, query)\n }))\n .sort((left, right) => {\n if (left.hasItems !== right.hasItems) {\n return left.hasItems ? -1 : 1;\n }\n if (query && left.score !== right.score) {\n return right.score - left.score;\n }\n return left.index - right.index;\n })\n .map((entry) => entry.group);\n}\n\nfunction mentionGroupBestMatchScore(\n group: AgentMentionGroup,\n query: string\n): number {\n if (!query) {\n return 0;\n }\n return group.items.reduce(\n (bestScore, item) =>\n Math.max(bestScore, mentionItemMatchScore(item, query)),\n 0\n );\n}\n\nfunction mentionItemMatchScore(\n item: AgentContextMentionItem,\n query: string\n): number {\n const primary: string[] = [];\n const secondary: string[] = [];\n let kindBoost = 0;\n\n if (item.kind === \"workspace-app\") {\n kindBoost = 8;\n primary.push(item.name, item.appId, item.targetId);\n secondary.push(item.description ?? \"\");\n } else if (item.kind === \"file\") {\n primary.push(item.name);\n secondary.push(item.path, item.directoryPath);\n } else if (item.kind === \"session\") {\n primary.push(item.title);\n secondary.push(\n item.name,\n item.initiatorName,\n item.agentName,\n item.inputPreview ?? \"\",\n item.summaryPreview ?? \"\"\n );\n } else if (item.kind === \"workspace-issue\") {\n primary.push(item.title, item.name);\n secondary.push(\n item.creatorName ?? \"\",\n item.status ?? \"\",\n item.contentPreview ?? \"\"\n );\n } else if (item.kind === \"workspace-app-factory\") {\n primary.push(item.name, item.jobId, item.targetId);\n secondary.push(item.action ?? \"\", item.contextPath ?? \"\");\n }\n\n const primaryScore = maxTextMatchScore(primary, query, {\n contains: 60,\n exact: 100,\n prefix: 90,\n wordPrefix: 80\n });\n const secondaryScore = maxTextMatchScore(secondary, query, {\n contains: 25,\n exact: 60,\n prefix: 50,\n wordPrefix: 40\n });\n const score = Math.max(primaryScore, secondaryScore);\n return score > 0 ? score + kindBoost : 0;\n}\n\nfunction maxTextMatchScore(\n values: readonly string[],\n query: string,\n scores: {\n contains: number;\n exact: number;\n prefix: number;\n wordPrefix: number;\n }\n): number {\n return values.reduce(\n (bestScore, value) =>\n Math.max(bestScore, textMatchScore(value, query, scores)),\n 0\n );\n}\n\nfunction textMatchScore(\n value: string,\n query: string,\n scores: {\n contains: number;\n exact: number;\n prefix: number;\n wordPrefix: number;\n }\n): number {\n const normalized = normalizeQuery(value).toLowerCase();\n if (!normalized) {\n return 0;\n }\n if (normalized === query) {\n return scores.exact;\n }\n if (normalized.startsWith(query)) {\n return scores.prefix;\n }\n if (normalized.split(/[^a-z0-9]+/i).some((word) => word.startsWith(query))) {\n return scores.wordPrefix;\n }\n return normalized.includes(query) ? scores.contains : 0;\n}\n\nfunction providerItemToAgentMentionItem(input: {\n currentUserId: string;\n providerId: string;\n insertResult: AgentContextMentionInsertResult;\n label: string;\n subtitle: string;\n workspaceId: string;\n}): AgentContextMentionItem | null {\n const label = compactText(input.label);\n if (!label) {\n return null;\n }\n if (input.insertResult.kind === \"markdown-link\") {\n const href = input.insertResult.href.trim();\n return {\n kind: \"file\",\n href,\n path: href,\n name: label,\n entryKind: href.endsWith(\"/\") ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromProviderWorkspaceFileHref(href)\n };\n }\n if (input.insertResult.kind !== \"mention\") {\n return null;\n }\n\n const mention = input.insertResult.mention;\n const targetId = mention.entityId.trim();\n if (!targetId) {\n return null;\n }\n const scope = normalizeMentionScope(mention.scope);\n const presentation = mention.presentation ?? {};\n const workspaceId = scope.workspaceId || input.workspaceId;\n if (\n input.providerId === FILE_PROVIDER_ID ||\n input.providerId === AGENT_GENERATED_FILE_PROVIDER_ID\n ) {\n return {\n kind: \"file\",\n href: buildAgentGenericMentionHref(input.providerId, targetId, scope),\n path: targetId,\n name: label,\n entryKind: targetId.endsWith(\"/\") ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromProviderWorkspaceFileHref(targetId),\n thumbnailUrl: presentation.thumbnailUrl?.trim() || undefined\n };\n }\n if (input.providerId === WORKSPACE_ISSUE_PROVIDER_ID) {\n return {\n kind: \"workspace-issue\",\n href: buildAgentWorkspaceIssueMentionHref(workspaceId, targetId, {\n topicId: scope.topicId\n }),\n workspaceId,\n targetId,\n topicId: scope.topicId,\n name: label,\n title: label,\n status: presentation.status?.trim() || undefined,\n contentPreview:\n compactText(presentation.description) ||\n compactText(input.subtitle) ||\n undefined\n };\n }\n if (input.providerId === WORKSPACE_APP_PROVIDER_ID) {\n const appId = targetId;\n return {\n kind: \"workspace-app\",\n href: buildAgentWorkspaceAppMentionHref(workspaceId, appId),\n workspaceId,\n targetId: appId,\n appId,\n name: label,\n description:\n compactText(presentation.description) ||\n compactText(presentation.subtitle) ||\n compactText(input.subtitle) ||\n undefined,\n iconUrl: presentation.iconUrl?.trim() || undefined,\n referencesListSupported: presentation.referencesListSupported === \"true\"\n };\n }\n if (input.providerId === AGENT_SESSION_PROVIDER_ID) {\n const agentName = presentation.subtitle?.trim() || \"\";\n const title = normalizeAgentSessionMentionTitle(label) || label;\n const description = compactText(presentation.description);\n const summaryPreview =\n description || compactText(input.subtitle) || undefined;\n return {\n kind: \"session\",\n href: buildAgentSessionMentionHref(workspaceId, targetId),\n workspaceId,\n targetId,\n name: label,\n title,\n scope: mentionSessionScope({\n currentUserId: input.currentUserId,\n rawScope: scope.scope,\n userId: scope.userId\n }),\n initiatorName: \"\",\n agentName,\n status: presentation.status?.trim() || undefined,\n inputPreview: description || undefined,\n summaryPreview\n };\n }\n return null;\n}\n\nfunction normalizeMentionScope(\n scope?: Readonly<Record<string, string>>\n): Partial<Record<string, string>> {\n return Object.fromEntries(\n Object.entries(scope ?? {})\n .map(([key, value]) => [key.trim(), value.trim()] as const)\n .filter(([key, value]) => key.length > 0 && value.length > 0)\n );\n}\n\nfunction mentionSessionScope(input: {\n currentUserId: string;\n rawScope: string | undefined;\n userId?: string;\n}): Extract<AgentContextMentionItem, { kind: \"session\" }>[\"scope\"] {\n const rawScope = input.rawScope?.trim() ?? \"\";\n if (rawScope === \"my_sessions\" || rawScope === \"collab_sessions\") {\n return rawScope;\n }\n const userId = input.userId?.trim() ?? \"\";\n const currentUserId = input.currentUserId.trim();\n if (\n !userId ||\n !currentUserId ||\n userId === \"local\" ||\n currentUserId === \"local\"\n ) {\n return \"my_sessions\";\n }\n return userId === currentUserId ? \"my_sessions\" : \"collab_sessions\";\n}\n\nfunction dirnameFromProviderWorkspaceFileHref(href: string): string {\n const normalized = href.replace(/\\/+$/, \"\");\n const index = normalized.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalized.slice(0, index);\n}\n","import {\n normalizeAgentActivityDisplayStatus,\n type AgentActivityDisplayStatus\n} from \"@tutti-os/agent-activity-core\";\nimport {\n MentionPalette,\n flattenMentionPaletteEntries,\n issueMentionStatusTone,\n renderMentionRow,\n type MentionPaletteEntry,\n type MentionPaletteState,\n type MentionPaletteTheme,\n type MentionRowClassNames,\n type MentionRowItem,\n type MentionRowStatusTag,\n type MentionRowStatusTone\n} from \"@tutti-os/ui-rich-text/at-panel\";\nimport { Spinner } from \"../../app/renderer/components/ui/spinner\";\nimport { userAvatarPlaceholderUrl } from \"../../shared/userAvatarPlaceholder\";\nimport { translate } from \"../../i18n/index\";\nimport { managedAgentRoundedIconUrl } from \"../../shared/managedAgentIcons\";\nimport { workspaceAgentActivityStatusLabel } from \"../../shared/workspaceAgentActivityStatusLabel\";\nimport { roomIssueStatusLabel } from \"../../shared/roomIssueStatusLabel\";\nimport {\n resolveAgentMentionFileThumbnailUrl,\n resolveAgentMentionFileVisualKind\n} from \"../shared/mentionFilePresentation\";\nimport {\n agentMentionEmptyGroupLabel,\n agentMentionFilterLabel,\n agentMentionGroupLabel\n} from \"./AgentMentionLabels\";\nimport {\n AGENT_MENTION_FILTER_TAB_ORDER,\n mentionGroupExpandCount\n} from \"./agentMentionSearchHelpers\";\nimport {\n type AgentMentionGroup,\n type AgentMentionBrowseCategory,\n type AgentMentionFilterId,\n type AgentMentionGroupId,\n type AgentMentionSearchState\n} from \"./AgentMentionSearchController\";\nimport { agentGeneratedMentionItemKey } from \"./agentMentionAgentGeneratedFilesPresentation\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\n\nexport interface AgentMentionPaletteEntry {\n key: string;\n type: \"category\" | \"item\" | \"expand\";\n categoryId?: AgentMentionBrowseCategory[\"id\"];\n groupId?: AgentMentionGroupId;\n item?: AgentContextMentionItem;\n}\n\nexport interface AgentFileMentionPaletteProps {\n state: AgentMentionSearchState;\n highlightedKey: string | null;\n label: string;\n loadingLabel: string;\n emptyLabel: string;\n errorLabel: string;\n tabHintLabel: string;\n maxHeightPx: number;\n shouldCenterHighlightedItem?: boolean;\n onHighlightChange: (key: string) => void;\n onSelectItem: (entry: AgentContextMentionItem) => void;\n onSelectCategory: (categoryId: AgentMentionBrowseCategory[\"id\"]) => void;\n onSelectFilter: (filter: AgentMentionFilterId) => void;\n onExpandGroup: (groupId: AgentMentionGroupId) => void;\n onCycleFilter: () => void;\n onMoveSelection: (delta: 1 | -1) => void;\n /**\n * 可选:点击 issue / app 行末尾的「查看产物文件」图标时回调(打开引用 picker 并定位)。\n * 仅 workspace-issue / workspace-app 行渲染该入口。\n */\n onOpenReferences?: (item: AgentContextMentionItem) => void;\n}\n\nconst AGENT_MENTION_PALETTE_THEME: MentionPaletteTheme = {\n classNames: {\n palette: \"agent-gui-node__mention-palette\",\n header: \"agent-gui-node__mention-palette-header\",\n footer: \"agent-gui-node__mention-palette-footer\",\n tabs: \"agent-gui-node__mention-palette-tabs\",\n scrollRegion: \"agent-gui-node__mention-palette-scroll-region\",\n scrollbar:\n \"workspace-agents-status-panel__scrollbar agent-gui-node__mention-palette-scrollbar\",\n scrollbarThumb: \"workspace-agents-status-panel__scrollbar-thumb\",\n hint: \"agent-gui-node__mention-palette-hint\",\n hintItem: \"agent-gui-node__mention-palette-hint-item\",\n hintButton: \"agent-gui-node__mention-palette-hint-button\",\n hintSeparator: \"agent-gui-node__mention-palette-hint-separator\",\n shortcut: \"agent-gui-node__mention-palette-shortcut\",\n shortcutArrow: \"agent-gui-node__mention-palette-shortcut--arrow\",\n shortcutButton: \"agent-gui-node__mention-palette-shortcut-button\",\n shortcutGroup: \"agent-gui-node__mention-palette-shortcut-group\"\n },\n testIds: {\n emptyState: \"agent-gui-mention-palette-empty-state\",\n hint: \"agent-gui-mention-palette-hint\",\n scrollbar: \"agent-gui-mention-palette-scrollbar\",\n loadingSpinner: \"agent-mention-loading-spinner\"\n },\n groupDividerAttribute: \"data-agent-mention-group-divider\"\n};\n\n/**\n * The agent composer's existing structural row class names. Passing these to\n * {@link renderMentionRow} keeps the rendered DOM byte-identical to the\n * pre-refactor markup (the agent stylesheet `agentactivity.css` owns these\n * rules and the agent spec greps them), while the shared component defaults to\n * package-owned `rich-text-at-mention-*` names for other surfaces.\n */\nconst AGENT_MENTION_ROW_CLASS_NAMES: MentionRowClassNames = {\n fileIcon: \"agent-gui-node__mention-file-icon\",\n fileThumb: \"agent-gui-node__mention-file-thumb\",\n kindIcon: \"tsh-agent-object-token__kind-icon\",\n avatarImgUserPlaceholder:\n \"workspace-agents-status-panel__avatar-img--user-placeholder\"\n};\n\n/**\n * Stable per-item key suffix. The shared shell composes the full entry key as\n * `${group.id}:${agentMentionItemKey(item)}`, matching the agent's historical\n * `${group.id}:${item.kind}:${...}` format so highlight keys stay compatible.\n */\nfunction agentMentionItemKey(item: AgentContextMentionItem): string {\n return `${item.kind}:${\n item.kind === \"file\" ? agentGeneratedMentionItemKey(item) : item.targetId\n }`;\n}\n\nexport function flattenAgentMentionPaletteEntries(\n state: AgentMentionSearchState\n): AgentMentionPaletteEntry[] {\n return flattenMentionPaletteEntries(state, (item) =>\n agentMentionItemKey(item)\n ).map((entry: MentionPaletteEntry): AgentMentionPaletteEntry => {\n if (entry.type === \"item\") {\n const item =\n entry.groupId !== undefined && entry.itemIndex !== undefined\n ? state.groups.find((group) => group.id === entry.groupId)?.items[\n entry.itemIndex\n ]\n : undefined;\n return {\n key: entry.key,\n type: \"item\",\n groupId: entry.groupId as AgentMentionGroupId | undefined,\n item\n };\n }\n return {\n key: entry.key,\n type: entry.type,\n categoryId: entry.categoryId as AgentMentionFilterId | undefined,\n groupId: entry.groupId as AgentMentionGroupId | undefined\n };\n });\n}\n\nexport function groupStartKeys(state: AgentMentionSearchState): string[] {\n if (state.mode === \"browse\") {\n return state.categories.map((category) => `category:${category.id}`);\n }\n return state.groups\n .map((group) => {\n const firstItem = group.items[0];\n if (firstItem) {\n return `${group.id}:${firstItem.kind}:${firstItem.kind === \"file\" ? firstItem.path : firstItem.targetId}`;\n }\n if (group.hasMore) {\n return `expand:${group.id}`;\n }\n return null;\n })\n .filter((key): key is string => key !== null);\n}\n\nexport function AgentFileMentionPalette({\n state,\n highlightedKey,\n label,\n loadingLabel,\n emptyLabel,\n errorLabel,\n tabHintLabel,\n maxHeightPx,\n shouldCenterHighlightedItem = false,\n onHighlightChange,\n onSelectItem,\n onSelectCategory,\n onSelectFilter,\n onExpandGroup,\n onCycleFilter,\n onMoveSelection,\n onOpenReferences\n}: AgentFileMentionPaletteProps): React.JSX.Element {\n \"use memo\";\n const openReferencesLabel = translate(\n \"agentHost.agentGui.mentionOpenReferences\"\n );\n const filter = state.filter as AgentMentionFilterId;\n const highlightedBrowseCategory = highlightedKey?.startsWith(\"category:\")\n ? highlightedKey.slice(\"category:\".length)\n : null;\n const showBrowseHint = shouldShowBrowseSearchHint({\n browseFilter: filter,\n groups: state.groups,\n highlightedBrowseCategory,\n mode: state.mode\n });\n\n // Browse mode carries its own category list (with labels); results mode tabs\n // are the fixed agent filter order. The shared shell renders a single tab\n // source, so resolve the right one here.\n const categories =\n state.mode === \"browse\"\n ? state.categories\n : AGENT_MENTION_FILTER_TAB_ORDER.map((id) => ({\n id,\n label: agentMentionFilterLabel(id)\n }));\n\n // When the agent wants the single keyboard browse hint we hand the shell an\n // empty group list so it renders its (keyboard-icon) empty state with our\n // computed hint copy. Otherwise we map the real groups, decorating each with\n // the agent-specific label / empty / expand / spacing chrome.\n const shellState: MentionPaletteState<AgentContextMentionItem> =\n showBrowseHint\n ? { ...state, categories, groups: [] }\n : {\n ...state,\n categories,\n groups: state.groups.map((group, index) =>\n decorateMentionGroup(\n group,\n index,\n state.groups,\n filter,\n state.query\n )\n )\n };\n\n const emptyLabelForShell = showBrowseHint\n ? browseHintForFilter(filter)\n : resolveMentionPaletteEmptyLabel({\n emptyLabel,\n filter,\n mode: state.mode,\n query: state.query\n });\n\n const showFileSearchMoreHint = shouldShowFileSearchMoreHint({\n filter,\n groups: state.groups,\n mode: state.mode,\n query: state.query\n });\n\n return (\n <MentionPalette<AgentContextMentionItem>\n state={shellState}\n highlightedKey={highlightedKey}\n getItemKey={agentMentionItemKey}\n renderItem={(item) =>\n renderMentionRow(agentMentionItemToRowItem(item), {\n classNames: AGENT_MENTION_ROW_CLASS_NAMES,\n dataAttributeMode: \"agent\",\n ...(onOpenReferences && isReferenceableMentionItem(item)\n ? {\n onOpenReferences: () => onOpenReferences(item),\n openReferencesLabel\n }\n : {})\n })\n }\n labels={{\n loading: loadingLabel,\n empty: emptyLabelForShell,\n error: errorLabel,\n tabHint: tabHintLabel,\n listbox: label\n }}\n hintLabels={{\n cycleFilter: translate(\"agentHost.agentGui.fileMentionSwitchCategory\"),\n moveSelection: translate(\n \"agentHost.agentGui.fileMentionSwitchSelection\"\n )\n }}\n maxHeightPx={maxHeightPx}\n scrollHighlightedIntoViewCentered={shouldCenterHighlightedItem}\n loadingBanner={<MentionPaletteLoadingBanner label={loadingLabel} />}\n theme={AGENT_MENTION_PALETTE_THEME}\n renderListFooter={\n showFileSearchMoreHint ? () => <MentionFileSearchMoreHint /> : undefined\n }\n onHighlightChange={onHighlightChange}\n onSelectItem={(item) => onSelectItem(item)}\n onSelectCategory={(categoryId) =>\n onSelectCategory(categoryId as AgentMentionBrowseCategory[\"id\"])\n }\n onSelectFilter={(nextFilter) =>\n onSelectFilter(nextFilter as AgentMentionFilterId)\n }\n onExpandGroup={(groupId) => onExpandGroup(groupId as AgentMentionGroupId)}\n onCycleFilter={() => onCycleFilter()}\n onMoveSelection={onMoveSelection}\n />\n );\n}\n\nexport const AgentContextMentionPalette = AgentFileMentionPalette;\nexport type AgentContextMentionPaletteProps = AgentFileMentionPaletteProps;\n\n/**\n * Map a controller group onto the shared shell group, layering in the\n * agent-specific chrome the generic shell intentionally omits: translated\n * group / empty / expand labels, file-search chrome suppression, and the extra\n * top margin between the \"my sessions\" and \"collab sessions\" groups.\n */\nfunction decorateMentionGroup(\n group: AgentMentionGroup,\n index: number,\n groups: ReadonlyArray<AgentMentionGroup>,\n filter: AgentMentionFilterId,\n query: string\n): AgentMentionGroup {\n const groupId = group.id as AgentMentionGroupId;\n const suppressChrome = shouldSuppressFileSearchGroupChrome(filter, query);\n const followsMySessions =\n groupId === \"collab_sessions\" &&\n (groups[index - 1]?.id as AgentMentionGroupId) === \"my_sessions\";\n const showLabel = shouldRenderMentionGroupLabel({\n filter,\n groupCount: groups.length,\n groupId,\n query\n });\n return {\n ...group,\n label: showLabel ? agentMentionGroupLabel(groupId) : undefined,\n emptyLabel: suppressChrome\n ? undefined\n : agentMentionEmptyGroupLabel(groupId, query),\n expandLabel: group.hasMore\n ? translate(\"agentHost.agentGui.contextPickerExpandMore\", {\n count: mentionGroupExpandCount(group, filter)\n })\n : undefined,\n sectionClassName: followsMySessions ? \"mt-2\" : undefined,\n hideTopDivider: suppressChrome\n };\n}\n\nfunction MentionPaletteLoadingBanner({\n label\n}: {\n label: string;\n}): React.JSX.Element {\n \"use memo\";\n return (\n <div\n className=\"flex items-center gap-2 border-b border-[var(--line-1)] px-3 py-2 text-[13px] font-medium text-[var(--text-secondary)]\"\n data-testid=\"agent-mention-loading-banner\"\n >\n <Spinner\n size={14}\n className=\"text-[var(--text-secondary)]\"\n testId=\"agent-mention-loading-spinner\"\n />\n <span>{label}</span>\n </div>\n );\n}\n\nfunction MentionFileSearchMoreHint(): React.JSX.Element {\n \"use memo\";\n return (\n <p\n className=\"px-3 pb-1 pt-2 text-center text-[13px] leading-5 text-[var(--text-tertiary)]\"\n data-agent-mention-file-search-hint=\"true\"\n >\n {translate(\"agentHost.agentGui.mentionFileSearchMoreHint\")}\n </p>\n );\n}\n\nfunction shouldSuppressFileSearchGroupChrome(\n filter: AgentMentionFilterId,\n query: string\n): boolean {\n return filter === \"file\" && query.trim().length > 0;\n}\n\nfunction resolveMentionPaletteEmptyLabel(input: {\n emptyLabel: string;\n filter: AgentMentionFilterId;\n mode: AgentMentionSearchState[\"mode\"];\n query: string;\n}): string {\n if (\n input.mode === \"results\" &&\n input.filter === \"file\" &&\n input.query.trim().length > 0\n ) {\n return translate(\"agentHost.agentGui.mentionNoMatchingFiles\");\n }\n if (input.filter === \"session\") {\n return agentMentionEmptyGroupLabel(\"my_sessions\", input.query);\n }\n if (input.filter === \"app\") {\n return agentMentionEmptyGroupLabel(\"apps\", input.query);\n }\n if (input.filter === \"issue\") {\n return agentMentionEmptyGroupLabel(\"issues\", input.query);\n }\n return input.emptyLabel;\n}\n\nfunction shouldRenderMentionGroupLabel(input: {\n filter: AgentMentionFilterId;\n groupCount: number;\n groupId: AgentMentionGroupId;\n query: string;\n}): boolean {\n if (shouldSuppressFileSearchGroupChrome(input.filter, input.query)) {\n return false;\n }\n if (input.filter === \"all\" || input.groupCount !== 1) {\n return true;\n }\n return (\n agentMentionGroupLabel(input.groupId) !==\n agentMentionFilterLabel(input.filter)\n );\n}\n\n/**\n * Resolve an agent mention item into the shared, display-ready\n * {@link MentionRowItem} view-model the generic {@link renderMentionRow}\n * consumes. All agent-specific bits — i18n via {@link translate}, the user\n * avatar placeholder asset, the managed-agent rounded icon, and the activity /\n * issue status labels — are resolved here so the shared renderer stays pure.\n */\nfunction agentMentionItemToRowItem(\n item: AgentContextMentionItem\n): MentionRowItem {\n if (item.kind === \"file\") {\n const visualKind = resolveAgentMentionFileVisualKind({\n entryKind: item.entryKind,\n href: item.href,\n mentionNavigation: item.mentionNavigation,\n name: item.name,\n path: item.path\n });\n const childCountLabel =\n item.mentionNavigation === \"agent-generated-folder\" &&\n typeof item.childCount === \"number\" &&\n item.childCount > 0\n ? translate(\"agentHost.agentGui.mentionAgentGeneratedFolderFileCount\", {\n count: item.childCount\n })\n : null;\n return {\n kind: \"file\",\n name: item.name,\n visualKind,\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl(item) ?? null,\n childCountLabel,\n entryKind: item.entryKind,\n mentionNavigation: item.mentionNavigation\n };\n }\n\n if (item.kind === \"session\") {\n return {\n kind: \"session\",\n participant: `${item.initiatorName} & ${item.agentName}`,\n summary: item.title,\n userAvatarUrl: item.initiatorAvatarUrl ?? null,\n userAvatarPlaceholderUrl,\n agentIconUrl: managedAgentRoundedIconUrl(\n mentionSessionAgentProvider(item) ?? item.agentName\n ),\n statusTag: agentSessionStatusTag(item.status)\n };\n }\n\n if (item.kind === \"workspace-app\") {\n return {\n kind: \"app\",\n name: item.name,\n description: item.description ?? null,\n iconUrl: item.iconUrl ?? null\n };\n }\n\n if (item.kind === \"workspace-app-bundle\") {\n return {\n kind: \"app\",\n name: item.name,\n description: null,\n iconUrl: item.iconUrl ?? null\n };\n }\n\n if (item.kind === \"workspace-app-factory\") {\n return {\n kind: \"app-factory\",\n name: item.name\n };\n }\n\n return {\n kind: \"issue\",\n title: item.title,\n creatorName: item.creatorName ?? null,\n statusTag: agentIssueStatusTag(item.status)\n };\n}\n\n/**\n * 仅 workspace-issue 行,以及声明了能够提供产物文件(reference)的 workspace-app 行,\n * 才在行末尾展示「查看产物文件」入口。应用是否能提供产物文件由其 manifest 的\n * references 能力决定(`referencesListSupported`),而非硬编码应用名单。\n */\nfunction isReferenceableMentionItem(item: AgentContextMentionItem): boolean {\n if (item.kind === \"workspace-issue\") {\n return true;\n }\n if (item.kind === \"workspace-app\") {\n return item.referencesListSupported === true;\n }\n return false;\n}\n\nfunction mentionSessionAgentProvider(\n item: Extract<AgentContextMentionItem, { kind: \"session\" }>\n): string | null {\n const queryStart = item.href.indexOf(\"?\");\n if (queryStart < 0) {\n return null;\n }\n return new URLSearchParams(item.href.slice(queryStart + 1)).get(\"provider\");\n}\n\nfunction agentSessionStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n const activityStatus = normalizeAgentActivityDisplayStatus(status);\n return {\n label: workspaceAgentActivityStatusLabel(activityStatus),\n tone: mentionStatusTone(activityStatus),\n pulse: activityStatus === \"working\" || activityStatus === \"waiting\",\n variant: \"activity\",\n dataStatus: activityStatus\n };\n}\n\nfunction agentIssueStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n return {\n label: roomIssueStatusLabel(status),\n tone: issueMentionStatusTone(status),\n variant: \"issue\",\n dataStatus: status.trim().toLowerCase() || \"not_started\"\n };\n}\n\nfunction mentionStatusTone(\n status: AgentActivityDisplayStatus\n): MentionRowStatusTone {\n if (status === \"working\") {\n return \"blue\";\n }\n if (status === \"waiting\" || status === \"canceled\") {\n return \"amber\";\n }\n if (status === \"completed\" || status === \"idle\") {\n return \"green\";\n }\n if (status === \"failed\") {\n return \"red\";\n }\n return \"neutral\";\n}\n\nfunction browseHintForFilter(filter: AgentMentionFilterId): string {\n if (filter === \"all\") {\n return translate(\"agentHost.agentGui.contextPickerBrowseAllHint\");\n }\n switch (filter) {\n case \"app\":\n return translate(\"agentHost.agentGui.contextPickerBrowseAppHint\");\n case \"file\":\n return translate(\"agentHost.agentGui.contextPickerBrowseFileHint\");\n case \"session\":\n return translate(\"agentHost.agentGui.contextPickerBrowseSessionHint\");\n case \"issue\":\n return translate(\"agentHost.agentGui.contextPickerBrowseIssueHint\");\n }\n}\n\nfunction hasInteractiveGroupEntries(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n return groups.some((group) => group.items.length > 0 || group.hasMore);\n}\n\nfunction isFileBrowseGroupsOnlyEmpty(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n const fileGroups = groups.filter(\n (group) =>\n group.id === \"opened_files\" || group.id === \"agent_generated_files\"\n );\n if (fileGroups.length === 0) {\n return false;\n }\n return fileGroups.every(\n (group) => group.items.length === 0 && !group.hasMore\n );\n}\n\nfunction hasVisibleFileGroupEntries(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n return groups.some(\n (group) =>\n (group.id === \"files\" ||\n group.id === \"opened_files\" ||\n group.id === \"agent_generated_files\") &&\n (group.items.length > 0 || group.hasMore)\n );\n}\n\nfunction shouldShowFileSearchMoreHint(input: {\n filter: AgentMentionFilterId;\n groups: ReadonlyArray<AgentMentionGroup>;\n mode: AgentMentionSearchState[\"mode\"];\n query: string;\n}): boolean {\n if (input.filter !== \"file\" || input.query.trim()) {\n return false;\n }\n if (input.mode !== \"browse\" && input.mode !== \"results\") {\n return false;\n }\n return hasVisibleFileGroupEntries(input.groups);\n}\n\nfunction shouldShowBrowseSearchHint(input: {\n browseFilter: AgentMentionFilterId;\n groups: ReadonlyArray<AgentMentionGroup>;\n highlightedBrowseCategory: string | null;\n mode: AgentMentionSearchState[\"mode\"];\n}): boolean {\n if (input.mode !== \"browse\" || hasInteractiveGroupEntries(input.groups)) {\n return false;\n }\n if (input.groups.length === 0) {\n return true;\n }\n if (\n input.highlightedBrowseCategory !== null &&\n input.highlightedBrowseCategory !== input.browseFilter\n ) {\n return true;\n }\n return (\n input.browseFilter === \"file\" && isFileBrowseGroupsOnlyEmpty(input.groups)\n );\n}\n","import { translate, type TranslateFn } from \"../i18n/index\";\n\nexport function roomIssueStatusLabel(status: string, t?: TranslateFn): string {\n const translateFn = t ?? translate;\n switch (status) {\n case \"not_started\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusNotStarted\");\n case \"running\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusRunning\");\n case \"in_progress\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusInProgress\");\n case \"pending_acceptance\":\n return translateFn(\n \"agentHost.roomIssueNode.issueStatusPendingAcceptance\"\n );\n case \"completed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCompleted\");\n case \"failed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusFailed\");\n case \"canceled\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCanceled\");\n default:\n return (\n status || translateFn(\"agentHost.roomIssueNode.issueStatusUnknown\")\n );\n }\n}\n"],"mappings":"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","names":["AGENT_GENERATED_FILE_PROVIDER_ID","AGENT_SESSION_PROVIDER_ID","FILE_PROVIDER_ID","WORKSPACE_APP_PROVIDER_ID","WORKSPACE_ISSUE_PROVIDER_ID"]}
|