@tutti-os/agent-gui 0.0.94 → 0.0.95

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.
Files changed (153) hide show
  1. package/README.md +48 -32
  2. package/dist/AgentGUI-CwBLYtv-.d.ts +992 -0
  3. package/dist/agent-conversation/index.d.ts +5 -7
  4. package/dist/agent-conversation/index.js +12 -8
  5. package/dist/agent-conversation/index.js.map +1 -1
  6. package/dist/agent-env/index.d.ts +10 -36
  7. package/dist/agent-env/index.js +1 -56
  8. package/dist/agent-env/index.js.map +1 -1
  9. package/dist/agent-gui.d.ts +21 -0
  10. package/dist/agent-gui.js +39 -0
  11. package/dist/agent-message-center/index.d.ts +145 -124
  12. package/dist/agent-message-center/index.js +1374 -1316
  13. package/dist/agent-message-center/index.js.map +1 -1
  14. package/dist/{agentConversationVM-Cl4G0Lln.d.ts → agentConversationVM-C335TR6S.d.ts} +112 -7
  15. package/dist/agentFileMentionContracts-Czvz6YMI.d.ts +107 -0
  16. package/dist/{agentGuiNodeTypes-CAioPXK9.d.ts → agentGuiNodeTypes-DppADPHW.d.ts} +96 -148
  17. package/dist/agentPlanPromptDispatch-C7cCMjve.d.ts +37 -0
  18. package/dist/agents.d.ts +13 -0
  19. package/dist/agents.js +13 -0
  20. package/dist/app/renderer/agentactivity.css +126 -80
  21. package/dist/app/renderer/assets/icons/agent-vinyls/tutti-vinyl.png +0 -0
  22. package/dist/app/renderer/assets/icons/open-link-lined.svg +4 -0
  23. package/dist/{chunk-P72YLKC6.js → chunk-3R2D4E57.js} +3127 -3398
  24. package/dist/chunk-3R2D4E57.js.map +1 -0
  25. package/dist/chunk-4YG7YK7S.js +23 -0
  26. package/dist/chunk-4YG7YK7S.js.map +1 -0
  27. package/dist/chunk-5X7YDOC6.js +42 -0
  28. package/dist/chunk-5X7YDOC6.js.map +1 -0
  29. package/dist/{chunk-IBIMGLCD.js → chunk-7J4K6WKB.js} +1 -1
  30. package/dist/chunk-7J4K6WKB.js.map +1 -0
  31. package/dist/{chunk-BXVPOGYK.js → chunk-7PFDA2HQ.js} +505 -504
  32. package/dist/chunk-7PFDA2HQ.js.map +1 -0
  33. package/dist/{chunk-AWAIUYG4.js → chunk-7RDD3EWP.js} +513 -555
  34. package/dist/chunk-7RDD3EWP.js.map +1 -0
  35. package/dist/{chunk-UBDPV34P.js → chunk-AOS2VWU6.js} +1355 -1305
  36. package/dist/chunk-AOS2VWU6.js.map +1 -0
  37. package/dist/{chunk-E5FOXRUM.js → chunk-BFNJKTDV.js} +295 -255
  38. package/dist/chunk-BFNJKTDV.js.map +1 -0
  39. package/dist/{chunk-5FE7M42A.js → chunk-BIHBXWK5.js} +2 -2
  40. package/dist/{chunk-7BUYFVRI.js → chunk-C5FV4UGI.js} +2921 -2944
  41. package/dist/chunk-C5FV4UGI.js.map +1 -0
  42. package/dist/{chunk-SCLLP5DO.js → chunk-CRO2MV2Y.js} +36 -46
  43. package/dist/chunk-CRO2MV2Y.js.map +1 -0
  44. package/dist/chunk-FGLQZ6I4.js +9 -0
  45. package/dist/chunk-FGLQZ6I4.js.map +1 -0
  46. package/dist/chunk-H6IQ63DQ.js +14 -0
  47. package/dist/chunk-H6IQ63DQ.js.map +1 -0
  48. package/dist/{chunk-IGY4ASUF.js → chunk-JX2SIXNL.js} +1293 -1702
  49. package/dist/chunk-JX2SIXNL.js.map +1 -0
  50. package/dist/chunk-KAL4XZMA.js +231 -0
  51. package/dist/chunk-KAL4XZMA.js.map +1 -0
  52. package/dist/chunk-KJQERFKX.js +259 -0
  53. package/dist/chunk-KJQERFKX.js.map +1 -0
  54. package/dist/chunk-LQVXBT65.js +491 -0
  55. package/dist/chunk-LQVXBT65.js.map +1 -0
  56. package/dist/{chunk-554VG7ZW.js → chunk-NITOD7WF.js} +2 -2
  57. package/dist/{chunk-7LMJXF4R.js → chunk-NJAZ7LQM.js} +20 -16
  58. package/dist/chunk-NJAZ7LQM.js.map +1 -0
  59. package/dist/chunk-NX3CZJXW.js +25 -0
  60. package/dist/chunk-NX3CZJXW.js.map +1 -0
  61. package/dist/chunk-O6W72SEP.js +93 -0
  62. package/dist/chunk-O6W72SEP.js.map +1 -0
  63. package/dist/chunk-RY6GIO3K.js +31700 -0
  64. package/dist/chunk-RY6GIO3K.js.map +1 -0
  65. package/dist/{chunk-XDV4ZRVK.js → chunk-UGVI47X6.js} +98 -37
  66. package/dist/chunk-UGVI47X6.js.map +1 -0
  67. package/dist/{chunk-XW4CVBUH.js → chunk-UQJPV6HP.js} +18 -11
  68. package/dist/chunk-UQJPV6HP.js.map +1 -0
  69. package/dist/{chunk-GAPTLVII.js → chunk-VF22EG3F.js} +1 -1
  70. package/dist/{chunk-GAPTLVII.js.map → chunk-VF22EG3F.js.map} +1 -1
  71. package/dist/{chunk-45FF4DQU.js → chunk-WEDMAVX2.js} +22 -24
  72. package/dist/chunk-WEDMAVX2.js.map +1 -0
  73. package/dist/{chunk-MATIJPGF.js → chunk-XMO45GKA.js} +531 -401
  74. package/dist/chunk-XMO45GKA.js.map +1 -0
  75. package/dist/{chunk-ZUW4B5AT.js → chunk-YE25HN6T.js} +6 -9
  76. package/dist/chunk-YE25HN6T.js.map +1 -0
  77. package/dist/context-mention-palette/index.d.ts +3 -2
  78. package/dist/context-mention-palette/index.js +19 -14
  79. package/dist/custom-mention.d.ts +44 -0
  80. package/dist/custom-mention.js +17 -0
  81. package/dist/custom-mention.js.map +1 -0
  82. package/dist/dock-icons.d.ts +6 -0
  83. package/dist/dock-icons.js +11 -0
  84. package/dist/dock-icons.js.map +1 -0
  85. package/dist/i18n/index.d.ts +850 -841
  86. package/dist/i18n/index.js +2 -2
  87. package/dist/index.d.ts +52 -1061
  88. package/dist/index.js +72 -35530
  89. package/dist/index.js.map +1 -1
  90. package/dist/mention-search.d.ts +226 -0
  91. package/dist/mention-search.js +29 -0
  92. package/dist/mention-search.js.map +1 -0
  93. package/dist/open-link-lined-JWEKUKME.svg +4 -0
  94. package/dist/provider-icons.d.ts +6 -0
  95. package/dist/provider-icons.js +12 -0
  96. package/dist/provider-icons.js.map +1 -0
  97. package/dist/provider-identity.d.ts +9 -0
  98. package/dist/provider-identity.js +21 -0
  99. package/dist/provider-identity.js.map +1 -0
  100. package/dist/runtime-BBNdWgDU.d.ts +10 -0
  101. package/dist/{types-PLFZ8SBX.d.ts → types-DX2bxgB8.d.ts} +28 -83
  102. package/dist/workbench/contribution.d.ts +32 -40
  103. package/dist/workbench/contribution.js +10 -6
  104. package/dist/workbench/index.d.ts +3 -2
  105. package/dist/workbench/index.js +24 -20
  106. package/dist/workbench/launch.d.ts +2 -5
  107. package/dist/workbench/launch.js +4 -3
  108. package/dist/workbench/providerCatalog.js +2 -1
  109. package/dist/workbench/sessionTitle.d.ts +4 -3
  110. package/dist/workbench/sessionTitle.js +4 -3
  111. package/dist/workbench/state.d.ts +1 -1
  112. package/dist/workbench/state.js +3 -2
  113. package/dist/workbench/types.d.ts +0 -3
  114. package/dist/workbench/types.js +1 -1
  115. package/dist/workspace-agent-generated-files.d.ts +20 -2
  116. package/dist/workspace-agent-generated-files.js +7 -6
  117. package/dist/workspaceAgentActivityListTypes-C7gPWYiA.d.ts +71 -0
  118. package/package.json +63 -26
  119. package/dist/AgentMentionSearchController-DD_WOred.d.ts +0 -241
  120. package/dist/AgentMessageMarkdown-DeYPURtF.d.ts +0 -7
  121. package/dist/chunk-45FF4DQU.js.map +0 -1
  122. package/dist/chunk-4HP6V2YA.js +0 -207
  123. package/dist/chunk-4HP6V2YA.js.map +0 -1
  124. package/dist/chunk-7BUYFVRI.js.map +0 -1
  125. package/dist/chunk-7LMJXF4R.js.map +0 -1
  126. package/dist/chunk-AWAIUYG4.js.map +0 -1
  127. package/dist/chunk-BXVPOGYK.js.map +0 -1
  128. package/dist/chunk-E5FOXRUM.js.map +0 -1
  129. package/dist/chunk-IBIMGLCD.js.map +0 -1
  130. package/dist/chunk-IGY4ASUF.js.map +0 -1
  131. package/dist/chunk-LR4FA5X6.js +0 -368
  132. package/dist/chunk-LR4FA5X6.js.map +0 -1
  133. package/dist/chunk-MATIJPGF.js.map +0 -1
  134. package/dist/chunk-MKHDRIGN.js +0 -71
  135. package/dist/chunk-MKHDRIGN.js.map +0 -1
  136. package/dist/chunk-P72YLKC6.js.map +0 -1
  137. package/dist/chunk-SCLLP5DO.js.map +0 -1
  138. package/dist/chunk-UBDPV34P.js.map +0 -1
  139. package/dist/chunk-VAKFNNKT.js +0 -410
  140. package/dist/chunk-VAKFNNKT.js.map +0 -1
  141. package/dist/chunk-XDV4ZRVK.js.map +0 -1
  142. package/dist/chunk-XW4CVBUH.js.map +0 -1
  143. package/dist/chunk-ZUW4B5AT.js.map +0 -1
  144. package/dist/plan-decision-ops.d.ts +0 -70
  145. package/dist/plan-decision-ops.js +0 -19
  146. package/dist/queued-prompt-runtime.d.ts +0 -115
  147. package/dist/queued-prompt-runtime.js +0 -9
  148. package/dist/workspaceAgentActivityListViewModel-BzV-cf0D.d.ts +0 -340
  149. package/dist/workspaceLinkActions-DS9LWqzI.d.ts +0 -74
  150. /package/dist/{plan-decision-ops.js.map → agent-gui.js.map} +0 -0
  151. /package/dist/{queued-prompt-runtime.js.map → agents.js.map} +0 -0
  152. /package/dist/{chunk-5FE7M42A.js.map → chunk-BIHBXWK5.js.map} +0 -0
  153. /package/dist/{chunk-554VG7ZW.js.map → chunk-NITOD7WF.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../shared/workspaceAgentActivityListViewModel.ts","../shared/workspaceAgentLatestActivitySummary.ts","../shared/workspaceAgentSessionTitle.ts"],"sourcesContent":["import {\n normalizeAgentActivityDisplayStatus,\n resolveLatestAgentActivityMessageDisplayStatus\n} from \"@tutti-os/agent-activity-core\";\nimport type { AgentHostUserInfo } from \"./contracts/dto\";\nimport { translate } from \"../i18n/index\";\nimport { fileChangePathsFromChanges } from \"./workspaceAgentFileChangePayload\";\nimport { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport { resolveDisplayableWorkspaceAgentSessionTitle } from \"./workspaceAgentSessionTitle\";\nimport type { WorkspaceAgentToolCallDisplay } from \"./workspaceAgentToolCallDisplay\";\nimport {\n fallbackSummary,\n type WorkspaceAgentConversationPreviewLine,\n type WorkspaceAgentLatestActivityStatus\n} from \"./workspaceAgentLatestActivitySummary\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport {\n isWorkspaceAgentActivityRuntimeSessionOrigin,\n type WorkspaceAgentActivityMessage,\n type WorkspaceAgentActivityPresence,\n type WorkspaceAgentActivitySession,\n type WorkspaceAgentActivitySnapshot\n} from \"./workspaceAgentActivityTypes\";\nimport { resolveWorkspaceAgentSessionSortTimeUnixMs } from \"./workspaceAgentSessionSortTime\";\n\nexport type WorkspaceAgentActivityStatus = WorkspaceAgentLatestActivityStatus;\n\nexport interface WorkspaceAgentChangedFile {\n path: string;\n label: string;\n}\n\nexport interface WorkspaceAgentActivityCard {\n id: string;\n sessionId: string;\n userId: string | null;\n userName: string;\n userAvatarUrl?: string;\n agentProvider: string;\n agentName: string;\n title: string;\n status: WorkspaceAgentActivityStatus;\n latestActivitySummary: string;\n /** User prompt + latest agent reply for task/issue execution cards; room status list uses single-line summary only. */\n conversationPreview?: WorkspaceAgentConversationPreviewLine[];\n latestActivityActorName?: string;\n toolCalls?: WorkspaceAgentToolCallDisplay[];\n changedFiles: WorkspaceAgentChangedFile[];\n sortTimeUnixMs: number;\n readTimeUnixMs?: number;\n}\n\nexport interface WorkspaceAgentActivityListViewModel {\n activities: WorkspaceAgentActivityCard[];\n}\n\nexport interface BuildWorkspaceAgentActivityListOptions {\n sessionMessagesById?: Record<string, WorkspaceAgentActivityMessage[]>;\n userProfilesById?: Record<string, AgentHostUserInfo>;\n}\n\nexport interface CollectWorkspaceAgentGeneratedFilesOptions {\n workspaceRoot?: string | null;\n /** When set, only include files from sessions whose cwd matches this path. */\n sessionCwd?: string | null;\n}\n\nexport function collectWorkspaceAgentGeneratedFiles(\n snapshot: WorkspaceAgentActivitySnapshot,\n options: CollectWorkspaceAgentGeneratedFilesOptions = {}\n): WorkspaceAgentChangedFile[] {\n const sessionCwdFilter = normalizeComparablePath(options.sessionCwd ?? \"\");\n const workspaceRoot =\n sessionCwdFilter ||\n normalizeComparablePath(options.workspaceRoot ?? \"\") ||\n resolveWorkspaceRootFromSessions(snapshot.sessions);\n const sessions = sessionCwdFilter\n ? snapshot.sessions.filter(\n (session) =>\n normalizeComparablePath(session.cwd ?? \"\") === sessionCwdFilter\n )\n : snapshot.sessions;\n const filesByPath = new Map<string, WorkspaceAgentChangedFile>();\n\n for (const session of sessions) {\n const sessionCwd =\n normalizeComparablePath(session.cwd ?? \"\") || workspaceRoot;\n const normalizePath = createAgentGeneratedFilePathNormalizer({\n sessionCwd,\n workspaceRoot\n });\n const messages = resolveWorkspaceAgentSessionMessages(\n snapshot.sessionMessagesById,\n session\n );\n if (messages.length === 0) {\n continue;\n }\n for (const file of changedFilesForSession(messages, normalizePath, {\n requireSuccessfulFileChangeTool: true\n })) {\n filesByPath.set(file.path, file);\n }\n for (const path of imageGenerationPathsFromMessages(\n messages,\n normalizePath\n )) {\n if (filesByPath.has(path)) {\n continue;\n }\n filesByPath.set(path, {\n path,\n label: path.split(\"/\").filter(Boolean).at(-1) ?? path\n });\n }\n }\n\n return applyShortestUniqueFileLabels([...filesByPath.values()]);\n}\n\nexport function buildWorkspaceAgentActivityListViewModel(\n snapshot: WorkspaceAgentActivitySnapshot,\n options: BuildWorkspaceAgentActivityListOptions = {}\n): WorkspaceAgentActivityListViewModel {\n const presencesById = new Map(\n snapshot.presences.map((presence) => [presence.id, presence])\n );\n\n const activities = snapshot.sessions\n .map((session): WorkspaceAgentActivityCard | null => {\n const presence =\n session.presenceId === undefined\n ? null\n : (presencesById.get(session.presenceId) ?? null);\n const messages = resolveWorkspaceAgentSessionMessages(\n options.sessionMessagesById,\n session\n );\n const status = resolveWorkspaceAgentActivityStatus(session, messages);\n if (\n shouldHideEmptyRuntimePlaceholderSession(\n session,\n messages,\n status,\n options\n )\n ) {\n return null;\n }\n const user = resolveActivityUser(session, presence, options);\n const agentProvider = resolveProvider(session, presence);\n const agentName = workspaceAgentProviderLabel(agentProvider);\n const resolvedSortTimeUnixMs = resolveWorkspaceAgentSessionSortTimeUnixMs(\n session,\n {\n messages\n }\n );\n const latestActivity = resolveLatestActivity(messages, status, {\n agentName,\n userName: user.userName\n });\n\n const activity: WorkspaceAgentActivityCard = {\n id: `activity-${session.agentSessionId}`,\n sessionId: session.agentSessionId,\n userId: user.userId,\n userName: user.userName,\n ...(user.userAvatarUrl ? { userAvatarUrl: user.userAvatarUrl } : {}),\n agentProvider,\n agentName,\n title: resolveWorkspaceAgentActivityTitle(session, messages),\n status,\n latestActivitySummary: latestActivity.summary,\n latestActivityActorName: latestActivity.actorName,\n changedFiles: changedFilesForSession(messages),\n sortTimeUnixMs: resolvedSortTimeUnixMs,\n readTimeUnixMs: readTimeUnixMs(session, status, resolvedSortTimeUnixMs)\n };\n\n return activity;\n })\n .filter(\n (activity): activity is WorkspaceAgentActivityCard => activity !== null\n )\n .sort(compareActivities);\n\n return { activities };\n}\n\nexport function reuseWorkspaceAgentActivityListViewModelIfUnchanged(\n previous: WorkspaceAgentActivityListViewModel | null,\n next: WorkspaceAgentActivityListViewModel\n): WorkspaceAgentActivityListViewModel {\n if (!previous) {\n return next;\n }\n if (next.activities.length === 0) {\n return previous.activities.length === 0 ? previous : next;\n }\n\n const previousActivitiesById = new Map(\n previous.activities.map((activity) => [activity.id, activity])\n );\n const activities = next.activities.map((activity) => {\n const previousActivity = previousActivitiesById.get(activity.id);\n if (\n !previousActivity ||\n !workspaceAgentActivityCardEquals(previousActivity, activity)\n ) {\n return activity;\n }\n return previousActivity;\n });\n const reusedEveryActivityInPlace =\n previous.activities.length === activities.length &&\n previous.activities.every(\n (activity, index) => activity === activities[index]\n );\n\n return reusedEveryActivityInPlace ? previous : { activities };\n}\nexport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\n\nfunction shouldHideEmptyRuntimePlaceholderSession(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[],\n status: WorkspaceAgentActivityStatus,\n options: BuildWorkspaceAgentActivityListOptions\n): boolean {\n if (!isWorkspaceAgentActivityRuntimeSessionOrigin(session.sessionOrigin)) {\n return false;\n }\n if (messages.length > 0) {\n return false;\n }\n if (!hasLoadedSessionMessageRecord(session, options.sessionMessagesById)) {\n return false;\n }\n if (!isRuntimePlaceholderTerminalStatus(status)) {\n return false;\n }\n return resolveDisplayableWorkspaceAgentSessionTitle(session) === \"\";\n}\n\nfunction hasLoadedSessionMessageRecord(\n session: WorkspaceAgentActivitySession,\n sessionMessagesById:\n | Record<string, WorkspaceAgentActivityMessage[]>\n | undefined\n): boolean {\n if (!sessionMessagesById) {\n return false;\n }\n return workspaceAgentSessionMessageAliases(session).some(\n (alias) => alias in sessionMessagesById\n );\n}\n\nfunction isRuntimePlaceholderTerminalStatus(\n status: WorkspaceAgentActivityStatus\n): boolean {\n return status === \"idle\" || status === \"completed\" || status === \"canceled\";\n}\n\nfunction workspaceAgentActivityCardEquals(\n left: WorkspaceAgentActivityCard,\n right: WorkspaceAgentActivityCard\n): boolean {\n return (\n left.id === right.id &&\n left.sessionId === right.sessionId &&\n left.userId === right.userId &&\n left.userName === right.userName &&\n left.userAvatarUrl === right.userAvatarUrl &&\n left.agentProvider === right.agentProvider &&\n left.agentName === right.agentName &&\n left.title === right.title &&\n left.status === right.status &&\n left.latestActivitySummary === right.latestActivitySummary &&\n left.latestActivityActorName === right.latestActivityActorName &&\n left.sortTimeUnixMs === right.sortTimeUnixMs &&\n JSON.stringify(left.conversationPreview ?? []) ===\n JSON.stringify(right.conversationPreview ?? []) &&\n JSON.stringify(left.toolCalls ?? []) ===\n JSON.stringify(right.toolCalls ?? []) &&\n JSON.stringify(left.changedFiles) === JSON.stringify(right.changedFiles)\n );\n}\n\nfunction resolveWorkspaceAgentSessionMessages(\n sessionMessagesById:\n | Record<string, WorkspaceAgentActivityMessage[]>\n | undefined,\n session: WorkspaceAgentActivitySession\n): WorkspaceAgentActivityMessage[] {\n if (!sessionMessagesById) {\n return [];\n }\n for (const alias of workspaceAgentSessionMessageAliases(session)) {\n const messages = sessionMessagesById[alias];\n if (messages) {\n return messages;\n }\n }\n return [];\n}\n\nfunction resolveActivityUser(\n session: WorkspaceAgentActivitySession,\n presence: WorkspaceAgentActivityPresence | null,\n options: BuildWorkspaceAgentActivityListOptions\n): Pick<WorkspaceAgentActivityCard, \"userId\" | \"userName\" | \"userAvatarUrl\"> {\n if (presence) {\n return resolveUserFromId(presence.userId ?? \"\", options);\n }\n\n const sessionUserId = session.userId?.trim() ?? \"\";\n if (sessionUserId) {\n return resolveUserFromId(sessionUserId, options);\n }\n\n return {\n userId: null,\n userName: \"Unknown member\"\n };\n}\n\nfunction resolveUserFromId(\n rawUserId: string,\n options: BuildWorkspaceAgentActivityListOptions\n): Pick<WorkspaceAgentActivityCard, \"userId\" | \"userName\" | \"userAvatarUrl\"> {\n const userId = rawUserId.trim();\n const profile = options.userProfilesById?.[userId];\n const profileName = compactText(profile?.name ?? \"\");\n const profileAvatar = profile?.avatar?.trim();\n const rawName = profileName || userId || \"Unknown member\";\n\n return {\n userId,\n userName: stripTrailingParentheticalEmailFromLabel(rawName) || rawName,\n ...(profileAvatar ? { userAvatarUrl: profileAvatar } : {})\n };\n}\n\nfunction resolveProvider(\n session: WorkspaceAgentActivitySession,\n presence: WorkspaceAgentActivityPresence | null\n): string {\n const sessionProvider = normalizeProvider(session.provider);\n if (sessionProvider) {\n return sessionProvider;\n }\n\n const presenceProvider = normalizeProvider(presence?.provider);\n if (presenceProvider) {\n return presenceProvider;\n }\n\n return \"unknown\";\n}\n\nfunction normalizeProvider(provider: string | undefined): string | null {\n const trimmed = provider?.trim();\n return trimmed ? trimmed.toLowerCase() : null;\n}\n\nexport function resolveWorkspaceAgentActivityStatus(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[] = []\n): WorkspaceAgentActivityStatus {\n const sessionStatus = normalizeAgentActivityDisplayStatus(session.status, {\n currentPhase: session.currentPhase,\n turnLifecycleOutcome: session.turnLifecycle?.outcome,\n turnLifecyclePhase: session.turnLifecycle?.phase ?? session.turnPhase\n });\n const normalized =\n sessionStatus === \"failed\"\n ? (resolveLatestAgentActivityMessageDisplayStatus(messages) ??\n sessionStatus)\n : sessionStatus;\n switch (normalized) {\n case \"failed\":\n return \"failed\";\n case \"canceled\":\n return \"canceled\";\n case \"completed\":\n return \"completed\";\n case \"waiting\":\n return \"waiting\";\n case \"working\":\n return \"working\";\n default:\n return \"idle\";\n }\n}\n\nexport function resolveWorkspaceAgentActivityTitle(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[] = []\n): string {\n const sessionTitle = resolveDisplayableWorkspaceAgentSessionTitle(session);\n const userMessageTitle = firstUserMessageText(messages);\n if (sessionTitle) {\n return sessionTitle;\n }\n return userMessageTitle || sessionTitle || workspaceAgentUntitledTaskLabel();\n}\n\nfunction resolveLatestActivity(\n messages: readonly WorkspaceAgentActivityMessage[],\n status: WorkspaceAgentActivityStatus,\n actors: { agentName: string; userName: string }\n): { actorName: string; summary: string } {\n const latestMessage = latestDisplayableMessage(messages);\n if (latestMessage) {\n return {\n actorName:\n messageRole(latestMessage.message) === \"user\"\n ? actors.userName\n : actors.agentName,\n summary: latestMessage.text\n };\n }\n return {\n actorName: actors.agentName,\n summary: fallbackSummary(status)\n };\n}\n\ntype ChangedFilePathNormalizer = (value: unknown) => string | null;\n\ninterface ChangedFileCollectionOptions {\n requireSuccessfulFileChangeTool?: boolean;\n}\n\nfunction changedFilesForSession(\n messages: readonly WorkspaceAgentActivityMessage[],\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer,\n options: ChangedFileCollectionOptions = {}\n): WorkspaceAgentChangedFile[] {\n const changedFilesByPath = new Map<string, WorkspaceAgentChangedFile>();\n const appendPath = (path: string | null): void => {\n if (!path || changedFilesByPath.has(path)) {\n return;\n }\n changedFilesByPath.set(path, {\n path,\n label: path\n });\n };\n\n for (const message of messages) {\n for (const path of changedFilePathsFromMessage(\n message,\n normalizePath,\n options\n )) {\n appendPath(path);\n }\n }\n\n return applyShortestUniqueFileLabels(Array.from(changedFilesByPath.values()));\n}\n\nfunction changedFilePathsFromMessage(\n message: WorkspaceAgentActivityMessage,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer,\n options: ChangedFileCollectionOptions = {}\n): string[] {\n const isSuccessfulFileChangeTool = isSuccessfulFileChangeToolMessage(message);\n if (options.requireSuccessfulFileChangeTool && !isSuccessfulFileChangeTool) {\n return [];\n }\n const payload = objectValue(message.payload);\n const explicitFileChanges = fileChangePaths(\n arrayValue(objectValue(payload?.fileChanges)?.files),\n normalizePath\n );\n if (explicitFileChanges.length > 0) {\n return explicitFileChanges;\n }\n if (!isSuccessfulFileChangeTool) {\n return [];\n }\n\n const toolState = objectValue(payload?.tool_state);\n const input =\n objectValue(payload?.input) ?? objectValue(toolState?.input) ?? null;\n const output = objectValue(payload?.output);\n const paths = dedupeStrings([\n ...pathsValue(payload?.paths, normalizePath),\n ...pathsValue(output?.paths, normalizePath),\n ...pathsValue(input?.paths, normalizePath),\n ...changeMapPaths(payload?.changes, normalizePath),\n ...changeMapPaths(output?.changes, normalizePath),\n ...changeMapPaths(input?.changes, normalizePath),\n ...contentDiffPaths(payload?.content, normalizePath),\n ...contentDiffPaths(output?.content, normalizePath),\n ...contentDiffPaths(input?.content, normalizePath),\n stringValue(payload?.path),\n stringValue(payload?.filePath),\n stringValue(payload?.file_path),\n stringValue(input?.path),\n stringValue(input?.filePath),\n stringValue(input?.file_path),\n stringValue(output?.path),\n stringValue(output?.filePath),\n stringValue(output?.file_path)\n ]);\n return paths\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction defaultChangedFilePathNormalizer(value: unknown): string | null {\n return normalizedChangedFilePath(value);\n}\n\nfunction resolveWorkspaceRootFromSessions(\n sessions: readonly WorkspaceAgentActivitySession[]\n): string {\n for (const session of sessions) {\n const cwd = normalizeComparablePath(session.cwd ?? \"\");\n if (cwd) {\n return cwd;\n }\n }\n return \"\";\n}\n\nfunction normalizeComparablePath(path: string): string {\n return path.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n}\n\nfunction createAgentGeneratedFilePathNormalizer(input: {\n sessionCwd?: string | null;\n workspaceRoot?: string | null;\n}): ChangedFilePathNormalizer {\n const workspaceRoot = input.workspaceRoot?.trim().replace(/\\/+$/, \"\") ?? \"\";\n const sessionCwd =\n input.sessionCwd?.trim().replace(/\\/+$/, \"\") || workspaceRoot;\n return (value: unknown) => {\n if (typeof value !== \"string\") {\n return null;\n }\n return resolveAgentGeneratedFilePath(value, workspaceRoot, sessionCwd);\n };\n}\n\nfunction resolveAgentGeneratedFilePath(\n rawPath: string,\n workspaceRoot: string,\n sessionCwd: string\n): string | null {\n const path = rawPath.trim();\n if (!path || isStructuredPayloadPath(path)) {\n return null;\n }\n if (path.startsWith(\"/workspace/\")) {\n return path;\n }\n if (isAgentStateGeneratedImagePath(path)) {\n return path;\n }\n if (isAbsoluteAgentGeneratedFilePath(path)) {\n if (\n workspaceRoot &&\n !isPathInsideOrEqual(path, workspaceRoot) &&\n !isAgentStateGeneratedImagePath(path)\n ) {\n return null;\n }\n return path.replace(/\\\\/g, \"/\");\n }\n\n const base = sessionCwd || workspaceRoot;\n if (!base) {\n return null;\n }\n const resolved = joinAgentGeneratedFilePath(base, path.replace(/^\\.?\\//, \"\"));\n if (\n workspaceRoot &&\n !isPathInsideOrEqual(resolved, workspaceRoot) &&\n !isAgentStateGeneratedImagePath(resolved)\n ) {\n return null;\n }\n return resolved;\n}\n\nfunction isAbsoluteAgentGeneratedFilePath(path: string): boolean {\n return path.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(path);\n}\n\nfunction isPathInsideOrEqual(path: string, root: string): boolean {\n const normalizedPath = path.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const normalizedRoot = root.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n if (!normalizedRoot) {\n return false;\n }\n return (\n normalizedPath === normalizedRoot ||\n normalizedPath.startsWith(`${normalizedRoot}/`)\n );\n}\n\nfunction joinAgentGeneratedFilePath(\n base: string,\n relativePath: string\n): string {\n const normalizedBase = base.replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n const normalizedRelative = relativePath.replace(/\\\\/g, \"/\");\n return `${normalizedBase}/${normalizedRelative}`;\n}\n\nfunction imageGenerationPathsFromMessages(\n messages: readonly WorkspaceAgentActivityMessage[],\n normalizePath: ChangedFilePathNormalizer\n): string[] {\n const paths: string[] = [];\n for (const message of messages) {\n const payload = objectValue(message.payload);\n if (!payload) {\n continue;\n }\n const output = objectValue(payload.output);\n for (const uri of [\n ...imageGenerationUris(payload.content),\n ...imageGenerationUris(output?.content)\n ]) {\n const normalized = normalizePath(uri);\n if (normalized) {\n paths.push(normalized);\n }\n }\n }\n return dedupeStrings(paths);\n}\n\nfunction imageGenerationUris(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const uris: string[] = [];\n for (const item of value) {\n const record = objectValue(item);\n if (!record) {\n continue;\n }\n const type = stringValue(record.type)?.toLowerCase();\n const uri = stringValue(record.uri) ?? stringValue(record.path);\n if (!uri) {\n continue;\n }\n if (\n type === \"image\" ||\n uri.toLowerCase().includes(\"generated_images\") ||\n /\\.(?:png|jpe?g|gif|webp|bmp|svg)$/i.test(uri)\n ) {\n uris.push(uri);\n }\n }\n return uris;\n}\n\nfunction isAgentStateGeneratedImagePath(path: string): boolean {\n const segments = path.split(\"/\").filter(Boolean);\n const stateRootIndex = segments.findIndex(\n (segment) => segment === \".tutti\" || segment === \".tutti-dev\"\n );\n if (stateRootIndex < 0) {\n return false;\n }\n const statePath = segments.slice(stateRootIndex);\n return (\n statePath[1] === \"agent\" &&\n statePath[2] === \"runs\" &&\n statePath.includes(\"generated_images\")\n );\n}\n\nfunction normalizedChangedFilePath(\n value: unknown,\n options: { allowRelative?: boolean } = {}\n): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const path = value.trim();\n if (!path || isStructuredPayloadPath(path)) {\n return null;\n }\n if (!options.allowRelative && !path.startsWith(\"/workspace/\")) {\n return null;\n }\n return path;\n}\n\nfunction applyShortestUniqueFileLabels(\n files: WorkspaceAgentChangedFile[]\n): WorkspaceAgentChangedFile[] {\n const suffixByPath = shortestUniquePathSuffixByPath(\n files.map((file) => file.path)\n );\n return files.map((file) => ({\n ...file,\n label: suffixByPath.get(file.path) ?? file.label\n }));\n}\n\nfunction shortestUniquePathSuffixByPath(paths: string[]): Map<string, string> {\n const partsByPath = new Map(\n paths.map((path) => [path, splitPathSegments(path)])\n );\n const labels = new Map<string, string>();\n const unresolved = new Set(paths);\n\n for (let depth = 1; unresolved.size > 0; depth += 1) {\n const grouped = new Map<string, string[]>();\n\n for (const path of unresolved) {\n const parts = partsByPath.get(path) ?? [];\n const suffix = parts.slice(-Math.min(depth, parts.length)).join(\"/\");\n const fallback = parts.at(-1) ?? path;\n const label = suffix || fallback;\n const group = grouped.get(label);\n if (group) {\n group.push(path);\n } else {\n grouped.set(label, [path]);\n }\n }\n\n let resolvedCount = 0;\n for (const [label, group] of grouped) {\n if (group.length !== 1) {\n continue;\n }\n const path = group[0];\n if (!path) {\n continue;\n }\n labels.set(path, label);\n unresolved.delete(path);\n resolvedCount += 1;\n }\n\n if (resolvedCount === 0) {\n for (const path of unresolved) {\n labels.set(path, path);\n }\n break;\n }\n }\n\n return labels;\n}\n\nfunction splitPathSegments(path: string): string[] {\n return path.trim().split(/[\\\\/]/).filter(Boolean);\n}\n\nfunction isSuccessfulFileChangeToolMessage(\n message: WorkspaceAgentActivityMessage\n): boolean {\n if (normalizeToken(message.kind) !== \"tool_call\") {\n return false;\n }\n if (!isSuccessfulFileChangeStatus(message.status ?? undefined)) {\n return false;\n }\n const payload = objectValue(message.payload);\n if (!isSuccessfulFileChangePayloadStatus(payload)) {\n return false;\n }\n return hasFileChangeSignal(payload);\n}\n\nfunction isSuccessfulFileChangePayloadStatus(\n payload: Record<string, unknown> | null\n): boolean {\n if (!payload) {\n return true;\n }\n if (!isSuccessfulFileChangeRecordStatus(payload)) {\n return false;\n }\n const output = objectValue(payload.output);\n if (output && !isSuccessfulFileChangeRecordStatus(output)) {\n return false;\n }\n return true;\n}\n\nfunction isSuccessfulFileChangeRecordStatus(\n record: Record<string, unknown>\n): boolean {\n const status = stringValue(record.status);\n if (status && !isSuccessfulFileChangeStatus(status)) {\n return false;\n }\n const success = booleanValue(record.success);\n if (success === false) {\n return false;\n }\n return true;\n}\n\nfunction isSuccessfulFileChangeStatus(value: string | undefined): boolean {\n const normalizedStatus = normalizeToken(value);\n return (\n !normalizedStatus ||\n normalizedStatus === \"completed\" ||\n normalizedStatus === \"success\" ||\n normalizedStatus === \"succeeded\" ||\n normalizedStatus === \"ok\"\n );\n}\n\nfunction hasFileChangeSignal(payload: Record<string, unknown> | null): boolean {\n if (!payload) {\n return false;\n }\n const toolState = objectValue(payload.tool_state);\n return [\n payload,\n objectValue(payload.input),\n objectValue(payload.output),\n objectValue(toolState?.input)\n ].some((record) => record !== null && recordHasFileChangeToolSignal(record));\n}\n\nfunction recordHasFileChangeToolSignal(\n record: Record<string, unknown>\n): boolean {\n const activityKind = stringValue(record.activityKind);\n if (\n activityKind &&\n isFileChangeNormalizedToolName(normalizeToolName(activityKind))\n ) {\n return true;\n }\n if (stringValue(record.fileChangeKind)) {\n return true;\n }\n const toolCall = objectValue(record.toolCall);\n const toolCallKind = normalizeToken(stringValue(toolCall?.kind) ?? undefined);\n if (\n toolCallKind === \"write\" ||\n toolCallKind === \"edit\" ||\n toolCallKind === \"delete\"\n ) {\n return true;\n }\n const toolName = normalizeToolName(\n stringValue(record.toolName) ??\n stringValue(record.title) ??\n stringValue(record.name) ??\n \"\"\n );\n return isFileChangeNormalizedToolName(toolName);\n}\n\nfunction isFileChangeNormalizedToolName(normalizedToolName: string): boolean {\n if (!normalizedToolName) {\n return false;\n }\n const exactMatches = new Set([\n \"write\",\n \"writefile\",\n \"create\",\n \"createfile\",\n \"delete\",\n \"deletefile\",\n \"edit\",\n \"editfile\",\n \"multiedit\",\n \"applypatch\",\n \"move\",\n \"notebookedit\"\n ]);\n if (exactMatches.has(normalizedToolName)) {\n return true;\n }\n for (const prefix of exactMatches) {\n if (normalizedToolName.startsWith(`${prefix}/`)) {\n return true;\n }\n }\n return false;\n}\n\nfunction fileChangePaths(\n files: readonly unknown[] | null,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n if (!files) {\n return [];\n }\n return files\n .map((file) => normalizePath(objectValue(file)?.path))\n .filter((path): path is string => path !== null);\n}\n\nfunction changeMapPaths(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n return fileChangePathsFromChanges(value)\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction contentDiffPaths(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n const content = arrayValue(value);\n if (!content) {\n return [];\n }\n return content\n .map((entry) => {\n const record = objectValue(entry);\n if (!record || stringValue(record.type) !== \"diff\") {\n return null;\n }\n return normalizePath(record.path);\n })\n .filter((path): path is string => path !== null);\n}\n\nfunction pathsValue(\n value: unknown,\n normalizePath: ChangedFilePathNormalizer = defaultChangedFilePathNormalizer\n): string[] {\n const paths = arrayValue(value);\n if (!paths) {\n return [];\n }\n return paths\n .map((path) => normalizePath(path))\n .filter((path): path is string => path !== null);\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as Record<string, unknown>;\n}\n\nfunction arrayValue(value: unknown): readonly unknown[] | null {\n return Array.isArray(value) ? value : null;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction booleanValue(value: unknown): boolean | null {\n return typeof value === \"boolean\" ? value : null;\n}\n\nfunction dedupeStrings(values: Array<string | null>): string[] {\n return [\n ...new Set(\n values.filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0\n )\n )\n ];\n}\n\nfunction normalizeToolName(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replaceAll(\"_\", \"\")\n .replaceAll(\"-\", \"\")\n .replaceAll(\" \", \"\");\n}\n\nfunction isStructuredPayloadPath(path: string): boolean {\n if (/[\\r\\n]/.test(path)) {\n return true;\n }\n if (!path.startsWith(\"{\") && !path.startsWith(\"[\")) {\n return false;\n }\n try {\n JSON.parse(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction readTimeUnixMs(\n session: WorkspaceAgentActivitySession,\n status: WorkspaceAgentActivityStatus,\n fallbackUnixMs: number\n): number {\n if (status === \"completed\" || status === \"failed\") {\n return session.endedAtUnixMs ?? session.updatedAtUnixMs ?? fallbackUnixMs;\n }\n return fallbackUnixMs;\n}\n\nfunction firstUserMessageText(\n messages: readonly WorkspaceAgentActivityMessage[]\n): string {\n const firstUserMessage = messages\n .map((message) => ({\n message,\n text: messageDisplayText(message),\n time: messageTime(message)\n }))\n .filter(\n (item) => messageRole(item.message) === \"user\" && item.text.length > 0\n )\n .sort((left, right) => {\n const timeDiff = (left.time ?? 0) - (right.time ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return (\n (left.message.id ?? 0) - (right.message.id ?? 0) ||\n left.message.messageId.localeCompare(right.message.messageId)\n );\n })[0];\n\n return firstUserMessage?.text ?? \"\";\n}\n\nfunction latestDisplayableMessage(\n messages: readonly WorkspaceAgentActivityMessage[]\n): {\n message: WorkspaceAgentActivityMessage;\n text: string;\n time?: number;\n} | null {\n return (\n messages\n .map((message) => ({\n message,\n text: messageDisplayText(message),\n time: messageTime(message)\n }))\n .filter(\n (item) =>\n item.text.length > 0 &&\n normalizeToken(item.message.kind) !== \"tool_call\"\n )\n .sort((left, right) => {\n const timeDiff = (right.time ?? 0) - (left.time ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return (\n (right.message.id ?? 0) - (left.message.id ?? 0) ||\n right.message.messageId.localeCompare(left.message.messageId)\n );\n })[0] ?? null\n );\n}\n\nfunction messageDisplayText(message: WorkspaceAgentActivityMessage): string {\n const payload = message.payload ?? {};\n const text = normalizeAgentTitleText(\n compactText(\n stringValue(payload.displayPrompt) ||\n stringValue(payload.text) ||\n stringValue(payload.content) ||\n stringValue(payload.message) ||\n stringValue(payload.body) ||\n stringValue(payload.title) ||\n \"\"\n )\n );\n return isWorkspaceAgentSyntheticControlMessage(text) ? \"\" : text;\n}\n\nfunction messageRole(message: WorkspaceAgentActivityMessage): string {\n return normalizeToken(message.role);\n}\n\nfunction messageTime(\n message: WorkspaceAgentActivityMessage\n): number | undefined {\n return (\n message.occurredAtUnixMs ??\n message.completedAtUnixMs ??\n message.startedAtUnixMs\n );\n}\n\nfunction normalizeToken(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? \"\";\n}\n\nfunction compareActivities(\n left: WorkspaceAgentActivityCard,\n right: WorkspaceAgentActivityCard\n): number {\n const timeDiff = right.sortTimeUnixMs - left.sortTimeUnixMs;\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return left.sessionId.localeCompare(right.sessionId);\n}\n\nfunction compactText(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction workspaceAgentUntitledTaskLabel(): string {\n return normalizeAgentTitleText(\n translate(\"agentHost.workspaceAgentsUntitledTask\")\n );\n}\n\nfunction workspaceAgentSessionMessageAliases(\n session: WorkspaceAgentActivitySession\n): string[] {\n const values = [\n session.syncState?.agentSessionId,\n session.agentSessionId,\n session.providerSessionId\n ];\n const seen = new Set<string>();\n const aliases: string[] = [];\n for (const value of values) {\n const normalized = value?.trim() ?? \"\";\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n seen.add(normalized);\n aliases.push(normalized);\n }\n return aliases;\n}\n\n/** Remove trailing ` (user@host...)` that some APIs pack into names. */\nfunction stripTrailingParentheticalEmailFromLabel(label: string): string {\n return label\n .trim()\n .replace(/\\s*\\([^)]*@[^)]+\\)\\s*$/u, \"\")\n .trim();\n}\n","import type { WorkspaceAgentActivityTimelineItem } from \"./workspaceAgentActivityTypes\";\nimport { translate, translateInUiLanguage } from \"../i18n/index\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\n\nexport type WorkspaceAgentLatestActivityStatus =\n | \"working\"\n | \"waiting\"\n | \"idle\"\n | \"completed\"\n | \"canceled\"\n | \"failed\";\n\nexport interface WorkspaceAgentLatestActivityActors {\n agentName: string;\n userName: string;\n}\n\nexport interface WorkspaceAgentLatestActivitySummary {\n actorName: string;\n summary: string;\n}\n\nexport interface WorkspaceAgentConversationPreviewLine {\n actorName: string;\n summary: string;\n}\n\nexport function activityTitleFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[],\n fallbackTitle = \"\"\n): string {\n return (\n compactText(fallbackTitle) ||\n latestUserMessageText(timelineItems) ||\n workspaceAgentUntitledTaskLabel()\n );\n}\n\nexport function resolveLatestActivitySummary(\n timelineItems: WorkspaceAgentActivityTimelineItem[],\n status: WorkspaceAgentLatestActivityStatus,\n actors: WorkspaceAgentLatestActivityActors\n): WorkspaceAgentLatestActivitySummary {\n for (const item of [...timelineItems].sort(compareTimelineItemsDescending)) {\n const summary = displayableActivitySummary(item);\n if (summary) {\n return {\n actorName: activityActorName(item, actors),\n summary\n };\n }\n }\n return {\n actorName: actors.agentName,\n summary: fallbackSummary(status)\n };\n}\n\nexport function fallbackSummary(\n status: WorkspaceAgentLatestActivityStatus\n): string {\n switch (status) {\n case \"working\":\n return translate(\"agentHost.workspaceAgentActivityStatusWorking\");\n case \"waiting\":\n return translate(\"agentHost.workspaceAgentActivityStatusWaiting\");\n case \"idle\":\n return translate(\"agentHost.workspaceAgentActivityStatusIdle\");\n case \"canceled\":\n case \"completed\":\n return translate(\"agentHost.workspaceAgentActivityStatusEnd\");\n case \"failed\":\n return translate(\"agentHost.workspaceAgentActivityStatusFailed\");\n }\n}\n\nexport function isWorkspaceAgentIdleSummary(summary: string): boolean {\n return localizedWorkspaceAgentLabelSet(\n \"agentHost.workspaceAgentActivityStatusIdle\"\n ).has(compactText(summary));\n}\n\nexport function isWorkspaceAgentUntitledTask(title: string): boolean {\n return localizedWorkspaceAgentLabelSet(\n \"agentHost.workspaceAgentsUntitledTask\"\n ).has(compactText(title));\n}\n\nexport function latestUserMessageFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n return latestUserMessageText(timelineItems);\n}\n\nexport function latestAgentMessageFromTimeline(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n return latestAgentMessageText(timelineItems);\n}\n\nexport function buildUserAndAgentConversationPreview(input: {\n timelineItems: WorkspaceAgentActivityTimelineItem[];\n userName: string;\n agentName: string;\n userPromptFallback?: string;\n status: WorkspaceAgentLatestActivityStatus;\n}): WorkspaceAgentConversationPreviewLine[] {\n const timeline = input.timelineItems ?? [];\n const lines: WorkspaceAgentConversationPreviewLine[] = [];\n const userMessage =\n compactText(input.userPromptFallback ?? \"\") ||\n latestUserMessageFromTimeline(timeline);\n\n if (userMessage) {\n lines.push({ actorName: input.userName, summary: userMessage });\n }\n\n const agentMessage = latestAgentMessageFromTimeline(timeline);\n if (agentMessage) {\n lines.push({ actorName: input.agentName, summary: agentMessage });\n } else if (userMessage || timeline.length > 0) {\n const latestActivity = resolveLatestActivitySummary(\n timeline,\n input.status,\n {\n userName: input.userName,\n agentName: input.agentName\n }\n );\n if (\n latestActivity.actorName === input.agentName &&\n latestActivity.summary\n ) {\n lines.push({\n actorName: input.agentName,\n summary: latestActivity.summary\n });\n } else {\n lines.push({\n actorName: input.agentName,\n summary: fallbackSummary(input.status)\n });\n }\n }\n\n return lines;\n}\n\nfunction latestUserMessageText(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n const latestUserMessage = [...timelineItems]\n .filter(isUserMessageItem)\n .sort(compareTimelineItemsDescending)[0];\n if (!latestUserMessage) {\n return \"\";\n }\n\n return firstPresentText(\n stringPayloadValue(latestUserMessage, \"displayPrompt\"),\n stringPayloadValue(latestUserMessage, \"text\"),\n stringPayloadValue(latestUserMessage, \"content\"),\n latestUserMessage.content\n );\n}\n\nfunction displayableActivitySummary(\n item: WorkspaceAgentActivityTimelineItem\n): string {\n if (messageRole(item)) {\n return messageContent(item);\n }\n\n return \"\";\n}\n\nfunction activityActorName(\n item: WorkspaceAgentActivityTimelineItem,\n actors: WorkspaceAgentLatestActivityActors\n): string {\n return messageRole(item) === \"user\" ? actors.userName : actors.agentName;\n}\n\nfunction isUserMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return (\n isMessageItem(item) &&\n messageRole(item) === \"user\" &&\n messageContent(item).length > 0\n );\n}\n\nfunction latestAgentMessageText(\n timelineItems: WorkspaceAgentActivityTimelineItem[]\n): string {\n const latestAgentMessage = [...timelineItems]\n .filter(isAgentMessageItem)\n .sort(compareTimelineItemsDescending)[0];\n if (!latestAgentMessage) {\n return \"\";\n }\n\n return messageContent(latestAgentMessage);\n}\n\nfunction isAgentMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return (\n isMessageItem(item) &&\n messageRole(item) === \"agent\" &&\n messageContent(item).length > 0\n );\n}\n\nfunction isMessageItem(item: WorkspaceAgentActivityTimelineItem): boolean {\n return item.itemType === \"message\" || item.itemType.startsWith(\"message.\");\n}\n\nfunction messageRole(\n item: WorkspaceAgentActivityTimelineItem\n): \"user\" | \"agent\" | null {\n const explicitRole = item.role?.trim().toLowerCase();\n if (explicitRole === \"user\") {\n return \"user\";\n }\n if (explicitRole === \"assistant\" || explicitRole === \"agent\") {\n return \"agent\";\n }\n\n const itemType = item.itemType.trim().toLowerCase();\n if (itemType === \"message.user\") {\n return \"user\";\n }\n if (itemType === \"message.agent\" || itemType === \"message.assistant\") {\n return \"agent\";\n }\n return null;\n}\n\nfunction messageContent(item: WorkspaceAgentActivityTimelineItem): string {\n const content = firstPresentText(\n stringPayloadValue(item, \"displayPrompt\"),\n stringPayloadValue(item, \"text\"),\n stringPayloadValue(item, \"content\"),\n item.content\n );\n return isWorkspaceAgentSyntheticControlMessage(content) ? \"\" : content;\n}\n\nfunction stringPayloadValue(\n item: WorkspaceAgentActivityTimelineItem,\n key: \"content\" | \"displayPrompt\" | \"summary\" | \"text\"\n): string {\n const value = item.payload?.[key];\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction compareTimelineItemsDescending(\n left: WorkspaceAgentActivityTimelineItem,\n right: WorkspaceAgentActivityTimelineItem\n): number {\n const leftTime = timelineTime(left);\n const rightTime = timelineTime(right);\n const timeDiff = (rightTime ?? 0) - (leftTime ?? 0);\n if (timeDiff !== 0) {\n return timeDiff;\n }\n return right.id - left.id || right.eventId.localeCompare(left.eventId);\n}\n\nfunction timelineTime(\n item: WorkspaceAgentActivityTimelineItem | null | undefined\n): number | null {\n if (!item) {\n return null;\n }\n return item.occurredAtUnixMs ?? item.createdAtUnixMs ?? null;\n}\n\nfunction firstPresentText(...values: Array<string | undefined>): string {\n for (const value of values) {\n const text = compactText(value ?? \"\");\n if (text) {\n return text;\n }\n }\n return \"\";\n}\n\nfunction compactText(value: string): string {\n return value.trim().replace(/\\s+/g, \" \");\n}\n\nfunction workspaceAgentUntitledTaskLabel(): string {\n return translate(\"agentHost.workspaceAgentsUntitledTask\");\n}\n\nfunction localizedWorkspaceAgentLabelSet(key: string): Set<string> {\n return new Set(\n ([\"en\", \"zh-CN\"] as const)\n .map((language) => compactText(translateInUiLanguage(language, key)))\n .filter(Boolean)\n );\n}\n","import { normalizeAgentTitleText } from \"./utils/agentTitleText\";\nimport { isWorkspaceAgentUntitledTask } from \"./workspaceAgentLatestActivitySummary\";\nimport { workspaceAgentProviderLabel } from \"./workspaceAgentProviderLabel\";\nimport { isWorkspaceAgentSyntheticControlMessage } from \"./workspaceAgentSyntheticMessages\";\nimport type { WorkspaceAgentActivitySession } from \"./workspaceAgentActivityTypes\";\n\nexport function resolveDisplayableWorkspaceAgentSessionTitle(\n session: Pick<WorkspaceAgentActivitySession, \"title\" | \"provider\">\n): string {\n const title = normalizeAgentTitleText(session.title);\n if (\n !title ||\n isWorkspaceAgentUntitledTask(title) ||\n isWorkspaceAgentSyntheticControlMessage(title)\n ) {\n return \"\";\n }\n const provider = session.provider?.trim();\n if (\n provider &&\n workspaceAgentProviderLabel(provider).toLowerCase() === title.toLowerCase()\n ) {\n return \"\";\n }\n return title;\n}\n"],"mappings":"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","names":["compactText"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../shared/workspaceAgentSessionSortTime.ts"],"sourcesContent":["export interface WorkspaceAgentSessionSortTimeSession {\n createdAtUnixMs?: number;\n endedAtUnixMs?: number;\n id?: number;\n agentSessionId?: string;\n providerSessionId?: string | null;\n startedAtUnixMs?: number;\n updatedAtUnixMs?: number;\n}\n\nexport interface WorkspaceAgentSessionSortTimeMessage {\n agentSessionId?: string;\n occurredAtUnixMs?: number;\n role?: string;\n turnId?: string | null;\n}\n\nexport interface WorkspaceAgentSessionSortTimeContext {\n messages?: readonly WorkspaceAgentSessionSortTimeMessage[];\n}\n\nexport function resolveWorkspaceAgentSessionSortTimeUnixMs(\n session: WorkspaceAgentSessionSortTimeSession,\n context: WorkspaceAgentSessionSortTimeContext = {}\n): number {\n const hasSortContext = hasWorkspaceAgentSessionSortContext(context);\n const fallbackUpdatedAtUnixMs = hasSortContext\n ? null\n : positiveNumber(session.updatedAtUnixMs);\n return (\n latestUserTurnStartTimeUnixMs(session, context) ??\n positiveNumber(session.endedAtUnixMs) ??\n fallbackUpdatedAtUnixMs ??\n positiveNumber(session.startedAtUnixMs) ??\n positiveNumber(session.createdAtUnixMs) ??\n positiveNumber(session.id) ??\n 0\n );\n}\n\nfunction hasWorkspaceAgentSessionSortContext(\n context: WorkspaceAgentSessionSortTimeContext\n): boolean {\n return Boolean(context.messages?.length);\n}\n\nfunction latestUserTurnStartTimeUnixMs(\n session: WorkspaceAgentSessionSortTimeSession,\n context: WorkspaceAgentSessionSortTimeContext\n): number | null {\n const sessionIds = new Set(\n [session.agentSessionId, session.providerSessionId]\n .map((value) => value?.trim())\n .filter((value): value is string => Boolean(value))\n );\n const startsByTurnId = new Map<string, number>();\n for (const message of context.messages ?? []) {\n if (!matchesSession(message.agentSessionId, sessionIds)) {\n continue;\n }\n const turnId = message.turnId?.trim();\n if (!turnId) {\n continue;\n }\n const role = normalizeToken(message.role);\n if (role === \"user\") {\n const startedAtUnixMs = positiveNumber(message.occurredAtUnixMs);\n if (startedAtUnixMs !== null) {\n startsByTurnId.set(\n turnId,\n minNullable(startsByTurnId.get(turnId) ?? null, startedAtUnixMs)!\n );\n }\n }\n }\n let latest: number | null = null;\n for (const startedAtUnixMs of startsByTurnId.values()) {\n latest =\n latest === null ? startedAtUnixMs : Math.max(latest, startedAtUnixMs);\n }\n return latest;\n}\n\nfunction matchesSession(\n agentSessionId: string | undefined,\n sessionIds: ReadonlySet<string>\n): boolean {\n if (sessionIds.size === 0) {\n return true;\n }\n const normalized = agentSessionId?.trim();\n return Boolean(normalized && sessionIds.has(normalized));\n}\n\nfunction minNullable(left: number | null, right: number | null): number | null {\n if (left === null) {\n return right;\n }\n if (right === null) {\n return left;\n }\n return Math.min(left, right);\n}\n\nfunction normalizeToken(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? \"\";\n}\n\nfunction positiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : null;\n}\n"],"mappings":";AAqBO,SAAS,2CACd,SACA,UAAgD,CAAC,GACzC;AACR,QAAM,iBAAiB,oCAAoC,OAAO;AAClE,QAAM,0BAA0B,iBAC5B,OACA,eAAe,QAAQ,eAAe;AAC1C,SACE,8BAA8B,SAAS,OAAO,KAC9C,eAAe,QAAQ,aAAa,KACpC,2BACA,eAAe,QAAQ,eAAe,KACtC,eAAe,QAAQ,eAAe,KACtC,eAAe,QAAQ,EAAE,KACzB;AAEJ;AAEA,SAAS,oCACP,SACS;AACT,SAAO,QAAQ,QAAQ,UAAU,MAAM;AACzC;AAEA,SAAS,8BACP,SACA,SACe;AACf,QAAM,aAAa,IAAI;AAAA,IACrB,CAAC,QAAQ,gBAAgB,QAAQ,iBAAiB,EAC/C,IAAI,CAAC,UAAU,OAAO,KAAK,CAAC,EAC5B,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC;AAAA,EACtD;AACA,QAAM,iBAAiB,oBAAI,IAAoB;AAC/C,aAAW,WAAW,QAAQ,YAAY,CAAC,GAAG;AAC5C,QAAI,CAAC,eAAe,QAAQ,gBAAgB,UAAU,GAAG;AACvD;AAAA,IACF;AACA,UAAM,SAAS,QAAQ,QAAQ,KAAK;AACpC,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,UAAM,OAAO,eAAe,QAAQ,IAAI;AACxC,QAAI,SAAS,QAAQ;AACnB,YAAM,kBAAkB,eAAe,QAAQ,gBAAgB;AAC/D,UAAI,oBAAoB,MAAM;AAC5B,uBAAe;AAAA,UACb;AAAA,UACA,YAAY,eAAe,IAAI,MAAM,KAAK,MAAM,eAAe;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAwB;AAC5B,aAAW,mBAAmB,eAAe,OAAO,GAAG;AACrD,aACE,WAAW,OAAO,kBAAkB,KAAK,IAAI,QAAQ,eAAe;AAAA,EACxE;AACA,SAAO;AACT;AAEA,SAAS,eACP,gBACA,YACS;AACT,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,aAAa,gBAAgB,KAAK;AACxC,SAAO,QAAQ,cAAc,WAAW,IAAI,UAAU,CAAC;AACzD;AAEA,SAAS,YAAY,MAAqB,OAAqC;AAC7E,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,IAAI,MAAM,KAAK;AAC7B;AAEA,SAAS,eAAe,OAAmC;AACzD,SAAO,OAAO,KAAK,EAAE,YAAY,KAAK;AACxC;AAEA,SAAS,eAAe,OAA+B;AACrD,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAClE,QACA;AACN;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../agent-gui/agentGuiNode/agentMentionAgentGeneratedFilesPresentation.ts","../agent-gui/agentGuiNode/agentMentionSearchDiagnostics.ts","../agent-gui/agentGuiNode/AgentMentionLabels.ts","../shared/richText/richTextDocument.ts","../agent-gui/agentGuiNode/agentMentionSearchHelpers.ts","../agent-gui/agentGuiNode/AgentMentionSearchController.ts","../agent-gui/agentGuiNode/AgentFileMentionPalette.tsx","../shared/roomIssueStatusLabel.ts"],"sourcesContent":["import { translate } from \"../../i18n/index\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport type { AgentMentionFileItem } from \"./agentRichText/agentFileMentionExtension\";\n\nconst AGENT_GENERATED_FOLDER_MIN_FILES = 2;\n\nexport function presentAgentGeneratedFileMentionItems(input: {\n files: readonly AgentContextMentionItem[];\n browsePath: string | null;\n query: string;\n}): AgentContextMentionItem[] {\n const fileItems = input.files.filter(\n (item): item is AgentMentionFileItem => item.kind === \"file\"\n );\n if (input.query.trim()) {\n return fileItems;\n }\n if (input.browsePath) {\n return presentAgentGeneratedBrowseFolder(fileItems, input.browsePath);\n }\n return presentAgentGeneratedRootFolders(fileItems);\n}\n\nfunction presentAgentGeneratedRootFolders(\n files: readonly AgentMentionFileItem[]\n): AgentMentionFileItem[] {\n const filesByDirectory = new Map<string, AgentMentionFileItem[]>();\n for (const file of files) {\n const directoryPath = resolveAgentGeneratedFileDirectoryPath(file);\n const group = filesByDirectory.get(directoryPath);\n if (group) {\n group.push(file);\n continue;\n }\n filesByDirectory.set(directoryPath, [file]);\n }\n\n const presented: AgentMentionFileItem[] = [];\n for (const [directoryPath, group] of filesByDirectory) {\n if (group.length >= AGENT_GENERATED_FOLDER_MIN_FILES) {\n presented.push(createAgentGeneratedFolderItem(directoryPath, group));\n continue;\n }\n presented.push(...group);\n }\n\n return sortAgentGeneratedMentionItems(presented);\n}\n\nfunction presentAgentGeneratedBrowseFolder(\n files: readonly AgentMentionFileItem[],\n browsePath: string\n): AgentMentionFileItem[] {\n const normalizedBrowsePath = normalizeAgentGeneratedDirectoryPath(browsePath);\n const children = files.filter(\n (file) =>\n resolveAgentGeneratedFileDirectoryPath(file) === normalizedBrowsePath\n );\n return [\n createAgentGeneratedFolderBackItem(normalizedBrowsePath),\n ...sortAgentGeneratedMentionItems(children)\n ];\n}\n\nfunction createAgentGeneratedFolderItem(\n directoryPath: string,\n files: readonly AgentMentionFileItem[]\n): AgentMentionFileItem {\n const normalizedPath = normalizeAgentGeneratedDirectoryPath(directoryPath);\n const name =\n normalizedPath.split(\"/\").filter(Boolean).at(-1) ?? normalizedPath;\n return {\n kind: \"file\",\n href: `${normalizedPath}/`,\n path: normalizedPath,\n name,\n entryKind: \"directory\",\n directoryPath: parentAgentGeneratedDirectoryPath(normalizedPath),\n mentionNavigation: \"agent-generated-folder\",\n childCount: files.length\n };\n}\n\nfunction createAgentGeneratedFolderBackItem(\n browsePath: string\n): AgentMentionFileItem {\n return {\n kind: \"file\",\n href: \"\",\n path: browsePath,\n name: translate(\"agentHost.agentGui.mentionAgentGeneratedFolderBack\"),\n entryKind: \"unknown\",\n directoryPath: parentAgentGeneratedDirectoryPath(browsePath),\n mentionNavigation: \"agent-generated-folder-back\"\n };\n}\n\nfunction resolveAgentGeneratedFileDirectoryPath(\n file: AgentMentionFileItem\n): string {\n const directoryPath = file.directoryPath?.trim();\n if (directoryPath) {\n return normalizeAgentGeneratedDirectoryPath(directoryPath);\n }\n return parentAgentGeneratedDirectoryPath(file.path);\n}\n\nfunction parentAgentGeneratedDirectoryPath(path: string): string {\n const normalized = normalizeAgentGeneratedDirectoryPath(path);\n const index = normalized.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalized.slice(0, index);\n}\n\nfunction normalizeAgentGeneratedDirectoryPath(path: string): string {\n return path.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n}\n\nfunction sortAgentGeneratedMentionItems(\n items: readonly AgentMentionFileItem[]\n): AgentMentionFileItem[] {\n return [...items].sort((left, right) =>\n left.name.localeCompare(right.name, undefined, { sensitivity: \"base\" })\n );\n}\n\nexport function agentGeneratedMentionItemKey(\n item: AgentContextMentionItem\n): string {\n if (item.kind !== \"file\") {\n return item.targetId;\n }\n if (item.mentionNavigation) {\n return `${item.mentionNavigation}:${item.path}`;\n }\n return item.path;\n}\n","import type {\n AgentMentionFilterId,\n AgentMentionGroup\n} from \"./AgentMentionSearchController\";\nimport { AGENT_CONTEXT_MENTION_PROVIDER_IDS } from \"./agentContextMentionProvider\";\n\nexport type AgentMentionProviderDiagnosticStatus =\n | \"success\"\n | \"timeout\"\n | \"error\"\n | \"missing\";\n\nexport interface AgentMentionProviderQueryDiagnostic {\n durationMs: number;\n errorKind?: string;\n providerId: string;\n resultCount: number;\n status: AgentMentionProviderDiagnosticStatus;\n}\n\nexport interface AgentMentionSearchDiagnosticLog {\n debounceMs: number;\n durationMs: number;\n errorKind?: string;\n event: \"agent_gui.mention_search\";\n filter: AgentMentionFilterId;\n groupCount: number;\n itemCount: number;\n mode: \"browse\" | \"results\";\n providerResults: AgentMentionProviderQueryDiagnostic[];\n providerTimeoutMs: number;\n queryLength: number;\n requestId: number;\n status: \"ready\" | \"error\";\n workspaceId: string;\n}\n\nconst AGENT_MENTION_SEARCH_LOG_PREFIX = \"[agent-gui] mention-search\";\nconst {\n agentGeneratedFile: AGENT_GENERATED_FILE_PROVIDER_ID,\n agentSession: AGENT_SESSION_PROVIDER_ID,\n file: FILE_PROVIDER_ID,\n workspaceApp: WORKSPACE_APP_PROVIDER_ID,\n workspaceIssue: WORKSPACE_ISSUE_PROVIDER_ID\n} = AGENT_CONTEXT_MENTION_PROVIDER_IDS;\nconst AGENT_MENTION_PROVIDER_LOG_ORDER: readonly string[] = [\n FILE_PROVIDER_ID,\n AGENT_GENERATED_FILE_PROVIDER_ID,\n WORKSPACE_APP_PROVIDER_ID,\n WORKSPACE_ISSUE_PROVIDER_ID,\n AGENT_SESSION_PROVIDER_ID\n];\n\nexport function emitAgentMentionSearchDiagnostic(input: {\n debounceMs: number;\n diagnosticInfoLogger: (payload: AgentMentionSearchDiagnosticLog) => void;\n diagnosticNow: () => number;\n diagnosticSlowThresholdMs: number;\n error?: unknown;\n filter: AgentMentionFilterId;\n groups: readonly AgentMentionGroup[];\n mode: \"browse\" | \"results\";\n providerDiagnostics: readonly AgentMentionProviderQueryDiagnostic[];\n providerTimeoutMs: number;\n query: string;\n requestId: number;\n startedAt: number;\n status: \"ready\" | \"error\";\n workspaceId: string;\n}): void {\n const durationMs = elapsedAgentMentionSearchDiagnosticMs(\n input.diagnosticNow(),\n input.startedAt\n );\n const providerResults = orderAgentMentionProviderDiagnostics(\n input.providerDiagnostics\n );\n const hasProviderIssue = providerResults.some(\n (result) => result.status === \"timeout\" || result.status === \"error\"\n );\n if (\n input.status === \"ready\" &&\n !hasProviderIssue &&\n durationMs < input.diagnosticSlowThresholdMs\n ) {\n return;\n }\n const payload: AgentMentionSearchDiagnosticLog = {\n debounceMs: input.debounceMs,\n durationMs,\n ...(input.status === \"error\"\n ? { errorKind: agentMentionSearchErrorKind(input.error) }\n : {}),\n event: \"agent_gui.mention_search\",\n filter: input.filter,\n groupCount: input.groups.length,\n itemCount: input.groups.reduce((sum, group) => sum + group.items.length, 0),\n mode: input.mode,\n providerResults,\n providerTimeoutMs: input.providerTimeoutMs,\n queryLength: [...input.query].length,\n requestId: input.requestId,\n status: input.status,\n workspaceId: input.workspaceId\n };\n try {\n input.diagnosticInfoLogger(payload);\n } catch {\n // Diagnostic logging must never affect mention search state.\n }\n}\n\nexport async function queryAgentMentionProviderWithDiagnostics<T>(input: {\n diagnosticNow: () => number;\n diagnostics: AgentMentionProviderQueryDiagnostic[];\n fallback: T;\n providerId: string;\n providerTimeoutMs: number;\n query: ((abortSignal: AbortSignal) => Promise<T>) | null;\n resultCount: (result: T) => number;\n}): Promise<T> {\n if (!input.query) {\n input.diagnostics.push({\n durationMs: 0,\n providerId: input.providerId,\n resultCount: 0,\n status: \"missing\"\n });\n return input.fallback;\n }\n const startedAt = input.diagnosticNow();\n try {\n const { result, timedOut } = await runAgentMentionProviderQuery({\n fallback: input.fallback,\n providerTimeoutMs: input.providerTimeoutMs,\n query: input.query\n });\n input.diagnostics.push({\n durationMs: elapsedAgentMentionSearchDiagnosticMs(\n input.diagnosticNow(),\n startedAt\n ),\n providerId: input.providerId,\n resultCount: input.resultCount(result),\n status: timedOut ? \"timeout\" : \"success\"\n });\n return result;\n } catch (error) {\n input.diagnostics.push({\n durationMs: elapsedAgentMentionSearchDiagnosticMs(\n input.diagnosticNow(),\n startedAt\n ),\n errorKind: agentMentionSearchErrorKind(error),\n providerId: input.providerId,\n resultCount: 0,\n status: \"error\"\n });\n throw error;\n }\n}\n\nfunction elapsedAgentMentionSearchDiagnosticMs(\n now: number,\n startedAt: number\n): number {\n const durationMs = now - startedAt;\n if (!Number.isFinite(durationMs)) {\n return 0;\n }\n return Math.max(0, Math.round(durationMs));\n}\n\nfunction agentMentionSearchErrorKind(error: unknown): string {\n if (error instanceof Error && error.name.trim()) {\n return error.name.trim();\n }\n if (error === null) {\n return \"null\";\n }\n return typeof error;\n}\n\nexport function logAgentMentionSearchInfo(\n payload: AgentMentionSearchDiagnosticLog\n): void {\n console.info(AGENT_MENTION_SEARCH_LOG_PREFIX, JSON.stringify(payload));\n}\n\nfunction orderAgentMentionProviderDiagnostics(\n diagnostics: readonly AgentMentionProviderQueryDiagnostic[]\n): AgentMentionProviderQueryDiagnostic[] {\n return [...diagnostics].sort((left, right) => {\n const leftIndex = providerDiagnosticOrder(left.providerId);\n const rightIndex = providerDiagnosticOrder(right.providerId);\n return (\n leftIndex - rightIndex || left.providerId.localeCompare(right.providerId)\n );\n });\n}\n\nfunction providerDiagnosticOrder(providerId: string): number {\n const index = AGENT_MENTION_PROVIDER_LOG_ORDER.indexOf(providerId);\n return index === -1 ? AGENT_MENTION_PROVIDER_LOG_ORDER.length : index;\n}\n\nasync function runAgentMentionProviderQuery<T>(input: {\n fallback: T;\n providerTimeoutMs: number;\n query: (abortSignal: AbortSignal) => Promise<T>;\n}): Promise<{ result: T; timedOut: boolean }> {\n const abortController = new AbortController();\n let timedOut = false;\n const queryPromise = Promise.resolve().then(() =>\n input.query(abortController.signal)\n );\n const queryResultPromise = queryPromise.then(\n (result) => ({ result, timedOut: false }),\n (error) => {\n if (timedOut && abortController.signal.aborted) {\n return { result: input.fallback, timedOut: true };\n }\n throw error;\n }\n );\n\n if (\n input.providerTimeoutMs <= 0 ||\n !Number.isFinite(input.providerTimeoutMs)\n ) {\n return queryResultPromise;\n }\n\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const timeoutPromise = new Promise<{ result: T; timedOut: boolean }>(\n (resolve) => {\n timeout = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n resolve({ result: input.fallback, timedOut: true });\n }, input.providerTimeoutMs);\n }\n );\n\n try {\n return await Promise.race([queryResultPromise, timeoutPromise]);\n } finally {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n }\n}\n","import { translate } from \"../../i18n/index\";\nimport type {\n AgentMentionFilterId,\n AgentMentionGroupId\n} from \"./AgentMentionSearchController\";\n\nexport function agentMentionGroupLabel(groupId: AgentMentionGroupId): string {\n switch (groupId) {\n case \"apps\":\n return translate(\"agentHost.agentGui.mentionGroupApps\");\n case \"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 }\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 === \"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 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 {\n WorkspaceAgentActivityMessage,\n WorkspaceAgentActivitySession,\n WorkspaceAgentActivitySessionSummary\n} from \"../../shared/workspaceAgentActivityTypes\";\n\nexport function buildSessionMentionItem(input: {\n workspaceId: string;\n currentUserId: string;\n session: WorkspaceAgentActivitySession;\n summary: WorkspaceAgentActivitySessionSummary | null;\n userProfiles: Record<string, Pick<AgentHostUserInfo, \"name\" | \"avatar\">>;\n fallbackTitle?: string | null;\n}): AgentMentionSessionItem | null {\n const sessionUserId = input.session.userId?.trim() ?? \"\";\n const scope: AgentMentionScope =\n sessionUserId && sessionUserId === input.currentUserId\n ? \"my_sessions\"\n : \"collab_sessions\";\n const userProfile = sessionUserId\n ? input.userProfiles[sessionUserId]\n : undefined;\n const initiatorName = normalizeSessionInitiatorDisplayName(\n userProfile?.name ||\n sessionUserId ||\n translate(\"agentHost.agentGui.mentionCollaboratorFallback\")\n );\n const sessionProvider = input.session.provider?.trim() ?? \"\";\n const 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 initiatorName,\n ...(userProfile?.avatar ? { initiatorAvatarUrl: userProfile.avatar } : {}),\n agentName,\n status,\n inputPreview,\n summaryPreview,\n updatedAtUnixMs:\n input.session.updatedAtUnixMs ??\n input.session.createdAtUnixMs ??\n Date.now()\n };\n}\n\nfunction normalizeSessionInitiatorDisplayName(value: string): string {\n const trimmed = value.trim();\n return trimmed.toLowerCase() === \"local\" ? \"User\" : trimmed;\n}\n\nexport function resolveSessionMentionMessageTitle(\n session: WorkspaceAgentActivitySession,\n messages: readonly WorkspaceAgentActivityMessage[]\n): string {\n return compactText(\n resolveWorkspaceAgentActivityTitle(session, [...messages])\n );\n}\n\nfunction resolveSessionDisplayStatus(\n session: WorkspaceAgentActivitySession,\n summary: WorkspaceAgentActivitySessionSummary | null\n): string {\n const sessionStatus = resolveWorkspaceAgentActivityStatus(session);\n if (hasExplicitSessionStatus(session)) {\n return sessionStatus;\n }\n const status = (\n summary?.executionStatus?.currentOrFinalStatus ??\n summary?.currentOrFinalStatus ??\n session.status ??\n \"\"\n )\n .trim()\n .toLowerCase();\n if (status === \"waiting\") {\n return \"waiting\";\n }\n if (status === \"working\") {\n return \"working\";\n }\n if (status === \"completed\") {\n return \"completed\";\n }\n if (status === \"failed\") {\n return \"failed\";\n }\n return status\n ? resolveWorkspaceAgentActivityStatusFromSummary(status)\n : sessionStatus;\n}\n\nfunction hasExplicitSessionStatus(\n session: WorkspaceAgentActivitySession\n): boolean {\n return Boolean((session.status ?? \"\").trim());\n}\n\nfunction resolveWorkspaceAgentActivityStatusFromSummary(\n status: string\n): string {\n switch (status) {\n case \"waiting\":\n return \"waiting\";\n case \"working\":\n return \"working\";\n case \"completed\":\n return \"completed\";\n case \"canceled\":\n return \"canceled\";\n case \"failed\":\n return \"failed\";\n default:\n return \"idle\";\n }\n}\n\nfunction firstSummaryItemText(\n items: ReadonlyArray<{ content?: string }> | undefined\n): string {\n if (!items) {\n return \"\";\n }\n for (const item of items) {\n const text = compactText(item.content);\n if (text) {\n return text;\n }\n }\n return \"\";\n}\n\nexport function matchesSessionQuery(\n item: AgentContextMentionItem,\n rawQuery: string\n): boolean {\n if (item.kind !== \"session\") {\n return true;\n }\n const query = normalizeQuery(rawQuery);\n if (!query) {\n return true;\n }\n const haystack = [\n item.name,\n item.title,\n item.initiatorName,\n item.agentName,\n item.inputPreview ?? \"\",\n item.summaryPreview ?? \"\"\n ]\n .join(\"\\n\")\n .toLowerCase();\n return query\n .toLowerCase()\n .split(/\\s+/)\n .filter(Boolean)\n .every((token) => haystack.includes(token));\n}\n\nexport const AGENT_MENTION_FILTER_TAB_ORDER = [\n \"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 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\ntype AgentMentionRawGroupId = Exclude<AgentMentionGroupId, \"files\">;\n\nexport function resolveMentionGroupItems(\n groupId: AgentMentionGroupId,\n rawGroups: Record<AgentMentionRawGroupId, AgentContextMentionItem[]>\n): AgentContextMentionItem[] {\n if (groupId === \"files\") {\n return [...rawGroups.opened_files, ...rawGroups.agent_generated_files];\n }\n return rawGroups[groupId] ?? [];\n}\n\nexport function resolveMentionGroupTotalCount(\n groupId: AgentMentionGroupId,\n totalCounts: Partial<Record<AgentMentionGroupId, number>>,\n itemCount: number\n): number {\n if (groupId === \"files\") {\n return (\n (totalCounts.opened_files ?? 0) + (totalCounts.agent_generated_files ?? 0)\n );\n }\n if (groupId === \"agent_generated_files\") {\n return itemCount;\n }\n return totalCounts[groupId] ?? itemCount;\n}\n\nexport function normalizeQuery(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nexport function compactText(value: string | null | undefined): string {\n return value?.replace(/\\s+/g, \" \").trim() ?? \"\";\n}\n\nexport function issuePreviewText(value: string | null | undefined): string {\n const content = extractPlainTextWithoutFilesFromContent(value);\n return compactText(content);\n}\n\nexport function unique(values: readonly string[]): string[] {\n return [...new Set(values)];\n}\n\nexport function getOrCreateSummaryCache<T>(\n map: Map<string, Map<string, T>>,\n workspaceId: string\n): Map<string, T> {\n const existing = map.get(workspaceId);\n if (existing) {\n return existing;\n }\n const created = new Map<string, T>();\n map.set(workspaceId, created);\n return created;\n}\n","import { resolveAgentMentionFileThumbnailUrl } from \"../shared/mentionFilePresentation\";\nimport { getOptionalAgentHostApi } from \"../../agentActivityHost\";\nimport type { RuntimeDiagnosticsDetailValue } from \"../../shared/contracts/dto/debug\";\nimport { presentAgentGeneratedFileMentionItems } from \"./agentMentionAgentGeneratedFilesPresentation\";\nimport {\n emitAgentMentionSearchDiagnostic,\n logAgentMentionSearchInfo,\n queryAgentMentionProviderWithDiagnostics,\n type AgentMentionProviderQueryDiagnostic,\n type AgentMentionSearchDiagnosticLog\n} from \"./agentMentionSearchDiagnostics\";\nimport {\n AGENT_MENTION_FILTER_TAB_ORDER,\n buildEmptyGroup,\n compactText,\n DEFAULT_AGENT_MENTION_FILTER,\n DEFAULT_MENTION_GROUP_PAGE_SIZE,\n groupIdsForFilter,\n mentionGroupPageSize,\n normalizeQuery,\n resolveMentionGroupItems,\n resolveMentionGroupTotalCount,\n shouldShowEmptyGroup\n} from \"./agentMentionSearchHelpers\";\nimport { agentMentionFilterLabel } from \"./AgentMentionLabels\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\nimport { normalizeAgentSessionMentionTitle } from \"./agentRichText/agentFileMentionExtension\";\nimport { createRichTextMentionHref } from \"@tutti-os/ui-rich-text/core\";\nimport type {\n AgentContextMentionInsertResult,\n AgentContextMentionProvider\n} from \"./agentContextMentionProvider\";\nimport { AGENT_CONTEXT_MENTION_PROVIDER_IDS } from \"./agentContextMentionProvider\";\nimport type {\n MentionPaletteGroup,\n MentionPaletteState\n} from \"@tutti-os/ui-rich-text/at-panel\";\n\nexport type AgentMentionFilterId =\n | \"session\"\n | \"file\"\n | \"issue\"\n | \"agent\"\n | \"app\";\nexport type AgentMentionGroupId =\n | \"apps\"\n | \"agents\"\n | \"files\"\n | \"opened_files\"\n | \"agent_generated_files\"\n | \"my_sessions\"\n | \"collab_sessions\"\n | \"issues\";\n\ntype AgentMentionRawGroupId = Exclude<AgentMentionGroupId, \"files\">;\ntype AgentMentionRawGroups = Record<\n AgentMentionRawGroupId,\n AgentContextMentionItem[]\n>;\ntype AgentMentionTotalCounts = Partial<Record<AgentMentionGroupId, number>>;\n\nexport interface AgentMentionBrowseCategory {\n id: AgentMentionFilterId;\n label: string;\n}\n\nexport type AgentMentionGroup = MentionPaletteGroup<AgentContextMentionItem>;\n\nexport type AgentMentionSearchState =\n MentionPaletteState<AgentContextMentionItem>;\n\ninterface AgentMentionSearchControllerOptions {\n contextMentionProviders?: readonly AgentContextMentionProvider[];\n debounceMs?: number;\n fileLimit?: number;\n issueLimit?: number;\n browseCacheTtlMs?: number;\n providerTimeoutMs?: number;\n diagnosticInfoLogger?: (payload: AgentMentionSearchDiagnosticLog) => void;\n diagnosticNow?: () => number;\n diagnosticSlowThresholdMs?: number;\n}\n\ntype Listener = (state: AgentMentionSearchState) => void;\n\nconst DEFAULT_DEBOUNCE_MS = 120;\nconst DEFAULT_FILE_LIMIT = 30;\nconst DEFAULT_ISSUE_LIMIT = 25;\nconst DEFAULT_SESSION_LIMIT = 30;\nconst DEFAULT_PROVIDER_TIMEOUT_MS = 3500;\nconst DEFAULT_DIAGNOSTIC_SLOW_THRESHOLD_MS = 250;\nconst DEFAULT_BROWSE_CACHE_TTL_MS = 30_000;\nconst AGENT_MENTION_LIFECYCLE_LOG_PREFIX = \"[agent-gui] mention-lifecycle\";\n\ninterface AgentMentionBrowseFetchResult {\n providerDiagnostics: AgentMentionProviderQueryDiagnostic[];\n rawGroups: AgentMentionRawGroups;\n totalCounts: AgentMentionTotalCounts;\n}\n\ninterface AgentMentionBrowseCacheEntry extends AgentMentionBrowseFetchResult {\n cachedAt: number;\n}\n\ntype AgentMentionBrowseLoadReason = \"open\" | \"preload\";\n\ninterface 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\nconst sharedAgentMentionBrowseCache = new Map<\n string,\n AgentMentionBrowseCacheEntry\n>();\nconst sharedAgentMentionBrowseFetches = new Map<\n string,\n Promise<AgentMentionBrowseFetchResult>\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\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.\nfunction scheduleIdleTask(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 const handle = setTimeout(task, 0);\n return () => clearTimeout(handle);\n}\n\nexport function resetAgentMentionSearchBrowseCacheForTests(): void {\n sharedAgentMentionBrowseCache.clear();\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// default (\"en\") runtime, since the agent GUI i18n locale is only synced once the\n// AgentGuiI18nProvider renders.\nfunction buildBrowseCategories(): AgentMentionBrowseCategory[] {\n return AGENT_MENTION_FILTER_TAB_ORDER.map((id) => ({\n id,\n label: agentMentionFilterLabel(id)\n }));\n}\n\nconst {\n agentGeneratedFile: AGENT_GENERATED_FILE_PROVIDER_ID,\n agentSession: AGENT_SESSION_PROVIDER_ID,\n 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\nexport class AgentMentionSearchController {\n private readonly contextMentionProviders: ReadonlyMap<\n string,\n AgentContextMentionProvider\n >;\n private readonly debounceMs: number;\n private readonly fileLimit: number;\n private readonly issueLimit: number;\n private readonly browseCacheTtlMs: number;\n private readonly providerTimeoutMs: number;\n private readonly diagnosticInfoLogger: (\n payload: AgentMentionSearchDiagnosticLog\n ) => void;\n private readonly diagnosticNow: () => number;\n private readonly diagnosticSlowThresholdMs: number;\n private readonly listeners = new Set<Listener>();\n private readonly expandedCounts: Partial<\n Record<AgentMentionGroupId, number>\n > = {};\n private readonly totalCounts: AgentMentionTotalCounts = {};\n private timer: ReturnType<typeof setTimeout> | null = null;\n private preloadCancel: (() => void) | null = null;\n private pendingPreloadKey: string | null = null;\n private requestId = 0;\n private disposed = false;\n private activeWorkspaceId = \"\";\n private currentUserId = \"\";\n private currentFilter: AgentMentionFilterId = DEFAULT_AGENT_MENTION_FILTER;\n private currentQuery = \"\";\n private currentSessionCwd = \"\";\n private currentFileSearchLimit: number;\n private currentIssueSearchLimit: number;\n private agentGeneratedBrowsePath: string | null = null;\n private rawGroups: AgentMentionRawGroups = emptyAgentMentionRawGroups();\n private 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 subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n listener(this.state);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n updateQuery(input: {\n workspaceId: string;\n currentUserId?: string | null;\n query: string;\n sessionCwd?: string | null;\n }): void {\n if (this.disposed) {\n return;\n }\n this.activeWorkspaceId = input.workspaceId.trim();\n this.currentUserId = input.currentUserId?.trim() ?? \"\";\n this.currentSessionCwd = input.sessionCwd?.trim() ?? \"\";\n this.currentQuery = normalizeQuery(input.query);\n this.clearTimer();\n const requestId = ++this.requestId;\n this.resetAgentGeneratedBrowsePath();\n this.resetExpandedCounts();\n this.resetSearchLimits();\n 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 this.timer = setTimeout(() => {\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId,\n filter: this.currentFilter\n });\n }, this.debounceMs);\n }\n\n setFilter(filter: AgentMentionFilterId): void {\n if (this.disposed) {\n return;\n }\n this.currentFilter = filter;\n this.clearTimer();\n const requestId = ++this.requestId;\n this.resetAgentGeneratedBrowsePath();\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 void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId,\n filter\n });\n }\n\n preloadBrowse(input: {\n workspaceId: string;\n currentUserId?: 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 sessionCwd = input.sessionCwd?.trim() ?? \"\";\n const cacheKey = this.browseCacheKey({\n currentUserId,\n filter,\n sessionCwd,\n workspaceId\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 = scheduleIdleTask(() => {\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 sessionCwd,\n workspaceId\n });\n });\n }\n\n private runBrowsePreload(input: {\n cacheKey: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n workspaceId: string;\n }): void {\n const { cacheKey, currentUserId, filter, sessionCwd, workspaceId } = 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 sessionCwd\n },\n cacheKey,\n \"preload\"\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 private 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 selectAgentGeneratedMentionItem(item: AgentContextMentionItem): boolean {\n if (item.kind !== \"file\" || !item.mentionNavigation) {\n return false;\n }\n if (item.mentionNavigation === \"agent-generated-folder\") {\n this.agentGeneratedBrowsePath = item.path;\n this.expandedCounts.agent_generated_files = mentionGroupPageSize(\n this.currentFilter,\n \"agent_generated_files\"\n );\n this.setState({\n status: this.state.status === \"loading\" ? \"loading\" : \"ready\",\n query: this.currentQuery,\n mode: this.currentQuery ? \"results\" : \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n return true;\n }\n if (item.mentionNavigation === \"agent-generated-folder-back\") {\n this.resetAgentGeneratedBrowsePath();\n this.setState({\n status: this.state.status === \"loading\" ? \"loading\" : \"ready\",\n query: this.currentQuery,\n mode: this.currentQuery ? \"results\" : \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n return true;\n }\n return false;\n }\n\n exitAgentGeneratedBrowse(): boolean {\n if (!this.agentGeneratedBrowsePath) {\n return false;\n }\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 expandGroup(groupId: AgentMentionGroupId): void {\n const pageSize = mentionGroupPageSize(this.currentFilter, groupId);\n const current = this.expandedCounts[groupId] ?? pageSize;\n this.expandedCounts[groupId] = current + pageSize;\n if (!this.currentQuery) {\n this.setState({\n status: \"ready\",\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n return;\n }\n const needsMoreFiles =\n (groupId === \"opened_files\" ||\n groupId === \"files\" ||\n groupId === \"agent_generated_files\") &&\n (groupId === \"agent_generated_files\"\n ? this.rawGroups.agent_generated_files.length >=\n this.currentFileSearchLimit\n : this.rawGroups.opened_files.length >= this.currentFileSearchLimit);\n const needsMoreIssues =\n groupId === \"issues\" &&\n (this.totalCounts.issues ?? this.rawGroups.issues.length) >\n this.rawGroups.issues.length;\n if (needsMoreFiles) {\n this.currentFileSearchLimit += DEFAULT_MENTION_GROUP_PAGE_SIZE;\n }\n if (needsMoreIssues) {\n this.currentIssueSearchLimit += DEFAULT_MENTION_GROUP_PAGE_SIZE;\n }\n if (needsMoreFiles || needsMoreIssues) {\n this.clearTimer();\n const requestId = ++this.requestId;\n this.setState({\n status: \"loading\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n void this.runSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n query: this.currentQuery,\n requestId,\n filter: this.currentFilter\n });\n return;\n }\n this.setState({\n status: \"ready\",\n query: this.currentQuery,\n mode: \"results\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: this.groupsFromRawGroups(),\n error: null\n });\n }\n\n close(): void {\n this.clearTimer();\n this.requestId += 1;\n this.currentFilter = DEFAULT_AGENT_MENTION_FILTER;\n this.resetAgentGeneratedBrowsePath();\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.cancelPendingPreload();\n this.listeners.clear();\n this.requestId += 1;\n }\n\n private 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 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.readBrowseCacheForBrowseInput({\n cacheKey,\n currentUserId: this.currentUserId,\n filter,\n sessionCwd: this.currentSessionCwd,\n workspaceId: this.activeWorkspaceId\n });\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 if (cached.isFresh) {\n return;\n }\n } else {\n this.rawGroups = emptyAgentMentionRawGroups();\n this.resetTotalCounts();\n this.emitBrowseState(\"loading\");\n }\n void this.runBrowseSearch({\n workspaceId: this.activeWorkspaceId,\n currentUserId: this.currentUserId,\n requestId,\n filter,\n sessionCwd: this.currentSessionCwd\n });\n }\n\n private async runSearch(input: {\n workspaceId: string;\n currentUserId: string;\n query: string;\n requestId: number;\n filter: AgentMentionFilterId;\n }): Promise<void> {\n const startedAt = this.diagnosticNow();\n let providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n try {\n const result = await this.fetchFilterResult({\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n filter: input.filter,\n sessionCwd: this.currentSessionCwd,\n includeAgentGeneratedFiles: false\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 private async runBrowseSearch(input: {\n workspaceId: string;\n currentUserId: string;\n requestId: number;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n }): Promise<void> {\n const startedAt = this.diagnosticNow();\n let providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n const cacheKey = this.browseCacheKey(input);\n try {\n const result = await this.loadBrowseFetchResult(input, cacheKey, \"open\");\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 this.applyBrowseFetchResult(result);\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 private async loadBrowseFetchResult(\n input: {\n workspaceId: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n },\n cacheKey: string,\n reason: AgentMentionBrowseLoadReason\n ): Promise<AgentMentionBrowseFetchResult> {\n const existingFetch = sharedAgentMentionBrowseFetches.get(cacheKey);\n if (existingFetch) {\n this.logLifecycle(\"browse.fetch.dedupe\", {\n filter: input.filter,\n reason,\n workspaceId: input.workspaceId\n });\n return existingFetch;\n }\n const startedAt = this.diagnosticNow();\n this.logLifecycle(\"browse.fetch.start\", {\n filter: input.filter,\n providerIds: this.providerIdsForDiagnostics(),\n reason,\n workspaceId: input.workspaceId\n });\n const fetchPromise = this.fetchBrowseResult(input)\n .then((result) => {\n writeBrowseCacheEntry(cacheKey, {\n ...result,\n cachedAt: this.diagnosticNow()\n });\n this.logLifecycle(\"browse.fetch.success\", {\n durationMs: elapsedDiagnosticMs(this.diagnosticNow(), startedAt),\n filter: input.filter,\n itemCount: rawGroupItemCount(result.rawGroups),\n providerResults: providerDiagnosticsSummary(\n result.providerDiagnostics\n ),\n reason,\n workspaceId: input.workspaceId\n });\n return result;\n })\n .finally(() => {\n if (sharedAgentMentionBrowseFetches.get(cacheKey) === fetchPromise) {\n sharedAgentMentionBrowseFetches.delete(cacheKey);\n }\n });\n sharedAgentMentionBrowseFetches.set(cacheKey, fetchPromise);\n return fetchPromise;\n }\n\n private async fetchBrowseResult(input: {\n workspaceId: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n }): Promise<AgentMentionBrowseFetchResult> {\n return this.fetchFilterResult({\n ...input,\n query: \"\",\n includeAgentGeneratedFiles: input.filter === \"file\"\n });\n }\n\n private async fetchFilterResult(input: {\n workspaceId: string;\n currentUserId: string;\n query: string;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n includeAgentGeneratedFiles: boolean;\n }): Promise<AgentMentionBrowseFetchResult> {\n const providerDiagnostics: AgentMentionProviderQueryDiagnostic[] = [];\n switch (input.filter) {\n case \"file\": {\n const fileQuery = this.queryProviderMentionItemsById({\n providerId: FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: input.query ? this.currentFileSearchLimit : this.fileLimit,\n sessionCwd: input.sessionCwd,\n diagnostics: providerDiagnostics\n });\n const agentGeneratedFileQuery = input.includeAgentGeneratedFiles\n ? this.queryProviderMentionItemsById({\n providerId: AGENT_GENERATED_FILE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: this.fileLimit,\n sessionCwd: input.sessionCwd,\n diagnostics: providerDiagnostics\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(\n (item) => item.kind === \"file\"\n );\n rawGroups.agent_generated_files = agentGeneratedFileItems.filter(\n (item) => item.kind === \"file\"\n );\n return {\n providerDiagnostics,\n rawGroups,\n totalCounts: totalCountsFromRawGroups(rawGroups)\n };\n }\n case \"session\": {\n const sessionItems = await this.queryProviderMentionItemsById({\n providerId: AGENT_SESSION_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: DEFAULT_SESSION_LIMIT,\n sessionCwd: input.sessionCwd,\n diagnostics: providerDiagnostics\n });\n const rawGroups = emptyAgentMentionRawGroups();\n rawGroups.my_sessions = normalizeSessionMentionItemsForMySessions({\n currentUserId: input.currentUserId,\n items: sessionItems\n });\n return {\n providerDiagnostics,\n rawGroups,\n totalCounts: totalCountsFromRawGroups(rawGroups)\n };\n }\n case \"issue\": {\n const issueItems = await this.queryProviderMentionItemsById({\n providerId: WORKSPACE_ISSUE_PROVIDER_ID,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: this.currentIssueSearchLimit,\n sessionCwd: input.sessionCwd,\n diagnostics: providerDiagnostics\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 };\n }\n case \"agent\": {\n const agentItems = await this.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 });\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 };\n }\n case \"app\": {\n const appItems = await this.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 });\n const rawGroups = emptyAgentMentionRawGroups();\n rawGroups.apps = appItems.filter(\n (item) => item.kind === \"workspace-app\"\n );\n return {\n providerDiagnostics,\n rawGroups,\n totalCounts: totalCountsFromRawGroups(rawGroups)\n };\n }\n }\n }\n\n private async queryProviderMentionItems(input: {\n provider: AgentContextMentionProvider;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit?: number;\n sessionCwd: string;\n abortSignal: AbortSignal;\n }): Promise<AgentContextMentionItem[]> {\n const items = await input.provider.query({\n keyword: input.query,\n maxResults: input.limit,\n abortSignal: input.abortSignal,\n trigger: \"@\",\n context: {\n metadata: {\n currentUserId: input.currentUserId,\n sessionCwd: input.sessionCwd || undefined,\n target: \"agent-gui\",\n workspaceId: input.workspaceId\n }\n }\n });\n if (input.abortSignal.aborted) {\n return [];\n }\n const mentionItems = await Promise.all(\n items.map(async (item) => {\n const mentionItem = providerItemToAgentMentionItem({\n currentUserId: input.currentUserId,\n insertResult: input.provider.toInsertResult(item),\n label: input.provider.getItemLabel(item),\n providerId: input.provider.id,\n subtitle: input.provider.getItemSubtitle?.(item) ?? \"\",\n workspaceId: input.workspaceId\n });\n if (!mentionItem || mentionItem.kind !== \"file\") {\n return mentionItem;\n }\n const iconUrl = await Promise.resolve(\n input.provider.getItemIconUrl?.(item) ?? null\n ).catch(() => null);\n const resolvedThumbnailUrl = resolveAgentMentionFileThumbnailUrl({\n ...mentionItem,\n thumbnailUrl: iconUrl\n });\n if (!resolvedThumbnailUrl) {\n return mentionItem;\n }\n return {\n ...mentionItem,\n thumbnailUrl: resolvedThumbnailUrl\n };\n })\n );\n return mentionItems.filter(\n (item): item is AgentContextMentionItem => item !== null\n );\n }\n\n private applyBrowseFetchResult(result: AgentMentionBrowseFetchResult): void {\n this.rawGroups = cloneAgentMentionRawGroups(result.rawGroups);\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 private readBrowseCache(cacheKey: string): {\n entry: AgentMentionBrowseCacheEntry | null;\n isFresh: boolean;\n } {\n const entry = sharedAgentMentionBrowseCache.get(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(cacheKey);\n sharedAgentMentionBrowseCache.set(cacheKey, entry);\n const ageMs = this.diagnosticNow() - entry.cachedAt;\n const isFresh =\n this.browseCacheTtlMs >= 0 &&\n Number.isFinite(this.browseCacheTtlMs) &&\n ageMs <= this.browseCacheTtlMs;\n return { entry, isFresh };\n }\n\n private readBrowseCacheForBrowseInput(input: {\n cacheKey: string;\n workspaceId: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n }): {\n entry: AgentMentionBrowseCacheEntry | null;\n isFresh: boolean;\n } {\n return this.readBrowseCache(input.cacheKey);\n }\n\n private browseCacheKey(input: {\n workspaceId: string;\n currentUserId: string;\n filter: AgentMentionFilterId;\n sessionCwd: string;\n }): string {\n return JSON.stringify({\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n sessionCwd: input.sessionCwd,\n filter: input.filter,\n fileLimit: this.fileLimit,\n issueLimit: this.currentIssueSearchLimit,\n providerIds: [...this.contextMentionProviders.keys()].sort()\n });\n }\n\n private 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 private logLifecycle(\n event: AgentMentionLifecycleDiagnosticLog[\"event\"],\n details: Record<string, RuntimeDiagnosticsDetailValue>\n ): void {\n logAgentMentionLifecycleDiagnostic({ event, details });\n }\n\n private providerIdsForDiagnostics(): string {\n return [...this.contextMentionProviders.keys()].sort().join(\",\");\n }\n\n private async queryProviderMentionItemsById(input: {\n diagnostics: AgentMentionProviderQueryDiagnostic[];\n providerId: string;\n workspaceId: string;\n currentUserId: string;\n query: string;\n limit?: number;\n sessionCwd?: string;\n }): Promise<AgentContextMentionItem[]> {\n const provider = this.contextMentionProviders.get(input.providerId);\n return queryAgentMentionProviderWithDiagnostics({\n diagnosticNow: this.diagnosticNow,\n diagnostics: input.diagnostics,\n fallback: [] as AgentContextMentionItem[],\n providerId: input.providerId,\n providerTimeoutMs: this.providerTimeoutMs,\n query: provider\n ? (abortSignal) =>\n this.queryProviderMentionItems({\n provider,\n workspaceId: input.workspaceId,\n currentUserId: input.currentUserId,\n query: input.query,\n limit: input.limit,\n sessionCwd: input.sessionCwd ?? this.currentSessionCwd,\n abortSignal\n })\n : null,\n resultCount: (result) => result.length\n });\n }\n\n private logSearchDiagnostic(input: {\n error?: unknown;\n filter: AgentMentionFilterId;\n groups: readonly AgentMentionGroup[];\n mode: \"browse\" | \"results\";\n providerDiagnostics: readonly AgentMentionProviderQueryDiagnostic[];\n query: string;\n requestId: number;\n startedAt: number;\n status: \"ready\" | \"error\";\n workspaceId: string;\n }): void {\n emitAgentMentionSearchDiagnostic({\n debounceMs: this.debounceMs,\n diagnosticInfoLogger: this.diagnosticInfoLogger,\n diagnosticNow: this.diagnosticNow,\n diagnosticSlowThresholdMs: this.diagnosticSlowThresholdMs,\n error: input.error,\n filter: input.filter,\n groups: input.groups,\n mode: input.mode,\n providerDiagnostics: input.providerDiagnostics,\n providerTimeoutMs: this.providerTimeoutMs,\n query: input.query,\n requestId: input.requestId,\n startedAt: input.startedAt,\n status: input.status,\n workspaceId: input.workspaceId\n });\n }\n\n private groupsFromRawGroups(): AgentMentionGroup[] {\n const orderedGroupIds = groupIdsForFilter(this.currentFilter);\n return orderedGroupIds\n .map((groupId) => {\n const rawItems = resolveMentionGroupItems(groupId, this.rawGroups);\n const items =\n groupId === \"agent_generated_files\"\n ? presentAgentGeneratedFileMentionItems({\n files: rawItems,\n browsePath: this.agentGeneratedBrowsePath,\n query: this.currentQuery\n })\n : rawItems;\n if (items.length === 0) {\n if (\n !shouldShowEmptyGroup(\n groupId,\n this.currentFilter,\n this.currentQuery\n )\n ) {\n return null;\n }\n return buildEmptyGroup(groupId, this.currentQuery);\n }\n const pageSize = mentionGroupPageSize(this.currentFilter, groupId);\n const visibleCount =\n groupId === \"apps\"\n ? items.length\n : Math.min(items.length, this.expandedCounts[groupId] ?? pageSize);\n const totalCount = resolveMentionGroupTotalCount(\n groupId,\n this.totalCounts,\n items.length\n );\n return {\n id: groupId,\n items: items.slice(0, visibleCount),\n totalCount,\n visibleCount,\n hasMore:\n groupId !== \"apps\" &&\n (items.length > visibleCount ||\n ((groupId === \"opened_files\" ||\n groupId === \"files\" ||\n groupId === \"agent_generated_files\") &&\n items.length >= this.currentFileSearchLimit) ||\n totalCount > visibleCount)\n } satisfies AgentMentionGroup;\n })\n .filter((group): group is AgentMentionGroup => group !== null);\n }\n\n private emitBrowseState(status: \"ready\" | \"loading\"): void {\n this.setState({\n status,\n query: \"\",\n mode: \"browse\",\n filter: this.currentFilter,\n categories: buildBrowseCategories(),\n groups: [],\n error: null\n });\n }\n\n private canApply(\n requestId: number,\n workspaceId: string,\n query: string,\n 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 private clearTimer(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n private resetExpandedCounts(): void {\n for (const groupId of [\n \"files\",\n \"opened_files\",\n \"agent_generated_files\",\n \"my_sessions\",\n \"collab_sessions\",\n \"agents\",\n \"apps\",\n \"issues\"\n ] as const) {\n this.expandedCounts[groupId] = mentionGroupPageSize(\n this.currentFilter,\n groupId\n );\n }\n }\n\n private resetSearchLimits(): void {\n this.currentFileSearchLimit = this.fileLimit;\n this.currentIssueSearchLimit = this.issueLimit;\n }\n\n private resetRawGroups(): void {\n this.rawGroups = emptyAgentMentionRawGroups();\n this.resetTotalCounts();\n }\n\n private resetAgentGeneratedBrowsePath(): void {\n this.agentGeneratedBrowsePath = null;\n }\n\n private 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 private setState(state: AgentMentionSearchState): void {\n this.state = state;\n for (const listener of this.listeners) {\n listener(state);\n }\n }\n}\n\n// Warm the shared browse cache without a mounted controller — e.g. from an app\n// startup flow, so the first time the @ palette opens its results are already\n// cached. Spins up a transient controller (no listeners, default limits/ttl) so\n// the produced cacheKey matches a live composer controller built with the same\n// providers; the global cache + in-flight dedup are reused, so this never\n// double-fetches against a focus-driven preload. The instance holds no timers\n// after the idle warm runs, so it is garbage-collected.\nexport function preloadAgentMentionBrowse(input: {\n workspaceId: string;\n currentUserId?: 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 sessionCwd: input.sessionCwd,\n filter: input.filter\n });\n}\n\nfunction emptyAgentMentionRawGroups(): AgentMentionRawGroups {\n return {\n apps: [],\n agents: [],\n opened_files: [],\n agent_generated_files: [],\n my_sessions: [],\n collab_sessions: [],\n issues: []\n };\n}\n\nfunction 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 my_sessions: [...rawGroups.my_sessions],\n collab_sessions: [...rawGroups.collab_sessions],\n issues: [...rawGroups.issues]\n };\n}\n\nfunction 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.my_sessions.length,\n collab_sessions: rawGroups.collab_sessions.length,\n issues: rawGroups.issues.length\n };\n}\n\nfunction rawGroupItemCount(rawGroups: AgentMentionRawGroups): number {\n return Object.values(rawGroups).reduce(\n (count, items) => count + items.length,\n 0\n );\n}\n\nfunction 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\nfunction 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\nfunction 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\nfunction logAgentMentionLifecycleDiagnostic(\n payload: AgentMentionLifecycleDiagnosticLog\n): void {\n try {\n console.info(AGENT_MENTION_LIFECYCLE_LOG_PREFIX, JSON.stringify(payload));\n } catch {\n // Diagnostic logging must never affect mention search state.\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 {\n // Diagnostic logging must never affect mention search state.\n }\n}\n\nfunction normalizeSessionMentionItemsForMySessions(input: {\n currentUserId: string;\n items: readonly AgentContextMentionItem[];\n}): AgentContextMentionItem[] {\n return input.items\n .filter((item) => item.kind === \"session\")\n .filter((item) =>\n input.currentUserId ? item.scope === \"my_sessions\" : true\n )\n .map((item) =>\n item.scope === \"my_sessions\"\n ? item\n : { ...item, scope: \"my_sessions\" as const }\n );\n}\n\nfunction providerItemToAgentMentionItem(input: {\n currentUserId: string;\n providerId: string;\n insertResult: AgentContextMentionInsertResult;\n label: string;\n subtitle: string;\n workspaceId: string;\n}): AgentContextMentionItem | null {\n const label = compactText(input.label);\n if (!label) {\n return null;\n }\n if (input.insertResult.kind === \"markdown-link\") {\n const href = input.insertResult.href.trim();\n return {\n kind: \"file\",\n href,\n path: href,\n name: label,\n entryKind: href.endsWith(\"/\") ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromProviderWorkspaceFileHref(href)\n };\n }\n if (input.insertResult.kind !== \"mention\") {\n return null;\n }\n\n const mention = input.insertResult.mention;\n const targetId = mention.entityId.trim();\n if (!targetId) {\n return null;\n }\n const scope = normalizeMentionScope(mention.scope);\n const presentation = mention.presentation ?? {};\n const workspaceId = scope.workspaceId || input.workspaceId;\n if (\n input.providerId === FILE_PROVIDER_ID ||\n input.providerId === AGENT_GENERATED_FILE_PROVIDER_ID\n ) {\n return {\n kind: \"file\",\n href: createRichTextMentionHref({\n providerId: input.providerId,\n entityId: targetId,\n label,\n scope\n }),\n path: targetId,\n name: label,\n entryKind: targetId.endsWith(\"/\") ? \"directory\" : \"unknown\",\n directoryPath: dirnameFromProviderWorkspaceFileHref(targetId),\n thumbnailUrl: presentation.thumbnailUrl?.trim() || undefined\n };\n }\n if (input.providerId === WORKSPACE_ISSUE_PROVIDER_ID) {\n return {\n kind: \"workspace-issue\",\n href: 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 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 };\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: { workspaceId }\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 initiatorName: \"\",\n agentName,\n status: presentation.status?.trim() || undefined,\n inputPreview: description || undefined,\n summaryPreview\n };\n }\n return null;\n}\n\nfunction normalizeMentionScope(\n scope?: Readonly<Record<string, string>>\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(scope ?? {})\n .map(([key, value]) => [key.trim(), value.trim()] as const)\n .filter(([key, value]) => key.length > 0 && value.length > 0)\n );\n}\n\nfunction mentionSessionScope(input: {\n currentUserId: string;\n rawScope: string | undefined;\n userId?: string;\n}): Extract<AgentContextMentionItem, { kind: \"session\" }>[\"scope\"] {\n const rawScope = input.rawScope?.trim() ?? \"\";\n if (rawScope === \"my_sessions\" || rawScope === \"collab_sessions\") {\n return rawScope;\n }\n const userId = input.userId?.trim() ?? \"\";\n const currentUserId = input.currentUserId.trim();\n if (\n !userId ||\n !currentUserId ||\n userId === \"local\" ||\n currentUserId === \"local\"\n ) {\n return \"my_sessions\";\n }\n return userId === currentUserId ? \"my_sessions\" : \"collab_sessions\";\n}\n\nfunction dirnameFromProviderWorkspaceFileHref(href: string): string {\n const normalized = href.replace(/\\/+$/, \"\");\n const index = normalized.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalized.slice(0, index);\n}\n","import {\n normalizeAgentActivityDisplayStatus,\n type AgentActivityDisplayStatus\n} from \"@tutti-os/agent-activity-core\";\nimport {\n MentionPaletteFromState,\n flattenMentionPaletteEntries,\n renderMentionRow,\n type MentionPaletteEntry,\n type MentionPaletteState,\n type MentionPaletteTheme,\n type MentionRowClassNames,\n type MentionRowItem,\n type MentionRowStatusTag,\n type MentionRowStatusTone\n} from \"@tutti-os/ui-rich-text/at-panel\";\nimport { resolveIssueManagerStatusPresentation } from \"@tutti-os/workspace-issue-manager/ui\";\nimport { userAvatarPlaceholderUrl } from \"../../shared/userAvatarPlaceholder\";\nimport { translate } from \"../../i18n/index\";\nimport { managedAgentRoundedIconUrl } from \"../../shared/managedAgentIcons\";\nimport { workspaceAgentActivityStatusLabel } from \"../../shared/workspaceAgentActivityStatusLabel\";\nimport { roomIssueStatusLabel } from \"../../shared/roomIssueStatusLabel\";\nimport {\n resolveAgentMentionFileThumbnailUrl,\n resolveAgentMentionFileVisualKind\n} from \"../shared/mentionFilePresentation\";\nimport {\n agentMentionEmptyGroupLabel,\n agentMentionFilterLabel,\n agentMentionGroupLabel\n} from \"./AgentMentionLabels\";\nimport {\n AGENT_MENTION_FILTER_TAB_ORDER,\n mentionGroupExpandCount\n} from \"./agentMentionSearchHelpers\";\nimport {\n type AgentMentionGroup,\n type AgentMentionBrowseCategory,\n type AgentMentionFilterId,\n type AgentMentionGroupId,\n type AgentMentionSearchState\n} from \"./AgentMentionSearchController\";\nimport { agentGeneratedMentionItemKey } from \"./agentMentionAgentGeneratedFilesPresentation\";\nimport type { AgentContextMentionItem } from \"./agentRichText/agentFileMentionExtension\";\n\nexport interface AgentMentionPaletteEntry {\n key: string;\n type: \"category\" | \"item\" | \"expand\";\n categoryId?: AgentMentionBrowseCategory[\"id\"];\n groupId?: AgentMentionGroupId;\n item?: AgentContextMentionItem;\n}\n\nexport interface AgentFileMentionPaletteProps {\n state: AgentMentionSearchState;\n highlightedKey: string | null;\n label: string;\n loadingLabel: string;\n emptyLabel: string;\n errorLabel: string;\n tabHintLabel: string;\n maxHeightPx: number;\n shouldCenterHighlightedItem?: boolean;\n onHighlightChange: (key: string) => void;\n onSelectItem: (entry: AgentContextMentionItem) => void;\n onSelectCategory: (categoryId: AgentMentionBrowseCategory[\"id\"]) => void;\n onSelectFilter: (filter: AgentMentionFilterId) => void;\n onExpandGroup: (groupId: AgentMentionGroupId) => void;\n onNavigateHierarchy?: (delta: 1 | -1) => void;\n onNavigateIntoItem?: (item: AgentContextMentionItem) => void;\n /**\n * 可选:点击 issue / app 行末尾的「查看产物」入口时回调(打开引用 picker 并定位)。\n * 仅 workspace-issue / workspace-app 行渲染该入口。\n */\n onOpenReferences?: (item: AgentContextMentionItem) => void;\n}\n\nconst AGENT_MENTION_PALETTE_THEME: MentionPaletteTheme = {\n classNames: {\n palette: \"agent-gui-node__mention-palette\",\n header: \"agent-gui-node__mention-palette-header\",\n footer: \"agent-gui-node__mention-palette-footer\",\n tabs: \"agent-gui-node__mention-palette-tabs\",\n scrollRegion: \"agent-gui-node__mention-palette-scroll-region\",\n scrollbar:\n \"workspace-agents-status-panel__scrollbar agent-gui-node__mention-palette-scrollbar\",\n scrollbarThumb: \"workspace-agents-status-panel__scrollbar-thumb\",\n hint: \"agent-gui-node__mention-palette-hint\",\n hintItem: \"agent-gui-node__mention-palette-hint-item\",\n hintButton: \"agent-gui-node__mention-palette-hint-button\",\n hintSeparator: \"agent-gui-node__mention-palette-hint-separator\",\n shortcut: \"agent-gui-node__mention-palette-shortcut\",\n shortcutArrow: \"agent-gui-node__mention-palette-shortcut--arrow\",\n shortcutButton: \"agent-gui-node__mention-palette-shortcut-button\",\n shortcutGroup: \"agent-gui-node__mention-palette-shortcut-group\"\n },\n testIds: {\n emptyState: \"agent-gui-mention-palette-empty-state\",\n hint: \"agent-gui-mention-palette-hint\",\n scrollbar: \"agent-gui-mention-palette-scrollbar\",\n loadingSpinner: \"agent-mention-loading-spinner\"\n },\n groupDividerAttribute: \"data-agent-mention-group-divider\"\n};\n\n/**\n * The agent composer's existing structural row class names. Passing these to\n * {@link renderMentionRow} keeps the rendered DOM byte-identical to the\n * pre-refactor markup (the agent stylesheet `agentactivity.css` owns these\n * rules and the agent spec greps them), while the shared component defaults to\n * package-owned `rich-text-at-mention-*` names for other surfaces.\n */\nconst AGENT_MENTION_ROW_CLASS_NAMES: MentionRowClassNames = {\n fileIcon: \"agent-gui-node__mention-file-icon\",\n fileThumb: \"agent-gui-node__mention-file-thumb\",\n kindIcon: \"tsh-agent-object-token__kind-icon\",\n avatarImgUserPlaceholder:\n \"workspace-agents-status-panel__avatar-img--user-placeholder\"\n};\n\n/**\n * Stable per-item key suffix. The shared shell composes the full entry key as\n * `${group.id}:${agentMentionItemKey(item)}`, matching the agent's historical\n * `${group.id}:${item.kind}:${...}` format so highlight keys stay compatible.\n */\nexport function agentMentionItemKey(item: AgentContextMentionItem): string {\n return `${item.kind}:${\n item.kind === \"file\" ? agentGeneratedMentionItemKey(item) : item.targetId\n }`;\n}\n\nexport function flattenAgentMentionPaletteEntries(\n state: AgentMentionSearchState\n): AgentMentionPaletteEntry[] {\n return flattenMentionPaletteEntries(state, (item) =>\n agentMentionItemKey(item)\n ).map((entry: MentionPaletteEntry): AgentMentionPaletteEntry => {\n if (entry.type === \"item\") {\n const item =\n entry.groupId !== undefined && entry.itemIndex !== undefined\n ? state.groups.find((group) => group.id === entry.groupId)?.items[\n entry.itemIndex\n ]\n : undefined;\n return {\n key: entry.key,\n type: \"item\",\n groupId: entry.groupId as AgentMentionGroupId | undefined,\n item\n };\n }\n return {\n key: entry.key,\n type: entry.type,\n categoryId: entry.categoryId as AgentMentionFilterId | undefined,\n groupId: entry.groupId as AgentMentionGroupId | undefined\n };\n });\n}\n\nexport function groupStartKeys(state: AgentMentionSearchState): string[] {\n if (state.mode === \"browse\") {\n return state.categories.map((category) => `category:${category.id}`);\n }\n return state.groups\n .map((group) => {\n const firstItem = group.items[0];\n if (firstItem) {\n return `${group.id}:${agentMentionItemKey(firstItem)}`;\n }\n if (group.hasMore) {\n return `expand:${group.id}`;\n }\n return null;\n })\n .filter((key): key is string => key !== null);\n}\n\nexport function AgentFileMentionPalette({\n state,\n highlightedKey,\n label,\n loadingLabel,\n emptyLabel,\n errorLabel,\n tabHintLabel,\n maxHeightPx,\n shouldCenterHighlightedItem = false,\n onHighlightChange,\n onSelectItem,\n onSelectCategory,\n onSelectFilter,\n onExpandGroup,\n onNavigateHierarchy,\n onNavigateIntoItem,\n onOpenReferences\n}: AgentFileMentionPaletteProps): React.JSX.Element {\n \"use memo\";\n const openReferencesLabel = translate(\n \"agentHost.agentGui.mentionOpenReferences\"\n );\n const navigateIntoLabel = translate(\n \"agentHost.agentGui.fileMentionEnterFolder\"\n );\n const filter = state.filter as AgentMentionFilterId;\n const highlightedBrowseCategory = highlightedKey?.startsWith(\"category:\")\n ? highlightedKey.slice(\"category:\".length)\n : null;\n const showBrowseHint = shouldShowBrowseSearchHint({\n browseFilter: filter,\n groups: state.groups,\n highlightedBrowseCategory,\n mode: state.mode\n });\n\n // Browse mode carries its own category list (with labels); results mode tabs\n // are the fixed agent filter order. The shared shell renders a single tab\n // source, so resolve the right one here.\n const categories =\n state.mode === \"browse\"\n ? state.categories\n : AGENT_MENTION_FILTER_TAB_ORDER.map((id) => ({\n id,\n label: agentMentionFilterLabel(id)\n }));\n\n // When the agent wants the single keyboard browse hint we hand the shell an\n // empty group list so it renders its (keyboard-icon) empty state with our\n // computed hint copy. Otherwise we map the real groups, decorating each with\n // the agent-specific label / empty / expand / spacing chrome.\n const shellState: MentionPaletteState<AgentContextMentionItem> =\n showBrowseHint\n ? { ...state, categories, groups: [] }\n : {\n ...state,\n categories,\n groups: state.groups.map((group, index) =>\n decorateMentionGroup(\n group,\n index,\n state.groups,\n filter,\n state.query\n )\n )\n };\n\n const emptyLabelForShell = showBrowseHint\n ? browseHintForFilter(filter)\n : resolveMentionPaletteEmptyLabel({\n emptyLabel,\n filter,\n mode: state.mode,\n query: state.query\n });\n\n return (\n <MentionPaletteFromState<AgentContextMentionItem>\n state={shellState}\n highlightedKey={highlightedKey}\n getItemKey={agentMentionItemKey}\n renderItem={(item, { group }) =>\n renderMentionRow(agentMentionItemToRowItem(item), {\n classNames: AGENT_MENTION_ROW_CLASS_NAMES,\n dataAttributeMode: \"agent\",\n ...(onNavigateIntoItem && canNavigateIntoMentionItem(item, group)\n ? {\n onNavigateInto: () => onNavigateIntoItem(item),\n navigateIntoLabel\n }\n : {}),\n ...(onOpenReferences && isReferenceableMentionItem(item)\n ? {\n onOpenReferences: () => onOpenReferences(item),\n openReferencesLabel\n }\n : {})\n })\n }\n labels={{\n loading: loadingLabel,\n empty: emptyLabelForShell,\n error: errorLabel,\n tabHint: tabHintLabel,\n listbox: label\n }}\n hintLabels={{\n cycleFilter: translate(\"agentHost.agentGui.fileMentionSwitchCategory\"),\n moveSelection: translate(\n \"agentHost.agentGui.fileMentionSwitchSelection\"\n ),\n navigateHierarchy: translate(\n \"agentHost.agentGui.fileMentionNavigateHierarchy\"\n )\n }}\n maxHeightPx={maxHeightPx}\n scrollHighlightedIntoViewCentered={shouldCenterHighlightedItem}\n theme={AGENT_MENTION_PALETTE_THEME}\n callbacks={{\n onHighlightChange,\n onActiveCategoryIdChange: (categoryId) => {\n onSelectCategory(categoryId as AgentMentionBrowseCategory[\"id\"]);\n onSelectFilter(categoryId as AgentMentionFilterId);\n },\n onExpandGroup: (groupId) =>\n onExpandGroup(groupId as AgentMentionGroupId),\n onSelectItem\n }}\n onNavigateHierarchy={onNavigateHierarchy}\n />\n );\n}\n\nexport const AgentContextMentionPalette = AgentFileMentionPalette;\nexport type AgentContextMentionPaletteProps = AgentFileMentionPaletteProps;\n\n/**\n * Map a controller group onto the shared shell group, layering in the\n * agent-specific chrome the generic shell intentionally omits: translated\n * group / empty / expand labels, file-search chrome suppression, and the extra\n * top margin between the \"my sessions\" and \"collab sessions\" groups.\n */\nfunction decorateMentionGroup(\n group: AgentMentionGroup,\n index: number,\n groups: ReadonlyArray<AgentMentionGroup>,\n filter: AgentMentionFilterId,\n query: string\n): AgentMentionGroup {\n const groupId = group.id as AgentMentionGroupId;\n const suppressChrome = shouldSuppressFileSearchGroupChrome(filter, query);\n const followsMySessions =\n groupId === \"collab_sessions\" &&\n (groups[index - 1]?.id as AgentMentionGroupId) === \"my_sessions\";\n const showLabel = shouldRenderMentionGroupLabel({\n filter,\n groupCount: groups.length,\n groupId,\n query\n });\n return {\n ...group,\n label: showLabel ? agentMentionGroupLabel(groupId) : undefined,\n emptyLabel: suppressChrome\n ? undefined\n : agentMentionEmptyGroupLabel(groupId, query),\n expandLabel: group.hasMore\n ? translate(\"agentHost.agentGui.contextPickerExpandMore\", {\n count: mentionGroupExpandCount(group, filter)\n })\n : undefined,\n sectionClassName: followsMySessions ? \"mt-2\" : undefined,\n hideTopDivider: suppressChrome\n };\n}\n\nfunction shouldSuppressFileSearchGroupChrome(\n filter: AgentMentionFilterId,\n query: string\n): boolean {\n return filter === \"file\" && query.trim().length > 0;\n}\n\nfunction resolveMentionPaletteEmptyLabel(input: {\n emptyLabel: string;\n filter: AgentMentionFilterId;\n mode: AgentMentionSearchState[\"mode\"];\n query: string;\n}): string {\n if (\n input.mode === \"results\" &&\n input.filter === \"file\" &&\n input.query.trim().length > 0\n ) {\n return translate(\"agentHost.agentGui.mentionNoMatchingFiles\");\n }\n if (input.filter === \"session\") {\n return agentMentionEmptyGroupLabel(\"my_sessions\", input.query);\n }\n if (input.filter === \"app\") {\n return agentMentionEmptyGroupLabel(\"apps\", input.query);\n }\n if (input.filter === \"agent\") {\n return agentMentionEmptyGroupLabel(\"agents\", input.query);\n }\n if (input.filter === \"issue\") {\n return agentMentionEmptyGroupLabel(\"issues\", input.query);\n }\n return input.emptyLabel;\n}\n\nfunction shouldRenderMentionGroupLabel(input: {\n filter: AgentMentionFilterId;\n groupCount: number;\n groupId: AgentMentionGroupId;\n query: string;\n}): boolean {\n if (shouldSuppressFileSearchGroupChrome(input.filter, input.query)) {\n return false;\n }\n if (input.groupCount !== 1) {\n return true;\n }\n return (\n agentMentionGroupLabel(input.groupId) !==\n agentMentionFilterLabel(input.filter)\n );\n}\n\n/**\n * Resolve an agent mention item into the shared, display-ready\n * {@link MentionRowItem} view-model the generic {@link renderMentionRow}\n * consumes. All agent-specific bits — i18n via {@link translate}, the user\n * avatar placeholder asset, the managed-agent rounded icon, and the activity /\n * issue status labels — are resolved here so the shared renderer stays pure.\n */\nfunction agentMentionItemToRowItem(\n item: AgentContextMentionItem\n): MentionRowItem {\n if (item.kind === \"file\") {\n const visualKind = resolveAgentMentionFileVisualKind({\n entryKind: item.entryKind,\n href: item.href,\n mentionNavigation: item.mentionNavigation,\n name: item.name,\n path: item.path\n });\n const childCountLabel =\n item.mentionNavigation === \"agent-generated-folder\" &&\n typeof item.childCount === \"number\" &&\n item.childCount > 0\n ? translate(\"agentHost.agentGui.mentionAgentGeneratedFolderFileCount\", {\n count: item.childCount\n })\n : null;\n return {\n kind: \"file\",\n name: item.name,\n visualKind,\n thumbnailUrl: resolveAgentMentionFileThumbnailUrl(item) ?? null,\n childCountLabel,\n entryKind: item.entryKind,\n mentionNavigation: item.mentionNavigation\n };\n }\n\n if (item.kind === \"session\") {\n const isMySession = item.scope === \"my_sessions\";\n return {\n kind: \"session\",\n participant: isMySession\n ? item.agentName\n : `${item.initiatorName} & ${item.agentName}`,\n summary: item.title,\n userAvatarUrl: isMySession ? null : (item.initiatorAvatarUrl ?? null),\n userAvatarPlaceholderUrl,\n agentIconUrl: managedAgentRoundedIconUrl(\n mentionSessionAgentProvider(item) ?? item.agentName\n ),\n showUserAvatar: !isMySession,\n statusTag: agentSessionStatusTag(item.status)\n };\n }\n\n if (item.kind === \"workspace-app\") {\n return {\n kind: \"app\",\n name: item.name,\n description: item.description ?? null,\n iconUrl: item.iconUrl ?? null\n };\n }\n\n if (item.kind === \"agent-target\") {\n return {\n kind: \"app\",\n name: item.name,\n description: item.description ?? null,\n iconUrl: item.iconUrl ?? managedAgentRoundedIconUrl(item.agentProviderId),\n statusTag: agentTargetAvailableStatusTag()\n };\n }\n\n if (item.kind === \"workspace-reference\") {\n return {\n kind: \"app\",\n name: item.name,\n description: null,\n iconUrl: item.iconUrl ?? null\n };\n }\n\n if (item.kind === \"workspace-app-factory\") {\n return {\n kind: \"app-factory\",\n name: item.name\n };\n }\n\n if (item.kind === \"custom\") {\n // 自定义 mention 只经 draftPrompt prefill 进入 composer,不出现在 @ 面板候选;\n // 兜底按通用条目展示(label 即注册方给的 name)。\n return {\n kind: \"issue\",\n title: item.name,\n creatorName: null,\n statusTag: null\n };\n }\n\n return {\n kind: \"issue\",\n title: item.title,\n creatorName: item.creatorName ?? null,\n statusTag: agentIssueStatusTag(item.status)\n };\n}\n\n/**\n * 仅 workspace-issue 行,以及声明了能够提供产物文件(reference)的 workspace-app 行,\n * 才在行末尾展示「查看产物」入口。应用是否能提供产物文件由其 manifest 的\n * references 能力决定(`referencesListSupported`),而非硬编码应用名单。\n */\nfunction isReferenceableMentionItem(item: AgentContextMentionItem): boolean {\n if (item.kind === \"workspace-issue\") {\n return true;\n }\n if (item.kind === \"workspace-app\") {\n return item.referencesListSupported === true;\n }\n return false;\n}\n\nfunction canNavigateIntoMentionItem(\n item: AgentContextMentionItem,\n group: AgentMentionGroup\n): boolean {\n return (\n group.id === \"agent_generated_files\" &&\n item.kind === \"file\" &&\n item.mentionNavigation === \"agent-generated-folder\"\n );\n}\n\nfunction mentionSessionAgentProvider(\n item: Extract<AgentContextMentionItem, { kind: \"session\" }>\n): string | null {\n const queryStart = item.href.indexOf(\"?\");\n if (queryStart < 0) {\n return null;\n }\n return new URLSearchParams(item.href.slice(queryStart + 1)).get(\"provider\");\n}\n\nfunction agentSessionStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n const activityStatus = normalizeAgentActivityDisplayStatus(status);\n return {\n label: workspaceAgentActivityStatusLabel(activityStatus),\n tone: mentionStatusTone(activityStatus),\n pulse: activityStatus === \"working\" || activityStatus === \"waiting\",\n variant: \"activity\",\n dataStatus: activityStatus\n };\n}\n\n/**\n * Agent targets are only surfaced when the provider is ready/available, so the\n * `@` row always shows a green \"Available\" badge at its trailing edge.\n */\nfunction agentTargetAvailableStatusTag(): MentionRowStatusTag {\n return {\n label: translate(\"agentHost.agentGui.mentionAgentTargetAvailable\"),\n tone: \"green\",\n variant: \"activity\",\n dataStatus: \"available\"\n };\n}\n\nfunction agentIssueStatusTag(\n status: string | undefined\n): MentionRowStatusTag | null {\n if (!status) {\n return null;\n }\n const presentation = resolveIssueManagerStatusPresentation(status);\n return {\n label: roomIssueStatusLabel(status),\n tone: presentation.mentionTone,\n variant: \"issue\",\n dataStatus: presentation.dataStatus\n };\n}\n\nfunction mentionStatusTone(\n status: AgentActivityDisplayStatus\n): MentionRowStatusTone {\n if (status === \"working\") {\n return \"blue\";\n }\n if (status === \"waiting\" || status === \"canceled\") {\n return \"amber\";\n }\n if (status === \"completed\" || status === \"idle\") {\n return \"green\";\n }\n if (status === \"failed\") {\n return \"red\";\n }\n return \"neutral\";\n}\n\nfunction browseHintForFilter(filter: AgentMentionFilterId): string {\n switch (filter) {\n case \"agent\":\n return translate(\"agentHost.agentGui.contextPickerBrowseAgentHint\");\n case \"app\":\n return translate(\"agentHost.agentGui.contextPickerBrowseAppHint\");\n case \"file\":\n return translate(\"agentHost.agentGui.contextPickerBrowseFileHint\");\n case \"session\":\n return translate(\"agentHost.agentGui.contextPickerBrowseSessionHint\");\n case \"issue\":\n return translate(\"agentHost.agentGui.contextPickerBrowseIssueHint\");\n }\n}\n\nfunction hasInteractiveGroupEntries(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n return groups.some((group) => group.items.length > 0 || group.hasMore);\n}\n\nfunction isFileBrowseGroupsOnlyEmpty(\n groups: ReadonlyArray<AgentMentionGroup>\n): boolean {\n const fileGroups = groups.filter(\n (group) =>\n group.id === \"opened_files\" || group.id === \"agent_generated_files\"\n );\n if (fileGroups.length === 0) {\n return false;\n }\n return fileGroups.every(\n (group) => group.items.length === 0 && !group.hasMore\n );\n}\n\nfunction shouldShowBrowseSearchHint(input: {\n browseFilter: AgentMentionFilterId;\n groups: ReadonlyArray<AgentMentionGroup>;\n highlightedBrowseCategory: string | null;\n mode: AgentMentionSearchState[\"mode\"];\n}): boolean {\n if (input.mode !== \"browse\" || hasInteractiveGroupEntries(input.groups)) {\n return false;\n }\n if (input.groups.length === 0) {\n return true;\n }\n if (\n input.highlightedBrowseCategory !== null &&\n input.highlightedBrowseCategory !== input.browseFilter\n ) {\n return true;\n }\n return (\n input.browseFilter === \"file\" && isFileBrowseGroupsOnlyEmpty(input.groups)\n );\n}\n","import { translate, type TranslateFn } from \"../i18n/index\";\n\nexport function roomIssueStatusLabel(status: string, t?: TranslateFn): string {\n const translateFn = t ?? translate;\n switch (status) {\n case \"not_started\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusNotStarted\");\n case \"running\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusRunning\");\n case \"in_progress\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusInProgress\");\n case \"pending_acceptance\":\n return translateFn(\n \"agentHost.roomIssueNode.issueStatusPendingAcceptance\"\n );\n case \"completed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCompleted\");\n case \"failed\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusFailed\");\n case \"canceled\":\n return translateFn(\"agentHost.roomIssueNode.issueStatusCanceled\");\n default:\n return (\n status || translateFn(\"agentHost.roomIssueNode.issueStatusUnknown\")\n );\n }\n}\n"],"mappings":"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","names":["createRichTextMentionHref","handle","AGENT_GENERATED_FILE_PROVIDER_ID","AGENT_SESSION_PROVIDER_ID","FILE_PROVIDER_ID","WORKSPACE_APP_PROVIDER_ID","WORKSPACE_ISSUE_PROVIDER_ID","createRichTextMentionHref"]}