@tutti-os/agent-gui 0.0.216 → 0.0.217

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 (70) hide show
  1. package/README.md +6 -0
  2. package/dist/{agentFileMentionContracts-BeBex-Sf.d.ts → AgentMentionSearchContracts-y1_u9cPi.d.ts} +73 -1
  3. package/dist/{AgentRichTextReadonly-IPPNAAWG.js → AgentRichTextReadonly-WZHUIARR.js} +7 -7
  4. package/dist/agent-conversation/index.js +9 -9
  5. package/dist/agent-gui.d.ts +16 -3
  6. package/dist/agent-gui.js +23 -22
  7. package/dist/agent-message-center/index.js +6 -6
  8. package/dist/app/renderer/agentactivity.css +93 -69
  9. package/dist/{chunk-VMPPZO5C.js → chunk-2QF3RBR4.js} +4 -4
  10. package/dist/{chunk-DTP2OMCE.js → chunk-44OCOBJS.js} +9 -11
  11. package/dist/chunk-44OCOBJS.js.map +1 -0
  12. package/dist/chunk-6GX57XB5.js +135 -0
  13. package/dist/chunk-6GX57XB5.js.map +1 -0
  14. package/dist/{chunk-EZRQMJTX.js → chunk-FS7EMOVD.js} +4 -4
  15. package/dist/{chunk-6A6OVD66.js → chunk-G2KRK7Z5.js} +44 -18
  16. package/dist/chunk-G2KRK7Z5.js.map +1 -0
  17. package/dist/{chunk-YY5WM3OE.js → chunk-GDLM6FLK.js} +90 -47
  18. package/dist/chunk-GDLM6FLK.js.map +1 -0
  19. package/dist/{chunk-UERICUWM.js → chunk-GLVENTN6.js} +2 -2
  20. package/dist/{chunk-B4TM2HYJ.js → chunk-JQOQETPN.js} +5 -5
  21. package/dist/{chunk-QFYOJMEQ.js → chunk-M6WEFXPL.js} +2 -2
  22. package/dist/{chunk-AOK22J62.js → chunk-N2M4B3G3.js} +2 -2
  23. package/dist/{chunk-DLN33TPF.js → chunk-NXQGAXIE.js} +8 -8
  24. package/dist/{chunk-MOCBHFJ2.js → chunk-O4QFGCLU.js} +42 -118
  25. package/dist/chunk-O4QFGCLU.js.map +1 -0
  26. package/dist/{chunk-Z5UJC4Q3.js → chunk-PPAV2TB4.js} +3 -3
  27. package/dist/{chunk-4CHBM3G3.js → chunk-SUVMLCED.js} +5 -5
  28. package/dist/{chunk-KJA3HHUJ.js → chunk-TKECUCUW.js} +529 -291
  29. package/dist/chunk-TKECUCUW.js.map +1 -0
  30. package/dist/{chunk-P2RIZAK5.js → chunk-ZXEICU6J.js} +3 -1
  31. package/dist/chunk-ZXEICU6J.js.map +1 -0
  32. package/dist/context-mention-palette/index.d.ts +3 -3
  33. package/dist/context-mention-palette/index.js +12 -12
  34. package/dist/headerLayout-CP4ujEbo.d.ts +14 -0
  35. package/dist/i18n/index.d.ts +2 -0
  36. package/dist/i18n/index.js +2 -2
  37. package/dist/index.d.ts +77 -46
  38. package/dist/index.js +46 -39
  39. package/dist/index.js.map +1 -1
  40. package/dist/layout.d.ts +7 -0
  41. package/dist/layout.js +9 -0
  42. package/dist/layout.js.map +1 -0
  43. package/dist/mention-search.d.ts +6 -73
  44. package/dist/mention-search.js +8 -8
  45. package/dist/workbench/browser-element-context/index.js +2 -2
  46. package/dist/workbench/contribution.js +7 -6
  47. package/dist/workbench/index.d.ts +3 -1
  48. package/dist/workbench/index.js +10 -9
  49. package/dist/workbench/launch.js +2 -2
  50. package/dist/workbench/sessionTitle.js +2 -2
  51. package/dist/workbench/tool-sidebar/index.d.ts +14 -13
  52. package/dist/workbench/tool-sidebar/index.js +66 -55
  53. package/dist/workbench/tool-sidebar/index.js.map +1 -1
  54. package/package.json +23 -16
  55. package/dist/chunk-6A6OVD66.js.map +0 -1
  56. package/dist/chunk-DTP2OMCE.js.map +0 -1
  57. package/dist/chunk-KJA3HHUJ.js.map +0 -1
  58. package/dist/chunk-MOCBHFJ2.js.map +0 -1
  59. package/dist/chunk-P2RIZAK5.js.map +0 -1
  60. package/dist/chunk-YY5WM3OE.js.map +0 -1
  61. /package/dist/{AgentRichTextReadonly-IPPNAAWG.js.map → AgentRichTextReadonly-WZHUIARR.js.map} +0 -0
  62. /package/dist/{chunk-VMPPZO5C.js.map → chunk-2QF3RBR4.js.map} +0 -0
  63. /package/dist/{chunk-EZRQMJTX.js.map → chunk-FS7EMOVD.js.map} +0 -0
  64. /package/dist/{chunk-UERICUWM.js.map → chunk-GLVENTN6.js.map} +0 -0
  65. /package/dist/{chunk-B4TM2HYJ.js.map → chunk-JQOQETPN.js.map} +0 -0
  66. /package/dist/{chunk-QFYOJMEQ.js.map → chunk-M6WEFXPL.js.map} +0 -0
  67. /package/dist/{chunk-AOK22J62.js.map → chunk-N2M4B3G3.js.map} +0 -0
  68. /package/dist/{chunk-DLN33TPF.js.map → chunk-NXQGAXIE.js.map} +0 -0
  69. /package/dist/{chunk-Z5UJC4Q3.js.map → chunk-PPAV2TB4.js.map} +0 -0
  70. /package/dist/{chunk-4CHBM3G3.js.map → chunk-SUVMLCED.js.map} +0 -0
@@ -1,9 +1,9 @@
1
- import {
2
- translateInUiLanguage
3
- } from "./chunk-P2RIZAK5.js";
4
1
  import {
5
2
  normalizeAgentTitleText
6
3
  } from "./chunk-MIJXEELH.js";
4
+ import {
5
+ translateInUiLanguage
6
+ } from "./chunk-ZXEICU6J.js";
7
7
  import {
8
8
  resolveAgentGUIProviderCatalogIdentity
9
9
  } from "./chunk-O433KXLK.js";
@@ -335,4 +335,4 @@ export {
335
335
  resolveAgentGuiWorkbenchHeaderTitle,
336
336
  resolveAgentGuiWorkbenchSessionTitle
337
337
  };
338
- //# sourceMappingURL=chunk-VMPPZO5C.js.map
338
+ //# sourceMappingURL=chunk-2QF3RBR4.js.map
@@ -1,3 +1,7 @@
1
+ import {
2
+ userAvatarPlaceholderUrl,
3
+ workspaceAgentActivityStatusLabel
4
+ } from "./chunk-N2M4B3G3.js";
1
5
  import {
2
6
  AGENT_MENTION_FILTER_TAB_ORDER,
3
7
  agentGeneratedMentionItemKey,
@@ -5,21 +9,17 @@ import {
5
9
  agentMentionFilterLabel,
6
10
  agentMentionGroupLabel,
7
11
  mentionGroupExpandCount
8
- } from "./chunk-6A6OVD66.js";
12
+ } from "./chunk-G2KRK7Z5.js";
9
13
  import {
10
14
  resolveAgentMentionFileThumbnailUrl,
11
15
  resolveAgentMentionFileVisualKind
12
16
  } from "./chunk-3V5OCA2M.js";
13
- import {
14
- userAvatarPlaceholderUrl,
15
- workspaceAgentActivityStatusLabel
16
- } from "./chunk-AOK22J62.js";
17
17
  import {
18
18
  managedAgentRoundedIconUrl
19
19
  } from "./chunk-M6HTOCQK.js";
20
20
  import {
21
21
  translate
22
- } from "./chunk-UERICUWM.js";
22
+ } from "./chunk-GLVENTN6.js";
23
23
 
24
24
  // agent-gui/agentGuiNode/AgentFileMentionPalette.tsx
25
25
  import {
@@ -335,14 +335,12 @@ function agentMentionItemToRowItem(item) {
335
335
  }
336
336
  if (item.kind === "session") {
337
337
  const isMySession = item.scope === "my_sessions";
338
- const participant = isMySession ? item.agentName : `${item.initiatorName} & ${item.agentName}`;
339
- const participantTruncatableSegments = item.agentOwnerLabel && item.agentLabel ? isMySession ? [item.agentOwnerLabel] : [item.initiatorName, item.agentOwnerLabel] : null;
338
+ const participantTruncatableSegments = item.agentOwnerLabel && item.agentLabel ? [item.agentOwnerLabel] : null;
340
339
  const participantFixedSuffix = participantTruncatableSegments && item.agentLabel ? ` \xB7 ${item.agentLabel}` : null;
341
340
  return {
342
341
  kind: "session",
343
- participant,
342
+ participant: item.agentName,
344
343
  participantTruncatableSegments,
345
- participantSegmentSeparator: " & ",
346
344
  participantFixedSuffix,
347
345
  summary: item.title,
348
346
  userAvatarUrl: isMySession ? null : item.initiatorAvatarUrl ?? null,
@@ -523,4 +521,4 @@ export {
523
521
  AgentFileMentionPalette,
524
522
  AgentContextMentionPalette
525
523
  };
526
- //# sourceMappingURL=chunk-DTP2OMCE.js.map
524
+ //# sourceMappingURL=chunk-44OCOBJS.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 const participantTruncatableSegments =\n item.agentOwnerLabel && item.agentLabel ? [item.agentOwnerLabel] : null;\n const participantFixedSuffix =\n participantTruncatableSegments && item.agentLabel\n ? ` · ${item.agentLabel}`\n : null;\n return {\n kind: \"session\",\n participant: item.agentName,\n participantTruncatableSegments,\n participantFixedSuffix,\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":[]}
@@ -0,0 +1,135 @@
1
+ // agent-gui/agentGuiNode/model/agentGuiRailLayout.ts
2
+ function clamp(value, min, max) {
3
+ return Math.min(max, Math.max(min, value));
4
+ }
5
+ var AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX = 280;
6
+ var AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX = 248;
7
+ var AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX = 520;
8
+ var AGENT_GUI_DETAIL_MIN_WIDTH_PX = 220;
9
+ var AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX = 320;
10
+ var AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX = 10;
11
+ var AGENT_GUI_PROVIDER_RAIL_WIDTH_PX = 52;
12
+ var AGENT_GUI_COLLAPSED_MIN_WIDTH_PX = 460;
13
+ var AGENT_GUI_STANDALONE_MIDDLE_CONTENT_MIN_WIDTH_PX = AGENT_GUI_COLLAPSED_MIN_WIDTH_PX - AGENT_GUI_PROVIDER_RAIL_WIDTH_PX;
14
+ var AGENT_GUI_EXPANDED_MIN_WIDTH_PX = AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;
15
+ var AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX = AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX + AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX + AGENT_GUI_PROVIDER_RAIL_WIDTH_PX;
16
+ var AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;
17
+ function shouldAutoCollapseAgentGUIConversationRail(containerWidthPx, options) {
18
+ if (options?.mode === "preserve-middle-content" && Number.isFinite(containerWidthPx) && containerWidthPx > 0) {
19
+ return containerWidthPx < resolveStandaloneAgentGUIViewportMinimumWidthPx({
20
+ conversationRailCollapsed: false,
21
+ conversationRailWidthPx: options.conversationRailWidthPx
22
+ });
23
+ }
24
+ return Number.isFinite(containerWidthPx) && containerWidthPx > 0 && containerWidthPx <= AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX;
25
+ }
26
+ function resolveAgentGUIConversationRailPresentation(input) {
27
+ const isAutoCollapsed = shouldAutoCollapseAgentGUIConversationRail(
28
+ input.containerWidthPx,
29
+ {
30
+ mode: input.autoCollapseMode,
31
+ conversationRailWidthPx: input.conversationRailWidthPx
32
+ }
33
+ );
34
+ return {
35
+ conversationRailWidthPx: clampAgentGUIConversationRailWidthPx(
36
+ input.conversationRailWidthPx,
37
+ input.containerWidthPx
38
+ ),
39
+ isAutoCollapsed,
40
+ isCollapsed: input.conversationRailCollapsed === true || isAutoCollapsed
41
+ };
42
+ }
43
+ function resolveStandaloneAgentGUIViewportMinimumWidthPx(input) {
44
+ if (input.conversationRailCollapsed === true) {
45
+ return AGENT_GUI_COLLAPSED_MIN_WIDTH_PX;
46
+ }
47
+ return AGENT_GUI_PROVIDER_RAIL_WIDTH_PX + resolvePreferredConversationRailWidthPx(input.conversationRailWidthPx) + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX + AGENT_GUI_STANDALONE_MIDDLE_CONTENT_MIN_WIDTH_PX;
48
+ }
49
+ function resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx) {
50
+ const safeContainerWidth = Number.isFinite(containerWidthPx) && containerWidthPx > 0 ? containerWidthPx : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;
51
+ return Math.max(
52
+ AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
53
+ Math.min(
54
+ AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX,
55
+ safeContainerWidth - AGENT_GUI_DETAIL_MIN_WIDTH_PX - AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX
56
+ )
57
+ );
58
+ }
59
+ function clampAgentGUIConversationRailWidthPx(widthPx, containerWidthPx) {
60
+ return clamp(
61
+ resolvePreferredConversationRailWidthPx(widthPx),
62
+ AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
63
+ resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx)
64
+ );
65
+ }
66
+ function resolvePreferredConversationRailWidthPx(widthPx) {
67
+ const preferredWidthPx = typeof widthPx === "number" && Number.isFinite(widthPx) ? Math.round(widthPx) : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX;
68
+ return clamp(
69
+ preferredWidthPx,
70
+ AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
71
+ AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX
72
+ );
73
+ }
74
+ function resolveNextAgentGUIConversationRailWidthPx(input) {
75
+ const nextWidthPx = clampAgentGUIConversationRailWidthPx(
76
+ input.requestedWidthPx,
77
+ input.containerWidthPx
78
+ );
79
+ if (input.currentWidthPx === nextWidthPx) {
80
+ return input.currentWidthPx;
81
+ }
82
+ if (input.currentWidthPx === null || input.currentWidthPx === void 0) {
83
+ const defaultWidthPx = clampAgentGUIConversationRailWidthPx(
84
+ null,
85
+ input.containerWidthPx
86
+ );
87
+ if (nextWidthPx === defaultWidthPx) {
88
+ return null;
89
+ }
90
+ }
91
+ return nextWidthPx;
92
+ }
93
+ function resolveAgentGUIExpandedWindowFrame(input) {
94
+ const desiredRailWidthPx = clampAgentGUIConversationRailWidthPx(
95
+ input.conversationRailWidthPx,
96
+ AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX
97
+ );
98
+ const desiredWidthPx = Math.max(
99
+ Math.round(input.width),
100
+ desiredRailWidthPx + AGENT_GUI_DETAIL_MIN_WIDTH_PX + AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX,
101
+ AGENT_GUI_EXPANDED_MIN_WIDTH_PX,
102
+ AGENT_GUI_EXPANDED_TARGET_WIDTH_PX
103
+ );
104
+ const desktopWidthPx = Number.isFinite(input.desktopSize.width) && input.desktopSize.width > 0 ? Math.round(input.desktopSize.width) : desiredWidthPx;
105
+ const nextWidthPx = Math.min(desiredWidthPx, desktopWidthPx);
106
+ const maxX = Math.max(0, desktopWidthPx - nextWidthPx);
107
+ const nextX = clamp(Math.round(input.position.x), 0, maxX);
108
+ return {
109
+ position: {
110
+ x: nextX,
111
+ y: input.position.y
112
+ },
113
+ size: {
114
+ width: nextWidthPx,
115
+ height: input.height
116
+ }
117
+ };
118
+ }
119
+
120
+ export {
121
+ AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
122
+ AGENT_GUI_DETAIL_MIN_WIDTH_PX,
123
+ AGENT_GUI_PROVIDER_RAIL_WIDTH_PX,
124
+ AGENT_GUI_COLLAPSED_MIN_WIDTH_PX,
125
+ AGENT_GUI_STANDALONE_MIDDLE_CONTENT_MIN_WIDTH_PX,
126
+ AGENT_GUI_EXPANDED_TARGET_WIDTH_PX,
127
+ shouldAutoCollapseAgentGUIConversationRail,
128
+ resolveAgentGUIConversationRailPresentation,
129
+ resolveStandaloneAgentGUIViewportMinimumWidthPx,
130
+ resolveAgentGUIConversationRailMaxWidthPx,
131
+ clampAgentGUIConversationRailWidthPx,
132
+ resolveNextAgentGUIConversationRailWidthPx,
133
+ resolveAgentGUIExpandedWindowFrame
134
+ };
135
+ //# sourceMappingURL=chunk-6GX57XB5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts"],"sourcesContent":["function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n// Keep aligned with the issue manager task-list rail dimensions.\nexport const AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX = 280;\nexport const AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX = 248;\nexport const AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX = 520;\nexport const AGENT_GUI_DETAIL_MIN_WIDTH_PX = 220;\nexport const AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX = 320;\nexport const AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX = 10;\nexport const AGENT_GUI_PROVIDER_RAIL_WIDTH_PX = 52;\nexport const AGENT_GUI_COLLAPSED_MIN_WIDTH_PX = 460;\nexport const AGENT_GUI_STANDALONE_MIDDLE_CONTENT_MIN_WIDTH_PX =\n AGENT_GUI_COLLAPSED_MIN_WIDTH_PX - AGENT_GUI_PROVIDER_RAIL_WIDTH_PX;\nexport const AGENT_GUI_EXPANDED_MIN_WIDTH_PX =\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\n// One package-owned responsive threshold applies to every Agent GUI surface:\n// 248px conversation rail + 320px composer + 10px resize handle + 52px\n// provider rail = 630px. Hosts project container width and persisted user\n// preference only; they do not replace this layout policy.\nexport const AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX =\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX +\n AGENT_GUI_HOME_COMPOSER_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX +\n AGENT_GUI_PROVIDER_RAIL_WIDTH_PX;\nexport const AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;\n\nexport interface AgentGUIConversationRailPresentation {\n conversationRailWidthPx: number;\n isAutoCollapsed: boolean;\n isCollapsed: boolean;\n}\n\nexport type AgentGUIConversationRailAutoCollapseMode =\n | \"default\"\n | \"preserve-middle-content\";\n\nexport interface AgentGUIExpandedWindowFrameInput {\n position: { x: number; y: number };\n width: number;\n height: number;\n desktopSize: { width: number; height: number };\n conversationRailWidthPx: number | null | undefined;\n}\n\nexport function shouldAutoCollapseAgentGUIConversationRail(\n containerWidthPx: number,\n options?: {\n mode?: AgentGUIConversationRailAutoCollapseMode;\n conversationRailWidthPx?: number | null;\n }\n): boolean {\n if (\n options?.mode === \"preserve-middle-content\" &&\n Number.isFinite(containerWidthPx) &&\n containerWidthPx > 0\n ) {\n return (\n containerWidthPx <\n resolveStandaloneAgentGUIViewportMinimumWidthPx({\n conversationRailCollapsed: false,\n conversationRailWidthPx: options.conversationRailWidthPx\n })\n );\n }\n return (\n Number.isFinite(containerWidthPx) &&\n containerWidthPx > 0 &&\n containerWidthPx <= AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX\n );\n}\n\nexport function resolveAgentGUIConversationRailPresentation(input: {\n autoCollapseMode?: AgentGUIConversationRailAutoCollapseMode;\n containerWidthPx: number;\n conversationRailCollapsed?: boolean | null;\n conversationRailWidthPx?: number | null;\n}): AgentGUIConversationRailPresentation {\n const isAutoCollapsed = shouldAutoCollapseAgentGUIConversationRail(\n input.containerWidthPx,\n {\n mode: input.autoCollapseMode,\n conversationRailWidthPx: input.conversationRailWidthPx\n }\n );\n return {\n conversationRailWidthPx: clampAgentGUIConversationRailWidthPx(\n input.conversationRailWidthPx,\n input.containerWidthPx\n ),\n isAutoCollapsed,\n isCollapsed: input.conversationRailCollapsed === true || isAutoCollapsed\n };\n}\n\nexport function resolveStandaloneAgentGUIViewportMinimumWidthPx(input: {\n conversationRailCollapsed?: boolean | null;\n conversationRailWidthPx?: number | null;\n}): number {\n if (input.conversationRailCollapsed === true) {\n return AGENT_GUI_COLLAPSED_MIN_WIDTH_PX;\n }\n return (\n AGENT_GUI_PROVIDER_RAIL_WIDTH_PX +\n resolvePreferredConversationRailWidthPx(input.conversationRailWidthPx) +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX +\n AGENT_GUI_STANDALONE_MIDDLE_CONTENT_MIN_WIDTH_PX\n );\n}\n\nexport function resolveAgentGUIConversationRailMaxWidthPx(\n containerWidthPx: number\n): number {\n const safeContainerWidth =\n Number.isFinite(containerWidthPx) && containerWidthPx > 0\n ? containerWidthPx\n : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX;\n\n return Math.max(\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n Math.min(\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX,\n safeContainerWidth -\n AGENT_GUI_DETAIL_MIN_WIDTH_PX -\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n )\n );\n}\n\nexport function clampAgentGUIConversationRailWidthPx(\n widthPx: number | null | undefined,\n containerWidthPx: number\n): number {\n return clamp(\n resolvePreferredConversationRailWidthPx(widthPx),\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx)\n );\n}\n\nfunction resolvePreferredConversationRailWidthPx(\n widthPx: number | null | undefined\n): number {\n const preferredWidthPx =\n typeof widthPx === \"number\" && Number.isFinite(widthPx)\n ? Math.round(widthPx)\n : AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX;\n return clamp(\n preferredWidthPx,\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX\n );\n}\n\nexport function resolveNextAgentGUIConversationRailWidthPx(input: {\n currentWidthPx: number | null | undefined;\n requestedWidthPx: number;\n containerWidthPx: number;\n}): number | null {\n const nextWidthPx = clampAgentGUIConversationRailWidthPx(\n input.requestedWidthPx,\n input.containerWidthPx\n );\n if (input.currentWidthPx === nextWidthPx) {\n return input.currentWidthPx;\n }\n\n if (input.currentWidthPx === null || input.currentWidthPx === undefined) {\n const defaultWidthPx = clampAgentGUIConversationRailWidthPx(\n null,\n input.containerWidthPx\n );\n if (nextWidthPx === defaultWidthPx) {\n return null;\n }\n }\n\n return nextWidthPx;\n}\n\nexport function resolveAgentGUIExpandedWindowFrame(\n input: AgentGUIExpandedWindowFrameInput\n): {\n position: { x: number; y: number };\n size: { width: number; height: number };\n} {\n const desiredRailWidthPx = clampAgentGUIConversationRailWidthPx(\n input.conversationRailWidthPx,\n AGENT_GUI_CONVERSATION_RAIL_MAX_WIDTH_PX +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX\n );\n const desiredWidthPx = Math.max(\n Math.round(input.width),\n desiredRailWidthPx +\n AGENT_GUI_DETAIL_MIN_WIDTH_PX +\n AGENT_GUI_RAIL_RESIZE_HANDLE_WIDTH_PX,\n AGENT_GUI_EXPANDED_MIN_WIDTH_PX,\n AGENT_GUI_EXPANDED_TARGET_WIDTH_PX\n );\n const desktopWidthPx =\n Number.isFinite(input.desktopSize.width) && input.desktopSize.width > 0\n ? Math.round(input.desktopSize.width)\n : desiredWidthPx;\n const nextWidthPx = Math.min(desiredWidthPx, desktopWidthPx);\n const maxX = Math.max(0, desktopWidthPx - nextWidthPx);\n const nextX = clamp(Math.round(input.position.x), 0, maxX);\n\n return {\n position: {\n x: nextX,\n y: input.position.y\n },\n size: {\n width: nextWidthPx,\n height: input.height\n }\n };\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  AgentGUIConversation_styles_default,
3
3
  MessageSquareMoreIcon,
4
4
  extractAgentMcpToolTarget
5
- } from "./chunk-Z5UJC4Q3.js";
5
+ } from "./chunk-PPAV2TB4.js";
6
6
  import {
7
7
  buildAskUserAnswerPayload,
8
8
  readOwnAnswer,
@@ -11,13 +11,13 @@ import {
11
11
  import {
12
12
  getOptionalAgentHostApi,
13
13
  useOptionalAgentHostApi
14
- } from "./chunk-QFYOJMEQ.js";
14
+ } from "./chunk-M6WEFXPL.js";
15
15
  import {
16
16
  fileChangePathsFromChanges
17
17
  } from "./chunk-F5UR6EJG.js";
18
18
  import {
19
19
  translate
20
- } from "./chunk-UERICUWM.js";
20
+ } from "./chunk-GLVENTN6.js";
21
21
 
22
22
  // shared/agentConversation/planImplementationPresentation.ts
23
23
  var PLAN_IMPLEMENTATION_PROMPT = "Implement the plan.";
@@ -1498,4 +1498,4 @@ export {
1498
1498
  isPromptRequestIdTitle,
1499
1499
  AgentInteractivePromptSurface
1500
1500
  };
1501
- //# sourceMappingURL=chunk-EZRQMJTX.js.map
1501
+ //# sourceMappingURL=chunk-FS7EMOVD.js.map
@@ -2,33 +2,33 @@ import {
2
2
  changedFilesForSession,
3
3
  workspaceAgentSessionMessageAliases
4
4
  } from "./chunk-VMPA46ET.js";
5
+ import {
6
+ resolveWorkspaceAgentSessionSortTimeUnixMs
7
+ } from "./chunk-YMXYBG7U.js";
5
8
  import {
6
9
  isWorkspaceAgentSyntheticControlMessage
7
10
  } from "./chunk-XJ34OIEQ.js";
8
11
  import {
9
12
  normalizeAgentSessionMentionTitle,
10
13
  resolveAgentSessionMentionIconUrl
11
- } from "./chunk-B4TM2HYJ.js";
14
+ } from "./chunk-JQOQETPN.js";
12
15
  import {
13
16
  resolveAgentMentionFileThumbnailUrl
14
17
  } from "./chunk-3V5OCA2M.js";
15
- import {
16
- AGENT_CONTEXT_MENTION_PROVIDER_IDS
17
- } from "./chunk-RMQREVJY.js";
18
- import {
19
- resolveWorkspaceAgentSessionSortTimeUnixMs
20
- } from "./chunk-YMXYBG7U.js";
21
18
  import {
22
19
  getOptionalAgentHostApi,
23
20
  workspaceAgentProviderLabel
24
- } from "./chunk-QFYOJMEQ.js";
21
+ } from "./chunk-M6WEFXPL.js";
25
22
  import {
26
23
  translate,
27
24
  translateInUiLanguage
28
- } from "./chunk-UERICUWM.js";
25
+ } from "./chunk-GLVENTN6.js";
29
26
  import {
30
27
  normalizeAgentTitleText
31
28
  } from "./chunk-MIJXEELH.js";
29
+ import {
30
+ AGENT_CONTEXT_MENTION_PROVIDER_IDS
31
+ } from "./chunk-RMQREVJY.js";
32
32
 
33
33
  // agent-gui/agentGuiNode/AgentMentionLabels.ts
34
34
  function agentMentionGroupLabel(groupId) {
@@ -2479,9 +2479,6 @@ var AgentMentionDirectoryRequestLifecycle = class {
2479
2479
  }
2480
2480
  };
2481
2481
 
2482
- // agent-gui/agentGuiNode/AgentMentionSearchController.ts
2483
- import { referenceProvenanceFilterCacheKey as referenceProvenanceFilterCacheKey2 } from "@tutti-os/workspace-file-reference/core";
2484
-
2485
2482
  // agent-gui/agentGuiNode/agentMentionWorkspaceFilesPresentation.ts
2486
2483
  function presentWorkspaceFileDirectoryMentionItems(input) {
2487
2484
  return [createWorkspaceFileFolderBackItem(input.browsePath), ...input.items];
@@ -2506,10 +2503,39 @@ function parentWorkspaceFileDirectoryPath(path) {
2506
2503
  return normalized.slice(0, index);
2507
2504
  }
2508
2505
 
2506
+ // agent-gui/agentGuiNode/AgentMentionProvenanceFilterState.ts
2507
+ import { referenceProvenanceFilterCacheKey as referenceProvenanceFilterCacheKey2 } from "@tutti-os/workspace-file-reference/core";
2508
+ var EMPTY_PROVENANCE_FILTERS = {
2509
+ session: null,
2510
+ file: null,
2511
+ issue: null,
2512
+ agent: null,
2513
+ app: null
2514
+ };
2515
+ var AgentMentionProvenanceFilterState = class {
2516
+ filters = EMPTY_PROVENANCE_FILTERS;
2517
+ replace(filters, activeFilter) {
2518
+ const previous = this.value(activeFilter);
2519
+ this.filters = filters;
2520
+ const value = this.value(activeFilter);
2521
+ return {
2522
+ changed: provenanceFilterKey(previous) !== provenanceFilterKey(value),
2523
+ value
2524
+ };
2525
+ }
2526
+ value(filter) {
2527
+ return this.filters[filter];
2528
+ }
2529
+ };
2530
+ function provenanceFilterKey(filter) {
2531
+ return filter ? referenceProvenanceFilterCacheKey2(filter) : "disabled";
2532
+ }
2533
+
2509
2534
  // agent-gui/agentGuiNode/AgentMentionSearchController.ts
2510
2535
  var AgentMentionSearchController = class extends AgentMentionSearchControllerBase {
2511
2536
  issueLoadMoreRequests = /* @__PURE__ */ new Map();
2512
2537
  directoryRequestLifecycle = new AgentMentionDirectoryRequestLifecycle();
2538
+ provenanceFilters = new AgentMentionProvenanceFilterState();
2513
2539
  setProvenanceCatalog(catalog) {
2514
2540
  if (this.currentProvenanceCatalog === catalog) return;
2515
2541
  this.currentProvenanceCatalog = catalog;
@@ -2521,12 +2547,11 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
2521
2547
  groups: this.groupsFromRawGroups()
2522
2548
  });
2523
2549
  }
2524
- setProvenanceFilter(filter) {
2525
- const previousKey = this.currentProvenanceFilter ? referenceProvenanceFilterCacheKey2(this.currentProvenanceFilter) : "disabled";
2526
- const nextKey = filter ? referenceProvenanceFilterCacheKey2(filter) : "disabled";
2527
- if (previousKey === nextKey) return;
2550
+ setProvenanceFilters(filters) {
2551
+ const next = this.provenanceFilters.replace(filters, this.currentFilter);
2552
+ if (!next.changed) return;
2528
2553
  this.cancelPendingPreload();
2529
- this.currentProvenanceFilter = filter;
2554
+ this.currentProvenanceFilter = next.value;
2530
2555
  this.updateQuery({
2531
2556
  workspaceId: this.activeWorkspaceId,
2532
2557
  currentUserId: this.currentUserId,
@@ -2606,6 +2631,7 @@ var AgentMentionSearchController = class extends AgentMentionSearchControllerBas
2606
2631
  return;
2607
2632
  }
2608
2633
  this.currentFilter = filter;
2634
+ this.currentProvenanceFilter = this.provenanceFilters.value(filter);
2609
2635
  this.clearTimer();
2610
2636
  this.abortActiveRequest();
2611
2637
  this.directoryRequestLifecycle.cancel();
@@ -3184,4 +3210,4 @@ export {
3184
3210
  AgentMentionSearchController,
3185
3211
  preloadAgentMentionBrowse
3186
3212
  };
3187
- //# sourceMappingURL=chunk-6A6OVD66.js.map
3213
+ //# sourceMappingURL=chunk-G2KRK7Z5.js.map