@parhelia/core 0.1.12601 → 0.1.12602

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 (584) hide show
  1. package/dist/agents-view/AgentCard.d.ts +4 -6
  2. package/dist/agents-view/AgentCard.js +24 -143
  3. package/dist/agents-view/AgentCard.js.map +1 -1
  4. package/dist/agents-view/AgentsInbox.d.ts +1 -1
  5. package/dist/agents-view/AgentsInbox.js +92 -7
  6. package/dist/agents-view/AgentsInbox.js.map +1 -1
  7. package/dist/agents-view/AgentsTitlebar.js +2 -3
  8. package/dist/agents-view/AgentsTitlebar.js.map +1 -1
  9. package/dist/agents-view/AgentsView.d.ts +7 -6
  10. package/dist/agents-view/AgentsView.js +99 -191
  11. package/dist/agents-view/AgentsView.js.map +1 -1
  12. package/dist/agents-view/AgentsWorkspaceView.d.ts +6 -2
  13. package/dist/agents-view/AgentsWorkspaceView.js +113 -266
  14. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  15. package/dist/agents-view/ProfileAgentsGroup.d.ts +1 -2
  16. package/dist/agents-view/ProfileAgentsGroup.js +3 -4
  17. package/dist/agents-view/ProfileAgentsGroup.js.map +1 -1
  18. package/dist/components/ActionButton.d.ts +1 -1
  19. package/dist/components/ActionButton.js.map +1 -1
  20. package/dist/components/FilterInput.d.ts +1 -1
  21. package/dist/components/FilterInput.js +1 -1
  22. package/dist/components/FilterInput.js.map +1 -1
  23. package/dist/components/ui/LanguageSelector.js +4 -2
  24. package/dist/components/ui/LanguageSelector.js.map +1 -1
  25. package/dist/components/ui/PlaceholderInput.js +3 -3
  26. package/dist/components/ui/PlaceholderInput.js.map +1 -1
  27. package/dist/components/ui/PlaceholderInputTypes.js +1 -1
  28. package/dist/components/ui/PlaceholderInputTypes.js.map +1 -1
  29. package/dist/components/ui/alert-dialog.d.ts +1 -1
  30. package/dist/components/ui/alert-dialog.js +10 -6
  31. package/dist/components/ui/alert-dialog.js.map +1 -1
  32. package/dist/components/ui/button.d.ts +4 -4
  33. package/dist/components/ui/button.js +1 -4
  34. package/dist/components/ui/button.js.map +1 -1
  35. package/dist/components/ui/context-menu.d.ts +1 -1
  36. package/dist/components/ui/context-menu.js +4 -12
  37. package/dist/components/ui/context-menu.js.map +1 -1
  38. package/dist/components/ui/copy-button.d.ts +1 -2
  39. package/dist/components/ui/copy-button.js +2 -2
  40. package/dist/components/ui/copy-button.js.map +1 -1
  41. package/dist/components/ui/dialog.d.ts +1 -1
  42. package/dist/components/ui/dialog.js +126 -21
  43. package/dist/components/ui/dialog.js.map +1 -1
  44. package/dist/components/ui/input.d.ts +1 -1
  45. package/dist/components/ui/input.js +3 -5
  46. package/dist/components/ui/input.js.map +1 -1
  47. package/dist/components/ui/paste-button.d.ts +1 -2
  48. package/dist/components/ui/paste-button.js +2 -2
  49. package/dist/components/ui/paste-button.js.map +1 -1
  50. package/dist/components/ui/popover.js +9 -1
  51. package/dist/components/ui/popover.js.map +1 -1
  52. package/dist/components/ui/select.js +1 -1
  53. package/dist/components/ui/select.js.map +1 -1
  54. package/dist/components/ui/styled-dialog-title.js +1 -1
  55. package/dist/components/ui/styled-dialog-title.js.map +1 -1
  56. package/dist/components/ui/tabs.d.ts +1 -1
  57. package/dist/components/ui/tabs.js +11 -4
  58. package/dist/components/ui/tabs.js.map +1 -1
  59. package/dist/config/config.d.ts +2 -4
  60. package/dist/config/config.js +70 -250
  61. package/dist/config/config.js.map +1 -1
  62. package/dist/config/types/workspace.d.ts +0 -6
  63. package/dist/config/types.d.ts +12 -63
  64. package/dist/config/types.js.map +1 -1
  65. package/dist/editor/ComponentInfo.d.ts +4 -0
  66. package/dist/editor/ComponentInfo.js +41 -0
  67. package/dist/editor/ComponentInfo.js.map +1 -0
  68. package/dist/editor/ConfirmationDialog.js +4 -20
  69. package/dist/editor/ConfirmationDialog.js.map +1 -1
  70. package/dist/editor/ContentTree.d.ts +1 -2
  71. package/dist/editor/ContentTree.js +32 -93
  72. package/dist/editor/ContentTree.js.map +1 -1
  73. package/dist/editor/Editor.js +22 -87
  74. package/dist/editor/Editor.js.map +1 -1
  75. package/dist/editor/FieldHistory.js +36 -84
  76. package/dist/editor/FieldHistory.js.map +1 -1
  77. package/dist/editor/FieldListField.js +9 -21
  78. package/dist/editor/FieldListField.js.map +1 -1
  79. package/dist/editor/FieldListFieldWithFallbacks.js +2 -23
  80. package/dist/editor/FieldListFieldWithFallbacks.js.map +1 -1
  81. package/dist/editor/GlobalMenuBar.js +2 -29
  82. package/dist/editor/GlobalMenuBar.js.map +1 -1
  83. package/dist/editor/ImageEditor.js +2 -5
  84. package/dist/editor/ImageEditor.js.map +1 -1
  85. package/dist/editor/ItemInfo.js +1 -36
  86. package/dist/editor/ItemInfo.js.map +1 -1
  87. package/dist/editor/LinkEditorDialog.js +0 -3
  88. package/dist/editor/LinkEditorDialog.js.map +1 -1
  89. package/dist/editor/MainLayout.d.ts +2 -0
  90. package/dist/editor/MainLayout.js +8 -65
  91. package/dist/editor/MainLayout.js.map +1 -1
  92. package/dist/editor/MigrationsView.js +5 -29
  93. package/dist/editor/MigrationsView.js.map +1 -1
  94. package/dist/editor/MobileLayout.js +12 -37
  95. package/dist/editor/MobileLayout.js.map +1 -1
  96. package/dist/editor/PictureCropper.js +45 -54
  97. package/dist/editor/PictureCropper.js.map +1 -1
  98. package/dist/editor/PictureEditor.js +15 -17
  99. package/dist/editor/PictureEditor.js.map +1 -1
  100. package/dist/editor/QuickItemSwitcher.js +63 -37
  101. package/dist/editor/QuickItemSwitcher.js.map +1 -1
  102. package/dist/editor/SetupWizard.js +12 -52
  103. package/dist/editor/SetupWizard.js.map +1 -1
  104. package/dist/editor/Titlebar.js +2 -7
  105. package/dist/editor/Titlebar.js.map +1 -1
  106. package/dist/editor/ai/AgentCostDisplay.d.ts +0 -1
  107. package/dist/editor/ai/AgentCostDisplay.js +1 -1
  108. package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
  109. package/dist/editor/ai/AgentDocumentList.js +14 -32
  110. package/dist/editor/ai/AgentDocumentList.js.map +1 -1
  111. package/dist/editor/ai/AgentGreeting.js +5 -6
  112. package/dist/editor/ai/AgentGreeting.js.map +1 -1
  113. package/dist/editor/ai/AgentProfileSelector.js +1 -2
  114. package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
  115. package/dist/editor/ai/AgentStatusBadge.d.ts +5 -0
  116. package/dist/editor/ai/AgentStatusBadge.js +65 -67
  117. package/dist/editor/ai/AgentStatusBadge.js.map +1 -1
  118. package/dist/editor/ai/AgentTerminal.d.ts +2 -14
  119. package/dist/editor/ai/AgentTerminal.js +572 -2508
  120. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  121. package/dist/editor/ai/AgentTerminalStatusBar.d.ts +4 -9
  122. package/dist/editor/ai/AgentTerminalStatusBar.js +56 -481
  123. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  124. package/dist/editor/ai/Agents.js +113 -161
  125. package/dist/editor/ai/Agents.js.map +1 -1
  126. package/dist/editor/ai/AiResponseMessage.d.ts +1 -10
  127. package/dist/editor/ai/AiResponseMessage.js +26 -267
  128. package/dist/editor/ai/AiResponseMessage.js.map +1 -1
  129. package/dist/editor/ai/ContextInfoBar.d.ts +3 -2
  130. package/dist/editor/ai/ContextInfoBar.js +7 -64
  131. package/dist/editor/ai/ContextInfoBar.js.map +1 -1
  132. package/dist/editor/ai/EditOperationsPanel.d.ts +2 -3
  133. package/dist/editor/ai/EditOperationsPanel.js +78 -21
  134. package/dist/editor/ai/EditOperationsPanel.js.map +1 -1
  135. package/dist/editor/ai/GuidanceOverlay.js +11 -17
  136. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  137. package/dist/editor/ai/HelpTerminal.d.ts +5 -0
  138. package/dist/editor/ai/HelpTerminal.js +166 -0
  139. package/dist/editor/ai/HelpTerminal.js.map +1 -0
  140. package/dist/editor/ai/InlineAiDialog.d.ts +1 -1
  141. package/dist/editor/ai/InlineAiDialog.js +192 -514
  142. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  143. package/dist/editor/ai/InlineAiTrigger.js +12 -115
  144. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  145. package/dist/editor/ai/MediaImage.js +8 -40
  146. package/dist/editor/ai/MediaImage.js.map +1 -1
  147. package/dist/editor/ai/SpawnedAgentsPanel.js +12 -10
  148. package/dist/editor/ai/SpawnedAgentsPanel.js.map +1 -1
  149. package/dist/editor/ai/ToolCallDisplay.d.ts +2 -22
  150. package/dist/editor/ai/ToolCallDisplay.js +202 -614
  151. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  152. package/dist/editor/ai/dialogs/AgentDialogHandler.d.ts +8 -1
  153. package/dist/editor/ai/dialogs/AgentDialogHandler.js +42 -379
  154. package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
  155. package/dist/editor/ai/dialogs/QuestionnaireInline.d.ts +1 -5
  156. package/dist/editor/ai/dialogs/QuestionnaireInline.js +60 -628
  157. package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
  158. package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +0 -117
  159. package/dist/editor/ai/dialogs/agentDialogTypes.js +0 -2
  160. package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
  161. package/dist/editor/ai/types.d.ts +1 -3
  162. package/dist/editor/ai/useAgentStatus.d.ts +1 -2
  163. package/dist/editor/ai/useAgentStatus.js +100 -90
  164. package/dist/editor/ai/useAgentStatus.js.map +1 -1
  165. package/dist/editor/ai/useInlineAiPosition.js +5 -45
  166. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  167. package/dist/editor/client/AboutDialog.js +2 -4
  168. package/dist/editor/client/AboutDialog.js.map +1 -1
  169. package/dist/editor/client/EditorShell.d.ts +1 -4
  170. package/dist/editor/client/EditorShell.js +258 -853
  171. package/dist/editor/client/EditorShell.js.map +1 -1
  172. package/dist/editor/client/editContext.d.ts +19 -33
  173. package/dist/editor/client/editContext.js.map +1 -1
  174. package/dist/editor/client/helpers.js +0 -6
  175. package/dist/editor/client/helpers.js.map +1 -1
  176. package/dist/editor/client/hooks/useEditorUrlSync.js +2 -1
  177. package/dist/editor/client/hooks/useEditorUrlSync.js.map +1 -1
  178. package/dist/editor/client/hooks/useEditorWebSocket.d.ts +0 -10
  179. package/dist/editor/client/hooks/useEditorWebSocket.js +14 -209
  180. package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
  181. package/dist/editor/client/hooks/useQuota.d.ts +0 -8
  182. package/dist/editor/client/hooks/useQuota.js.map +1 -1
  183. package/dist/editor/client/hooks/useSocketMessageHandler.js +15 -73
  184. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  185. package/dist/editor/client/itemsRepository.js +6 -10
  186. package/dist/editor/client/itemsRepository.js.map +1 -1
  187. package/dist/editor/client/operations.d.ts +3 -6
  188. package/dist/editor/client/operations.js +30 -208
  189. package/dist/editor/client/operations.js.map +1 -1
  190. package/dist/editor/client/pageModelBuilder.js +31 -4
  191. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  192. package/dist/editor/client/ui/DevModeIndicator.js +2 -2
  193. package/dist/editor/client/ui/DevModeIndicator.js.map +1 -1
  194. package/dist/editor/client/ui/EditorChrome.d.ts +6 -0
  195. package/dist/editor/client/ui/EditorChrome.js +72 -55
  196. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  197. package/dist/editor/client/ui/FullscreenControls.js +3 -5
  198. package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
  199. package/dist/editor/commands/commands.d.ts +1 -11
  200. package/dist/editor/commands/commands.js +1 -12
  201. package/dist/editor/commands/commands.js.map +1 -1
  202. package/dist/editor/commands/componentCommands.js +55 -109
  203. package/dist/editor/commands/componentCommands.js.map +1 -1
  204. package/dist/editor/commands/customCommandConverter.d.ts +1 -8
  205. package/dist/editor/commands/customCommandConverter.js +5 -35
  206. package/dist/editor/commands/customCommandConverter.js.map +1 -1
  207. package/dist/editor/commands/handlers/agentHandler.js +1 -2
  208. package/dist/editor/commands/handlers/agentHandler.js.map +1 -1
  209. package/dist/editor/commands/itemCommands.d.ts +0 -3
  210. package/dist/editor/commands/itemCommands.js +10 -93
  211. package/dist/editor/commands/itemCommands.js.map +1 -1
  212. package/dist/editor/commands/undo.d.ts +15 -9
  213. package/dist/editor/commands/undo.js +0 -24
  214. package/dist/editor/commands/undo.js.map +1 -1
  215. package/dist/editor/context-menu/InsertMenu.js +39 -83
  216. package/dist/editor/context-menu/InsertMenu.js.map +1 -1
  217. package/dist/editor/field-types/MultiLineText.js +1 -1
  218. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  219. package/dist/editor/field-types/RawEditor.js +1 -1
  220. package/dist/editor/field-types/ReactQuill.d.ts +125 -0
  221. package/dist/editor/field-types/ReactQuill.js +385 -0
  222. package/dist/editor/field-types/ReactQuill.js.map +1 -0
  223. package/dist/editor/field-types/RichTextEditor.js +5 -13
  224. package/dist/editor/field-types/RichTextEditor.js.map +1 -1
  225. package/dist/editor/field-types/RichTextEditorComponent.js +3 -37
  226. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  227. package/dist/editor/field-types/SingleLineText.js +1 -1
  228. package/dist/editor/field-types/TreeListEditor.js +2 -3
  229. package/dist/editor/field-types/TreeListEditor.js.map +1 -1
  230. package/dist/editor/field-types/richtext/components/ReactSlate.css +5 -23
  231. package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +0 -2
  232. package/dist/editor/field-types/richtext/components/ReactSlate.js +4 -28
  233. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  234. package/dist/editor/field-types/richtext/components/ToolbarButton.js +2 -4
  235. package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -1
  236. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +0 -13
  237. package/dist/editor/field-types/richtext/contextMenuFactory.js +24 -181
  238. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  239. package/dist/editor/field-types/richtext/types.d.ts +0 -2
  240. package/dist/editor/field-types/richtext/types.js.map +1 -1
  241. package/dist/editor/field-types/richtext/utils/plugins.js +0 -4
  242. package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -1
  243. package/dist/editor/field-types/textContextMenuFactory.js +2 -3
  244. package/dist/editor/field-types/textContextMenuFactory.js.map +1 -1
  245. package/dist/editor/media-selector/AiImageSearchPrompt.js +2 -4
  246. package/dist/editor/media-selector/AiImageSearchPrompt.js.map +1 -1
  247. package/dist/editor/media-selector/MediaFolderBrowser.js +1 -1
  248. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  249. package/dist/editor/media-selector/MediaSelector.js +1 -7
  250. package/dist/editor/media-selector/MediaSelector.js.map +1 -1
  251. package/dist/editor/media-selector/TreeSelector.js +35 -40
  252. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  253. package/dist/editor/menubar/ActiveUsers.js +1 -1
  254. package/dist/editor/menubar/ActiveUsers.js.map +1 -1
  255. package/dist/editor/menubar/GenericToolbar.js +2 -4
  256. package/dist/editor/menubar/GenericToolbar.js.map +1 -1
  257. package/dist/editor/menubar/ItemLanguageVersion.js +2 -2
  258. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
  259. package/dist/editor/menubar/PageSelector.js +147 -26
  260. package/dist/editor/menubar/PageSelector.js.map +1 -1
  261. package/dist/editor/menubar/Separator.js +1 -1
  262. package/dist/editor/menubar/VersionSelector.js +4 -2
  263. package/dist/editor/menubar/VersionSelector.js.map +1 -1
  264. package/dist/editor/menubar/WorkflowButton.js +12 -39
  265. package/dist/editor/menubar/WorkflowButton.js.map +1 -1
  266. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js +38 -16
  267. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js.map +1 -1
  268. package/dist/editor/menubar/toolbar-sections/EditControls.js +3 -3
  269. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  270. package/dist/editor/menubar/toolbar-sections/HelpButton.js +0 -1
  271. package/dist/editor/menubar/toolbar-sections/HelpButton.js.map +1 -1
  272. package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +10 -6
  273. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +220 -597
  274. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  275. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +2 -13
  276. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  277. package/dist/editor/page-editor-chrome/CommentHighlighting.js +1 -42
  278. package/dist/editor/page-editor-chrome/CommentHighlighting.js.map +1 -1
  279. package/dist/editor/page-editor-chrome/FrameMenu.js +1 -1
  280. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  281. package/dist/editor/page-editor-chrome/InlineEditor.js +48 -97
  282. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
  283. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +17 -38
  284. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  285. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +11 -17
  286. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  287. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +301 -301
  288. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
  289. package/dist/editor/page-viewer/DeviceToolbar.js +1 -1
  290. package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -1
  291. package/dist/editor/page-viewer/EditorForm.js +11 -69
  292. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  293. package/dist/editor/page-viewer/MiniMap.d.ts +4 -2
  294. package/dist/editor/page-viewer/MiniMap.js +28 -91
  295. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  296. package/dist/editor/page-viewer/PageViewer.d.ts +1 -3
  297. package/dist/editor/page-viewer/PageViewer.js +19 -92
  298. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  299. package/dist/editor/page-viewer/PageViewerFrame.d.ts +1 -2
  300. package/dist/editor/page-viewer/PageViewerFrame.js +115 -348
  301. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  302. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +49 -114
  303. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
  304. package/dist/editor/page-viewer/pageViewContext.d.ts +0 -1
  305. package/dist/editor/page-viewer/pageViewContext.js +14 -51
  306. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  307. package/dist/editor/pageModel.d.ts +1 -14
  308. package/dist/editor/reviews/Comment.d.ts +1 -2
  309. package/dist/editor/reviews/Comment.js +15 -92
  310. package/dist/editor/reviews/Comment.js.map +1 -1
  311. package/dist/editor/reviews/CommentDisplayPopover.js +5 -70
  312. package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
  313. package/dist/editor/reviews/CommentView.d.ts +1 -3
  314. package/dist/editor/reviews/CommentView.js +6 -26
  315. package/dist/editor/reviews/CommentView.js.map +1 -1
  316. package/dist/editor/reviews/Comments.js +75 -140
  317. package/dist/editor/reviews/Comments.js.map +1 -1
  318. package/dist/editor/reviews/CreateReviewDialog.js +177 -281
  319. package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
  320. package/dist/editor/reviews/DecisionsMatrix.js +25 -96
  321. package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
  322. package/dist/editor/reviews/DiffView.js +14 -7
  323. package/dist/editor/reviews/DiffView.js.map +1 -1
  324. package/dist/editor/reviews/EditReviewSettingsDialog.js +4 -6
  325. package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
  326. package/dist/editor/reviews/MultiReviewManager.js +3 -25
  327. package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
  328. package/dist/editor/reviews/PagesPanel.js +15 -31
  329. package/dist/editor/reviews/PagesPanel.js.map +1 -1
  330. package/dist/editor/reviews/PreviewInfo.js +4 -1
  331. package/dist/editor/reviews/PreviewInfo.js.map +1 -1
  332. package/dist/editor/reviews/ReviewCard.js +7 -13
  333. package/dist/editor/reviews/ReviewCard.js.map +1 -1
  334. package/dist/editor/reviews/ReviewDetail.js +2 -3
  335. package/dist/editor/reviews/ReviewDetail.js.map +1 -1
  336. package/dist/editor/reviews/ReviewsList.js +3 -7
  337. package/dist/editor/reviews/ReviewsList.js.map +1 -1
  338. package/dist/editor/reviews/SuggestedEdit.js +3 -34
  339. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  340. package/dist/editor/reviews/SuggestionDisplayPopover.js +5 -31
  341. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  342. package/dist/editor/reviews/commentAi.js +6 -25
  343. package/dist/editor/reviews/commentAi.js.map +1 -1
  344. package/dist/editor/reviews/reviewCommands.js +1 -4
  345. package/dist/editor/reviews/reviewCommands.js.map +1 -1
  346. package/dist/editor/reviews/useMultiReview.js +2 -2
  347. package/dist/editor/reviews/useMultiReview.js.map +1 -1
  348. package/dist/editor/reviews/useReviews.d.ts +3 -4
  349. package/dist/editor/reviews/useReviews.js +32 -21
  350. package/dist/editor/reviews/useReviews.js.map +1 -1
  351. package/dist/editor/services/agentService.d.ts +5 -240
  352. package/dist/editor/services/agentService.js +39 -299
  353. package/dist/editor/services/agentService.js.map +1 -1
  354. package/dist/editor/services/aiService.d.ts +1 -57
  355. package/dist/editor/services/aiService.js +6 -79
  356. package/dist/editor/services/aiService.js.map +1 -1
  357. package/dist/editor/services/contentService.d.ts +3 -6
  358. package/dist/editor/services/contentService.js +12 -13
  359. package/dist/editor/services/contentService.js.map +1 -1
  360. package/dist/editor/services/editService.d.ts +1 -52
  361. package/dist/editor/services/editService.js +2 -94
  362. package/dist/editor/services/editService.js.map +1 -1
  363. package/dist/editor/services/indexService.js +1 -1
  364. package/dist/editor/services/indexService.js.map +1 -1
  365. package/dist/editor/services/reviewsService.d.ts +6 -3
  366. package/dist/editor/services/reviewsService.js +11 -2
  367. package/dist/editor/services/reviewsService.js.map +1 -1
  368. package/dist/editor/services/serviceHelper.d.ts +1 -2
  369. package/dist/editor/services/serviceHelper.js +20 -112
  370. package/dist/editor/services/serviceHelper.js.map +1 -1
  371. package/dist/editor/services/systemService.d.ts +1 -2
  372. package/dist/editor/services/systemService.js +0 -3
  373. package/dist/editor/services/systemService.js.map +1 -1
  374. package/dist/editor/services-server/api.d.ts +2 -1
  375. package/dist/editor/services-server/api.js +6 -11
  376. package/dist/editor/services-server/api.js.map +1 -1
  377. package/dist/editor/services-server/graphQL.d.ts +29 -0
  378. package/dist/editor/services-server/graphQL.js +53 -0
  379. package/dist/editor/services-server/graphQL.js.map +1 -0
  380. package/dist/editor/settings/About.js +3 -317
  381. package/dist/editor/settings/About.js.map +1 -1
  382. package/dist/editor/settings/AllAgentsPanel.d.ts +5 -0
  383. package/dist/editor/settings/AllAgentsPanel.js +139 -0
  384. package/dist/editor/settings/AllAgentsPanel.js.map +1 -0
  385. package/dist/editor/settings/IndexOverview.js +1 -3
  386. package/dist/editor/settings/IndexOverview.js.map +1 -1
  387. package/dist/editor/settings/LatestFeedback.d.ts +1 -0
  388. package/dist/editor/settings/LatestFeedback.js +136 -0
  389. package/dist/editor/settings/LatestFeedback.js.map +1 -0
  390. package/dist/editor/settings/QuotaInfo.js +4 -210
  391. package/dist/editor/settings/QuotaInfo.js.map +1 -1
  392. package/dist/editor/settings/SettingsView.js +23 -25
  393. package/dist/editor/settings/SettingsView.js.map +1 -1
  394. package/dist/editor/settings/Setup.d.ts +1 -0
  395. package/dist/editor/settings/Setup.js +211 -0
  396. package/dist/editor/settings/Setup.js.map +1 -0
  397. package/dist/editor/settings/Status.js +6 -7
  398. package/dist/editor/settings/Status.js.map +1 -1
  399. package/dist/editor/settings/index/useIndexStatus.js +22 -23
  400. package/dist/editor/settings/index/useIndexStatus.js.map +1 -1
  401. package/dist/editor/settings/panels/AgentsPanel.d.ts +4 -0
  402. package/dist/editor/settings/panels/AgentsPanel.js +121 -95
  403. package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
  404. package/dist/editor/settings/panels/DatabasePanel.d.ts +6 -0
  405. package/dist/editor/settings/panels/DatabasePanel.js +50 -0
  406. package/dist/editor/settings/panels/DatabasePanel.js.map +1 -0
  407. package/dist/editor/settings/panels/ModelsPanel.js +108 -324
  408. package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
  409. package/dist/editor/settings/panels/ProvidersPanel.d.ts +1 -1
  410. package/dist/editor/settings/panels/ProvidersPanel.js +59 -86
  411. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  412. package/dist/editor/settings/panels/SearchConfigPanel.js +6 -67
  413. package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
  414. package/dist/editor/settings/panels/StatusPanel.js +2 -7
  415. package/dist/editor/settings/panels/StatusPanel.js.map +1 -1
  416. package/dist/editor/settings/panels/index.d.ts +2 -3
  417. package/dist/editor/settings/panels/index.js +2 -3
  418. package/dist/editor/settings/panels/index.js.map +1 -1
  419. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +2 -0
  420. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js +195 -0
  421. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +1 -0
  422. package/dist/editor/settings/setup-steps/AiSetupStep/index.d.ts +2 -0
  423. package/dist/editor/settings/setup-steps/AiSetupStep/index.js +21 -0
  424. package/dist/editor/settings/setup-steps/AiSetupStep/index.js.map +1 -0
  425. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +1 -0
  426. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js +233 -0
  427. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js.map +1 -0
  428. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +15 -0
  429. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +14 -0
  430. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +1 -0
  431. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +1 -0
  432. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +94 -0
  433. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +1 -0
  434. package/dist/editor/settings/setup-steps/AiSetupStep/types.d.ts +1 -0
  435. package/dist/editor/settings/setup-steps/AiSetupStep/types.js +2 -0
  436. package/dist/editor/settings/setup-steps/AiSetupStep/types.js.map +1 -0
  437. package/dist/editor/settings/setup-steps/AiSetupStep/utils.d.ts +5 -0
  438. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js +44 -0
  439. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js.map +1 -0
  440. package/dist/editor/settings/setup-steps/IndexSetupStep.d.ts +2 -0
  441. package/dist/editor/settings/setup-steps/IndexSetupStep.js +36 -0
  442. package/dist/editor/settings/setup-steps/IndexSetupStep.js.map +1 -0
  443. package/dist/editor/settings/setup-steps/SettingsSetupStep.d.ts +2 -0
  444. package/dist/editor/settings/setup-steps/SettingsSetupStep.js +111 -0
  445. package/dist/editor/settings/setup-steps/SettingsSetupStep.js.map +1 -0
  446. package/dist/editor/settings/setup-steps/SetupOverview.d.ts +14 -0
  447. package/dist/editor/settings/setup-steps/SetupOverview.js +38 -0
  448. package/dist/editor/settings/setup-steps/SetupOverview.js.map +1 -0
  449. package/dist/editor/settings/status/coreStatusChecks.js +19 -124
  450. package/dist/editor/settings/status/coreStatusChecks.js.map +1 -1
  451. package/dist/editor/settings/status/useStartupChecks.d.ts +1 -3
  452. package/dist/editor/settings/status/useStartupChecks.js +5 -9
  453. package/dist/editor/settings/status/useStartupChecks.js.map +1 -1
  454. package/dist/editor/setup-wizard/steps/CompleteStep.d.ts +1 -2
  455. package/dist/editor/setup-wizard/steps/CompleteStep.js +1 -2
  456. package/dist/editor/setup-wizard/steps/CompleteStep.js.map +1 -1
  457. package/dist/editor/sidebar/ComponentPalette.js +1 -2
  458. package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
  459. package/dist/editor/sidebar/ComponentTree.d.ts +1 -8
  460. package/dist/editor/sidebar/ComponentTree.js +69 -216
  461. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  462. package/dist/editor/sidebar/Debug.d.ts +1 -0
  463. package/dist/editor/sidebar/Debug.js +70 -0
  464. package/dist/editor/sidebar/Debug.js.map +1 -0
  465. package/dist/editor/sidebar/EditHistory.js +46 -22
  466. package/dist/editor/sidebar/EditHistory.js.map +1 -1
  467. package/dist/editor/sidebar/Favorites.js +8 -4
  468. package/dist/editor/sidebar/Favorites.js.map +1 -1
  469. package/dist/editor/sidebar/GraphQL.d.ts +2 -0
  470. package/dist/editor/sidebar/GraphQL.js +234 -0
  471. package/dist/editor/sidebar/GraphQL.js.map +1 -0
  472. package/dist/editor/sidebar/LeftToolbar.d.ts +1 -0
  473. package/dist/editor/sidebar/LeftToolbar.js +12 -0
  474. package/dist/editor/sidebar/LeftToolbar.js.map +1 -0
  475. package/dist/editor/sidebar/MainContentTree.js +3 -4
  476. package/dist/editor/sidebar/MainContentTree.js.map +1 -1
  477. package/dist/editor/sidebar/NavigationSidebar.d.ts +4 -0
  478. package/dist/editor/sidebar/NavigationSidebar.js +254 -0
  479. package/dist/editor/sidebar/NavigationSidebar.js.map +1 -0
  480. package/dist/editor/sidebar/OperationItem.js +7 -21
  481. package/dist/editor/sidebar/OperationItem.js.map +1 -1
  482. package/dist/editor/sidebar/SidebarPanel.d.ts +1 -3
  483. package/dist/editor/sidebar/SidebarPanel.js +12 -44
  484. package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
  485. package/dist/editor/sidebar/SidebarStack.d.ts +1 -2
  486. package/dist/editor/sidebar/SidebarStack.js +3 -4
  487. package/dist/editor/sidebar/SidebarStack.js.map +1 -1
  488. package/dist/editor/sidebar/Validation.js +12 -24
  489. package/dist/editor/sidebar/Validation.js.map +1 -1
  490. package/dist/editor/sidebar/Workbox.js +3 -53
  491. package/dist/editor/sidebar/Workbox.js.map +1 -1
  492. package/dist/editor/sidebar/WorkspaceRail.d.ts +1 -0
  493. package/dist/editor/sidebar/WorkspaceRail.js +167 -56
  494. package/dist/editor/sidebar/WorkspaceRail.js.map +1 -1
  495. package/dist/editor/tree-indicators/GutterColumns.d.ts +1 -3
  496. package/dist/editor/tree-indicators/GutterColumns.js +5 -26
  497. package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
  498. package/dist/editor/tree-indicators/GutterContext.d.ts +0 -4
  499. package/dist/editor/tree-indicators/GutterContext.js +0 -23
  500. package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
  501. package/dist/editor/tree-indicators/GutterSelector.d.ts +5 -0
  502. package/dist/editor/tree-indicators/GutterSelector.js +91 -0
  503. package/dist/editor/tree-indicators/GutterSelector.js.map +1 -0
  504. package/dist/editor/tree-indicators/index.d.ts +1 -0
  505. package/dist/editor/tree-indicators/index.js +1 -0
  506. package/dist/editor/tree-indicators/index.js.map +1 -1
  507. package/dist/editor/tree-indicators/types.d.ts +1 -12
  508. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js +1 -1
  509. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js.map +1 -1
  510. package/dist/editor/ui/Icons.js +1 -1
  511. package/dist/editor/ui/Icons.js.map +1 -1
  512. package/dist/editor/ui/ItemNameDialogNew.d.ts +0 -2
  513. package/dist/editor/ui/ItemNameDialogNew.js +17 -33
  514. package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
  515. package/dist/editor/ui/ItemSearch.js +11 -7
  516. package/dist/editor/ui/ItemSearch.js.map +1 -1
  517. package/dist/editor/ui/SimpleIconButton.js +1 -1
  518. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  519. package/dist/editor/ui/SimpleTabs.d.ts +0 -1
  520. package/dist/editor/ui/SimpleTabs.js +25 -45
  521. package/dist/editor/ui/SimpleTabs.js.map +1 -1
  522. package/dist/editor/ui/Splitter.d.ts +0 -1
  523. package/dist/editor/ui/Splitter.js +86 -102
  524. package/dist/editor/ui/Splitter.js.map +1 -1
  525. package/dist/editor/ui/TemplateSelectorDialog.js +4 -4
  526. package/dist/editor/ui/TemplateSelectorDialog.js.map +1 -1
  527. package/dist/editor/ui/TreeListSelector.d.ts +1 -6
  528. package/dist/editor/ui/TreeListSelector.js +2 -2
  529. package/dist/editor/ui/TreeListSelector.js.map +1 -1
  530. package/dist/editor/utils/keyboardNavigation.d.ts +20 -6
  531. package/dist/editor/utils/keyboardNavigation.js +140 -48
  532. package/dist/editor/utils/keyboardNavigation.js.map +1 -1
  533. package/dist/editor/utils.js +9 -19
  534. package/dist/editor/utils.js.map +1 -1
  535. package/dist/editor/views/CompareView.d.ts +1 -3
  536. package/dist/editor/views/CompareView.js +5 -7
  537. package/dist/editor/views/CompareView.js.map +1 -1
  538. package/dist/editor/views/EditView.js +1 -1
  539. package/dist/editor/views/EditView.js.map +1 -1
  540. package/dist/editor/views/EditorSlot.js +34 -27
  541. package/dist/editor/views/EditorSlot.js.map +1 -1
  542. package/dist/editor/views/ItemEditor.js +3 -7
  543. package/dist/editor/views/ItemEditor.js.map +1 -1
  544. package/dist/editor/views/MediaFolderEditView.js +1 -1
  545. package/dist/editor/views/MediaFolderEditView.js.map +1 -1
  546. package/dist/editor/views/ParheliaView.js +6 -5
  547. package/dist/editor/views/ParheliaView.js.map +1 -1
  548. package/dist/editor/views/SingleEditView.d.ts +1 -2
  549. package/dist/editor/views/SingleEditView.js +8 -10
  550. package/dist/editor/views/SingleEditView.js.map +1 -1
  551. package/dist/editor/views/editorSlotContext.js +6 -35
  552. package/dist/editor/views/editorSlotContext.js.map +1 -1
  553. package/dist/index.d.ts +2 -16
  554. package/dist/index.js +0 -11
  555. package/dist/index.js.map +1 -1
  556. package/dist/revision.d.ts +2 -2
  557. package/dist/revision.js +2 -2
  558. package/dist/setup/services/setupWizardService.d.ts +14 -48
  559. package/dist/setup/services/setupWizardService.js +17 -52
  560. package/dist/setup/services/setupWizardService.js.map +1 -1
  561. package/dist/setup/wizard/steps/AddModelDialog.js +3 -12
  562. package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -1
  563. package/dist/setup/wizard/steps/ImportModelDialog.js +22 -46
  564. package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
  565. package/dist/splash-screen/ModernSplashScreen.js +32 -112
  566. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  567. package/dist/splash-screen/NewPage.js +50 -33
  568. package/dist/splash-screen/NewPage.js.map +1 -1
  569. package/dist/splash-screen/OpenPage.js +6 -2
  570. package/dist/splash-screen/OpenPage.js.map +1 -1
  571. package/dist/splash-screen/ParheliaAssistantChat.js +29 -12
  572. package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
  573. package/dist/splash-screen/ParheliaLogo.js +37 -87
  574. package/dist/splash-screen/ParheliaLogo.js.map +1 -1
  575. package/dist/splash-screen/RecentPages.js +3 -3
  576. package/dist/splash-screen/RecentPages.js.map +1 -1
  577. package/dist/tour/Tour.d.ts +1 -2
  578. package/dist/tour/Tour.js +75 -256
  579. package/dist/tour/Tour.js.map +1 -1
  580. package/dist/tour/default-tour.js +96 -222
  581. package/dist/tour/default-tour.js.map +1 -1
  582. package/dist/types.d.ts +29 -70
  583. package/package.json +15 -19
  584. package/styles.css +10 -39
@@ -1,189 +1,62 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useState, useEffect, useMemo, useCallback } from "react";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect, useMemo } from "react";
3
3
  import { Button } from "../../../components/ui/button";
4
- import { Input } from "../../../components/ui/input";
5
- import { Select } from "../../../components/ui/select";
6
- import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "../../../components/ui/dialog";
7
4
  import { setupWizardService, } from "../../../setup/services/setupWizardService";
8
- import { AlertCircle, RefreshCw, Upload, Plus, ArrowRight, Brain, Image, Settings, Cloud, Trash2, Copy, } from "lucide-react";
9
- import { useSearchParams } from "../../client/navigation";
5
+ import { CheckCircle, AlertCircle, RefreshCw, Upload, Plus, ArrowRight, Settings, Cloud, Trash2, } from "lucide-react";
10
6
  import { AddModelDialog } from "../../../setup/wizard/steps/AddModelDialog";
11
7
  import { ImportModelDialog } from "../../../setup/wizard/steps/ImportModelDialog";
12
8
  import { Splitter } from "../../ui/Splitter";
13
- import { ModelConfigPanel } from "./ModelConfigPanel";
9
+ import { ItemConfigPanel } from "./ItemConfigPanel";
14
10
  import { useEditContext } from "../../client/editContext";
15
11
  import { FilterInput } from "../../../components/FilterInput";
16
- const SELECTED_MODEL_QUERY_PARAM = "modelId";
17
- /**
18
- * True when a numeric price is present (including 0). Used for display and
19
- * "missing pricing" detection.
20
- */
21
- const hasDefinedPricingValue = (value) => value !== undefined && value !== null;
22
- const hasUsableImagePricing = (model) => hasDefinedPricingValue(model.pricing?.inputTextTokenCostPerMillion) ||
23
- hasDefinedPricingValue(model.pricing?.inputImageTokenCostPerMillion) ||
24
- hasDefinedPricingValue(model.pricing?.outputImageTokenCostPerMillion);
25
- /**
26
- * True when the model row has nothing to show on the pricing line (no usable
27
- * token/image figures). This is the same condition used to decide whether to
28
- * show the warning — avoids blank rows when field-level "missing" logic drifts.
29
- */
30
- const isPricingLineEmpty = (model) => !hasVisiblePricingSummary(model);
31
- const getPricingWarningMessage = (model) => {
32
- const template = model.templateType || "Ai Chat Model";
33
- if (template === "Ai Image Model") {
34
- return "Pricing information is missing. Configure at least one image pricing field.";
35
- }
36
- if (template === "Ai Embeddings Model") {
37
- return "Pricing information is missing. Set Input Cost Per Million Tokens.";
38
- }
39
- const missingFields = [];
40
- if (!hasDefinedPricingValue(model.pricing?.inputCostPerMillionTokens)) {
41
- missingFields.push("Input Cost Per Million Tokens");
42
- }
43
- if (!hasDefinedPricingValue(model.pricing?.outputCostPerMillionTokens)) {
44
- missingFields.push("Output Cost Per Million Tokens");
45
- }
46
- if (missingFields.length === 0) {
47
- return "Pricing information is missing.";
48
- }
49
- return `Pricing information is missing. Set ${missingFields.join(" and ")}.`;
50
- };
51
- const hasVisiblePricingSummary = (model) => {
52
- if (!model.pricing) {
53
- return false;
54
- }
55
- if (model.templateType === "Ai Image Model") {
56
- return hasUsableImagePricing(model);
57
- }
58
- return (hasDefinedPricingValue(model.pricing.inputCostPerMillionTokens) ||
59
- hasDefinedPricingValue(model.pricing.outputCostPerMillionTokens) ||
60
- hasDefinedPricingValue(model.pricing.cachedInputCostPerMillionTokens));
61
- };
62
- /** Sitecore item name for lists and dialogs; falls back to API model id / key. */
63
- function getModelListLabel(model) {
64
- return model.itemName?.trim() || model.name || model.key || "";
65
- }
66
- function normalizeModelId(id) {
67
- return (id || "").replace(/[{}]/g, "").toLowerCase();
68
- }
69
- function getModelTypeLabel(templateType) {
70
- switch (templateType) {
71
- case "Ai Chat Model":
72
- return "Chat";
73
- case "Ai Embeddings Model":
74
- return "Embeddings";
75
- case "Ai Image Model":
76
- return "Image";
77
- default:
78
- return templateType;
79
- }
80
- }
81
12
  /**
82
13
  * Settings panel for AI Models configuration.
83
14
  * Install and configure AI models for chat and other tasks.
84
15
  */
85
16
  export function ModelsPanel() {
86
17
  const editContext = useEditContext();
87
- const searchParams = useSearchParams();
88
18
  const [state, setState] = useState("loading");
89
19
  const [installedModels, setInstalledModels] = useState([]);
90
20
  const [providers, setProviders] = useState([]);
91
- const [settingsExists, setSettingsExists] = useState(false);
92
- const [defaultChatModelId, setDefaultChatModelId] = useState("");
93
- const [defaultImageModelId, setDefaultImageModelId] = useState("");
94
- const [savingDefaults, setSavingDefaults] = useState(false);
95
21
  const [error, setError] = useState(null);
96
22
  const [updating, setUpdating] = useState(null);
97
23
  // Dialog states
98
24
  const [showAddDialog, setShowAddDialog] = useState(false);
99
25
  const [showImportDialog, setShowImportDialog] = useState(false);
100
- // URL-synced model selection
101
- const [urlSelectedModelId, setUrlSelectedModelId] = useState(searchParams.get(SELECTED_MODEL_QUERY_PARAM) ||
102
- (typeof window !== "undefined"
103
- ? new URLSearchParams(window.location.search).get(SELECTED_MODEL_QUERY_PARAM)
104
- : null));
26
+ // Sidebar editor state
105
27
  const [selectedModel, setSelectedModel] = useState(null);
106
28
  // Bulk pricing update state
107
29
  const [updatingAllPricing, setUpdatingAllPricing] = useState(false);
30
+ const [updatingModelPricing, setUpdatingModelPricing] = useState(null);
108
31
  // Delete state
109
32
  const [deleting, setDeleting] = useState(null);
110
- // Duplicate state
111
- const [duplicatingId, setDuplicatingId] = useState(null);
112
- const [duplicateDialogModel, setDuplicateDialogModel] = useState(null);
113
- const [duplicateItemName, setDuplicateItemName] = useState("");
114
33
  // Provider types (discovered from backend)
115
34
  const [providerTypes, setProviderTypes] = useState([]);
116
35
  // Filter state
117
36
  const [filterText, setFilterText] = useState("");
118
- useEffect(() => {
119
- const key = searchParams.get(SELECTED_MODEL_QUERY_PARAM) ||
120
- (typeof window !== "undefined"
121
- ? new URLSearchParams(window.location.search).get(SELECTED_MODEL_QUERY_PARAM)
122
- : null);
123
- setUrlSelectedModelId(key);
124
- }, [searchParams]);
125
- useEffect(() => {
126
- if (typeof window === "undefined")
127
- return;
128
- const handlePopState = () => {
129
- setUrlSelectedModelId(new URLSearchParams(window.location.search).get(SELECTED_MODEL_QUERY_PARAM));
130
- };
131
- window.addEventListener("popstate", handlePopState);
132
- return () => window.removeEventListener("popstate", handlePopState);
133
- }, []);
134
- useEffect(() => {
135
- if (!urlSelectedModelId) {
136
- if (selectedModel)
137
- setSelectedModel(null);
138
- return;
139
- }
140
- const match = installedModels.find((m) => m.id === urlSelectedModelId);
141
- if (match && match !== selectedModel) {
142
- setSelectedModel(match);
143
- }
144
- }, [installedModels, urlSelectedModelId, selectedModel]);
145
- const updateSelectedModelUrl = useCallback((modelId) => {
146
- editContext?.updateUrl({
147
- [SELECTED_MODEL_QUERY_PARAM]: modelId || undefined,
148
- });
149
- setUrlSelectedModelId(modelId || null);
150
- }, [editContext]);
151
37
  const handleOpenConfig = (model) => {
152
38
  setSelectedModel(model);
153
- updateSelectedModelUrl(model.id);
154
39
  };
155
40
  const handleCloseConfig = () => {
156
41
  setSelectedModel(null);
157
- updateSelectedModelUrl(null);
158
42
  };
159
43
  const loadData = async () => {
160
44
  try {
161
45
  setState("loading");
162
46
  setError(null);
163
- const [installed, providersData, providerTypesData, defaultModels, hasSettings,] = await Promise.all([
47
+ const [installed, providersData, providerTypesData] = await Promise.all([
164
48
  setupWizardService.getInstalledModels(),
165
49
  setupWizardService.getProviders(),
166
50
  setupWizardService.getProviderTypes(),
167
- setupWizardService.getDefaultModels(),
168
- setupWizardService.getSettingsExists(),
169
51
  ]);
170
52
  setInstalledModels(installed);
171
53
  setProviders(providersData);
172
54
  setProviderTypes(providerTypesData);
173
- setSettingsExists(hasSettings);
174
- const resolvedChatModel = installed.find((model) => normalizeModelId(model.id) ===
175
- normalizeModelId(defaultModels.chatModelId));
176
- const resolvedImageModel = installed.find((model) => normalizeModelId(model.id) ===
177
- normalizeModelId(defaultModels.imageModelId));
178
- setDefaultChatModelId(resolvedChatModel?.id || defaultModels.chatModelId || "");
179
- setDefaultImageModelId(resolvedImageModel?.id || defaultModels.imageModelId || "");
180
55
  setState("success");
181
- return installed;
182
56
  }
183
57
  catch (e) {
184
58
  setState("error");
185
59
  setError(e?.message || "Failed to load models");
186
- return undefined;
187
60
  }
188
61
  };
189
62
  // Get providers that support model import (any provider with a registered provider type)
@@ -247,131 +120,88 @@ export function ModelsPanel() {
247
120
  setUpdatingAllPricing(false);
248
121
  }
249
122
  };
250
- const handleUpdate = async (model) => {
251
- if (!model.id || !model.key)
123
+ // Update pricing for a single model
124
+ const handleUpdateSingleModelPricing = async (model) => {
125
+ if (!model.providerId || !model.name) {
126
+ setError("Model provider or name is missing");
252
127
  return;
128
+ }
253
129
  try {
254
- setUpdating(model.id);
130
+ setUpdatingModelPricing(model.id);
255
131
  setError(null);
256
- await setupWizardService.updateModel({
257
- modelId: model.id,
258
- sourceModelKey: model.key,
132
+ const result = await setupWizardService.upsertProviderModels({
133
+ providerId: model.providerId,
134
+ selectedModelIds: [model.name],
135
+ mode: "updatePricing",
259
136
  });
260
137
  await loadData();
138
+ if (result.errors.length > 0) {
139
+ setError(`Errors: ${result.errors.join(", ")}`);
140
+ }
261
141
  }
262
142
  catch (e) {
263
- setError(e?.message || "Failed to update model");
143
+ setError(e?.message || "Failed to update pricing");
264
144
  }
265
145
  finally {
266
- setUpdating(null);
146
+ setUpdatingModelPricing(null);
267
147
  }
268
148
  };
269
- const handleDefaultModelsChange = async (nextChatModelId, nextImageModelId) => {
270
- if (!settingsExists) {
271
- setError("Parhelia settings item not found");
149
+ const handleUpdate = async (model) => {
150
+ if (!model.id || !model.key)
272
151
  return;
273
- }
274
- const previousChatModelId = defaultChatModelId;
275
- const previousImageModelId = defaultImageModelId;
276
- setDefaultChatModelId(nextChatModelId);
277
- setDefaultImageModelId(nextImageModelId);
278
152
  try {
279
- setSavingDefaults(true);
153
+ setUpdating(model.id);
280
154
  setError(null);
281
- await setupWizardService.setDefaultModels({
282
- chatModelId: nextChatModelId,
283
- imageModelId: nextImageModelId,
155
+ await setupWizardService.updateModel({
156
+ modelId: model.id,
157
+ sourceModelKey: model.key,
284
158
  });
159
+ await loadData();
285
160
  }
286
161
  catch (e) {
287
- setDefaultChatModelId(previousChatModelId);
288
- setDefaultImageModelId(previousImageModelId);
289
- setError(e?.message || "Failed to save default models");
162
+ setError(e?.message || "Failed to update model");
290
163
  }
291
164
  finally {
292
- setSavingDefaults(false);
165
+ setUpdating(null);
293
166
  }
294
167
  };
295
- const handleDelete = async (model) => {
168
+ const handleDelete = (model) => {
296
169
  if (!editContext || !model.id)
297
170
  return;
298
- try {
299
- setDeleting(model.id);
300
- setError(null);
301
- const deleted = await editContext.operations.deleteItems([
302
- {
303
- id: model.id,
304
- language: editContext.item?.language ??
305
- editContext.currentItemDescriptor?.language ??
306
- "en",
307
- version: 0,
308
- },
309
- ]);
310
- if (deleted) {
311
- if (selectedModel?.id === model.id) {
312
- setSelectedModel(null);
313
- updateSelectedModelUrl(null);
171
+ editContext.confirm({
172
+ header: "Delete Model",
173
+ message: `Are you sure you want to delete "${model.name || model.key}"?`,
174
+ acceptLabel: "Delete",
175
+ showCancel: true,
176
+ accept: async () => {
177
+ try {
178
+ setDeleting(model.id);
179
+ setError(null);
180
+ // If this model is currently selected, close the config panel
181
+ if (selectedModel?.id === model.id) {
182
+ setSelectedModel(null);
183
+ }
184
+ // Delete the model item
185
+ await editContext.operations.deleteItems([
186
+ {
187
+ id: model.id,
188
+ language: editContext.item?.language ??
189
+ editContext.currentItemDescriptor?.language ??
190
+ "en",
191
+ version: 0,
192
+ },
193
+ ]);
194
+ // Reload the models list
195
+ await loadData();
314
196
  }
315
- await loadData();
316
- }
317
- }
318
- catch (e) {
319
- setError(e?.message || "Failed to delete model");
320
- }
321
- finally {
322
- setDeleting(null);
323
- }
324
- };
325
- const openDuplicateDialog = (model) => {
326
- const segment = model.itemName?.trim() ||
327
- (model.key.includes("/") && model.key.split("/").length > 0
328
- ? model.key.split("/").pop()
329
- : model.name || model.key);
330
- setDuplicateItemName(`Copy of ${segment}`);
331
- setDuplicateDialogModel(model);
332
- };
333
- const handleConfirmDuplicate = async () => {
334
- if (!editContext || !duplicateDialogModel?.id) {
335
- return;
336
- }
337
- const parentId = duplicateDialogModel.parentId;
338
- if (!parentId) {
339
- return;
340
- }
341
- const name = duplicateItemName.trim();
342
- if (!name) {
343
- setError("Enter a name for the duplicate item");
344
- return;
345
- }
346
- const model = duplicateDialogModel;
347
- const lang = editContext.item?.language ??
348
- editContext.currentItemDescriptor?.language ??
349
- "en";
350
- try {
351
- setDuplicatingId(model.id);
352
- setError(null);
353
- const created = await editContext.operations.duplicateItem({ id: model.id, language: lang, version: 0 }, { id: parentId, language: lang, version: 0 }, name);
354
- if (!created) {
355
- setDuplicatingId(null);
356
- return;
357
- }
358
- setDuplicateDialogModel(null);
359
- const list = await loadData();
360
- if (list) {
361
- const createdId = String(created.id).replace(/[{}]/g, "").toLowerCase();
362
- const next = list.find((m) => m.id.replace(/[{}]/g, "").toLowerCase() === createdId);
363
- if (next) {
364
- setSelectedModel(next);
365
- updateSelectedModelUrl(next.id);
197
+ catch (e) {
198
+ setError(e?.message || "Failed to delete model");
366
199
  }
367
- }
368
- }
369
- catch (e) {
370
- setError(e?.message || "Failed to duplicate model");
371
- }
372
- finally {
373
- setDuplicatingId(null);
374
- }
200
+ finally {
201
+ setDeleting(null);
202
+ }
203
+ },
204
+ });
375
205
  };
376
206
  useEffect(() => {
377
207
  loadData();
@@ -381,50 +211,25 @@ export function ModelsPanel() {
381
211
  window.location.hash = "#providers";
382
212
  }
383
213
  };
384
- const chatModels = useMemo(() => installedModels
385
- .filter((model) => model.templateType === "Ai Chat Model")
386
- .sort((a, b) => getModelListLabel(a).localeCompare(getModelListLabel(b))), [installedModels]);
387
- const imageModels = useMemo(() => installedModels
388
- .filter((model) => model.templateType === "Ai Image Model")
389
- .sort((a, b) => getModelListLabel(a).localeCompare(getModelListLabel(b))), [installedModels]);
390
- const chatDefaultConfiguredModel = useMemo(() => chatModels.find((model) => normalizeModelId(model.id) === normalizeModelId(defaultChatModelId)), [chatModels, defaultChatModelId]);
391
- const imageDefaultConfiguredModel = useMemo(() => imageModels.find((model) => normalizeModelId(model.id) === normalizeModelId(defaultImageModelId)), [imageModels, defaultImageModelId]);
392
- const chatModelOptions = useMemo(() => {
393
- const options = [
394
- { value: "", label: "Not set" },
395
- ...chatModels.map((model) => ({
396
- value: model.id,
397
- label: getModelListLabel(model),
398
- description: model.providerName || undefined,
399
- })),
400
- ];
401
- if (defaultChatModelId && !chatDefaultConfiguredModel) {
402
- options.push({
403
- value: defaultChatModelId,
404
- label: "Configured model not found",
405
- description: defaultChatModelId,
406
- });
407
- }
408
- return options;
409
- }, [chatModels, defaultChatModelId, chatDefaultConfiguredModel]);
410
- const imageModelOptions = useMemo(() => {
411
- const options = [
412
- { value: "", label: "Not set" },
413
- ...imageModels.map((model) => ({
414
- value: model.id,
415
- label: getModelListLabel(model),
416
- description: model.providerName || undefined,
417
- })),
418
- ];
419
- if (defaultImageModelId && !imageDefaultConfiguredModel) {
420
- options.push({
421
- value: defaultImageModelId,
422
- label: "Configured model not found",
423
- description: defaultImageModelId,
424
- });
214
+ // Check if model uses an importable provider (OpenRouter or Novita)
215
+ const isImportableModel = (model) => {
216
+ if (!model.providerId)
217
+ return false;
218
+ return importableProviders.some((p) => p.id === model.providerId);
219
+ };
220
+ // Helper to get model type display label
221
+ const getModelTypeLabel = (templateType) => {
222
+ switch (templateType) {
223
+ case "Ai Chat Model":
224
+ return "Chat";
225
+ case "Ai Embeddings Model":
226
+ return "Embeddings";
227
+ case "Ai Image Model":
228
+ return "Image";
229
+ default:
230
+ return templateType;
425
231
  }
426
- return options;
427
- }, [imageModels, defaultImageModelId, imageDefaultConfiguredModel]);
232
+ };
428
233
  // Filter models based on filter text
429
234
  const filteredModels = useMemo(() => {
430
235
  if (!filterText.trim()) {
@@ -432,20 +237,18 @@ export function ModelsPanel() {
432
237
  }
433
238
  const searchTerm = filterText.toLowerCase().trim();
434
239
  return installedModels.filter((model) => {
435
- const listLabel = getModelListLabel(model).toLowerCase();
436
240
  const modelName = (model.name || model.key || "").toLowerCase();
437
241
  const providerName = (model.providerName || "").toLowerCase();
438
242
  const templateType = (model.templateType || "").toLowerCase();
439
243
  const modelTypeLabel = getModelTypeLabel(model.templateType || "Ai Chat Model").toLowerCase();
440
- return (listLabel.includes(searchTerm) ||
441
- modelName.includes(searchTerm) ||
244
+ return (modelName.includes(searchTerm) ||
442
245
  providerName.includes(searchTerm) ||
443
246
  templateType.includes(searchTerm) ||
444
247
  modelTypeLabel.includes(searchTerm));
445
248
  });
446
- }, [installedModels, filterText]);
249
+ }, [installedModels, filterText, getModelTypeLabel]);
447
250
  // Group models by provider for display
448
- const groupModelsByProvider = useCallback((models) => {
251
+ const groupModelsByProvider = (models) => {
449
252
  const groups = {};
450
253
  models.forEach((model) => {
451
254
  const providerId = model.providerId || "unknown";
@@ -462,59 +265,42 @@ export function ModelsPanel() {
462
265
  const typeOrder = (a.templateType || "").localeCompare(b.templateType || "");
463
266
  if (typeOrder !== 0)
464
267
  return typeOrder;
465
- return getModelListLabel(a).localeCompare(getModelListLabel(b));
268
+ return (a.name || a.key || "").localeCompare(b.name || b.key || "");
466
269
  });
467
270
  });
468
271
  return groups;
469
- }, [providers]);
470
- const modelsByProvider = useMemo(() => groupModelsByProvider(filteredModels), [filteredModels, groupModelsByProvider]);
471
- const modelsMissingPricing = useMemo(() => {
472
- return installedModels.filter((model) => isPricingLineEmpty(model));
473
- }, [installedModels]);
272
+ };
273
+ const modelsByProvider = useMemo(() => groupModelsByProvider(filteredModels), [filteredModels, providers]);
274
+ const statusIcon = (currentState) => {
275
+ if (currentState === "success")
276
+ return _jsx(CheckCircle, { className: "h-4 w-4 text-green-600", strokeWidth: 1 });
277
+ if (currentState === "error")
278
+ return _jsx(AlertCircle, { className: "h-4 w-4 text-red-600", strokeWidth: 1 });
279
+ return (_jsx(RefreshCw, { className: "h-4 w-4 animate-spin text-amber-600", strokeWidth: 1 }));
280
+ };
474
281
  // Build the models list content
475
- const modelsListContent = (_jsx("div", { className: "flex h-full flex-col p-4", children: _jsx("div", { className: "mx-auto flex w-full flex-1 flex-col overflow-hidden", children: _jsxs("div", { className: "flex h-full flex-col overflow-hidden", children: [_jsxs("div", { className: "mt-1 shrink-0", children: [_jsxs("div", { className: "mb-2 rounded-t-lg bg-white p-4", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-sm font-semibold text-gray-900", children: "Default models" }), _jsx("p", { className: "mt-1 text-xs text-gray-500", children: "Choose the shared defaults used when a chat or image model is not configured elsewhere." })] }), savingDefaults && (_jsxs("div", { className: "flex items-center gap-2 text-xs text-gray-500", children: [_jsx(RefreshCw, { className: "h-3.5 w-3.5 animate-spin" }), "Saving..."] }))] }), _jsxs("div", { className: "mt-4 grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "flex items-center gap-2 text-sm font-medium text-gray-700", children: [_jsx(Brain, { className: "h-4 w-4 text-purple-600", strokeWidth: 1.5 }), "Default chat model"] }), _jsx(Select, { value: defaultChatModelId, onValueChange: (value) => void handleDefaultModelsChange(value, defaultImageModelId), options: chatModelOptions, placeholder: "Select a chat model", disabled: savingDefaults || !settingsExists, searchable: true, searchPlaceholder: "Search chat models..." }), _jsx("p", { className: "text-xs text-gray-500", children: "Used by features that fall back to the settings-level chat model." })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "flex items-center gap-2 text-sm font-medium text-gray-700", children: [_jsx(Image, { className: "h-4 w-4 text-green-600", strokeWidth: 1.5 }), "Default image model"] }), _jsx(Select, { value: defaultImageModelId, onValueChange: (value) => void handleDefaultModelsChange(defaultChatModelId, value), options: imageModelOptions, placeholder: "Select an image model", disabled: savingDefaults || !settingsExists, searchable: true, searchPlaceholder: "Search image models..." }), _jsx("p", { className: "text-xs text-gray-500", children: "Used by image generation and editing features that rely on the shared default." })] })] }), !settingsExists && (_jsx("div", { className: "mt-4 rounded border border-yellow-200 bg-yellow-50 p-3 text-xs text-yellow-800", children: "Create the Parhelia settings item before saving default models." }))] }), _jsx("div", { className: "rounded-t-lg bg-white p-4", children: _jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsxs("h2", { className: "text-sm font-semibold text-gray-900", children: ["Installed models (", installedModels.length, ")"] }), _jsx("p", { className: "mt-1 text-xs text-gray-500", children: "Browse, filter, and configure the models available in Parhelia." }), modelsMissingPricing.length > 0 && (_jsxs("div", { className: "mt-3 rounded border border-yellow-200 bg-yellow-50 p-3 text-xs text-yellow-800", children: [modelsMissingPricing.length, " installed model", modelsMissingPricing.length !== 1
476
- ? "s have"
477
- : " has", " ", "missing or incomplete pricing information. A warning is shown on each affected model below."] }))] }), _jsx("div", { className: "flex flex-wrap items-center gap-3", children: importableInstalledModels.length > 0 && (_jsxs(Button, { size: "sm", variant: "outline", onClick: handleUpdateAllPricing, disabled: updatingAllPricing, title: "Update pricing for all models from their provider APIs", children: [updatingAllPricing ? (_jsx(RefreshCw, { className: "mr-1 h-4 w-4 animate-spin" })) : (_jsx(RefreshCw, { className: "mr-1 h-4 w-4" })), "Update All Pricing"] })) })] }) }), _jsxs("div", { className: "bg-white px-4", children: [state !== "loading" && providers.length === 0 && (_jsx("div", { className: "rounded border border-yellow-200 bg-yellow-50 p-4", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx(AlertCircle, { className: "mt-0.5 h-5 w-5 shrink-0 text-yellow-600" }), _jsxs("div", { className: "flex-1", children: [_jsx("p", { className: "mb-1 text-sm font-medium text-yellow-800", children: "No providers configured" }), _jsx("p", { className: "mb-3 text-xs text-yellow-700", children: "You need to configure at least one provider before you can add models." }), _jsxs(Button, { size: "sm", variant: "outline", onClick: handleNavigateToProviders, className: "text-xs", children: ["Go to Providers", _jsx(ArrowRight, { className: "ml-1 h-3 w-3" })] })] })] }) })), providers.length > 0 && (_jsxs("div", { className: "mb-4 flex gap-2", children: [importableProviders.length > 0 && (_jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
478
- setShowImportDialog(true);
479
- setError(null);
480
- }, children: [_jsx(Cloud, { strokeWidth: 1, className: "mr-1 h-4 w-4" }), "Import from Provider"] })), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
481
- setShowAddDialog(true);
482
- setError(null);
483
- }, children: [_jsx(Plus, { strokeWidth: 1, className: "mr-1 h-4 w-4" }), "Add Manually"] })] })), error && (_jsx("div", { className: "rounded border border-red-200 bg-red-50 p-2 text-xs whitespace-pre-wrap text-red-700", children: error })), _jsx(FilterInput, { value: filterText, onChange: setFilterText, placeholder: "Filter models by name, provider, or type...", className: "mb-4 w-full" })] })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto rounded-b-lg bg-white px-4 pb-4", children: filterText && filteredModels.length === 0 ? (_jsxs("div", { className: "flex items-center justify-center py-8 text-sm text-gray-500", children: ["No models found matching ", `"${filterText}"`] })) : (_jsx("div", { className: "space-y-4", children: Object.entries(modelsByProvider).map(([providerId, { providerName, models }]) => {
282
+ const modelsListContent = (_jsx("div", { className: "flex h-full flex-col p-4", children: _jsx("div", { className: "mx-auto flex w-full flex-1 flex-col overflow-hidden", children: _jsxs("div", { className: "flex h-full flex-col overflow-hidden", children: [_jsxs("div", { className: "shrink-0 space-y-4 pb-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [statusIcon(state), _jsxs("span", { className: "text-sm text-gray-700", children: [installedModels.length, " model", installedModels.length !== 1 ? "s" : "", " installed"] })] }), importableInstalledModels.length > 0 && (_jsxs(Button, { size: "sm", variant: "outline", onClick: handleUpdateAllPricing, disabled: updatingAllPricing, title: "Update pricing for all models from their provider APIs", children: [updatingAllPricing ? (_jsx(RefreshCw, { className: "mr-1 h-4 w-4 animate-spin" })) : (_jsx(RefreshCw, { className: "mr-1 h-4 w-4" })), "Update All Pricing"] }))] }), state !== "loading" && providers.length === 0 && (_jsx("div", { className: "rounded border border-yellow-200 bg-yellow-50 p-4", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx(AlertCircle, { className: "mt-0.5 h-5 w-5 shrink-0 text-yellow-600" }), _jsxs("div", { className: "flex-1", children: [_jsx("p", { className: "mb-1 text-sm font-medium text-yellow-800", children: "No providers configured" }), _jsx("p", { className: "mb-3 text-xs text-yellow-700", children: "You need to configure at least one provider before you can add models." }), _jsxs(Button, { size: "sm", variant: "outline", onClick: handleNavigateToProviders, className: "text-xs", children: ["Go to Providers", _jsx(ArrowRight, { className: "ml-1 h-3 w-3" })] })] })] }) })), providers.length > 0 && (_jsxs("div", { className: "flex gap-2", children: [importableProviders.length > 0 && (_jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
283
+ setShowImportDialog(true);
284
+ setError(null);
285
+ }, children: [_jsx(Cloud, { strokeWidth: 1, className: "mr-1 h-4 w-4" }), "Import from Provider"] })), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => {
286
+ setShowAddDialog(true);
287
+ setError(null);
288
+ }, children: [_jsx(Plus, { strokeWidth: 1, className: "mr-1 h-4 w-4" }), "Add Manually"] })] })), error && (_jsx("div", { className: "rounded border border-red-200 bg-red-50 p-2 text-xs whitespace-pre-wrap text-red-700", children: error })), _jsx(FilterInput, { value: filterText, onChange: setFilterText, placeholder: "Filter models by name, provider, or type...", className: "w-full" })] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: filterText && filteredModels.length === 0 ? (_jsxs("div", { className: "flex items-center justify-center py-8 text-sm text-gray-500", children: ["No models found matching \"", filterText, "\""] })) : (_jsx("div", { className: "space-y-4", children: Object.entries(modelsByProvider).map(([providerId, { providerName, models }]) => {
484
289
  if (models.length === 0)
485
290
  return null;
486
291
  return (_jsxs("div", { className: "space-y-2", children: [_jsxs("label", { className: "block text-sm font-medium text-gray-700", children: [providerName, _jsxs("span", { className: "ml-2 text-xs font-normal text-gray-500", children: ["(", models.length, " model", models.length !== 1 ? "s" : "", ")"] })] }), _jsx("div", { className: "space-y-2", children: models.map((model) => {
487
292
  const status = model.status;
488
293
  const isSelected = selectedModel?.id === model.id;
489
- const showPricingLine = hasVisiblePricingSummary(model);
490
294
  return (_jsxs("div", { className: `flex flex-wrap items-center gap-2 rounded border p-3 text-sm transition-shadow hover:shadow-sm ${isSelected
491
295
  ? "border-blue-400 bg-blue-50"
492
- : "border-gray-200 bg-white"}`, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "truncate font-medium", children: getModelListLabel(model) }), _jsx("span", { className: "shrink-0 rounded bg-gray-100 px-1.5 py-0.5 text-xs text-gray-600", children: getModelTypeLabel(model.templateType || "Ai Chat Model") }), normalizeModelId(model.id) ===
493
- normalizeModelId(defaultChatModelId) && (_jsx("span", { className: "shrink-0 rounded bg-purple-100 px-1.5 py-0.5 text-xs text-purple-700", children: "Default chat" })), normalizeModelId(model.id) ===
494
- normalizeModelId(defaultImageModelId) && (_jsx("span", { className: "shrink-0 rounded bg-green-100 px-1.5 py-0.5 text-xs text-green-700", children: "Default image" })), status === "Outdated" && (_jsx("span", { className: "shrink-0 rounded bg-amber-100 px-1.5 py-0.5 text-xs text-amber-700", children: "Update available" })), !showPricingLine && (_jsx("span", { className: "shrink-0 rounded bg-yellow-100 px-1.5 py-0.5 text-xs text-yellow-800", children: "Pricing missing" }))] }), showPricingLine && model.pricing ? (_jsx("div", { className: "mt-1 text-xs text-gray-500", children: model.templateType ===
495
- "Ai Image Model" &&
496
- hasUsableImagePricing(model) ? (_jsxs(_Fragment, { children: [hasDefinedPricingValue(model.pricing.inputTextTokenCostPerMillion) && (_jsxs("span", { children: ["Input Text: $", model.pricing.inputTextTokenCostPerMillion.toFixed(2), "/M"] })), hasDefinedPricingValue(model.pricing.inputImageTokenCostPerMillion) && (_jsxs("span", { className: "ml-2", children: ["Input Image: $", model.pricing.inputImageTokenCostPerMillion.toFixed(2), "/M"] })), hasDefinedPricingValue(model.pricing.outputImageTokenCostPerMillion) && (_jsxs("span", { className: "ml-2", children: ["Output Image: $", model.pricing.outputImageTokenCostPerMillion.toFixed(2), "/M"] }))] })) : (_jsxs(_Fragment, { children: [hasDefinedPricingValue(model.pricing
497
- .inputCostPerMillionTokens) && (_jsxs("span", { children: ["Input: $", model.pricing.inputCostPerMillionTokens.toFixed(2), "/M"] })), hasDefinedPricingValue(model.pricing
498
- .outputCostPerMillionTokens) && (_jsxs("span", { className: "ml-2", children: ["Output: $", model.pricing.outputCostPerMillionTokens.toFixed(2), "/M"] })), hasDefinedPricingValue(model.pricing
499
- .cachedInputCostPerMillionTokens) && (_jsxs("span", { className: "ml-2", children: ["Cached: $", model.pricing.cachedInputCostPerMillionTokens.toFixed(2), "/M"] }))] })) })) : (_jsxs("div", { className: "mt-1 flex items-start gap-2 rounded border border-yellow-200 bg-yellow-50 px-2 py-1.5 text-xs text-yellow-800", children: [_jsx(AlertCircle, { className: "mt-0.5 h-3.5 w-3.5 shrink-0" }), _jsx("span", { children: getPricingWarningMessage(model) })] })), (model.maxContextWindowTokens ||
296
+ : "border-gray-200 bg-white"}`, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "truncate font-medium", children: model.name || model.key }), _jsx("span", { className: "shrink-0 rounded bg-gray-100 px-1.5 py-0.5 text-xs text-gray-600", children: getModelTypeLabel(model.templateType || "Ai Chat Model") }), status === "Outdated" && (_jsx("span", { className: "shrink-0 rounded bg-amber-100 px-1.5 py-0.5 text-xs text-amber-700", children: "Update available" }))] }), model.pricing && (_jsxs("div", { className: "mt-1 text-xs text-gray-500", children: ["Input: $", model.pricing.inputCostPerMillionTokens?.toFixed(2) || "0.00", "/M, Output: $", model.pricing.outputCostPerMillionTokens?.toFixed(2) || "0.00", "/M", model.pricing
297
+ .cachedInputCostPerMillionTokens && (_jsxs("span", { className: "ml-2", children: ["Cached: $", model.pricing.cachedInputCostPerMillionTokens.toFixed(2), "/M"] }))] })), (model.maxContextWindowTokens ||
500
298
  model.maxResponseTokens) && (_jsxs("div", { className: "mt-1 text-xs text-gray-500", children: [model.maxContextWindowTokens && (_jsxs("span", { children: ["Context:", " ", model.maxContextWindowTokens.toLocaleString(), " ", "tokens"] })), model.maxContextWindowTokens &&
501
299
  model.maxResponseTokens &&
502
- " • ", model.maxResponseTokens && (_jsxs("span", { children: ["Max Response:", " ", model.maxResponseTokens.toLocaleString(), " ", "tokens"] }))] }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [status === "Outdated" && (_jsxs(Button, { size: "sm", variant: "outline", onClick: () => handleUpdate(model), disabled: updating === model.id, title: "Update model", children: [updating === model.id ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3 w-3 animate-spin" })) : (_jsx(Upload, { strokeWidth: 1, className: "h-3 w-3" })), _jsx("span", { className: "ml-1 hidden sm:inline", children: "Update" })] })), _jsxs(Button, { size: "sm", variant: isSelected ? "default" : "ghost", onClick: () => handleOpenConfig(model), title: "Configure model", children: [_jsx(Settings, { className: "h-4 w-4", strokeWidth: 1.5 }), _jsx("span", { className: "ml-1 hidden sm:inline", children: "Configure" })] }), _jsxs(Button, { size: "sm", variant: "ghost", onClick: () => openDuplicateDialog(model), disabled: !editContext ||
503
- !model.parentId ||
504
- duplicatingId === model.id, title: "Duplicate model", children: [duplicatingId === model.id ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3 w-3 animate-spin" })) : (_jsx(Copy, { strokeWidth: 1, className: "h-3 w-3" })), _jsx("span", { className: "ml-1 hidden sm:inline", children: "Duplicate" })] }), _jsx(Button, { size: "sm", variant: "ghost", onClick: () => handleDelete(model), disabled: deleting === model.id, title: "Delete model", className: "text-red-600 hover:bg-red-50 hover:text-red-700", children: deleting === model.id ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3 w-3 animate-spin" })) : (_jsx(Trash2, { strokeWidth: 1, className: "h-3 w-3" })) })] })] }, model.id));
300
+ " • ", model.maxResponseTokens && (_jsxs("span", { children: ["Max Response:", " ", model.maxResponseTokens.toLocaleString(), " ", "tokens"] }))] }))] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [status === "Outdated" && (_jsxs(Button, { size: "sm", variant: "outline", onClick: () => handleUpdate(model), disabled: updating === model.id, title: "Update model", children: [updating === model.id ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3 w-3 animate-spin" })) : (_jsx(Upload, { strokeWidth: 1, className: "h-3 w-3" })), _jsx("span", { className: "ml-1 hidden sm:inline", children: "Update" })] })), isImportableModel(model) && (_jsx(Button, { size: "sm", variant: "ghost", onClick: () => handleUpdateSingleModelPricing(model), disabled: updatingModelPricing === model.id ||
301
+ updatingAllPricing, title: "Update pricing from provider API", children: updatingModelPricing === model.id ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3 w-3 animate-spin" })) : (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3 w-3" })) })), _jsxs(Button, { size: "sm", variant: isSelected ? "default" : "ghost", onClick: () => handleOpenConfig(model), title: "Configure model", children: [_jsx(Settings, { className: "h-4 w-4", strokeWidth: 1.5 }), _jsx("span", { className: "ml-1 hidden sm:inline", children: "Configure" })] }), _jsx(Button, { size: "sm", variant: "ghost", onClick: () => handleDelete(model), disabled: deleting === model.id, title: "Delete model", className: "text-red-600 hover:bg-red-50 hover:text-red-700", children: deleting === model.id ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-3 w-3 animate-spin" })) : (_jsx(Trash2, { strokeWidth: 1, className: "h-3 w-3" })) })] })] }, model.id));
505
302
  }) })] }, providerId));
506
- }) })) }), _jsx(AddModelDialog, { open: showAddDialog, onOpenChange: setShowAddDialog, onSuccess: loadData, providers: providers, installedModels: installedModels }), _jsx(ImportModelDialog, { open: showImportDialog, onOpenChange: setShowImportDialog, onSuccess: loadData, importableProviders: importableProviders, providerTypes: providerTypes }), _jsx(Dialog, { open: duplicateDialogModel !== null, onOpenChange: (open) => {
507
- if (!open)
508
- setDuplicateDialogModel(null);
509
- }, children: _jsxs(DialogContent, { className: "max-w-md", children: [_jsxs(DialogHeader, { className: "pr-14", children: [_jsx(DialogTitle, { children: "Duplicate model" }), _jsx(DialogDescription, { children: "New Sitecore item name. Field values (including model name and reasoning) are copied; adjust them in Configure after duplicating." })] }), _jsxs("div", { className: "space-y-2 px-8 pb-6", children: [_jsx("label", { htmlFor: "duplicate-model-item-name", className: "block text-sm font-medium text-gray-700", children: "Item name" }), _jsx(Input, { id: "duplicate-model-item-name", value: duplicateItemName, onChange: (e) => setDuplicateItemName(e.target.value), onKeyDown: (e) => {
510
- if (e.key === "Enter") {
511
- e.preventDefault();
512
- void handleConfirmDuplicate();
513
- }
514
- }, autoFocus: true })] }), _jsxs(DialogFooter, { className: "border-t border-gray-100 pt-4", children: [_jsx(Button, { type: "button", variant: "outline", className: "min-h-9 min-w-22", onClick: () => setDuplicateDialogModel(null), children: "Cancel" }), _jsx(Button, { type: "button", className: "min-h-9 min-w-22", onClick: () => void handleConfirmDuplicate(), disabled: !duplicateItemName.trim() ||
515
- (duplicateDialogModel != null &&
516
- duplicatingId === duplicateDialogModel.id), children: duplicateDialogModel != null &&
517
- duplicatingId === duplicateDialogModel.id ? (_jsxs(_Fragment, { children: [_jsx(RefreshCw, { className: "mr-1 h-4 w-4 animate-spin" }), "Duplicating\u2026"] })) : ("Duplicate") })] })] }) })] }) }) }));
303
+ }) })) }), _jsx(AddModelDialog, { open: showAddDialog, onOpenChange: setShowAddDialog, onSuccess: loadData, providers: providers, installedModels: installedModels }), _jsx(ImportModelDialog, { open: showImportDialog, onOpenChange: setShowImportDialog, onSuccess: loadData, importableProviders: importableProviders, providerTypes: providerTypes })] }) }) }));
518
304
  // Build splitter panels - only show config panel when a model is selected
519
305
  const panels = selectedModel?.id
520
306
  ? [
@@ -527,9 +313,7 @@ export function ModelsPanel() {
527
313
  {
528
314
  name: "model-config",
529
315
  defaultSize: 400,
530
- content: (_jsx(ModelConfigPanel, { itemId: selectedModel.id, title: `Configure: ${getModelListLabel(selectedModel) || "Model"}`, onClose: handleCloseConfig, onModelRenamed: async () => {
531
- await loadData();
532
- } }, selectedModel.id)),
316
+ content: (_jsx(ItemConfigPanel, { itemId: selectedModel.id, title: `Configure: ${selectedModel.name || selectedModel.key || "Model"}`, onClose: handleCloseConfig }, selectedModel.id)),
533
317
  className: "overflow-hidden",
534
318
  },
535
319
  ]