@tutti-os/agent-gui 0.0.106 → 0.0.108

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 (126) hide show
  1. package/dist/{AgentGUI-Do6py-T_.d.ts → AgentGUI-CkxdEB8F.d.ts} +6 -3
  2. package/dist/AgentRichTextReadonly-42TUVYX5.js +18 -0
  3. package/dist/agent-conversation/index.d.ts +4 -4
  4. package/dist/agent-conversation/index.js +13 -12
  5. package/dist/agent-conversation/index.js.map +1 -1
  6. package/dist/agent-env/index.js +1 -1
  7. package/dist/agent-gui.d.ts +5 -4
  8. package/dist/agent-gui.js +27 -25
  9. package/dist/agent-message-center/index.d.ts +3 -1
  10. package/dist/agent-message-center/index.js +22 -10
  11. package/dist/agent-message-center/index.js.map +1 -1
  12. package/dist/{agentConversationVM-Bf3Zv3iI.d.ts → agentConversationVM-D3Dn2LqN.d.ts} +18 -2
  13. package/dist/{agentGuiNodeTypes-DbgQBiYz.d.ts → agentGuiNodeTypes-B3N_hJZp.d.ts} +5 -3
  14. package/dist/agents.d.ts +1 -1
  15. package/dist/agents.js +1 -1
  16. package/dist/app/renderer/agentactivity.css +110 -6
  17. package/dist/app/renderer/assets/icons/agent-vinyl-beta-tag.svg +5 -0
  18. package/dist/{chunk-OWW7CU4U.js → chunk-25BPR75P.js} +2 -2
  19. package/dist/{chunk-N4WVVCNI.js → chunk-2QHKXI5N.js} +2 -2
  20. package/dist/{chunk-KJQERFKX.js → chunk-6CUELYIF.js} +3 -3
  21. package/dist/chunk-6CUELYIF.js.map +1 -0
  22. package/dist/{chunk-TKBEVCHG.js → chunk-7BN2WQ2M.js} +32 -2
  23. package/dist/chunk-7BN2WQ2M.js.map +1 -0
  24. package/dist/chunk-7KVZPJ3O.js +25 -0
  25. package/dist/chunk-7KVZPJ3O.js.map +1 -0
  26. package/dist/{chunk-C35SNDVZ.js → chunk-7OYHDOGG.js} +2 -1
  27. package/dist/chunk-7OYHDOGG.js.map +1 -0
  28. package/dist/{chunk-4ZWV57MF.js → chunk-AIZJHA4Q.js} +14 -9
  29. package/dist/chunk-AIZJHA4Q.js.map +1 -0
  30. package/dist/{chunk-QY22OBJS.js → chunk-AY5AFMT2.js} +8 -84
  31. package/dist/chunk-AY5AFMT2.js.map +1 -0
  32. package/dist/{chunk-V5ROOS2O.js → chunk-BM3CSFWU.js} +22 -6
  33. package/dist/chunk-BM3CSFWU.js.map +1 -0
  34. package/dist/{chunk-IR2CL2X2.js → chunk-BRLKORQI.js} +1436 -1919
  35. package/dist/chunk-BRLKORQI.js.map +1 -0
  36. package/dist/{chunk-LDZ6C3YV.js → chunk-E74BMFHI.js} +3 -3
  37. package/dist/chunk-E74BMFHI.js.map +1 -0
  38. package/dist/{chunk-ZSJBCZUH.js → chunk-EBXOSQ5G.js} +102 -73
  39. package/dist/chunk-EBXOSQ5G.js.map +1 -0
  40. package/dist/chunk-J4K7KIFZ.js +75 -0
  41. package/dist/chunk-J4K7KIFZ.js.map +1 -0
  42. package/dist/{chunk-UFIEUC3Y.js → chunk-JBX3JPTC.js} +9 -8
  43. package/dist/chunk-JBX3JPTC.js.map +1 -0
  44. package/dist/{chunk-4YVKAPKW.js → chunk-JLRPIEIE.js} +2 -17
  45. package/dist/chunk-JLRPIEIE.js.map +1 -0
  46. package/dist/{chunk-4HSLSSPJ.js → chunk-KXZMIZ5H.js} +1344 -758
  47. package/dist/chunk-KXZMIZ5H.js.map +1 -0
  48. package/dist/{chunk-4YG7YK7S.js → chunk-L2GENUG3.js} +3 -3
  49. package/dist/{chunk-J2HG7UCP.js → chunk-OEYXSD3O.js} +3 -3
  50. package/dist/{chunk-P3CVAWGJ.js → chunk-QTW5CH62.js} +5 -5
  51. package/dist/{chunk-L3GMMGRS.js → chunk-R2ZADXRB.js} +2 -2
  52. package/dist/chunk-R7AXDQCA.js +146 -0
  53. package/dist/chunk-R7AXDQCA.js.map +1 -0
  54. package/dist/{chunk-7MPN2JGL.js → chunk-U4CVBCHD.js} +37 -119
  55. package/dist/chunk-U4CVBCHD.js.map +1 -0
  56. package/dist/{chunk-BXOKBZH4.js → chunk-UFD2QKGC.js} +9 -6
  57. package/dist/chunk-UFD2QKGC.js.map +1 -0
  58. package/dist/{chunk-4YCCATI4.js → chunk-USIFGHT3.js} +17 -4
  59. package/dist/chunk-USIFGHT3.js.map +1 -0
  60. package/dist/{chunk-7BXWPI4F.js → chunk-VMQNG2KI.js} +13 -1
  61. package/dist/{chunk-7BXWPI4F.js.map → chunk-VMQNG2KI.js.map} +1 -1
  62. package/dist/{chunk-SN6UYX54.js → chunk-W6TO6K2X.js} +4 -4
  63. package/dist/{chunk-UGVI47X6.js → chunk-YNSXUEIR.js} +6 -6
  64. package/dist/context-mention-palette/index.js +13 -12
  65. package/dist/{contribution-C6K5YfJ7.d.ts → contribution-C2LDwLA7.d.ts} +3 -2
  66. package/dist/dock-icons.js +3 -3
  67. package/dist/i18n/index.d.ts +31 -1
  68. package/dist/i18n/index.js +2 -2
  69. package/dist/index.d.ts +8 -7
  70. package/dist/index.js +27 -25
  71. package/dist/index.js.map +1 -1
  72. package/dist/mention-search.js +11 -10
  73. package/dist/provider-icons.js +1 -1
  74. package/dist/provider-identity.js +1 -1
  75. package/dist/{types-CnT8rNUI.d.ts → types-yF_0mrNS.d.ts} +1 -0
  76. package/dist/workbench/contribution.d.ts +2 -2
  77. package/dist/workbench/contribution.js +11 -11
  78. package/dist/workbench/index.d.ts +4 -4
  79. package/dist/workbench/index.js +22 -28
  80. package/dist/workbench/launch.d.ts +11 -14
  81. package/dist/workbench/launch.js +5 -11
  82. package/dist/workbench/providerCatalog.js +2 -2
  83. package/dist/workbench/sessionTitle.js +3 -3
  84. package/dist/workbench/state.d.ts +2 -12
  85. package/dist/workbench/state.js +3 -9
  86. package/dist/workspace-agent-generated-files.js +2 -1
  87. package/dist/workspace-query-cache.d.ts +19 -0
  88. package/dist/workspace-query-cache.js +7 -0
  89. package/dist/workspace-query-cache.js.map +1 -0
  90. package/package.json +21 -14
  91. package/dist/@-bold-lined-BLLFKBFI.svg +0 -10
  92. package/dist/AgentRichTextReadonly-F6PHC5SX.js +0 -18
  93. package/dist/add-lined-bold-5QPUDZCU.svg +0 -3
  94. package/dist/chunk-4HSLSSPJ.js.map +0 -1
  95. package/dist/chunk-4YCCATI4.js.map +0 -1
  96. package/dist/chunk-4YVKAPKW.js.map +0 -1
  97. package/dist/chunk-4ZWV57MF.js.map +0 -1
  98. package/dist/chunk-7MPN2JGL.js.map +0 -1
  99. package/dist/chunk-BXOKBZH4.js.map +0 -1
  100. package/dist/chunk-C35SNDVZ.js.map +0 -1
  101. package/dist/chunk-H6IQ63DQ.js +0 -14
  102. package/dist/chunk-H6IQ63DQ.js.map +0 -1
  103. package/dist/chunk-IR2CL2X2.js.map +0 -1
  104. package/dist/chunk-KJQERFKX.js.map +0 -1
  105. package/dist/chunk-LDZ6C3YV.js.map +0 -1
  106. package/dist/chunk-QY22OBJS.js.map +0 -1
  107. package/dist/chunk-TKBEVCHG.js.map +0 -1
  108. package/dist/chunk-UFIEUC3Y.js.map +0 -1
  109. package/dist/chunk-V5ROOS2O.js.map +0 -1
  110. package/dist/chunk-ZSJBCZUH.js.map +0 -1
  111. package/dist/claudecode-flat-filled-NHO4JCVK.svg +0 -10
  112. package/dist/codex-flat-filled-WYHCF5VR.svg +0 -10
  113. package/dist/cursor-flat-filled-CL7N3BTZ.svg +0 -3
  114. package/dist/handoff-lined-4WQUBVG3.svg +0 -11
  115. package/dist/open-link-lined-JWEKUKME.svg +0 -4
  116. package/dist/opencode-flat-filled-CYAJPX45.svg +0 -4
  117. package/dist/tutti-flat-filled-K32QBTZE.svg +0 -12
  118. /package/dist/{AgentRichTextReadonly-F6PHC5SX.js.map → AgentRichTextReadonly-42TUVYX5.js.map} +0 -0
  119. /package/dist/{chunk-OWW7CU4U.js.map → chunk-25BPR75P.js.map} +0 -0
  120. /package/dist/{chunk-N4WVVCNI.js.map → chunk-2QHKXI5N.js.map} +0 -0
  121. /package/dist/{chunk-4YG7YK7S.js.map → chunk-L2GENUG3.js.map} +0 -0
  122. /package/dist/{chunk-J2HG7UCP.js.map → chunk-OEYXSD3O.js.map} +0 -0
  123. /package/dist/{chunk-P3CVAWGJ.js.map → chunk-QTW5CH62.js.map} +0 -0
  124. /package/dist/{chunk-L3GMMGRS.js.map → chunk-R2ZADXRB.js.map} +0 -0
  125. /package/dist/{chunk-SN6UYX54.js.map → chunk-W6TO6K2X.js.map} +0 -0
  126. /package/dist/{chunk-UGVI47X6.js.map → chunk-YNSXUEIR.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/contribution.ts","../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts","../workbench/AgentGuiWorkbenchReactiveHeader.tsx","../workbench/conversationIdentity.ts","../agentGuiSessionProviderIconUrls.ts","../workbench/header.ts","../workbench/bodyRenderErrorRegistry.ts","../workbench/contributionDock.tsx"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type { AgentSessionEngine } from \"@tutti-os/agent-activity-core\";\nimport {\n type WorkbenchContribution,\n type WorkbenchFrame,\n type WorkbenchHostNodeBodyContext\n} from \"@tutti-os/workbench-surface\";\nimport {\n clampAgentGUIConversationRailWidthPx,\n resolveAgentGUIExpandedWindowFrame,\n shouldAutoCollapseAgentGUIConversationRail\n} from \"../agent-gui/agentGuiNode/model/agentGuiRailLayout.ts\";\nimport { AgentGuiWorkbenchReactiveHeader } from \"./AgentGuiWorkbenchReactiveHeader.tsx\";\nimport { setAgentGuiWorkbenchBodyRenderError } from \"./bodyRenderErrorRegistry.ts\";\nimport {\n AgentGuiWorkbenchHeader,\n type AgentGuiWorkbenchHeaderProps\n} from \"./header.ts\";\nimport type { AgentGuiWorkbenchConversationIdentity } from \"./conversationIdentity.ts\";\nimport {\n agentGuiWorkbenchTypeId,\n createAgentGuiWorkbenchLaunchDescriptor\n} from \"./launch.ts\";\nimport {\n createAgentGuiWorkbenchNodeStateSource,\n migrateLegacyAgentGuiWorkbenchState,\n normalizeAgentGuiWorkbenchNodeState,\n normalizeAgentGuiWorkbenchState\n} from \"./state.ts\";\nimport type {\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\nimport type { AgentGUIAgentDirectoryPort } from \"../types.ts\";\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\n/**\n * Fired when the empty-hero \"Import session\" suggestion is chosen. The host\n * chrome (which owns the external-agent import wizard state) listens for this\n * and opens the wizard.\n */\nexport const AGENT_GUI_WORKBENCH_OPEN_EXTERNAL_IMPORT_EVENT =\n \"tutti:agent-gui-workbench-open-external-import\";\n\nexport interface AgentGuiWorkbenchConversationRailToggleDetail {\n conversationRailCollapsed: boolean;\n instanceId: string;\n}\n\nexport interface AgentGuiWorkbenchNewConversationDetail {\n instanceId: string;\n}\n\nexport type { AgentGuiWorkbenchConversationIdentity } from \"./conversationIdentity.ts\";\n\nexport interface AgentGuiWorkbenchContributionCopy {\n collapseConversationRail: string;\n close: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n maximize: string;\n minimize: string;\n newConversation: string;\n nodeTitle: string;\n openDetachedWindow: string;\n restore: string;\n untitledConversation: string;\n}\n\nexport type AgentGuiWorkbenchContributionCopyOverrides =\n Partial<AgentGuiWorkbenchContributionCopy>;\n\nexport interface AgentGuiWorkbenchRenderBodyHelpers {\n agentDirectory: AgentGUIAgentDirectoryPort;\n agentTargetId: string | null;\n nodeTypeId: string;\n onStateChange(state: AgentGuiWorkbenchState): void;\n provider: AgentGuiWorkbenchProvider | null;\n}\n\nexport interface CreateAgentGuiWorkbenchContributionInput {\n agentDirectory: AgentGUIAgentDirectoryPort;\n copy?: AgentGuiWorkbenchContributionCopyOverrides;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n dockSectionId?: string;\n frame?: WorkbenchFrame;\n id?: string;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\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 renderMinimizedPreview(\n context: WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n helpers: AgentGuiWorkbenchRenderBodyHelpers\n ): ReactNode;\n resolveDockPopupTitle?: (\n state: AgentGuiWorkbenchState | null\n ) => string | null;\n resolveDockPopupIdentity?: (\n state: AgentGuiWorkbenchState | null\n ) => AgentGuiWorkbenchConversationIdentity | null;\n sessionEngine?: AgentSessionEngine;\n onOpenDetachedWindow?: (input: {\n agentSessionId?: string | null;\n agentTargetId?: string | null;\n provider: AgentGuiWorkbenchProvider;\n workspaceId: string;\n }) => void | Promise<void>;\n unifiedDockIconUrl?: string;\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 return {\n dockEntries: buildAgentGuiDockEntries({\n agentDirectory: input.agentDirectory,\n defaultProvider: input.defaultProvider,\n dockIconUrls: input.dockIconUrls,\n label: copy.nodeTitle,\n providerAvailability: input.providerAvailability,\n renderPreview: input.renderPreview,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle,\n sectionId: input.dockSectionId ?? \"agents\",\n unifiedDockIconUrl: input.unifiedDockIconUrl\n }),\n externalStateSource: nodeStateSource.externalStateSource,\n id: input.id ?? \"workspace-agent-gui\",\n nodes: [\n {\n frame,\n instance: { mode: \"multi\" },\n onBodyRenderErrorChange: ({ hasError, node }) => {\n setAgentGuiWorkbenchBodyRenderError(node.id, hasError);\n },\n renderBody: (context) => {\n const persistedState = normalizeAgentGuiWorkbenchState(\n context.externalNodeState ?? context.node?.data.snapshotNodeState\n );\n const activationAgentTargetId = agentTargetIdFromActivation(\n context.activation\n );\n const state =\n activationAgentTargetId && !persistedState.agentTargetId\n ? { ...persistedState, agentTargetId: activationAgentTargetId }\n : persistedState;\n const agent = resolveAgentGuiWorkbenchStateAgent(\n state,\n input.agentDirectory\n );\n return input.renderBody(\n context as WorkbenchHostNodeBodyContext<\n AgentGuiWorkbenchState | null,\n unknown\n >,\n {\n agentDirectory: input.agentDirectory,\n agentTargetId: state.agentTargetId ?? null,\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: (nextState) => {\n nodeStateSource.writeNodeState({\n instanceId: context.instanceId,\n nodeId: context.node.id,\n state: nextState,\n typeId: agentGuiWorkbenchTypeId\n });\n },\n provider: agent?.provider ?? null\n }\n );\n },\n renderHeader: ({\n dragHandleProps,\n displayMode,\n externalNodeState,\n instanceId,\n isFocused,\n node,\n surfaceSize,\n windowActions\n }) => {\n const headerTitle = copy.nodeTitle;\n const rawWorkbenchState = (externalNodeState ??\n node.data.runtimeNodeState) as\n | Partial<AgentGuiWorkbenchNodeState>\n | null\n | undefined;\n const migratedWorkbenchState =\n migrateLegacyAgentGuiWorkbenchState(rawWorkbenchState);\n const workbenchState = normalizeAgentGuiWorkbenchState(\n migratedWorkbenchState\n );\n const selectedAgent = resolveAgentGuiWorkbenchStateAgent(\n workbenchState,\n input.agentDirectory\n );\n const provider = selectedAgent?.provider ?? \"unknown\";\n const nodeState = normalizeAgentGuiWorkbenchNodeState(\n migratedWorkbenchState,\n provider\n );\n const isConversationRailAutoCollapsed =\n shouldAutoCollapseAgentGUIConversationRail(node.frame.width);\n const isConversationRailCollapsed =\n nodeState.conversationRailCollapsed === true ||\n isConversationRailAutoCollapsed;\n const conversationRailWidthPx = clampAgentGUIConversationRailWidthPx(\n nodeState.conversationRailWidthPx,\n node.frame.width\n );\n const conversationIdentity = input.sessionEngine\n ? null\n : (input.resolveDockPopupIdentity?.(workbenchState) ?? null);\n const conversationTitle = input.sessionEngine\n ? null\n : (conversationIdentity?.title ??\n input.resolveDockPopupTitle?.(workbenchState) ??\n null);\n // The empty new-conversation home has no session identity, so it\n // must not inherit the provider icon from the workbench instance.\n // Once a local session id exists, keep the provider icon available\n // while the canonical conversation title is still being persisted.\n const hasConversation = Boolean(\n workbenchState.lastActiveAgentSessionId?.trim()\n );\n const conversationIconFallbackUrl =\n hasConversation && selectedAgent ? selectedAgent.iconUrl : null;\n const conversationIconUrl =\n conversationIdentity?.iconUrl ?? conversationIconFallbackUrl;\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 const headerProps = {\n copy,\n conversationIconFallbackUrl,\n conversationRailWidthPx,\n displayMode,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n nodeId: node.id,\n providerRailWidthPx: agentGuiWorkbenchProviderRailWidthPx,\n title: headerTitle,\n windowActions: {\n close: windowActions.close,\n minimize: windowActions.minimize,\n toggleDisplayMode: windowActions.toggleDisplayMode\n },\n ...dragHandleProps,\n onCreateConversation: announceNewConversation,\n onOpenDetachedWindow: input.onOpenDetachedWindow\n ? selectedAgent\n ? () => {\n void input.onOpenDetachedWindow?.({\n agentSessionId: workbenchState.lastActiveAgentSessionId,\n agentTargetId: selectedAgent.agentTargetId,\n provider: selectedAgent.provider,\n workspaceId: input.workspaceId\n });\n }\n : undefined\n : undefined,\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 } satisfies AgentGuiWorkbenchHeaderProps;\n return input.sessionEngine\n ? createElement(AgentGuiWorkbenchReactiveHeader, {\n ...headerProps,\n agentDirectory: input.agentDirectory,\n dockIconUrls: input.dockIconUrls,\n sessionEngine: input.sessionEngine,\n workbenchState\n })\n : createElement(AgentGuiWorkbenchHeader, {\n ...headerProps,\n agentTitle: conversationIdentity?.agentTitle,\n conversationIconUrl,\n conversationTitle,\n hasConversation\n });\n },\n title: copy.nodeTitle,\n typeId: agentGuiWorkbenchTypeId,\n window: {\n closable: true,\n defaultOpen: false,\n minimizedDock: {\n kind: \"component\",\n providePreview: (item) =>\n createAgentGuiWorkbenchPreviewContent({\n agentDirectory: input.agentDirectory,\n item,\n renderPreview: input.renderMinimizedPreview,\n resolveDockPopupTitle: input.resolveDockPopupTitle\n })\n },\n minimizable: true\n }\n }\n ],\n onLaunchRequest: (request) => {\n if (request.typeId !== agentGuiWorkbenchTypeId) {\n return null;\n }\n\n const launchPayload = resolveAgentGuiWorkbenchLaunchPayload(request, {\n agentDirectory: input.agentDirectory,\n defaultProvider: input.defaultProvider,\n providerAvailability: input.providerAvailability\n });\n if (\n !hasAgentSessionId(launchPayload) &&\n !providerTargetLaunchPayloadFromRequest(\n launchPayload,\n providerFromState(launchPayload) ?? \"codex\"\n ).agentTargetId\n ) {\n return null;\n }\n if (!providerFromState(launchPayload)) {\n return null;\n }\n const {\n activation,\n dockEntryId,\n instanceId: descriptorInstanceId,\n openInNewWindow,\n provider,\n reusePolicy,\n targetAgentSessionId\n } = createAgentGuiWorkbenchLaunchDescriptor({\n ...request,\n payload: launchPayload\n });\n const providerTarget = providerTargetLaunchPayloadFromRequest(\n launchPayload,\n provider\n );\n // Locate an already-open node currently showing this session (its launch\n // instanceId may differ from the session-keyed one, e.g. a conversation\n // started fresh as a draft) so we focus it instead of opening a duplicate.\n const existingInstanceId =\n reusePolicy.kind === \"current-session\"\n ? nodeStateSource.findInstanceIdByAgentSessionId(\n reusePolicy.agentSessionId\n )\n : null;\n const instanceId = existingInstanceId ?? descriptorInstanceId;\n const title = copy.nodeTitle;\n const launchAgentTargetId = providerTarget.agentTargetId;\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 agentTargetId: launchAgentTargetId ?? null\n },\n typeId: agentGuiWorkbenchTypeId\n });\n } else if (providerTarget.agentTargetId) {\n const previousState = nodeStateSource.readNodeState({\n instanceId,\n typeId: agentGuiWorkbenchTypeId\n });\n nodeStateSource.writeNodeState({\n instanceId,\n state: {\n ...normalizeAgentGuiWorkbenchState(previousState),\n lastActiveAgentSessionId: null,\n agentTargetId: providerTarget.agentTargetId\n },\n typeId: agentGuiWorkbenchTypeId\n });\n }\n const defaultFrame = resolveAgentGuiWorkbenchDefaultLaunchFrame({\n frame,\n request\n });\n return {\n activation,\n ...(openInNewWindow\n ? { cascadeOffset: agentGuiWorkbenchNewWindowCascadeOffset }\n : {}),\n defaultFrame,\n dockEntryId,\n framePolicy:\n !openInNewWindow &&\n isAgentGuiWorkbenchCompactVisibleFrame(defaultFrame, frame)\n ? \"absolute\"\n : \"cascade-same-type-centered\",\n instanceId,\n // Reusing the window already showing this specific conversation\n // (e.g. clicking a completion notification) should just focus it,\n // not reset it back to the default size/position.\n preserveExistingNodeFrame: existingInstanceId !== null,\n reuseDockEntryNode: reusePolicy.kind === \"dock-entry\",\n title,\n typeId: agentGuiWorkbenchTypeId\n };\n }\n };\n}\n\nfunction resolveAgentGuiWorkbenchStateAgent(\n state: AgentGuiWorkbenchState | null,\n directory: AgentGUIAgentDirectoryPort\n) {\n const agentTargetId = state?.agentTargetId?.trim();\n if (!agentTargetId) {\n return null;\n }\n return (\n directory\n .getSnapshot()\n .agents.find((agent) => agent.agentTargetId === agentTargetId) ?? null\n );\n}\n\nfunction agentTargetIdFromActivation(activation: unknown): string | null {\n if (!activation || typeof activation !== \"object\") {\n return null;\n }\n const payload = (activation as { payload?: unknown }).payload;\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n const agentTargetId = (payload as { agentTargetId?: unknown }).agentTargetId;\n return typeof agentTargetId === \"string\" && agentTargetId.trim()\n ? agentTargetId.trim()\n : null;\n}\n\nfunction hasAgentSessionId(payload: unknown): boolean {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return false;\n }\n return (\n typeof (payload as { agentSessionId?: unknown }).agentSessionId ===\n \"string\" &&\n (payload as { agentSessionId: string }).agentSessionId.trim().length > 0\n );\n}\n\nimport {\n agentGuiWorkbenchDefaultNodeFrame,\n agentGuiWorkbenchNewWindowCascadeOffset,\n agentGuiWorkbenchProviderRailWidthPx,\n buildAgentGuiDockEntries,\n createAgentGuiWorkbenchPreviewContent,\n isAgentGuiWorkbenchCompactVisibleFrame,\n providerFromState,\n providerTargetLaunchPayloadFromRequest,\n resolveAgentGuiWorkbenchLaunchPayload,\n resolveAgentGuiWorkbenchContributionCopy,\n resolveAgentGuiWorkbenchDefaultLaunchFrame\n} from \"./contributionDock.tsx\";\nimport type { AgentGuiWorkbenchProviderAvailability } from \"./contributionDock.tsx\";\nexport {\n agentGuiWorkbenchCompactVisibleAreaRatio,\n agentGuiWorkbenchDefaultCopy,\n agentGuiWorkbenchDefaultNodeFrame,\n agentGuiWorkbenchDefaultUsableHeightRatio,\n agentGuiWorkbenchDefaultUsableWidthRatio,\n agentGuiWorkbenchNewWindowCascadeOffset,\n agentGuiWorkbenchProviderRailWidthPx,\n buildAgentGuiDockEntries,\n resolveAgentGuiUnifiedDockLaunchPayload,\n resolveAgentGuiWorkbenchContributionCopy,\n resolveAgentGuiWorkbenchDefaultLaunchFrame\n} from \"./contributionDock.tsx\";\nexport type {\n AgentGuiWorkbenchProviderAvailability,\n BuildAgentGuiDockEntriesInput\n} from \"./contributionDock.tsx\";\n","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_COLLAPSED_MIN_WIDTH_PX = 460;\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;\nexport const AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX = 610;\n// The standalone agent window keeps the conversation rail visible until the\n// home composer reaches its actual minimum width. Include the provider rail in\n// this host-specific threshold: 248px conversation rail + 320px composer +\n// 10px resize handle + 52px provider rail = 630px.\nexport const AGENT_GUI_STANDALONE_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 52;\nexport const AGENT_GUI_EXPANDED_TARGET_WIDTH_PX = 800;\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 autoCollapseWidthPx: number = AGENT_GUI_AUTO_COLLAPSE_WIDTH_PX\n): boolean {\n return (\n Number.isFinite(containerWidthPx) &&\n containerWidthPx > 0 &&\n containerWidthPx <= autoCollapseWidthPx\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 const preferredWidthPx =\n typeof widthPx === \"number\" && Number.isFinite(widthPx)\n ? Math.round(widthPx)\n : null;\n\n return clamp(\n preferredWidthPx ?? AGENT_GUI_CONVERSATION_RAIL_DEFAULT_WIDTH_PX,\n AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,\n resolveAgentGUIConversationRailMaxWidthPx(containerWidthPx)\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","import { useMemo, type ReactNode } from \"react\";\nimport type { AgentSessionEngine } from \"@tutti-os/agent-activity-core\";\nimport type {\n AgentGUIAgentDirectoryPort,\n AgentGUIAgentDirectorySnapshot\n} from \"../types.ts\";\nimport { useEngineSelector } from \"../shared/engine/useEngineSelector.ts\";\nimport {\n agentGuiWorkbenchConversationIdentitiesEqual,\n resolveAgentGuiWorkbenchConversationIdentity\n} from \"./conversationIdentity.ts\";\nimport {\n AgentGuiWorkbenchHeader,\n type AgentGuiWorkbenchHeaderProps\n} from \"./header.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\n\ninterface AgentGuiWorkbenchReactiveHeaderProps extends Omit<\n AgentGuiWorkbenchHeaderProps,\n | \"agentTitle\"\n | \"conversationIconUrl\"\n | \"conversationTitle\"\n | \"conversationTitleDisplayPrompt\"\n | \"hasConversation\"\n> {\n agentDirectory: AgentGUIAgentDirectoryPort;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n sessionEngine: AgentSessionEngine;\n workbenchState: AgentGuiWorkbenchState | null;\n}\n\nexport function AgentGuiWorkbenchReactiveHeader({\n agentDirectory,\n dockIconUrls,\n sessionEngine,\n workbenchState,\n ...headerProps\n}: AgentGuiWorkbenchReactiveHeaderProps): ReactNode {\n const directoryStore = useMemo(\n () => ({\n getSnapshot: () => agentDirectory.getSnapshot(),\n subscribe: (\n listener: (snapshot: AgentGUIAgentDirectorySnapshot) => void\n ) =>\n agentDirectory.subscribe(() => {\n listener(agentDirectory.getSnapshot());\n })\n }),\n [agentDirectory]\n );\n const agents = useEngineSelector(\n directoryStore,\n (snapshot) => snapshot.agents,\n Object.is\n );\n const conversationIdentity = useEngineSelector(\n sessionEngine,\n (engineState) =>\n resolveAgentGuiWorkbenchConversationIdentity({\n agents,\n dockIconUrls,\n engineState,\n workbenchState\n }),\n agentGuiWorkbenchConversationIdentitiesEqual\n );\n\n return (\n <AgentGuiWorkbenchHeader\n {...headerProps}\n agentTitle={conversationIdentity?.agentTitle}\n conversationIconUrl={\n conversationIdentity?.iconUrl ?? headerProps.conversationIconFallbackUrl\n }\n conversationTitle={conversationIdentity?.title}\n conversationTitleDisplayPrompt={conversationIdentity?.titleDisplayPrompt}\n hasConversation={Boolean(\n workbenchState?.lastActiveAgentSessionId?.trim()\n )}\n />\n );\n}\n","import {\n isPendingActivationViable,\n selectLatestActivationForSession,\n selectSessionMessages,\n selectWorkspaceAgentConsumerSession,\n type AgentActivityMessage,\n type AgentPromptContentBlock,\n type AgentSessionEngineState\n} from \"@tutti-os/agent-activity-core\";\nimport { resolveAgentGuiSessionProviderIconUrl } from \"../agentGuiSessionProviderIconUrls.ts\";\nimport {\n resolveAgentGUIConversationBrowserFreeTitle,\n resolveAgentGUIConversationTitleDisplayPrompt\n} from \"../shared/agentConversationTitleProjection.ts\";\nimport type { AgentGUIAgent } from \"../types.ts\";\nimport { isAgentGuiWorkbenchProvider } from \"./providerCatalog.ts\";\nimport {\n resolveAgentGuiWorkbenchHeaderTitle,\n resolveAgentGuiWorkbenchSessionTitle\n} from \"./sessionTitle.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\n\nexport interface AgentGuiWorkbenchConversationIdentity {\n agentTitle?: string | null;\n iconUrl?: string | null;\n title: string | null;\n titleDisplayPrompt?: string | null;\n}\n\nexport function resolveAgentGuiWorkbenchConversationIdentity(input: {\n agents: readonly AgentGUIAgent[];\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n engineState: AgentSessionEngineState;\n workbenchState: AgentGuiWorkbenchState | null;\n}): AgentGuiWorkbenchConversationIdentity | null {\n const agentSessionId =\n input.workbenchState?.lastActiveAgentSessionId?.trim() ?? \"\";\n if (!agentSessionId) {\n return null;\n }\n\n const session = selectWorkspaceAgentConsumerSession(\n input.engineState,\n agentSessionId\n )?.session;\n const activation = selectLatestActivationForSession(\n input.engineState,\n agentSessionId\n );\n const optimisticTitle =\n activation?.mode === \"new\" && isPendingActivationViable(activation)\n ? activation.optimisticTitle\n : null;\n const agentTargetId =\n session?.agentTargetId ?? input.workbenchState?.agentTargetId ?? null;\n const agent = agentTargetId\n ? (input.agents.find(\n (candidate) => candidate.agentTargetId === agentTargetId\n ) ?? null)\n : null;\n const provider = session?.provider ?? agent?.provider ?? null;\n const resolvedTitle = resolveAgentGuiWorkbenchSessionTitle({\n agentSessionId,\n fallbackTitle: null,\n optimisticTitle,\n session\n });\n const canonicalTitle = resolvedTitle.title;\n const messages = selectSessionMessages(input.engineState, agentSessionId);\n const titleDisplayPrompt = resolveAgentGuiWorkbenchTitleDisplayPrompt({\n activation,\n allowEmptyTitle: resolvedTitle.source === \"optimistic\",\n messages,\n title: canonicalTitle\n });\n // Keep browser context canonical in the message while omitting its tag from the visible header title.\n const title = resolveAgentGUIConversationBrowserFreeTitle({\n activation,\n allowEmptyTitle: resolvedTitle.source === \"optimistic\",\n messages,\n title: canonicalTitle\n });\n const agentTitle = resolveAgentGuiWorkbenchHeaderTitle({\n agentName: agent?.name,\n conversationTitle: title,\n provider\n });\n const iconUrl =\n agent?.iconUrl ??\n resolveAgentGuiSessionProviderIconUrl(provider ?? undefined) ??\n (isAgentGuiWorkbenchProvider(provider)\n ? (input.dockIconUrls?.[provider] ?? null)\n : null);\n\n return {\n agentTitle,\n iconUrl,\n title,\n titleDisplayPrompt\n };\n}\n\nexport function resolveAgentGuiWorkbenchTitleDisplayPrompt(input: {\n activation?: {\n content: readonly AgentPromptContentBlock[];\n displayPrompt?: string;\n mode: \"existing\" | \"new\";\n status: import(\"@tutti-os/agent-activity-core\").PendingActivationStatus;\n } | null;\n allowEmptyTitle?: boolean;\n messages: readonly AgentActivityMessage[];\n title: string | null;\n}): string | null {\n return resolveAgentGUIConversationTitleDisplayPrompt(input);\n}\n\nexport function agentGuiWorkbenchConversationIdentitiesEqual(\n left: AgentGuiWorkbenchConversationIdentity | null,\n right: AgentGuiWorkbenchConversationIdentity | null\n): boolean {\n return (\n left === right ||\n (left !== null &&\n right !== null &&\n left.agentTitle === right.agentTitle &&\n left.iconUrl === right.iconUrl &&\n left.title === right.title &&\n left.titleDisplayPrompt === right.titleDisplayPrompt)\n );\n}\n","import {\n claudeCodeFlatFilledIconUrl,\n codexFlatFilledIconUrl,\n cursorFlatFilledIconUrl,\n opencodeFlatFilledIconUrl,\n resolveProviderIconAsset,\n tuttiFlatFilledIconUrl\n} from \"./providerIconAssets.ts\";\nimport { resolveAgentGUIProviderCatalogIdentity } from \"./providerIdentityCatalog.ts\";\nimport { cursorColorfulUrl } from \"./managedAgentIconAssets.ts\";\nimport { normalizeManagedAgentProvider } from \"./shared/managedAgentProviders\";\n\nexport {\n claudeCodeFlatFilledIconUrl,\n codexFlatFilledIconUrl,\n cursorColorfulUrl,\n cursorFlatFilledIconUrl,\n opencodeFlatFilledIconUrl,\n tuttiFlatFilledIconUrl\n};\n\n/**\n * Colorful session icons, used where the icon renders as a real <img> avatar\n * (collapsed workbench header, dock popup). Colorful assets keep their fill.\n */\nexport function resolveAgentGuiSessionProviderIconUrl(\n provider: string | undefined\n): string | null {\n const identity = resolveAgentGUIProviderCatalogIdentity(\n normalizeManagedAgentProvider(provider)\n );\n return resolveProviderIconAsset(identity?.iconKey, \"sessionColorful\");\n}\n\n/**\n * Flat monochrome session icons, used where the icon renders through a CSS\n * mask (e.g. the conversation rail rows). Colorful assets would collapse to a\n * solid square under a mask, so these must be single-color glyphs with a\n * transparent background.\n */\nexport function resolveAgentGuiSessionProviderFlatIconUrl(\n provider: string | undefined\n): string | null {\n const identity = resolveAgentGUIProviderCatalogIdentity(\n normalizeManagedAgentProvider(provider)\n );\n return resolveProviderIconAsset(identity?.iconKey, \"sessionFlat\");\n}\n","import {\n createElement,\n lazy,\n Suspense,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode\n} from \"react\";\nimport type {\n WorkbenchDisplayMode,\n WorkbenchHostNodeHeaderWindowActions\n} from \"@tutti-os/workbench-surface\";\nimport {\n Button,\n PanelIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n cn\n} from \"@tutti-os/ui-system\";\nimport { CreateChatIcon } from \"@tutti-os/ui-system/icons\";\nimport openLinkLinedIconUrl from \"../app/renderer/assets/icons/open-link-lined.svg\";\nimport { useAgentGuiWorkbenchBodyRenderError } from \"./bodyRenderErrorRegistry.ts\";\n\nconst LazyAgentRichTextReadonly = lazy(() =>\n import(\"../shared/AgentRichTextReadonly.tsx\").then((module) => ({\n default: module.AgentRichTextReadonly\n }))\n);\n\nconst headerChromeIconButtonClassName =\n \"agent-gui-workbench-header__icon-button\";\n\nconst conversationRailToggleButtonClassName =\n \"agent-gui-workbench-header__icon-button agent-gui-workbench-header__rail-toggle\";\n\nconst detachedWindowButtonClassName =\n \"agent-gui-workbench-header__icon-button agent-gui-workbench-header__detached-window\";\n\nconst headerChromeIconClassName = \"agent-gui-workbench-header__icon\";\n\nexport interface AgentGuiWorkbenchHeaderCopy {\n collapseConversationRail: string;\n close?: string;\n expandConversationRail: string;\n fallbackAgentLabel: string;\n maximize?: string;\n minimize?: string;\n newConversation: string;\n openDetachedWindow?: string;\n restore?: string;\n untitledConversation?: string;\n}\n\nexport interface AgentGuiWorkbenchHeaderProps extends HTMLAttributes<HTMLElement> {\n copy: AgentGuiWorkbenchHeaderCopy;\n agentTitle?: string | null;\n defaultActions?: ReactNode;\n displayMode?: WorkbenchDisplayMode;\n isConversationRailAutoCollapsed: boolean;\n isConversationRailCollapsed: boolean;\n conversationRailWidthPx?: number | null;\n conversationIconUrl?: string | null;\n conversationIconFallbackUrl?: string | null;\n hasConversation?: boolean;\n providerRailWidthPx?: number | null;\n primaryAccessory?: ReactNode;\n secondaryAccessory?: ReactNode;\n conversationTitle?: string | null;\n conversationTitleDisplayPrompt?: string | null;\n nodeId: string;\n onCreateConversation?: () => void;\n onOpenDetachedWindow?: () => void;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n showAppTitle?: boolean;\n showConversationRailToggle?: boolean;\n showWindowControls?: boolean;\n title?: string;\n windowActions?: Pick<\n WorkbenchHostNodeHeaderWindowActions,\n \"close\" | \"minimize\" | \"toggleDisplayMode\"\n >;\n}\n\nexport function AgentGuiWorkbenchHeader({\n className,\n copy,\n agentTitle,\n defaultActions: _defaultActions,\n displayMode,\n isConversationRailAutoCollapsed,\n isConversationRailCollapsed,\n conversationRailWidthPx,\n conversationIconUrl,\n conversationIconFallbackUrl,\n hasConversation = false,\n providerRailWidthPx,\n primaryAccessory,\n secondaryAccessory,\n conversationTitle,\n conversationTitleDisplayPrompt,\n nodeId,\n onCreateConversation,\n onOpenDetachedWindow,\n onToggleConversationRail,\n showAppTitle = true,\n showConversationRailToggle = true,\n showWindowControls = true,\n title: _title,\n windowActions,\n ...headerProps\n}: AgentGuiWorkbenchHeaderProps): ReactNode {\n const hasBodyRenderError = useAgentGuiWorkbenchBodyRenderError(nodeId);\n const toggleLabel = isConversationRailCollapsed\n ? copy.expandConversationRail\n : copy.collapseConversationRail;\n const appTitle = _title?.trim() || copy.fallbackAgentLabel;\n const sessionTitle = hasBodyRenderError\n ? \"\"\n : conversationTitle?.trim() ||\n (hasConversation ? copy.untitledConversation?.trim() : \"\") ||\n \"\";\n const sessionTitleDisplayPrompt = hasBodyRenderError\n ? \"\"\n : conversationTitleDisplayPrompt?.trim() || \"\";\n const collapsedTitle = sessionTitle || agentTitle?.trim() || \"\";\n const sessionIconUrl = conversationIconUrl?.trim() || \"\";\n const sessionIconFallbackUrl = conversationIconFallbackUrl?.trim() || \"\";\n const hasExpandedIdentity = Boolean(\n collapsedTitle || sessionIconUrl || sessionIconFallbackUrl\n );\n const safeDisplayMode = displayMode ?? \"floating\";\n const safeWindowActions = windowActions ?? {\n close: () => undefined,\n minimize: () => undefined,\n toggleDisplayMode: () => undefined\n };\n const displayModeLabel =\n safeDisplayMode === \"fullscreen\"\n ? (copy.restore ?? \"Restore\")\n : (copy.maximize ?? \"Maximize\");\n const headerStyle = {\n ...(headerProps.style ?? {}),\n ...(typeof conversationRailWidthPx === \"number\" &&\n Number.isFinite(conversationRailWidthPx)\n ? {\n \"--agent-gui-workbench-header-rail-width\": `${Math.round(\n conversationRailWidthPx +\n (typeof providerRailWidthPx === \"number\" &&\n Number.isFinite(providerRailWidthPx)\n ? providerRailWidthPx\n : 0)\n )}px`\n }\n : {})\n } as CSSProperties;\n\n return createElement(\n \"header\",\n {\n ...headerProps,\n className: cn(\"agent-gui-workbench-header\", className),\n \"data-agent-gui-workbench-header\": \"true\",\n \"data-agent-gui-workbench-header-collapsed\": isConversationRailCollapsed\n ? \"true\"\n : \"false\",\n \"data-agent-gui-workbench-header-has-session\": sessionTitle\n ? \"true\"\n : \"false\",\n style: headerStyle\n },\n createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__primary\",\n \"data-agent-gui-workbench-header-primary\": \"true\"\n },\n showWindowControls\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__traffic-lights\",\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createTrafficLightButton({\n label: copy.close ?? \"Close\",\n onClick: safeWindowActions.close,\n testId: \"agent-gui-window-close\",\n tone: \"close\"\n }),\n createTrafficLightButton({\n label: copy.minimize ?? \"Minimize\",\n onClick: safeWindowActions.minimize,\n testId: \"agent-gui-window-minimize\",\n tone: \"minimize\"\n }),\n createTrafficLightButton({\n label: displayModeLabel,\n onClick: safeWindowActions.toggleDisplayMode,\n pressed: safeDisplayMode === \"fullscreen\",\n testId: \"agent-gui-window-toggle-display-mode\",\n tone: \"maximize\"\n })\n )\n : null,\n showAppTitle && !isConversationRailCollapsed\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__agent-brand\"\n },\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__agent-name\"\n },\n appTitle\n )\n )\n : null,\n primaryAccessory\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__primary-accessory\"\n },\n primaryAccessory\n )\n : null,\n onOpenDetachedWindow && !hasBodyRenderError\n ? createDetachedWindowButton({\n label: copy.openDetachedWindow ?? \"Open in detached window\",\n onOpenDetachedWindow\n })\n : null,\n showConversationRailToggle\n ? createConversationRailToggleButton({\n isAutoCollapsed: isConversationRailAutoCollapsed,\n isCollapsed: isConversationRailCollapsed,\n label: toggleLabel,\n onToggleConversationRail\n })\n : null,\n isConversationRailCollapsed && onCreateConversation\n ? createNewConversationButton({\n label: copy.newConversation,\n onCreateConversation\n })\n : null,\n isConversationRailCollapsed && collapsedTitle\n ? createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__session-title\"\n },\n createSessionHeaderIconSlot({\n fallbackSrc: sessionIconFallbackUrl,\n src: sessionIconUrl,\n testId: \"agent-gui-window-session-icon\"\n }),\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n collapsedTitle\n )\n )\n : null,\n isConversationRailCollapsed && secondaryAccessory\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__secondary-accessory\"\n },\n secondaryAccessory\n )\n : null\n ),\n !isConversationRailCollapsed && (hasExpandedIdentity || secondaryAccessory)\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__detail\"\n },\n hasExpandedIdentity\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__detail-title\",\n \"data-testid\": \"agent-gui-window-detail-title\"\n },\n createSessionHeaderIconSlot({\n fallbackSrc: sessionIconFallbackUrl,\n src: sessionIconUrl,\n testId: \"agent-gui-window-detail-title-icon\"\n }),\n sessionTitleDisplayPrompt\n ? createElement(\n Suspense,\n {\n fallback: createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n sessionTitle\n )\n },\n createElement(LazyAgentRichTextReadonly, {\n className:\n \"agent-gui-workbench-header__title-text agent-gui-workbench-header__rich-title\",\n editorClassName:\n \"agent-gui-workbench-header__rich-title-editor\",\n value: sessionTitleDisplayPrompt\n })\n )\n : sessionTitle\n ? createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-header__title-text\"\n },\n sessionTitle\n )\n : null\n )\n : null,\n secondaryAccessory\n ? createElement(\n \"div\",\n {\n className: \"agent-gui-workbench-header__secondary-accessory\"\n },\n secondaryAccessory\n )\n : null\n )\n : null\n );\n}\n\nfunction createConversationRailToggleButton({\n isAutoCollapsed,\n isCollapsed,\n label,\n onToggleConversationRail\n}: {\n isAutoCollapsed: boolean;\n isCollapsed: boolean;\n label: string;\n onToggleConversationRail: (nextCollapsed: boolean) => void;\n}): ReactNode {\n const button = createElement(\n Button as never,\n {\n \"aria-label\": label,\n className: conversationRailToggleButtonClassName,\n \"data-agent-gui-conversation-rail-auto-collapsed\": isAutoCollapsed\n ? \"true\"\n : undefined,\n \"data-agent-gui-conversation-rail-collapsed\": isCollapsed\n ? \"true\"\n : undefined,\n \"data-testid\": \"agent-gui-toggle-conversation-rail\",\n size: \"icon-sm\",\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onToggleConversationRail(!isCollapsed);\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(PanelIcon, { className: headerChromeIconClassName })\n );\n\n return createElement(TooltipProvider, {\n children: createElement(\n Tooltip,\n null,\n createElement(TooltipTrigger, { asChild: true }, button),\n createElement(TooltipContent, { side: \"bottom\" }, label)\n ),\n delayDuration: 250,\n skipDelayDuration: 0\n });\n}\n\nfunction createDetachedWindowButton({\n label,\n onOpenDetachedWindow\n}: {\n label: string;\n onOpenDetachedWindow: () => void;\n}): ReactNode {\n const button = createElement(\n Button as never,\n {\n \"aria-label\": label,\n className: detachedWindowButtonClassName,\n \"data-testid\": \"agent-gui-open-detached-window\",\n size: \"icon-sm\",\n type: \"button\",\n variant: \"ghost\",\n onClick: (event) => {\n event.stopPropagation();\n onOpenDetachedWindow();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(\"span\", {\n \"aria-hidden\": true,\n className: headerChromeIconClassName,\n \"data-agent-gui-icon\": \"open-link-lined\",\n style: {\n backgroundColor: \"currentColor\",\n display: \"block\",\n WebkitMaskImage: `url(\"${openLinkLinedIconUrl}\")`,\n WebkitMaskPosition: \"center\",\n WebkitMaskRepeat: \"no-repeat\",\n WebkitMaskSize: \"contain\",\n maskImage: `url(\"${openLinkLinedIconUrl}\")`,\n maskPosition: \"center\",\n maskRepeat: \"no-repeat\",\n maskSize: \"contain\"\n }\n })\n );\n\n return createElement(TooltipProvider, {\n children: createElement(\n Tooltip,\n null,\n createElement(TooltipTrigger, { asChild: true }, button),\n createElement(TooltipContent, { side: \"bottom\" }, label)\n ),\n delayDuration: 250,\n skipDelayDuration: 0\n });\n}\n\nfunction createNewConversationButton({\n label,\n onCreateConversation\n}: {\n label: string;\n onCreateConversation: () => void;\n}): ReactNode {\n const button = createElement(\n Button as never,\n {\n \"aria-label\": label,\n className: headerChromeIconButtonClassName,\n size: \"icon-sm\",\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(CreateChatIcon, {\n \"aria-hidden\": true,\n className: headerChromeIconClassName\n })\n );\n\n return createElement(TooltipProvider, {\n children: createElement(\n Tooltip,\n null,\n createElement(TooltipTrigger, { asChild: true }, button),\n createElement(TooltipContent, { side: \"bottom\" }, label)\n ),\n delayDuration: 250,\n skipDelayDuration: 0\n });\n}\n\nfunction createSessionHeaderIconSlot({\n src,\n fallbackSrc,\n testId\n}: {\n src: string;\n fallbackSrc: string;\n testId: string;\n}): ReactNode {\n // While the session's provider is still resolving (e.g. a freshly created\n // session) there is no icon URL yet. Render a neutral skeleton block rather\n // than flashing a wrong/default provider icon; it is replaced once the real\n // icon arrives.\n if (!src) {\n return createElement(\"span\", {\n \"aria-hidden\": \"true\",\n className:\n \"agent-gui-workbench-header__session-icon agent-gui-workbench-header__session-icon--pending\",\n \"data-testid\": `${testId}-pending`\n });\n }\n return createElement(SessionHeaderIcon, {\n key: `${src}::${fallbackSrc}`,\n fallbackSrc,\n src,\n testId\n });\n}\n\nfunction SessionHeaderIcon({\n src,\n fallbackSrc,\n testId\n}: {\n src: string;\n fallbackSrc?: string;\n testId: string;\n}): ReactNode {\n const [useFallback, setUseFallback] = useState(false);\n const [hidden, setHidden] = useState(false);\n\n const hasFallback = Boolean(fallbackSrc) && fallbackSrc !== src;\n const effectiveSrc = useFallback && fallbackSrc ? fallbackSrc : src;\n\n if (hidden) {\n return null;\n }\n\n return createElement(\"img\", {\n alt: \"\",\n className: \"agent-gui-workbench-header__session-icon\",\n \"data-testid\": testId,\n draggable: false,\n src: effectiveSrc,\n onError: () => {\n // On load failure, fall back to the bundled provider icon once; if that\n // also fails (or there is none), hide the img so the browser's broken\n // image glyph never shows.\n if (!useFallback && hasFallback) {\n setUseFallback(true);\n } else {\n setHidden(true);\n }\n }\n });\n}\n\nfunction createTrafficLightButton(input: {\n label: string;\n onClick: () => void;\n pressed?: boolean;\n testId: string;\n tone: \"close\" | \"minimize\" | \"maximize\";\n}): ReactNode {\n const iconName =\n input.tone === \"maximize\"\n ? input.pressed\n ? \"unfullscreen\"\n : \"fullscreen\"\n : input.tone;\n return createElement(\n \"button\",\n {\n \"aria-label\": input.label,\n \"aria-pressed\": input.pressed,\n className: \"agent-gui-workbench-header__traffic-light\",\n \"data-agent-gui-workbench-traffic-light\": input.tone,\n \"data-testid\": input.testId,\n type: \"button\",\n onClick: (event) => {\n event.stopPropagation();\n input.onClick();\n },\n onDoubleClick: (event) => event.stopPropagation(),\n onPointerDown: (event) => event.stopPropagation()\n },\n createElement(TrafficLightIcon, {\n \"aria-hidden\": true,\n className: \"agent-gui-workbench-header__traffic-light-icon\",\n \"data-agent-gui-workbench-traffic-light-icon\": iconName,\n iconName\n })\n );\n}\n\nfunction TrafficLightIcon({\n className,\n iconName,\n ...props\n}: {\n className: string;\n iconName: \"close\" | \"fullscreen\" | \"minimize\" | \"unfullscreen\";\n \"aria-hidden\": true;\n \"data-agent-gui-workbench-traffic-light-icon\": string;\n}): ReactNode {\n return createElement(\n \"svg\",\n {\n ...props,\n className,\n fill: \"currentColor\",\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\"\n },\n createElement(\"path\", { d: trafficLightIconPathByName[iconName] })\n );\n}\n\nconst trafficLightIconPathByName = {\n close:\n \"M16.9395 4.93953C17.5253 4.35374 18.4748 4.35374 19.0606 4.93953C19.6463 5.52532 19.6464 6.47486 19.0606 7.06062L14.1212 12.0001L19.0606 16.9395C19.6463 17.5253 19.6464 18.4749 19.0606 19.0606C18.4749 19.6464 17.5253 19.6463 16.9395 19.0606L12.0001 14.1212L7.06062 19.0606C6.47486 19.6464 5.52532 19.6463 4.93953 19.0606C4.35374 18.4748 4.35374 17.5253 4.93953 16.9395L9.87898 12.0001L4.93953 7.06062C4.35374 6.47484 4.35374 5.52532 4.93953 4.93953C5.52532 4.35374 6.47484 4.35374 7.06062 4.93953L12.0001 9.87898L16.9395 4.93953Z\",\n fullscreen:\n \"M18.1465 7.85352C18.4615 7.53861 18.9999 7.76165 19 8.20703V18.5C19 18.7761 18.7761 19 18.5 19H8.20703C7.76165 18.9999 7.53861 18.4615 7.85352 18.1465L18.1465 7.85352ZM15.793 5C16.2384 5.00006 16.4614 5.53855 16.1465 5.85352L5.85352 16.1465C5.53855 16.4614 5.00006 16.2384 5 15.793V5.5C5 5.22386 5.22386 5 5.5 5H15.793Z\",\n minimize:\n \"M5 10.5H19C19.8284 10.5 20.5 11.1716 20.5 12C20.5 12.8284 19.8284 13.5 19 13.5H5C4.17157 13.5 3.5 12.8284 3.5 12C3.5 11.1716 4.17157 10.5 5 10.5Z\",\n unfullscreen:\n \"M20.793 12C21.2384 12.0001 21.4614 12.5386 21.1465 12.8536L12.8536 21.1465C12.5386 21.4614 12.0001 21.2384 12.0001 20.793V12.5C12.0001 12.2239 12.2239 12 12.5001 12H20.793ZM11.1465 2.85356C11.4615 2.53864 12 2.76166 12.0001 3.20708V11.5C12 11.7761 11.7762 12 11.5001 12H3.20708C2.76166 12 2.53864 11.4615 2.85357 11.1465L11.1465 2.85356Z\"\n} as const;\n","import { useSyncExternalStore } from \"react\";\n\nconst listenersByNodeId = new Map<string, Set<() => void>>();\nconst errorNodeIds = new Set<string>();\n\nexport function setAgentGuiWorkbenchBodyRenderError(\n nodeId: string,\n hasError: boolean\n): void {\n const hadError = errorNodeIds.has(nodeId);\n if (hadError === hasError) {\n return;\n }\n if (hasError) {\n errorNodeIds.add(nodeId);\n } else {\n errorNodeIds.delete(nodeId);\n }\n for (const listener of listenersByNodeId.get(nodeId) ?? []) {\n listener();\n }\n}\n\nfunction subscribeAgentGuiWorkbenchBodyRenderError(\n nodeId: string,\n listener: () => void\n): () => void {\n let listeners = listenersByNodeId.get(nodeId);\n if (!listeners) {\n listeners = new Set();\n listenersByNodeId.set(nodeId, listeners);\n }\n listeners.add(listener);\n return () => {\n listeners?.delete(listener);\n if (listeners?.size === 0) {\n listenersByNodeId.delete(nodeId);\n }\n };\n}\n\nfunction getAgentGuiWorkbenchBodyRenderErrorSnapshot(nodeId: string): boolean {\n return errorNodeIds.has(nodeId);\n}\n\nexport function useAgentGuiWorkbenchBodyRenderError(nodeId: string): boolean {\n return useSyncExternalStore(\n (listener) => subscribeAgentGuiWorkbenchBodyRenderError(nodeId, listener),\n () => getAgentGuiWorkbenchBodyRenderErrorSnapshot(nodeId)\n );\n}\n","import { createElement, type ReactNode } from \"react\";\nimport {\n getWorkbenchLayoutFrame,\n type WorkbenchDockPreviewContent,\n type WorkbenchFrame,\n type WorkbenchHostDockEntry,\n type WorkbenchHostDockPopupItemInput,\n type WorkbenchHostLaunchRequest,\n type WorkbenchHostNodeBodyContext\n} from \"@tutti-os/workbench-surface\";\nimport { agentGuiDockIconUrls } from \"../dockIcons.ts\";\nimport {\n agentGuiWorkbenchDockIdentityFromIdentifier,\n agentGuiWorkbenchTypeId,\n agentGuiWorkbenchUnifiedDockEntryId\n} from \"./launch.ts\";\nimport { normalizeAgentGuiWorkbenchState } from \"./state.ts\";\nimport {\n agentGuiWorkbenchDefaultDockProviders,\n isAgentGuiWorkbenchProvider,\n resolveAgentGuiWorkbenchProviderLabel\n} from \"./providerCatalog.ts\";\nimport type {\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState\n} from \"./types.ts\";\nimport {\n normalizeAgentGUIAgents,\n projectAgentGUIAgentsToInternalTargets\n} from \"../agents.ts\";\nimport type {\n AgentGUIAgentDirectoryPort,\n AgentGUIAgentTarget\n} from \"../types.ts\";\nimport type {\n AgentGuiWorkbenchContributionCopy,\n AgentGuiWorkbenchContributionCopyOverrides,\n CreateAgentGuiWorkbenchContributionInput\n} from \"./contribution.ts\";\n\nexport const agentGuiWorkbenchDefaultNodeFrame: WorkbenchFrame = {\n height: 560,\n width: 1040,\n x: 140,\n y: 48\n};\n\nexport const agentGuiWorkbenchDefaultUsableWidthRatio = 0.9;\nexport const agentGuiWorkbenchDefaultUsableHeightRatio = 0.9;\nexport const agentGuiWorkbenchCompactVisibleAreaRatio = 0.9;\nexport const agentGuiWorkbenchNewWindowCascadeOffset = { x: 180, y: 88 };\nexport const agentGuiWorkbenchProviderRailWidthPx = 52;\nconst agentGuiWorkbenchUnifiedDockTileProviders = [\n \"codex\",\n \"claude-code\",\n \"tutti-agent\",\n \"hermes\"\n] as const satisfies readonly AgentGuiWorkbenchProvider[];\nexport const agentGuiWorkbenchDefaultCopy: AgentGuiWorkbenchContributionCopy = {\n collapseConversationRail: \"Hide sidebar\",\n close: \"Close\",\n expandConversationRail: \"Show sidebar\",\n fallbackAgentLabel: \"Agent\",\n maximize: \"Maximize\",\n minimize: \"Minimize\",\n newConversation: \"New conversation\",\n nodeTitle: \"Agent\",\n openDetachedWindow: \"Open in detached window\",\n restore: \"Restore\",\n untitledConversation: \"Untitled conversation\"\n};\nexport type AgentGuiWorkbenchProviderAvailability = Partial<\n Record<\n AgentGuiWorkbenchProvider,\n | boolean\n | \"available\"\n | \"ready\"\n | \"unavailable\"\n | {\n available?: boolean | null;\n status?: string | null;\n }\n | null\n | undefined\n >\n>;\n\nexport interface BuildAgentGuiDockEntriesInput {\n agentDirectory: AgentGUIAgentDirectoryPort;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n label?: string;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n renderPreview?: CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"];\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId?: string;\n unifiedDockIconUrl?: string;\n}\n\nexport function buildAgentGuiDockEntries(\n input: BuildAgentGuiDockEntriesInput\n): WorkbenchHostDockEntry[] {\n const sectionId = input.sectionId ?? \"agents\";\n const launchPayload = resolveAgentGuiUnifiedDockLaunchPayload(input);\n const provider = launchPayload.provider;\n const unifiedTileIconUrls = resolveAgentGuiUnifiedDockTileIconUrls(\n input.dockIconUrls\n );\n return [\n createAgentGuiWorkbenchDockEntry({\n agentDirectory: input.agentDirectory,\n icon: input.unifiedDockIconUrl\n ? createAgentGuiWorkbenchUnifiedDockIcon({\n iconUrl: input.unifiedDockIconUrl\n })\n : createAgentGuiWorkbenchLaunchpadStyleDockIcon({\n tileIconUrls: unifiedTileIconUrls\n }),\n label: input.label ?? agentGuiWorkbenchDefaultCopy.nodeTitle,\n launchPayload,\n order: 0,\n provider,\n renderPreview: input.renderPreview,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle,\n sectionId,\n visibility: \"always\"\n })\n ];\n}\n\nexport function resolveAgentGuiUnifiedDockLaunchPayload(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n \"agentDirectory\" | \"defaultProvider\" | \"providerAvailability\"\n >\n): {\n provider: AgentGuiWorkbenchProvider;\n agentTargetId?: string;\n} {\n const target = resolveUnifiedAgentGuiDockTarget(input);\n if (target) {\n return {\n provider: target.provider,\n agentTargetId: target.agentTargetId ?? target.targetId\n };\n }\n return {\n provider: resolveUnifiedAgentGuiDockProvider(input)\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 defaultWidth = Math.round(\n layoutFrame.width * agentGuiWorkbenchDefaultUsableWidthRatio\n );\n\n return {\n ...input.frame,\n height: defaultHeight,\n width: defaultWidth,\n x: Math.round(layoutFrame.x + (layoutFrame.width - defaultWidth) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - defaultHeight) / 2)\n };\n}\n\nexport function 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 agentDirectory: AgentGUIAgentDirectoryPort;\n icon: ReactNode;\n label: string;\n launchPayload?: Record<string, unknown>;\n order: number;\n provider: AgentGuiWorkbenchProvider;\n renderPreview?: CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"];\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n sectionId: string;\n visibility: WorkbenchHostDockEntry[\"visibility\"];\n}): WorkbenchHostDockEntry {\n return {\n icon: input.icon,\n iconSize: \"large\",\n id: agentGuiWorkbenchUnifiedDockEntryId(),\n label: input.label,\n launchBehavior: \"enabled\",\n launchPayload: input.launchPayload ?? { provider: input.provider },\n newWindowLaunchPayload: {\n ...(input.launchPayload ?? { provider: input.provider }),\n openInNewWindow: true\n },\n order: input.order,\n providePopupItemPreview: (item) =>\n input.renderPreview\n ? createAgentGuiWorkbenchPreviewContent({\n agentDirectory: input.agentDirectory,\n item,\n label: input.label,\n provider: input.provider,\n renderPreview: input.renderPreview,\n resolveDockPopupIdentity: input.resolveDockPopupIdentity,\n resolveDockPopupTitle: input.resolveDockPopupTitle\n })\n : null,\n resolvePopupItem: ({ externalNodeState }) => {\n const state = normalizeAgentGuiWorkbenchState(externalNodeState);\n const title =\n input.resolveDockPopupIdentity?.(state)?.title ??\n input.resolveDockPopupTitle?.(state) ??\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 resolveAgentGuiUnifiedDockTileIconUrls(\n dockIconUrls: Partial<Record<AgentGuiWorkbenchProvider, string>> | undefined\n): readonly string[] {\n return agentGuiWorkbenchUnifiedDockTileProviders.map((provider) =>\n resolveAgentGuiWorkbenchProviderIconUrl({ dockIconUrls, provider })\n );\n}\n\nexport function resolveAgentGuiWorkbenchProviderIconUrl(input: {\n dockIconUrls?: Partial<Record<AgentGuiWorkbenchProvider, string>>;\n provider: AgentGuiWorkbenchProvider;\n}): string {\n return (\n input.dockIconUrls?.[input.provider] ??\n agentGuiDockIconUrls[input.provider] ??\n \"\"\n );\n}\n\nfunction createAgentGuiWorkbenchLaunchpadStyleDockIcon(input: {\n tileIconUrls: readonly string[];\n}): ReactNode {\n return createElement(\n \"span\",\n {\n \"aria-hidden\": \"true\",\n className: \"agent-gui-workbench-dock-icon\"\n },\n input.tileIconUrls.map((src, index) =>\n createElement(\n \"span\",\n {\n className: \"agent-gui-workbench-dock-icon__tile\",\n key: `${src}:${index}`\n },\n createElement(\"img\", {\n alt: \"\",\n draggable: false,\n src\n })\n )\n )\n );\n}\n\nfunction createAgentGuiWorkbenchUnifiedDockIcon(input: {\n iconUrl: string;\n}): ReactNode {\n return createElement(\n \"span\",\n {\n \"aria-hidden\": \"true\",\n className:\n \"agent-gui-workbench-dock-icon agent-gui-workbench-dock-icon--single\"\n },\n createElement(\"img\", {\n alt: \"\",\n draggable: false,\n src: input.iconUrl\n })\n );\n}\n\nexport function providerFromState(\n state: unknown\n): AgentGuiWorkbenchProvider | null {\n if (!state || typeof state !== \"object\") {\n return null;\n }\n const provider = (state as { provider?: unknown }).provider;\n return isAgentGuiWorkbenchProvider(provider) ? provider : null;\n}\n\nexport function providerFromActivation(\n activation: unknown\n): AgentGuiWorkbenchProvider | null {\n if (!activation || typeof activation !== \"object\") {\n return null;\n }\n const payload = (activation as { payload?: unknown }).payload;\n return providerFromState(payload);\n}\n\nexport function resolveAgentGuiWorkbenchLaunchPayload(\n request: WorkbenchHostLaunchRequest,\n input: {\n agentDirectory: AgentGUIAgentDirectoryPort;\n defaultProvider?: AgentGuiWorkbenchProvider | null;\n providerAvailability?: AgentGuiWorkbenchProviderAvailability;\n }\n): unknown | null {\n if (hasAgentSessionId(request.payload)) {\n return request.payload;\n }\n const snapshot = input.agentDirectory.getSnapshot();\n const agents = normalizeAgentGUIAgents(snapshot.agents);\n const payload = isRecord(request.payload) ? request.payload : {};\n const isUnifiedDockLaunch =\n request.reason === \"dock\" &&\n agentGuiWorkbenchDockIdentityFromIdentifier(request.dockEntryId)?.kind ===\n \"unifiedAggregate\";\n const explicitAgentTargetId = isUnifiedDockLaunch\n ? null\n : readTrimmedString(payload.agentTargetId);\n if (explicitAgentTargetId) {\n const explicitAgent = agents.find(\n (agent) =>\n agent.agentTargetId === explicitAgentTargetId &&\n agent.availability.status === \"ready\"\n );\n if (\n !explicitAgent ||\n !isAgentGuiWorkbenchProvider(explicitAgent.provider)\n ) {\n return null;\n }\n return {\n ...payload,\n agentTargetId: explicitAgent.agentTargetId,\n provider: explicitAgent.provider\n };\n }\n const requestedProvider = providerFromState(payload);\n const resolved = resolveAgentGuiUnifiedDockLaunchPayload({\n agentDirectory: input.agentDirectory,\n defaultProvider: requestedProvider ?? input.defaultProvider,\n providerAvailability: input.providerAvailability\n });\n if (!resolved.agentTargetId) {\n return null;\n }\n return { ...payload, ...resolved };\n}\n\nfunction hasAgentSessionId(payload: unknown): boolean {\n if (!isRecord(payload)) {\n return false;\n }\n return readTrimmedString(payload.agentSessionId) !== null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction readTrimmedString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction resolveUnifiedAgentGuiDockTarget(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n \"agentDirectory\" | \"defaultProvider\" | \"providerAvailability\"\n >\n): AgentGUIAgentTarget | null {\n const targets = projectAgentGUIAgentsToInternalTargets(\n normalizeAgentGUIAgents(input.agentDirectory.getSnapshot().agents)\n ).filter(\n (\n target\n ): target is AgentGUIAgentTarget & {\n provider: (typeof agentGuiWorkbenchDefaultDockProviders)[number];\n } =>\n isAgentGuiWorkbenchProvider(target.provider) &&\n isUnifiedAgentGuiDockProvider(target.provider) &&\n target.disabled !== true &&\n isAgentGuiProviderAvailable(target.provider, input.providerAvailability)\n );\n if (\n input.defaultProvider &&\n isUnifiedAgentGuiDockProvider(input.defaultProvider) &&\n isAgentGuiProviderAvailable(\n input.defaultProvider,\n input.providerAvailability\n )\n ) {\n const target = preferredAgentGuiDockTargetForProvider(\n targets,\n input.defaultProvider\n );\n if (target) {\n return target;\n }\n }\n\n return targets[0] ?? null;\n}\n\nfunction resolveUnifiedAgentGuiDockProvider(\n input: Pick<\n BuildAgentGuiDockEntriesInput,\n \"agentDirectory\" | \"defaultProvider\" | \"providerAvailability\"\n >\n): AgentGuiWorkbenchProvider {\n if (\n input.defaultProvider &&\n isUnifiedAgentGuiDockProvider(input.defaultProvider) &&\n isAgentGuiProviderAvailable(\n input.defaultProvider,\n input.providerAvailability\n )\n ) {\n return input.defaultProvider;\n }\n const target = resolveUnifiedAgentGuiDockTarget(input);\n if (target) {\n return target.provider;\n }\n return (\n agentGuiWorkbenchDefaultDockProviders.find((provider) =>\n isAgentGuiProviderAvailable(provider, input.providerAvailability)\n ) ?? \"codex\"\n );\n}\n\nfunction isUnifiedAgentGuiDockProvider(\n provider: AgentGuiWorkbenchProvider\n): provider is (typeof agentGuiWorkbenchDefaultDockProviders)[number] {\n return agentGuiWorkbenchDefaultDockProviders.includes(\n provider as (typeof agentGuiWorkbenchDefaultDockProviders)[number]\n );\n}\n\nfunction preferredAgentGuiDockTargetForProvider(\n targets: readonly AgentGUIAgentTarget[],\n provider: AgentGuiWorkbenchProvider\n): AgentGUIAgentTarget | null {\n const agentTargets = targets.filter((target) => target.provider === provider);\n return agentTargets[0] ?? null;\n}\n\nfunction isAgentGuiProviderAvailable(\n provider: AgentGuiWorkbenchProvider,\n availability: AgentGuiWorkbenchProviderAvailability | null | undefined\n): boolean {\n const value = availability?.[provider];\n if (value === null || value === undefined) {\n return true;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n return value === \"ready\" || value === \"available\";\n }\n if (typeof value.available === \"boolean\") {\n return value.available;\n }\n return value.status === \"ready\" || value.status === \"available\";\n}\n\nexport function providerTargetLaunchPayloadFromRequest(\n payload: unknown,\n _expectedProvider: AgentGuiWorkbenchProvider\n): {\n agentTargetId: string | null;\n} {\n if (!payload || typeof payload !== \"object\" || Array.isArray(payload)) {\n return {\n agentTargetId: null\n };\n }\n const agentTargetId = (payload as { agentTargetId?: unknown }).agentTargetId;\n const providerTargetId = (payload as { providerTargetId?: unknown })\n .providerTargetId;\n return {\n agentTargetId:\n typeof agentTargetId === \"string\" && agentTargetId.trim()\n ? agentTargetId.trim()\n : typeof providerTargetId === \"string\" && providerTargetId.trim()\n ? providerTargetId.trim()\n : null\n };\n}\n\nexport function createAgentGuiWorkbenchPreviewContent(input: {\n agentDirectory: AgentGUIAgentDirectoryPort;\n item: WorkbenchHostDockPopupItemInput;\n label?: string;\n provider?: AgentGuiWorkbenchProvider;\n renderPreview: NonNullable<\n CreateAgentGuiWorkbenchContributionInput[\"renderPreview\"]\n >;\n resolveDockPopupIdentity?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupIdentity\"];\n resolveDockPopupTitle?: CreateAgentGuiWorkbenchContributionInput[\"resolveDockPopupTitle\"];\n}): WorkbenchDockPreviewContent {\n const { externalNodeState, node } = input.item;\n const state = normalizeAgentGuiWorkbenchState(externalNodeState);\n const title =\n input.resolveDockPopupIdentity?.(state)?.title ??\n input.resolveDockPopupTitle?.(state) ??\n node.title;\n const agentTargetId = state.agentTargetId?.trim() ?? \"\";\n const agent = input.agentDirectory\n .getSnapshot()\n .agents.find((candidate) => candidate.agentTargetId === agentTargetId);\n const provider = input.provider ?? agent?.provider ?? null;\n const label =\n input.label ??\n agent?.name ??\n (provider ? resolveAgentGuiWorkbenchProviderLabel(provider) : node.title);\n const lines = [label, state.lastActiveAgentSessionId].filter(\n (line): line is string => Boolean(line?.trim())\n );\n return {\n element: input.renderPreview(\n createAgentGuiWorkbenchPreviewBodyContext(input.item),\n {\n agentDirectory: input.agentDirectory,\n nodeTypeId: agentGuiWorkbenchTypeId,\n onStateChange: () => undefined,\n agentTargetId: agentTargetId || null,\n provider\n }\n ),\n kind: \"component\",\n revision: `${agentTargetId}\\n${provider ?? \"\"}\\n${title}\\n${lines.join(\"\\n\")}`\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 previewViewport: input.previewViewport,\n setNodeRuntimeState: () => undefined,\n setSnapshotNodeState: () => undefined\n };\n}\n"],"mappings":"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","names":["createElement","createElement","createElement","createElement","hasAgentSessionId"]}
@@ -0,0 +1,75 @@
1
+ // shared/query/workspaceQueryCache.ts
2
+ var DEFAULT_MAX_ENTRIES = 24;
3
+ function createWorkspaceQueryCache(options) {
4
+ const maxEntries = Math.max(1, options?.maxEntries ?? DEFAULT_MAX_ENTRIES);
5
+ const now = options?.now ?? Date.now;
6
+ const entries = /* @__PURE__ */ new Map();
7
+ const requests = /* @__PURE__ */ new Map();
8
+ let version = 0;
9
+ const touch = (key, entry) => {
10
+ entries.delete(key);
11
+ entries.set(key, entry);
12
+ };
13
+ const trim = () => {
14
+ while (entries.size > maxEntries) {
15
+ const oldestKey = entries.keys().next().value;
16
+ if (typeof oldestKey !== "string") return;
17
+ entries.delete(oldestKey);
18
+ }
19
+ };
20
+ const write = (key, value, ingested) => {
21
+ const entry = {
22
+ ingested,
23
+ resolvedAtUnixMs: now(),
24
+ stale: false,
25
+ value,
26
+ version: ++version
27
+ };
28
+ touch(key, entry);
29
+ trim();
30
+ return entry;
31
+ };
32
+ return {
33
+ claimIngestion(key, expectedVersion) {
34
+ const entry = entries.get(key);
35
+ if (!entry || entry.version !== expectedVersion || entry.ingested) {
36
+ return false;
37
+ }
38
+ entry.ingested = true;
39
+ return true;
40
+ },
41
+ invalidate(key) {
42
+ if (key !== void 0) {
43
+ const entry = entries.get(key);
44
+ if (entry) entry.stale = true;
45
+ return;
46
+ }
47
+ for (const entry of entries.values()) entry.stale = true;
48
+ },
49
+ read(key) {
50
+ const entry = entries.get(key);
51
+ if (!entry) return null;
52
+ touch(key, entry);
53
+ return entry;
54
+ },
55
+ request(key, load) {
56
+ const active = requests.get(key);
57
+ if (active) return active;
58
+ const request = load().then((value) => {
59
+ return write(key, value, false);
60
+ }).finally(() => {
61
+ if (requests.get(key) === request) requests.delete(key);
62
+ });
63
+ requests.set(key, request);
64
+ return request;
65
+ },
66
+ write(key, value) {
67
+ return write(key, value, true);
68
+ }
69
+ };
70
+ }
71
+
72
+ export {
73
+ createWorkspaceQueryCache
74
+ };
75
+ //# sourceMappingURL=chunk-J4K7KIFZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/query/workspaceQueryCache.ts"],"sourcesContent":["export interface WorkspaceQueryCacheEntry<TValue> {\n readonly resolvedAtUnixMs: number;\n readonly stale: boolean;\n readonly value: TValue;\n readonly version: number;\n}\n\nexport interface WorkspaceQueryCache<TValue> {\n claimIngestion(key: string, version: number): boolean;\n invalidate(key?: string): void;\n read(key: string): WorkspaceQueryCacheEntry<TValue> | null;\n request(\n key: string,\n load: () => Promise<TValue>\n ): Promise<WorkspaceQueryCacheEntry<TValue>>;\n write(key: string, value: TValue): WorkspaceQueryCacheEntry<TValue>;\n}\n\ntype MutableWorkspaceQueryCacheEntry<TValue> = Omit<\n WorkspaceQueryCacheEntry<TValue>,\n \"stale\"\n> & {\n ingested: boolean;\n stale: boolean;\n};\n\nconst DEFAULT_MAX_ENTRIES = 24;\n\nexport function createWorkspaceQueryCache<TValue>(options?: {\n maxEntries?: number;\n now?: () => number;\n}): WorkspaceQueryCache<TValue> {\n const maxEntries = Math.max(1, options?.maxEntries ?? DEFAULT_MAX_ENTRIES);\n const now = options?.now ?? Date.now;\n const entries = new Map<string, MutableWorkspaceQueryCacheEntry<TValue>>();\n const requests = new Map<string, Promise<WorkspaceQueryCacheEntry<TValue>>>();\n let version = 0;\n\n const touch = (\n key: string,\n entry: MutableWorkspaceQueryCacheEntry<TValue>\n ): void => {\n entries.delete(key);\n entries.set(key, entry);\n };\n\n const trim = (): void => {\n while (entries.size > maxEntries) {\n const oldestKey = entries.keys().next().value;\n if (typeof oldestKey !== \"string\") return;\n entries.delete(oldestKey);\n }\n };\n\n const write = (\n key: string,\n value: TValue,\n ingested: boolean\n ): MutableWorkspaceQueryCacheEntry<TValue> => {\n const entry: MutableWorkspaceQueryCacheEntry<TValue> = {\n ingested,\n resolvedAtUnixMs: now(),\n stale: false,\n value,\n version: ++version\n };\n touch(key, entry);\n trim();\n return entry;\n };\n\n return {\n claimIngestion(key, expectedVersion) {\n const entry = entries.get(key);\n if (!entry || entry.version !== expectedVersion || entry.ingested) {\n return false;\n }\n entry.ingested = true;\n return true;\n },\n invalidate(key) {\n if (key !== undefined) {\n const entry = entries.get(key);\n if (entry) entry.stale = true;\n return;\n }\n for (const entry of entries.values()) entry.stale = true;\n },\n read(key) {\n const entry = entries.get(key);\n if (!entry) return null;\n touch(key, entry);\n return entry;\n },\n request(key, load) {\n const active = requests.get(key);\n if (active) return active;\n const request = load()\n .then((value): WorkspaceQueryCacheEntry<TValue> => {\n return write(key, value, false);\n })\n .finally(() => {\n if (requests.get(key) === request) requests.delete(key);\n });\n requests.set(key, request);\n return request;\n },\n write(key, value) {\n return write(key, value, true);\n }\n };\n}\n"],"mappings":";AA0BA,IAAM,sBAAsB;AAErB,SAAS,0BAAkC,SAGlB;AAC9B,QAAM,aAAa,KAAK,IAAI,GAAG,SAAS,cAAc,mBAAmB;AACzE,QAAM,MAAM,SAAS,OAAO,KAAK;AACjC,QAAM,UAAU,oBAAI,IAAqD;AACzE,QAAM,WAAW,oBAAI,IAAuD;AAC5E,MAAI,UAAU;AAEd,QAAM,QAAQ,CACZ,KACA,UACS;AACT,YAAQ,OAAO,GAAG;AAClB,YAAQ,IAAI,KAAK,KAAK;AAAA,EACxB;AAEA,QAAM,OAAO,MAAY;AACvB,WAAO,QAAQ,OAAO,YAAY;AAChC,YAAM,YAAY,QAAQ,KAAK,EAAE,KAAK,EAAE;AACxC,UAAI,OAAO,cAAc,SAAU;AACnC,cAAQ,OAAO,SAAS;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,QAAQ,CACZ,KACA,OACA,aAC4C;AAC5C,UAAM,QAAiD;AAAA,MACrD;AAAA,MACA,kBAAkB,IAAI;AAAA,MACtB,OAAO;AAAA,MACP;AAAA,MACA,SAAS,EAAE;AAAA,IACb;AACA,UAAM,KAAK,KAAK;AAChB,SAAK;AACL,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,eAAe,KAAK,iBAAiB;AACnC,YAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,UAAI,CAAC,SAAS,MAAM,YAAY,mBAAmB,MAAM,UAAU;AACjE,eAAO;AAAA,MACT;AACA,YAAM,WAAW;AACjB,aAAO;AAAA,IACT;AAAA,IACA,WAAW,KAAK;AACd,UAAI,QAAQ,QAAW;AACrB,cAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,YAAI,MAAO,OAAM,QAAQ;AACzB;AAAA,MACF;AACA,iBAAW,SAAS,QAAQ,OAAO,EAAG,OAAM,QAAQ;AAAA,IACtD;AAAA,IACA,KAAK,KAAK;AACR,YAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,UAAI,CAAC,MAAO,QAAO;AACnB,YAAM,KAAK,KAAK;AAChB,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,KAAK,MAAM;AACjB,YAAM,SAAS,SAAS,IAAI,GAAG;AAC/B,UAAI,OAAQ,QAAO;AACnB,YAAM,UAAU,KAAK,EAClB,KAAK,CAAC,UAA4C;AACjD,eAAO,MAAM,KAAK,OAAO,KAAK;AAAA,MAChC,CAAC,EACA,QAAQ,MAAM;AACb,YAAI,SAAS,IAAI,GAAG,MAAM,QAAS,UAAS,OAAO,GAAG;AAAA,MACxD,CAAC;AACH,eAAS,IAAI,KAAK,OAAO;AACzB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,OAAO;AAChB,aAAO,MAAM,KAAK,OAAO,IAAI;AAAA,IAC/B;AAAA,EACF;AACF;","names":[]}
@@ -5,7 +5,7 @@ import {
5
5
  formatAgentMentionMarkdown,
6
6
  mentionItemToAttrs,
7
7
  parseAgentMentionMarkdown
8
- } from "./chunk-J2HG7UCP.js";
8
+ } from "./chunk-OEYXSD3O.js";
9
9
  import {
10
10
  cn,
11
11
  resolveAgentTargetPresentation,
@@ -658,7 +658,7 @@ function plainTextToAgentRichTextDocWithMentionPresentations(value, availableSki
658
658
  doc = hydrateWorkspaceAppMentionIcons(doc, workspaceAppIcons);
659
659
  }
660
660
  if (agentTargets.length > 0) {
661
- doc = hydrateAgentTargetMentionPresentations(doc, agentTargets);
661
+ doc = hydrateAgentMentionPresentations(doc, agentTargets);
662
662
  }
663
663
  return doc;
664
664
  }
@@ -707,18 +707,19 @@ function resolveWorkspaceAppIconUrl(input) {
707
707
  );
708
708
  return exactMatch?.iconUrl?.trim() || fallbackMatch?.iconUrl?.trim() || void 0;
709
709
  }
710
- function hydrateAgentTargetMentionPresentations(node, agentTargets) {
710
+ function hydrateAgentMentionPresentations(node, agentTargets) {
711
711
  const nextContent = node.content?.map(
712
- (child) => hydrateAgentTargetMentionPresentations(child, agentTargets)
712
+ (child) => hydrateAgentMentionPresentations(child, agentTargets)
713
713
  );
714
714
  if (node.type !== "agentFileMention") {
715
715
  return nextContent ? { ...node, content: nextContent } : node;
716
716
  }
717
717
  const attrs = node.attrs ?? {};
718
- if (attrs.kind !== "agent-target") {
718
+ const kind = typeof attrs.kind === "string" ? attrs.kind : "";
719
+ if (kind !== "agent-target" && kind !== "session") {
719
720
  return nextContent ? { ...node, content: nextContent } : node;
720
721
  }
721
- const agentTargetId = typeof attrs.targetId === "string" ? attrs.targetId.trim() : "";
722
+ const agentTargetId = kind === "session" ? typeof attrs.agentTargetId === "string" ? attrs.agentTargetId.trim() : "" : typeof attrs.targetId === "string" ? attrs.targetId.trim() : "";
722
723
  const workspaceId = typeof attrs.workspaceId === "string" ? attrs.workspaceId.trim() : "";
723
724
  const target = resolveAgentTargetPresentation({
724
725
  agentTargetId,
@@ -734,7 +735,7 @@ function hydrateAgentTargetMentionPresentations(node, agentTargets) {
734
735
  ...node.attrs,
735
736
  agentProviderId: target.provider?.trim() ?? "",
736
737
  iconUrl: target.iconUrl?.trim() ?? "",
737
- name: target.name?.trim() || attrs.name
738
+ ...kind === "agent-target" ? { name: target.name?.trim() || attrs.name } : {}
738
739
  },
739
740
  ...nextContent ? { content: nextContent } : {}
740
741
  };
@@ -752,4 +753,4 @@ export {
752
753
  agentRichTextContentToPromptText,
753
754
  AgentRichTextReadonly
754
755
  };
755
- //# sourceMappingURL=chunk-UFIEUC3Y.js.map
756
+ //# sourceMappingURL=chunk-JBX3JPTC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../shared/AgentRichTextReadonly.tsx","../agent-gui/agentGuiNode/agentRichText/agentSkillTokenExtension.ts","../agent-gui/agentGuiNode/model/agentSkillOptions.ts","../agent-gui/agentGuiNode/agentRichText/agentCapabilityTokenExtension.ts","../agent-gui/agentGuiNode/agentRichText/agentRichTextDocument.ts","../agent-gui/agentGuiNode/agentRichText/agentRichTextExtensions.ts"],"sourcesContent":["import { useEffect, type JSX } from \"react\";\nimport type { JSONContent } from \"@tiptap/core\";\nimport { EditorContent, useEditor } from \"@tiptap/react\";\nimport { cn } from \"../app/renderer/lib/utils\";\nimport { plainTextToAgentRichTextDoc } from \"../agent-gui/agentGuiNode/agentRichText/agentRichTextDocument\";\nimport { AGENT_RICH_TEXT_CARET_ANCHOR } from \"../agent-gui/agentGuiNode/agentRichText/agentRichTextCaretAnchor\";\nimport { createAgentRichTextReadonlyExtensions } from \"../agent-gui/agentGuiNode/agentRichText/agentRichTextExtensions\";\nimport type { AgentMessageMarkdownWorkspaceAppIcon } from \"./AgentMessageMarkdown\";\nimport type { AgentGUIProviderSkillOption } from \"../agent-gui/agentGuiNode/model/agentGuiNodeTypes\";\nimport {\n resolveAgentTargetPresentation,\n useAgentTargetPresentations,\n type AgentMessageMarkdownAgentTarget\n} from \"./AgentTargetPresentationContext\";\n\nconst EMPTY_WORKSPACE_APP_ICONS: readonly AgentMessageMarkdownWorkspaceAppIcon[] =\n [];\n\ninterface AgentRichTextReadonlyProps {\n value: string;\n className?: string;\n editorClassName?: string;\n onLinkClick?: (href: string) => void;\n availableSkills?: readonly AgentGUIProviderSkillOption[];\n workspaceAppIcons?: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n agentTargets?: readonly AgentMessageMarkdownAgentTarget[];\n}\n\nexport function AgentRichTextReadonly({\n value,\n className,\n editorClassName,\n onLinkClick,\n availableSkills = [],\n workspaceAppIcons = EMPTY_WORKSPACE_APP_ICONS,\n agentTargets\n}: AgentRichTextReadonlyProps): JSX.Element {\n \"use memo\";\n const contextAgentTargets = useAgentTargetPresentations();\n const effectiveAgentTargets = agentTargets ?? contextAgentTargets;\n const contentDoc = plainTextToAgentRichTextDocWithMentionPresentations(\n value,\n availableSkills,\n workspaceAppIcons,\n effectiveAgentTargets\n );\n const isMentionOnly = isMentionOnlyRichTextDoc(contentDoc);\n const editor = useEditor({\n // AgentGUI is client-only. Deferring editor creation leaves every user\n // message blank for one commit, then changes each transcript turn's\n // measured height when TipTap mounts.\n immediatelyRender: true,\n editable: false,\n extensions: createAgentRichTextReadonlyExtensions({\n skills: availableSkills\n }),\n content: contentDoc,\n editorProps: {\n attributes: {\n class: cn(\n editorClassName,\n \"max-w-full overflow-x-hidden overflow-y-auto whitespace-pre-wrap break-words [overflow-wrap:anywhere] [&_p]:m-0 [&_p]:min-h-[1.45em] [&_a[data-agent-file-mention=true]]:cursor-pointer [&_[data-agent-file-mention=true]]:overflow-hidden\"\n )\n },\n handleDOMEvents: {\n click: (_view, event) => {\n if (!onLinkClick || !(event.target instanceof Element)) {\n return false;\n }\n const mention = event.target.closest(\n '[data-agent-file-mention=\"true\"]'\n );\n if (!(mention instanceof HTMLElement)) {\n return false;\n }\n const href =\n mention instanceof HTMLAnchorElement\n ? mention.getAttribute(\"href\") || \"\"\n : mention.getAttribute(\"data-agent-mention-href\") || \"\";\n if (!href) {\n return false;\n }\n event.preventDefault();\n event.stopPropagation();\n onLinkClick(href);\n return true;\n }\n }\n }\n });\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) {\n return;\n }\n const nextDoc = plainTextToAgentRichTextDocWithMentionPresentations(\n value,\n availableSkills,\n workspaceAppIcons,\n effectiveAgentTargets\n );\n if (JSON.stringify(editor.getJSON()) === JSON.stringify(nextDoc)) {\n return;\n }\n editor.commands.setContent(nextDoc, { emitUpdate: false });\n }, [\n availableSkills,\n effectiveAgentTargets,\n editor,\n value,\n workspaceAppIcons\n ]);\n\n if (!editor) {\n return (\n <div\n className={className}\n data-agent-mention-only={isMentionOnly ? \"true\" : undefined}\n />\n );\n }\n\n return (\n <div\n className={className}\n data-agent-mention-only={isMentionOnly ? \"true\" : undefined}\n >\n <EditorContent editor={editor} />\n </div>\n );\n}\n\nfunction isMentionOnlyRichTextDoc(doc: JSONContent): boolean {\n if (doc.type !== \"doc\") {\n return false;\n }\n const blocks = doc.content ?? [];\n if (blocks.length !== 1) {\n return false;\n }\n const paragraph = blocks[0];\n if (paragraph?.type !== \"paragraph\") {\n return false;\n }\n const inlineContent = (paragraph.content ?? []).filter(\n (node) =>\n !(\n node.type === \"text\" &&\n (node.text ?? \"\").replaceAll(AGENT_RICH_TEXT_CARET_ANCHOR, \"\")\n .length === 0\n )\n );\n return (\n inlineContent.length === 1 && inlineContent[0]?.type === \"agentFileMention\"\n );\n}\n\nfunction plainTextToAgentRichTextDocWithMentionPresentations(\n value: string,\n availableSkills: readonly AgentGUIProviderSkillOption[],\n workspaceAppIcons: readonly AgentMessageMarkdownWorkspaceAppIcon[],\n agentTargets: readonly AgentMessageMarkdownAgentTarget[]\n): JSONContent {\n let doc = plainTextToAgentRichTextDoc(value, { skills: availableSkills });\n if (workspaceAppIcons.length > 0) {\n doc = hydrateWorkspaceAppMentionIcons(doc, workspaceAppIcons);\n }\n if (agentTargets.length > 0) {\n doc = hydrateAgentMentionPresentations(doc, agentTargets);\n }\n return doc;\n}\n\nfunction hydrateWorkspaceAppMentionIcons(\n node: JSONContent,\n workspaceAppIcons: readonly AgentMessageMarkdownWorkspaceAppIcon[]\n): JSONContent {\n const nextContent = node.content?.map((child) =>\n hydrateWorkspaceAppMentionIcons(child, workspaceAppIcons)\n );\n if (node.type !== \"agentFileMention\") {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n const attrs = node.attrs ?? {};\n const kind = typeof attrs.kind === \"string\" ? attrs.kind : \"\";\n const isWorkspaceAppMention = kind === \"workspace-app\";\n const isAppWorkspaceReferenceMention =\n kind === \"workspace-reference\" && attrs.source === \"app\";\n if (!isWorkspaceAppMention && !isAppWorkspaceReferenceMention) {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n const workspaceId =\n typeof attrs.workspaceId === \"string\" ? attrs.workspaceId.trim() : \"\";\n const appId =\n isWorkspaceAppMention && typeof attrs.appId === \"string\"\n ? attrs.appId.trim()\n : typeof attrs.targetId === \"string\"\n ? attrs.targetId.trim()\n : \"\";\n const iconUrl = resolveWorkspaceAppIconUrl({\n appId,\n workspaceId,\n workspaceAppIcons\n });\n if (!iconUrl) {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n return {\n ...node,\n attrs: {\n ...node.attrs,\n iconUrl\n },\n ...(nextContent ? { content: nextContent } : {})\n };\n}\n\nfunction resolveWorkspaceAppIconUrl(input: {\n appId: string;\n workspaceId: string;\n workspaceAppIcons: readonly AgentMessageMarkdownWorkspaceAppIcon[];\n}): string | undefined {\n if (!input.appId) {\n return undefined;\n }\n const exactMatch = input.workspaceAppIcons.find(\n (icon) =>\n icon.appId.trim() === input.appId &&\n (icon.workspaceId?.trim() ?? \"\") === input.workspaceId &&\n icon.iconUrl?.trim()\n );\n const fallbackMatch = input.workspaceAppIcons.find(\n (icon) => icon.appId.trim() === input.appId && icon.iconUrl?.trim()\n );\n return (\n exactMatch?.iconUrl?.trim() || fallbackMatch?.iconUrl?.trim() || undefined\n );\n}\n\nfunction hydrateAgentMentionPresentations(\n node: JSONContent,\n agentTargets: readonly AgentMessageMarkdownAgentTarget[]\n): JSONContent {\n const nextContent = node.content?.map((child) =>\n hydrateAgentMentionPresentations(child, agentTargets)\n );\n if (node.type !== \"agentFileMention\") {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n const attrs = node.attrs ?? {};\n const kind = typeof attrs.kind === \"string\" ? attrs.kind : \"\";\n if (kind !== \"agent-target\" && kind !== \"session\") {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n const agentTargetId =\n kind === \"session\"\n ? typeof attrs.agentTargetId === \"string\"\n ? attrs.agentTargetId.trim()\n : \"\"\n : typeof attrs.targetId === \"string\"\n ? attrs.targetId.trim()\n : \"\";\n const workspaceId =\n typeof attrs.workspaceId === \"string\" ? attrs.workspaceId.trim() : \"\";\n const target = resolveAgentTargetPresentation({\n agentTargetId,\n agentTargets,\n workspaceId\n });\n if (!target) {\n return nextContent ? { ...node, content: nextContent } : node;\n }\n return {\n ...node,\n attrs: {\n ...node.attrs,\n agentProviderId: target.provider?.trim() ?? \"\",\n iconUrl: target.iconUrl?.trim() ?? \"\",\n ...(kind === \"agent-target\"\n ? { name: target.name?.trim() || attrs.name }\n : {})\n },\n ...(nextContent ? { content: nextContent } : {})\n };\n}\n","import { mergeAttributes, Node } from \"@tiptap/core\";\nimport type { AgentGUIProviderSkillOption } from \"../model/agentGuiNodeTypes\";\nimport {\n labelForProviderSkill,\n skillTriggerForPrefix\n} from \"../model/agentSkillOptions\";\n\nexport interface AgentSkillTokenAttrs {\n label: string;\n name: string;\n trigger: string;\n}\n\nexport interface AgentSkillTokenMatch {\n attrs: AgentSkillTokenAttrs;\n end: number;\n}\n\nexport interface AgentSkillTokenExtensionOptions {\n skills?: readonly AgentGUIProviderSkillOption[];\n}\n\nexport function createAgentSkillTokenExtension(\n options: AgentSkillTokenExtensionOptions = {}\n): Node {\n return Node.create({\n name: \"agentSkillToken\",\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: true,\n\n addOptions() {\n return options;\n },\n\n addAttributes() {\n return {\n label: { default: \"\" },\n name: { default: \"\" },\n trigger: { default: \"\" }\n };\n },\n\n parseHTML() {\n return [{ tag: \"span[data-agent-skill-token]\" }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = attrsToSkillTokenAttrs(HTMLAttributes);\n const displayLabel = skillTokenDisplayLabel(attrs);\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"aria-label\": attrs.label,\n contenteditable: \"false\",\n \"data-agent-skill-token\": \"true\",\n \"data-agent-skill-trigger\": attrs.trigger,\n \"data-agent-mention-kind\": \"skill\",\n class: \"tsh-agent-object-token tsh-agent-object-token--entity\"\n }),\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind\",\n \"aria-hidden\": \"true\"\n },\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind-icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ]\n ],\n [\"span\", { class: \"tsh-agent-object-token__main\" }, displayLabel]\n ];\n },\n\n renderText({ node }) {\n return attrsToSkillTokenAttrs(node.attrs ?? {}).trigger;\n }\n });\n}\n\nexport function parseAgentSkillToken(\n text: string,\n start: number,\n skills: readonly AgentGUIProviderSkillOption[] = []\n): AgentSkillTokenMatch | null {\n if (!isSkillTokenBoundary(text[start - 1] ?? \"\")) {\n return null;\n }\n for (const candidate of skillTokenCandidates(skills)) {\n if (!text.startsWith(candidate.trigger, start)) {\n continue;\n }\n const end = start + candidate.trigger.length;\n if (!isSkillTokenBoundary(text[end] ?? \"\")) {\n continue;\n }\n return {\n attrs: candidate,\n end\n };\n }\n return null;\n}\n\nfunction skillTokenCandidates(\n skills: readonly AgentGUIProviderSkillOption[]\n): AgentSkillTokenAttrs[] {\n const candidates = new Map<string, AgentSkillTokenAttrs>();\n for (const skill of skills) {\n for (const prefix of [\"$\", \"/\"] as const) {\n const trigger = skillTriggerForPrefix(skill, prefix);\n if (!trigger || candidates.has(trigger)) {\n continue;\n }\n candidates.set(trigger, {\n label: labelForProviderSkill(skill, prefix),\n name: skill.name.trim(),\n trigger\n });\n }\n }\n return [...candidates.values()].sort(\n (left, right) => right.trigger.length - left.trigger.length\n );\n}\n\nfunction isSkillTokenBoundary(value: string): boolean {\n return value === \"\" || value === \" \" || value === \"\\n\" || value === \"\\t\";\n}\n\nfunction attrsToSkillTokenAttrs(\n attrs: Record<string, unknown>\n): AgentSkillTokenAttrs {\n return {\n label: typeof attrs.label === \"string\" ? attrs.label : \"\",\n name: typeof attrs.name === \"string\" ? attrs.name : \"\",\n trigger: typeof attrs.trigger === \"string\" ? attrs.trigger : \"\"\n };\n}\n\nfunction skillTokenDisplayLabel(attrs: AgentSkillTokenAttrs): string {\n const label = attrs.label.trim() || attrs.trigger.trim();\n if (!label || label.startsWith(\"/\") || label.startsWith(\"$\")) {\n return label;\n }\n return `/${label}`;\n}\n","import type { AgentGUIProviderSkillOption } from \"./agentGuiNodeTypes\";\n\nexport function skillTriggerForPrefix(\n skill: AgentGUIProviderSkillOption,\n prefix: \"$\" | \"/\" | undefined\n): string {\n const trigger = skill.trigger.trim();\n if (!trigger) {\n return \"\";\n }\n if (prefix === undefined || trigger.startsWith(prefix)) {\n return trigger;\n }\n if (trigger.startsWith(\"$\") || trigger.startsWith(\"/\")) {\n return `${prefix}${trigger.slice(1)}`;\n }\n return `${prefix}${trigger}`;\n}\n\nexport function labelForProviderSkill(\n skill: AgentGUIProviderSkillOption,\n prefix: \"$\" | \"/\" | undefined\n): string {\n return stripSkillTriggerPrefix(skillTriggerForPrefix(skill, prefix));\n}\n\nexport function promptForProviderSkills(input: {\n prompt: string;\n skills: readonly AgentGUIProviderSkillOption[];\n}): string {\n let prompt = input.prompt;\n for (const skill of input.skills) {\n if (!skill.invocation) {\n continue;\n }\n const nativePrefix = skill.invocation === \"promptItem\" ? \"$\" : \"/\";\n const nativeTrigger = skillTriggerForPrefix(skill, nativePrefix);\n const aliasPrefix = nativePrefix === \"$\" ? \"/\" : \"$\";\n const aliasTrigger = skillTriggerForPrefix(skill, aliasPrefix);\n if (!nativeTrigger || !aliasTrigger || nativeTrigger === aliasTrigger) {\n continue;\n }\n prompt = replaceSkillTriggerToken(prompt, aliasTrigger, nativeTrigger);\n }\n return prompt;\n}\n\nexport function skillDescriptionForDisplay(\n description: string | undefined\n): string | undefined {\n const line = description\n ?.split(/\\r?\\n/)\n .map((part) => part.trim())\n .find((part) => part !== \"\");\n return line || undefined;\n}\n\nfunction replaceSkillTriggerToken(\n prompt: string,\n from: string,\n to: string\n): string {\n return prompt.replace(\n new RegExp(`(^|\\\\s)${escapeRegExp(from)}(?=$|\\\\s)`, \"g\"),\n (_match, separator: string) => `${separator}${to}`\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction stripSkillTriggerPrefix(trigger: string): string {\n if (trigger.startsWith(\"$\") || trigger.startsWith(\"/\")) {\n return trigger.slice(1);\n }\n return trigger;\n}\n","import { mergeAttributes, Node } from \"@tiptap/core\";\n\nexport interface AgentCapabilityTokenOption {\n capability: string;\n label: string;\n name: string;\n trigger: string;\n}\n\nexport interface AgentCapabilityTokenAttrs {\n capability: string;\n label: string;\n name: string;\n trigger: string;\n}\n\nexport interface AgentCapabilityTokenMatch {\n attrs: AgentCapabilityTokenAttrs;\n end: number;\n}\n\nexport interface AgentCapabilityTokenExtensionOptions {\n capabilities?: readonly AgentCapabilityTokenOption[];\n}\n\nexport function createAgentCapabilityTokenExtension(\n options: AgentCapabilityTokenExtensionOptions = {}\n): Node {\n return Node.create({\n name: \"agentCapabilityToken\",\n group: \"inline\",\n inline: true,\n atom: true,\n selectable: true,\n\n addOptions() {\n return options;\n },\n\n addAttributes() {\n return {\n capability: { default: \"\" },\n label: { default: \"\" },\n name: { default: \"\" },\n trigger: { default: \"\" }\n };\n },\n\n parseHTML() {\n return [{ tag: \"span[data-agent-capability-token]\" }];\n },\n\n renderHTML({ HTMLAttributes }) {\n const attrs = attrsToCapabilityTokenAttrs(HTMLAttributes);\n const displayLabel = capabilityTokenDisplayLabel(attrs);\n return [\n \"span\",\n mergeAttributes(HTMLAttributes, {\n \"aria-label\": attrs.label,\n contenteditable: \"false\",\n \"data-agent-capability-token\": \"true\",\n \"data-agent-capability-trigger\": attrs.trigger,\n \"data-agent-mention-kind\": \"capability\",\n class: \"tsh-agent-object-token tsh-agent-object-token--entity\"\n }),\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind\",\n \"aria-hidden\": \"true\"\n },\n [\n \"span\",\n {\n class: \"tsh-agent-object-token__kind-icon\",\n \"aria-hidden\": \"true\"\n },\n \"\"\n ]\n ],\n [\"span\", { class: \"tsh-agent-object-token__main\" }, displayLabel]\n ];\n },\n\n renderText({ node }) {\n return attrsToCapabilityTokenAttrs(node.attrs ?? {}).trigger;\n }\n });\n}\n\nexport function parseAgentCapabilityToken(\n text: string,\n start: number,\n capabilities: readonly AgentCapabilityTokenOption[] = []\n): AgentCapabilityTokenMatch | null {\n if (!isCapabilityTokenBoundary(text[start - 1] ?? \"\")) {\n return null;\n }\n for (const candidate of capabilityTokenCandidates(capabilities)) {\n if (!text.startsWith(candidate.trigger, start)) {\n continue;\n }\n const end = start + candidate.trigger.length;\n if (!isCapabilityTokenBoundary(text[end] ?? \"\")) {\n continue;\n }\n return {\n attrs: candidate,\n end\n };\n }\n return null;\n}\n\nfunction capabilityTokenCandidates(\n capabilities: readonly AgentCapabilityTokenOption[]\n): AgentCapabilityTokenAttrs[] {\n const candidates = new Map<string, AgentCapabilityTokenAttrs>();\n for (const capability of capabilities) {\n const trigger = capability.trigger.trim();\n if (!trigger || candidates.has(trigger)) {\n continue;\n }\n candidates.set(trigger, {\n capability: capability.capability.trim(),\n label: capability.label.trim(),\n name: capability.name.trim(),\n trigger\n });\n }\n return [...candidates.values()].sort(\n (left, right) => right.trigger.length - left.trigger.length\n );\n}\n\nfunction isCapabilityTokenBoundary(value: string): boolean {\n return value === \"\" || value === \" \" || value === \"\\n\" || value === \"\\t\";\n}\n\nfunction attrsToCapabilityTokenAttrs(\n attrs: Record<string, unknown>\n): AgentCapabilityTokenAttrs {\n return {\n capability: typeof attrs.capability === \"string\" ? attrs.capability : \"\",\n label: typeof attrs.label === \"string\" ? attrs.label : \"\",\n name: typeof attrs.name === \"string\" ? attrs.name : \"\",\n trigger: typeof attrs.trigger === \"string\" ? attrs.trigger : \"\"\n };\n}\n\nfunction capabilityTokenDisplayLabel(attrs: AgentCapabilityTokenAttrs): string {\n const label = attrs.label.trim() || attrs.trigger.trim();\n if (!label || label.startsWith(\"/\") || label.startsWith(\"$\")) {\n return label;\n }\n return `/${label}`;\n}\n","import type { Editor, JSONContent } from \"@tiptap/core\";\nimport {\n attrsToMentionItem,\n formatAgentMentionMarkdown,\n mentionItemToAttrs,\n parseAgentMentionMarkdown\n} from \"./agentFileMentionExtension\";\nimport type { AgentGUIProviderSkillOption } from \"../model/agentGuiNodeTypes\";\nimport { parseAgentSkillToken } from \"./agentSkillTokenExtension\";\nimport {\n parseAgentCapabilityToken,\n type AgentCapabilityTokenOption\n} from \"./agentCapabilityTokenExtension\";\nimport { AGENT_RICH_TEXT_CARET_ANCHOR } from \"./agentRichTextCaretAnchor\";\n\nexport interface AgentRichTextDocumentOptions {\n capabilities?: readonly AgentCapabilityTokenOption[];\n skills?: readonly AgentGUIProviderSkillOption[];\n}\n\nfunction createEmptyDocument(): JSONContent {\n return {\n type: \"doc\",\n content: [{ type: \"paragraph\" }]\n };\n}\n\nfunction isVisualLineStart(content: readonly JSONContent[]): boolean {\n return content.length === 0 || content.at(-1)?.type === \"hardBreak\";\n}\n\nfunction createParagraphFromText(\n text: string,\n options: AgentRichTextDocumentOptions = {}\n): JSONContent {\n const content: JSONContent[] = [];\n let index = 0;\n let textBuffer = \"\";\n\n const flushTextBuffer = (): void => {\n if (textBuffer.length === 0) {\n return;\n }\n content.push({ type: \"text\", text: textBuffer });\n textBuffer = \"\";\n };\n\n while (index < text.length) {\n const current = text[index];\n if (current === \"\\n\") {\n flushTextBuffer();\n content.push({ type: \"hardBreak\" });\n index += 1;\n continue;\n }\n\n const parsedMention = parseAgentMentionMarkdown(text, index);\n if (parsedMention) {\n flushTextBuffer();\n if (isVisualLineStart(content)) {\n content.push({ type: \"text\", text: AGENT_RICH_TEXT_CARET_ANCHOR });\n }\n content.push({\n type: \"agentFileMention\",\n // 转成规范 node attrs(如 workspace-reference 的 source/groupId/fileCount),\n // 否则只读回显里的 reference chip 拿不到文件数 → 不显示「N 个文件」角标。\n attrs: mentionItemToAttrs(parsedMention.item)\n });\n index = parsedMention.end;\n continue;\n }\n\n const parsedCapabilityToken = parseAgentCapabilityToken(\n text,\n index,\n options.capabilities\n );\n if (parsedCapabilityToken) {\n flushTextBuffer();\n content.push({\n type: \"agentCapabilityToken\",\n attrs: parsedCapabilityToken.attrs\n });\n index = parsedCapabilityToken.end;\n continue;\n }\n\n const parsedSkillToken = parseAgentSkillToken(text, index, options.skills);\n if (parsedSkillToken) {\n flushTextBuffer();\n content.push({\n type: \"agentSkillToken\",\n attrs: parsedSkillToken.attrs\n });\n index = parsedSkillToken.end;\n continue;\n }\n\n textBuffer += current;\n index += 1;\n }\n\n flushTextBuffer();\n return content.length > 0\n ? { type: \"paragraph\", content }\n : { type: \"paragraph\" };\n}\n\nexport function plainTextToAgentRichTextDoc(\n text: string,\n options: AgentRichTextDocumentOptions = {}\n): JSONContent {\n if (text.length === 0) {\n return createEmptyDocument();\n }\n const normalized = text.replace(/\\r\\n?/g, \"\\n\");\n return {\n type: \"doc\",\n content: [createParagraphFromText(normalized, options)]\n };\n}\n\nexport function plainTextToAgentRichTextInlineContent(\n text: string,\n options: AgentRichTextDocumentOptions = {}\n): JSONContent[] {\n const paragraph = createParagraphFromText(\n text.replace(/\\r\\n?/g, \"\\n\"),\n options\n );\n return paragraph.content ?? [];\n}\n\nexport function agentRichTextDocToPromptText(doc: JSONContent): string {\n if (doc.type !== \"doc\") {\n return nodeToPromptText(doc);\n }\n return agentRichTextContentToPromptText(doc.content ?? []);\n}\n\nexport function editorToPromptText(editor: Editor): string {\n return agentRichTextDocToPromptText(editor.getJSON());\n}\n\nexport function agentRichTextContentToPromptText(\n content: readonly JSONContent[]\n): string {\n if (content.length === 0) {\n return \"\";\n }\n const separator = content.some((node) => isBlockPromptNode(node)) ? \"\\n\" : \"\";\n return content.map((node) => nodeToPromptText(node)).join(separator);\n}\n\nfunction isBlockPromptNode(node: JSONContent): boolean {\n return node.type === \"doc\" || node.type === \"paragraph\";\n}\n\nfunction nodeToPromptText(node: JSONContent): string {\n if (node.type === \"text\") {\n return (node.text ?? \"\").replaceAll(AGENT_RICH_TEXT_CARET_ANCHOR, \"\");\n }\n if (node.type === \"agentFileMention\") {\n return formatAgentMentionMarkdown(attrsToMentionItem(node.attrs ?? {}));\n }\n if (node.type === \"agentSkillToken\") {\n return typeof node.attrs?.trigger === \"string\" ? node.attrs.trigger : \"\";\n }\n if (node.type === \"agentCapabilityToken\") {\n return typeof node.attrs?.trigger === \"string\" ? node.attrs.trigger : \"\";\n }\n if (node.type === \"hardBreak\") {\n return \"\\n\";\n }\n if (!node.content || node.content.length === 0) {\n return \"\";\n }\n return node.content.map((child) => nodeToPromptText(child)).join(\"\");\n}\n","import { Extension, type Extensions } from \"@tiptap/core\";\nimport { NodeSelection, TextSelection } from \"@tiptap/pm/state\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport {\n createAgentFileMentionExtension,\n type AgentFileMentionExtensionOptions\n} from \"./agentFileMentionExtension\";\nimport {\n createAgentCapabilityTokenExtension,\n type AgentCapabilityTokenExtensionOptions\n} from \"./agentCapabilityTokenExtension\";\nimport {\n createAgentSkillTokenExtension,\n type AgentSkillTokenExtensionOptions\n} from \"./agentSkillTokenExtension\";\n\nfunction createAgentPromptStarterKit(): Extensions[0] {\n return StarterKit.configure({\n blockquote: false,\n bold: false,\n bulletList: false,\n code: false,\n codeBlock: false,\n dropcursor: false,\n gapcursor: false,\n heading: false,\n horizontalRule: false,\n italic: false,\n link: false,\n listItem: false,\n listKeymap: false,\n orderedList: false,\n strike: false,\n trailingNode: false,\n underline: false\n });\n}\n\nfunction createAgentTokenKeyboardExtension(): Extensions[0] {\n return Extension.create({\n name: \"agentTokenKeyboard\",\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n props: {\n handleKeyDown(view, event) {\n if (event.key !== \"Backspace\" && event.key !== \"ArrowLeft\") {\n return false;\n }\n const { doc, selection } = view.state;\n if (\n selection instanceof NodeSelection &&\n isSelectableAgentToken(selection.node)\n ) {\n event.preventDefault();\n if (event.key === \"ArrowLeft\") {\n view.dispatch(\n view.state.tr.setSelection(\n TextSelection.create(doc, selection.from)\n )\n );\n } else {\n view.dispatch(\n view.state.tr.delete(selection.from, selection.to)\n );\n }\n return true;\n }\n if (!selection.empty) {\n return false;\n }\n const nodeBefore = selection.$from.nodeBefore;\n if (!nodeBefore || !isSelectableAgentToken(nodeBefore)) {\n return false;\n }\n event.preventDefault();\n view.dispatch(\n view.state.tr.setSelection(\n NodeSelection.create(\n doc,\n selection.from - nodeBefore.nodeSize\n )\n )\n );\n return true;\n }\n }\n })\n ];\n }\n });\n}\n\nfunction isSelectableAgentToken(\n node: { type: { name: string }; nodeSize: number } | null\n): boolean {\n return (\n node?.type.name === \"agentSkillToken\" ||\n node?.type.name === \"agentCapabilityToken\"\n );\n}\n\nexport function createAgentRichTextInputExtensions(\n fileMentionOptions?: AgentFileMentionExtensionOptions,\n skillTokenOptions?: AgentSkillTokenExtensionOptions,\n capabilityTokenOptions?: AgentCapabilityTokenExtensionOptions\n): Extensions {\n return [\n createAgentTokenKeyboardExtension(),\n createAgentPromptStarterKit(),\n createAgentFileMentionExtension(fileMentionOptions),\n createAgentCapabilityTokenExtension(capabilityTokenOptions),\n createAgentSkillTokenExtension(skillTokenOptions)\n ];\n}\n\nexport function createAgentRichTextReadonlyExtensions(\n skillTokenOptions?: AgentSkillTokenExtensionOptions,\n capabilityTokenOptions?: AgentCapabilityTokenExtensionOptions\n): Extensions {\n return [\n createAgentPromptStarterKit(),\n createAgentFileMentionExtension({\n enableSuggestions: false,\n renderAsLink: true\n }),\n createAgentCapabilityTokenExtension(capabilityTokenOptions),\n createAgentSkillTokenExtension(skillTokenOptions)\n ];\n}\n"],"mappings":"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","names":["mergeAttributes","Node"]}
@@ -1,10 +1,7 @@
1
- import {
2
- agentGuiWorkbenchProviderFromIdentifier
3
- } from "./chunk-QY22OBJS.js";
4
1
  import {
5
2
  agentGuiWorkbenchProviders,
6
3
  normalizeAgentGuiWorkbenchProvider
7
- } from "./chunk-L3GMMGRS.js";
4
+ } from "./chunk-R2ZADXRB.js";
8
5
 
9
6
  // workbench/state.ts
10
7
  function createDefaultAgentGuiWorkbenchNodeState(provider = "codex") {
@@ -94,16 +91,6 @@ function areAgentGuiWorkbenchNodeStatesEqual(left, right) {
94
91
  right.composerOverridesByProvider
95
92
  ) && left.conversationCount === right.conversationCount && left.conversationRailCollapsed === right.conversationRailCollapsed && left.conversationRailWidthPx === right.conversationRailWidthPx && left.lastActiveAgentSessionId === right.lastActiveAgentSessionId && left.provider === right.provider && (left.agentTargetId ?? null) === (right.agentTargetId ?? null);
96
93
  }
97
- function agentGuiWorkbenchProviderFromInstanceId(instanceId) {
98
- const provider = agentGuiWorkbenchProviderFromInstanceIdOrNull(instanceId);
99
- if (!provider) {
100
- throw new Error("agent_gui_workbench.instance_provider_required");
101
- }
102
- return provider;
103
- }
104
- function agentGuiWorkbenchProviderFromInstanceIdOrNull(instanceId) {
105
- return agentGuiWorkbenchProviderFromIdentifier(instanceId);
106
- }
107
94
  function createAgentGuiWorkbenchNodeStateSource(input) {
108
95
  const typeId = input.typeId ?? "agent-gui";
109
96
  const nodeStateByKey = /* @__PURE__ */ new Map();
@@ -296,8 +283,6 @@ export {
296
283
  areAgentGuiWorkbenchStatesEqual,
297
284
  normalizeAgentGuiWorkbenchNodeState,
298
285
  areAgentGuiWorkbenchNodeStatesEqual,
299
- agentGuiWorkbenchProviderFromInstanceId,
300
- agentGuiWorkbenchProviderFromInstanceIdOrNull,
301
286
  createAgentGuiWorkbenchNodeStateSource
302
287
  };
303
- //# sourceMappingURL=chunk-4YVKAPKW.js.map
288
+ //# sourceMappingURL=chunk-JLRPIEIE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../workbench/state.ts"],"sourcesContent":["import type {\n WorkbenchHostExternalStateLookupInput,\n WorkbenchHostExternalStateSource\n} from \"@tutti-os/workbench-surface\";\nimport {\n agentGuiWorkbenchProviders,\n normalizeAgentGuiWorkbenchProvider\n} from \"./providerCatalog.ts\";\nimport type {\n AgentGuiWorkbenchComposerOverrides,\n AgentGuiWorkbenchComposerOverridesByAgentTargetId,\n AgentGuiWorkbenchComposerOverridesByProvider,\n AgentGuiWorkbenchNodeState,\n AgentGuiWorkbenchProvider,\n AgentGuiWorkbenchState,\n AgentGuiWorkbenchWorkspaceState\n} from \"./types.ts\";\n\ntype AgentGuiWorkbenchStateLookupRequest = Pick<\n WorkbenchHostExternalStateLookupInput,\n \"instanceId\" | \"typeId\"\n> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>;\n\nexport function createDefaultAgentGuiWorkbenchNodeState(\n provider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n return {\n agentTargetId: null,\n composerOverrides: null,\n composerOverridesByAgentTargetId: null,\n composerOverridesByProvider: null,\n conversationCount: null,\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null,\n provider\n };\n}\n\nexport function normalizeAgentGuiWorkbenchState(\n state: unknown\n): AgentGuiWorkbenchState {\n if (!isRecord(state)) {\n return createDefaultAgentGuiWorkbenchState();\n }\n const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof state.lastActiveAgentSessionId === \"string\"\n ? state.lastActiveAgentSessionId\n : null\n };\n}\n\n/**\n * One-time persisted-state reader for snapshots written before agentTargetId\n * became the canonical AgentGUI selection key. Current-state normalizers stay\n * strict so live callers cannot continue using the removed alias.\n */\nexport function migrateLegacyAgentGuiWorkbenchState(state: unknown): unknown {\n if (\n !isRecord(state) ||\n normalizeOptionalNonEmptyString(state.agentTargetId)\n ) {\n return state;\n }\n const legacyAgentTargetId = normalizeOptionalNonEmptyString(\n state.providerTargetId\n );\n return legacyAgentTargetId\n ? { ...state, agentTargetId: legacyAgentTargetId }\n : state;\n}\n\nexport function projectAgentGuiWorkbenchState(\n state: AgentGuiWorkbenchNodeState\n): AgentGuiWorkbenchState {\n const agentTargetId = normalizeOptionalNonEmptyString(state.agentTargetId);\n return {\n ...(agentTargetId ? { agentTargetId } : {}),\n conversationRailCollapsed: state.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n state.conversationRailWidthPx\n ),\n lastActiveAgentSessionId: state.lastActiveAgentSessionId ?? null\n };\n}\n\nexport function areAgentGuiWorkbenchStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId\n );\n}\n\nexport function normalizeAgentGuiWorkbenchNodeState(\n state: unknown,\n fallbackProvider: AgentGuiWorkbenchProvider = \"codex\"\n): AgentGuiWorkbenchNodeState {\n const persistedState = isRecord(state) ? state : {};\n const provider =\n persistedState.provider === undefined || persistedState.provider === null\n ? fallbackProvider\n : normalizeAgentGuiWorkbenchProvider(persistedState.provider);\n return {\n ...createDefaultAgentGuiWorkbenchNodeState(provider),\n agentTargetId: normalizeOptionalNonEmptyString(\n persistedState.agentTargetId\n ),\n composerOverrides: normalizeAgentGuiWorkbenchComposerOverrides(\n persistedState.composerOverrides\n ),\n composerOverridesByAgentTargetId:\n normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n persistedState.composerOverridesByAgentTargetId\n ),\n composerOverridesByProvider:\n normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n persistedState.composerOverridesByProvider\n ),\n conversationCount: normalizeOptionalNonNegativeNumber(\n persistedState.conversationCount\n ),\n conversationRailCollapsed:\n persistedState.conversationRailCollapsed === true,\n conversationRailWidthPx: normalizeOptionalPositiveNumber(\n persistedState.conversationRailWidthPx\n ),\n lastActiveAgentSessionId:\n typeof persistedState.lastActiveAgentSessionId === \"string\"\n ? persistedState.lastActiveAgentSessionId\n : null,\n provider\n };\n}\n\nexport function areAgentGuiWorkbenchNodeStatesEqual(\n left: AgentGuiWorkbenchNodeState,\n right: AgentGuiWorkbenchNodeState\n): boolean {\n return (\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null) &&\n composerOverridesEqual(left.composerOverrides, right.composerOverrides) &&\n composerOverridesByAgentTargetIdEqual(\n left.composerOverridesByAgentTargetId,\n right.composerOverridesByAgentTargetId\n ) &&\n composerOverridesByProviderEqual(\n left.composerOverridesByProvider,\n right.composerOverridesByProvider\n ) &&\n left.conversationCount === right.conversationCount &&\n left.conversationRailCollapsed === right.conversationRailCollapsed &&\n left.conversationRailWidthPx === right.conversationRailWidthPx &&\n left.lastActiveAgentSessionId === right.lastActiveAgentSessionId &&\n left.provider === right.provider &&\n (left.agentTargetId ?? null) === (right.agentTargetId ?? null)\n );\n}\n\nexport function createAgentGuiWorkbenchNodeStateSource(input: {\n typeId?: string;\n workspaceId: string;\n}): {\n externalStateSource: WorkbenchHostExternalStateSource<\n AgentGuiWorkbenchState | null,\n AgentGuiWorkbenchWorkspaceState\n >;\n readNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest\n ) => AgentGuiWorkbenchState | null;\n writeNodeState: (\n request: AgentGuiWorkbenchStateLookupRequest & {\n state: AgentGuiWorkbenchState;\n }\n ) => void;\n /**\n * Returns the launch instanceId of an open node currently showing the given\n * agent session, or null when none is found. Used to focus an existing\n * conversation instead of launching a duplicate node.\n */\n findInstanceIdByAgentSessionId: (agentSessionId: string) => string | null;\n} {\n const typeId = input.typeId ?? \"agent-gui\";\n const nodeStateByKey = new Map<string, AgentGuiWorkbenchState>();\n // Tracks the launch instanceId behind each state key so a node can be located\n // by the session it is currently showing, even when its key is node-scoped.\n const instanceIdByKey = new Map<string, string>();\n const listeners = new Set<() => void>();\n\n const lookupState = (request: AgentGuiWorkbenchStateLookupRequest) => {\n const nodeState = request.nodeId\n ? nodeStateByKey.get(agentGuiWorkbenchNodeStateKey(request))\n : null;\n const state =\n nodeState ??\n nodeStateByKey.get(agentGuiWorkbenchInstanceStateKey(request));\n return state ? { ...state } : null;\n };\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n return {\n externalStateSource: {\n getNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getSnapshotNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n getWorkspaceState() {\n return {\n workspaceId: input.workspaceId\n };\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n },\n readNodeState(request) {\n if (request.typeId !== typeId) {\n return null;\n }\n return lookupState(request);\n },\n findInstanceIdByAgentSessionId(agentSessionId) {\n const target = agentSessionId.trim();\n if (!target) {\n return null;\n }\n for (const [key, state] of nodeStateByKey) {\n if (state.lastActiveAgentSessionId?.trim() === target) {\n return instanceIdByKey.get(key) ?? null;\n }\n }\n return null;\n },\n writeNodeState(request) {\n if (request.typeId !== typeId) {\n return;\n }\n const key = agentGuiWorkbenchNodeStateKey(request);\n instanceIdByKey.set(key, request.instanceId);\n const previous = nodeStateByKey.get(key);\n let clearedInstanceSeed = false;\n if (request.nodeId) {\n const instanceKey = agentGuiWorkbenchInstanceStateKey(request);\n instanceIdByKey.delete(instanceKey);\n clearedInstanceSeed = nodeStateByKey.delete(instanceKey);\n }\n const next = {\n ...normalizeAgentGuiWorkbenchState(request.state)\n };\n nodeStateByKey.set(key, next);\n if (\n !clearedInstanceSeed &&\n previous &&\n areAgentGuiWorkbenchMemoryStatesEqual(previous, next)\n ) {\n return;\n }\n notify();\n }\n };\n}\n\nfunction areAgentGuiWorkbenchMemoryStatesEqual(\n left: AgentGuiWorkbenchState,\n right: AgentGuiWorkbenchState\n): boolean {\n return areAgentGuiWorkbenchStatesEqual(left, right);\n}\n\nfunction agentGuiWorkbenchNodeStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\"> &\n Partial<Pick<WorkbenchHostExternalStateLookupInput, \"nodeId\">>\n): string {\n return request.nodeId\n ? `node:${request.nodeId}`\n : agentGuiWorkbenchInstanceStateKey(request);\n}\n\nfunction agentGuiWorkbenchInstanceStateKey(\n request: Pick<WorkbenchHostExternalStateLookupInput, \"instanceId\">\n): string {\n return `instance:${request.instanceId}`;\n}\n\nfunction createDefaultAgentGuiWorkbenchState(): AgentGuiWorkbenchState {\n return {\n conversationRailCollapsed: false,\n conversationRailWidthPx: null,\n lastActiveAgentSessionId: null\n };\n}\n\nfunction normalizeOptionalNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverrides(\n value: unknown\n): AgentGuiWorkbenchComposerOverrides | null {\n if (!isRecord(value)) {\n return null;\n }\n const composerOverrides: AgentGuiWorkbenchComposerOverrides = {};\n if (typeof value.model === \"string\" && value.model.trim()) {\n composerOverrides.model = value.model.trim();\n }\n if (\n typeof value.reasoningEffort === \"string\" &&\n value.reasoningEffort.trim()\n ) {\n composerOverrides.reasoningEffort = value.reasoningEffort.trim();\n }\n if (\n typeof value.permissionModeId === \"string\" &&\n value.permissionModeId.trim()\n ) {\n composerOverrides.permissionModeId = value.permissionModeId.trim();\n }\n if (typeof value.planMode === \"boolean\") {\n composerOverrides.planMode = value.planMode;\n }\n return Object.keys(composerOverrides).length > 0 ? composerOverrides : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByProvider(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByProvider | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByProvider = {};\n for (const provider of agentGuiWorkbenchProviders) {\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(\n value[provider]\n );\n if (overrides) {\n result[provider] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeAgentGuiWorkbenchComposerOverridesByAgentTargetId(\n value: unknown\n): AgentGuiWorkbenchComposerOverridesByAgentTargetId | null {\n if (!isRecord(value)) {\n return null;\n }\n const result: AgentGuiWorkbenchComposerOverridesByAgentTargetId = {};\n for (const [rawAgentTargetId, rawOverrides] of Object.entries(value)) {\n const agentTargetId = normalizeOptionalNonEmptyString(rawAgentTargetId);\n if (!agentTargetId) {\n continue;\n }\n const overrides = normalizeAgentGuiWorkbenchComposerOverrides(rawOverrides);\n if (overrides) {\n result[agentTargetId] = overrides;\n }\n }\n return Object.keys(result).length > 0 ? result : null;\n}\n\nfunction normalizeOptionalPositiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? Math.round(value)\n : null;\n}\n\nfunction normalizeOptionalNonNegativeNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? Math.round(value)\n : null;\n}\n\nfunction composerOverridesEqual(\n left: AgentGuiWorkbenchComposerOverrides | null | undefined,\n right: AgentGuiWorkbenchComposerOverrides | null | undefined\n): boolean {\n return (\n (left?.model ?? null) === (right?.model ?? null) &&\n (left?.permissionModeId ?? null) === (right?.permissionModeId ?? null) &&\n (left?.planMode ?? null) === (right?.planMode ?? null) &&\n (left?.reasoningEffort ?? null) === (right?.reasoningEffort ?? null)\n );\n}\n\nfunction composerOverridesByProviderEqual(\n left: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByProvider | null | undefined\n): boolean {\n for (const provider of agentGuiWorkbenchProviders) {\n if (!composerOverridesEqual(left?.[provider], right?.[provider])) {\n return false;\n }\n }\n return true;\n}\n\nfunction composerOverridesByAgentTargetIdEqual(\n left: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined,\n right: AgentGuiWorkbenchComposerOverridesByAgentTargetId | null | undefined\n): boolean {\n const leftKeys = Object.keys(left ?? {}).sort();\n const rightKeys = Object.keys(right ?? {}).sort();\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n return leftKeys.every(\n (key, index) =>\n key === rightKeys[index] &&\n composerOverridesEqual(left?.[key], right?.[key])\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":[]}