@tutti-os/agent-gui 0.0.233 → 0.0.235
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/README.md +49 -0
- package/dist/{AgentRichTextReadonly-U3XUJYCW.js → AgentRichTextReadonly-CCELQPHE.js} +5 -5
- package/dist/agent-conversation/index.d.ts +17 -4
- package/dist/agent-conversation/index.js +13 -9
- package/dist/agent-conversation/index.js.map +1 -1
- package/dist/agent-gui.d.ts +19 -3
- package/dist/agent-gui.js +22 -16
- package/dist/agent-message-center/index.d.ts +1 -1
- package/dist/agent-message-center/index.js +10 -7
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentGuiNodeTypes-DW7T--Y8.d.ts → agentGuiNodeTypes-Dgl7kQHA.d.ts} +2 -2
- package/dist/agents.d.ts +1 -1
- package/dist/app/renderer/agentactivity.css +17 -0
- package/dist/{chunk-M6WEFXPL.js → chunk-2MCNNB2P.js} +2 -24
- package/dist/chunk-2MCNNB2P.js.map +1 -0
- package/dist/{chunk-CQFT3MI5.js → chunk-3YYI6RXA.js} +7 -5
- package/dist/{chunk-CQFT3MI5.js.map → chunk-3YYI6RXA.js.map} +1 -1
- package/dist/{chunk-EDP4D42H.js → chunk-45KN5Z5F.js} +877 -871
- package/dist/chunk-45KN5Z5F.js.map +1 -0
- package/dist/{chunk-T57ZZWTC.js → chunk-4HAG3FOY.js} +2 -2
- package/dist/{chunk-ZBI6R46N.js → chunk-5DN5N2XS.js} +2 -2
- package/dist/{chunk-BCBB4HOV.js → chunk-634MNSI5.js} +2 -2
- package/dist/chunk-A4KKC324.js +4768 -0
- package/dist/chunk-A4KKC324.js.map +1 -0
- package/dist/chunk-ALAGL6VL.js +48 -0
- package/dist/chunk-ALAGL6VL.js.map +1 -0
- package/dist/{chunk-2STAUA73.js → chunk-AYTUAZE3.js} +5 -2
- package/dist/chunk-AYTUAZE3.js.map +1 -0
- package/dist/{chunk-SWO67UWQ.js → chunk-CZOZBUIM.js} +7 -7
- package/dist/{chunk-SWO67UWQ.js.map → chunk-CZOZBUIM.js.map} +1 -1
- package/dist/{chunk-2L2LVSOD.js → chunk-EHNPHZE4.js} +881 -5812
- package/dist/chunk-EHNPHZE4.js.map +1 -0
- package/dist/{chunk-N5356722.js → chunk-EKQ7UX2B.js} +13 -319
- package/dist/chunk-EKQ7UX2B.js.map +1 -0
- package/dist/{chunk-ZXEICU6J.js → chunk-KK7YXPTS.js} +3 -1
- package/dist/chunk-KK7YXPTS.js.map +1 -0
- package/dist/{chunk-WGCDSA7P.js → chunk-MBM7PJIF.js} +27 -506
- package/dist/chunk-MBM7PJIF.js.map +1 -0
- package/dist/chunk-RMC2MGL4.js +557 -0
- package/dist/chunk-RMC2MGL4.js.map +1 -0
- package/dist/{chunk-JA6XAKKE.js → chunk-TWF6JXPC.js} +2 -2
- package/dist/{chunk-7AYFKNLD.js → chunk-TWMV6YTX.js} +4 -4
- package/dist/chunk-VV3YIU5W.js +25 -0
- package/dist/chunk-VV3YIU5W.js.map +1 -0
- package/dist/{chunk-GLVENTN6.js → chunk-WXLO33YP.js} +2 -2
- package/dist/chunk-XWPHTXEM.js +529 -0
- package/dist/chunk-XWPHTXEM.js.map +1 -0
- package/dist/chunk-YEXRTXTE.js +315 -0
- package/dist/chunk-YEXRTXTE.js.map +1 -0
- package/dist/{chunk-WMJDOMG6.js → chunk-ZELGKLW5.js} +4 -4
- package/dist/composer-projection.d.ts +37 -0
- package/dist/composer-projection.js +21 -0
- package/dist/composer-projection.js.map +1 -0
- package/dist/context-mention-palette/index.js +9 -7
- package/dist/conversation-projection.d.ts +551 -0
- package/dist/conversation-projection.js +42 -0
- package/dist/conversation-projection.js.map +1 -0
- package/dist/conversation-rail-projection.js +3 -3
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +32 -13
- package/dist/index.js +22 -16
- package/dist/index.js.map +1 -1
- package/dist/mention-search.js +7 -5
- package/dist/{types-CHAMK2g7.d.ts → types-DtXXsISB.d.ts} +1 -1
- package/dist/workbench/contribution.js +4 -4
- package/dist/workbench/index.js +4 -4
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workspace-agent-generated-files.d.ts +1 -12
- package/dist/workspaceAgentActivityListTypes-BUKNyMbh.d.ts +48 -0
- package/dist/{workspaceLinkActions-CzsbvGmC.d.ts → workspaceLinkActions-DxyzMy10.d.ts} +13 -12
- package/package.json +29 -15
- package/dist/chunk-2L2LVSOD.js.map +0 -1
- package/dist/chunk-2STAUA73.js.map +0 -1
- package/dist/chunk-EDP4D42H.js.map +0 -1
- package/dist/chunk-M6WEFXPL.js.map +0 -1
- package/dist/chunk-N5356722.js.map +0 -1
- package/dist/chunk-WGCDSA7P.js.map +0 -1
- package/dist/chunk-ZXEICU6J.js.map +0 -1
- /package/dist/{AgentRichTextReadonly-U3XUJYCW.js.map → AgentRichTextReadonly-CCELQPHE.js.map} +0 -0
- /package/dist/{chunk-T57ZZWTC.js.map → chunk-4HAG3FOY.js.map} +0 -0
- /package/dist/{chunk-ZBI6R46N.js.map → chunk-5DN5N2XS.js.map} +0 -0
- /package/dist/{chunk-BCBB4HOV.js.map → chunk-634MNSI5.js.map} +0 -0
- /package/dist/{chunk-JA6XAKKE.js.map → chunk-TWF6JXPC.js.map} +0 -0
- /package/dist/{chunk-7AYFKNLD.js.map → chunk-TWMV6YTX.js.map} +0 -0
- /package/dist/{chunk-GLVENTN6.js.map → chunk-WXLO33YP.js.map} +0 -0
- /package/dist/{chunk-WMJDOMG6.js.map → chunk-ZELGKLW5.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../agent-gui/agentGuiNode/AgentMentionLabels.ts","../shared/richText/richTextDocument.ts","../agent-gui/agentGuiNode/agentMentionSearchHelpers.ts","../agent-gui/agentGuiNode/AgentMentionSearchContracts.ts","../agent-gui/agentGuiNode/AgentMentionSearchModel.ts","../agent-gui/agentGuiNode/agentMentionAgentGeneratedFilesPresentation.ts","../agent-gui/agentGuiNode/AgentMentionSearchCache.ts","../agent-gui/agentGuiNode/agentMentionSearchDiagnostics.ts","../agent-gui/agentGuiNode/AgentMentionSearchIndex.ts","../agent-gui/agentGuiNode/AgentMentionSearchControllerBase.ts","../agent-gui/agentGuiNode/agentGuiScheduler.ts","../agent-gui/agentGuiNode/AgentMentionDirectoryRequestLifecycle.ts","../agent-gui/agentGuiNode/agentMentionWorkspaceFilesPresentation.ts","../agent-gui/agentGuiNode/AgentMentionProvenanceFilterState.ts","../agent-gui/agentGuiNode/AgentMentionSearchController.ts"],"sourcesContent":["import { translate } from \"../../i18n/index\";\nimport type {\n AgentMentionFilterId,\n AgentMentionGroupId\n} from \"./AgentMentionSearchController\";\n\nexport function agentMentionGroupLabel(groupId: AgentMentionGroupId): string {\n if (groupId.startsWith(\"issue-topic:\")) {\n return \"\";\n }\n switch (groupId) {\n case \"apps\":\n return translate(\"agentHost.agentGui.mentionGroupApps\");\n case \"agents\":\n return translate(\"agentHost.agentGui.mentionGroupAgents\");\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 default:\n return \"\";\n }\n}\n\nexport function agentMentionFilterLabel(filter: AgentMentionFilterId): string {\n switch (filter) {\n case \"app\":\n return translate(\"agentHost.agentGui.mentionFilterApp\");\n case \"agent\":\n return translate(\"agentHost.agentGui.mentionFilterAgent\");\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.startsWith(\"issue-topic:\")) {\n return \"\";\n }\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 === \"agents\") {\n return translate(\"agentHost.agentGui.mentionEmptyAgents\");\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 if (groupId.startsWith(\"agent:\")) {\n return translate(\"agentHost.agentGui.mentionEmptyMySessions\");\n }\n return translate(\"agentHost.agentGui.mentionEmptyIssues\");\n}\n","import { isRichTextMentionHref } from \"@tutti-os/ui-rich-text/core\";\n\nexport type WorkspaceFileLinkRef = {\n name: string;\n path: string;\n href: string;\n kind: \"file\" | \"folder\";\n};\n\nexport type WorkspaceFileLinkInput = {\n name?: string | null;\n path: string;\n kind?: \"file\" | \"folder\";\n};\n\nconst MARKDOWN_LINK_PATTERN = /\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g;\nconst MARKDOWN_IMAGE_PATTERN = /!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)/g;\nconst EXTERNAL_LINK_PREFIX = /^(?:[a-z]+:)?\\/\\//i;\n\ntype LegacyJSONContentNode = {\n type?: string;\n text?: string;\n attrs?: Record<string, unknown>;\n content?: LegacyJSONContentNode[];\n};\n\nfunction normalizeLineEndings(value: string): string {\n return value.replace(/\\r\\n?/g, \"\\n\");\n}\n\nfunction normalizeContentString(value?: string | null): string {\n const trimmed = normalizeLineEndings(value ?? \"\").trim();\n if (!trimmed) {\n return \"\";\n }\n const markdown = convertLegacyDocumentString(trimmed);\n return markdown || trimmed;\n}\n\nfunction convertLegacyDocumentString(value: string): string {\n try {\n const parsed = JSON.parse(value) as LegacyJSONContentNode;\n if (parsed?.type !== \"doc\" || !Array.isArray(parsed.content)) {\n return \"\";\n }\n return renderLegacyNodesToMarkdown(parsed.content).trim();\n } catch {\n return \"\";\n }\n}\n\nfunction renderLegacyNodesToMarkdown(nodes: LegacyJSONContentNode[]): string {\n return nodes\n .map((node) => renderLegacyNodeToMarkdown(node))\n .filter((part) => part.length > 0)\n .join(\"\\n\\n\");\n}\n\nfunction renderLegacyNodeToMarkdown(\n node: LegacyJSONContentNode | null | undefined\n): string {\n if (!node) {\n return \"\";\n }\n if (node.type === \"text\") {\n return node.text ?? \"\";\n }\n if (node.type === \"workspaceFileLink\") {\n const attrs = node.attrs ?? {};\n const kind = attrs.kind === \"folder\" ? \"folder\" : \"file\";\n const hrefValue =\n (typeof attrs.href === \"string\" ? attrs.href : undefined) ||\n (typeof attrs.path === \"string\" ? attrs.path : undefined) ||\n \"\";\n const href = normalizeWorkspaceFileLinkHref(hrefValue, kind);\n const label =\n (typeof attrs.name === \"string\" ? attrs.name : undefined)?.trim() ||\n href.split(\"/\").filter(Boolean).at(-1) ||\n href;\n return href && label ? `[${label}](${href})` : label;\n }\n if (Array.isArray(node.content)) {\n const inline = node.content\n .map((child) => renderLegacyNodeToMarkdown(child))\n .filter((part) => part.length > 0)\n .join(\"\")\n .trim();\n if (!inline) {\n return \"\";\n }\n if (node.type === \"paragraph\") {\n return inline;\n }\n return inline;\n }\n return \"\";\n}\n\nfunction normalizeWorkspacePath(\n pathOrHref: string,\n kind: \"file\" | \"folder\"\n): string {\n const trimmed = pathOrHref.trim();\n if (!trimmed) {\n return \"\";\n }\n if (kind === \"folder\" && !trimmed.endsWith(\"/\")) {\n return `${trimmed}/`;\n }\n return trimmed;\n}\n\nfunction isWorkspaceReferenceHref(href: string): boolean {\n const trimmed = href.trim();\n if (\n !trimmed ||\n isRichTextMentionHref(trimmed) ||\n EXTERNAL_LINK_PREFIX.test(trimmed)\n ) {\n return false;\n }\n return true;\n}\n\nexport function normalizeWorkspaceFileLinkHref(\n pathOrHref: string,\n kind: \"file\" | \"folder\" = \"file\"\n): string {\n return normalizeWorkspacePath(pathOrHref, kind);\n}\n\nexport function createWorkspaceFileLinkMarkdown(\n input: WorkspaceFileLinkInput\n): string {\n const kind = input.kind === \"folder\" ? \"folder\" : \"file\";\n const href = normalizeWorkspaceFileLinkHref(input.path, kind);\n const displayName =\n input.name?.trim() ||\n href.split(\"/\").filter(Boolean).at(-1) ||\n href ||\n input.path.trim();\n if (!href || !displayName) {\n return \"\";\n }\n return `[${displayName}](${href})`;\n}\n\nexport function appendWorkspaceFileLinksToContent(\n value: string | null | undefined,\n refs: readonly WorkspaceFileLinkInput[]\n): string {\n const content = normalizeContentString(value);\n const existing = new Set(\n extractWorkspaceFileLinksFromContent(content).map((ref) => ref.path)\n );\n const rendered = refs\n .map((ref) => {\n const kind = ref.kind === \"folder\" ? \"folder\" : \"file\";\n const path = normalizeWorkspaceFileLinkHref(ref.path, kind);\n if (!path || existing.has(path)) {\n return \"\";\n }\n existing.add(path);\n return createWorkspaceFileLinkMarkdown({ ...ref, path, kind });\n })\n .filter(Boolean);\n\n if (rendered.length === 0) {\n return content;\n }\n return content ? `${content}\\n\\n${rendered.join(\"\\n\")}` : rendered.join(\"\\n\");\n}\n\nexport function extractWorkspaceFileLinksFromContent(\n value: string | null | undefined\n): WorkspaceFileLinkRef[] {\n const content = normalizeContentString(value);\n const refs = new Map<string, WorkspaceFileLinkRef>();\n for (const match of content.matchAll(MARKDOWN_LINK_PATTERN)) {\n const name = match[1]?.trim() ?? \"\";\n const href = match[2]?.trim() ?? \"\";\n if (!name || !isWorkspaceReferenceHref(href)) {\n continue;\n }\n const kind = href.endsWith(\"/\") ? \"folder\" : \"file\";\n const path = normalizeWorkspaceFileLinkHref(href, kind);\n if (!path || refs.has(path)) {\n continue;\n }\n refs.set(path, {\n name,\n path,\n href: path,\n kind\n });\n }\n return [...refs.values()];\n}\n\nexport function removeWorkspaceFileLinkFromContent(\n content: string,\n path: string\n): string {\n const targetPath = path.trim();\n if (!targetPath) {\n return normalizeContentString(content);\n }\n const normalized = normalizeContentString(content);\n const next = normalized\n .split(\"\\n\")\n .filter((line) => {\n const trimmed = line.trim();\n if (!trimmed) {\n return true;\n }\n const refs = extractWorkspaceFileLinksFromContent(trimmed);\n return !refs.some((ref) => ref.path === targetPath) || refs.length > 1;\n })\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\");\n return next.trim();\n}\n\nexport function extractPlainTextFromContent(value?: string | null): string {\n const content = normalizeContentString(value);\n if (!content) {\n return \"\";\n }\n return content\n .replace(MARKDOWN_IMAGE_PATTERN, \" $1 \")\n .replace(MARKDOWN_LINK_PATTERN, \" $1 \")\n .replace(/^[\\s>*#+-]+/gm, \" \")\n .replace(/`([^`]+)`/g, \" $1 \")\n .replace(/[*_~]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport function extractPlainTextWithoutFilesFromContent(\n value?: string | null\n): string {\n const content = normalizeContentString(value);\n if (!content) {\n return \"\";\n }\n return content\n .replace(MARKDOWN_IMAGE_PATTERN, \" \")\n .replace(MARKDOWN_LINK_PATTERN, \" \")\n .replace(/^[\\s>*#+-]+/gm, \" \")\n .replace(/`([^`]+)`/g, \" $1 \")\n .replace(/[*_~]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\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 { normalizeAgentSessionMentionTitle } from \"./agentRichText/agentFileMentionExtension\";\nimport { createRichTextMentionHref } from \"@tutti-os/ui-rich-text/core\";\nimport type {\n AgentMentionFilterId,\n AgentMentionGroup,\n AgentMentionGroupId\n} from \"./AgentMentionSearchController\";\nimport type { AgentMentionRawGroups } from \"./AgentMentionSearchContracts\";\nimport type {\n AgentActivityMessage,\n AgentActivitySession\n} from \"@tutti-os/agent-activity-core\";\nimport type { WorkspaceAgentActivitySessionSummary } from \"../../shared/workspaceAgentSessionSummaryTypes\";\n\nexport function buildSessionMentionItem(input: {\n workspaceId: string;\n currentUserId: string;\n session: AgentActivitySession;\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 sessionAgentTargetId = input.session.agentTargetId?.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: createRichTextMentionHref({\n providerId: \"agent-session\",\n entityId: input.session.agentSessionId,\n label: mentionTitle,\n scope: {\n workspaceId: input.workspaceId,\n ...(sessionAgentTargetId ? { agentTargetId: sessionAgentTargetId } : {})\n }\n }),\n workspaceId: input.workspaceId,\n targetId: input.session.agentSessionId,\n ...(sessionAgentTargetId ? { agentTargetId: sessionAgentTargetId } : {}),\n name: `${initiatorName} & ${agentName} ${mentionTitle}`.trim(),\n title: mentionTitle,\n scope,\n ...(sessionUserId ? { initiatorUserId: sessionUserId } : {}),\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: AgentActivitySession,\n _messages: readonly AgentActivityMessage[]\n): string {\n return compactText(resolveWorkspaceAgentActivityTitle(session));\n}\n\nfunction resolveSessionDisplayStatus(\n session: AgentActivitySession,\n summary: WorkspaceAgentActivitySessionSummary | null\n): string {\n const sessionStatus = resolveWorkspaceAgentActivityStatus(session);\n if (sessionStatus !== \"idle\") {\n return sessionStatus;\n }\n const status = (\n summary?.executionStatus?.currentOrFinalStatus ??\n summary?.currentOrFinalStatus ??\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 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 \"session\",\n \"file\",\n \"issue\",\n \"agent\",\n \"app\"\n] as const satisfies readonly AgentMentionFilterId[];\n\nexport const DEFAULT_AGENT_MENTION_FILTER =\n \"session\" satisfies AgentMentionFilterId;\nexport const DEFAULT_MENTION_GROUP_PAGE_SIZE = 10;\n\nexport function mentionGroupPageSize(\n _filter: AgentMentionFilterId,\n _groupId: AgentMentionGroupId\n): number {\n return 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 \"agent\":\n return [\"agents\"];\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 }\n}\n\nexport function shouldShowEmptyGroup(\n groupId: AgentMentionGroupId,\n filter: AgentMentionFilterId,\n query: string\n): boolean {\n if (groupId.startsWith(\"issue-topic:\")) {\n return false;\n }\n const hasQuery = query.trim().length > 0;\n if (groupId === \"files\") {\n return false;\n }\n if (groupId === \"opened_files\" || groupId === \"agent_generated_files\") {\n return filter === \"file\" && !hasQuery;\n }\n if (groupId === \"apps\") {\n return filter === \"app\";\n }\n if (groupId === \"agents\") {\n return filter === \"agent\";\n }\n if (groupId === \"my_sessions\") {\n return filter === \"session\";\n }\n if (groupId === \"collab_sessions\") {\n return false;\n }\n return 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 resolveMentionGroupItems(\n groupId: AgentMentionGroupId,\n rawGroups: AgentMentionRawGroups\n): AgentContextMentionItem[] {\n if (groupId.startsWith(\"issue-topic:\")) {\n return [];\n }\n if (groupId === \"files\") {\n return [...rawGroups.opened_files, ...rawGroups.agent_generated_files];\n }\n if (groupId === \"my_sessions\" || groupId === \"collab_sessions\") {\n return rawGroups.sessions.filter(\n (item) => item.kind === \"session\" && item.scope === groupId\n );\n }\n if (groupId.startsWith(\"agent:\")) {\n return [];\n }\n if (\n groupId === \"apps\" ||\n groupId === \"agents\" ||\n groupId === \"opened_files\" ||\n groupId === \"agent_generated_files\" ||\n groupId === \"issues\"\n ) {\n return rawGroups[groupId];\n }\n return [];\n}\n\nexport function resolveMentionGroupTotalCount(\n groupId: AgentMentionGroupId,\n totalCounts: Partial<Record<AgentMentionGroupId, number>>,\n itemCount: number\n): number {\n if (groupId.startsWith(\"issue-topic:\")) {\n return itemCount;\n }\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 type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport type { AgentContextMentionProvider } from \"./agentContextMentionProvider\";\nimport { AGENT_CONTEXT_MENTION_PROVIDER_IDS } from \"./agentContextMentionProvider\";\nimport type { AgentMentionSearchDiagnosticLog } from \"./agentMentionSearchDiagnostics\";\nimport type { RuntimeDiagnosticsDetailValue } from \"../../shared/contracts/dto/debug\";\nimport { AGENT_MENTION_FILTER_TAB_ORDER } from \"./agentMentionSearchHelpers\";\nimport { agentMentionFilterLabel } from \"./AgentMentionLabels\";\nimport type {\n MentionPaletteGroup,\n MentionPaletteState\n} from \"@tutti-os/ui-rich-text/at-panel\";\n\nexport type AgentMentionFilterId =\n | \"session\"\n | \"file\"\n | \"issue\"\n | \"agent\"\n | \"app\";\nexport type AgentMentionStaticGroupId =\n | \"apps\"\n | \"agents\"\n | \"files\"\n | \"opened_files\"\n | \"agent_generated_files\"\n | \"my_sessions\"\n | \"collab_sessions\"\n | \"issues\";\nexport type AgentMentionIssueTopicGroupId = `issue-topic:${string}`;\nexport type AgentMentionProvenanceGroupId = `agent:${string}`;\nexport type AgentMentionMemberGroupId = `member:${string}`;\nexport type AgentMentionGroupId =\n | AgentMentionStaticGroupId\n | AgentMentionIssueTopicGroupId\n | AgentMentionProvenanceGroupId\n | AgentMentionMemberGroupId;\n\nexport type AgentMentionRawGroupId =\n | Exclude<\n AgentMentionStaticGroupId,\n \"files\" | \"my_sessions\" | \"collab_sessions\"\n >\n | \"sessions\";\nexport type AgentMentionRawGroups = Record<\n AgentMentionRawGroupId,\n AgentContextMentionItem[]\n>;\nexport type AgentMentionTotalCounts = Partial<\n Record<AgentMentionGroupId, number>\n>;\n\nexport interface AgentMentionIssueTopicGroup {\n id: `issue-topic:${string}`;\n providerGroupId: string;\n label: string;\n items: AgentContextMentionItem[];\n totalCount: number;\n nextPageToken: string | null;\n loadMoreStatus: \"idle\" | \"loading\" | \"error\";\n loadMoreError: string | null;\n}\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\nexport interface AgentMentionSearchControllerOptions {\n contextMentionProviders?: readonly AgentContextMentionProvider[];\n debounceMs?: number;\n fileLimit?: number;\n issueLimit?: number;\n browseCacheTtlMs?: number;\n providerTimeoutMs?: number;\n diagnosticInfoLogger?: (payload: AgentMentionSearchDiagnosticLog) => void;\n diagnosticNow?: () => number;\n diagnosticSlowThresholdMs?: number;\n}\n\nexport type AgentMentionSearchListener = (\n state: AgentMentionSearchState\n) => void;\n\nexport interface AgentMentionLifecycleDiagnosticLog {\n event:\n | \"browse.open\"\n | \"browse.preload\"\n | \"browse.cache\"\n | \"browse.fetch.start\"\n | \"browse.fetch.dedupe\"\n | \"browse.fetch.success\"\n | \"browse.fetch.error\"\n | \"browse.apply.skipped\";\n details: Record<string, RuntimeDiagnosticsDetailValue>;\n}\n\nexport const DEFAULT_DEBOUNCE_MS = 120;\nexport const DEFAULT_FILE_LIMIT = 30;\nexport const DEFAULT_ISSUE_LIMIT = 25;\nexport const DEFAULT_SESSION_LIMIT = 30;\nexport const DEFAULT_PROVIDER_TIMEOUT_MS = 3500;\nexport const DEFAULT_DIAGNOSTIC_SLOW_THRESHOLD_MS = 250;\nexport const DEFAULT_BROWSE_CACHE_TTL_MS = 30_000;\nexport const AGENT_MENTION_LIFECYCLE_LOG_PREFIX =\n \"[agent-gui] mention-lifecycle\";\n\n// default (\"en\") runtime, since the agent GUI i18n locale is only synced once the\n// AgentGuiI18nProvider renders.\nexport function buildBrowseCategories(): AgentMentionBrowseCategory[] {\n return AGENT_MENTION_FILTER_TAB_ORDER.map((id) => ({\n id,\n label: agentMentionFilterLabel(id)\n }));\n}\n\nexport const {\n agentGeneratedFile: AGENT_GENERATED_FILE_PROVIDER_ID,\n agentSession: AGENT_SESSION_PROVIDER_ID,\n agentTarget: AGENT_TARGET_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","import { createRichTextMentionHref } from \"@tutti-os/ui-rich-text/core\";\nimport { getOptionalAgentHostApi } from \"../../agentActivityHost\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport type { AgentContextMentionDirectoryDescriptor } from \"./agentContextMentionProvider\";\nimport { normalizeAgentSessionMentionTitle } from \"./agentRichText/agentFileMentionExtension\";\nimport { resolveAgentSessionMentionIconUrl } from \"./agentRichText/agentMentionPresentation\";\nimport type { AgentContextMentionInsertResult } from \"./agentContextMentionProvider\";\nimport type { AgentMentionProviderQueryDiagnostic } from \"./agentMentionSearchDiagnostics\";\nimport type {\n AgentMentionFilterId,\n AgentMentionGroup,\n AgentMentionGroupId,\n AgentMentionIssueTopicGroup,\n AgentMentionRawGroups,\n AgentMentionTotalCounts\n} from \"./AgentMentionSearchContracts\";\nimport {\n AGENT_GENERATED_FILE_PROVIDER_ID,\n AGENT_MENTION_LIFECYCLE_LOG_PREFIX,\n AGENT_SESSION_PROVIDER_ID,\n AGENT_TARGET_PROVIDER_ID,\n FILE_PROVIDER_ID,\n WORKSPACE_APP_PROVIDER_ID,\n WORKSPACE_ISSUE_PROVIDER_ID,\n type AgentMentionLifecycleDiagnosticLog\n} from \"./AgentMentionSearchContracts\";\nimport { presentAgentGeneratedFileMentionItems } from \"./agentMentionAgentGeneratedFilesPresentation\";\nimport type {\n ReferenceProvenanceCatalog,\n ReferenceProvenanceFilter,\n ReferenceProvenanceOption\n} from \"@tutti-os/workspace-file-reference/contracts\";\nimport {\n buildEmptyGroup,\n compactText,\n groupIdsForFilter,\n mentionGroupPageSize,\n resolveMentionGroupItems,\n resolveMentionGroupTotalCount,\n shouldShowEmptyGroup\n} from \"./agentMentionSearchHelpers\";\nimport { resolveReferenceProvenanceAgentLabelParts } from \"@tutti-os/workspace-file-reference/core\";\n\ntype AgentProvenanceMentionItem = Extract<\n AgentContextMentionItem,\n { kind: \"session\" | \"agent-target\" }\n>;\n\nexport function buildAgentMentionGroups(input: {\n agentGeneratedBrowsePath: string | null;\n currentFileSearchLimit: number;\n currentFilter: AgentMentionFilterId;\n currentQuery: string;\n expandedCounts: Partial<Record<AgentMentionGroupId, number>>;\n issueTopicGroups: readonly AgentMentionIssueTopicGroup[] | null;\n rawGroups: AgentMentionRawGroups;\n totalCounts: AgentMentionTotalCounts;\n provenanceCatalog: ReferenceProvenanceCatalog | null;\n provenanceFilter: ReferenceProvenanceFilter | null;\n}): AgentMentionGroup[] {\n if (input.currentFilter === \"issue\" && input.issueTopicGroups !== null) {\n return input.issueTopicGroups.map((group) => ({\n id: group.id,\n label: group.label,\n items: group.items,\n totalCount: group.totalCount,\n visibleCount: group.items.length,\n hasMore: group.nextPageToken !== null,\n expandStatus: group.loadMoreStatus\n }));\n }\n const provenanceGroups = buildAgentProvenanceGroups(input);\n if (provenanceGroups) {\n return provenanceGroups;\n }\n const orderedGroupIds = groupIdsForFilter(input.currentFilter);\n return orderedGroupIds\n .map((groupId) => {\n const rawItems = resolveMentionGroupItems(groupId, input.rawGroups);\n const items =\n groupId === \"agent_generated_files\"\n ? presentAgentGeneratedFileMentionItems({\n files: rawItems,\n browsePath: input.agentGeneratedBrowsePath,\n query: input.currentQuery\n })\n : rawItems;\n if (items.length === 0) {\n if (\n !shouldShowEmptyGroup(\n groupId,\n input.currentFilter,\n input.currentQuery\n )\n ) {\n return null;\n }\n return buildEmptyGroup(groupId, input.currentQuery);\n }\n const pageSize = mentionGroupPageSize(input.currentFilter, groupId);\n const visibleCount =\n groupId === \"apps\"\n ? items.length\n : Math.min(items.length, input.expandedCounts[groupId] ?? pageSize);\n const totalCount = resolveMentionGroupTotalCount(\n groupId,\n input.totalCounts,\n items.length\n );\n return {\n id: groupId,\n items: items.slice(0, visibleCount),\n totalCount,\n visibleCount,\n hasMore:\n groupId !== \"apps\" &&\n (items.length > visibleCount ||\n ((groupId === \"opened_files\" ||\n groupId === \"files\" ||\n groupId === \"agent_generated_files\") &&\n items.length >= input.currentFileSearchLimit) ||\n totalCount > visibleCount)\n } satisfies AgentMentionGroup;\n })\n .filter((group): group is AgentMentionGroup => group !== null);\n}\n\nexport function cloneAgentMentionIssueTopicGroups(\n groups: readonly AgentMentionIssueTopicGroup[] | null\n): AgentMentionIssueTopicGroup[] | null {\n return (\n groups?.map((group) => ({ ...group, items: [...group.items] })) ?? null\n );\n}\n\nexport function issueTopicPaginationChanges(\n groupsAtStart: readonly AgentMentionIssueTopicGroup[] | null,\n currentGroups: readonly AgentMentionIssueTopicGroup[] | null\n): AgentMentionIssueTopicGroup[] {\n if (!groupsAtStart || !currentGroups) {\n return [];\n }\n const startingGroups = new Map(\n groupsAtStart.map((group) => [group.id, group] as const)\n );\n return currentGroups.flatMap((group) => {\n const startingGroup = startingGroups.get(group.id);\n if (!startingGroup) {\n return [];\n }\n const startingIssueIds = new Set(\n startingGroup.items\n .filter((item) => item.kind === \"workspace-issue\")\n .map((item) => item.targetId)\n );\n const appendedItems = group.items.filter(\n (item) =>\n item.kind !== \"workspace-issue\" || !startingIssueIds.has(item.targetId)\n );\n if (\n appendedItems.length === 0 &&\n group.nextPageToken === startingGroup.nextPageToken\n ) {\n return [];\n }\n return [{ ...group, items: appendedItems }];\n });\n}\n\nfunction buildAgentProvenanceGroups(input: {\n currentFilter: AgentMentionFilterId;\n expandedCounts: Partial<Record<AgentMentionGroupId, number>>;\n provenanceCatalog: ReferenceProvenanceCatalog | null;\n provenanceFilter: ReferenceProvenanceFilter | null;\n rawGroups: AgentMentionRawGroups;\n}): AgentMentionGroup[] | null {\n if (\n (input.currentFilter !== \"session\" && input.currentFilter !== \"agent\") ||\n !input.provenanceCatalog?.enabledDimensions.includes(\"agent\")\n ) {\n return null;\n }\n const selectedAgentTargetIds = input.provenanceFilter?.agentTargetIds ?? null;\n const selectedAgentTargetIdSet =\n selectedAgentTargetIds === null ? null : new Set(selectedAgentTargetIds);\n const memberOptionsById = new Map(\n input.provenanceCatalog.memberOptions.map((member) => [member.id, member])\n );\n const agentOptionsById = new Map(\n input.provenanceCatalog.agentOptions.map((agent) => [agent.id, agent])\n );\n const sourceItems = agentProvenanceItemsForFilter(input)\n .map((item) =>\n projectAgentProvenanceMemberPresentation(\n item,\n memberOptionsById,\n agentOptionsById\n )\n )\n .filter((item) => {\n if (selectedAgentTargetIdSet === null) {\n return true;\n }\n const agentTargetId = agentTargetIdForMentionItem(item);\n return (\n agentTargetId !== null && selectedAgentTargetIdSet.has(agentTargetId)\n );\n });\n const cataloguedItemIds = new Set<string>();\n const catalogGroups = agentProvenanceGroupSpecs(\n input.currentFilter,\n input.provenanceCatalog\n ).flatMap((group) => {\n const items = sourceItems.filter(group.matches);\n if (items.length === 0) {\n return [];\n }\n items.forEach((item) => cataloguedItemIds.add(item.targetId));\n return [\n buildAgentProvenanceGroup({\n currentFilter: input.currentFilter,\n expandedCounts: input.expandedCounts,\n id: group.id,\n label: group.label,\n items\n })\n ];\n });\n if (selectedAgentTargetIdSet !== null) {\n return catalogGroups;\n }\n const unmatchedGroups = new Map<\n string,\n {\n id: `agent:${string}`;\n label: string;\n items: AgentProvenanceMentionItem[];\n }\n >();\n for (const item of sourceItems) {\n if (cataloguedItemIds.has(item.targetId)) {\n continue;\n }\n const identity = unmatchedAgentProvenanceIdentity(item);\n const key = `uncatalogued:${identity}`;\n const existing = unmatchedGroups.get(key);\n if (existing) {\n existing.items.push(item);\n continue;\n }\n unmatchedGroups.set(key, {\n id: agentProvenanceMentionGroupId(key),\n label: unmatchedAgentProvenanceLabel(item),\n items: [item]\n });\n }\n return [\n ...catalogGroups,\n ...[...unmatchedGroups.values()].map((group) =>\n buildAgentProvenanceGroup({\n currentFilter: input.currentFilter,\n expandedCounts: input.expandedCounts,\n ...group\n })\n )\n ];\n}\n\nfunction agentProvenanceGroupSpecs(\n currentFilter: AgentMentionFilterId,\n catalog: ReferenceProvenanceCatalog\n): Array<{\n id: AgentMentionGroupId;\n label: string;\n matches: (item: AgentProvenanceMentionItem) => boolean;\n}> {\n if (currentFilter === \"session\") {\n return catalog.memberOptions.map((member) => ({\n id: memberProvenanceMentionGroupId(member.id),\n label: member.label,\n matches: (item) =>\n item.kind === \"session\" && item.initiatorUserId?.trim() === member.id\n }));\n }\n const groupedAgentTargetIds = new Set<string>();\n const memberGroups = catalog.memberOptions.flatMap((member) => {\n const agentTargetIds = catalog.agentOptions.flatMap((option) =>\n option.parentMemberId?.trim() === member.id ? [option.id] : []\n );\n if (agentTargetIds.length === 0) {\n return [];\n }\n agentTargetIds.forEach((agentTargetId) =>\n groupedAgentTargetIds.add(agentTargetId)\n );\n return [\n {\n id: memberProvenanceMentionGroupId(member.id),\n label: member.label,\n matches: (item: AgentProvenanceMentionItem) => {\n const agentTargetId = agentTargetIdForMentionItem(item);\n return (\n agentTargetId !== null && agentTargetIds.includes(agentTargetId)\n );\n }\n }\n ];\n });\n const unownedAgentGroups = catalog.agentOptions.flatMap((option) =>\n groupedAgentTargetIds.has(option.id)\n ? []\n : [\n {\n id: agentProvenanceMentionGroupId(option.id),\n label: option.label,\n matches: (item: AgentProvenanceMentionItem) =>\n agentTargetIdForMentionItem(item) === option.id\n }\n ]\n );\n return [...memberGroups, ...unownedAgentGroups];\n}\n\nfunction agentProvenanceItemsForFilter(input: {\n currentFilter: AgentMentionFilterId;\n rawGroups: AgentMentionRawGroups;\n}): AgentProvenanceMentionItem[] {\n if (input.currentFilter === \"session\") {\n return input.rawGroups.sessions.filter((item) => item.kind === \"session\");\n }\n return input.rawGroups.agents.filter((item) => item.kind === \"agent-target\");\n}\n\nfunction agentTargetIdForMentionItem(\n item: AgentProvenanceMentionItem\n): string | null {\n if (item.kind === \"session\") {\n return item.agentTargetId?.trim() || null;\n }\n if (item.kind === \"agent-target\") {\n return item.targetId.trim() || null;\n }\n return null;\n}\n\nfunction projectAgentProvenanceMemberPresentation(\n item: AgentProvenanceMentionItem,\n memberOptionsById: ReadonlyMap<string, ReferenceProvenanceOption>,\n agentOptionsById: ReadonlyMap<string, ReferenceProvenanceOption>\n): AgentProvenanceMentionItem {\n if (item.kind !== \"session\") {\n return item;\n }\n const initiatorUserId = item.initiatorUserId?.trim();\n const member = initiatorUserId\n ? memberOptionsById.get(initiatorUserId)\n : undefined;\n if (!member) {\n return item;\n }\n const initiatorAvatarUrl =\n member.iconUrl?.trim() || item.initiatorAvatarUrl?.trim();\n const agentTargetId = item.agentTargetId?.trim();\n const agentOption = agentTargetId\n ? agentOptionsById.get(agentTargetId)\n : undefined;\n const agentLabelParts =\n agentOption && agentOption.label === item.agentName\n ? resolveReferenceProvenanceAgentLabelParts(\n agentOption,\n memberOptionsById\n )\n : null;\n return {\n ...item,\n initiatorName: member.label,\n ...(initiatorAvatarUrl ? { initiatorAvatarUrl } : {}),\n ...(agentLabelParts\n ? {\n agentLabel: agentLabelParts.agentLabel,\n agentOwnerLabel: agentLabelParts.ownerLabel\n }\n : {})\n };\n}\n\nfunction unmatchedAgentProvenanceIdentity(\n item: AgentProvenanceMentionItem\n): string {\n if (item.kind === \"session\") {\n return item.initiatorUserId?.trim() || item.targetId;\n }\n return item.targetId;\n}\n\nfunction unmatchedAgentProvenanceLabel(\n item: AgentProvenanceMentionItem\n): string {\n if (item.kind === \"session\") {\n return (\n item.initiatorName.trim() ||\n item.initiatorUserId?.trim() ||\n item.agentName.trim() ||\n item.title\n );\n }\n return item.name;\n}\n\nfunction buildAgentProvenanceGroup(input: {\n currentFilter: AgentMentionFilterId;\n expandedCounts: Partial<Record<AgentMentionGroupId, number>>;\n id: AgentMentionGroupId;\n label: string;\n items: AgentContextMentionItem[];\n}): AgentMentionGroup {\n const pageSize = mentionGroupPageSize(input.currentFilter, input.id);\n const visibleCount = Math.min(\n input.items.length,\n input.expandedCounts[input.id] ?? pageSize\n );\n return {\n id: input.id,\n label: input.label,\n items: input.items.slice(0, visibleCount),\n totalCount: input.items.length,\n visibleCount,\n hasMore: input.items.length > visibleCount\n };\n}\n\nexport function agentProvenanceMentionGroupId(\n agentTargetId: string\n): `agent:${string}` {\n return `agent:${encodeURIComponent(agentTargetId)}`;\n}\n\nexport function memberProvenanceMentionGroupId(\n memberId: string\n): `member:${string}` {\n return `member:${encodeURIComponent(memberId)}`;\n}\n\nexport function emptyAgentMentionRawGroups(): AgentMentionRawGroups {\n return {\n apps: [],\n agents: [],\n opened_files: [],\n agent_generated_files: [],\n sessions: [],\n issues: []\n };\n}\n\nexport function cloneAgentMentionRawGroups(\n rawGroups: AgentMentionRawGroups\n): AgentMentionRawGroups {\n return {\n apps: [...rawGroups.apps],\n agents: [...rawGroups.agents],\n opened_files: [...rawGroups.opened_files],\n agent_generated_files: [...rawGroups.agent_generated_files],\n sessions: [...rawGroups.sessions],\n issues: [...rawGroups.issues]\n };\n}\n\nexport function totalCountsFromRawGroups(\n rawGroups: AgentMentionRawGroups\n): AgentMentionTotalCounts {\n return {\n apps: rawGroups.apps.length,\n agents: rawGroups.agents.length,\n opened_files: rawGroups.opened_files.length,\n agent_generated_files: rawGroups.agent_generated_files.length,\n my_sessions: rawGroups.sessions.filter(\n (item) => item.kind === \"session\" && item.scope === \"my_sessions\"\n ).length,\n collab_sessions: rawGroups.sessions.filter(\n (item) => item.kind === \"session\" && item.scope === \"collab_sessions\"\n ).length,\n issues: rawGroups.issues.length\n };\n}\n\nexport function rawGroupItemCount(rawGroups: AgentMentionRawGroups): number {\n return Object.values(rawGroups).reduce(\n (count, items) => count + items.length,\n 0\n );\n}\n\nexport function providerDiagnosticsSummary(\n diagnostics: readonly AgentMentionProviderQueryDiagnostic[]\n): string {\n return diagnostics\n .map(\n (diagnostic) =>\n `${diagnostic.providerId}:${diagnostic.status}:${diagnostic.resultCount}:${diagnostic.durationMs}`\n )\n .join(\",\");\n}\n\nexport function elapsedDiagnosticMs(now: number, startedAt: number): number {\n const durationMs = now - startedAt;\n return Number.isFinite(durationMs) ? Math.max(0, Math.round(durationMs)) : 0;\n}\n\nexport function diagnosticErrorKind(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 logAgentMentionLifecycleDiagnostic(\n payload: AgentMentionLifecycleDiagnosticLog\n): void {\n try {\n console.info(AGENT_MENTION_LIFECYCLE_LOG_PREFIX, JSON.stringify(payload));\n } catch (logError) {\n // Diagnostic logging must never affect mention search state.\n console.error(\n \"[agent-gui] logAgentMentionLifecycleDiagnostic console.info failed\",\n logError\n );\n }\n try {\n getOptionalAgentHostApi()?.debug?.logRuntimeDiagnostics?.({\n source: \"renderer-workspace-surface\",\n level: \"info\",\n event: `agent-gui.mention.${payload.event}`,\n // i18n-check-ignore: Internal diagnostic log message.\n message: \"Agent GUI mention search lifecycle event.\",\n details: payload.details\n });\n } catch (logError) {\n // Diagnostic logging must never affect mention search state.\n console.error(\n \"[agent-gui] logAgentMentionLifecycleDiagnostic host diagnostics failed\",\n logError\n );\n }\n}\n\nexport function normalizeSessionMentionItems(input: {\n items: readonly AgentContextMentionItem[];\n}): AgentContextMentionItem[] {\n return input.items.filter((item) => item.kind === \"session\");\n}\n\nexport function providerItemToAgentMentionItem(input: {\n currentUserId: string;\n directory?: AgentContextMentionDirectoryDescriptor | null;\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 const directoryPath = input.directory?.path.trim() ?? \"\";\n return {\n kind: \"file\",\n href,\n path: directoryPath || href,\n name: label,\n entryKind: directoryPath || href.endsWith(\"/\") ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromProviderWorkspaceFileHref(\n directoryPath || href\n ),\n ...(directoryPath\n ? {\n childCount: normalizeMentionDirectoryChildCount(\n input.directory?.childCount\n ),\n mentionNavigation: \"workspace-folder\" as const\n }\n : {})\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 const directoryPath = input.directory?.path.trim() ?? \"\";\n return {\n kind: \"file\",\n href: createRichTextMentionHref({\n providerId: input.providerId,\n entityId: targetId,\n label,\n scope\n }),\n path: directoryPath || targetId,\n name: label,\n entryKind:\n directoryPath || targetId.endsWith(\"/\") ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromProviderWorkspaceFileHref(\n directoryPath || targetId\n ),\n ...(directoryPath\n ? {\n childCount: normalizeMentionDirectoryChildCount(\n input.directory?.childCount\n ),\n mentionNavigation: \"workspace-folder\" as const\n }\n : {}),\n thumbnailUrl: presentation.thumbnailUrl?.trim() || undefined\n };\n }\n if (input.providerId === WORKSPACE_ISSUE_PROVIDER_ID) {\n return {\n kind: \"workspace-issue\",\n href: createRichTextMentionHref({\n providerId: \"workspace-issue\",\n entityId: targetId,\n label,\n scope: {\n workspaceId,\n ...(scope.topicId ? { topicId: scope.topicId } : {})\n }\n }),\n workspaceId,\n targetId,\n topicId: scope.topicId,\n name: label,\n title: label,\n iconUrl: presentation.iconUrl?.trim() || undefined,\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: createRichTextMentionHref({\n providerId: \"workspace-app\",\n entityId: appId,\n label,\n scope: { workspaceId }\n }),\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_TARGET_PROVIDER_ID) {\n const agentProviderId = presentation.agentProviderId?.trim() || undefined;\n return {\n kind: \"agent-target\",\n href: createRichTextMentionHref({\n providerId: \"agent-target\",\n entityId: targetId,\n label,\n scope: { workspaceId }\n }),\n workspaceId,\n targetId,\n name: label,\n description:\n compactText(presentation.description) ||\n compactText(presentation.subtitle) ||\n compactText(input.subtitle) ||\n undefined,\n agentProviderId,\n iconUrl: presentation.iconUrl?.trim() || undefined,\n availabilityStatus: presentation.status?.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: createRichTextMentionHref({\n providerId: \"agent-session\",\n entityId: targetId,\n label,\n scope: {\n workspaceId,\n ...(scope.agentTargetId ? { agentTargetId: scope.agentTargetId } : {})\n }\n }),\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 ...(scope.userId ? { initiatorUserId: scope.userId } : {}),\n initiatorName: \"\",\n agentName,\n agentIconUrl: resolveAgentSessionMentionIconUrl({\n agentIconUrl:\n presentation.agentIconUrl?.trim() ||\n presentation.iconUrl?.trim() ||\n undefined,\n agentProviderId: presentation.agentProviderId,\n agentTargetId: scope.agentTargetId\n }),\n ...(scope.agentTargetId ? { agentTargetId: scope.agentTargetId } : {}),\n status: presentation.status?.trim() || undefined,\n inputPreview: description || undefined,\n summaryPreview\n };\n }\n return null;\n}\n\nfunction normalizeMentionDirectoryChildCount(\n value: number | null | undefined\n): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n return undefined;\n }\n return Math.floor(value);\n}\n\nexport function normalizeMentionScope(\n scope?: Readonly<Record<string, string>>\n): 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\nexport function 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\nexport function 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 { 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.mentionFolderBack\"),\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 { AgentMentionProviderQueryDiagnostic } from \"./agentMentionSearchDiagnostics\";\nimport type {\n AgentMentionFilterId,\n AgentMentionIssueTopicGroup,\n AgentMentionLifecycleDiagnosticLog,\n AgentMentionRawGroups,\n AgentMentionTotalCounts\n} from \"./AgentMentionSearchContracts\";\nimport {\n elapsedDiagnosticMs,\n providerDiagnosticsSummary,\n rawGroupItemCount\n} from \"./AgentMentionSearchModel\";\n\nexport interface AgentMentionBrowseFetchResult {\n providerDiagnostics: AgentMentionProviderQueryDiagnostic[];\n rawGroups: AgentMentionRawGroups;\n totalCounts: AgentMentionTotalCounts;\n issueTopicGroups: AgentMentionIssueTopicGroup[] | null;\n}\n\nexport interface AgentMentionBrowseCacheEntry extends AgentMentionBrowseFetchResult {\n cachedAt: number;\n}\n\nexport type AgentMentionBrowseLoadReason = \"open\" | \"preload\";\n\nconst sharedAgentMentionBrowseCache = new Map<\n string,\n AgentMentionBrowseCacheEntry\n>();\ninterface SharedAgentMentionBrowseFetch {\n abortController: AbortController;\n consumers: Set<symbol>;\n promise: Promise<AgentMentionBrowseFetchResult> | null;\n settled: boolean;\n}\n\nconst sharedAgentMentionBrowseFetches = new Map<\n string,\n SharedAgentMentionBrowseFetch\n>();\n\n// Bound the shared browse cache so long-lived renderer sessions cannot grow it\n// without limit. Eviction happens on write (LRU-by-insertion-order); reads keep\n// returning stale entries so the stale-while-revalidate path stays intact.\nexport const MAX_BROWSE_CACHE_ENTRIES = 64;\n\nfunction writeBrowseCacheEntry(\n cacheKey: string,\n entry: AgentMentionBrowseCacheEntry\n): void {\n // Re-insert so the freshly written key becomes the newest (Map preserves\n // insertion order), then drop the oldest keys past the cap.\n sharedAgentMentionBrowseCache.delete(cacheKey);\n sharedAgentMentionBrowseCache.set(cacheKey, entry);\n while (sharedAgentMentionBrowseCache.size > MAX_BROWSE_CACHE_ENTRIES) {\n const oldestKey = sharedAgentMentionBrowseCache.keys().next().value;\n if (oldestKey === undefined) {\n break;\n }\n sharedAgentMentionBrowseCache.delete(oldestKey);\n }\n}\n\nexport function mergeAgentMentionBrowseIssueGroupPage(input: {\n cacheKey: string;\n group: AgentMentionIssueTopicGroup;\n cachedAt: number;\n}): void {\n const entry = sharedAgentMentionBrowseCache.get(input.cacheKey);\n if (!entry?.issueTopicGroups) {\n return;\n }\n const groupIndex = entry.issueTopicGroups.findIndex(\n (group) => group.id === input.group.id\n );\n if (groupIndex < 0) {\n return;\n }\n const previous = entry.issueTopicGroups[groupIndex];\n if (!previous) {\n return;\n }\n const seen = new Set(\n previous.items\n .filter((item) => item.kind === \"workspace-issue\")\n .map((item) => item.targetId)\n );\n const appended = input.group.items.filter((item) => {\n if (item.kind !== \"workspace-issue\") {\n return true;\n }\n if (seen.has(item.targetId)) {\n return false;\n }\n seen.add(item.targetId);\n return true;\n });\n const mergedItems = [...previous.items, ...appended];\n const groups = entry.issueTopicGroups.map((group, index) =>\n index === groupIndex\n ? {\n ...previous,\n items: mergedItems,\n totalCount: Math.max(input.group.totalCount, mergedItems.length),\n nextPageToken: input.group.nextPageToken,\n loadMoreStatus: \"idle\" as const,\n loadMoreError: null\n }\n : group\n );\n writeBrowseCacheEntry(input.cacheKey, {\n ...entry,\n issueTopicGroups: groups,\n cachedAt: input.cachedAt\n });\n}\n\n// Defer speculative warm-up to a browser idle slot so it never blocks the\n// caller's synchronous path (e.g. a composer focus handler) or a render commit.\n// Falls back to a macrotask where requestIdleCallback is unavailable (jsdom,\n// older runtimes). Returns a canceller the owner uses on teardown.\nexport function scheduleAgentMentionIdleTask(task: () => void): () => void {\n const scope = globalThis as typeof globalThis & {\n requestIdleCallback?: (\n cb: () => void,\n opts?: { timeout: number }\n ) => number;\n cancelIdleCallback?: (handle: number) => void;\n };\n if (typeof scope.requestIdleCallback === \"function\") {\n const handle = scope.requestIdleCallback(() => task(), { timeout: 500 });\n return () => scope.cancelIdleCallback?.(handle);\n }\n // timing: requestIdleCallback fallback for runtimes that lack it; run on next tick\n const handle = setTimeout(task, 0);\n return () => clearTimeout(handle);\n}\n\nexport function resetAgentMentionSearchBrowseCacheForTests(): void {\n sharedAgentMentionBrowseCache.clear();\n for (const fetch of sharedAgentMentionBrowseFetches.values()) {\n fetch.abortController.abort();\n }\n sharedAgentMentionBrowseFetches.clear();\n}\n\n(\n globalThis as typeof globalThis & {\n __tuttiResetAgentMentionSearchBrowseCacheForTests?: () => void;\n }\n).__tuttiResetAgentMentionSearchBrowseCacheForTests =\n resetAgentMentionSearchBrowseCacheForTests;\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\nexport async function loadAgentMentionBrowseFetchResult(input: {\n input: {\n workspaceId: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n sectionKey: string;\n };\n cacheKey: string;\n reason: AgentMentionBrowseLoadReason;\n diagnosticNow: () => number;\n providerIds: string;\n abortSignal?: AbortSignal;\n fetchBrowseResult: (\n abortSignal: AbortSignal\n ) => Promise<AgentMentionBrowseFetchResult>;\n logLifecycle: (\n event: AgentMentionLifecycleDiagnosticLog[\"event\"],\n details: AgentMentionLifecycleDiagnosticLog[\"details\"]\n ) => void;\n}): Promise<AgentMentionBrowseFetchResult> {\n const { cacheKey, reason } = input;\n const browseInput = input.input;\n let sharedFetch = sharedAgentMentionBrowseFetches.get(cacheKey);\n if (sharedFetch) {\n input.logLifecycle(\"browse.fetch.dedupe\", {\n filter: browseInput.filter,\n reason,\n workspaceId: browseInput.workspaceId\n });\n } else {\n const startedAt = input.diagnosticNow();\n input.logLifecycle(\"browse.fetch.start\", {\n filter: browseInput.filter,\n providerIds: input.providerIds,\n reason,\n workspaceId: browseInput.workspaceId\n });\n const abortController = new AbortController();\n sharedFetch = {\n abortController,\n consumers: new Set(),\n promise: null,\n settled: false\n };\n const entry = sharedFetch;\n entry.promise = input\n .fetchBrowseResult(abortController.signal)\n .then((result) => {\n if (abortController.signal.aborted) {\n const error = new Error(\"Mention browse request aborted\");\n error.name = \"AbortError\";\n throw error;\n }\n writeBrowseCacheEntry(cacheKey, {\n ...result,\n cachedAt: input.diagnosticNow()\n });\n input.logLifecycle(\"browse.fetch.success\", {\n durationMs: elapsedDiagnosticMs(input.diagnosticNow(), startedAt),\n filter: browseInput.filter,\n itemCount: rawGroupItemCount(result.rawGroups),\n providerResults: providerDiagnosticsSummary(\n result.providerDiagnostics\n ),\n reason,\n workspaceId: browseInput.workspaceId\n });\n return result;\n })\n .finally(() => {\n entry.settled = true;\n if (sharedAgentMentionBrowseFetches.get(cacheKey) === entry) {\n sharedAgentMentionBrowseFetches.delete(cacheKey);\n }\n });\n sharedAgentMentionBrowseFetches.set(cacheKey, entry);\n }\n\n return consumeSharedBrowseFetch({\n abortSignal: input.abortSignal,\n cacheKey,\n sharedFetch\n });\n}\n\nfunction consumeSharedBrowseFetch(input: {\n abortSignal?: AbortSignal;\n cacheKey: string;\n sharedFetch: SharedAgentMentionBrowseFetch;\n}): Promise<AgentMentionBrowseFetchResult> {\n const consumer = Symbol(input.cacheKey);\n input.sharedFetch.consumers.add(consumer);\n const sharedPromise = input.sharedFetch.promise;\n if (!sharedPromise) {\n input.sharedFetch.consumers.delete(consumer);\n return Promise.reject(new Error(\"Mention browse request was not started\"));\n }\n\n return new Promise((resolve, reject) => {\n let finished = false;\n const finish = (settle: () => void, abortWhenUnused: boolean): void => {\n if (finished) {\n return;\n }\n finished = true;\n input.abortSignal?.removeEventListener(\"abort\", onAbort);\n input.sharedFetch.consumers.delete(consumer);\n if (\n abortWhenUnused &&\n !input.sharedFetch.settled &&\n input.sharedFetch.consumers.size === 0\n ) {\n if (\n sharedAgentMentionBrowseFetches.get(input.cacheKey) ===\n input.sharedFetch\n ) {\n sharedAgentMentionBrowseFetches.delete(input.cacheKey);\n }\n input.sharedFetch.abortController.abort();\n }\n settle();\n };\n const onAbort = (): void => {\n const error = new Error(\"Mention browse request aborted\");\n error.name = \"AbortError\";\n finish(() => reject(error), true);\n };\n\n if (input.abortSignal?.aborted) {\n onAbort();\n return;\n }\n input.abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n sharedPromise.then(\n (result) => finish(() => resolve(result), false),\n (error: unknown) => finish(() => reject(error), false)\n );\n });\n}\n\nexport function readAgentMentionBrowseCache(input: {\n cacheKey: string;\n browseCacheTtlMs: number;\n diagnosticNow: () => number;\n}): {\n entry: AgentMentionBrowseCacheEntry | null;\n isFresh: boolean;\n} {\n const entry = sharedAgentMentionBrowseCache.get(input.cacheKey);\n if (!entry) {\n return { entry: null, isFresh: false };\n }\n // Touch for LRU recency. We deliberately keep returning stale entries (no\n // delete here) so the stale-while-revalidate path can still surface them.\n sharedAgentMentionBrowseCache.delete(input.cacheKey);\n sharedAgentMentionBrowseCache.set(input.cacheKey, entry);\n const ageMs = input.diagnosticNow() - entry.cachedAt;\n const isFresh =\n input.browseCacheTtlMs >= 0 &&\n Number.isFinite(input.browseCacheTtlMs) &&\n ageMs <= input.browseCacheTtlMs;\n return { entry, isFresh };\n}\n\nexport function buildAgentMentionBrowseCacheKey(input: {\n workspaceId: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n sectionKey: string;\n fileLimit: number;\n issueLimit: number;\n providerIds: readonly string[];\n provenanceFilterKey?: string;\n}): string {\n return JSON.stringify({\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n sessionCwd: input.sessionCwd,\n sectionKey: input.sectionKey,\n filter: input.filter,\n fileLimit: input.fileLimit,\n issueLimit: input.issueLimit,\n providerIds: input.providerIds,\n provenanceFilterKey: input.provenanceFilterKey ?? \"disabled\"\n });\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 abortSignal?: AbortSignal;\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 throwOnTimeout?: boolean;\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 abortSignal: input.abortSignal,\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 if (timedOut && input.throwOnTimeout) {\n const error = new Error(\"Mention provider query timed out.\");\n error.name = \"TimeoutError\";\n throw error;\n }\n return result;\n } catch (error) {\n if (\n error instanceof Error &&\n error.name === \"TimeoutError\" &&\n input.diagnostics.at(-1)?.providerId === input.providerId &&\n input.diagnostics.at(-1)?.status === \"timeout\"\n ) {\n throw error;\n }\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 abortSignal?: AbortSignal;\n fallback: T;\n providerTimeoutMs: number;\n query: (abortSignal: AbortSignal) => Promise<T>;\n}): Promise<{ result: T; timedOut: boolean }> {\n const abortController = new AbortController();\n const abortFromParent = () => abortController.abort();\n if (input.abortSignal?.aborted) {\n abortController.abort();\n } else {\n input.abortSignal?.addEventListener(\"abort\", abortFromParent, {\n once: true\n });\n }\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 try {\n return await queryResultPromise;\n } finally {\n input.abortSignal?.removeEventListener(\"abort\", abortFromParent);\n }\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 input.abortSignal?.removeEventListener(\"abort\", abortFromParent);\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n }\n}\n","import { resolveAgentMentionFileThumbnailUrl } from \"../shared/mentionFilePresentation\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport type {\n AgentContextMentionProvider,\n AgentContextMentionQueryInput\n} from \"./agentContextMentionProvider\";\nimport type { AgentMentionProviderQueryDiagnostic } from \"./agentMentionSearchDiagnostics\";\nimport {\n emptyAgentMentionRawGroups,\n normalizeSessionMentionItems,\n providerItemToAgentMentionItem,\n totalCountsFromRawGroups\n} from \"./AgentMentionSearchModel\";\nimport type { AgentMentionFilterId } from \"./AgentMentionSearchContracts\";\nimport type { AgentMentionIssueTopicGroup } from \"./AgentMentionSearchContracts\";\nimport {\n AGENT_GENERATED_FILE_PROVIDER_ID,\n AGENT_SESSION_PROVIDER_ID,\n AGENT_TARGET_PROVIDER_ID,\n DEFAULT_SESSION_LIMIT,\n FILE_PROVIDER_ID,\n WORKSPACE_APP_PROVIDER_ID,\n WORKSPACE_ISSUE_PROVIDER_ID\n} from \"./AgentMentionSearchContracts\";\nimport type { AgentMentionBrowseFetchResult } from \"./AgentMentionSearchCache\";\nimport type {\n ReferenceProvenanceCatalog,\n ReferenceProvenanceFilter\n} from \"@tutti-os/workspace-file-reference/contracts\";\nimport { referenceProvenanceFilterIsActive } from \"@tutti-os/workspace-file-reference/core\";\n\nexport interface AgentMentionProviderQueryInput {\n abortSignal?: AbortSignal;\n diagnostics: AgentMentionProviderQueryDiagnostic[];\n providerId: string;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit?: number;\n sessionCwd?: string;\n sectionKey?: string;\n provenanceFilter: ReferenceProvenanceFilter | null;\n}\n\nexport interface AgentMentionProviderGroupedQueryInput extends AgentMentionProviderQueryInput {}\n\nexport async function fetchAgentMentionFilterResult(input: {\n workspaceId: string;\n currentUserId: string;\n query: string;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n sectionKey: string;\n includeAgentGeneratedFiles: boolean;\n fileLimit: number;\n currentFileSearchLimit: number;\n currentIssueSearchLimit: number;\n provenanceCatalog?: ReferenceProvenanceCatalog | null;\n provenanceFilter: ReferenceProvenanceFilter | null;\n queryProviderMentionItemsById: (\n input: AgentMentionProviderQueryInput\n ) => Promise<AgentContextMentionItem[]>;\n queryProviderMentionGroupsById?: (\n input: AgentMentionProviderGroupedQueryInput\n ) => Promise<AgentMentionIssueTopicGroup[] | null>;\n}): Promise<AgentMentionBrowseFetchResult> {\n const providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n const provenanceFilterActive = referenceProvenanceFilterIsActive(\n input.provenanceFilter\n );\n switch (input.filter) {\n case \"file\": {\n // Opened/local files have no durable provenance. Never silently return\n // them while the UI says any provenance filter is active.\n const fileQuery = provenanceFilterActive\n ? Promise.resolve([] as AgentContextMentionItem[])\n : input.queryProviderMentionItemsById({\n providerId: FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: input.query ? input.currentFileSearchLimit : input.fileLimit,\n sessionCwd: input.sessionCwd,\n diagnostics: providerDiagnostics,\n provenanceFilter: input.provenanceFilter\n });\n const agentGeneratedFileQuery =\n input.includeAgentGeneratedFiles || provenanceFilterActive\n ? input.queryProviderMentionItemsById({\n providerId: AGENT_GENERATED_FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: input.fileLimit,\n sessionCwd: input.sessionCwd,\n sectionKey: input.sectionKey,\n diagnostics: providerDiagnostics,\n provenanceFilter: input.provenanceFilter\n })\n : Promise.resolve([] as AgentContextMentionItem[]);\n const [fileItems, agentGeneratedFileItems] = await Promise.all([\n fileQuery,\n agentGeneratedFileQuery\n ]);\n const rawGroups = emptyAgentMentionRawGroups();\n rawGroups.opened_files = fileItems.filter((item) => item.kind === \"file\");\n rawGroups.agent_generated_files = agentGeneratedFileItems.filter(\n (item) => item.kind === \"file\"\n );\n return {\n providerDiagnostics,\n rawGroups,\n totalCounts: totalCountsFromRawGroups(rawGroups),\n issueTopicGroups: null\n };\n }\n case \"session\": {\n const sessionItems = await input.queryProviderMentionItemsById({\n providerId: AGENT_SESSION_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n // A provenance-aware host owns a room-scoped directory snapshot and\n // grouping must see that complete snapshot. Legacy providers retain\n // the bounded query contract.\n limit: input.provenanceCatalog?.enabledDimensions.includes(\"agent\")\n ? undefined\n : DEFAULT_SESSION_LIMIT,\n sessionCwd: input.sessionCwd,\n diagnostics: providerDiagnostics,\n provenanceFilter: input.provenanceFilter\n });\n const rawGroups = emptyAgentMentionRawGroups();\n rawGroups.sessions = normalizeSessionMentionItems({\n items: sessionItems\n });\n return {\n providerDiagnostics,\n rawGroups,\n totalCounts: totalCountsFromRawGroups(rawGroups),\n issueTopicGroups: null\n };\n }\n case \"issue\": {\n // Issue summaries do not yet carry durable provenance. Fail closed\n // rather than displaying unfiltered issues under an active filter.\n const queryInput = {\n providerId: WORKSPACE_ISSUE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: input.currentIssueSearchLimit,\n sessionCwd: input.sessionCwd,\n diagnostics: providerDiagnostics,\n provenanceFilter: input.provenanceFilter\n };\n const issueTopicGroups = provenanceFilterActive\n ? []\n : input.queryProviderMentionGroupsById\n ? await input.queryProviderMentionGroupsById(queryInput)\n : null;\n const issueItems = provenanceFilterActive\n ? []\n : issueTopicGroups === null\n ? await input.queryProviderMentionItemsById(queryInput)\n : [];\n const rawGroups = emptyAgentMentionRawGroups();\n rawGroups.issues = issueItems.filter(\n (item) => item.kind === \"workspace-issue\"\n );\n return {\n providerDiagnostics,\n rawGroups,\n totalCounts: totalCountsFromRawGroups(rawGroups),\n issueTopicGroups\n };\n }\n case \"agent\": {\n const agentItems = await input.queryProviderMentionItemsById({\n providerId: AGENT_TARGET_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n sessionCwd: input.sessionCwd,\n diagnostics: providerDiagnostics,\n provenanceFilter: input.provenanceFilter\n });\n const rawGroups = emptyAgentMentionRawGroups();\n rawGroups.agents = agentItems.filter(\n (item) => item.kind === \"agent-target\"\n );\n return {\n providerDiagnostics,\n rawGroups,\n totalCounts: totalCountsFromRawGroups(rawGroups),\n issueTopicGroups: null\n };\n }\n case \"app\": {\n const appItems = await input.queryProviderMentionItemsById({\n providerId: WORKSPACE_APP_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n sessionCwd: input.sessionCwd,\n diagnostics: providerDiagnostics,\n provenanceFilter: input.provenanceFilter\n });\n const rawGroups = emptyAgentMentionRawGroups();\n rawGroups.apps = appItems.filter((item) => item.kind === \"workspace-app\");\n return {\n providerDiagnostics,\n rawGroups,\n totalCounts: totalCountsFromRawGroups(rawGroups),\n issueTopicGroups: null\n };\n }\n }\n}\n\nexport async function queryAgentMentionProviderItems(input: {\n provider: AgentContextMentionProvider;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit?: number;\n sessionCwd: string;\n sectionKey: string;\n abortSignal: AbortSignal;\n provenanceFilter: ReferenceProvenanceFilter | null;\n}): Promise<AgentContextMentionItem[]> {\n const queryInput: AgentContextMentionQueryInput = {\n keyword: input.query,\n maxResults: input.limit,\n abortSignal: input.abortSignal,\n trigger: \"@\",\n context: {\n metadata: {\n currentUserId: input.currentUserId,\n sectionKey: input.sectionKey || undefined,\n sessionCwd: input.sessionCwd || undefined,\n target: \"agent-gui\",\n workspaceId: input.workspaceId,\n referenceProvenanceFilter: input.provenanceFilter ?? undefined\n }\n }\n };\n const items = await input.provider.query(queryInput);\n if (input.abortSignal.aborted) {\n return [];\n }\n return mapProviderItemsToAgentMentionItems({\n ...input,\n items\n });\n}\n\nexport async function queryAgentMentionProviderDirectoryItems(input: {\n provider: AgentContextMentionProvider | undefined;\n workspaceId: string;\n currentUserId: string;\n directoryPath: string;\n sessionCwd: string;\n sectionKey: string;\n abortSignal: AbortSignal;\n provenanceFilter: ReferenceProvenanceFilter | null;\n}): Promise<AgentContextMentionItem[]> {\n const provider = input.provider;\n if (!provider?.queryDirectory) {\n throw new Error(\"Mention provider does not support directory browsing.\");\n }\n const items = await provider.queryDirectory({\n keyword: \"\",\n abortSignal: input.abortSignal,\n trigger: \"@\",\n directoryPath: input.directoryPath,\n context: {\n metadata: {\n currentUserId: input.currentUserId,\n sectionKey: input.sectionKey || undefined,\n sessionCwd: input.sessionCwd || undefined,\n target: \"agent-gui\",\n workspaceId: input.workspaceId,\n referenceProvenanceFilter: input.provenanceFilter ?? undefined\n }\n }\n });\n if (input.abortSignal.aborted) {\n return [];\n }\n return mapProviderItemsToAgentMentionItems({\n ...input,\n provider,\n items\n });\n}\n\nexport async function queryAgentMentionProviderGroups(input: {\n provider: AgentContextMentionProvider;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit?: number;\n sessionCwd: string;\n sectionKey: string;\n abortSignal: AbortSignal;\n provenanceFilter: ReferenceProvenanceFilter | null;\n}): Promise<AgentMentionIssueTopicGroup[] | null> {\n if (!input.provider.queryGroups) {\n return null;\n }\n const result = await input.provider.queryGroups({\n keyword: input.query,\n maxResults: input.limit,\n abortSignal: input.abortSignal,\n trigger: \"@\",\n context: {\n metadata: {\n currentUserId: input.currentUserId,\n sectionKey: input.sectionKey || undefined,\n sessionCwd: input.sessionCwd || undefined,\n target: \"agent-gui\",\n workspaceId: input.workspaceId,\n referenceProvenanceFilter: input.provenanceFilter ?? undefined\n }\n }\n });\n if (input.abortSignal.aborted) {\n return [];\n }\n return Promise.all(\n result.groups.map(async (group): Promise<AgentMentionIssueTopicGroup> => {\n const items = await mapProviderItemsToAgentMentionItems({\n ...input,\n items: group.items\n });\n const uniqueItems = dedupeWorkspaceIssueMentionItems(items);\n return {\n id: agentMentionIssueTopicGroupId(group.id),\n providerGroupId: group.id,\n label: group.label,\n items: uniqueItems,\n totalCount: Math.max(group.totalCount, uniqueItems.length),\n nextPageToken: group.nextCursor ?? null,\n loadMoreStatus: \"idle\",\n loadMoreError: null\n };\n })\n );\n}\n\nexport async function queryAgentMentionProviderGroupPage(input: {\n provider: AgentContextMentionProvider;\n providerGroupId: string;\n workspaceId: string;\n currentUserId: string;\n query: string;\n cursor: string;\n pageSize: number;\n sessionCwd: string;\n sectionKey: string;\n abortSignal: AbortSignal;\n provenanceFilter: ReferenceProvenanceFilter | null;\n}): Promise<AgentMentionIssueTopicGroup> {\n if (!input.provider.queryGroupPage) {\n throw new Error(\"Mention provider does not support grouped pagination.\");\n }\n const group = await input.provider.queryGroupPage({\n groupId: input.providerGroupId,\n cursor: input.cursor,\n pageSize: input.pageSize,\n keyword: input.query,\n maxResults: input.pageSize,\n abortSignal: input.abortSignal,\n trigger: \"@\",\n context: {\n metadata: {\n currentUserId: input.currentUserId,\n sectionKey: input.sectionKey || undefined,\n sessionCwd: input.sessionCwd || undefined,\n target: \"agent-gui\",\n workspaceId: input.workspaceId,\n referenceProvenanceFilter: input.provenanceFilter ?? undefined\n }\n }\n });\n const items = await mapProviderItemsToAgentMentionItems({\n ...input,\n provider: input.provider,\n items: group.items\n });\n const uniqueItems = dedupeWorkspaceIssueMentionItems(items);\n return {\n id: agentMentionIssueTopicGroupId(input.providerGroupId),\n providerGroupId: input.providerGroupId,\n label: group.label,\n items: uniqueItems,\n totalCount: Math.max(group.totalCount, uniqueItems.length),\n nextPageToken: group.nextCursor ?? null,\n loadMoreStatus: \"idle\",\n loadMoreError: null\n };\n}\n\nexport function agentMentionIssueTopicGroupId(\n topicId: string\n): `issue-topic:${string}` {\n return `issue-topic:${encodeURIComponent(topicId)}`;\n}\n\nfunction dedupeWorkspaceIssueMentionItems(\n items: readonly AgentContextMentionItem[]\n): AgentContextMentionItem[] {\n const issueIds = new Set<string>();\n return items.filter((item) => {\n if (item.kind !== \"workspace-issue\") {\n return true;\n }\n if (issueIds.has(item.targetId)) {\n return false;\n }\n issueIds.add(item.targetId);\n return true;\n });\n}\n\nasync function mapProviderItemsToAgentMentionItems(input: {\n provider: AgentContextMentionProvider;\n workspaceId: string;\n currentUserId: string;\n items: readonly any[];\n}): Promise<AgentContextMentionItem[]> {\n const mentionItems = await Promise.all(\n input.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 directory: input.provider.getItemDirectory?.(item) ?? null,\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","import type { RuntimeDiagnosticsDetailValue } from \"../../shared/contracts/dto/debug\";\nimport {\n emitAgentMentionSearchDiagnostic,\n logAgentMentionSearchInfo,\n queryAgentMentionProviderWithDiagnostics,\n type AgentMentionProviderQueryDiagnostic,\n type AgentMentionSearchDiagnosticLog\n} from \"./agentMentionSearchDiagnostics\";\nimport {\n DEFAULT_AGENT_MENTION_FILTER,\n mentionGroupPageSize\n} from \"./agentMentionSearchHelpers\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport type { AgentContextMentionProvider } from \"./agentContextMentionProvider\";\nimport {\n buildBrowseCategories,\n DEFAULT_BROWSE_CACHE_TTL_MS,\n DEFAULT_DEBOUNCE_MS,\n DEFAULT_DIAGNOSTIC_SLOW_THRESHOLD_MS,\n DEFAULT_FILE_LIMIT,\n DEFAULT_ISSUE_LIMIT,\n DEFAULT_PROVIDER_TIMEOUT_MS,\n type AgentMentionFilterId,\n type AgentMentionGroup,\n type AgentMentionGroupId,\n type AgentMentionIssueTopicGroup,\n type AgentMentionLifecycleDiagnosticLog,\n type AgentMentionRawGroups,\n type AgentMentionSearchControllerOptions,\n type AgentMentionSearchListener,\n type AgentMentionSearchState,\n type AgentMentionTotalCounts\n} from \"./AgentMentionSearchContracts\";\nimport {\n buildAgentMentionBrowseCacheKey,\n loadAgentMentionBrowseFetchResult,\n mergeAgentMentionBrowseIssueGroupPage,\n readAgentMentionBrowseCache,\n type AgentMentionBrowseCacheEntry,\n type AgentMentionBrowseFetchResult,\n type AgentMentionBrowseLoadReason\n} from \"./AgentMentionSearchCache\";\nimport {\n buildAgentMentionGroups,\n cloneAgentMentionIssueTopicGroups,\n cloneAgentMentionRawGroups,\n elapsedDiagnosticMs,\n emptyAgentMentionRawGroups,\n issueTopicPaginationChanges,\n logAgentMentionLifecycleDiagnostic,\n rawGroupItemCount\n} from \"./AgentMentionSearchModel\";\nimport {\n fetchAgentMentionFilterResult,\n queryAgentMentionProviderGroups,\n queryAgentMentionProviderItems\n} from \"./AgentMentionSearchIndex\";\nimport type {\n ReferenceProvenanceCatalog,\n ReferenceProvenanceFilter\n} from \"@tutti-os/workspace-file-reference/contracts\";\nimport { referenceProvenanceFilterCacheKey } from \"@tutti-os/workspace-file-reference/core\";\nimport {\n agentGuiScheduler,\n type AgentGuiScheduledTask\n} from \"./agentGuiScheduler\";\n\nexport class AgentMentionSearchControllerBase {\n protected readonly contextMentionProviders: ReadonlyMap<\n string,\n AgentContextMentionProvider\n >;\n protected readonly debounceMs: number;\n protected readonly fileLimit: number;\n protected readonly issueLimit: number;\n protected readonly browseCacheTtlMs: number;\n protected readonly providerTimeoutMs: number;\n protected readonly diagnosticInfoLogger: (\n payload: AgentMentionSearchDiagnosticLog\n ) => void;\n protected readonly diagnosticNow: () => number;\n protected readonly diagnosticSlowThresholdMs: number;\n protected readonly listeners = new Set<AgentMentionSearchListener>();\n protected readonly expandedCounts: Partial<\n Record<AgentMentionGroupId, number>\n > = {};\n protected readonly totalCounts: AgentMentionTotalCounts = {};\n protected readonly scheduler = agentGuiScheduler;\n protected timer: AgentGuiScheduledTask | null = null;\n protected preloadCancel: (() => void) | null = null;\n protected pendingPreloadKey: string | null = null;\n protected requestId = 0;\n protected activeRequestAbortController: AbortController | null = null;\n protected disposed = false;\n protected activeWorkspaceId = \"\";\n protected currentUserId = \"\";\n protected currentFilter: AgentMentionFilterId = DEFAULT_AGENT_MENTION_FILTER;\n protected currentQuery = \"\";\n protected currentSessionCwd = \"\";\n protected currentSectionKey = \"\";\n protected currentProvenanceFilter: ReferenceProvenanceFilter | null = null;\n protected currentProvenanceCatalog: ReferenceProvenanceCatalog | null = null;\n protected currentFileSearchLimit: number;\n protected currentIssueSearchLimit: number;\n protected agentGeneratedBrowsePath: string | null = null;\n protected workspaceFileBrowsePaths: string[] = [];\n protected rawGroups: AgentMentionRawGroups = emptyAgentMentionRawGroups();\n protected issueTopicGroups: AgentMentionIssueTopicGroup[] | null = null;\n protected state: AgentMentionSearchState = {\n status: \"idle\",\n query: \"\",\n mode: \"browse\",\n filter: DEFAULT_AGENT_MENTION_FILTER,\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.browseCacheTtlMs =\n options.browseCacheTtlMs ?? DEFAULT_BROWSE_CACHE_TTL_MS;\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 protected startBrowseModeFetch(filter: AgentMentionFilterId): void {\n if (!this.activeWorkspaceId) {\n this.resetRawGroups();\n this.emitBrowseState(\"ready\");\n return;\n }\n this.clearTimer();\n const requestId = ++this.requestId;\n const cacheKey = this.browseCacheKey({\n currentUserId: this.currentUserId,\n filter,\n sectionKey: this.currentSectionKey,\n sessionCwd: this.currentSessionCwd,\n workspaceId: this.activeWorkspaceId\n });\n this.logLifecycle(\"browse.open\", {\n filter,\n providerIds: this.providerIdsForDiagnostics(),\n requestId,\n sessionCwdPresent: Boolean(this.currentSessionCwd),\n workspaceId: this.activeWorkspaceId\n });\n const cached = this.readBrowseCache(cacheKey);\n this.logBrowseCacheState({\n cacheKey,\n cached,\n filter,\n reason: \"open\",\n workspaceId: this.activeWorkspaceId\n });\n if (cached.entry) {\n this.applyBrowseFetchResult(cached.entry);\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 // A user-opened palette always revalidates. Cache freshness is used only\n // to suppress redundant speculative preloads; here the cached entry is a\n // zero-latency presentation while the provider query refreshes it.\n } else {\n this.rawGroups = emptyAgentMentionRawGroups();\n this.resetTotalCounts();\n this.emitBrowseState(\"loading\");\n }\n const abortSignal = this.beginActiveRequest();\n void this.runBrowseSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n requestId,\n filter,\n sectionKey: this.currentSectionKey,\n sessionCwd: this.currentSessionCwd,\n abortSignal\n });\n }\n\n protected async runSearch(input: {\n workspaceId: string;\n currentUserId: string;\n query: string;\n requestId: number;\n filter: AgentMentionFilterId;\n provenanceFilter: ReferenceProvenanceFilter | null;\n sectionKey: string;\n sessionCwd: string;\n abortSignal?: AbortSignal;\n }): Promise<void> {\n const startedAt = this.diagnosticNow();\n let providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n try {\n const result = await this.fetchFilterResult(\n {\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n filter: input.filter,\n sectionKey: input.sectionKey,\n sessionCwd: input.sessionCwd,\n includeAgentGeneratedFiles: false\n },\n input.provenanceFilter,\n input.abortSignal\n );\n providerDiagnostics = result.providerDiagnostics;\n\n if (\n !this.canApply(\n input.requestId,\n input.workspaceId,\n input.query,\n input.filter\n )\n ) {\n return;\n }\n\n this.applyBrowseFetchResult(result);\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: input.filter,\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 (\n !this.canApply(\n input.requestId,\n input.workspaceId,\n input.query,\n input.filter\n )\n ) {\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: input.filter,\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 protected async runBrowseSearch(input: {\n workspaceId: string;\n currentUserId: string;\n requestId: number;\n filter: AgentMentionFilterId;\n sectionKey: string;\n sessionCwd: string;\n abortSignal: AbortSignal;\n }): Promise<void> {\n const startedAt = this.diagnosticNow();\n let providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n const provenanceFilter = this.currentProvenanceFilter;\n const cacheKey = this.browseCacheKey(input, provenanceFilter);\n const issueTopicGroupsAtStart = cloneAgentMentionIssueTopicGroups(\n this.issueTopicGroups\n );\n try {\n const result = await this.loadBrowseFetchResult(\n input,\n cacheKey,\n \"open\",\n provenanceFilter,\n input.abortSignal\n );\n providerDiagnostics = result.providerDiagnostics;\n if (\n !this.canApply(input.requestId, input.workspaceId, \"\", input.filter)\n ) {\n this.logLifecycle(\"browse.apply.skipped\", {\n filter: input.filter,\n requestId: input.requestId,\n reason: \"open\",\n workspaceId: input.workspaceId\n });\n return;\n }\n const paginationChanges = issueTopicPaginationChanges(\n issueTopicGroupsAtStart,\n this.issueTopicGroups\n );\n for (const group of paginationChanges) {\n mergeAgentMentionBrowseIssueGroupPage({\n cacheKey,\n group,\n cachedAt: this.diagnosticNow()\n });\n }\n const resultToApply =\n paginationChanges.length > 0\n ? (this.readBrowseCache(cacheKey).entry ?? result)\n : result;\n this.applyBrowseFetchResult(resultToApply);\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: input.filter,\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 (\n !this.canApply(input.requestId, input.workspaceId, \"\", input.filter)\n ) {\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: input.filter,\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 protected async fetchBrowseResult(\n input: {\n workspaceId: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sectionKey: string;\n sessionCwd: string;\n },\n provenanceFilter: ReferenceProvenanceFilter | null = this\n .currentProvenanceFilter,\n abortSignal?: AbortSignal\n ): Promise<AgentMentionBrowseFetchResult> {\n return this.fetchFilterResult(\n {\n ...input,\n query: \"\",\n includeAgentGeneratedFiles: input.filter === \"file\"\n },\n provenanceFilter,\n abortSignal\n );\n }\n\n protected applyBrowseFetchResult(\n result: AgentMentionBrowseFetchResult\n ): void {\n this.rawGroups = cloneAgentMentionRawGroups(result.rawGroups);\n this.issueTopicGroups = cloneAgentMentionIssueTopicGroups(\n result.issueTopicGroups\n );\n this.resetTotalCounts();\n for (const [groupId, count] of Object.entries(result.totalCounts) as [\n AgentMentionGroupId,\n number\n ][]) {\n this.totalCounts[groupId] = count;\n }\n }\n\n protected logBrowseCacheState(input: {\n cacheKey: string;\n cached: { entry: AgentMentionBrowseCacheEntry | null; isFresh: boolean };\n filter: AgentMentionFilterId;\n reason: AgentMentionBrowseLoadReason;\n workspaceId: string;\n }): void {\n this.logLifecycle(\"browse.cache\", {\n ageMs: input.cached.entry\n ? elapsedDiagnosticMs(this.diagnosticNow(), input.cached.entry.cachedAt)\n : null,\n cacheKeyLength: input.cacheKey.length,\n cacheState: input.cached.entry\n ? input.cached.isFresh\n ? \"fresh\"\n : \"stale\"\n : \"miss\",\n filter: input.filter,\n itemCount: input.cached.entry\n ? rawGroupItemCount(input.cached.entry.rawGroups)\n : 0,\n reason: input.reason,\n workspaceId: input.workspaceId\n });\n }\n\n protected logLifecycle(\n event: AgentMentionLifecycleDiagnosticLog[\"event\"],\n details: Record<string, RuntimeDiagnosticsDetailValue>\n ): void {\n logAgentMentionLifecycleDiagnostic({ event, details });\n }\n\n protected providerIdsForDiagnostics(): string {\n return [...this.contextMentionProviders.keys()].sort().join(\",\");\n }\n\n protected async queryProviderMentionItemsById(input: {\n diagnostics: AgentMentionProviderQueryDiagnostic[];\n providerId: string;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit?: number;\n sessionCwd?: string;\n sectionKey?: string;\n provenanceFilter: ReferenceProvenanceFilter | null;\n abortSignal?: AbortSignal;\n }): Promise<AgentContextMentionItem[]> {\n const provider = this.contextMentionProviders.get(input.providerId);\n return queryAgentMentionProviderWithDiagnostics({\n diagnosticNow: this.diagnosticNow,\n abortSignal: input.abortSignal,\n diagnostics: input.diagnostics,\n fallback: [] as AgentContextMentionItem[],\n providerId: input.providerId,\n providerTimeoutMs: this.providerTimeoutMs,\n query: provider\n ? (abortSignal) =>\n queryAgentMentionProviderItems({\n provider,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: input.limit,\n sectionKey: input.sectionKey ?? this.currentSectionKey,\n sessionCwd: input.sessionCwd ?? this.currentSessionCwd,\n abortSignal,\n provenanceFilter: input.provenanceFilter\n })\n : null,\n resultCount: (result) => result.length\n });\n }\n\n protected async queryProviderMentionGroupsById(input: {\n diagnostics: AgentMentionProviderQueryDiagnostic[];\n providerId: string;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit?: number;\n sessionCwd?: string;\n sectionKey?: string;\n provenanceFilter: ReferenceProvenanceFilter | null;\n abortSignal?: AbortSignal;\n }): Promise<AgentMentionIssueTopicGroup[] | null> {\n const provider = this.contextMentionProviders.get(input.providerId);\n if (!provider?.queryGroups) {\n return null;\n }\n return queryAgentMentionProviderWithDiagnostics({\n abortSignal: input.abortSignal,\n diagnosticNow: this.diagnosticNow,\n diagnostics: input.diagnostics,\n fallback: [] as AgentMentionIssueTopicGroup[],\n providerId: input.providerId,\n providerTimeoutMs: this.providerTimeoutMs,\n throwOnTimeout: true,\n query: (abortSignal) =>\n queryAgentMentionProviderGroups({\n provider,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: input.limit,\n sectionKey: input.sectionKey ?? this.currentSectionKey,\n sessionCwd: input.sessionCwd ?? this.currentSessionCwd,\n abortSignal,\n provenanceFilter: input.provenanceFilter\n }).then((groups) => groups ?? []),\n resultCount: (groups) =>\n groups.reduce((count, group) => count + group.items.length, 0)\n });\n }\n\n protected 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 protected 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 protected canApply(\n requestId: number,\n workspaceId: string,\n query: string,\n filter: AgentMentionFilterId\n ): boolean {\n return (\n !this.disposed &&\n requestId === this.requestId &&\n workspaceId === this.activeWorkspaceId &&\n query === this.currentQuery &&\n filter === this.currentFilter\n );\n }\n\n protected clearTimer(): void {\n if (this.timer !== null) {\n this.timer.cancel();\n this.timer = null;\n }\n }\n\n protected resetExpandedCounts(): void {\n for (const groupId of Object.keys(this.expandedCounts)) {\n delete this.expandedCounts[groupId as AgentMentionGroupId];\n }\n for (const groupId of [\n \"files\",\n \"opened_files\",\n \"agent_generated_files\",\n \"my_sessions\",\n \"collab_sessions\",\n \"agents\",\n \"apps\",\n \"issues\"\n ] as const) {\n this.expandedCounts[groupId] = mentionGroupPageSize(\n this.currentFilter,\n groupId\n );\n }\n }\n\n protected resetSearchLimits(): void {\n this.currentFileSearchLimit = this.fileLimit;\n this.currentIssueSearchLimit = this.issueLimit;\n }\n\n protected resetRawGroups(): void {\n this.rawGroups = emptyAgentMentionRawGroups();\n this.issueTopicGroups = null;\n this.resetTotalCounts();\n }\n\n protected resetAgentGeneratedBrowsePath(): void {\n this.agentGeneratedBrowsePath = null;\n }\n\n protected resetWorkspaceFileBrowsePaths(): void {\n this.workspaceFileBrowsePaths = [];\n }\n\n protected resetTotalCounts(): void {\n for (const groupId of [\n \"files\",\n \"opened_files\",\n \"agent_generated_files\",\n \"my_sessions\",\n \"collab_sessions\",\n \"agents\",\n \"apps\",\n \"issues\"\n ] as const) {\n delete this.totalCounts[groupId];\n }\n }\n\n protected setState(state: AgentMentionSearchState): void {\n this.state = state;\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n\n protected groupsFromRawGroups(): AgentMentionGroup[] {\n return buildAgentMentionGroups({\n agentGeneratedBrowsePath: this.agentGeneratedBrowsePath,\n currentFileSearchLimit: this.currentFileSearchLimit,\n currentFilter: this.currentFilter,\n currentQuery: this.currentQuery,\n expandedCounts: this.expandedCounts,\n rawGroups: this.rawGroups,\n totalCounts: this.totalCounts,\n issueTopicGroups: this.issueTopicGroups,\n provenanceCatalog: this.currentProvenanceCatalog,\n provenanceFilter: this.currentProvenanceFilter\n });\n }\n\n protected browseCacheKey(\n input: {\n workspaceId: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sectionKey: string;\n sessionCwd: string;\n },\n provenanceFilter: ReferenceProvenanceFilter | null = this\n .currentProvenanceFilter\n ): string {\n return buildAgentMentionBrowseCacheKey({\n ...input,\n fileLimit: this.fileLimit,\n issueLimit: this.currentIssueSearchLimit,\n providerIds: [...this.contextMentionProviders.keys()].sort(),\n provenanceFilterKey: provenanceFilter\n ? referenceProvenanceFilterCacheKey(provenanceFilter)\n : \"disabled\"\n });\n }\n\n protected readBrowseCache(cacheKey: string) {\n return readAgentMentionBrowseCache({\n cacheKey,\n browseCacheTtlMs: this.browseCacheTtlMs,\n diagnosticNow: this.diagnosticNow\n });\n }\n\n protected loadBrowseFetchResult(\n input: {\n workspaceId: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sectionKey: string;\n sessionCwd: string;\n },\n cacheKey: string,\n reason: AgentMentionBrowseLoadReason,\n provenanceFilter: ReferenceProvenanceFilter | null = this\n .currentProvenanceFilter,\n abortSignal?: AbortSignal\n ): Promise<AgentMentionBrowseFetchResult> {\n return loadAgentMentionBrowseFetchResult({\n input,\n cacheKey,\n reason,\n abortSignal,\n diagnosticNow: this.diagnosticNow,\n providerIds: this.providerIdsForDiagnostics(),\n fetchBrowseResult: (sharedAbortSignal) =>\n this.fetchBrowseResult(input, provenanceFilter, sharedAbortSignal),\n logLifecycle: (event, details) => this.logLifecycle(event, details)\n });\n }\n\n protected fetchFilterResult(\n input: {\n workspaceId: string;\n currentUserId: string;\n query: string;\n filter: AgentMentionFilterId;\n sectionKey: string;\n sessionCwd: string;\n includeAgentGeneratedFiles: boolean;\n },\n provenanceFilter: ReferenceProvenanceFilter | null = this\n .currentProvenanceFilter,\n abortSignal?: AbortSignal\n ): Promise<AgentMentionBrowseFetchResult> {\n return fetchAgentMentionFilterResult({\n ...input,\n fileLimit: this.fileLimit,\n currentFileSearchLimit: this.currentFileSearchLimit,\n currentIssueSearchLimit: this.currentIssueSearchLimit,\n provenanceCatalog: this.currentProvenanceCatalog,\n provenanceFilter,\n queryProviderMentionGroupsById: (queryInput) =>\n this.queryProviderMentionGroupsById({ ...queryInput, abortSignal }),\n queryProviderMentionItemsById: (queryInput) =>\n this.queryProviderMentionItemsById({ ...queryInput, abortSignal })\n });\n }\n\n protected beginActiveRequest(): AbortSignal {\n this.abortActiveRequest();\n const controller = new AbortController();\n this.activeRequestAbortController = controller;\n return controller.signal;\n }\n\n protected abortActiveRequest(): void {\n this.activeRequestAbortController?.abort();\n this.activeRequestAbortController = null;\n }\n}\n","export interface AgentGuiScheduledTask {\n cancel(): void;\n}\n\nexport interface AgentGuiScheduler {\n schedule(delayMs: number, task: () => void): AgentGuiScheduledTask;\n}\n\nexport const agentGuiScheduler: AgentGuiScheduler = {\n schedule(delayMs, task) {\n // timing: centralize cancellable Agent GUI delays behind one scheduler port\n const timer = setTimeout(task, delayMs);\n return {\n cancel() {\n clearTimeout(timer);\n }\n };\n }\n};\n","export interface AgentMentionDirectoryRequest {\n requestId: number;\n abortSignal: AbortSignal;\n}\n\nexport interface AgentMentionDirectoryRequestScope {\n activeDirectoryPath: string | undefined;\n activeWorkspaceId: string;\n directoryPath: string;\n disposed: boolean;\n filter: string;\n query: string;\n requestId: number;\n workspaceId: string;\n}\n\nexport class AgentMentionDirectoryRequestLifecycle {\n private requestId = 0;\n private abortController: AbortController | null = null;\n\n start(): AgentMentionDirectoryRequest {\n this.abortActiveRequest();\n const abortController = new AbortController();\n const requestId = ++this.requestId;\n this.abortController = abortController;\n return {\n requestId,\n abortSignal: abortController.signal\n };\n }\n\n cancel(): void {\n this.abortActiveRequest();\n this.requestId += 1;\n }\n\n canApply(scope: AgentMentionDirectoryRequestScope): boolean {\n return (\n !scope.disposed &&\n scope.requestId === this.requestId &&\n this.abortController?.signal.aborted === false &&\n scope.workspaceId === scope.activeWorkspaceId &&\n scope.filter === \"file\" &&\n scope.query === \"\" &&\n scope.activeDirectoryPath === scope.directoryPath\n );\n }\n\n finish(requestId: number): void {\n if (requestId === this.requestId) {\n this.abortController = null;\n }\n }\n\n private abortActiveRequest(): void {\n this.abortController?.abort();\n this.abortController = null;\n }\n}\n","import { translate } from \"../../i18n/index\";\nimport type {\n AgentContextMentionItem,\n AgentMentionFileItem\n} from \"./agentRichText/agentFileMentionExtension\";\n\nexport function presentWorkspaceFileDirectoryMentionItems(input: {\n browsePath: string;\n items: readonly AgentContextMentionItem[];\n}): AgentContextMentionItem[] {\n return [createWorkspaceFileFolderBackItem(input.browsePath), ...input.items];\n}\n\nfunction createWorkspaceFileFolderBackItem(\n browsePath: string\n): AgentMentionFileItem {\n return {\n kind: \"file\",\n href: \"\",\n path: browsePath,\n name: translate(\"agentHost.agentGui.mentionFolderBack\"),\n entryKind: \"unknown\",\n directoryPath: parentWorkspaceFileDirectoryPath(browsePath),\n mentionNavigation: \"workspace-folder-back\"\n };\n}\n\nfunction parentWorkspaceFileDirectoryPath(path: string): string {\n const normalized = path.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const index = normalized.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalized.slice(0, index);\n}\n","import type { ReferenceProvenanceFilter } from \"@tutti-os/workspace-file-reference/contracts\";\nimport { referenceProvenanceFilterCacheKey } from \"@tutti-os/workspace-file-reference/core\";\nimport type { AgentMentionFilterId } from \"./AgentMentionSearchContracts\";\n\nconst EMPTY_PROVENANCE_FILTERS: Record<\n AgentMentionFilterId,\n ReferenceProvenanceFilter | null\n> = {\n session: null,\n file: null,\n issue: null,\n agent: null,\n app: null\n};\n\nexport class AgentMentionProvenanceFilterState {\n private filters = EMPTY_PROVENANCE_FILTERS;\n\n replace(\n filters: Record<AgentMentionFilterId, ReferenceProvenanceFilter | null>,\n activeFilter: AgentMentionFilterId\n ): { changed: boolean; value: ReferenceProvenanceFilter | null } {\n const previous = this.value(activeFilter);\n this.filters = filters;\n const value = this.value(activeFilter);\n return {\n changed: provenanceFilterKey(previous) !== provenanceFilterKey(value),\n value\n };\n }\n\n value(filter: AgentMentionFilterId): ReferenceProvenanceFilter | null {\n return this.filters[filter];\n }\n}\n\nfunction provenanceFilterKey(filter: ReferenceProvenanceFilter | null): string {\n return filter ? referenceProvenanceFilterCacheKey(filter) : \"disabled\";\n}\n","import {\n DEFAULT_AGENT_MENTION_FILTER,\n DEFAULT_MENTION_GROUP_PAGE_SIZE,\n mentionGroupPageSize,\n normalizeQuery\n} from \"./agentMentionSearchHelpers\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport type { AgentContextMentionProvider } from \"./agentContextMentionProvider\";\nimport {\n buildBrowseCategories,\n FILE_PROVIDER_ID,\n WORKSPACE_ISSUE_PROVIDER_ID,\n type AgentMentionFilterId,\n type AgentMentionGroupId,\n type AgentMentionSearchListener\n} from \"./AgentMentionSearchContracts\";\nimport {\n scheduleAgentMentionIdleTask,\n mergeAgentMentionBrowseIssueGroupPage,\n MAX_BROWSE_CACHE_ENTRIES,\n resetAgentMentionSearchBrowseCacheForTests\n} from \"./AgentMentionSearchCache\";\nimport { diagnosticErrorKind } from \"./AgentMentionSearchModel\";\nimport {\n queryAgentMentionProviderWithDiagnostics,\n type AgentMentionProviderQueryDiagnostic\n} from \"./agentMentionSearchDiagnostics\";\nimport {\n queryAgentMentionProviderDirectoryItems,\n queryAgentMentionProviderGroupPage\n} from \"./AgentMentionSearchIndex\";\nimport { AgentMentionSearchControllerBase } from \"./AgentMentionSearchControllerBase\";\nimport { AgentMentionDirectoryRequestLifecycle } from \"./AgentMentionDirectoryRequestLifecycle\";\nimport type {\n ReferenceProvenanceCatalog,\n ReferenceProvenanceFilter\n} from \"@tutti-os/workspace-file-reference/contracts\";\nimport { presentWorkspaceFileDirectoryMentionItems } from \"./agentMentionWorkspaceFilesPresentation\";\nimport { AgentMentionProvenanceFilterState } from \"./AgentMentionProvenanceFilterState\";\n\nexport type {\n AgentMentionBrowseCategory,\n AgentMentionFilterId,\n AgentMentionGroup,\n AgentMentionGroupId,\n AgentMentionSearchState\n} from \"./AgentMentionSearchContracts\";\nexport { MAX_BROWSE_CACHE_ENTRIES, resetAgentMentionSearchBrowseCacheForTests };\n\nexport class AgentMentionSearchController extends AgentMentionSearchControllerBase {\n private readonly issueLoadMoreRequests = new Map<\n string,\n { abortController: AbortController; token: symbol }\n >();\n private readonly directoryRequestLifecycle =\n new AgentMentionDirectoryRequestLifecycle();\n private readonly provenanceFilters = new AgentMentionProvenanceFilterState();\n\n setProvenanceCatalog(catalog: ReferenceProvenanceCatalog | null): void {\n if (this.currentProvenanceCatalog === catalog) return;\n this.currentProvenanceCatalog = catalog;\n if (\n this.currentFilter !== \"session\" ||\n (this.state.status !== \"ready\" && this.state.status !== \"loading\")\n ) {\n return;\n }\n this.setState({\n ...this.state,\n groups: this.groupsFromRawGroups()\n });\n }\n\n setProvenanceFilters(\n filters: Record<AgentMentionFilterId, ReferenceProvenanceFilter | null>\n ): void {\n const next = this.provenanceFilters.replace(filters, this.currentFilter);\n if (!next.changed) return;\n this.cancelPendingPreload();\n this.currentProvenanceFilter = next.value;\n this.updateQuery({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n sectionKey: this.currentSectionKey,\n sessionCwd: this.currentSessionCwd\n });\n }\n\n subscribe(listener: AgentMentionSearchListener): () => 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 sectionKey?: string | null;\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.currentSectionKey = input.sectionKey?.trim() ?? \"\";\n this.currentSessionCwd = input.sessionCwd?.trim() ?? \"\";\n this.currentQuery = normalizeQuery(input.query);\n this.clearTimer();\n this.abortActiveRequest();\n this.directoryRequestLifecycle.cancel();\n this.cancelIssueLoadMoreRequests();\n const requestId = ++this.requestId;\n this.resetAgentGeneratedBrowsePath();\n this.resetWorkspaceFileBrowsePaths();\n this.resetExpandedCounts();\n this.resetSearchLimits();\n this.resetRawGroups();\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 const abortSignal = this.beginActiveRequest();\n this.timer = this.scheduler.schedule(this.debounceMs, () => {\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId,\n filter: this.currentFilter,\n provenanceFilter: this.currentProvenanceFilter,\n sectionKey: this.currentSectionKey,\n sessionCwd: this.currentSessionCwd,\n abortSignal\n });\n });\n }\n\n setFilter(filter: AgentMentionFilterId): void {\n if (this.disposed) {\n return;\n }\n this.currentFilter = filter;\n this.currentProvenanceFilter = this.provenanceFilters.value(filter);\n this.clearTimer();\n this.abortActiveRequest();\n this.directoryRequestLifecycle.cancel();\n this.cancelIssueLoadMoreRequests();\n const requestId = ++this.requestId;\n this.resetAgentGeneratedBrowsePath();\n this.resetWorkspaceFileBrowsePaths();\n this.resetExpandedCounts();\n this.resetSearchLimits();\n this.resetRawGroups();\n if (!this.currentQuery) {\n this.startBrowseModeFetch(filter);\n return;\n }\n if (!this.activeWorkspaceId) {\n this.setState({\n status: \"ready\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n });\n return;\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 const abortSignal = this.beginActiveRequest();\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId,\n filter,\n provenanceFilter: this.currentProvenanceFilter,\n sectionKey: this.currentSectionKey,\n sessionCwd: this.currentSessionCwd,\n abortSignal\n });\n }\n\n preloadBrowse(input: {\n workspaceId: string;\n currentUserId?: string | null;\n sectionKey?: string | null;\n sessionCwd?: string | null;\n filter?: AgentMentionFilterId;\n }): void {\n if (this.disposed) {\n return;\n }\n const workspaceId = input.workspaceId.trim();\n if (!workspaceId) {\n return;\n }\n const filter = input.filter ?? DEFAULT_AGENT_MENTION_FILTER;\n const currentUserId = input.currentUserId?.trim() ?? \"\";\n const sectionKey = input.sectionKey?.trim() ?? \"\";\n const sessionCwd = input.sessionCwd?.trim() ?? \"\";\n const provenanceFilter = this.currentProvenanceFilter;\n const cacheKey = this.browseCacheKey(\n { currentUserId, filter, sectionKey, sessionCwd, workspaceId },\n provenanceFilter\n );\n if (this.readBrowseCache(cacheKey).isFresh) {\n return;\n }\n if (this.pendingPreloadKey === cacheKey) {\n return;\n }\n this.cancelPendingPreload();\n this.pendingPreloadKey = cacheKey;\n this.preloadCancel = scheduleAgentMentionIdleTask(() => {\n this.preloadCancel = null;\n this.pendingPreloadKey = null;\n if (this.disposed) {\n return;\n }\n this.runBrowsePreload({\n cacheKey,\n currentUserId,\n filter,\n provenanceFilter,\n sectionKey,\n sessionCwd,\n workspaceId\n });\n });\n }\n\n private runBrowsePreload(input: {\n cacheKey: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n provenanceFilter: ReferenceProvenanceFilter | null;\n sectionKey: string;\n sessionCwd: string;\n workspaceId: string;\n }): void {\n const {\n cacheKey,\n currentUserId,\n filter,\n provenanceFilter,\n sectionKey,\n sessionCwd,\n workspaceId\n } = input;\n this.logLifecycle(\"browse.preload\", {\n filter,\n providerIds: this.providerIdsForDiagnostics(),\n sessionCwdPresent: Boolean(sessionCwd),\n workspaceId\n });\n const cached = this.readBrowseCache(cacheKey);\n this.logBrowseCacheState({\n cacheKey,\n cached,\n filter,\n reason: \"preload\",\n workspaceId\n });\n if (cached.isFresh) {\n return;\n }\n void this.loadBrowseFetchResult(\n {\n workspaceId,\n currentUserId,\n filter,\n sectionKey,\n sessionCwd\n },\n cacheKey,\n \"preload\",\n provenanceFilter\n ).catch((error) => {\n this.logLifecycle(\"browse.fetch.error\", {\n errorKind: diagnosticErrorKind(error),\n filter,\n reason: \"preload\",\n workspaceId\n });\n });\n }\n\n protected cancelPendingPreload(): void {\n if (this.preloadCancel) {\n this.preloadCancel();\n this.preloadCancel = null;\n }\n this.pendingPreloadKey = null;\n }\n\n enterCategory(category: AgentMentionFilterId): void {\n this.setFilter(category);\n }\n\n selectFileMentionNavigationItem(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 if (item.mentionNavigation === \"workspace-folder\") {\n const path = item.path.trim();\n if (!path || this.currentFilter !== \"file\" || this.currentQuery) {\n return false;\n }\n this.workspaceFileBrowsePaths.push(path);\n this.loadWorkspaceFileDirectory(path);\n return true;\n }\n if (item.mentionNavigation === \"workspace-folder-back\") {\n return this.exitWorkspaceFileBrowse();\n }\n return false;\n }\n\n exitFileMentionBrowse(): boolean {\n if (this.workspaceFileBrowsePaths.length > 0) {\n return this.exitWorkspaceFileBrowse();\n }\n if (!this.agentGeneratedBrowsePath) return false;\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\n private exitWorkspaceFileBrowse(): boolean {\n if (this.workspaceFileBrowsePaths.length === 0) {\n return false;\n }\n this.workspaceFileBrowsePaths.pop();\n const parentPath = this.workspaceFileBrowsePaths.at(-1);\n if (parentPath) {\n this.loadWorkspaceFileDirectory(parentPath);\n return true;\n }\n this.directoryRequestLifecycle.cancel();\n this.startBrowseModeFetch(\"file\");\n return true;\n }\n\n private loadWorkspaceFileDirectory(directoryPath: string): void {\n this.clearTimer();\n this.abortActiveRequest();\n this.cancelIssueLoadMoreRequests();\n this.requestId += 1;\n const workspaceId = this.activeWorkspaceId;\n const provider = this.contextMentionProviders.get(FILE_PROVIDER_ID);\n const directoryRequest = this.directoryRequestLifecycle.start();\n this.setState({\n status: \"loading\",\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n void queryAgentMentionProviderDirectoryItems({\n abortSignal: directoryRequest.abortSignal,\n provider,\n directoryPath,\n workspaceId,\n currentUserId: this.currentUserId,\n sectionKey: this.currentSectionKey,\n sessionCwd: this.currentSessionCwd,\n provenanceFilter: this.currentProvenanceFilter\n })\n .then((items) => {\n if (\n !this.directoryRequestLifecycle.canApply({\n activeDirectoryPath: this.workspaceFileBrowsePaths.at(-1),\n activeWorkspaceId: this.activeWorkspaceId,\n directoryPath,\n disposed: this.disposed,\n filter: this.currentFilter,\n query: this.currentQuery,\n requestId: directoryRequest.requestId,\n workspaceId\n })\n ) {\n return;\n }\n this.directoryRequestLifecycle.finish(directoryRequest.requestId);\n this.rawGroups.opened_files = presentWorkspaceFileDirectoryMentionItems(\n {\n browsePath: directoryPath,\n items\n }\n );\n this.totalCounts.opened_files = this.rawGroups.opened_files.length;\n this.setState({\n status: \"ready\",\n query: \"\",\n mode: \"browse\",\n filter: \"file\",\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n })\n .catch((error) => {\n if (\n !this.directoryRequestLifecycle.canApply({\n activeDirectoryPath: this.workspaceFileBrowsePaths.at(-1),\n activeWorkspaceId: this.activeWorkspaceId,\n directoryPath,\n disposed: this.disposed,\n filter: this.currentFilter,\n query: this.currentQuery,\n requestId: directoryRequest.requestId,\n workspaceId\n })\n ) {\n return;\n }\n this.directoryRequestLifecycle.finish(directoryRequest.requestId);\n this.setState({\n status: \"error\",\n query: \"\",\n mode: \"browse\",\n filter: \"file\",\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: error instanceof Error ? error.message : String(error)\n });\n });\n }\n\n expandGroup(groupId: AgentMentionGroupId): void {\n if (groupId.startsWith(\"issue-topic:\")) {\n this.loadMoreIssueTopic(groupId as `issue-topic:${string}`);\n return;\n }\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 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 this.abortActiveRequest();\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 const abortSignal = this.beginActiveRequest();\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId,\n filter: this.currentFilter,\n provenanceFilter: this.currentProvenanceFilter,\n sectionKey: this.currentSectionKey,\n sessionCwd: this.currentSessionCwd,\n abortSignal\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.abortActiveRequest();\n this.directoryRequestLifecycle.cancel();\n this.cancelIssueLoadMoreRequests();\n this.requestId += 1;\n this.currentFilter = DEFAULT_AGENT_MENTION_FILTER;\n this.resetAgentGeneratedBrowsePath();\n this.resetWorkspaceFileBrowsePaths();\n this.resetExpandedCounts();\n this.resetSearchLimits();\n this.resetRawGroups();\n this.currentQuery = \"\";\n this.setState({\n status: \"idle\",\n query: \"\",\n mode: \"browse\",\n filter: DEFAULT_AGENT_MENTION_FILTER,\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n });\n }\n\n dispose(): void {\n this.disposed = true;\n this.clearTimer();\n this.abortActiveRequest();\n this.directoryRequestLifecycle.cancel();\n this.cancelIssueLoadMoreRequests();\n this.cancelPendingPreload();\n this.listeners.clear();\n this.requestId += 1;\n }\n\n private loadMoreIssueTopic(groupId: `issue-topic:${string}`): void {\n const group = this.issueTopicGroups?.find(\n (candidate) => candidate.id === groupId\n );\n const cursor = group?.nextPageToken;\n const provider = this.contextMentionProviders.get(\n WORKSPACE_ISSUE_PROVIDER_ID\n );\n if (!group || !cursor || !provider?.queryGroupPage) {\n return;\n }\n const requestKey = JSON.stringify({\n workspaceId: this.activeWorkspaceId,\n query: this.currentQuery,\n providerGroupId: group.providerGroupId,\n cursor\n });\n if (this.issueLoadMoreRequests.has(requestKey)) {\n return;\n }\n const requestId = this.requestId;\n const workspaceId = this.activeWorkspaceId;\n const currentUserId = this.currentUserId;\n const sectionKey = this.currentSectionKey;\n const sessionCwd = this.currentSessionCwd;\n const provenanceFilter = this.currentProvenanceFilter;\n const query = this.currentQuery;\n const filter = this.currentFilter;\n const abortController = new AbortController();\n const requestToken = Symbol(requestKey);\n group.loadMoreStatus = \"loading\";\n group.loadMoreError = null;\n this.emitIssueTopicGroupsState();\n\n void (async () => {\n try {\n const diagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n const page = await queryAgentMentionProviderWithDiagnostics({\n abortSignal: abortController.signal,\n diagnosticNow: this.diagnosticNow,\n diagnostics,\n fallback: null,\n providerId: WORKSPACE_ISSUE_PROVIDER_ID,\n providerTimeoutMs: this.providerTimeoutMs,\n throwOnTimeout: true,\n query: (abortSignal) =>\n queryAgentMentionProviderGroupPage({\n provider,\n providerGroupId: group.providerGroupId,\n workspaceId,\n currentUserId,\n query,\n cursor,\n pageSize: DEFAULT_MENTION_GROUP_PAGE_SIZE,\n sectionKey,\n sessionCwd,\n abortSignal,\n provenanceFilter\n }),\n resultCount: (result) => result?.items.length ?? 0\n });\n if (\n !page ||\n !this.canApply(requestId, workspaceId, query, filter) ||\n abortController.signal.aborted\n ) {\n return;\n }\n const current = this.issueTopicGroups?.find(\n (candidate) => candidate.id === groupId\n );\n if (!current || current.nextPageToken !== cursor) {\n return;\n }\n const seen = new Set(\n current.items\n .filter((item) => item.kind === \"workspace-issue\")\n .map((item) => item.targetId)\n );\n const appended = page.items.filter((item) => {\n if (item.kind !== \"workspace-issue\") {\n return true;\n }\n if (seen.has(item.targetId)) {\n return false;\n }\n seen.add(item.targetId);\n return true;\n });\n current.items = [...current.items, ...appended];\n current.totalCount = Math.max(page.totalCount, current.items.length);\n current.nextPageToken = page.nextPageToken;\n current.loadMoreStatus = \"idle\";\n current.loadMoreError = null;\n if (!query) {\n mergeAgentMentionBrowseIssueGroupPage({\n cacheKey: this.browseCacheKey(\n {\n workspaceId,\n currentUserId,\n filter,\n sectionKey,\n sessionCwd\n },\n provenanceFilter\n ),\n group: page,\n cachedAt: this.diagnosticNow()\n });\n }\n this.emitIssueTopicGroupsState();\n } catch (error) {\n if (\n !this.canApply(requestId, workspaceId, query, filter) ||\n abortController.signal.aborted\n ) {\n return;\n }\n const current = this.issueTopicGroups?.find(\n (candidate) => candidate.id === groupId\n );\n if (current?.nextPageToken === cursor) {\n current.loadMoreStatus = \"error\";\n current.loadMoreError =\n error instanceof Error ? error.message : String(error);\n this.emitIssueTopicGroupsState();\n }\n } finally {\n const active = this.issueLoadMoreRequests.get(requestKey);\n if (active?.token === requestToken) {\n this.issueLoadMoreRequests.delete(requestKey);\n }\n }\n })();\n this.issueLoadMoreRequests.set(requestKey, {\n abortController,\n token: requestToken\n });\n }\n\n private emitIssueTopicGroupsState(): void {\n this.setState({\n status: \"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 }\n\n private cancelIssueLoadMoreRequests(): void {\n for (const request of this.issueLoadMoreRequests.values()) {\n request.abortController.abort();\n }\n this.issueLoadMoreRequests.clear();\n }\n}\n\n// A transient controller warms the shared cache and leaves no timer behind.\nexport function preloadAgentMentionBrowse(input: {\n workspaceId: string;\n currentUserId?: string | null;\n sectionKey?: string | null;\n sessionCwd?: string | null;\n contextMentionProviders?: readonly AgentContextMentionProvider[];\n filter?: AgentMentionFilterId;\n}): void {\n const controller = new AgentMentionSearchController({\n contextMentionProviders: input.contextMentionProviders\n });\n controller.preloadBrowse({\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n sectionKey: input.sectionKey,\n sessionCwd: input.sessionCwd,\n filter: input.filter\n });\n}\n"],"mappings":"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","names":["createRichTextMentionHref","createRichTextMentionHref","handle","AGENT_GENERATED_FILE_PROVIDER_ID","AGENT_SESSION_PROVIDER_ID","FILE_PROVIDER_ID","WORKSPACE_APP_PROVIDER_ID","WORKSPACE_ISSUE_PROVIDER_ID","referenceProvenanceFilterCacheKey"]}
|
|
@@ -834,6 +834,7 @@ var enAgentGui = {
|
|
|
834
834
|
collapseTurnWork: "Collapse task details",
|
|
835
835
|
agentTargetRequired: "Select an available agent target before starting a session.",
|
|
836
836
|
sessionActivationFailed: "The agent session could not be started.",
|
|
837
|
+
sessionNoLongerAvailable: "The previous agent session is no longer available.",
|
|
837
838
|
promptImagesUnsupported: "This agent does not support image input with the current model.",
|
|
838
839
|
...enAgentGuiRuntimeNotices,
|
|
839
840
|
contextCompactionInProgress: "Compacting context",
|
|
@@ -3685,6 +3686,7 @@ var zhCNAgentGui = {
|
|
|
3685
3686
|
collapseTurnWork: "\u6536\u8D77\u4EFB\u52A1\u8BE6\u60C5",
|
|
3686
3687
|
agentTargetRequired: "\u8BF7\u5148\u9009\u62E9\u53EF\u7528\u7684 Agent \u76EE\u6807\u3002",
|
|
3687
3688
|
sessionActivationFailed: "Agent \u4F1A\u8BDD\u542F\u52A8\u5931\u8D25\u3002",
|
|
3689
|
+
sessionNoLongerAvailable: "\u4E4B\u524D\u7684 Agent \u4F1A\u8BDD\u5DF2\u4E0D\u53EF\u7528",
|
|
3688
3690
|
promptImagesUnsupported: "\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u56FE\u7247\u8F93\u5165\u3002",
|
|
3689
3691
|
...zhCNAgentGuiRuntimeNotices,
|
|
3690
3692
|
contextCompactionInProgress: "\u6B63\u5728\u538B\u7F29\u4E0A\u4E0B\u6587",
|
|
@@ -5774,4 +5776,4 @@ export {
|
|
|
5774
5776
|
translateInUiLanguage,
|
|
5775
5777
|
getActiveUiLanguage
|
|
5776
5778
|
};
|
|
5777
|
-
//# sourceMappingURL=chunk-
|
|
5779
|
+
//# sourceMappingURL=chunk-KK7YXPTS.js.map
|