@tutti-os/agent-gui 0.0.125 → 0.0.126

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 (56) hide show
  1. package/dist/{AgentGUI-DMtA0gbf.d.ts → AgentGUI-CKk3WQrn.d.ts} +1 -1
  2. package/dist/{AgentRichTextReadonly-G5D73743.js → AgentRichTextReadonly-KOUZGF5Q.js} +5 -5
  3. package/dist/agent-conversation/index.js +7 -7
  4. package/dist/agent-gui.d.ts +2 -2
  5. package/dist/agent-gui.js +15 -15
  6. package/dist/agent-message-center/index.js +6 -6
  7. package/dist/{agentFileMentionContracts-DY4Z70CN.d.ts → agentFileMentionContracts-CWAeuL7S.d.ts} +1 -1
  8. package/dist/{chunk-OKGXHKJ2.js → chunk-2JFMGOHU.js} +2 -2
  9. package/dist/{chunk-KACVD2GZ.js → chunk-2ZVXN2Z7.js} +5 -5
  10. package/dist/chunk-2ZVXN2Z7.js.map +1 -0
  11. package/dist/{chunk-XXACYFIR.js → chunk-4CACBXIB.js} +2 -2
  12. package/dist/{chunk-ZCNZ53CF.js → chunk-6RMVLH3G.js} +2 -2
  13. package/dist/{chunk-UNCXTPFX.js → chunk-ADQENNSG.js} +3 -3
  14. package/dist/{chunk-A2B6QKNF.js → chunk-BDWZUA3L.js} +10 -9
  15. package/dist/chunk-BDWZUA3L.js.map +1 -0
  16. package/dist/{chunk-ARDFK5NC.js → chunk-CO6XO5A2.js} +5 -5
  17. package/dist/{chunk-24TBYDXC.js → chunk-F2Z7P7BB.js} +4 -4
  18. package/dist/{chunk-WIQHLQFN.js → chunk-G3XB4FAQ.js} +3 -3
  19. package/dist/{chunk-XJ2U66WG.js → chunk-PRE4IT6E.js} +170 -18
  20. package/dist/chunk-PRE4IT6E.js.map +1 -0
  21. package/dist/{chunk-KRG7EBHG.js → chunk-QDNOOAAS.js} +2 -2
  22. package/dist/{chunk-HLXQ7BUI.js → chunk-QWKJ646Z.js} +17 -17
  23. package/dist/{chunk-HLXQ7BUI.js.map → chunk-QWKJ646Z.js.map} +1 -1
  24. package/dist/{chunk-5O42C33J.js → chunk-RB6ZYQBA.js} +2 -2
  25. package/dist/{chunk-JM24HADP.js → chunk-RMQREVJY.js} +1 -1
  26. package/dist/chunk-RMQREVJY.js.map +1 -0
  27. package/dist/{chunk-RN7DI3Y2.js → chunk-X22KJXVG.js} +2 -2
  28. package/dist/context-mention-palette/index.d.ts +1 -1
  29. package/dist/context-mention-palette/index.js +8 -8
  30. package/dist/context-mention-provider.d.ts +15 -2
  31. package/dist/context-mention-provider.js +1 -1
  32. package/dist/i18n/index.d.ts +4 -4
  33. package/dist/i18n/index.js +2 -2
  34. package/dist/index.d.ts +3 -3
  35. package/dist/index.js +15 -15
  36. package/dist/mention-search.d.ts +8 -3
  37. package/dist/mention-search.js +6 -6
  38. package/dist/workbench/contribution.js +3 -3
  39. package/dist/workbench/index.js +3 -3
  40. package/dist/workbench/sessionTitle.js +2 -2
  41. package/package.json +12 -12
  42. package/dist/chunk-A2B6QKNF.js.map +0 -1
  43. package/dist/chunk-JM24HADP.js.map +0 -1
  44. package/dist/chunk-KACVD2GZ.js.map +0 -1
  45. package/dist/chunk-XJ2U66WG.js.map +0 -1
  46. /package/dist/{AgentRichTextReadonly-G5D73743.js.map → AgentRichTextReadonly-KOUZGF5Q.js.map} +0 -0
  47. /package/dist/{chunk-OKGXHKJ2.js.map → chunk-2JFMGOHU.js.map} +0 -0
  48. /package/dist/{chunk-XXACYFIR.js.map → chunk-4CACBXIB.js.map} +0 -0
  49. /package/dist/{chunk-ZCNZ53CF.js.map → chunk-6RMVLH3G.js.map} +0 -0
  50. /package/dist/{chunk-UNCXTPFX.js.map → chunk-ADQENNSG.js.map} +0 -0
  51. /package/dist/{chunk-ARDFK5NC.js.map → chunk-CO6XO5A2.js.map} +0 -0
  52. /package/dist/{chunk-24TBYDXC.js.map → chunk-F2Z7P7BB.js.map} +0 -0
  53. /package/dist/{chunk-WIQHLQFN.js.map → chunk-G3XB4FAQ.js.map} +0 -0
  54. /package/dist/{chunk-KRG7EBHG.js.map → chunk-QDNOOAAS.js.map} +0 -0
  55. /package/dist/{chunk-5O42C33J.js.map → chunk-RB6ZYQBA.js.map} +0 -0
  56. /package/dist/{chunk-RN7DI3Y2.js.map → chunk-X22KJXVG.js.map} +0 -0
@@ -6,7 +6,7 @@ import {
6
6
  setCurrentAgentGuiI18nRuntime,
7
7
  translate,
8
8
  translateInUiLanguage
9
- } from "./chunk-KACVD2GZ.js";
9
+ } from "./chunk-2ZVXN2Z7.js";
10
10
 
11
11
  // i18n/index.ts
12
12
  import React, {
@@ -68,4 +68,4 @@ export {
68
68
  AgentGuiI18nProvider,
69
69
  useTranslation
70
70
  };
71
- //# sourceMappingURL=chunk-ZCNZ53CF.js.map
71
+ //# sourceMappingURL=chunk-6RMVLH3G.js.map
@@ -6,14 +6,14 @@ import {
6
6
  import {
7
7
  getOptionalAgentHostApi,
8
8
  useOptionalAgentHostApi
9
- } from "./chunk-OKGXHKJ2.js";
9
+ } from "./chunk-2JFMGOHU.js";
10
10
  import {
11
11
  managedAgentRoundedIconUrl
12
12
  } from "./chunk-EDNJMG5T.js";
13
13
  import {
14
14
  translate,
15
15
  useTranslation
16
- } from "./chunk-ZCNZ53CF.js";
16
+ } from "./chunk-6RMVLH3G.js";
17
17
  import {
18
18
  resolveAgentWorkspaceFileVisualKind
19
19
  } from "./chunk-PJP5BUU6.js";
@@ -3729,4 +3729,4 @@ export {
3729
3729
  AgentMessageMarkdown,
3730
3730
  CustomScrollArea
3731
3731
  };
3732
- //# sourceMappingURL=chunk-UNCXTPFX.js.map
3732
+ //# sourceMappingURL=chunk-ADQENNSG.js.map
@@ -5,7 +5,7 @@ import {
5
5
  agentMentionFilterLabel,
6
6
  agentMentionGroupLabel,
7
7
  mentionGroupExpandCount
8
- } from "./chunk-XJ2U66WG.js";
8
+ } from "./chunk-PRE4IT6E.js";
9
9
  import {
10
10
  resolveAgentMentionFileThumbnailUrl,
11
11
  resolveAgentMentionFileVisualKind
@@ -13,13 +13,13 @@ import {
13
13
  import {
14
14
  userAvatarPlaceholderUrl,
15
15
  workspaceAgentActivityStatusLabel
16
- } from "./chunk-XXACYFIR.js";
16
+ } from "./chunk-4CACBXIB.js";
17
17
  import {
18
18
  managedAgentRoundedIconUrl
19
19
  } from "./chunk-EDNJMG5T.js";
20
20
  import {
21
21
  translate
22
- } from "./chunk-ZCNZ53CF.js";
22
+ } from "./chunk-6RMVLH3G.js";
23
23
 
24
24
  // agent-gui/agentGuiNode/AgentFileMentionPalette.tsx
25
25
  import {
@@ -202,10 +202,10 @@ function AgentFileMentionPalette({
202
202
  highlightedKey,
203
203
  getItemKey: agentMentionItemKey,
204
204
  isItemDisabled: isAgentMentionItemDisabled,
205
- renderItem: (item, { group }) => renderMentionRow(agentMentionItemToRowItem(item), {
205
+ renderItem: (item) => renderMentionRow(agentMentionItemToRowItem(item), {
206
206
  classNames: AGENT_MENTION_ROW_CLASS_NAMES,
207
207
  dataAttributeMode: "agent",
208
- ...onNavigateIntoItem && canNavigateIntoMentionItem(item, group) ? {
208
+ ...onNavigateIntoItem && canNavigateIntoMentionItem(item) ? {
209
209
  onNavigateInto: () => onNavigateIntoItem(item),
210
210
  navigateIntoLabel
211
211
  } : {},
@@ -319,7 +319,8 @@ function agentMentionItemToRowItem(item) {
319
319
  name: item.name,
320
320
  path: item.path
321
321
  });
322
- const childCountLabel = item.mentionNavigation === "agent-generated-folder" && typeof item.childCount === "number" && item.childCount > 0 ? translate("agentHost.agentGui.mentionAgentGeneratedFolderFileCount", {
322
+ const isNavigableFolder = item.mentionNavigation === "agent-generated-folder" || item.mentionNavigation === "workspace-folder";
323
+ const childCountLabel = isNavigableFolder && typeof item.childCount === "number" ? translate("agentHost.agentGui.mentionFolderChildCount", {
323
324
  count: item.childCount
324
325
  }) : null;
325
326
  return {
@@ -406,8 +407,8 @@ function isReferenceableMentionItem(item) {
406
407
  }
407
408
  return false;
408
409
  }
409
- function canNavigateIntoMentionItem(item, group) {
410
- return group.id === "agent_generated_files" && item.kind === "file" && item.mentionNavigation === "agent-generated-folder";
410
+ function canNavigateIntoMentionItem(item) {
411
+ return item.kind === "file" && (item.mentionNavigation === "agent-generated-folder" || item.mentionNavigation === "workspace-folder");
411
412
  }
412
413
  function mentionSessionAgentProvider(item) {
413
414
  const queryStart = item.href.indexOf("?");
@@ -516,4 +517,4 @@ export {
516
517
  AgentFileMentionPalette,
517
518
  AgentContextMentionPalette
518
519
  };
519
- //# sourceMappingURL=chunk-A2B6QKNF.js.map
520
+ //# sourceMappingURL=chunk-BDWZUA3L.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../agent-gui/agentGuiNode/AgentFileMentionPalette.tsx","../shared/roomIssueStatusLabel.ts"],"sourcesContent":["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\";\nimport type { ReactNode } from \"react\";\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 /** Controlled provenance filter supplied by the AgentGUI orchestration layer. */\n provenanceFilterControl?: ReactNode;\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 isAgentMentionItemDisabled(\n item: AgentContextMentionItem\n): boolean {\n return (\n item.kind === \"agent-target\" &&\n item.availabilityStatus !== undefined &&\n item.availabilityStatus !== \"ready\" &&\n item.availabilityStatus !== \"available\"\n );\n}\n\nexport function flattenAgentMentionPaletteEntries(\n state: AgentMentionSearchState\n): AgentMentionPaletteEntry[] {\n return flattenMentionPaletteEntries(\n state,\n (item) => agentMentionItemKey(item),\n isAgentMentionItemDisabled\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.find(\n (item) => !isAgentMentionItemDisabled(item)\n );\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 provenanceFilterControl\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 isItemDisabled={isAgentMentionItemDisabled}\n renderItem={(item) =>\n renderMentionRow(agentMentionItemToRowItem(item), {\n classNames: AGENT_MENTION_ROW_CLASS_NAMES,\n dataAttributeMode: \"agent\",\n ...(onNavigateIntoItem && canNavigateIntoMentionItem(item)\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 headerActions={\n filter === \"session\" || filter === \"file\" || filter === \"issue\"\n ? provenanceFilterControl\n : undefined\n }\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 groupLabel: group.label,\n query\n });\n const groupLabel = group.label ?? agentMentionGroupLabel(groupId);\n return {\n ...group,\n label: showLabel ? groupLabel : undefined,\n emptyLabel: suppressChrome\n ? undefined\n : (group.emptyLabel ?? agentMentionEmptyGroupLabel(groupId, query)),\n expandLabel: group.hasMore\n ? translate(\"agentHost.agentGui.contextPickerExpandMore\", {\n count: mentionGroupExpandCount(group, filter)\n })\n : undefined,\n expandLoadingLabel: translate(\n \"agentHost.agentGui.contextPickerLoadMoreLoading\"\n ),\n expandErrorLabel: translate(\n \"agentHost.agentGui.contextPickerLoadMoreRetry\"\n ),\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 groupLabel?: string;\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 if (input.groupId.startsWith(\"agent:\")) {\n return true;\n }\n return (\n (input.groupLabel ?? 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 isNavigableFolder =\n item.mentionNavigation === \"agent-generated-folder\" ||\n item.mentionNavigation === \"workspace-folder\";\n const childCountLabel =\n isNavigableFolder && typeof item.childCount === \"number\"\n ? translate(\"agentHost.agentGui.mentionFolderChildCount\", {\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:\n item.agentIconUrl?.trim() ||\n 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: mentionDescriptionWithoutTerminalPeriod(item.description),\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: mentionDescriptionWithoutTerminalPeriod(item.description),\n iconUrl: item.iconUrl ?? managedAgentRoundedIconUrl(item.agentProviderId),\n statusTag: agentTargetAvailabilityStatusTag(item.availabilityStatus)\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\nfunction mentionDescriptionWithoutTerminalPeriod(\n description: string | null | undefined\n): string | null {\n const normalizedDescription = description?.trimEnd();\n return normalizedDescription\n ? normalizedDescription.replace(/[。.]+$/u, \"\")\n : null;\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(item: AgentContextMentionItem): boolean {\n return (\n item.kind === \"file\" &&\n (item.mentionNavigation === \"agent-generated-folder\" ||\n item.mentionNavigation === \"workspace-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 * Shared agent targets remain discoverable while their owner is offline. Their\n * availability badge communicates whether the target can currently be invoked.\n */\nfunction agentTargetAvailabilityStatusTag(\n availabilityStatus: string | undefined\n): MentionRowStatusTag {\n const available =\n availabilityStatus === undefined ||\n availabilityStatus === \"ready\" ||\n availabilityStatus === \"available\";\n return {\n label: translate(\n available\n ? \"agentHost.agentGui.mentionAgentTargetAvailable\"\n : \"agentHost.agentGui.mentionAgentTargetUnavailable\"\n ),\n tone: available ? \"green\" : \"neutral\",\n variant: \"activity\",\n dataStatus: available ? \"available\" : \"unavailable\"\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":[]}
@@ -2,7 +2,7 @@ import {
2
2
  AgentRichTextReadonly,
3
3
  promptForProviderSkills,
4
4
  skillTriggerForPrefix
5
- } from "./chunk-5O42C33J.js";
5
+ } from "./chunk-RB6ZYQBA.js";
6
6
  import {
7
7
  classifyRecoverableAgentMessage,
8
8
  isProviderPlanLimitMessage,
@@ -38,7 +38,7 @@ import {
38
38
  resolveWorkspaceFileLinkAction,
39
39
  resolveWorkspaceFilePathCandidate,
40
40
  resolveWorkspaceLinkAction
41
- } from "./chunk-UNCXTPFX.js";
41
+ } from "./chunk-ADQENNSG.js";
42
42
  import {
43
43
  cn
44
44
  } from "./chunk-KPMQGPYU.js";
@@ -46,7 +46,7 @@ import {
46
46
  useOptionalAgentActivityRuntime,
47
47
  useOptionalAgentHostApi,
48
48
  workspaceAgentProviderLabel
49
- } from "./chunk-OKGXHKJ2.js";
49
+ } from "./chunk-2JFMGOHU.js";
50
50
  import {
51
51
  fileChangeCountFromChanges,
52
52
  fileChangeEntriesFromChanges,
@@ -56,7 +56,7 @@ import {
56
56
  getActiveUiLanguage,
57
57
  translate,
58
58
  useTranslation
59
- } from "./chunk-ZCNZ53CF.js";
59
+ } from "./chunk-6RMVLH3G.js";
60
60
  import {
61
61
  normalizeAgentTitleText
62
62
  } from "./chunk-MIJXEELH.js";
@@ -14224,4 +14224,4 @@ export {
14224
14224
  AgentConversationFlow,
14225
14225
  useProjectedAgentConversation
14226
14226
  };
14227
- //# sourceMappingURL=chunk-ARDFK5NC.js.map
14227
+ //# sourceMappingURL=chunk-CO6XO5A2.js.map
@@ -2,17 +2,17 @@ import {
2
2
  AgentGUIConversation_styles_default,
3
3
  MessageSquareMoreIcon,
4
4
  extractAgentMcpToolTarget
5
- } from "./chunk-UNCXTPFX.js";
5
+ } from "./chunk-ADQENNSG.js";
6
6
  import {
7
7
  getOptionalAgentHostApi,
8
8
  useOptionalAgentHostApi
9
- } from "./chunk-OKGXHKJ2.js";
9
+ } from "./chunk-2JFMGOHU.js";
10
10
  import {
11
11
  fileChangePathsFromChanges
12
12
  } from "./chunk-F5UR6EJG.js";
13
13
  import {
14
14
  translate
15
- } from "./chunk-ZCNZ53CF.js";
15
+ } from "./chunk-6RMVLH3G.js";
16
16
 
17
17
  // shared/agentConversation/planImplementationPresentation.ts
18
18
  var PLAN_IMPLEMENTATION_PROMPT = "Implement the plan.";
@@ -1471,4 +1471,4 @@ export {
1471
1471
  isPromptRequestIdTitle,
1472
1472
  AgentInteractivePromptSurface
1473
1473
  };
1474
- //# sourceMappingURL=chunk-24TBYDXC.js.map
1474
+ //# sourceMappingURL=chunk-F2Z7P7BB.js.map
@@ -9,7 +9,7 @@ import {
9
9
  resolveAgentGUIConversationTitleDisplayPrompt,
10
10
  resolveAgentGuiWorkbenchHeaderTitle,
11
11
  resolveAgentGuiWorkbenchSessionTitle
12
- } from "./chunk-RN7DI3Y2.js";
12
+ } from "./chunk-X22KJXVG.js";
13
13
  import {
14
14
  createAgentGuiWorkbenchNodeStateSource,
15
15
  migrateLegacyAgentGuiWorkbenchState,
@@ -276,7 +276,7 @@ function useAgentGuiWorkbenchBodyRenderError(nodeId) {
276
276
 
277
277
  // workbench/header.ts
278
278
  var LazyAgentRichTextReadonly = lazy(
279
- () => import("./AgentRichTextReadonly-G5D73743.js").then((module) => ({
279
+ () => import("./AgentRichTextReadonly-KOUZGF5Q.js").then((module) => ({
280
280
  default: module.AgentRichTextReadonly
281
281
  }))
282
282
  );
@@ -1482,4 +1482,4 @@ export {
1482
1482
  AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT,
1483
1483
  createAgentGuiWorkbenchContribution
1484
1484
  };
1485
- //# sourceMappingURL=chunk-WIQHLQFN.js.map
1485
+ //# sourceMappingURL=chunk-G3XB4FAQ.js.map
@@ -7,24 +7,24 @@ import {
7
7
  } from "./chunk-XJ34OIEQ.js";
8
8
  import {
9
9
  normalizeAgentSessionMentionTitle
10
- } from "./chunk-KRG7EBHG.js";
10
+ } from "./chunk-QDNOOAAS.js";
11
11
  import {
12
12
  resolveAgentMentionFileThumbnailUrl
13
13
  } from "./chunk-LUGELG5V.js";
14
14
  import {
15
15
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
16
- } from "./chunk-JM24HADP.js";
16
+ } from "./chunk-RMQREVJY.js";
17
17
  import {
18
18
  resolveWorkspaceAgentSessionSortTimeUnixMs
19
19
  } from "./chunk-YMXYBG7U.js";
20
20
  import {
21
21
  getOptionalAgentHostApi,
22
22
  workspaceAgentProviderLabel
23
- } from "./chunk-OKGXHKJ2.js";
23
+ } from "./chunk-2JFMGOHU.js";
24
24
  import {
25
25
  translate,
26
26
  translateInUiLanguage
27
- } from "./chunk-ZCNZ53CF.js";
27
+ } from "./chunk-6RMVLH3G.js";
28
28
  import {
29
29
  normalizeAgentTitleText
30
30
  } from "./chunk-MIJXEELH.js";
@@ -594,7 +594,7 @@ function createAgentGeneratedFolderBackItem(browsePath) {
594
594
  kind: "file",
595
595
  href: "",
596
596
  path: browsePath,
597
- name: translate("agentHost.agentGui.mentionAgentGeneratedFolderBack"),
597
+ name: translate("agentHost.agentGui.mentionFolderBack"),
598
598
  entryKind: "unknown",
599
599
  directoryPath: parentAgentGeneratedDirectoryPath(browsePath),
600
600
  mentionNavigation: "agent-generated-folder-back"
@@ -953,13 +953,22 @@ function providerItemToAgentMentionItem(input) {
953
953
  }
954
954
  if (input.insertResult.kind === "markdown-link") {
955
955
  const href = input.insertResult.href.trim();
956
+ const directoryPath = input.directory?.path.trim() ?? "";
956
957
  return {
957
958
  kind: "file",
958
959
  href,
959
- path: href,
960
+ path: directoryPath || href,
960
961
  name: label,
961
- entryKind: href.endsWith("/") ? "directory" : "unknown",
962
- directoryPath: dirnameFromProviderWorkspaceFileHref(href)
962
+ entryKind: directoryPath || href.endsWith("/") ? "directory" : "unknown",
963
+ directoryPath: dirnameFromProviderWorkspaceFileHref(
964
+ directoryPath || href
965
+ ),
966
+ ...directoryPath ? {
967
+ childCount: normalizeMentionDirectoryChildCount(
968
+ input.directory?.childCount
969
+ ),
970
+ mentionNavigation: "workspace-folder"
971
+ } : {}
963
972
  };
964
973
  }
965
974
  if (input.insertResult.kind !== "mention") {
@@ -974,6 +983,7 @@ function providerItemToAgentMentionItem(input) {
974
983
  const presentation = mention.presentation ?? {};
975
984
  const workspaceId = scope.workspaceId || input.workspaceId;
976
985
  if (input.providerId === FILE_PROVIDER_ID || input.providerId === AGENT_GENERATED_FILE_PROVIDER_ID) {
986
+ const directoryPath = input.directory?.path.trim() ?? "";
977
987
  return {
978
988
  kind: "file",
979
989
  href: createRichTextMentionHref2({
@@ -982,10 +992,18 @@ function providerItemToAgentMentionItem(input) {
982
992
  label,
983
993
  scope
984
994
  }),
985
- path: targetId,
995
+ path: directoryPath || targetId,
986
996
  name: label,
987
- entryKind: targetId.endsWith("/") ? "directory" : "unknown",
988
- directoryPath: dirnameFromProviderWorkspaceFileHref(targetId),
997
+ entryKind: directoryPath || targetId.endsWith("/") ? "directory" : "unknown",
998
+ directoryPath: dirnameFromProviderWorkspaceFileHref(
999
+ directoryPath || targetId
1000
+ ),
1001
+ ...directoryPath ? {
1002
+ childCount: normalizeMentionDirectoryChildCount(
1003
+ input.directory?.childCount
1004
+ ),
1005
+ mentionNavigation: "workspace-folder"
1006
+ } : {},
989
1007
  thumbnailUrl: presentation.thumbnailUrl?.trim() || void 0
990
1008
  };
991
1009
  }
@@ -1084,6 +1102,12 @@ function providerItemToAgentMentionItem(input) {
1084
1102
  }
1085
1103
  return null;
1086
1104
  }
1105
+ function normalizeMentionDirectoryChildCount(value) {
1106
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
1107
+ return void 0;
1108
+ }
1109
+ return Math.floor(value);
1110
+ }
1087
1111
  function normalizeMentionScope(scope) {
1088
1112
  return Object.fromEntries(
1089
1113
  Object.entries(scope ?? {}).map(([key, value]) => [key.trim(), value.trim()]).filter(([key, value]) => key.length > 0 && value.length > 0)
@@ -1633,7 +1657,7 @@ async function fetchAgentMentionFilterResult(input) {
1633
1657
  }
1634
1658
  }
1635
1659
  async function queryAgentMentionProviderItems(input) {
1636
- const items = await input.provider.query({
1660
+ const queryInput = {
1637
1661
  keyword: input.query,
1638
1662
  maxResults: input.limit,
1639
1663
  abortSignal: input.abortSignal,
@@ -1648,7 +1672,11 @@ async function queryAgentMentionProviderItems(input) {
1648
1672
  referenceProvenanceFilter: input.provenanceFilter ?? void 0
1649
1673
  }
1650
1674
  }
1651
- });
1675
+ };
1676
+ const items = input.directoryPath && input.provider.queryDirectory ? await input.provider.queryDirectory({
1677
+ ...queryInput,
1678
+ directoryPath: input.directoryPath
1679
+ }) : await input.provider.query(queryInput);
1652
1680
  if (input.abortSignal.aborted) {
1653
1681
  return [];
1654
1682
  }
@@ -1764,6 +1792,7 @@ async function mapProviderItemsToAgentMentionItems(input) {
1764
1792
  insertResult: input.provider.toInsertResult(item),
1765
1793
  label: input.provider.getItemLabel(item),
1766
1794
  providerId: input.provider.id,
1795
+ directory: input.provider.getItemDirectory?.(item) ?? null,
1767
1796
  subtitle: input.provider.getItemSubtitle?.(item) ?? "",
1768
1797
  workspaceId: input.workspaceId
1769
1798
  });
@@ -1838,6 +1867,7 @@ var AgentMentionSearchControllerBase = class {
1838
1867
  currentFileSearchLimit;
1839
1868
  currentIssueSearchLimit;
1840
1869
  agentGeneratedBrowsePath = null;
1870
+ workspaceFileBrowsePaths = [];
1841
1871
  rawGroups = emptyAgentMentionRawGroups();
1842
1872
  issueTopicGroups = null;
1843
1873
  state = {
@@ -2145,6 +2175,7 @@ var AgentMentionSearchControllerBase = class {
2145
2175
  provider,
2146
2176
  workspaceId: input.workspaceId,
2147
2177
  currentUserId: input.currentUserId,
2178
+ directoryPath: input.directoryPath,
2148
2179
  query: input.query,
2149
2180
  limit: input.limit,
2150
2181
  sectionKey: input.sectionKey ?? this.currentSectionKey,
@@ -2253,6 +2284,9 @@ var AgentMentionSearchControllerBase = class {
2253
2284
  resetAgentGeneratedBrowsePath() {
2254
2285
  this.agentGeneratedBrowsePath = null;
2255
2286
  }
2287
+ resetWorkspaceFileBrowsePaths() {
2288
+ this.workspaceFileBrowsePaths = [];
2289
+ }
2256
2290
  resetTotalCounts() {
2257
2291
  for (const groupId of [
2258
2292
  "files",
@@ -2341,6 +2375,32 @@ var AgentMentionSearchControllerBase = class {
2341
2375
 
2342
2376
  // agent-gui/agentGuiNode/AgentMentionSearchController.ts
2343
2377
  import { referenceProvenanceFilterCacheKey as referenceProvenanceFilterCacheKey2 } from "@tutti-os/workspace-file-reference/core";
2378
+
2379
+ // agent-gui/agentGuiNode/agentMentionWorkspaceFilesPresentation.ts
2380
+ function presentWorkspaceFileDirectoryMentionItems(input) {
2381
+ return [createWorkspaceFileFolderBackItem(input.browsePath), ...input.items];
2382
+ }
2383
+ function createWorkspaceFileFolderBackItem(browsePath) {
2384
+ return {
2385
+ kind: "file",
2386
+ href: "",
2387
+ path: browsePath,
2388
+ name: translate("agentHost.agentGui.mentionFolderBack"),
2389
+ entryKind: "unknown",
2390
+ directoryPath: parentWorkspaceFileDirectoryPath(browsePath),
2391
+ mentionNavigation: "workspace-folder-back"
2392
+ };
2393
+ }
2394
+ function parentWorkspaceFileDirectoryPath(path) {
2395
+ const normalized = path.trim().replace(/\\/g, "/").replace(/\/+$/, "");
2396
+ const index = normalized.lastIndexOf("/");
2397
+ if (index <= 0) {
2398
+ return "/";
2399
+ }
2400
+ return normalized.slice(0, index);
2401
+ }
2402
+
2403
+ // agent-gui/agentGuiNode/AgentMentionSearchController.ts
2344
2404
  var AgentMentionSearchController = class extends AgentMentionSearchControllerBase {
2345
2405
  issueLoadMoreRequests = /* @__PURE__ */ new Map();
2346
2406
  setProvenanceCatalog(catalog) {
@@ -2389,6 +2449,7 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
2389
2449
  this.cancelIssueLoadMoreRequests();
2390
2450
  const requestId = ++this.requestId;
2391
2451
  this.resetAgentGeneratedBrowsePath();
2452
+ this.resetWorkspaceFileBrowsePaths();
2392
2453
  this.resetExpandedCounts();
2393
2454
  this.resetSearchLimits();
2394
2455
  this.resetRawGroups();
@@ -2442,6 +2503,7 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
2442
2503
  this.cancelIssueLoadMoreRequests();
2443
2504
  const requestId = ++this.requestId;
2444
2505
  this.resetAgentGeneratedBrowsePath();
2506
+ this.resetWorkspaceFileBrowsePaths();
2445
2507
  this.resetExpandedCounts();
2446
2508
  this.resetSearchLimits();
2447
2509
  this.resetRawGroups();
@@ -2582,11 +2644,12 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
2582
2644
  enterCategory(category) {
2583
2645
  this.setFilter(category);
2584
2646
  }
2585
- selectAgentGeneratedMentionItem(item) {
2647
+ selectFileMentionNavigationItem(item) {
2586
2648
  if (item.kind !== "file" || !item.mentionNavigation) {
2587
2649
  return false;
2588
2650
  }
2589
2651
  if (item.mentionNavigation === "agent-generated-folder") {
2652
+ this.resetWorkspaceFileBrowsePaths();
2590
2653
  this.agentGeneratedBrowsePath = item.path;
2591
2654
  this.expandedCounts.agent_generated_files = mentionGroupPageSize(
2592
2655
  this.currentFilter,
@@ -2616,12 +2679,26 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
2616
2679
  });
2617
2680
  return true;
2618
2681
  }
2682
+ if (item.mentionNavigation === "workspace-folder") {
2683
+ const path = item.path.trim();
2684
+ if (!path || this.currentFilter !== "file" || this.currentQuery) {
2685
+ return false;
2686
+ }
2687
+ this.resetAgentGeneratedBrowsePath();
2688
+ this.workspaceFileBrowsePaths.push(path);
2689
+ this.loadWorkspaceFileDirectory(path);
2690
+ return true;
2691
+ }
2692
+ if (item.mentionNavigation === "workspace-folder-back") {
2693
+ return this.exitWorkspaceFileBrowse();
2694
+ }
2619
2695
  return false;
2620
2696
  }
2621
- exitAgentGeneratedBrowse() {
2622
- if (!this.agentGeneratedBrowsePath) {
2623
- return false;
2697
+ exitFileMentionBrowse() {
2698
+ if (this.workspaceFileBrowsePaths.length > 0) {
2699
+ return this.exitWorkspaceFileBrowse();
2624
2700
  }
2701
+ if (!this.agentGeneratedBrowsePath) return false;
2625
2702
  this.resetAgentGeneratedBrowsePath();
2626
2703
  this.setState({
2627
2704
  status: this.state.status === "loading" ? "loading" : "ready",
@@ -2634,6 +2711,80 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
2634
2711
  });
2635
2712
  return true;
2636
2713
  }
2714
+ exitWorkspaceFileBrowse() {
2715
+ if (this.workspaceFileBrowsePaths.length === 0) {
2716
+ return false;
2717
+ }
2718
+ this.workspaceFileBrowsePaths.pop();
2719
+ const parentPath = this.workspaceFileBrowsePaths.at(-1);
2720
+ if (parentPath) {
2721
+ this.loadWorkspaceFileDirectory(parentPath);
2722
+ return true;
2723
+ }
2724
+ this.startBrowseModeFetch("file");
2725
+ return true;
2726
+ }
2727
+ loadWorkspaceFileDirectory(directoryPath) {
2728
+ this.clearTimer();
2729
+ this.abortActiveRequest();
2730
+ this.cancelIssueLoadMoreRequests();
2731
+ const requestId = ++this.requestId;
2732
+ const workspaceId = this.activeWorkspaceId;
2733
+ this.setState({
2734
+ status: "loading",
2735
+ query: "",
2736
+ mode: "browse",
2737
+ filter: this.currentFilter,
2738
+ categories: buildBrowseCategories(),
2739
+ groups: this.groupsFromRawGroups(),
2740
+ error: null
2741
+ });
2742
+ const abortSignal = this.beginActiveRequest();
2743
+ const diagnostics = [];
2744
+ void this.queryProviderMentionItemsById({
2745
+ abortSignal,
2746
+ diagnostics,
2747
+ directoryPath,
2748
+ providerId: FILE_PROVIDER_ID,
2749
+ workspaceId,
2750
+ currentUserId: this.currentUserId,
2751
+ query: "",
2752
+ provenanceFilter: this.currentProvenanceFilter
2753
+ }).then((items) => {
2754
+ if (!this.canApply(requestId, workspaceId, "", "file") || this.workspaceFileBrowsePaths.at(-1) !== directoryPath) {
2755
+ return;
2756
+ }
2757
+ this.rawGroups.opened_files = presentWorkspaceFileDirectoryMentionItems(
2758
+ {
2759
+ browsePath: directoryPath,
2760
+ items
2761
+ }
2762
+ );
2763
+ this.totalCounts.opened_files = this.rawGroups.opened_files.length;
2764
+ this.setState({
2765
+ status: "ready",
2766
+ query: "",
2767
+ mode: "browse",
2768
+ filter: "file",
2769
+ categories: buildBrowseCategories(),
2770
+ groups: this.groupsFromRawGroups(),
2771
+ error: null
2772
+ });
2773
+ }).catch((error) => {
2774
+ if (!this.canApply(requestId, workspaceId, "", "file") || this.workspaceFileBrowsePaths.at(-1) !== directoryPath) {
2775
+ return;
2776
+ }
2777
+ this.setState({
2778
+ status: "error",
2779
+ query: "",
2780
+ mode: "browse",
2781
+ filter: "file",
2782
+ categories: buildBrowseCategories(),
2783
+ groups: this.groupsFromRawGroups(),
2784
+ error: error instanceof Error ? error.message : String(error)
2785
+ });
2786
+ });
2787
+ }
2637
2788
  expandGroup(groupId) {
2638
2789
  if (groupId.startsWith("issue-topic:")) {
2639
2790
  this.loadMoreIssueTopic(groupId);
@@ -2706,6 +2857,7 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
2706
2857
  this.requestId += 1;
2707
2858
  this.currentFilter = DEFAULT_AGENT_MENTION_FILTER;
2708
2859
  this.resetAgentGeneratedBrowsePath();
2860
+ this.resetWorkspaceFileBrowsePaths();
2709
2861
  this.resetExpandedCounts();
2710
2862
  this.resetSearchLimits();
2711
2863
  this.resetRawGroups();
@@ -2902,4 +3054,4 @@ export {
2902
3054
  AgentMentionSearchController,
2903
3055
  preloadAgentMentionBrowse
2904
3056
  };
2905
- //# sourceMappingURL=chunk-XJ2U66WG.js.map
3057
+ //# sourceMappingURL=chunk-PRE4IT6E.js.map