@tutti-os/agent-gui 0.0.14 → 0.0.16

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 (69) hide show
  1. package/dist/AgentMentionSearchController-DqssJ2-b.d.ts +218 -0
  2. package/dist/agent-conversation/index.d.ts +4 -2
  3. package/dist/agent-conversation/index.js +5 -4
  4. package/dist/agent-conversation/index.js.map +1 -1
  5. package/dist/agent-message-center/index.d.ts +3 -2
  6. package/dist/agent-message-center/index.js +547 -287
  7. package/dist/agent-message-center/index.js.map +1 -1
  8. package/dist/app/renderer/agentactivity.css +177 -17
  9. package/dist/{chunk-GZHQPPK2.js → chunk-267VY3EJ.js} +130 -43
  10. package/dist/chunk-267VY3EJ.js.map +1 -0
  11. package/dist/{chunk-KEKPOVQD.js → chunk-CABHBFYH.js} +2 -2
  12. package/dist/{chunk-HSXDSFKB.js → chunk-EKATXC3W.js} +2 -2
  13. package/dist/{chunk-RLPVFX7V.js → chunk-FJYH2ZPX.js} +196 -322
  14. package/dist/chunk-FJYH2ZPX.js.map +1 -0
  15. package/dist/{chunk-ASAZDEQE.js → chunk-GWR6WGZY.js} +72 -22
  16. package/dist/chunk-GWR6WGZY.js.map +1 -0
  17. package/dist/{chunk-YXSO4ITT.js → chunk-HIREVEZM.js} +1 -1
  18. package/dist/chunk-HIREVEZM.js.map +1 -0
  19. package/dist/{chunk-VDNMTW2E.js → chunk-IXIGWLQY.js} +1 -1
  20. package/dist/chunk-IXIGWLQY.js.map +1 -0
  21. package/dist/{chunk-ZO3SZCIX.js → chunk-JNGYJ7GM.js} +6 -3
  22. package/dist/chunk-JNGYJ7GM.js.map +1 -0
  23. package/dist/{chunk-MU2LODEV.js → chunk-KWPL3JYS.js} +131 -13
  24. package/dist/chunk-KWPL3JYS.js.map +1 -0
  25. package/dist/{chunk-WME2V26J.js → chunk-LW2S255I.js} +21 -36
  26. package/dist/chunk-LW2S255I.js.map +1 -0
  27. package/dist/{chunk-3YZX5EUC.js → chunk-LWRYYGPZ.js} +610 -480
  28. package/dist/chunk-LWRYYGPZ.js.map +1 -0
  29. package/dist/{chunk-GEXHKJK5.js → chunk-MUZMBEFO.js} +35 -17
  30. package/dist/chunk-MUZMBEFO.js.map +1 -0
  31. package/dist/chunk-O5TUTXHT.js +196 -0
  32. package/dist/chunk-O5TUTXHT.js.map +1 -0
  33. package/dist/{chunk-FSTZDNRM.js → chunk-SIDWRR5I.js} +281 -183
  34. package/dist/chunk-SIDWRR5I.js.map +1 -0
  35. package/dist/context-mention-palette/index.d.ts +11 -170
  36. package/dist/context-mention-palette/index.js +7 -6
  37. package/dist/context-mention-provider.d.ts +6 -1
  38. package/dist/context-mention-provider.js +1 -1
  39. package/dist/i18n/index.d.ts +277 -179
  40. package/dist/i18n/index.js +1 -1
  41. package/dist/index.d.ts +56 -3
  42. package/dist/index.js +2706 -1700
  43. package/dist/index.js.map +1 -1
  44. package/dist/workbench/contribution.d.ts +7 -1
  45. package/dist/workbench/contribution.js +6 -4
  46. package/dist/workbench/index.d.ts +5 -2
  47. package/dist/workbench/index.js +6 -4
  48. package/dist/workbench/launch.d.ts +2 -0
  49. package/dist/workbench/launch.js +2 -2
  50. package/dist/workbench/state.d.ts +3 -2
  51. package/dist/workbench/state.js +1 -1
  52. package/dist/workbench/types.d.ts +3 -0
  53. package/dist/workbench/types.js +1 -1
  54. package/dist/workspace-agent-generated-files.js +2 -2
  55. package/dist/{workspaceLinkActions-BlLN8Pvz.d.ts → workspaceLinkActions-Mjktl_Be.d.ts} +3 -0
  56. package/package.json +15 -13
  57. package/dist/chunk-3YZX5EUC.js.map +0 -1
  58. package/dist/chunk-ASAZDEQE.js.map +0 -1
  59. package/dist/chunk-FSTZDNRM.js.map +0 -1
  60. package/dist/chunk-GEXHKJK5.js.map +0 -1
  61. package/dist/chunk-GZHQPPK2.js.map +0 -1
  62. package/dist/chunk-MU2LODEV.js.map +0 -1
  63. package/dist/chunk-RLPVFX7V.js.map +0 -1
  64. package/dist/chunk-VDNMTW2E.js.map +0 -1
  65. package/dist/chunk-WME2V26J.js.map +0 -1
  66. package/dist/chunk-YXSO4ITT.js.map +0 -1
  67. package/dist/chunk-ZO3SZCIX.js.map +0 -1
  68. /package/dist/{chunk-KEKPOVQD.js.map → chunk-CABHBFYH.js.map} +0 -0
  69. /package/dist/{chunk-HSXDSFKB.js.map → chunk-EKATXC3W.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/contribution.ts","../workbench/header.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport {\n getWorkbenchLayoutFrame,\n type WorkbenchContribution,\n type WorkbenchFrame,\n type WorkbenchHostDockEntry,\n type WorkbenchHostDockPopupItemInput,\n type WorkbenchHostLaunchRequest,\n type WorkbenchHostNodeBodyContext\n} from \"@tutti-os/workbench-surface\";\nimport {\n resolveAgentGUIExpandedWindowFrame,\n shouldAutoCollapseAgentGUIConversationRail\n} from \"../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts\";\nimport { agentGuiDockIconUrls } from \"../dockIcons.ts\";\nimport { AgentGuiWorkbenchHeader } from \"./header.ts\";\nimport {\n agentGuiWorkbenchDockEntryId,\n agentGuiWorkbenchProviderFromIdentifier,\n agentGuiWorkbenchTypeId,\n createAgentGuiWorkbenchLaunchDescriptor\n} from \"./launch.ts\";\nimport {\n agentGuiWorkbenchProviderFromInstanceId,\n createAgentGuiWorkbenchNodeStateSource,\n normalizeAgentGuiWorkbenchNodeState,\n normalizeAgentGuiWorkbenchState\n} from \"./state.ts\";\nimport {\n agentGuiWorkbenchProviderLabels,\n agentGuiWorkbenchProviders,\n isAgentGuiWorkbenchDefaultDockProvider,\n resolveAgentGuiWorkbenchProviderLabel\n} from \"./providerCatalog.ts\";\nimport type {\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\n\nexport const agentGuiWorkbenchDefaultNodeFrame: WorkbenchFrame = {\n height: 560,\n width: 1040,\n x: 140,\n y: 48\n};\n\nexport const agentGuiWorkbenchDefaultUsableHeightRatio = 0.7;\nexport const agentGuiWorkbenchCompactVisibleAreaRatio = 0.9;\n\nexport const AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT =\n \"tutti:agent-gui-workbench-conversation-rail-toggle\";\n\nexport const AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT =\n \"tutti:agent-gui-workbench-new-conversation\";\n\nexport interface AgentGuiWorkbenchConversationRailToggleDetail {\n conversationRailCollapsed: boolean;\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchNewConversationDetail {\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchContributionCopy {\n collapseConversationRail: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n newConversation: string;\n nodeTitle: string;\n}\n\nexport type AgentGuiWorkbenchContributionCopyOverrides =\n Partial<AgentGuiWorkbenchContributionCopy>;\n\nexport const agentGuiWorkbenchDefaultCopy: AgentGuiWorkbenchContributionCopy = {\n collapseConversationRail: \"Collapse conversation rail\",\n expandConversationRail: \"Expand conversation rail\",\n fallbackAgentLabel: \"Agent\",\n newConversation: \"New conversation\",\n nodeTitle: \"Agent\"\n};\n\nexport interface AgentGuiWorkbenchRenderBodyHelpers {\n nodeTypeId: string;\n onStateChange(state: AgentGuiWorkbenchState): void;\n provider: AgentGuiWorkbenchProvider;\n}\n\nexport interface CreateAgentGuiWorkbenchContributionInput {\n copy?: AgentGuiWorkbenchContributionCopyOverrides;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n dockSectionId?: string;\n frame?: WorkbenchFrame;\n id?: string;\n renderBody(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n renderPreview?(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n resolveDockPopupTitle?: (\n state: AgentGuiWorkbenchState | null\n ) => string | null;\n resolveDockEntryVisibility?: (\n provider: AgentGuiWorkbenchProvider\n ) => WorkbenchHostDockEntry[\"visibility\"];\n workspaceId: string;\n}\n\nexport function createAgentGuiWorkbenchContribution(\n input: CreateAgentGuiWorkbenchContributionInput\n): WorkbenchContribution {\n const nodeStateSource = createAgentGuiWorkbenchNodeStateSource({\n workspaceId: input.workspaceId\n });\n const frame = input.frame ?? agentGuiWorkbenchDefaultNodeFrame;\n const copy = resolveAgentGuiWorkbenchContributionCopy(input.copy);\n\n return {\n dockEntries: agentGuiWorkbenchProviders.map((provider, index) =>\n createAgentGuiWorkbenchDockEntry({\n label: agentGuiWorkbenchProviderLabels[provider],\n iconUrl:\n input.dockIconUrls?.[provider] ?? agentGuiDockIconUrls[provider],\n order: index,\n provider,\n renderPreview: input.renderPreview,\n resolveDockPopupTitle: input.resolveDockPopupTitle,\n sectionId: input.dockSectionId ?? \"agents\",\n visibility:\n input.resolveDockEntryVisibility?.(provider) ??\n (isAgentGuiWorkbenchDefaultDockProvider(provider)\n ? \"always\"\n : \"never\")\n })\n ),\n externalStateSource: nodeStateSource.externalStateSource,\n id: input.id ?? \"workspace-agent-gui\",\n nodes: [\n {\n frame,\n instance: { mode: \"multi\" },\n renderBody: (context) =>\n input.renderBody(\n context as WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n {\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: (state) => {\n nodeStateSource.writeNodeState({\n instanceId: context.instanceId,\n nodeId: context.node.id,\n state,\n typeId: agentGuiWorkbenchTypeId\n });\n },\n provider: agentGuiWorkbenchProviderFromInstanceId(\n context.instanceId\n )\n }\n ),\n renderHeader: ({\n defaultActions,\n dragHandleProps,\n externalNodeState,\n instanceId,\n isFocused,\n node,\n surfaceSize,\n windowActions\n }) => {\n const provider = agentGuiWorkbenchProviderFromInstanceId(instanceId);\n const providerTitle = resolveAgentGuiWorkbenchProviderLabel(provider);\n const rawWorkbenchState = (externalNodeState ??\n node.data.runtimeNodeState) as\n | Partial<AgentGuiWorkbenchNodeState>\n | null\n | undefined;\n const workbenchState =\n normalizeAgentGuiWorkbenchState(rawWorkbenchState);\n const nodeState = normalizeAgentGuiWorkbenchNodeState(\n rawWorkbenchState,\n provider\n );\n const isConversationRailAutoCollapsed =\n shouldAutoCollapseAgentGUIConversationRail(node.frame.width);\n const isConversationRailCollapsed =\n nodeState.conversationRailCollapsed === true ||\n isConversationRailAutoCollapsed;\n const persistConversationRailCollapsed = (collapsed: boolean) => {\n nodeStateSource.writeNodeState({\n instanceId,\n nodeId: node.id,\n state: {\n ...workbenchState,\n conversationRailCollapsed: collapsed\n },\n typeId: agentGuiWorkbenchTypeId\n });\n };\n const announceConversationRailCollapsed = (collapsed: boolean) => {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchConversationRailToggleDetail>(\n AGENT_GUI_WORKBENCH_CONVERSATION_RAIL_TOGGLE_EVENT,\n {\n detail: {\n conversationRailCollapsed: collapsed,\n instanceId\n }\n }\n )\n );\n };\n const announceNewConversation = () => {\n window.dispatchEvent(\n new CustomEvent<AgentGuiWorkbenchNewConversationDetail>(\n AGENT_GUI_WORKBENCH_NEW_CONVERSATION_EVENT,\n {\n detail: {\n instanceId\n }\n }\n )\n );\n };\n\n return createElement(AgentGuiWorkbenchHeader, {\n copy,\n conversationTitle: isConversationRailCollapsed\n ? (input.resolveDockPopupTitle?.(workbenchState) ??\n nodeState.lastActiveConversationTitle ??\n null)\n : null,\n defaultActions,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n title: providerTitle,\n ...dragHandleProps,\n onCreateConversation: announceNewConversation,\n onPointerDown: (event) => {\n dragHandleProps.onPointerDown?.(event);\n if (!isFocused) {\n windowActions.focus();\n }\n },\n onToggleConversationRail: (nextCollapsed) => {\n announceConversationRailCollapsed(nextCollapsed);\n if (\n isConversationRailCollapsed &&\n nextCollapsed === false &&\n node.displayMode !== \"fullscreen\"\n ) {\n const expandedFrame = resolveAgentGUIExpandedWindowFrame({\n conversationRailWidthPx: nodeState.conversationRailWidthPx,\n desktopSize: surfaceSize,\n height: node.frame.height,\n position: {\n x: node.frame.x,\n y: node.frame.y\n },\n width: node.frame.width\n });\n\n windowActions.resize({\n ...node.frame,\n height: expandedFrame.size.height,\n width: expandedFrame.size.width,\n x: expandedFrame.position.x,\n y: expandedFrame.position.y\n });\n }\n\n persistConversationRailCollapsed(nextCollapsed);\n }\n });\n },\n title: copy.nodeTitle,\n typeId: agentGuiWorkbenchTypeId,\n window: {\n closable: true,\n defaultOpen: false,\n minimizedDock: {\n kind: \"snapshot\"\n },\n minimizable: true\n }\n }\n ],\n onLaunchRequest: (request) => {\n if (request.typeId !== agentGuiWorkbenchTypeId) {\n return null;\n }\n\n const {\n activation,\n dockEntryId,\n instanceId,\n provider,\n reuseDockEntryNode,\n targetAgentSessionId\n } = createAgentGuiWorkbenchLaunchDescriptor(request);\n const title = resolveAgentGuiWorkbenchProviderLabel(provider);\n if (targetAgentSessionId) {\n const previousState = nodeStateSource.readNodeState({\n instanceId,\n typeId: agentGuiWorkbenchTypeId\n });\n nodeStateSource.writeNodeState({\n instanceId,\n state: {\n ...normalizeAgentGuiWorkbenchState(previousState),\n ...(targetAgentSessionId\n ? { lastActiveAgentSessionId: targetAgentSessionId }\n : {})\n },\n typeId: agentGuiWorkbenchTypeId\n });\n }\n const defaultFrame = resolveAgentGuiWorkbenchDefaultLaunchFrame({\n frame,\n request\n });\n return {\n activation,\n defaultFrame,\n dockEntryId,\n framePolicy: isAgentGuiWorkbenchCompactVisibleFrame(defaultFrame, frame)\n ? \"absolute\"\n : \"cascade-same-type-centered\",\n instanceId,\n reuseDockEntryNode,\n title,\n typeId: agentGuiWorkbenchTypeId\n };\n }\n };\n}\n\nexport function resolveAgentGuiWorkbenchDefaultLaunchFrame(input: {\n frame: WorkbenchFrame;\n request: Pick<\n WorkbenchHostLaunchRequest,\n \"layoutConstraints\" | \"surfaceSize\"\n >;\n}): WorkbenchFrame {\n const layoutFrame = getWorkbenchLayoutFrame(\n input.request.surfaceSize,\n input.request.layoutConstraints\n );\n const defaultHeight = Math.round(\n layoutFrame.height * agentGuiWorkbenchDefaultUsableHeightRatio\n );\n const shouldUseCompactWidth = layoutFrame.width < input.frame.width;\n const shouldUseCompactHeight =\n layoutFrame.height <\n input.frame.height / agentGuiWorkbenchCompactVisibleAreaRatio;\n\n if (shouldUseCompactWidth || shouldUseCompactHeight) {\n const width = shouldUseCompactWidth\n ? Math.round(layoutFrame.width * agentGuiWorkbenchCompactVisibleAreaRatio)\n : input.frame.width;\n const height = Math.round(\n layoutFrame.height * agentGuiWorkbenchCompactVisibleAreaRatio\n );\n\n return {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n };\n }\n\n return {\n ...input.frame,\n height: defaultHeight\n };\n}\n\nfunction isAgentGuiWorkbenchCompactVisibleFrame(\n frame: WorkbenchFrame,\n defaultFrame: WorkbenchFrame\n): boolean {\n return frame.width !== defaultFrame.width || frame.x !== defaultFrame.x;\n}\n\nexport function resolveAgentGuiWorkbenchContributionCopy(\n copy?: AgentGuiWorkbenchContributionCopyOverrides\n): AgentGuiWorkbenchContributionCopy {\n return {\n ...agentGuiWorkbenchDefaultCopy,\n ...copy\n };\n}\n\nfunction createAgentGuiWorkbenchDockEntry(input: {\n iconUrl?: string;\n label: string;\n order: number;\n provider: AgentGuiWorkbenchProvider;\n renderPreview?: CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId: string;\n visibility: WorkbenchHostDockEntry[\"visibility\"];\n}): WorkbenchHostDockEntry {\n return {\n icon: createElement(\"img\", {\n alt: \"\",\n draggable: false,\n src: input.iconUrl\n }),\n iconSize: \"large\",\n id: agentGuiWorkbenchDockEntryId(input.provider),\n label: input.label,\n launchBehavior: \"enabled\",\n launchPayload: { provider: input.provider },\n matchNode: (node) =>\n node.data.typeId === agentGuiWorkbenchTypeId &&\n agentGuiWorkbenchProviderFromIdentifier(node.data.instanceId) ===\n input.provider,\n order: input.order,\n providePopupItemPreview: (item) => {\n if (!input.renderPreview) {\n return null;\n }\n const { externalNodeState, node } = item;\n const state = normalizeAgentGuiWorkbenchState(externalNodeState);\n const title = input.resolveDockPopupTitle?.(state) ?? node.title;\n const lines = [input.label, state.lastActiveAgentSessionId].filter(\n (line): line is string => Boolean(line?.trim())\n );\n const revision = `${input.provider}\\n${title}\\n${lines.join(\"\\n\")}`;\n return {\n element: input.renderPreview(\n createAgentGuiWorkbenchPreviewBodyContext(item),\n {\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: () => undefined,\n provider: input.provider\n }\n ),\n kind: \"component\",\n revision\n };\n },\n resolvePopupItem: ({ externalNodeState }) => {\n const title =\n input.resolveDockPopupTitle?.(\n normalizeAgentGuiWorkbenchState(externalNodeState)\n ) ?? null;\n return {\n revision: `${input.provider}\\n${title ?? \"\"}`,\n title\n };\n },\n sectionId: input.sectionId,\n typeId: agentGuiWorkbenchTypeId,\n visibility: input.visibility\n };\n}\n\nfunction createAgentGuiWorkbenchPreviewBodyContext(\n input: WorkbenchHostDockPopupItemInput\n): WorkbenchHostNodeBodyContext<AgentGuiWorkbenchState | null, unknown> {\n return {\n activation: null,\n displayMode: input.node.displayMode,\n externalNodeState: input.externalNodeState as AgentGuiWorkbenchState | null,\n externalWorkspaceState: input.externalWorkspaceState,\n focus: () => undefined,\n host: input.host,\n instanceId: input.node.data.instanceId,\n instanceKey: input.node.data.instanceKey ?? null,\n isFocused: false,\n node: input.node,\n setNodeRuntimeState: () => undefined,\n setSnapshotNodeState: () => undefined\n };\n}\n","import { createElement, type HTMLAttributes, type ReactNode } from \"react\";\nimport { Button, PanelIcon, cn } from \"@tutti-os/ui-system\";\nimport { EditIcon } from \"@tutti-os/ui-system/icons\";\n\nexport interface AgentGuiWorkbenchHeaderCopy {\n collapseConversationRail: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n newConversation: string;\n}\n\nexport interface AgentGuiWorkbenchHeaderProps extends HTMLAttributes<HTMLElement> {\n copy: AgentGuiWorkbenchHeaderCopy;\n defaultActions?: ReactNode;\n isConversationRailAutoCollapsed: boolean;\n isConversationRailCollapsed: boolean;\n conversationTitle?: string | null;\n onCreateConversation?: () => void;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n title?: string;\n}\n\nexport function AgentGuiWorkbenchHeader({\n className,\n copy,\n defaultActions,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n conversationTitle,\n onCreateConversation,\n onToggleConversationRail,\n title,\n ...headerProps\n}: AgentGuiWorkbenchHeaderProps): ReactNode {\n const toggleLabel = isConversationRailCollapsed\n ? copy.expandConversationRail\n : copy.collapseConversationRail;\n const appTitle = title?.trim() || copy.fallbackAgentLabel;\n const sessionTitle = conversationTitle?.trim() || \"\";\n\n return createElement(\n \"header\",\n {\n ...headerProps,\n className: cn(\n \"flex h-full min-h-0 items-center justify-between gap-3 bg-[var(--background-panel)] px-2 pl-3\",\n className\n )\n },\n createElement(\n \"div\",\n { className: \"flex min-w-0 flex-1 items-center gap-1\" },\n createElement(\n \"span\",\n {\n className:\n \"shrink-0 truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\"\n },\n appTitle\n ),\n createElement(\n Button as never,\n {\n \"aria-label\": toggleLabel,\n className: \"cursor-pointer rounded-md\",\n \"data-agent-gui-conversation-rail-auto-collapsed\":\n isConversationRailAutoCollapsed ? \"true\" : undefined,\n \"data-agent-gui-conversation-rail-collapsed\":\n isConversationRailCollapsed ? \"true\" : undefined,\n \"data-testid\": \"agent-gui-toggle-conversation-rail\",\n size: \"icon-xs\",\n title: toggleLabel,\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onToggleConversationRail(!isConversationRailCollapsed);\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(PanelIcon, { className: \"size-[18px]\" })\n ),\n isConversationRailCollapsed && onCreateConversation\n ? createElement(\n Button as never,\n {\n \"aria-label\": copy.newConversation,\n className: \"cursor-pointer rounded-md\",\n size: \"icon-xs\",\n title: copy.newConversation,\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onCreateConversation();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(EditIcon, {\n \"aria-hidden\": true,\n className: \"size-[16px]\"\n })\n )\n : null,\n isConversationRailCollapsed && sessionTitle\n ? createElement(\n \"span\",\n {\n className:\n \"min-w-0 max-w-[360px] flex-1 truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\"\n },\n sessionTitle\n )\n : null\n ),\n createElement(\n \"div\",\n {\n className: \"flex flex-none items-center gap-1\",\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n defaultActions\n )\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,iBAAAA,sBAAqC;AAC9C;AAAA,EACE;AAAA,OAOK;;;ACTP,SAAS,qBAA0D;AACnE,SAAS,QAAQ,WAAW,UAAU;AACtC,SAAS,gBAAgB;AAoBlB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4C;AAC1C,QAAM,cAAc,8BAChB,KAAK,yBACL,KAAK;AACT,QAAM,WAAW,OAAO,KAAK,KAAK,KAAK;AACvC,QAAM,eAAe,mBAAmB,KAAK,KAAK;AAElD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,EAAE,WAAW,yCAAyC;AAAA,MACtD;AAAA,QACE;AAAA,QACA;AAAA,UACE,WACE;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,UACE,cAAc;AAAA,UACd,WAAW;AAAA,UACX,mDACE,kCAAkC,SAAS;AAAA,UAC7C,8CACE,8BAA8B,SAAS;AAAA,UACzC,eAAe;AAAA,UACf,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,CAAC,UAAU;AAClB,kBAAM,gBAAgB;AACtB,qCAAyB,CAAC,2BAA2B;AAAA,UACvD;AAAA,UACA,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAChD,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,QAClD;AAAA,QACA,cAAc,WAAW,EAAE,WAAW,cAAc,CAAC;AAAA,MACvD;AAAA,MACA,+BAA+B,uBAC3B;AAAA,QACE;AAAA,QACA;AAAA,UACE,cAAc,KAAK;AAAA,UACnB,WAAW;AAAA,UACX,MAAM;AAAA,UACN,OAAO,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS,CAAC,UAAU;AAClB,kBAAM,gBAAgB;AACtB,iCAAqB;AAAA,UACvB;AAAA,UACA,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,UAChD,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,QAClD;AAAA,QACA,cAAc,UAAU;AAAA,UACtB,eAAe;AAAA,UACf,WAAW;AAAA,QACb,CAAC;AAAA,MACH,IACA;AAAA,MACJ,+BAA+B,eAC3B;AAAA,QACE;AAAA,QACA;AAAA,UACE,WACE;AAAA,QACJ;AAAA,QACA;AAAA,MACF,IACA;AAAA,IACN;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,QACE,WAAW;AAAA,QACX,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,QAChD,eAAe,CAAC,UAAU,MAAM,gBAAgB;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ADvFO,IAAM,oCAAoD;AAAA,EAC/D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,GAAG;AAAA,EACH,GAAG;AACL;AAEO,IAAM,4CAA4C;AAClD,IAAM,2CAA2C;AAEjD,IAAM,qDACX;AAEK,IAAM,6CACX;AAsBK,IAAM,+BAAkE;AAAA,EAC7E,0BAA0B;AAAA,EAC1B,wBAAwB;AAAA,EACxB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,WAAW;AACb;AAqCO,SAAS,oCACd,OACuB;AACvB,QAAM,kBAAkB,uCAAuC;AAAA,IAC7D,aAAa,MAAM;AAAA,EACrB,CAAC;AACD,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,OAAO,yCAAyC,MAAM,IAAI;AAEhE,SAAO;AAAA,IACL,aAAa,2BAA2B;AAAA,MAAI,CAAC,UAAU,UACrD,iCAAiC;AAAA,QAC/B,OAAO,gCAAgC,QAAQ;AAAA,QAC/C,SACE,MAAM,eAAe,QAAQ,KAAK,qBAAqB,QAAQ;AAAA,QACjE,OAAO;AAAA,QACP;AAAA,QACA,eAAe,MAAM;AAAA,QACrB,uBAAuB,MAAM;AAAA,QAC7B,WAAW,MAAM,iBAAiB;AAAA,QAClC,YACE,MAAM,6BAA6B,QAAQ,MAC1C,uCAAuC,QAAQ,IAC5C,WACA;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACA,qBAAqB,gBAAgB;AAAA,IACrC,IAAI,MAAM,MAAM;AAAA,IAChB,OAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,UAAU,EAAE,MAAM,QAAQ;AAAA,QAC1B,YAAY,CAAC,YACX,MAAM;AAAA,UACJ;AAAA,UAIA;AAAA,YACE,YAAY;AAAA,YACZ,eAAe,CAAC,UAAU;AACxB,8BAAgB,eAAe;AAAA,gBAC7B,YAAY,QAAQ;AAAA,gBACpB,QAAQ,QAAQ,KAAK;AAAA,gBACrB;AAAA,gBACA,QAAQ;AAAA,cACV,CAAC;AAAA,YACH;AAAA,YACA,UAAU;AAAA,cACR,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,QACF,cAAc,CAAC;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,MAAM;AACJ,gBAAM,WAAW,wCAAwC,UAAU;AACnE,gBAAM,gBAAgB,sCAAsC,QAAQ;AACpE,gBAAM,oBAAqB,qBACzB,KAAK,KAAK;AAIZ,gBAAM,iBACJ,gCAAgC,iBAAiB;AACnD,gBAAM,YAAY;AAAA,YAChB;AAAA,YACA;AAAA,UACF;AACA,gBAAM,kCACJ,2CAA2C,KAAK,MAAM,KAAK;AAC7D,gBAAM,8BACJ,UAAU,8BAA8B,QACxC;AACF,gBAAM,mCAAmC,CAAC,cAAuB;AAC/D,4BAAgB,eAAe;AAAA,cAC7B;AAAA,cACA,QAAQ,KAAK;AAAA,cACb,OAAO;AAAA,gBACL,GAAG;AAAA,gBACH,2BAA2B;AAAA,cAC7B;AAAA,cACA,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AACA,gBAAM,oCAAoC,CAAC,cAAuB;AAChE,mBAAO;AAAA,cACL,IAAI;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,QAAQ;AAAA,oBACN,2BAA2B;AAAA,oBAC3B;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,gBAAM,0BAA0B,MAAM;AACpC,mBAAO;AAAA,cACL,IAAI;AAAA,gBACF;AAAA,gBACA;AAAA,kBACE,QAAQ;AAAA,oBACN;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,iBAAOC,eAAc,yBAAyB;AAAA,YAC5C;AAAA,YACA,mBAAmB,8BACd,MAAM,wBAAwB,cAAc,KAC7C,UAAU,+BACV,OACA;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACP,GAAG;AAAA,YACH,sBAAsB;AAAA,YACtB,eAAe,CAAC,UAAU;AACxB,8BAAgB,gBAAgB,KAAK;AACrC,kBAAI,CAAC,WAAW;AACd,8BAAc,MAAM;AAAA,cACtB;AAAA,YACF;AAAA,YACA,0BAA0B,CAAC,kBAAkB;AAC3C,gDAAkC,aAAa;AAC/C,kBACE,+BACA,kBAAkB,SAClB,KAAK,gBAAgB,cACrB;AACA,sBAAM,gBAAgB,mCAAmC;AAAA,kBACvD,yBAAyB,UAAU;AAAA,kBACnC,aAAa;AAAA,kBACb,QAAQ,KAAK,MAAM;AAAA,kBACnB,UAAU;AAAA,oBACR,GAAG,KAAK,MAAM;AAAA,oBACd,GAAG,KAAK,MAAM;AAAA,kBAChB;AAAA,kBACA,OAAO,KAAK,MAAM;AAAA,gBACpB,CAAC;AAED,8BAAc,OAAO;AAAA,kBACnB,GAAG,KAAK;AAAA,kBACR,QAAQ,cAAc,KAAK;AAAA,kBAC3B,OAAO,cAAc,KAAK;AAAA,kBAC1B,GAAG,cAAc,SAAS;AAAA,kBAC1B,GAAG,cAAc,SAAS;AAAA,gBAC5B,CAAC;AAAA,cACH;AAEA,+CAAiC,aAAa;AAAA,YAChD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN,UAAU;AAAA,UACV,aAAa;AAAA,UACb,eAAe;AAAA,YACb,MAAM;AAAA,UACR;AAAA,UACA,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,IACA,iBAAiB,CAAC,YAAY;AAC5B,UAAI,QAAQ,WAAW,yBAAyB;AAC9C,eAAO;AAAA,MACT;AAEA,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI,wCAAwC,OAAO;AACnD,YAAM,QAAQ,sCAAsC,QAAQ;AAC5D,UAAI,sBAAsB;AACxB,cAAM,gBAAgB,gBAAgB,cAAc;AAAA,UAClD;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AACD,wBAAgB,eAAe;AAAA,UAC7B;AAAA,UACA,OAAO;AAAA,YACL,GAAG,gCAAgC,aAAa;AAAA,YAChD,GAAI,uBACA,EAAE,0BAA0B,qBAAqB,IACjD,CAAC;AAAA,UACP;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,YAAM,eAAe,2CAA2C;AAAA,QAC9D;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,uCAAuC,cAAc,KAAK,IACnE,aACA;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,2CAA2C,OAMxC;AACjB,QAAM,cAAc;AAAA,IAClB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,EAChB;AACA,QAAM,gBAAgB,KAAK;AAAA,IACzB,YAAY,SAAS;AAAA,EACvB;AACA,QAAM,wBAAwB,YAAY,QAAQ,MAAM,MAAM;AAC9D,QAAM,yBACJ,YAAY,SACZ,MAAM,MAAM,SAAS;AAEvB,MAAI,yBAAyB,wBAAwB;AACnD,UAAM,QAAQ,wBACV,KAAK,MAAM,YAAY,QAAQ,wCAAwC,IACvE,MAAM,MAAM;AAChB,UAAM,SAAS,KAAK;AAAA,MAClB,YAAY,SAAS;AAAA,IACvB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG,KAAK,MAAM,YAAY,KAAK,YAAY,QAAQ,SAAS,CAAC;AAAA,MAC7D,GAAG,KAAK,MAAM,YAAY,KAAK,YAAY,SAAS,UAAU,CAAC;AAAA,IACjE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG,MAAM;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,uCACP,OACA,cACS;AACT,SAAO,MAAM,UAAU,aAAa,SAAS,MAAM,MAAM,aAAa;AACxE;AAEO,SAAS,yCACd,MACmC;AACnC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAEA,SAAS,iCAAiC,OASf;AACzB,SAAO;AAAA,IACL,MAAMA,eAAc,OAAO;AAAA,MACzB,KAAK;AAAA,MACL,WAAW;AAAA,MACX,KAAK,MAAM;AAAA,IACb,CAAC;AAAA,IACD,UAAU;AAAA,IACV,IAAI,6BAA6B,MAAM,QAAQ;AAAA,IAC/C,OAAO,MAAM;AAAA,IACb,gBAAgB;AAAA,IAChB,eAAe,EAAE,UAAU,MAAM,SAAS;AAAA,IAC1C,WAAW,CAAC,SACV,KAAK,KAAK,WAAW,2BACrB,wCAAwC,KAAK,KAAK,UAAU,MAC1D,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,IACb,yBAAyB,CAAC,SAAS;AACjC,UAAI,CAAC,MAAM,eAAe;AACxB,eAAO;AAAA,MACT;AACA,YAAM,EAAE,mBAAmB,KAAK,IAAI;AACpC,YAAM,QAAQ,gCAAgC,iBAAiB;AAC/D,YAAM,QAAQ,MAAM,wBAAwB,KAAK,KAAK,KAAK;AAC3D,YAAM,QAAQ,CAAC,MAAM,OAAO,MAAM,wBAAwB,EAAE;AAAA,QAC1D,CAAC,SAAyB,QAAQ,MAAM,KAAK,CAAC;AAAA,MAChD;AACA,YAAM,WAAW,GAAG,MAAM,QAAQ;AAAA,EAAK,KAAK;AAAA,EAAK,MAAM,KAAK,IAAI,CAAC;AACjE,aAAO;AAAA,QACL,SAAS,MAAM;AAAA,UACb,0CAA0C,IAAI;AAAA,UAC9C;AAAA,YACE,YAAY;AAAA,YACZ,eAAe,MAAM;AAAA,YACrB,UAAU,MAAM;AAAA,UAClB;AAAA,QACF;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,IACA,kBAAkB,CAAC,EAAE,kBAAkB,MAAM;AAC3C,YAAM,QACJ,MAAM;AAAA,QACJ,gCAAgC,iBAAiB;AAAA,MACnD,KAAK;AACP,aAAO;AAAA,QACL,UAAU,GAAG,MAAM,QAAQ;AAAA,EAAK,SAAS,EAAE;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,QAAQ;AAAA,IACR,YAAY,MAAM;AAAA,EACpB;AACF;AAEA,SAAS,0CACP,OACsE;AACtE,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,aAAa,MAAM,KAAK;AAAA,IACxB,mBAAmB,MAAM;AAAA,IACzB,wBAAwB,MAAM;AAAA,IAC9B,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,YAAY,MAAM,KAAK,KAAK;AAAA,IAC5B,aAAa,MAAM,KAAK,KAAK,eAAe;AAAA,IAC5C,WAAW;AAAA,IACX,MAAM,MAAM;AAAA,IACZ,qBAAqB,MAAM;AAAA,IAC3B,sBAAsB,MAAM;AAAA,EAC9B;AACF;","names":["createElement","createElement"]}
@@ -7,4 +7,4 @@ var AGENT_CONTEXT_MENTION_PROVIDER_IDS = TUTTI_EXTERNAL_AT_PROVIDER_IDS;
7
7
  export {
8
8
  AGENT_CONTEXT_MENTION_PROVIDER_IDS
9
9
  };
10
- //# sourceMappingURL=chunk-YXSO4ITT.js.map
10
+ //# sourceMappingURL=chunk-HIREVEZM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../agent-gui/agentGuiNode/agentContextMentionProvider.ts"],"sourcesContent":["import type {\n RichTextTriggerProvider,\n RichTextTriggerQueryInput\n} from \"@tutti-os/ui-rich-text/types\";\nimport {\n TUTTI_EXTERNAL_AT_PROVIDER_IDS,\n type TuttiExternalAtProviderId\n} from \"@tutti-os/workspace-external-core/contracts\";\n\nexport const AGENT_CONTEXT_MENTION_PROVIDER_IDS =\n TUTTI_EXTERNAL_AT_PROVIDER_IDS;\n\nexport type AgentContextMentionProviderId = TuttiExternalAtProviderId;\n\nexport type AgentContextMentionQueryInput = RichTextTriggerQueryInput & {\n trigger: \"@\";\n};\n\nexport interface AgentContextMentionPresentation {\n agentProviderId?: string;\n agentIconUrl?: string;\n iconUrl?: string;\n thumbnailUrl?: string;\n subtitle?: string;\n description?: string;\n participant?: string;\n status?: string;\n statusDataStatus?: string;\n statusLabel?: string;\n statusPulse?: string;\n userAvatarPlaceholderUrl?: string;\n /**\n * 应用是否能够提供产物文件(reference)。\"true\" 表示支持,缺省/其它值表示不支持。\n * 仅用于 @ 面板行末尾「查看产物文件」入口的展示判断,不持久化到 mention 节点。\n */\n referencesListSupported?: string;\n}\n\nexport type AgentContextMentionInsertResult =\n | {\n kind: \"mention\";\n mention: {\n entityId: string;\n label: string;\n scope?: Readonly<Record<string, string>>;\n presentation?: AgentContextMentionPresentation;\n };\n }\n | {\n kind: \"markdown-link\";\n label: string;\n href: string;\n }\n | {\n kind: \"text\";\n text: string;\n };\n\nexport type AgentContextMentionProvider<TItem = any> = Omit<\n RichTextTriggerProvider<TItem>,\n \"toInsertResult\"\n> & {\n trigger: \"@\";\n toInsertResult: (item: TItem) => AgentContextMentionInsertResult;\n getItemIconUrl?: (\n item: TItem\n ) => string | null | undefined | Promise<string | null | undefined>;\n};\n"],"mappings":";AAIA;AAAA,EACE;AAAA,OAEK;AAEA,IAAM,qCACX;","names":[]}
@@ -6,4 +6,4 @@ export {
6
6
  agentGuiWorkbenchOpenSessionActivationType,
7
7
  agentGuiWorkbenchPrefillPromptActivationType
8
8
  };
9
- //# sourceMappingURL=chunk-VDNMTW2E.js.map
9
+ //# sourceMappingURL=chunk-IXIGWLQY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/types.ts"],"sourcesContent":["export type AgentGuiWorkbenchProvider =\n | \"claude-code\"\n | \"codex\"\n | \"nexight\"\n | \"gemini\"\n | \"hermes\"\n | \"openclaw\";\n\nexport const agentGuiWorkbenchOpenSessionActivationType =\n \"agent-gui:open-session\";\n\nexport const agentGuiWorkbenchPrefillPromptActivationType =\n \"agent-gui:prefill-prompt\";\n\nexport interface AgentGuiWorkbenchPrefillPromptPayload {\n autoSubmit?: boolean;\n draftPrompt: string;\n userProjectPath?: string | null;\n}\n\nexport interface AgentGuiWorkbenchComposerOverrides {\n model?: string | null;\n permissionModeId?: string | null;\n planMode?: boolean;\n reasoningEffort?: string | null;\n}\n\nexport type AgentGuiWorkbenchComposerOverridesByProvider = Partial<\n Record<AgentGuiWorkbenchProvider, AgentGuiWorkbenchComposerOverrides | null>\n>;\n\nexport interface AgentGuiWorkbenchNodeState {\n composerOverrides?: AgentGuiWorkbenchComposerOverrides | null;\n composerOverridesByProvider?: AgentGuiWorkbenchComposerOverridesByProvider | null;\n conversationCount?: number | null;\n conversationRailCollapsed?: boolean | null;\n conversationRailWidthPx?: number | null;\n lastActiveAgentSessionId: string | null;\n /** @deprecated Conversation titles are derived from the active session id. */\n lastActiveConversationTitle?: string | null;\n provider: AgentGuiWorkbenchProvider;\n}\n\nexport interface AgentGuiWorkbenchState {\n composerOverrides?: AgentGuiWorkbenchComposerOverrides | null;\n composerOverridesByProvider?: AgentGuiWorkbenchComposerOverridesByProvider | null;\n conversationRailCollapsed?: boolean | null;\n conversationRailWidthPx?: number | null;\n lastActiveAgentSessionId: string | null;\n /** @deprecated Conversation titles are derived from the active session id. */\n lastActiveConversationTitle?: string | null;\n}\n\nexport interface AgentGuiWorkbenchWorkspaceState {\n workspaceId: string;\n}\n"],"mappings":";AAQO,IAAM,6CACX;AAEK,IAAM,+CACX;","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  agentGuiWorkbenchOpenSessionActivationType,
7
7
  agentGuiWorkbenchPrefillPromptActivationType
8
- } from "./chunk-VDNMTW2E.js";
8
+ } from "./chunk-IXIGWLQY.js";
9
9
 
10
10
  // workbench/launch.ts
11
11
  var agentGuiWorkbenchTypeId = "agent-gui";
@@ -72,6 +72,7 @@ function createAgentGuiWorkbenchDraftLaunchRequest(input) {
72
72
  payload: {
73
73
  draftPrompt: input.draftPrompt,
74
74
  provider,
75
+ ...input.autoSubmit ? { autoSubmit: true } : {},
75
76
  ...userProjectPath ? { userProjectPath } : {}
76
77
  },
77
78
  reason: "host",
@@ -109,7 +110,7 @@ function createAgentGuiWorkbenchLaunchDescriptor(request) {
109
110
  dockEntryId: request.dockEntryId ?? agentGuiWorkbenchDockEntryId(provider),
110
111
  instanceId,
111
112
  provider,
112
- reuseDockEntryNode: Boolean(targetAgentSessionId),
113
+ reuseDockEntryNode: false,
113
114
  targetAgentSessionId
114
115
  };
115
116
  }
@@ -124,10 +125,12 @@ function prefillPromptFromLaunchPayload(payload) {
124
125
  if (typeof draftPrompt !== "string" || !draftPrompt.trim()) {
125
126
  return null;
126
127
  }
128
+ const autoSubmit = payload.autoSubmit === true;
127
129
  const userProjectPath = payload.userProjectPath;
128
130
  const normalizedUserProjectPath = typeof userProjectPath === "string" ? normalizeAgentGuiWorkbenchUserProjectPath(userProjectPath) : null;
129
131
  return {
130
132
  draftPrompt,
133
+ ...autoSubmit ? { autoSubmit: true } : {},
131
134
  ...normalizedUserProjectPath ? { userProjectPath: normalizedUserProjectPath } : {}
132
135
  };
133
136
  }
@@ -154,4 +157,4 @@ export {
154
157
  createAgentGuiWorkbenchDraftLaunchRequest,
155
158
  createAgentGuiWorkbenchLaunchDescriptor
156
159
  };
157
- //# sourceMappingURL=chunk-ZO3SZCIX.js.map
160
+ //# sourceMappingURL=chunk-JNGYJ7GM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/launch.ts"],"sourcesContent":["import type { WorkbenchHostLaunchRequest } from \"@tutti-os/workbench-surface\";\nimport {\n isAgentGuiWorkbenchProvider,\n normalizeAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport {\n agentGuiWorkbenchOpenSessionActivationType,\n agentGuiWorkbenchPrefillPromptActivationType,\n type AgentGuiWorkbenchPrefillPromptPayload,\n type AgentGuiWorkbenchProvider\n} from \"./types.ts\";\n\nexport { agentGuiWorkbenchPrefillPromptActivationType } from \"./types.ts\";\n\ntype AgentGuiWorkbenchLaunchRequestInput = Pick<\n WorkbenchHostLaunchRequest,\n \"payload\" | \"typeId\"\n> & {\n dockEntryId?: string | null;\n};\n\nexport const agentGuiWorkbenchTypeId = \"agent-gui\";\n\nconst agentGuiWorkbenchDockEntryPrefix = \"agent-gui:\";\nlet agentGuiWorkbenchInstanceSequence = 0;\n\nexport function agentGuiWorkbenchDockEntryId(\n provider: AgentGuiWorkbenchProvider\n): string {\n return provider === \"codex\"\n ? agentGuiWorkbenchTypeId\n : `${agentGuiWorkbenchDockEntryPrefix}${provider}`;\n}\n\nexport function agentGuiWorkbenchInstanceId(\n provider: AgentGuiWorkbenchProvider\n): string {\n return `${agentGuiWorkbenchDockEntryPrefix}${provider}`;\n}\n\nexport function createAgentGuiWorkbenchInstanceId(input: {\n agentSessionId?: string | null;\n provider: AgentGuiWorkbenchProvider;\n}): string {\n const prefix = agentGuiWorkbenchInstanceId(input.provider);\n const agentSessionId = input.agentSessionId?.trim();\n if (agentSessionId) {\n return `${prefix}:session:${encodeAgentGuiWorkbenchInstanceSegment(\n agentSessionId\n )}`;\n }\n\n agentGuiWorkbenchInstanceSequence += 1;\n return [\n prefix,\n \"panel\",\n `${Date.now().toString(36)}-${agentGuiWorkbenchInstanceSequence.toString(36)}`\n ].join(\":\");\n}\n\nexport function agentGuiWorkbenchProviderFromIdentifier(\n value: string | null | undefined\n): AgentGuiWorkbenchProvider | null {\n const normalized = value?.trim();\n if (!normalized || normalized === agentGuiWorkbenchTypeId) {\n return normalized === agentGuiWorkbenchTypeId ? \"codex\" : null;\n }\n if (!normalized.startsWith(agentGuiWorkbenchDockEntryPrefix)) {\n return null;\n }\n const provider = normalized\n .slice(agentGuiWorkbenchDockEntryPrefix.length)\n .split(\":\", 1)[0];\n return isAgentGuiWorkbenchProvider(provider) ? provider : null;\n}\n\nexport function agentGuiWorkbenchProviderFromLaunchRequest(\n request: AgentGuiWorkbenchLaunchRequestInput\n): AgentGuiWorkbenchProvider {\n const payloadProvider =\n request.payload &&\n typeof request.payload === \"object\" &&\n !Array.isArray(request.payload)\n ? (request.payload as { provider?: unknown }).provider\n : null;\n if (isAgentGuiWorkbenchProvider(payloadProvider)) {\n return payloadProvider;\n }\n return (\n agentGuiWorkbenchProviderFromIdentifier(request.dockEntryId) ??\n agentGuiWorkbenchProviderFromIdentifier(request.typeId) ??\n \"codex\"\n );\n}\n\nexport function createAgentGuiWorkbenchSessionLaunchRequest(input: {\n agentSessionId?: string;\n provider: unknown;\n}) {\n const provider = normalizeAgentGuiWorkbenchProvider(input.provider);\n return {\n dockEntryId: agentGuiWorkbenchDockEntryId(provider),\n payload: {\n ...(input.agentSessionId ? { agentSessionId: input.agentSessionId } : {}),\n provider\n },\n reason: \"host\" as const,\n typeId: agentGuiWorkbenchTypeId\n };\n}\n\nexport function createAgentGuiWorkbenchDraftLaunchRequest(input: {\n autoSubmit?: boolean;\n draftPrompt: string;\n provider: unknown;\n userProjectPath?: string | null;\n}) {\n const provider = normalizeAgentGuiWorkbenchProvider(input.provider);\n const userProjectPath = normalizeAgentGuiWorkbenchUserProjectPath(\n input.userProjectPath\n );\n return {\n dockEntryId: agentGuiWorkbenchDockEntryId(provider),\n payload: {\n draftPrompt: input.draftPrompt,\n provider,\n ...(input.autoSubmit ? { autoSubmit: true } : {}),\n ...(userProjectPath ? { userProjectPath } : {})\n },\n reason: \"host\" as const,\n typeId: agentGuiWorkbenchTypeId\n };\n}\n\nexport interface AgentGuiWorkbenchLaunchDescriptor {\n activation:\n | {\n payload: {\n agentSessionId: string;\n };\n type: typeof agentGuiWorkbenchOpenSessionActivationType;\n }\n | {\n payload: AgentGuiWorkbenchPrefillPromptPayload;\n type: typeof agentGuiWorkbenchPrefillPromptActivationType;\n }\n | null;\n dockEntryId: string;\n instanceId: string;\n provider: AgentGuiWorkbenchProvider;\n reuseDockEntryNode: boolean;\n targetAgentSessionId: string | null;\n}\n\nexport function createAgentGuiWorkbenchLaunchDescriptor(\n request: AgentGuiWorkbenchLaunchRequestInput\n): AgentGuiWorkbenchLaunchDescriptor {\n const provider = agentGuiWorkbenchProviderFromLaunchRequest(request);\n const prefillPrompt = prefillPromptFromLaunchPayload(request.payload);\n if (prefillPrompt) {\n return {\n activation: {\n payload: prefillPrompt,\n type: agentGuiWorkbenchPrefillPromptActivationType\n },\n dockEntryId:\n request.dockEntryId ?? agentGuiWorkbenchDockEntryId(provider),\n instanceId: createAgentGuiWorkbenchInstanceId({ provider }),\n provider,\n reuseDockEntryNode: true,\n targetAgentSessionId: null\n };\n }\n\n const targetAgentSessionId = agentSessionIdFromLaunchPayload(request.payload);\n const instanceId = createAgentGuiWorkbenchInstanceId({\n agentSessionId: targetAgentSessionId,\n provider\n });\n\n return {\n activation: targetAgentSessionId\n ? {\n payload: {\n agentSessionId: targetAgentSessionId\n },\n type: agentGuiWorkbenchOpenSessionActivationType\n }\n : null,\n dockEntryId: request.dockEntryId ?? agentGuiWorkbenchDockEntryId(provider),\n instanceId,\n provider,\n reuseDockEntryNode: false,\n targetAgentSessionId\n };\n}\n\nfunction encodeAgentGuiWorkbenchInstanceSegment(value: string): string {\n return encodeURIComponent(value.trim());\n}\n\nfunction prefillPromptFromLaunchPayload(\n payload: unknown\n): AgentGuiWorkbenchPrefillPromptPayload | null {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return null;\n }\n const draftPrompt = (payload as { draftPrompt?: unknown }).draftPrompt;\n if (typeof draftPrompt !== \"string\" || !draftPrompt.trim()) {\n return null;\n }\n const autoSubmit = (payload as { autoSubmit?: unknown }).autoSubmit === true;\n const userProjectPath = (payload as { userProjectPath?: unknown })\n .userProjectPath;\n const normalizedUserProjectPath =\n typeof userProjectPath === \"string\"\n ? normalizeAgentGuiWorkbenchUserProjectPath(userProjectPath)\n : null;\n return {\n draftPrompt,\n ...(autoSubmit ? { autoSubmit: true } : {}),\n ...(normalizedUserProjectPath\n ? { userProjectPath: normalizedUserProjectPath }\n : {})\n };\n}\n\nfunction normalizeAgentGuiWorkbenchUserProjectPath(\n value: string | null | undefined\n): string | null {\n const normalized = value?.trim().replaceAll(\"\\\\\", \"/\").replace(/\\/+$/, \"\");\n return normalized ? normalized : null;\n}\n\nfunction agentSessionIdFromLaunchPayload(payload: unknown): string | null {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return null;\n }\n const agentSessionId = (payload as { agentSessionId?: unknown })\n .agentSessionId;\n return typeof agentSessionId === \"string\" && agentSessionId.trim()\n ? agentSessionId.trim()\n : null;\n}\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  translate,
3
3
  useTranslation
4
- } from "./chunk-FSTZDNRM.js";
4
+ } from "./chunk-SIDWRR5I.js";
5
5
  import {
6
6
  resolveAgentMentionFileThumbnailUrl,
7
7
  resolveAgentMentionFileVisualKind
@@ -17,9 +17,16 @@ import { isRichTextTriggerPrefixBoundary } from "@tutti-os/ui-rich-text/editor";
17
17
  // agent-gui/agentGuiNode/agentRichText/AgentMentionNodeView.tsx
18
18
  import { useEffect, useState } from "react";
19
19
  import { NodeViewWrapper } from "@tiptap/react";
20
- import { MentionPill } from "@tutti-os/ui-system/components";
20
+ import {
21
+ MentionPill,
22
+ TruncatingPillLabel
23
+ } from "@tutti-os/ui-system/components";
21
24
  import { CloseIcon } from "@tutti-os/ui-system/icons";
22
25
  import { jsx, jsxs } from "react/jsx-runtime";
26
+ function parseFileCountAttr(value) {
27
+ const parsed = typeof value === "string" ? Number.parseInt(value.trim(), 10) : Number.NaN;
28
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
29
+ }
23
30
  function attrString(attrs, key) {
24
31
  const value = attrs[key];
25
32
  return typeof value === "string" ? value : "";
@@ -34,6 +41,9 @@ function normalizeKind(value) {
34
41
  if (value === "workspace-app") {
35
42
  return "workspace-app";
36
43
  }
44
+ if (value === "workspace-reference") {
45
+ return "workspace-reference";
46
+ }
37
47
  if (value === "workspace-app-factory") {
38
48
  return "workspace-app-factory";
39
49
  }
@@ -48,6 +58,15 @@ function buildMentionHref(resource, attrs) {
48
58
  workspaceId
49
59
  });
50
60
  }
61
+ if (resource === "workspace-reference") {
62
+ return buildAgentGenericMentionHref(resource, targetId, {
63
+ source: attrString(attrs, "source").trim(),
64
+ groupId: attrString(attrs, "groupId").trim(),
65
+ icon: attrString(attrs, "iconUrl").trim(),
66
+ count: attrString(attrs, "fileCount").trim(),
67
+ workspaceId
68
+ });
69
+ }
51
70
  if (resource === "workspace-app") {
52
71
  const appId = attrString(attrs, "appId").trim() || targetId;
53
72
  return buildAgentGenericMentionHref(resource, appId, { workspaceId });
@@ -164,6 +183,18 @@ function mentionViewModel(attrs, t) {
164
183
  label: name
165
184
  };
166
185
  }
186
+ if (kind === "workspace-reference") {
187
+ return {
188
+ ariaLabel: `${t("agentHost.agentGui.mentionKindApp")} ${name}`.trim(),
189
+ directoryPath: "",
190
+ entryKind: "",
191
+ href: href || buildMentionHref("workspace-reference", attrs),
192
+ iconUrl: attrString(attrs, "iconUrl").trim() || void 0,
193
+ kind,
194
+ label: name,
195
+ fileCount: parseFileCountAttr(attrs.fileCount)
196
+ };
197
+ }
167
198
  if (kind === "workspace-app-factory") {
168
199
  return {
169
200
  ariaLabel: `${t("agentHost.agentGui.mentionKindAppFactory")} ${name}`.trim(),
@@ -361,13 +392,13 @@ function AgentMentionNodeView(props) {
361
392
  if (mention.kind === "file") {
362
393
  return /* @__PURE__ */ jsx(AgentMentionLegacyFileNodeView, { ...props });
363
394
  }
364
- if (mention.kind === "workspace-app") {
395
+ if (mention.kind === "workspace-app" || mention.kind === "workspace-reference") {
365
396
  return /* @__PURE__ */ jsx(
366
397
  NodeViewWrapper,
367
398
  {
368
399
  as: "span",
369
400
  "aria-label": mention.ariaLabel,
370
- className: `inline-flex max-w-full align-baseline ${selected ? "is-selected" : ""}`,
401
+ className: `inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] align-baseline ${selected ? "is-selected" : ""}`,
371
402
  contentEditable: false,
372
403
  "data-agent-file-mention": "true",
373
404
  "data-agent-mention-href": mention.href,
@@ -376,7 +407,7 @@ function AgentMentionNodeView(props) {
376
407
  children: /* @__PURE__ */ jsxs(
377
408
  "span",
378
409
  {
379
- className: "group relative top-[3px] inline-flex max-w-full cursor-default items-center gap-1 overflow-hidden rounded-[4px] border border-transparent bg-transparent px-1 py-0.5 align-baseline text-[13px] font-medium leading-5 text-[var(--accent)] no-underline transition-colors hover:border-transparent hover:bg-[color-mix(in_srgb,currentColor_12%,transparent)]",
410
+ className: "group relative top-[3px] inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] cursor-pointer items-center gap-1 overflow-hidden rounded-[4px] border border-transparent bg-transparent px-1 py-0.5 align-baseline text-[13px] font-medium leading-5 text-[var(--accent)] no-underline transition-colors hover:border-transparent hover:bg-[color-mix(in_srgb,currentColor_12%,transparent)]",
380
411
  "data-agent-mention-kind": mention.kind,
381
412
  "data-slot": "mention-pill",
382
413
  children: [
@@ -417,7 +448,7 @@ function AgentMentionNodeView(props) {
417
448
  ]
418
449
  }
419
450
  ),
420
- /* @__PURE__ */ jsx("span", { className: "min-w-0 overflow-hidden text-ellipsis whitespace-nowrap", children: mention.label })
451
+ /* @__PURE__ */ jsx(TruncatingPillLabel, { tooltip: mention.label, children: mention.label })
421
452
  ]
422
453
  }
423
454
  )
@@ -428,7 +459,7 @@ function AgentMentionNodeView(props) {
428
459
  NodeViewWrapper,
429
460
  {
430
461
  as: "span",
431
- className: `inline-flex max-w-full align-baseline ${selected ? "is-selected" : ""}`,
462
+ className: `inline-flex max-w-[min(100%,var(--agent-mention-max-width,16rem))] align-baseline ${selected ? "is-selected" : ""}`,
432
463
  contentEditable: false,
433
464
  children: /* @__PURE__ */ jsx(
434
465
  MentionPill,
@@ -493,7 +524,10 @@ function createAgentFileMentionExtension(options = {}) {
493
524
  description: { default: "" },
494
525
  iconUrl: { default: "" },
495
526
  contentPreview: { default: "" },
496
- thumbnailUrl: { default: "" }
527
+ thumbnailUrl: { default: "" },
528
+ source: { default: "" },
529
+ groupId: { default: "" },
530
+ fileCount: { default: "" }
497
531
  };
498
532
  },
499
533
  parseHTML() {
@@ -531,7 +565,8 @@ function createAgentFileMentionExtension(options = {}) {
531
565
  "data-agent-file-visual-kind": resolveAgentMentionFileVisualKind(item)
532
566
  } : {},
533
567
  ...options.renderAsLink ? { href } : {},
534
- ...item.kind === "workspace-app" && item.iconUrl ? { "data-agent-mention-icon-url": item.iconUrl } : {},
568
+ ...(item.kind === "workspace-app" || item.kind === "workspace-reference") && item.iconUrl ? { "data-agent-mention-icon-url": item.iconUrl } : {},
569
+ ...item.kind === "workspace-reference" ? { "data-agent-mention-file-count": String(item.fileCount) } : {},
535
570
  ...fileThumbnailUrl ? { "data-agent-mention-thumbnail-url": fileThumbnailUrl } : {},
536
571
  class: item.kind === "file" ? "tsh-agent-object-token tsh-agent-object-token--file" : "tsh-agent-object-token tsh-agent-object-token--entity"
537
572
  }),
@@ -706,6 +741,15 @@ function buildAgentWorkspaceAppMentionHref(workspaceId, appId) {
706
741
  workspaceId
707
742
  });
708
743
  }
744
+ function buildAgentWorkspaceReferenceMentionHref(workspaceId, handle, options) {
745
+ return buildAgentGenericMentionHref2("workspace-reference", handle.id, {
746
+ workspaceId,
747
+ source: handle.source,
748
+ groupId: handle.groupId?.trim() || void 0,
749
+ icon: options?.iconUrl?.trim() || void 0,
750
+ count: options?.fileCount != null && options.fileCount > 0 ? String(options.fileCount) : void 0
751
+ });
752
+ }
709
753
  function buildAgentWorkspaceAppFactoryMentionHref(workspaceId, jobId, input) {
710
754
  const params = new URLSearchParams();
711
755
  const trimmedWorkspaceId = workspaceId?.trim() ?? "";
@@ -739,6 +783,10 @@ function formatAgentMentionMarkdown(item) {
739
783
  const label = item.name.trim().startsWith("@") ? item.name : `@${item.name}`;
740
784
  return `[${escapeMarkdownLinkLabel(label)}](${escapeMarkdownLinkTarget(item.href)})`;
741
785
  }
786
+ function parseMentionFileCount(value) {
787
+ const parsed = typeof value === "number" ? value : typeof value === "string" ? Number.parseInt(value.trim(), 10) : Number.NaN;
788
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
789
+ }
742
790
  function parseAgentMentionMarkdown(value, start = 0) {
743
791
  if (!value.startsWith("[", start)) {
744
792
  return null;
@@ -791,7 +839,7 @@ function parseAgentMentionMarkdown(value, start = 0) {
791
839
  if (!item) {
792
840
  return null;
793
841
  }
794
- if (item.kind !== "file" && !prefixedMention) {
842
+ if (item.kind !== "file" && !prefixedMention && !href.trim().toLowerCase().startsWith("mention://")) {
795
843
  return null;
796
844
  }
797
845
  return {
@@ -877,6 +925,26 @@ function parseMentionItemFromHref(input) {
877
925
  name: input.name
878
926
  };
879
927
  }
928
+ if (resource === "workspace-reference") {
929
+ if (!workspaceId) {
930
+ return null;
931
+ }
932
+ const source = url.searchParams.get("source")?.trim();
933
+ if (source !== "app" && source !== "task") {
934
+ return null;
935
+ }
936
+ return {
937
+ kind: "workspace-reference",
938
+ href,
939
+ workspaceId,
940
+ targetId,
941
+ source,
942
+ groupId: url.searchParams.get("groupId")?.trim() || void 0,
943
+ name: input.name,
944
+ iconUrl: url.searchParams.get("icon")?.trim() || void 0,
945
+ fileCount: parseMentionFileCount(url.searchParams.get("count"))
946
+ };
947
+ }
880
948
  if (resource === "workspace-app-factory") {
881
949
  return {
882
950
  kind: "workspace-app-factory",
@@ -934,6 +1002,19 @@ function mentionItemToAttrs(item) {
934
1002
  iconUrl: item.iconUrl ?? ""
935
1003
  };
936
1004
  }
1005
+ if (item.kind === "workspace-reference") {
1006
+ return {
1007
+ name: item.name,
1008
+ kind: item.kind,
1009
+ href: item.href,
1010
+ ...workspaceMentionAttrs(item.workspaceId),
1011
+ targetId: item.targetId,
1012
+ source: item.source,
1013
+ groupId: item.groupId ?? "",
1014
+ iconUrl: item.iconUrl ?? "",
1015
+ fileCount: String(item.fileCount)
1016
+ };
1017
+ }
937
1018
  if (item.kind === "workspace-app-factory") {
938
1019
  return {
939
1020
  name: item.name,
@@ -1020,6 +1101,29 @@ function attrsToMentionItem(attrs) {
1020
1101
  iconUrl: typeof attrs.iconUrl === "string" && attrs.iconUrl.trim() ? attrs.iconUrl.trim() : void 0
1021
1102
  };
1022
1103
  }
1104
+ if (kind === "workspace-reference") {
1105
+ const workspaceId = workspaceIdFromMentionAttrs(attrs);
1106
+ const targetId = typeof attrs.targetId === "string" ? attrs.targetId.trim() : "";
1107
+ const source = attrs.source === "task" ? "task" : "app";
1108
+ const groupId = typeof attrs.groupId === "string" && attrs.groupId.trim() ? attrs.groupId.trim() : void 0;
1109
+ const iconUrl = typeof attrs.iconUrl === "string" && attrs.iconUrl.trim() ? attrs.iconUrl.trim() : void 0;
1110
+ const fileCount = parseMentionFileCount(attrs.fileCount);
1111
+ return {
1112
+ kind,
1113
+ href: href || buildAgentWorkspaceReferenceMentionHref(
1114
+ workspaceId,
1115
+ { source, id: targetId, groupId },
1116
+ { iconUrl, fileCount }
1117
+ ),
1118
+ workspaceId,
1119
+ targetId,
1120
+ source,
1121
+ groupId,
1122
+ name,
1123
+ iconUrl,
1124
+ fileCount
1125
+ };
1126
+ }
1023
1127
  if (kind === "workspace-app-factory") {
1024
1128
  const workspaceId = workspaceIdFromMentionAttrs(attrs);
1025
1129
  const jobId = typeof attrs.jobId === "string" && attrs.jobId.trim() ? attrs.jobId.trim() : typeof attrs.targetId === "string" ? attrs.targetId.trim() : "";
@@ -1068,12 +1172,14 @@ function parseAgentMentionHTMLElementAttrs(node) {
1068
1172
  const parsedItem = href ? parseMentionItemFromHref({ name, href }) : null;
1069
1173
  const parsedAttrs = parsedItem ? mentionItemToAttrs(parsedItem) : {};
1070
1174
  const iconUrl = node.getAttribute("data-agent-mention-icon-url") || "";
1175
+ const fileCount = node.getAttribute("data-agent-mention-file-count") || "";
1071
1176
  return {
1072
1177
  ...parsedAttrs,
1073
1178
  name,
1074
1179
  kind: node.getAttribute("data-agent-mention-kind") || node.getAttribute("kind") || parsedAttrs.kind || "file",
1075
1180
  href,
1076
- ...iconUrl ? { iconUrl } : {}
1181
+ ...iconUrl ? { iconUrl } : {},
1182
+ ...fileCount ? { fileCount } : {}
1077
1183
  };
1078
1184
  }
1079
1185
  function workspaceIdFromMentionUrl(url) {
@@ -1110,6 +1216,9 @@ function normalizeMentionKind(value) {
1110
1216
  if (value === "workspace-app") {
1111
1217
  return "workspace-app";
1112
1218
  }
1219
+ if (value === "workspace-reference") {
1220
+ return "workspace-reference";
1221
+ }
1113
1222
  if (value === "workspace-app-factory") {
1114
1223
  return "workspace-app-factory";
1115
1224
  }
@@ -1144,8 +1253,14 @@ function mentionVisual(item) {
1144
1253
  primary: item.name
1145
1254
  };
1146
1255
  }
1256
+ if (item.kind === "workspace-reference") {
1257
+ return {
1258
+ kindLabel: "Reference",
1259
+ primary: item.name
1260
+ };
1261
+ }
1147
1262
  return {
1148
- kindLabel: "Issue",
1263
+ kindLabel: "Task",
1149
1264
  primary: item.name
1150
1265
  };
1151
1266
  }
@@ -1202,10 +1317,13 @@ export {
1202
1317
  buildAgentSessionMentionHref,
1203
1318
  buildAgentWorkspaceIssueMentionHref,
1204
1319
  buildAgentWorkspaceAppMentionHref,
1320
+ buildAgentWorkspaceReferenceMentionHref,
1205
1321
  normalizeAgentSessionMentionTitle,
1206
1322
  formatAgentMentionMarkdown,
1207
1323
  parseAgentMentionMarkdown,
1324
+ parseMentionItemFromHref,
1325
+ mentionItemToAttrs,
1208
1326
  attrsToMentionItem,
1209
1327
  buildAgentGenericMentionHref2 as buildAgentGenericMentionHref
1210
1328
  };
1211
- //# sourceMappingURL=chunk-MU2LODEV.js.map
1329
+ //# sourceMappingURL=chunk-KWPL3JYS.js.map