@parhelia/core 0.1.12888 → 0.1.12890

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 (342) hide show
  1. package/dist/agents-view/AgentCard.d.ts +2 -1
  2. package/dist/agents-view/AgentCard.js +14 -38
  3. package/dist/agents-view/AgentCard.js.map +1 -1
  4. package/dist/agents-view/AgentGalleryCard.d.ts +12 -0
  5. package/dist/agents-view/AgentGalleryCard.js +12 -0
  6. package/dist/agents-view/AgentGalleryCard.js.map +1 -0
  7. package/dist/agents-view/AgentGalleryView.d.ts +18 -0
  8. package/dist/agents-view/AgentGalleryView.js +88 -0
  9. package/dist/agents-view/AgentGalleryView.js.map +1 -0
  10. package/dist/agents-view/AgentProfileIcon.d.ts +9 -0
  11. package/dist/agents-view/AgentProfileIcon.js +28 -0
  12. package/dist/agents-view/AgentProfileIcon.js.map +1 -0
  13. package/dist/agents-view/AgentsView.d.ts +6 -1
  14. package/dist/agents-view/AgentsView.js +40 -12
  15. package/dist/agents-view/AgentsView.js.map +1 -1
  16. package/dist/agents-view/AgentsWorkspaceView.js +40 -21
  17. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  18. package/dist/agents-view/DateAgentsGroup.d.ts +2 -1
  19. package/dist/agents-view/DateAgentsGroup.js +2 -2
  20. package/dist/agents-view/DateAgentsGroup.js.map +1 -1
  21. package/dist/agents-view/ProfileAgentsGroup.d.ts +2 -1
  22. package/dist/agents-view/ProfileAgentsGroup.js +5 -8
  23. package/dist/agents-view/ProfileAgentsGroup.js.map +1 -1
  24. package/dist/agents-view/RenameAgentDialog.d.ts +12 -0
  25. package/dist/agents-view/RenameAgentDialog.js +40 -0
  26. package/dist/agents-view/RenameAgentDialog.js.map +1 -0
  27. package/dist/components/FilterInput.d.ts +2 -0
  28. package/dist/components/FilterInput.js +4 -2
  29. package/dist/components/FilterInput.js.map +1 -1
  30. package/dist/components/ui/alert-dialog.d.ts +1 -1
  31. package/dist/components/ui/alert-dialog.js +5 -5
  32. package/dist/components/ui/alert-dialog.js.map +1 -1
  33. package/dist/components/ui/alert.d.ts +3 -2
  34. package/dist/components/ui/alert.js +9 -4
  35. package/dist/components/ui/alert.js.map +1 -1
  36. package/dist/components/ui/badge.d.ts +1 -1
  37. package/dist/components/ui/button.d.ts +9 -4
  38. package/dist/components/ui/button.js +16 -9
  39. package/dist/components/ui/button.js.map +1 -1
  40. package/dist/components/ui/dialog.d.ts +1 -1
  41. package/dist/components/ui/dialog.js +4 -3
  42. package/dist/components/ui/dialog.js.map +1 -1
  43. package/dist/components/ui/styled-dialog-title.js +1 -1
  44. package/dist/components/ui/styled-dialog-title.js.map +1 -1
  45. package/dist/config/config.js +4 -3
  46. package/dist/config/config.js.map +1 -1
  47. package/dist/editor/FieldListField.js +6 -2
  48. package/dist/editor/FieldListField.js.map +1 -1
  49. package/dist/editor/GlobalMenuBar.js +3 -1
  50. package/dist/editor/GlobalMenuBar.js.map +1 -1
  51. package/dist/editor/LinkEditorDialog.js +3 -3
  52. package/dist/editor/LinkEditorDialog.js.map +1 -1
  53. package/dist/editor/MainLayout.js +11 -9
  54. package/dist/editor/MainLayout.js.map +1 -1
  55. package/dist/editor/WorkspaceTitleSwitcher.d.ts +5 -0
  56. package/dist/editor/WorkspaceTitleSwitcher.js +86 -0
  57. package/dist/editor/WorkspaceTitleSwitcher.js.map +1 -0
  58. package/dist/editor/ai/AgentInlineDialogContent.js +1 -1
  59. package/dist/editor/ai/AgentInlineDialogContent.js.map +1 -1
  60. package/dist/editor/ai/Agents.js +155 -43
  61. package/dist/editor/ai/Agents.js.map +1 -1
  62. package/dist/editor/ai/InlineAiDialog.js +1 -1
  63. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  64. package/dist/editor/ai/dialogs/QuestionnaireInline.js +52 -82
  65. package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
  66. package/dist/editor/ai/terminal/agentQuestionnaireRecap.d.ts +82 -0
  67. package/dist/editor/ai/terminal/agentQuestionnaireRecap.js +277 -0
  68. package/dist/editor/ai/terminal/agentQuestionnaireRecap.js.map +1 -0
  69. package/dist/editor/ai/terminal/agentQuestionnaireTranscriptRecovery.d.ts +3 -0
  70. package/dist/editor/ai/terminal/agentQuestionnaireTranscriptRecovery.js +3 -3
  71. package/dist/editor/ai/terminal/agentQuestionnaireTranscriptRecovery.js.map +1 -1
  72. package/dist/editor/ai/terminal/agentSessionLiveTotals.d.ts +5 -0
  73. package/dist/editor/ai/terminal/agentSessionLiveTotals.js +14 -0
  74. package/dist/editor/ai/terminal/agentSessionLiveTotals.js.map +1 -1
  75. package/dist/editor/ai/terminal/agentSessionSnapshot.js +2 -0
  76. package/dist/editor/ai/terminal/agentSessionSnapshot.js.map +1 -1
  77. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js +1 -1
  78. package/dist/editor/ai/terminal/components/AgentFullPromptControls.js.map +1 -1
  79. package/dist/editor/ai/terminal/components/AgentGreeting.js +5 -2
  80. package/dist/editor/ai/terminal/components/AgentGreeting.js.map +1 -1
  81. package/dist/editor/ai/terminal/components/AgentProjectProgress.d.ts +12 -0
  82. package/dist/editor/ai/terminal/components/AgentProjectProgress.js +207 -0
  83. package/dist/editor/ai/terminal/components/AgentProjectProgress.js.map +1 -0
  84. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js +3 -3
  85. package/dist/editor/ai/terminal/components/AgentPromptActionButtons.js.map +1 -1
  86. package/dist/editor/ai/terminal/components/AgentPromptComposer.d.ts +2 -1
  87. package/dist/editor/ai/terminal/components/AgentPromptComposer.js +5 -2
  88. package/dist/editor/ai/terminal/components/AgentPromptComposer.js.map +1 -1
  89. package/dist/editor/ai/terminal/components/AgentPromptInputArea.d.ts +2 -1
  90. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js +5 -3
  91. package/dist/editor/ai/terminal/components/AgentPromptInputArea.js.map +1 -1
  92. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.d.ts +4 -3
  93. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js +6 -19
  94. package/dist/editor/ai/terminal/components/AgentTerminalFullLayout.js.map +1 -1
  95. package/dist/editor/ai/terminal/components/AgentTerminalFullUpperContent.d.ts +5 -1
  96. package/dist/editor/ai/terminal/components/AgentTerminalFullUpperContent.js +33 -2
  97. package/dist/editor/ai/terminal/components/AgentTerminalFullUpperContent.js.map +1 -1
  98. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.d.ts +2 -0
  99. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js +20 -1
  100. package/dist/editor/ai/terminal/components/AgentTerminalStatusBar.js.map +1 -1
  101. package/dist/editor/ai/terminal/components/AgentTerminalSummaryLayout.js +2 -1
  102. package/dist/editor/ai/terminal/components/AgentTerminalSummaryLayout.js.map +1 -1
  103. package/dist/editor/ai/terminal/components/AgentTerminalView.d.ts +3 -2
  104. package/dist/editor/ai/terminal/components/AgentTerminalView.js +11 -2
  105. package/dist/editor/ai/terminal/components/AgentTerminalView.js.map +1 -1
  106. package/dist/editor/ai/terminal/components/AiResponseMessage.js +59 -7
  107. package/dist/editor/ai/terminal/components/AiResponseMessage.js.map +1 -1
  108. package/dist/editor/ai/terminal/components/QuestionnaireRecap.d.ts +9 -0
  109. package/dist/editor/ai/terminal/components/QuestionnaireRecap.js +56 -0
  110. package/dist/editor/ai/terminal/components/QuestionnaireRecap.js.map +1 -0
  111. package/dist/editor/ai/terminal/contextBreakdown.d.ts +17 -0
  112. package/dist/editor/ai/terminal/contextBreakdown.js +58 -0
  113. package/dist/editor/ai/terminal/contextBreakdown.js.map +1 -0
  114. package/dist/editor/ai/terminal/types.d.ts +2 -0
  115. package/dist/editor/ai/terminal/useAgentAutoStartOnCreate.d.ts +29 -0
  116. package/dist/editor/ai/terminal/useAgentAutoStartOnCreate.js +68 -0
  117. package/dist/editor/ai/terminal/useAgentAutoStartOnCreate.js.map +1 -0
  118. package/dist/editor/ai/terminal/useAgentInlineDialogEvents.js +8 -3
  119. package/dist/editor/ai/terminal/useAgentInlineDialogEvents.js.map +1 -1
  120. package/dist/editor/ai/terminal/useAgentInlineDialogState.d.ts +10 -3
  121. package/dist/editor/ai/terminal/useAgentInlineDialogState.js +33 -4
  122. package/dist/editor/ai/terminal/useAgentInlineDialogState.js.map +1 -1
  123. package/dist/editor/ai/terminal/useAgentRunResyncSocketHandler.js +16 -2
  124. package/dist/editor/ai/terminal/useAgentRunResyncSocketHandler.js.map +1 -1
  125. package/dist/editor/ai/terminal/useAgentRunStatusSocketHandler.js +3 -1
  126. package/dist/editor/ai/terminal/useAgentRunStatusSocketHandler.js.map +1 -1
  127. package/dist/editor/ai/terminal/useAgentSession.js +12 -1
  128. package/dist/editor/ai/terminal/useAgentSession.js.map +1 -1
  129. package/dist/editor/ai/terminal/useAgentSubmitLifecycle.d.ts +3 -0
  130. package/dist/editor/ai/terminal/useAgentSubmitLifecycle.js +6 -1
  131. package/dist/editor/ai/terminal/useAgentSubmitLifecycle.js.map +1 -1
  132. package/dist/editor/ai/terminal/useAgentTerminalController.js +48 -4
  133. package/dist/editor/ai/terminal/useAgentTerminalController.js.map +1 -1
  134. package/dist/editor/ai/terminal/useAgentTerminalViewProps.d.ts +1 -0
  135. package/dist/editor/ai/terminal/useAgentTerminalViewProps.js +2 -1
  136. package/dist/editor/ai/terminal/useAgentTerminalViewProps.js.map +1 -1
  137. package/dist/editor/ai/terminal/useAgentToolCallHandler.js +13 -1
  138. package/dist/editor/ai/terminal/useAgentToolCallHandler.js.map +1 -1
  139. package/dist/editor/ai/terminal/useAgentToolResultHandler.js +31 -7
  140. package/dist/editor/ai/terminal/useAgentToolResultHandler.js.map +1 -1
  141. package/dist/editor/bridge/BridgeClient.d.ts +1 -8
  142. package/dist/editor/bridge/BridgeClient.js +2 -4
  143. package/dist/editor/bridge/BridgeClient.js.map +1 -1
  144. package/dist/editor/bridge/protocol.d.ts +512 -0
  145. package/dist/editor/bridge/protocol.js +188 -0
  146. package/dist/editor/bridge/protocol.js.map +1 -0
  147. package/dist/editor/client/AboutDialog.js +15 -4
  148. package/dist/editor/client/AboutDialog.js.map +1 -1
  149. package/dist/editor/client/EditorShell.js +50 -13
  150. package/dist/editor/client/EditorShell.js.map +1 -1
  151. package/dist/editor/client/editContext.d.ts +6 -0
  152. package/dist/editor/client/editContext.js.map +1 -1
  153. package/dist/editor/client/hooks/useSocketMessageHandler.d.ts +3 -0
  154. package/dist/editor/client/hooks/useSocketMessageHandler.js +57 -25
  155. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  156. package/dist/editor/client/hooks/useWorkbox.d.ts +1 -0
  157. package/dist/editor/client/hooks/useWorkbox.js +14 -1
  158. package/dist/editor/client/hooks/useWorkbox.js.map +1 -1
  159. package/dist/editor/client/operationToasts.d.ts +2 -0
  160. package/dist/editor/client/operationToasts.js +35 -0
  161. package/dist/editor/client/operationToasts.js.map +1 -0
  162. package/dist/editor/client/operations.d.ts +4 -0
  163. package/dist/editor/client/operations.js +134 -74
  164. package/dist/editor/client/operations.js.map +1 -1
  165. package/dist/editor/client/pageModelBuilder.d.ts +1 -0
  166. package/dist/editor/client/pageModelBuilder.js +22 -13
  167. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  168. package/dist/editor/client/waitForEditOperationTerminal.d.ts +1 -0
  169. package/dist/editor/client/waitForEditOperationTerminal.js +1 -1
  170. package/dist/editor/client/waitForEditOperationTerminal.js.map +1 -1
  171. package/dist/editor/commands/itemCommands.js +5 -16
  172. package/dist/editor/commands/itemCommands.js.map +1 -1
  173. package/dist/editor/content-tree/IndicatorSettings.js +3 -2
  174. package/dist/editor/content-tree/IndicatorSettings.js.map +1 -1
  175. package/dist/editor/field-types/CheckboxEditor.js +3 -1
  176. package/dist/editor/field-types/CheckboxEditor.js.map +1 -1
  177. package/dist/editor/field-types/MultiLineText.js +24 -7
  178. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  179. package/dist/editor/field-types/SingleLineText.js +19 -2
  180. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  181. package/dist/editor/field-types/useTextCompletion.d.ts +20 -0
  182. package/dist/editor/field-types/useTextCompletion.js +166 -0
  183. package/dist/editor/field-types/useTextCompletion.js.map +1 -0
  184. package/dist/editor/menubar/ItemLanguageVersion.js +3 -14
  185. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
  186. package/dist/editor/menubar/OperationsIndicator.d.ts +7 -0
  187. package/dist/editor/menubar/OperationsIndicator.js +87 -0
  188. package/dist/editor/menubar/OperationsIndicator.js.map +1 -0
  189. package/dist/editor/menubar/ToolbarFactory.js +4 -1
  190. package/dist/editor/menubar/ToolbarFactory.js.map +1 -1
  191. package/dist/editor/menubar/VersionSelector.d.ts +3 -2
  192. package/dist/editor/menubar/VersionSelector.js +28 -12
  193. package/dist/editor/menubar/VersionSelector.js.map +1 -1
  194. package/dist/editor/menubar/WorkflowButton.js +7 -4
  195. package/dist/editor/menubar/WorkflowButton.js.map +1 -1
  196. package/dist/editor/menubar/toolbar-sections/EditControls.js +7 -3
  197. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  198. package/dist/editor/menubar/toolbar-sections/ViewportControls.js +4 -1
  199. package/dist/editor/menubar/toolbar-sections/ViewportControls.js.map +1 -1
  200. package/dist/editor/notifications/NotificationCenter.js +28 -27
  201. package/dist/editor/notifications/NotificationCenter.js.map +1 -1
  202. package/dist/editor/notifications/NotificationItem.js +100 -15
  203. package/dist/editor/notifications/NotificationItem.js.map +1 -1
  204. package/dist/editor/notifications/watchEventOptions.js +3 -2
  205. package/dist/editor/notifications/watchEventOptions.js.map +1 -1
  206. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.d.ts +1 -1
  207. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js +8 -2
  208. package/dist/editor/page-editor-chrome/BridgeInlineFormatOverlay.js.map +1 -1
  209. package/dist/editor/page-editor-chrome/PageEditorChrome.d.ts +1 -1
  210. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +7 -1
  211. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  212. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js +3 -10
  213. package/dist/editor/page-editor-chrome/overlay/IframeOverlayProvider.js.map +1 -1
  214. package/dist/editor/page-editor-chrome/overlay/geometry.d.ts +2 -2
  215. package/dist/editor/page-editor-chrome/useBridgeInlineEditing.d.ts +1 -1
  216. package/dist/editor/page-viewer/MiniMap.d.ts +21 -0
  217. package/dist/editor/page-viewer/MiniMap.js +113 -11
  218. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  219. package/dist/editor/page-viewer/PageViewerFrame.js +155 -22
  220. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  221. package/dist/editor/page-viewer/bridgeFieldPatch.d.ts +1 -2
  222. package/dist/editor/page-viewer/bridgeFieldPatch.js.map +1 -1
  223. package/dist/editor/page-viewer/pageViewContext.d.ts +1 -1
  224. package/dist/editor/reviews/DecisionsMatrix.js +5 -1
  225. package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
  226. package/dist/editor/reviews/SuggestedEdit.js +12 -2
  227. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  228. package/dist/editor/reviews/latestFeedbackData.js +7 -1
  229. package/dist/editor/reviews/latestFeedbackData.js.map +1 -1
  230. package/dist/editor/reviews/suggestedEditState.d.ts +2 -0
  231. package/dist/editor/reviews/suggestedEditState.js +20 -0
  232. package/dist/editor/reviews/suggestedEditState.js.map +1 -1
  233. package/dist/editor/reviews/suggestionContentChange.d.ts +1 -1
  234. package/dist/editor/reviews/suggestionContentChange.js +23 -3
  235. package/dist/editor/reviews/suggestionContentChange.js.map +1 -1
  236. package/dist/editor/services/agentService.d.ts +6 -0
  237. package/dist/editor/services/agentService.js +14 -0
  238. package/dist/editor/services/agentService.js.map +1 -1
  239. package/dist/editor/services/aiService.d.ts +5 -0
  240. package/dist/editor/services/aiService.js.map +1 -1
  241. package/dist/editor/settings/About.js +1 -1
  242. package/dist/editor/settings/About.js.map +1 -1
  243. package/dist/editor/settings/panels/AgentProfileConfigPanel.js +4 -2
  244. package/dist/editor/settings/panels/AgentProfileConfigPanel.js.map +1 -1
  245. package/dist/editor/settings/panels/AgentToolsPanel.js +61 -33
  246. package/dist/editor/settings/panels/AgentToolsPanel.js.map +1 -1
  247. package/dist/editor/settings/panels/ClusterInstancesPanel.js +2 -1
  248. package/dist/editor/settings/panels/ClusterInstancesPanel.js.map +1 -1
  249. package/dist/editor/settings/panels/JavaScriptToolAgentPanel.js +3 -2
  250. package/dist/editor/settings/panels/JavaScriptToolAgentPanel.js.map +1 -1
  251. package/dist/editor/settings/panels/ProjectTemplateAgentPanel.js +3 -2
  252. package/dist/editor/settings/panels/ProjectTemplateAgentPanel.js.map +1 -1
  253. package/dist/editor/settings/panels/StatusPanel.js +10 -7
  254. package/dist/editor/settings/panels/StatusPanel.js.map +1 -1
  255. package/dist/editor/sidebar/Completions.js +1 -1
  256. package/dist/editor/sidebar/Completions.js.map +1 -1
  257. package/dist/editor/sidebar/ComponentTree.js +1 -1
  258. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  259. package/dist/editor/sidebar/OperationItem.js +1 -1
  260. package/dist/editor/sidebar/OperationItem.js.map +1 -1
  261. package/dist/editor/sidebar/Workbox.js +18 -4
  262. package/dist/editor/sidebar/Workbox.js.map +1 -1
  263. package/dist/editor/template-wizard/TemplateStructureInlineEditor.js +3 -2
  264. package/dist/editor/template-wizard/TemplateStructureInlineEditor.js.map +1 -1
  265. package/dist/editor/tree-indicators/GutterColumns.js +3 -2
  266. package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
  267. package/dist/editor/ui/DialogButtons.d.ts +3 -1
  268. package/dist/editor/ui/DialogButtons.js +3 -2
  269. package/dist/editor/ui/DialogButtons.js.map +1 -1
  270. package/dist/editor/ui/Icons.js +1 -1
  271. package/dist/editor/ui/Icons.js.map +1 -1
  272. package/dist/editor/ui/ItemCollectionEditor.js +2 -2
  273. package/dist/editor/ui/ItemCollectionEditor.js.map +1 -1
  274. package/dist/editor/ui/PublishItemDialog.js +4 -6
  275. package/dist/editor/ui/PublishItemDialog.js.map +1 -1
  276. package/dist/editor/ui/SimpleTabs.d.ts +2 -1
  277. package/dist/editor/ui/SimpleTabs.js +23 -5
  278. package/dist/editor/ui/SimpleTabs.js.map +1 -1
  279. package/dist/editor/ui/Splitter.js +120 -3
  280. package/dist/editor/ui/Splitter.js.map +1 -1
  281. package/dist/editor/ui/splitterResizeEvent.d.ts +7 -0
  282. package/dist/editor/ui/splitterResizeEvent.js +6 -0
  283. package/dist/editor/ui/splitterResizeEvent.js.map +1 -1
  284. package/dist/editor/version-diff/versionDiffTargets.d.ts +1 -1
  285. package/dist/editor/workflowFields.d.ts +1 -0
  286. package/dist/editor/workflowFields.js +16 -0
  287. package/dist/editor/workflowFields.js.map +1 -0
  288. package/dist/index.d.ts +4 -2
  289. package/dist/index.js +3 -2
  290. package/dist/index.js.map +1 -1
  291. package/dist/revision.d.ts +2 -2
  292. package/dist/revision.js +2 -2
  293. package/dist/splash-screen/ModernSplashScreen.js +20 -11
  294. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  295. package/dist/splash-screen/NewPage.js +26 -7
  296. package/dist/splash-screen/NewPage.js.map +1 -1
  297. package/dist/task-board/TaskBoardWorkspace.js +154 -121
  298. package/dist/task-board/TaskBoardWorkspace.js.map +1 -1
  299. package/dist/task-board/components/CreateTaskDialog.js +1 -1
  300. package/dist/task-board/components/CreateTaskDialog.js.map +1 -1
  301. package/dist/task-board/components/ProjectDashboard.d.ts +12 -22
  302. package/dist/task-board/components/ProjectDashboard.js +120 -108
  303. package/dist/task-board/components/ProjectDashboard.js.map +1 -1
  304. package/dist/task-board/components/ProjectOverviewContent.js +3 -0
  305. package/dist/task-board/components/ProjectOverviewContent.js.map +1 -1
  306. package/dist/task-board/components/ProjectPropertiesPanel.d.ts +2 -0
  307. package/dist/task-board/components/ProjectPropertiesPanel.js +7 -4
  308. package/dist/task-board/components/ProjectPropertiesPanel.js.map +1 -1
  309. package/dist/task-board/components/ProjectSettingsDialog.d.ts +16 -0
  310. package/dist/task-board/components/ProjectSettingsDialog.js +55 -47
  311. package/dist/task-board/components/ProjectSettingsDialog.js.map +1 -1
  312. package/dist/task-board/components/TaskAgentPanel.js +6 -5
  313. package/dist/task-board/components/TaskAgentPanel.js.map +1 -1
  314. package/dist/task-board/components/TaskAssigneePicker.js +3 -2
  315. package/dist/task-board/components/TaskAssigneePicker.js.map +1 -1
  316. package/dist/task-board/components/TaskAttachmentsSection.js +1 -1
  317. package/dist/task-board/components/TaskAttachmentsSection.js.map +1 -1
  318. package/dist/task-board/components/TaskBoardHomeView.d.ts +7 -0
  319. package/dist/task-board/components/TaskBoardHomeView.js +21 -0
  320. package/dist/task-board/components/TaskBoardHomeView.js.map +1 -0
  321. package/dist/task-board/components/TaskBoardProjectListSidebar.js +74 -12
  322. package/dist/task-board/components/TaskBoardProjectListSidebar.js.map +1 -1
  323. package/dist/task-board/components/TaskBoardTitlebar.js +9 -52
  324. package/dist/task-board/components/TaskBoardTitlebar.js.map +1 -1
  325. package/dist/task-board/components/TaskCard.js +5 -13
  326. package/dist/task-board/components/TaskCard.js.map +1 -1
  327. package/dist/task-board/components/TaskRow.js +3 -2
  328. package/dist/task-board/components/TaskRow.js.map +1 -1
  329. package/dist/task-board/taskBoardNavStore.d.ts +0 -2
  330. package/dist/task-board/taskBoardNavStore.js +0 -2
  331. package/dist/task-board/taskBoardNavStore.js.map +1 -1
  332. package/dist/task-board/views/DependencyGraphView.js +3 -2
  333. package/dist/task-board/views/DependencyGraphView.js.map +1 -1
  334. package/dist/task-board/views/KanbanView.js +161 -38
  335. package/dist/task-board/views/KanbanView.js.map +1 -1
  336. package/dist/task-board/views/ListView.js +1 -2
  337. package/dist/task-board/views/ListView.js.map +1 -1
  338. package/dist/task-board/views/WizardView.d.ts +2 -0
  339. package/dist/task-board/views/WizardView.js +7 -4
  340. package/dist/task-board/views/WizardView.js.map +1 -1
  341. package/package.json +1 -2
  342. package/styles.css +4 -3
@@ -6,6 +6,7 @@ interface AgentCardProps {
6
6
  onResume?: (agent: Agent, event?: React.MouseEvent) => void;
7
7
  onDelete?: (agentId: string, agentName: string, event: React.MouseEvent) => void;
8
8
  onDismiss?: (agentId: string, agentName: string) => void;
9
+ onRename?: (agentId: string, agentName: string) => void;
9
10
  formatDateTime: (dateString: string) => string;
10
11
  /** Whether this card is selected */
11
12
  selected?: boolean;
@@ -15,5 +16,5 @@ interface AgentCardProps {
15
16
  * Lower number = shown higher in the list.
16
17
  */
17
18
  export declare function getInboxAttentionPriority(agent: Agent): number;
18
- export declare function AgentCard({ agent, onClick, onResume, onDelete, onDismiss, formatDateTime, selected, }: AgentCardProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function AgentCard({ agent, onClick, onResume, onDelete, onDismiss, onRename, formatDateTime, selected, }: AgentCardProps): import("react/jsx-runtime").JSX.Element;
19
20
  export {};
@@ -1,16 +1,13 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React from "react";
3
- import { getAgentTriggerSubscriptions, isAgentReadOnly, } from "../editor/services/agentService";
2
+ import { isAgentReadOnly } from "../editor/services/agentService";
4
3
  import { isAgentClosed, isRunningAgentStatus, } from "../editor/services/agentStatus";
5
4
  import { getAgentStatusConfig } from "../editor/ai/AgentStatusBadge";
6
5
  import { cn } from "../lib/utils";
7
- import { sanitizeSvg } from "../lib/sanitize";
8
- import { Users, AlertCircle, Clock, DollarSign, Coins, MessageSquare, HelpCircle, Bell, } from "lucide-react";
9
- import { DeleteIcon } from "../components/ui/delete-icon";
6
+ import { AlertCircle, Clock, DollarSign, HelpCircle, MoreHorizontal, Pencil, Trash2, } from "lucide-react";
10
7
  import { CloseButton } from "../components/ui/close-button";
11
- import { SimpleIconButton } from "../editor/ui/SimpleIconButton";
12
- import { ParheliaAgentIcon } from "../editor/ui/Icons";
8
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "../components/ui/dropdown-menu";
13
9
  import { Spinner } from "../editor/ui/Spinner";
10
+ import { AgentProfileIcon } from "./AgentProfileIcon";
14
11
  /**
15
12
  * Returns visual treatment for genuinely actionable states only.
16
13
  * Plain "completed" / "idle" agents are intentionally NOT highlighted as needing
@@ -70,33 +67,14 @@ export function getInboxAttentionPriority(agent) {
70
67
  return 5;
71
68
  return 4;
72
69
  }
73
- export function AgentCard({ agent, onClick, onResume, onDelete, onDismiss, formatDateTime, selected = false, }) {
74
- const [loadedTriggerCount, setLoadedTriggerCount] = React.useState(agent.triggerSubscriptionCount ?? null);
75
- React.useEffect(() => {
76
- if (agent.triggerSubscriptionCount !== undefined) {
77
- setLoadedTriggerCount(agent.triggerSubscriptionCount);
78
- return;
79
- }
80
- let cancelled = false;
81
- void getAgentTriggerSubscriptions(agent.id)
82
- .then((subscriptions) => {
83
- if (cancelled)
84
- return;
85
- setLoadedTriggerCount(subscriptions.filter((subscription) => subscription.isActive).length);
86
- })
87
- .catch(() => {
88
- if (cancelled)
89
- return;
90
- setLoadedTriggerCount(0);
91
- });
92
- return () => {
93
- cancelled = true;
94
- };
95
- }, [agent.id, agent.triggerSubscriptionCount]);
70
+ export function AgentCard({ agent, onClick, onResume, onDelete, onDismiss, onRename, formatDateTime, selected = false, }) {
96
71
  const statusConfig = getAgentStatusConfig(agent);
97
72
  const isClosed = isAgentClosed(agent.status);
98
73
  const isRunning = isRunningAgentStatus(agent.status);
74
+ const readOnly = isAgentReadOnly(agent);
75
+ const showOverflowMenu = !readOnly && (!!onRename || !!onDelete);
99
76
  const attention = getAttentionInfo(agent);
77
+ const profileLabel = agent.profileName?.trim() || agent.description?.trim() || "Agent";
100
78
  const handleCardClick = (event) => {
101
79
  if (isClosed && onResume) {
102
80
  onResume(agent, event);
@@ -108,15 +86,13 @@ export function AgentCard({ agent, onClick, onResume, onDelete, onDismiss, forma
108
86
  const lastActivity = agent.lastMessageDate
109
87
  ? formatDateTime(agent.lastMessageDate)
110
88
  : formatDateTime(agent.updatedDate);
111
- return (_jsxs("div", { className: cn("group relative flex cursor-pointer items-start gap-3 px-3 py-2.5 transition-colors", attention ? attention.rowTintClass : "hover:bg-neutral-grey-5/80", selected && !attention && "bg-neutral-grey-5"), onClick: handleCardClick, "data-testid": "agent-list-row", "data-agent-id": agent.id, title: `${agent.name}\nID: ${agent.id}\nAlt-click to open in a new pane`, children: [(selected || attention) && (_jsx("div", { className: cn("absolute top-2 bottom-2 left-0 w-0.5 rounded-r", selected ? "bg-neutral-grey-100" : attention?.barClass) })), _jsx("div", { className: "text-neutral-grey-50 mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center", children: agent.profileSvgIcon ? (_jsx("div", { className: "h-6 w-6 [&>svg]:h-full [&>svg]:w-full", dangerouslySetInnerHTML: {
112
- __html: sanitizeSvg(agent.profileSvgIcon),
113
- } })) : (_jsx(ParheliaAgentIcon, { size: 22, strokeWidth: 1.5, className: "text-neutral-grey-50" })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("h4", { className: "text-neutral-grey-100 truncate text-[13px] font-medium", children: agent.name }), !isRunning && (_jsx("span", { className: cn("h-1.5 w-1.5 shrink-0 rounded-full", statusConfig.color, statusConfig.shouldPulse && "animate-pulse"), title: statusConfig.label })), attention && (_jsxs("span", { className: cn("rounded-badge badge-pad-sm text-2xs inline-flex shrink-0 items-center gap-1 font-semibold", attention.chipClass), children: [attention.icon, attention.label] })), agent.isShared && (_jsx("span", { className: "rounded-badge bg-feedback-blue-light badge-pad-sm text-2xs text-feedback-blue shrink-0 font-bold", children: "Shared" }))] }), agent.description && (_jsx("p", { className: "text-neutral-grey-50 mt-0.5 truncate text-[12px]", children: agent.description })), _jsxs("div", { className: "text-neutral-grey-50 mt-1 flex flex-wrap items-center gap-x-3 gap-y-0.5 text-[10px]", children: [agent.nextRunAt && (_jsxs("span", { className: "text-feedback-orange flex items-center gap-0.5", children: [_jsx(Clock, { className: "size-2.5", strokeWidth: 2 }), "Wake: ", formatDateTime(agent.nextRunAt)] })), _jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx(Clock, { className: "size-2.5", strokeWidth: 2 }), lastActivity] }), agent.isShared && agent.ownerName && (_jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx(Users, { className: "size-2.5", strokeWidth: 2 }), "By ", agent.ownerName] })), agent.messageCount !== undefined && agent.messageCount > 0 && (_jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx(MessageSquare, { className: "size-2.5", strokeWidth: 2 }), agent.messageCount, " msg"] })), loadedTriggerCount !== null && loadedTriggerCount > 0 && (_jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx(Bell, { className: "size-2.5", strokeWidth: 2 }), loadedTriggerCount, " trigger", loadedTriggerCount !== 1 ? "s" : ""] })), agent.totalCost !== undefined && agent.totalCost > 0 && (_jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx(Coins, { className: "size-2.5", strokeWidth: 2 }), "$", agent.totalCost.toFixed(2)] }))] })] }), _jsx("div", { className: "flex shrink-0 items-center gap-1 self-center opacity-0 transition-opacity group-hover:opacity-100", children: onDismiss ? (_jsx(CloseButton, { onClick: (e) => {
89
+ return (_jsxs("div", { className: cn("group relative flex cursor-pointer items-center gap-3 rounded-md px-2.5 py-2 transition-colors", attention ? attention.rowTintClass : "hover:bg-neutral-grey-5/70", selected && !attention && "bg-neutral-grey-5"), onClick: handleCardClick, "data-testid": "agent-list-row", "data-agent-id": agent.id, title: `${agent.name}\n${profileLabel}\nLast activity: ${lastActivity}\nID: ${agent.id}\nAlt-click to open in a new pane`, children: [attention && (_jsx("div", { className: cn("absolute top-2 bottom-2 left-0 w-0.5 rounded-r", attention.barClass) })), _jsx(AgentProfileIcon, { svgIcon: agent.profileSvgIcon, selected: selected }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx("p", { className: "text-neutral-grey-50 min-w-0 truncate text-[14px] leading-5 font-normal", children: profileLabel }), !isRunning && (_jsx("span", { className: cn("h-1.5 w-1.5 shrink-0 rounded-full", statusConfig.color, statusConfig.shouldPulse && "animate-pulse"), title: statusConfig.label })), attention && (_jsxs("span", { className: cn("rounded-badge badge-pad-sm text-2xs inline-flex shrink-0 items-center gap-1 font-semibold", attention.chipClass), children: [attention.icon, attention.label] })), agent.isShared && (_jsx("span", { className: "rounded-badge bg-feedback-blue-light badge-pad-sm text-2xs text-feedback-blue shrink-0 font-bold", children: "Shared" }))] }), _jsx("h4", { className: "text-neutral-grey-100 truncate text-[14px] leading-5 font-normal", children: agent.name })] }), _jsx("div", { className: "flex shrink-0 items-center gap-1 self-center opacity-0 transition-opacity group-focus-within:opacity-100 group-hover:opacity-100 has-[[data-state=open]]:opacity-100", children: onDismiss ? (_jsx(CloseButton, { onClick: (e) => {
114
90
  e.stopPropagation();
115
91
  onDismiss(agent.id, agent.name);
116
- }, label: "Dismiss" })) : (!isAgentReadOnly(agent) && (_jsx(SimpleIconButton, { onClick: (e) => {
117
- if (isAgentReadOnly(agent))
118
- return;
119
- onDelete?.(agent.id, agent.name, e);
120
- }, icon: _jsx(DeleteIcon, { size: "md" }), label: "Delete Agent", className: "text-neutral-grey-50 hover:bg-neutral-grey-5 hover:text-neutral-grey-50 h-7 w-7 rounded-md" }))) }), isRunning && (_jsx("span", { title: statusConfig.label, className: "text-neutral-grey-100 flex shrink-0 items-center self-center px-1", children: _jsx(Spinner, { size: "sm" }) }))] }, agent.id));
92
+ }, label: "Dismiss" })) : (showOverflowMenu && (
93
+ // modal={false}: a modal menu's body pointer-events lock conflicts
94
+ // with the rename dialog opened from a menu item and leaves the
95
+ // page unclickable after the dialog closes.
96
+ _jsxs(DropdownMenu, { modal: false, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { type: "button", onClick: (e) => e.stopPropagation(), className: "text-neutral-grey-50 hover:bg-neutral-grey-5 hover:text-neutral-grey-100 flex h-7 w-7 items-center justify-center rounded-md transition-colors", "aria-label": "Agent actions", title: "Agent actions", "data-testid": "agent-card-menu-trigger", children: _jsx(MoreHorizontal, { className: "size-4", strokeWidth: 2 }) }) }), _jsxs(DropdownMenuContent, { align: "end", onClick: (e) => e.stopPropagation(), children: [onRename && (_jsxs(DropdownMenuItem, { onClick: () => onRename(agent.id, agent.name), "data-testid": "agent-card-menu-rename", children: [_jsx(Pencil, { className: "size-4" }), "Rename"] })), onDelete && (_jsxs(DropdownMenuItem, { variant: "destructive", onClick: (e) => onDelete(agent.id, agent.name, e), "data-testid": "agent-card-menu-delete", children: [_jsx(Trash2, { className: "size-4" }), "Delete"] }))] })] }))) }), isRunning && (_jsx("span", { title: statusConfig.label, className: "text-neutral-grey-100 flex shrink-0 items-center self-center px-1", children: _jsx(Spinner, { size: "sm" }) }))] }, agent.id));
121
97
  }
122
98
  //# sourceMappingURL=AgentCard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentCard.js","sourceRoot":"","sources":["../../src/agents-view/AgentCard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentCard.js","sourceRoot":"","sources":["../../src/agents-view/AgentCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { AiProfile } from "../editor/services/aiService";
2
+ interface AgentGalleryCardProps {
3
+ profile: AiProfile;
4
+ onSelect: (profile: AiProfile) => void;
5
+ /** "grid" renders a tile; "list" renders a full-width row */
6
+ layout?: "grid" | "list";
7
+ }
8
+ /**
9
+ * Card for a single agent profile in the "Choose your sidekick" gallery.
10
+ */
11
+ export declare function AgentGalleryCard({ profile, onSelect, layout, }: AgentGalleryCardProps): import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils";
3
+ import { AgentProfileIcon } from "./AgentProfileIcon";
4
+ /**
5
+ * Card for a single agent profile in the "Choose your sidekick" gallery.
6
+ */
7
+ export function AgentGalleryCard({ profile, onSelect, layout = "grid", }) {
8
+ const displayTitle = profile.displayTitle || profile.name;
9
+ const description = profile.description || "";
10
+ return (_jsxs("button", { type: "button", onClick: () => onSelect(profile), className: cn("group border-border-default hover:border-neutral-grey-50/40 relative flex cursor-pointer items-start gap-4 rounded-lg border bg-white p-4 text-left transition-all duration-200 hover:shadow-md", layout === "grid" ? "min-h-[108px] flex-col sm:flex-row" : "flex-row"), "data-testid": "agent-gallery-card", "data-profile-id": profile.id, children: [_jsx(AgentProfileIcon, { svgIcon: profile.svgIcon, size: "md" }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [_jsx("h3", { className: "text-neutral-grey-100 truncate text-sm font-bold tracking-tight", children: displayTitle }), description && (_jsx("p", { className: cn("text-neutral-grey-50 text-xs leading-relaxed", layout === "grid" ? "line-clamp-3" : "line-clamp-2"), title: description, children: description }))] })] }));
11
+ }
12
+ //# sourceMappingURL=AgentGalleryCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentGalleryCard.js","sourceRoot":"","sources":["../../src/agents-view/AgentGalleryCard.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,MAAM,GAAG,MAAM,GACO;IACtB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAE9C,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAChC,SAAS,EAAE,EAAE,CACX,iMAAiM,EACjM,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,UAAU,CACtE,iBACW,oBAAoB,qBACf,OAAO,CAAC,EAAE,aAE3B,KAAC,gBAAgB,IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAC,IAAI,GAAG,EAExD,eAAK,SAAS,EAAC,oCAAoC,aACjD,aAAI,SAAS,EAAC,iEAAiE,YAC5E,YAAY,GACV,EACJ,WAAW,IAAI,CACd,YACE,SAAS,EAAE,EAAE,CACX,8CAA8C,EAC9C,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CACpD,EACD,KAAK,EAAE,WAAW,YAEjB,WAAW,GACV,CACL,IACG,IACC,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { AiProfile } from "../editor/services/aiService";
2
+ interface AgentGalleryViewProps {
3
+ onSelectProfile: (profile: AiProfile) => void;
4
+ /** "full" = standalone full-page layout; "pane" = embedded in a workspace pane */
5
+ variant?: "full" | "pane";
6
+ className?: string;
7
+ }
8
+ /**
9
+ * Derives the ordered category tab list from the profiles present.
10
+ * "All" is always first; categories sort by their Sitecore sort order.
11
+ */
12
+ export declare function deriveCategoryTabs(profiles: AiProfile[]): string[];
13
+ /**
14
+ * "Choose your sidekick" — agent profile gallery with category tabs and a
15
+ * grid/list view toggle. Self-loads profiles and filters hidden ones.
16
+ */
17
+ export declare function AgentGalleryView({ onSelectProfile, variant, className, }: AgentGalleryViewProps): import("react/jsx-runtime").JSX.Element;
18
+ export {};
@@ -0,0 +1,88 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from "react";
3
+ import { loadAiProfiles } from "../editor/services/aiService";
4
+ import { cn } from "../lib/utils";
5
+ import { SimpleTabs } from "../editor/ui/SimpleTabs";
6
+ import { AgentGalleryCard } from "./AgentGalleryCard";
7
+ import { LayoutGrid, List, Loader2, SearchX } from "lucide-react";
8
+ const ALL_CATEGORY = "All";
9
+ /**
10
+ * Derives the ordered category tab list from the profiles present.
11
+ * "All" is always first; categories sort by their Sitecore sort order.
12
+ */
13
+ export function deriveCategoryTabs(profiles) {
14
+ const orderByCategory = new Map();
15
+ for (const profile of profiles) {
16
+ if (!profile.category)
17
+ continue;
18
+ const order = profile.categoryOrder ?? Number.MAX_SAFE_INTEGER;
19
+ const existing = orderByCategory.get(profile.category);
20
+ if (existing === undefined || order < existing) {
21
+ orderByCategory.set(profile.category, order);
22
+ }
23
+ }
24
+ const categories = [...orderByCategory.entries()]
25
+ .sort((a, b) => a[1] - b[1] || a[0].localeCompare(b[0]))
26
+ .map(([name]) => name);
27
+ return [ALL_CATEGORY, ...categories];
28
+ }
29
+ /**
30
+ * "Choose your sidekick" — agent profile gallery with category tabs and a
31
+ * grid/list view toggle. Self-loads profiles and filters hidden ones.
32
+ */
33
+ export function AgentGalleryView({ onSelectProfile, variant = "full", className, }) {
34
+ const [profiles, setProfiles] = useState([]);
35
+ const [loading, setLoading] = useState(true);
36
+ const [error, setError] = useState(null);
37
+ const [activeTab, setActiveTab] = useState(0);
38
+ const [layout, setLayout] = useState("grid");
39
+ const loadProfiles = async () => {
40
+ try {
41
+ setLoading(true);
42
+ setError(null);
43
+ const profileList = await loadAiProfiles();
44
+ setProfiles(profileList.filter((p) => !p.hiddenFromOverview));
45
+ }
46
+ catch (err) {
47
+ console.error("Failed to load profiles:", err);
48
+ setError(err?.message || "Failed to load profiles");
49
+ }
50
+ finally {
51
+ setLoading(false);
52
+ }
53
+ };
54
+ useEffect(() => {
55
+ loadProfiles();
56
+ }, []);
57
+ const categories = useMemo(() => deriveCategoryTabs(profiles), [profiles]);
58
+ const activeCategory = categories[activeTab] ?? ALL_CATEGORY;
59
+ const visibleProfiles = useMemo(() => {
60
+ if (activeCategory === ALL_CATEGORY)
61
+ return profiles;
62
+ return profiles.filter((p) => p.category === activeCategory);
63
+ }, [profiles, activeCategory]);
64
+ if (loading) {
65
+ return (_jsxs("div", { className: "bg-neutral-grey-5 flex h-full flex-col items-center justify-center text-center", children: [_jsx(Loader2, { className: "text-neutral-grey-50 size-8 animate-spin" }), _jsx("p", { className: "text-neutral-grey-50 mt-4 text-sm font-medium", children: "Loading agents..." })] }));
66
+ }
67
+ if (error) {
68
+ return (_jsxs("div", { className: "bg-neutral-grey-5 flex h-full flex-col items-center justify-center text-center", children: [_jsx("p", { className: "text-feedback-red mb-3 text-sm", children: error }), _jsx("button", { type: "button", onClick: loadProfiles, className: "bg-highlight-100 hover:bg-highlight-100/80 rounded px-4 py-2 text-xs text-white", children: "Retry" })] }));
69
+ }
70
+ return (_jsx("div", { className: cn("@container bg-neutral-grey-5 h-full overflow-y-auto", variant === "full" ? "px-8 py-10 lg:px-14" : "px-4 py-6 lg:px-6", className), "data-testid": "agent-gallery", children: _jsxs("div", { className: "mx-auto max-w-6xl", children: [_jsx("h1", { className: cn("text-neutral-grey-100 font-semibold tracking-tight", variant === "full" ? "text-3xl" : "text-2xl"), children: "Choose your sidekick" }), _jsx("p", { className: "text-neutral-grey-50 mt-2 text-sm", children: "Each agent is built for a specific task \u2013 find yours and start creating!" }), _jsxs("div", { className: "border-border-default mt-6 flex items-end justify-between gap-4 border-b", children: [categories.length > 1 ? (_jsx(SimpleTabs, { tabs: categories.map((category) => ({
71
+ id: `agent-gallery-tab-${category}`,
72
+ label: category,
73
+ content: null,
74
+ testId: `agent-gallery-tab-${category}`,
75
+ })), activeTab: activeTab, setActiveTab: setActiveTab, hideContent: true, variant: "large", className: "min-w-0", testId: "agent-gallery-tabs" })) : (_jsx("div", {})), _jsxs("div", { className: "mb-2 flex shrink-0 items-center gap-0.5", children: [_jsx("button", { type: "button", onClick: () => setLayout("list"), className: cn("flex size-8 items-center justify-center rounded transition-colors", layout === "list"
76
+ ? "text-neutral-grey-100 bg-neutral-grey-5"
77
+ : "text-neutral-grey-50 hover:text-neutral-grey-100"), title: "List view", "aria-label": "List view", "data-testid": "agent-gallery-list-toggle", children: _jsx(List, { className: "size-4.5", strokeWidth: 2 }) }), _jsx("button", { type: "button", onClick: () => setLayout("grid"), className: cn("flex size-8 items-center justify-center rounded transition-colors", layout === "grid"
78
+ ? "text-neutral-grey-100 bg-neutral-grey-5"
79
+ : "text-neutral-grey-50 hover:text-neutral-grey-100"), title: "Grid view", "aria-label": "Grid view", "data-testid": "agent-gallery-grid-toggle", children: _jsx(LayoutGrid, { className: "size-4.5", strokeWidth: 2 }) })] })] }), visibleProfiles.length > 0 ? (_jsx("div", { className: cn("mt-6 gap-4",
80
+ // Column count follows the pane width (container query), not the
81
+ // viewport, so the gallery adapts inside narrow split panes too.
82
+ layout === "grid"
83
+ ? "@lg:grid-cols-2 @3xl:grid-cols-3 @5xl:grid-cols-4 grid grid-cols-1"
84
+ : "flex flex-col"), children: visibleProfiles.map((profile) => (_jsx(AgentGalleryCard, { profile: profile, onSelect: onSelectProfile, layout: layout }, profile.id))) })) : (_jsxs("div", { className: "flex flex-col items-center justify-center py-16 text-center", children: [_jsx("div", { className: "bg-neutral-grey-5 text-neutral-grey-50 mb-3 flex size-12 items-center justify-center rounded", children: _jsx(SearchX, { size: 24 }) }), _jsx("h4", { className: "text-neutral-grey-100 text-sm font-semibold", children: "No agents available" }), _jsx("p", { className: "text-neutral-grey-50 mt-1 text-xs", children: activeCategory === ALL_CATEGORY
85
+ ? "No agent profiles are configured yet."
86
+ : "No agents in this category yet." })] }))] }) }));
87
+ }
88
+ //# sourceMappingURL=AgentGalleryView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentGalleryView.js","sourceRoot":"","sources":["../../src/agents-view/AgentGalleryView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ type AgentProfileIconSize = "sm" | "md" | "lg";
2
+ interface AgentProfileIconProps {
3
+ svgIcon?: string | null;
4
+ selected?: boolean;
5
+ size?: AgentProfileIconSize;
6
+ className?: string;
7
+ }
8
+ export declare function AgentProfileIcon({ svgIcon, selected, size, className, }: AgentProfileIconProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { sanitizeSvg } from "../lib/sanitize";
3
+ import { cn } from "../lib/utils";
4
+ import { ParheliaAgentIcon } from "../editor/ui/Icons";
5
+ const containerSizeClasses = {
6
+ sm: "size-10 rounded-md",
7
+ md: "size-12 rounded-lg",
8
+ lg: "size-16 rounded-2xl",
9
+ };
10
+ const iconSizeClasses = {
11
+ sm: "size-5",
12
+ md: "size-6",
13
+ lg: "size-8",
14
+ };
15
+ const fallbackSizes = {
16
+ sm: 22,
17
+ md: 24,
18
+ lg: 32,
19
+ };
20
+ const fallbackStrokeWidths = {
21
+ sm: 1.7,
22
+ md: 1.5,
23
+ lg: 1.5,
24
+ };
25
+ export function AgentProfileIcon({ svgIcon, selected = false, size = "sm", className, }) {
26
+ return (_jsx("div", { className: cn("relative flex shrink-0 items-center justify-center border transition-colors", containerSizeClasses[size], "bg-neutral-grey-5 text-neutral-grey-100 border-transparent", className), "data-testid": "agent-profile-icon", "data-selected": selected ? "true" : undefined, children: svgIcon ? (_jsx("div", { className: cn("flex items-center justify-center [&>svg]:h-full [&>svg]:w-full", iconSizeClasses[size]), dangerouslySetInnerHTML: { __html: sanitizeSvg(svgIcon) } })) : (_jsx(ParheliaAgentIcon, { size: fallbackSizes[size], strokeWidth: fallbackStrokeWidths[size], className: "text-current" })) }));
27
+ }
28
+ //# sourceMappingURL=AgentProfileIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentProfileIcon.js","sourceRoot":"","sources":["../../src/agents-view/AgentProfileIcon.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAWvD,MAAM,oBAAoB,GAAyC;IACjE,EAAE,EAAE,oBAAoB;IACxB,EAAE,EAAE,oBAAoB;IACxB,EAAE,EAAE,qBAAqB;CAC1B,CAAC;AAEF,MAAM,eAAe,GAAyC;IAC5D,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;CACb,CAAC;AAEF,MAAM,aAAa,GAAyC;IAC1D,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;CACP,CAAC;AAEF,MAAM,oBAAoB,GAAyC;IACjE,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;CACR,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,IAAI,GAAG,IAAI,EACX,SAAS,GACa;IACtB,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,6EAA6E,EAC7E,oBAAoB,CAAC,IAAI,CAAC,EAC1B,4DAA4D,EAC5D,SAAS,CACV,iBACW,oBAAoB,mBACjB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YAE3C,OAAO,CAAC,CAAC,CAAC,CACT,cACE,SAAS,EAAE,EAAE,CACX,gEAAgE,EAChE,eAAe,CAAC,IAAI,CAAC,CACtB,EACD,uBAAuB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,GACzD,CACH,CAAC,CAAC,CAAC,CACF,KAAC,iBAAiB,IAChB,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,EACzB,WAAW,EAAE,oBAAoB,CAAC,IAAI,CAAC,EACvC,SAAS,EAAC,cAAc,GACxB,CACH,GACG,CACP,CAAC;AACJ,CAAC"}
@@ -1,3 +1,4 @@
1
+ import React from "react";
1
2
  import { Agent } from "../editor/services/agentService";
2
3
  /**
3
4
  * Props for AgentsView component
@@ -23,10 +24,14 @@ interface AgentsViewProps {
23
24
  * titlebar) already provides it.
24
25
  */
25
26
  hideNewAgentButton?: boolean;
27
+ /**
28
+ * Optional actions rendered beside the New Session button.
29
+ */
30
+ toolbarActions?: React.ReactNode;
26
31
  }
27
32
  /**
28
33
  * Unified agents overview: search/filter, active agents and closed history.
29
34
  * Creating a new agent happens in a modal accessed from the toolbar.
30
35
  */
31
- export declare function AgentsView({ onSelectAgent, selectedAgentId, compact, onRequestCreateAgent, hideNewAgentButton, }?: AgentsViewProps): import("react/jsx-runtime").JSX.Element;
36
+ export declare function AgentsView({ onSelectAgent, selectedAgentId, compact, onRequestCreateAgent, hideNewAgentButton, toolbarActions, }?: AgentsViewProps): import("react/jsx-runtime").JSX.Element;
32
37
  export {};
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useState, useEffect, useMemo, useCallback } from "react";
3
- import { getAgentsGrouped, getClosedAgentsByProfile, deleteAgent, } from "../editor/services/agentService";
3
+ import { getAgentsGrouped, getClosedAgentsByProfile, deleteAgent, renameAgent, } from "../editor/services/agentService";
4
4
  import { parseAgentRunStatusData, shouldIgnoreReplayRunStart, } from "../editor/services/agentStatus";
5
5
  import { cn } from "../lib/utils";
6
6
  import { RefreshCw, List, Layers, Plus, ArrowLeft } from "lucide-react";
@@ -11,13 +11,15 @@ import { AgentCard } from "./AgentCard";
11
11
  import { ProfileAgentsGroup } from "./ProfileAgentsGroup";
12
12
  import { DateAgentsGroup } from "./DateAgentsGroup";
13
13
  import { Switch } from "../components/ui/switch";
14
- import { CreateAgentView } from "./CreateAgentView";
14
+ import { Button } from "../components/ui/button";
15
+ import { AgentGalleryView } from "./AgentGalleryView";
16
+ import { RenameAgentDialog } from "./RenameAgentDialog";
15
17
  import { Spinner } from "../editor/ui/Spinner";
16
18
  /**
17
19
  * Unified agents overview: search/filter, active agents and closed history.
18
20
  * Creating a new agent happens in a modal accessed from the toolbar.
19
21
  */
20
- export function AgentsView({ onSelectAgent, selectedAgentId, compact = false, onRequestCreateAgent, hideNewAgentButton = false, } = {}) {
22
+ export function AgentsView({ onSelectAgent, selectedAgentId, compact = false, onRequestCreateAgent, hideNewAgentButton = false, toolbarActions, } = {}) {
21
23
  const getAgentSortDate = useCallback((agent) => agent.lastMessageDate || agent.updatedDate, []);
22
24
  const sortAgentsByRecentActivity = useCallback((agents) => [...agents].sort((a, b) => new Date(getAgentSortDate(b)).getTime() -
23
25
  new Date(getAgentSortDate(a)).getTime()), [getAgentSortDate]);
@@ -40,6 +42,7 @@ export function AgentsView({ onSelectAgent, selectedAgentId, compact = false, on
40
42
  const [showOnlyMyAgents, setShowOnlyMyAgents] = useState(true);
41
43
  const [historyViewMode, setHistoryViewMode] = useState("flat");
42
44
  const [viewMode, setViewMode] = useState("list");
45
+ const [renameTarget, setRenameTarget] = useState(null);
43
46
  const handleNewAgentClick = () => {
44
47
  if (onRequestCreateAgent) {
45
48
  onRequestCreateAgent();
@@ -268,6 +271,28 @@ export function AgentsView({ onSelectAgent, selectedAgentId, compact = false, on
268
271
  showCancel: true,
269
272
  });
270
273
  };
274
+ const handleRenameAgent = (agentId, agentName) => {
275
+ setRenameTarget({ id: agentId, name: agentName });
276
+ };
277
+ const performRename = async (newName) => {
278
+ if (!renameTarget)
279
+ return;
280
+ const agentId = renameTarget.id;
281
+ try {
282
+ await renameAgent(agentId, newName);
283
+ // Optimistic local update; the agent:info:updated WS message reconciles
284
+ // other views.
285
+ setActiveAgents((prev) => prev.map((a) => (a.id === agentId ? { ...a, name: newName } : a)));
286
+ setProfileGroups((prevGroups) => prevGroups.map((group) => ({
287
+ ...group,
288
+ agents: group.agents.map((a) => a.id === agentId ? { ...a, name: newName } : a),
289
+ })));
290
+ }
291
+ catch (err) {
292
+ console.error("Failed to rename agent:", err);
293
+ editContext?.showToast(`Failed to rename chat: ${err?.message || "Unknown error"}`);
294
+ }
295
+ };
271
296
  const handleAgentClick = (agent, event) => {
272
297
  if (onSelectAgent) {
273
298
  onSelectAgent(agent, { split: !!event?.altKey });
@@ -364,22 +389,25 @@ export function AgentsView({ onSelectAgent, selectedAgentId, compact = false, on
364
389
  if (initialLoad && loading) {
365
390
  return (_jsxs("div", { className: "flex h-full items-center justify-center gap-2", children: [_jsx(Spinner, { size: "sm" }), _jsx("div", { className: "text-neutral-grey-50 text-sm", children: "Loading agents..." })] }));
366
391
  }
367
- const newAgentButton = viewMode === "list" && !hideNewAgentButton && (_jsxs("button", { type: "button", onClick: handleNewAgentClick, className: cn("inline-flex items-center gap-1.5 rounded-lg bg-black px-3 py-2 text-[13px] font-medium text-white shadow-sm transition-colors hover:bg-black/90"), "data-testid": "agents-new-agent-button", children: [_jsx(Plus, { className: "size-4", strokeWidth: 2.25 }), "New Session"] }));
368
- return (_jsxs("div", { className: "absolute inset-0 flex flex-col bg-[color-mix(in_srgb,var(--color-neutral-grey-5)_45%,var(--color-white))]", children: [!compact && (_jsx(PageHeader, { title: "AI Agents", description: "Build, run and orchestrate your AI workforce", variant: "compact", actions: newAgentButton })), _jsx("div", { className: "relative flex flex-1 flex-col overflow-hidden", children: viewMode === "create" ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "border-border-default shrink-0 border-b bg-white px-6 py-4", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("button", { type: "button", onClick: () => setViewMode("list"), className: "text-neutral-grey-50 hover:bg-neutral-grey-5 hover:text-neutral-grey-100 inline-flex items-center gap-1.5 rounded-md px-2 py-1.5 text-[13px] font-medium transition-colors", "data-testid": "agents-create-back-button", children: [_jsx(ArrowLeft, { className: "size-4", strokeWidth: 2 }), "Back"] }), _jsx("span", { className: "text-neutral-grey-50", children: "/" }), _jsx("h2", { className: "text-neutral-grey-100 text-[15px] font-semibold tracking-tight", children: "New Agent" }), _jsx("p", { className: "text-neutral-grey-50 ml-1 hidden text-[12px] sm:inline", children: "Pick a profile to start with" })] }) }), _jsx("div", { className: "relative flex-1 overflow-y-auto bg-white", children: _jsx(CreateAgentView, { onCreateAgent: handleCreateAgent }) })] })) : (_jsxs(_Fragment, { children: [compact && newAgentButton && (_jsx("div", { className: "border-border-default flex shrink-0 items-center justify-start border-b bg-white px-4 py-3", children: newAgentButton })), _jsx("div", { className: "border-border-default shrink-0 border-b bg-white px-4 py-1.5", children: _jsxs("div", { className: "flex flex-col gap-2 sm:flex-row sm:items-center", children: [_jsx("div", { className: "min-w-0 flex-1", children: _jsx(FilterInput, { value: searchTerm, onChange: setSearchTerm, placeholder: "Search agents\u2026", loading: loading && !initialLoad, size: "md", className: "border-border-default" }) }), _jsxs("div", { className: "flex items-center gap-2", children: [profileGroups.length > 0 && (_jsxs("div", { className: "border-border-default flex h-8 items-center rounded-md border p-0.5", children: [_jsx("button", { onClick: () => setHistoryViewMode("grouped"), className: cn("flex size-6 items-center justify-center rounded transition-colors", historyViewMode === "grouped"
369
- ? "bg-neutral-grey-5 text-neutral-grey-100"
370
- : "text-neutral-grey-50 hover:text-neutral-grey-100"), title: "Grouped by profile", "aria-label": "Grouped by profile", children: _jsx(Layers, { className: "size-3.5", strokeWidth: 2 }) }), _jsx("button", { onClick: () => setHistoryViewMode("flat"), className: cn("flex size-6 items-center justify-center rounded transition-colors", historyViewMode === "flat"
371
- ? "bg-neutral-grey-5 text-neutral-grey-100"
372
- : "text-neutral-grey-50 hover:text-neutral-grey-100"), title: "Grouped by date", "aria-label": "Grouped by date", children: _jsx(List, { className: "size-3.5", strokeWidth: 2 }) })] })), _jsxs("label", { className: "text-neutral-grey-50 hover:text-neutral-grey-100 flex h-8 cursor-pointer items-center gap-2 rounded-md px-2 text-[12px] font-medium transition-colors", children: [_jsx(Switch, { checked: showOnlyMyAgents, onCheckedChange: (checked) => setShowOnlyMyAgents(checked === true) }), _jsx("span", { className: "select-none", children: "My agents" })] })] })] }) }), _jsxs("div", { className: "relative flex-1 overflow-y-auto", children: [loading && !initialLoad && (_jsx("div", { className: "absolute top-2 left-1/2 z-10 -translate-x-1/2 rounded-md bg-white px-3 py-1.5 shadow-md", children: _jsxs("div", { className: "text-neutral-grey-50 flex items-center gap-2 text-sm", children: [_jsx(RefreshCw, { className: "size-3 animate-spin", strokeWidth: 1 }), _jsx("span", { children: "Loading..." })] }) })), error ? (_jsx("div", { className: "flex h-full items-center justify-center", children: _jsxs("div", { className: "max-w-md text-center", children: [_jsx("div", { className: "text-feedback-red mb-4 text-sm", children: error }), _jsx("button", { onClick: handleRefresh, className: "bg-feedback-blue hover:bg-feedback-blue rounded px-4 py-2 text-xs text-white", children: "Retry" })] }) })) : totalActiveCount === 0 &&
392
+ const newAgentButton = viewMode === "list" && !hideNewAgentButton && (_jsxs(Button, { type: "button", variant: "outline", size: "lg", onClick: handleNewAgentClick, className: cn("border-border-default hover:border-neutral-grey-100 hover:bg-neutral-grey-5 h-[38px] justify-center gap-3 rounded bg-white text-[15px] font-semibold shadow-none", toolbarActions ? "min-w-0 flex-1" : "w-full"), "data-testid": "add-agent-button", children: [_jsx("span", { children: "Start new chat" }), _jsx(Plus, { className: "size-5", strokeWidth: 2.25 })] }));
393
+ return (_jsxs("div", { className: "absolute inset-0 flex flex-col bg-white", children: [!compact && (_jsx(PageHeader, { title: "AI Agents", description: "Build, run and orchestrate your AI workforce", variant: "compact", className: "border-border-default border-b" })), _jsx("div", { className: "relative flex flex-1 flex-col overflow-hidden", children: viewMode === "create" ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "border-border-default shrink-0 border-b bg-white px-6 py-4", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("button", { type: "button", onClick: () => setViewMode("list"), className: "text-neutral-grey-50 hover:bg-neutral-grey-5 hover:text-neutral-grey-100 inline-flex items-center gap-1.5 rounded-md px-2 py-1.5 text-[13px] font-medium transition-colors", "data-testid": "agents-create-back-button", children: [_jsx(ArrowLeft, { className: "size-4", strokeWidth: 2 }), "Back"] }), _jsx("span", { className: "text-neutral-grey-50", children: "/" }), _jsx("h2", { className: "text-neutral-grey-100 text-[15px] font-semibold tracking-tight", children: "New Agent" }), _jsx("p", { className: "text-neutral-grey-50 ml-1 hidden text-[12px] sm:inline", children: "Pick a profile to start with" })] }) }), _jsx("div", { className: "relative flex-1 overflow-y-auto bg-white", children: _jsx(AgentGalleryView, { variant: "pane", onSelectProfile: handleCreateAgent }) })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "border-border-default shrink-0 border-b bg-white px-4 py-4", children: _jsxs("div", { className: "space-y-3", children: [(newAgentButton || toolbarActions) && (_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [newAgentButton, toolbarActions && (_jsx("div", { className: "flex shrink-0 items-center gap-1", children: toolbarActions }))] })), _jsx("div", { className: "min-w-0", children: _jsx(FilterInput, { value: searchTerm, onChange: setSearchTerm, placeholder: "Search...", loading: loading && !initialLoad, size: "sm", inputClassName: "text-sm placeholder:text-neutral-grey-50" }) }), _jsxs("div", { className: "flex min-w-0 items-center gap-3", children: [profileGroups.length > 0 && (_jsxs("div", { className: "border-border-default bg-neutral-grey-5 flex h-10 shrink-0 items-center overflow-hidden rounded border p-0.5", children: [_jsx("button", { type: "button", onClick: () => setHistoryViewMode("grouped"), className: cn("flex size-9 items-center justify-center rounded transition-colors", historyViewMode === "grouped"
394
+ ? "text-neutral-grey-100 bg-white shadow-sm"
395
+ : "text-neutral-grey-50 hover:text-neutral-grey-100"), title: "Grouped by profile", "aria-label": "Grouped by profile", children: _jsx(Layers, { className: "size-5", strokeWidth: 2 }) }), _jsx("button", { type: "button", onClick: () => setHistoryViewMode("flat"), className: cn("flex size-9 items-center justify-center rounded transition-colors", historyViewMode === "flat"
396
+ ? "text-neutral-grey-100 bg-white shadow-sm"
397
+ : "text-neutral-grey-50 hover:text-neutral-grey-100"), title: "Grouped by date", "aria-label": "Grouped by date", children: _jsx(List, { className: "size-5", strokeWidth: 2 }) })] })), _jsxs("label", { className: "text-neutral-grey-50 hover:text-neutral-grey-100 flex min-h-10 min-w-0 flex-1 cursor-pointer items-center justify-between gap-3 rounded text-[14px] font-medium transition-colors", children: [_jsx("span", { className: "min-w-0 truncate select-none", children: "Show just my agents" }), _jsx(Switch, { checked: showOnlyMyAgents, onCheckedChange: (checked) => setShowOnlyMyAgents(checked === true), className: "data-[state=checked]:bg-neutral-grey-100 data-[state=unchecked]:bg-neutral-grey-15 h-[24px] w-[44px] p-[2px] shadow-none [&_[data-slot=switch-thumb]]:size-[20px] [&_[data-slot=switch-thumb]]:data-[state=checked]:translate-x-[20px]" })] })] })] }) }), _jsxs("div", { className: "relative flex-1 overflow-y-auto bg-white", children: [loading && !initialLoad && (_jsx("div", { className: "absolute top-2 left-1/2 z-10 -translate-x-1/2 rounded-md bg-white px-3 py-1.5 shadow-md", children: _jsxs("div", { className: "text-neutral-grey-50 flex items-center gap-2 text-sm", children: [_jsx(RefreshCw, { className: "size-3 animate-spin", strokeWidth: 1 }), _jsx("span", { children: "Loading..." })] }) })), error ? (_jsx("div", { className: "flex h-full items-center justify-center", children: _jsxs("div", { className: "max-w-md text-center", children: [_jsx("div", { className: "text-feedback-red mb-4 text-sm", children: error }), _jsx("button", { onClick: handleRefresh, className: "bg-feedback-blue hover:bg-feedback-blue rounded px-4 py-2 text-xs text-white", children: "Retry" })] }) })) : totalActiveCount === 0 &&
373
398
  totalClosedCount === 0 &&
374
399
  !loading ? (_jsx("div", { className: "text-neutral-grey-50 flex h-full items-center justify-center text-sm", children: searchTerm.trim()
375
400
  ? "No agents match your search"
376
- : "No agents found" })) : (_jsxs("div", { className: cn("space-y-4 p-4", loading && "opacity-60"), children: [activeAgents.length > 0 && (_jsx("div", { className: "space-y-2", children: _jsx("div", { className: "divide-border-default border-border-default divide-y overflow-hidden rounded-lg border bg-white", children: sortedActiveAgents.map((agent) => (_jsx(AgentCard, { agent: agent, onClick: handleAgentClick, onResume: handleOpenAgent, onDelete: handleDeleteAgent, formatDateTime: formatDateTime, selected: selectedAgentId === agent.id }, agent.id))) }) })), profileGroups.length > 0 && (_jsx("div", { className: "space-y-2", children: historyViewMode === "grouped" ? (_jsx("div", { className: "divide-border-default border-border-default divide-y overflow-hidden rounded-lg border bg-white", children: profileGroups.map((profileGroup) => {
401
+ : "No agents found" })) : (_jsxs("div", { className: cn("space-y-5 px-4 py-4", loading && "opacity-60"), children: [activeAgents.length > 0 && (_jsxs("div", { className: "space-y-1.5", children: [_jsx("div", { className: "text-neutral-grey-50 py-1.5 text-[14px] leading-5 font-medium", children: "Active" }), _jsx("div", { className: "space-y-1", children: sortedActiveAgents.map((agent) => (_jsx(AgentCard, { agent: agent, onClick: handleAgentClick, onResume: handleOpenAgent, onDelete: handleDeleteAgent, onRename: handleRenameAgent, formatDateTime: formatDateTime, selected: selectedAgentId === agent.id }, agent.id))) })] })), profileGroups.length > 0 && (_jsx("div", { className: "space-y-2", children: historyViewMode === "grouped" ? (_jsx("div", { className: "space-y-2 bg-white", children: profileGroups.map((profileGroup) => {
377
402
  const profileKey = profileGroup.profileId || "null";
378
403
  const isExpanded = expandedProfiles.has(profileKey);
379
404
  const isLoadingMore = loadingMoreForProfile === profileGroup.profileId;
380
405
  const hasMore = profileGroup.agents.length <
381
406
  profileGroup.totalClosedCount;
382
- return (_jsx(ProfileAgentsGroup, { profileGroup: profileGroup, isExpanded: isExpanded, isLoadingMore: isLoadingMore, hasMore: hasMore, onToggle: () => handleToggleProfile(profileGroup.profileId), onLoadMore: () => handleLoadMoreForProfile(profileGroup.profileId), onAgentClick: handleAgentClick, onResumeAgent: handleOpenAgent, onDeleteAgent: handleDeleteAgent, formatDateTime: formatDateTime, selectedAgentId: selectedAgentId }, profileKey));
383
- }) })) : (_jsx("div", { className: "space-y-3", children: dateBuckets.map((bucket) => (_jsx(DateAgentsGroup, { bucketKey: bucket.key, label: bucket.label, agents: bucket.agents, isExpanded: !collapsedDateBuckets.has(bucket.key), onToggle: () => handleToggleDateBucket(bucket.key), onAgentClick: handleAgentClick, onResumeAgent: handleOpenAgent, onDeleteAgent: handleDeleteAgent, formatDateTime: formatDateTime, selectedAgentId: selectedAgentId }, bucket.key))) })) }))] }))] })] })) })] }));
407
+ return (_jsx(ProfileAgentsGroup, { profileGroup: profileGroup, isExpanded: isExpanded, isLoadingMore: isLoadingMore, hasMore: hasMore, onToggle: () => handleToggleProfile(profileGroup.profileId), onLoadMore: () => handleLoadMoreForProfile(profileGroup.profileId), onAgentClick: handleAgentClick, onResumeAgent: handleOpenAgent, onDeleteAgent: handleDeleteAgent, onRenameAgent: handleRenameAgent, formatDateTime: formatDateTime, selectedAgentId: selectedAgentId }, profileKey));
408
+ }) })) : (_jsx("div", { className: "space-y-5", children: dateBuckets.map((bucket) => (_jsx(DateAgentsGroup, { bucketKey: bucket.key, label: bucket.label, agents: bucket.agents, isExpanded: !collapsedDateBuckets.has(bucket.key), onToggle: () => handleToggleDateBucket(bucket.key), onAgentClick: handleAgentClick, onResumeAgent: handleOpenAgent, onDeleteAgent: handleDeleteAgent, onRenameAgent: handleRenameAgent, formatDateTime: formatDateTime, selectedAgentId: selectedAgentId }, bucket.key))) })) }))] }))] })] })) }), _jsx(RenameAgentDialog, { open: renameTarget !== null, initialName: renameTarget?.name ?? "", onOpenChange: (open) => {
409
+ if (!open)
410
+ setRenameTarget(null);
411
+ }, onRename: performRename })] }));
384
412
  }
385
413
  //# sourceMappingURL=AgentsView.js.map