@parhelia/core 0.1.12556 → 0.1.12565

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 (587) hide show
  1. package/dist/agents-view/AgentCard.d.ts +6 -4
  2. package/dist/agents-view/AgentCard.js +143 -24
  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 +7 -92
  6. package/dist/agents-view/AgentsInbox.js.map +1 -1
  7. package/dist/agents-view/AgentsTitlebar.js +3 -2
  8. package/dist/agents-view/AgentsTitlebar.js.map +1 -1
  9. package/dist/agents-view/AgentsView.d.ts +6 -7
  10. package/dist/agents-view/AgentsView.js +191 -99
  11. package/dist/agents-view/AgentsView.js.map +1 -1
  12. package/dist/agents-view/AgentsWorkspaceView.d.ts +2 -6
  13. package/dist/agents-view/AgentsWorkspaceView.js +266 -113
  14. package/dist/agents-view/AgentsWorkspaceView.js.map +1 -1
  15. package/dist/agents-view/ProfileAgentsGroup.d.ts +2 -1
  16. package/dist/agents-view/ProfileAgentsGroup.js +4 -3
  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 +2 -4
  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 +6 -10
  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 +4 -1
  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 +12 -4
  37. package/dist/components/ui/context-menu.js.map +1 -1
  38. package/dist/components/ui/copy-button.d.ts +2 -1
  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 +21 -126
  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 +5 -3
  46. package/dist/components/ui/input.js.map +1 -1
  47. package/dist/components/ui/paste-button.d.ts +2 -1
  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 +1 -9
  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 +4 -11
  58. package/dist/components/ui/tabs.js.map +1 -1
  59. package/dist/config/config.d.ts +4 -2
  60. package/dist/config/config.js +250 -70
  61. package/dist/config/config.js.map +1 -1
  62. package/dist/config/notificationRoutes.js +14 -0
  63. package/dist/config/notificationRoutes.js.map +1 -1
  64. package/dist/config/types/workspace.d.ts +6 -0
  65. package/dist/config/types.d.ts +63 -12
  66. package/dist/config/types.js.map +1 -1
  67. package/dist/editor/ConfirmationDialog.js +20 -4
  68. package/dist/editor/ConfirmationDialog.js.map +1 -1
  69. package/dist/editor/ContentTree.d.ts +2 -1
  70. package/dist/editor/ContentTree.js +93 -32
  71. package/dist/editor/ContentTree.js.map +1 -1
  72. package/dist/editor/Editor.js +87 -22
  73. package/dist/editor/Editor.js.map +1 -1
  74. package/dist/editor/FieldHistory.js +84 -36
  75. package/dist/editor/FieldHistory.js.map +1 -1
  76. package/dist/editor/FieldListField.js +21 -9
  77. package/dist/editor/FieldListField.js.map +1 -1
  78. package/dist/editor/FieldListFieldWithFallbacks.js +23 -2
  79. package/dist/editor/FieldListFieldWithFallbacks.js.map +1 -1
  80. package/dist/editor/GlobalMenuBar.js +29 -2
  81. package/dist/editor/GlobalMenuBar.js.map +1 -1
  82. package/dist/editor/ImageEditor.js +5 -2
  83. package/dist/editor/ImageEditor.js.map +1 -1
  84. package/dist/editor/ItemInfo.js +36 -1
  85. package/dist/editor/ItemInfo.js.map +1 -1
  86. package/dist/editor/LinkEditorDialog.js +3 -0
  87. package/dist/editor/LinkEditorDialog.js.map +1 -1
  88. package/dist/editor/MainLayout.d.ts +0 -2
  89. package/dist/editor/MainLayout.js +65 -8
  90. package/dist/editor/MainLayout.js.map +1 -1
  91. package/dist/editor/MigrationsView.js +29 -5
  92. package/dist/editor/MigrationsView.js.map +1 -1
  93. package/dist/editor/MobileLayout.js +37 -12
  94. package/dist/editor/MobileLayout.js.map +1 -1
  95. package/dist/editor/PictureCropper.js +54 -45
  96. package/dist/editor/PictureCropper.js.map +1 -1
  97. package/dist/editor/PictureEditor.js +17 -15
  98. package/dist/editor/PictureEditor.js.map +1 -1
  99. package/dist/editor/QuickItemSwitcher.js +21 -21
  100. package/dist/editor/QuickItemSwitcher.js.map +1 -1
  101. package/dist/editor/SetupWizard.js +52 -12
  102. package/dist/editor/SetupWizard.js.map +1 -1
  103. package/dist/editor/Titlebar.js +7 -2
  104. package/dist/editor/Titlebar.js.map +1 -1
  105. package/dist/editor/ai/AgentCostDisplay.d.ts +1 -0
  106. package/dist/editor/ai/AgentCostDisplay.js +1 -1
  107. package/dist/editor/ai/AgentCostDisplay.js.map +1 -1
  108. package/dist/editor/ai/AgentDocumentList.js +32 -14
  109. package/dist/editor/ai/AgentDocumentList.js.map +1 -1
  110. package/dist/editor/ai/AgentGreeting.js +3 -2
  111. package/dist/editor/ai/AgentGreeting.js.map +1 -1
  112. package/dist/editor/ai/AgentProfileSelector.js +2 -1
  113. package/dist/editor/ai/AgentProfileSelector.js.map +1 -1
  114. package/dist/editor/ai/AgentStatusBadge.d.ts +0 -5
  115. package/dist/editor/ai/AgentStatusBadge.js +67 -65
  116. package/dist/editor/ai/AgentStatusBadge.js.map +1 -1
  117. package/dist/editor/ai/AgentTerminal.d.ts +14 -2
  118. package/dist/editor/ai/AgentTerminal.js +2406 -496
  119. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  120. package/dist/editor/ai/AgentTerminalStatusBar.d.ts +8 -3
  121. package/dist/editor/ai/AgentTerminalStatusBar.js +481 -56
  122. package/dist/editor/ai/AgentTerminalStatusBar.js.map +1 -1
  123. package/dist/editor/ai/Agents.js +161 -113
  124. package/dist/editor/ai/Agents.js.map +1 -1
  125. package/dist/editor/ai/AiResponseMessage.d.ts +10 -1
  126. package/dist/editor/ai/AiResponseMessage.js +267 -26
  127. package/dist/editor/ai/AiResponseMessage.js.map +1 -1
  128. package/dist/editor/ai/ContextInfoBar.d.ts +2 -3
  129. package/dist/editor/ai/ContextInfoBar.js +64 -7
  130. package/dist/editor/ai/ContextInfoBar.js.map +1 -1
  131. package/dist/editor/ai/GuidanceOverlay.js +17 -11
  132. package/dist/editor/ai/GuidanceOverlay.js.map +1 -1
  133. package/dist/editor/ai/InlineAiDialog.d.ts +1 -1
  134. package/dist/editor/ai/InlineAiDialog.js +514 -192
  135. package/dist/editor/ai/InlineAiDialog.js.map +1 -1
  136. package/dist/editor/ai/InlineAiTrigger.js +115 -12
  137. package/dist/editor/ai/InlineAiTrigger.js.map +1 -1
  138. package/dist/editor/ai/MediaImage.js +40 -8
  139. package/dist/editor/ai/MediaImage.js.map +1 -1
  140. package/dist/editor/ai/SpawnedAgentsPanel.js +10 -12
  141. package/dist/editor/ai/SpawnedAgentsPanel.js.map +1 -1
  142. package/dist/editor/ai/ToolCallDisplay.d.ts +22 -2
  143. package/dist/editor/ai/ToolCallDisplay.js +542 -150
  144. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  145. package/dist/editor/ai/agentDiagnostics.d.ts +7 -0
  146. package/dist/editor/ai/agentDiagnostics.js.map +1 -1
  147. package/dist/editor/ai/dialogs/AgentDialogHandler.d.ts +1 -8
  148. package/dist/editor/ai/dialogs/AgentDialogHandler.js +379 -42
  149. package/dist/editor/ai/dialogs/AgentDialogHandler.js.map +1 -1
  150. package/dist/editor/ai/dialogs/QuestionnaireInline.d.ts +5 -1
  151. package/dist/editor/ai/dialogs/QuestionnaireInline.js +628 -60
  152. package/dist/editor/ai/dialogs/QuestionnaireInline.js.map +1 -1
  153. package/dist/editor/ai/dialogs/agentDialogTypes.d.ts +115 -0
  154. package/dist/editor/ai/dialogs/agentDialogTypes.js +2 -0
  155. package/dist/editor/ai/dialogs/agentDialogTypes.js.map +1 -1
  156. package/dist/editor/ai/types.d.ts +3 -1
  157. package/dist/editor/ai/useAgentStatus.d.ts +2 -1
  158. package/dist/editor/ai/useAgentStatus.js +90 -100
  159. package/dist/editor/ai/useAgentStatus.js.map +1 -1
  160. package/dist/editor/ai/useInlineAiPosition.js +45 -5
  161. package/dist/editor/ai/useInlineAiPosition.js.map +1 -1
  162. package/dist/editor/client/AboutDialog.js +4 -2
  163. package/dist/editor/client/AboutDialog.js.map +1 -1
  164. package/dist/editor/client/EditorShell.d.ts +4 -1
  165. package/dist/editor/client/EditorShell.js +770 -237
  166. package/dist/editor/client/EditorShell.js.map +1 -1
  167. package/dist/editor/client/editContext.d.ts +33 -19
  168. package/dist/editor/client/editContext.js.map +1 -1
  169. package/dist/editor/client/helpers.js +6 -0
  170. package/dist/editor/client/helpers.js.map +1 -1
  171. package/dist/editor/client/hooks/useEditorUrlSync.js +1 -2
  172. package/dist/editor/client/hooks/useEditorUrlSync.js.map +1 -1
  173. package/dist/editor/client/hooks/useEditorWebSocket.d.ts +10 -0
  174. package/dist/editor/client/hooks/useEditorWebSocket.js +209 -14
  175. package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
  176. package/dist/editor/client/hooks/useQuota.d.ts +8 -0
  177. package/dist/editor/client/hooks/useQuota.js.map +1 -1
  178. package/dist/editor/client/hooks/useSocketMessageHandler.js +73 -15
  179. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  180. package/dist/editor/client/itemsRepository.js +10 -6
  181. package/dist/editor/client/itemsRepository.js.map +1 -1
  182. package/dist/editor/client/navigation.js +35 -3
  183. package/dist/editor/client/navigation.js.map +1 -1
  184. package/dist/editor/client/operations.d.ts +6 -3
  185. package/dist/editor/client/operations.js +208 -30
  186. package/dist/editor/client/operations.js.map +1 -1
  187. package/dist/editor/client/pageModelBuilder.js +4 -31
  188. package/dist/editor/client/pageModelBuilder.js.map +1 -1
  189. package/dist/editor/client/ui/DevModeIndicator.js +2 -2
  190. package/dist/editor/client/ui/DevModeIndicator.js.map +1 -1
  191. package/dist/editor/client/ui/EditorChrome.d.ts +0 -6
  192. package/dist/editor/client/ui/EditorChrome.js +55 -72
  193. package/dist/editor/client/ui/EditorChrome.js.map +1 -1
  194. package/dist/editor/client/ui/FullscreenControls.js +5 -3
  195. package/dist/editor/client/ui/FullscreenControls.js.map +1 -1
  196. package/dist/editor/commands/commands.d.ts +11 -1
  197. package/dist/editor/commands/commands.js +12 -1
  198. package/dist/editor/commands/commands.js.map +1 -1
  199. package/dist/editor/commands/componentCommands.js +109 -55
  200. package/dist/editor/commands/componentCommands.js.map +1 -1
  201. package/dist/editor/commands/customCommandConverter.d.ts +8 -1
  202. package/dist/editor/commands/customCommandConverter.js +35 -5
  203. package/dist/editor/commands/customCommandConverter.js.map +1 -1
  204. package/dist/editor/commands/handlers/agentHandler.js +2 -1
  205. package/dist/editor/commands/handlers/agentHandler.js.map +1 -1
  206. package/dist/editor/commands/itemCommands.d.ts +3 -0
  207. package/dist/editor/commands/itemCommands.js +93 -10
  208. package/dist/editor/commands/itemCommands.js.map +1 -1
  209. package/dist/editor/commands/undo.d.ts +9 -15
  210. package/dist/editor/commands/undo.js +24 -0
  211. package/dist/editor/commands/undo.js.map +1 -1
  212. package/dist/editor/context-menu/InsertMenu.js +83 -39
  213. package/dist/editor/context-menu/InsertMenu.js.map +1 -1
  214. package/dist/editor/field-types/MultiLineText.js +1 -1
  215. package/dist/editor/field-types/MultiLineText.js.map +1 -1
  216. package/dist/editor/field-types/RawEditor.js +1 -1
  217. package/dist/editor/field-types/RichTextEditor.js +13 -5
  218. package/dist/editor/field-types/RichTextEditor.js.map +1 -1
  219. package/dist/editor/field-types/RichTextEditorComponent.js +37 -3
  220. package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
  221. package/dist/editor/field-types/SingleLineText.js +1 -1
  222. package/dist/editor/field-types/TreeListEditor.js +3 -2
  223. package/dist/editor/field-types/TreeListEditor.js.map +1 -1
  224. package/dist/editor/field-types/richtext/components/ReactSlate.css +23 -5
  225. package/dist/editor/field-types/richtext/components/ReactSlate.d.ts +2 -0
  226. package/dist/editor/field-types/richtext/components/ReactSlate.js +28 -4
  227. package/dist/editor/field-types/richtext/components/ReactSlate.js.map +1 -1
  228. package/dist/editor/field-types/richtext/components/ToolbarButton.js +4 -2
  229. package/dist/editor/field-types/richtext/components/ToolbarButton.js.map +1 -1
  230. package/dist/editor/field-types/richtext/contextMenuFactory.d.ts +13 -0
  231. package/dist/editor/field-types/richtext/contextMenuFactory.js +181 -24
  232. package/dist/editor/field-types/richtext/contextMenuFactory.js.map +1 -1
  233. package/dist/editor/field-types/richtext/types.d.ts +2 -0
  234. package/dist/editor/field-types/richtext/types.js.map +1 -1
  235. package/dist/editor/field-types/richtext/utils/plugins.js +4 -0
  236. package/dist/editor/field-types/richtext/utils/plugins.js.map +1 -1
  237. package/dist/editor/field-types/textContextMenuFactory.js +3 -2
  238. package/dist/editor/field-types/textContextMenuFactory.js.map +1 -1
  239. package/dist/editor/media-selector/AiImageSearchPrompt.js +4 -2
  240. package/dist/editor/media-selector/AiImageSearchPrompt.js.map +1 -1
  241. package/dist/editor/media-selector/MediaFolderBrowser.js +1 -1
  242. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  243. package/dist/editor/media-selector/MediaSelector.js +7 -1
  244. package/dist/editor/media-selector/MediaSelector.js.map +1 -1
  245. package/dist/editor/media-selector/TreeSelector.js +40 -35
  246. package/dist/editor/media-selector/TreeSelector.js.map +1 -1
  247. package/dist/editor/menubar/ActiveUsers.js +1 -1
  248. package/dist/editor/menubar/ActiveUsers.js.map +1 -1
  249. package/dist/editor/menubar/GenericToolbar.js +4 -2
  250. package/dist/editor/menubar/GenericToolbar.js.map +1 -1
  251. package/dist/editor/menubar/ItemLanguageVersion.js +2 -2
  252. package/dist/editor/menubar/ItemLanguageVersion.js.map +1 -1
  253. package/dist/editor/menubar/PageSelector.js +26 -147
  254. package/dist/editor/menubar/PageSelector.js.map +1 -1
  255. package/dist/editor/menubar/Separator.js +1 -1
  256. package/dist/editor/menubar/VersionSelector.js +2 -4
  257. package/dist/editor/menubar/VersionSelector.js.map +1 -1
  258. package/dist/editor/menubar/WorkflowButton.js +39 -12
  259. package/dist/editor/menubar/WorkflowButton.js.map +1 -1
  260. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js +16 -38
  261. package/dist/editor/menubar/toolbar-sections/CustomCommandsToolbar.js.map +1 -1
  262. package/dist/editor/menubar/toolbar-sections/EditControls.js +3 -3
  263. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  264. package/dist/editor/menubar/toolbar-sections/HelpButton.js +1 -0
  265. package/dist/editor/menubar/toolbar-sections/HelpButton.js.map +1 -1
  266. package/dist/editor/menubar/toolbar-sections/ManualBrowser.d.ts +6 -10
  267. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js +597 -220
  268. package/dist/editor/menubar/toolbar-sections/ManualBrowser.js.map +1 -1
  269. package/dist/editor/menubar/toolbar-sections/UtilityControls.js +13 -2
  270. package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
  271. package/dist/editor/page-editor-chrome/CommentHighlighting.js +42 -1
  272. package/dist/editor/page-editor-chrome/CommentHighlighting.js.map +1 -1
  273. package/dist/editor/page-editor-chrome/FrameMenu.js +1 -1
  274. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  275. package/dist/editor/page-editor-chrome/InlineEditor.js +97 -48
  276. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
  277. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +38 -17
  278. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  279. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +17 -11
  280. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  281. package/dist/editor/page-editor-chrome/useInlineAICompletion.js +301 -301
  282. package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
  283. package/dist/editor/page-viewer/DeviceToolbar.js +1 -1
  284. package/dist/editor/page-viewer/DeviceToolbar.js.map +1 -1
  285. package/dist/editor/page-viewer/EditorForm.js +69 -11
  286. package/dist/editor/page-viewer/EditorForm.js.map +1 -1
  287. package/dist/editor/page-viewer/MiniMap.d.ts +2 -4
  288. package/dist/editor/page-viewer/MiniMap.js +91 -28
  289. package/dist/editor/page-viewer/MiniMap.js.map +1 -1
  290. package/dist/editor/page-viewer/PageViewer.d.ts +3 -1
  291. package/dist/editor/page-viewer/PageViewer.js +92 -19
  292. package/dist/editor/page-viewer/PageViewer.js.map +1 -1
  293. package/dist/editor/page-viewer/PageViewerFrame.d.ts +2 -1
  294. package/dist/editor/page-viewer/PageViewerFrame.js +348 -115
  295. package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
  296. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js +114 -49
  297. package/dist/editor/page-viewer/pageModelSkeletonBuilder.js.map +1 -1
  298. package/dist/editor/page-viewer/pageViewContext.d.ts +1 -0
  299. package/dist/editor/page-viewer/pageViewContext.js +51 -14
  300. package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
  301. package/dist/editor/pageModel.d.ts +14 -1
  302. package/dist/editor/reviews/Comment.js +26 -12
  303. package/dist/editor/reviews/Comment.js.map +1 -1
  304. package/dist/editor/reviews/CommentDisplayPopover.js +7 -5
  305. package/dist/editor/reviews/CommentDisplayPopover.js.map +1 -1
  306. package/dist/editor/reviews/CommentView.js +19 -4
  307. package/dist/editor/reviews/CommentView.js.map +1 -1
  308. package/dist/editor/reviews/Comments.js +89 -72
  309. package/dist/editor/reviews/Comments.js.map +1 -1
  310. package/dist/editor/reviews/CreateReviewDialog.js +281 -177
  311. package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
  312. package/dist/editor/reviews/DecisionsMatrix.js +96 -25
  313. package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
  314. package/dist/editor/reviews/DiffView.js +7 -14
  315. package/dist/editor/reviews/DiffView.js.map +1 -1
  316. package/dist/editor/reviews/EditReviewSettingsDialog.js +6 -4
  317. package/dist/editor/reviews/EditReviewSettingsDialog.js.map +1 -1
  318. package/dist/editor/reviews/MultiReviewManager.js +25 -3
  319. package/dist/editor/reviews/MultiReviewManager.js.map +1 -1
  320. package/dist/editor/reviews/PagesPanel.js +31 -15
  321. package/dist/editor/reviews/PagesPanel.js.map +1 -1
  322. package/dist/editor/reviews/PreviewInfo.js +1 -4
  323. package/dist/editor/reviews/PreviewInfo.js.map +1 -1
  324. package/dist/editor/reviews/ReviewCard.js +13 -7
  325. package/dist/editor/reviews/ReviewCard.js.map +1 -1
  326. package/dist/editor/reviews/ReviewDetail.js +3 -2
  327. package/dist/editor/reviews/ReviewDetail.js.map +1 -1
  328. package/dist/editor/reviews/ReviewsList.js +7 -3
  329. package/dist/editor/reviews/ReviewsList.js.map +1 -1
  330. package/dist/editor/reviews/SuggestedEdit.js +34 -3
  331. package/dist/editor/reviews/SuggestedEdit.js.map +1 -1
  332. package/dist/editor/reviews/SuggestionDisplayPopover.js +31 -5
  333. package/dist/editor/reviews/SuggestionDisplayPopover.js.map +1 -1
  334. package/dist/editor/reviews/commentAi.js +25 -6
  335. package/dist/editor/reviews/commentAi.js.map +1 -1
  336. package/dist/editor/reviews/reviewCommands.js +4 -1
  337. package/dist/editor/reviews/reviewCommands.js.map +1 -1
  338. package/dist/editor/reviews/useMultiReview.js +2 -2
  339. package/dist/editor/reviews/useMultiReview.js.map +1 -1
  340. package/dist/editor/reviews/useReviews.d.ts +2 -2
  341. package/dist/editor/reviews/useReviews.js +12 -30
  342. package/dist/editor/reviews/useReviews.js.map +1 -1
  343. package/dist/editor/services/agentErrorMessage.d.ts +1 -0
  344. package/dist/editor/services/agentErrorMessage.js +91 -0
  345. package/dist/editor/services/agentErrorMessage.js.map +1 -0
  346. package/dist/editor/services/agentService.d.ts +229 -5
  347. package/dist/editor/services/agentService.js +292 -39
  348. package/dist/editor/services/agentService.js.map +1 -1
  349. package/dist/editor/services/agentStatus.d.ts +1 -0
  350. package/dist/editor/services/agentStatus.js +19 -0
  351. package/dist/editor/services/agentStatus.js.map +1 -1
  352. package/dist/editor/services/aiService.d.ts +57 -1
  353. package/dist/editor/services/aiService.js +79 -6
  354. package/dist/editor/services/aiService.js.map +1 -1
  355. package/dist/editor/services/contentService.d.ts +6 -3
  356. package/dist/editor/services/contentService.js +13 -12
  357. package/dist/editor/services/contentService.js.map +1 -1
  358. package/dist/editor/services/editService.d.ts +52 -1
  359. package/dist/editor/services/editService.js +94 -2
  360. package/dist/editor/services/editService.js.map +1 -1
  361. package/dist/editor/services/indexService.js +1 -1
  362. package/dist/editor/services/indexService.js.map +1 -1
  363. package/dist/editor/services/reviewsService.d.ts +3 -6
  364. package/dist/editor/services/reviewsService.js +2 -11
  365. package/dist/editor/services/reviewsService.js.map +1 -1
  366. package/dist/editor/services/serviceHelper.d.ts +2 -1
  367. package/dist/editor/services/serviceHelper.js +112 -20
  368. package/dist/editor/services/serviceHelper.js.map +1 -1
  369. package/dist/editor/services/systemService.d.ts +2 -1
  370. package/dist/editor/services/systemService.js +3 -0
  371. package/dist/editor/services/systemService.js.map +1 -1
  372. package/dist/editor/services-server/api.d.ts +1 -2
  373. package/dist/editor/services-server/api.js +11 -6
  374. package/dist/editor/services-server/api.js.map +1 -1
  375. package/dist/editor/settings/About.js +317 -3
  376. package/dist/editor/settings/About.js.map +1 -1
  377. package/dist/editor/settings/QuotaInfo.js +210 -4
  378. package/dist/editor/settings/QuotaInfo.js.map +1 -1
  379. package/dist/editor/settings/SettingsView.js +25 -23
  380. package/dist/editor/settings/SettingsView.js.map +1 -1
  381. package/dist/editor/settings/Status.js +7 -6
  382. package/dist/editor/settings/Status.js.map +1 -1
  383. package/dist/editor/settings/index/useIndexStatus.js +20 -22
  384. package/dist/editor/settings/index/useIndexStatus.js.map +1 -1
  385. package/dist/editor/settings/panels/AgentsPanel.d.ts +0 -4
  386. package/dist/editor/settings/panels/AgentsPanel.js +95 -121
  387. package/dist/editor/settings/panels/AgentsPanel.js.map +1 -1
  388. package/dist/editor/settings/panels/ModelsPanel.js +329 -108
  389. package/dist/editor/settings/panels/ModelsPanel.js.map +1 -1
  390. package/dist/editor/settings/panels/ProvidersPanel.d.ts +1 -1
  391. package/dist/editor/settings/panels/ProvidersPanel.js +86 -59
  392. package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -1
  393. package/dist/editor/settings/panels/SearchConfigPanel.js +4 -4
  394. package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -1
  395. package/dist/editor/settings/panels/index.d.ts +3 -2
  396. package/dist/editor/settings/panels/index.js +3 -2
  397. package/dist/editor/settings/panels/index.js.map +1 -1
  398. package/dist/editor/settings/status/coreStatusChecks.js +124 -19
  399. package/dist/editor/settings/status/coreStatusChecks.js.map +1 -1
  400. package/dist/editor/settings/status/useStartupChecks.d.ts +3 -1
  401. package/dist/editor/settings/status/useStartupChecks.js +9 -5
  402. package/dist/editor/settings/status/useStartupChecks.js.map +1 -1
  403. package/dist/editor/setup-wizard/steps/CompleteStep.d.ts +2 -1
  404. package/dist/editor/setup-wizard/steps/CompleteStep.js +2 -1
  405. package/dist/editor/setup-wizard/steps/CompleteStep.js.map +1 -1
  406. package/dist/editor/sidebar/ComponentPalette.js +2 -1
  407. package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
  408. package/dist/editor/sidebar/ComponentTree.d.ts +8 -1
  409. package/dist/editor/sidebar/ComponentTree.js +216 -69
  410. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  411. package/dist/editor/sidebar/EditHistory.js +22 -46
  412. package/dist/editor/sidebar/EditHistory.js.map +1 -1
  413. package/dist/editor/sidebar/Favorites.js +4 -8
  414. package/dist/editor/sidebar/Favorites.js.map +1 -1
  415. package/dist/editor/sidebar/MainContentTree.js +4 -3
  416. package/dist/editor/sidebar/MainContentTree.js.map +1 -1
  417. package/dist/editor/sidebar/OperationItem.js +21 -7
  418. package/dist/editor/sidebar/OperationItem.js.map +1 -1
  419. package/dist/editor/sidebar/SidebarPanel.d.ts +3 -1
  420. package/dist/editor/sidebar/SidebarPanel.js +44 -12
  421. package/dist/editor/sidebar/SidebarPanel.js.map +1 -1
  422. package/dist/editor/sidebar/SidebarStack.d.ts +2 -1
  423. package/dist/editor/sidebar/SidebarStack.js +4 -3
  424. package/dist/editor/sidebar/SidebarStack.js.map +1 -1
  425. package/dist/editor/sidebar/Validation.js +24 -12
  426. package/dist/editor/sidebar/Validation.js.map +1 -1
  427. package/dist/editor/sidebar/Workbox.js +53 -3
  428. package/dist/editor/sidebar/Workbox.js.map +1 -1
  429. package/dist/editor/sidebar/WorkspaceRail.d.ts +0 -1
  430. package/dist/editor/sidebar/WorkspaceRail.js +56 -167
  431. package/dist/editor/sidebar/WorkspaceRail.js.map +1 -1
  432. package/dist/editor/tree-indicators/GutterColumns.d.ts +3 -1
  433. package/dist/editor/tree-indicators/GutterColumns.js +26 -5
  434. package/dist/editor/tree-indicators/GutterColumns.js.map +1 -1
  435. package/dist/editor/tree-indicators/GutterContext.d.ts +4 -0
  436. package/dist/editor/tree-indicators/GutterContext.js +23 -0
  437. package/dist/editor/tree-indicators/GutterContext.js.map +1 -1
  438. package/dist/editor/tree-indicators/index.d.ts +0 -1
  439. package/dist/editor/tree-indicators/index.js +0 -1
  440. package/dist/editor/tree-indicators/index.js.map +1 -1
  441. package/dist/editor/tree-indicators/types.d.ts +12 -1
  442. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js +1 -1
  443. package/dist/editor/ui/CopyMoveTargetSelectorDialog.js.map +1 -1
  444. package/dist/editor/ui/Icons.js +1 -1
  445. package/dist/editor/ui/Icons.js.map +1 -1
  446. package/dist/editor/ui/ItemNameDialogNew.d.ts +2 -0
  447. package/dist/editor/ui/ItemNameDialogNew.js +33 -17
  448. package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
  449. package/dist/editor/ui/ItemSearch.js +7 -11
  450. package/dist/editor/ui/ItemSearch.js.map +1 -1
  451. package/dist/editor/ui/SimpleIconButton.js +1 -1
  452. package/dist/editor/ui/SimpleIconButton.js.map +1 -1
  453. package/dist/editor/ui/SimpleTabs.d.ts +1 -0
  454. package/dist/editor/ui/SimpleTabs.js +45 -25
  455. package/dist/editor/ui/SimpleTabs.js.map +1 -1
  456. package/dist/editor/ui/Splitter.d.ts +1 -0
  457. package/dist/editor/ui/Splitter.js +102 -86
  458. package/dist/editor/ui/Splitter.js.map +1 -1
  459. package/dist/editor/ui/TemplateSelectorDialog.js +4 -4
  460. package/dist/editor/ui/TemplateSelectorDialog.js.map +1 -1
  461. package/dist/editor/ui/TreeListSelector.d.ts +6 -1
  462. package/dist/editor/ui/TreeListSelector.js +2 -2
  463. package/dist/editor/ui/TreeListSelector.js.map +1 -1
  464. package/dist/editor/utils/keyboardNavigation.d.ts +6 -20
  465. package/dist/editor/utils/keyboardNavigation.js +48 -140
  466. package/dist/editor/utils/keyboardNavigation.js.map +1 -1
  467. package/dist/editor/utils.js +19 -9
  468. package/dist/editor/utils.js.map +1 -1
  469. package/dist/editor/views/CompareView.d.ts +3 -1
  470. package/dist/editor/views/CompareView.js +7 -5
  471. package/dist/editor/views/CompareView.js.map +1 -1
  472. package/dist/editor/views/EditView.js +1 -1
  473. package/dist/editor/views/EditView.js.map +1 -1
  474. package/dist/editor/views/EditorSlot.js +27 -34
  475. package/dist/editor/views/EditorSlot.js.map +1 -1
  476. package/dist/editor/views/ItemEditor.js +7 -3
  477. package/dist/editor/views/ItemEditor.js.map +1 -1
  478. package/dist/editor/views/MediaFolderEditView.js +1 -1
  479. package/dist/editor/views/MediaFolderEditView.js.map +1 -1
  480. package/dist/editor/views/ParheliaView.js +5 -6
  481. package/dist/editor/views/ParheliaView.js.map +1 -1
  482. package/dist/editor/views/SingleEditView.d.ts +2 -1
  483. package/dist/editor/views/SingleEditView.js +10 -8
  484. package/dist/editor/views/SingleEditView.js.map +1 -1
  485. package/dist/editor/views/editorSlotContext.js +35 -6
  486. package/dist/editor/views/editorSlotContext.js.map +1 -1
  487. package/dist/index.d.ts +16 -2
  488. package/dist/index.js +11 -0
  489. package/dist/index.js.map +1 -1
  490. package/dist/revision.d.ts +2 -2
  491. package/dist/revision.js +2 -2
  492. package/dist/setup/services/setupWizardService.d.ts +40 -13
  493. package/dist/setup/services/setupWizardService.js +32 -17
  494. package/dist/setup/services/setupWizardService.js.map +1 -1
  495. package/dist/setup/wizard/steps/AddModelDialog.js +12 -3
  496. package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -1
  497. package/dist/setup/wizard/steps/ImportModelDialog.js +39 -22
  498. package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -1
  499. package/dist/splash-screen/ModernSplashScreen.js +112 -32
  500. package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
  501. package/dist/splash-screen/NewPage.js +33 -50
  502. package/dist/splash-screen/NewPage.js.map +1 -1
  503. package/dist/splash-screen/OpenPage.js +2 -6
  504. package/dist/splash-screen/OpenPage.js.map +1 -1
  505. package/dist/splash-screen/ParheliaAssistantChat.js +12 -29
  506. package/dist/splash-screen/ParheliaAssistantChat.js.map +1 -1
  507. package/dist/splash-screen/ParheliaLogo.js +87 -37
  508. package/dist/splash-screen/ParheliaLogo.js.map +1 -1
  509. package/dist/splash-screen/RecentPages.js +3 -3
  510. package/dist/splash-screen/RecentPages.js.map +1 -1
  511. package/dist/tour/Tour.d.ts +2 -1
  512. package/dist/tour/Tour.js +256 -75
  513. package/dist/tour/Tour.js.map +1 -1
  514. package/dist/tour/default-tour.js +222 -96
  515. package/dist/tour/default-tour.js.map +1 -1
  516. package/dist/types.d.ts +63 -29
  517. package/package.json +19 -15
  518. package/styles.css +39 -10
  519. package/dist/editor/ComponentInfo.d.ts +0 -4
  520. package/dist/editor/ComponentInfo.js +0 -41
  521. package/dist/editor/ComponentInfo.js.map +0 -1
  522. package/dist/editor/ai/HelpTerminal.d.ts +0 -5
  523. package/dist/editor/ai/HelpTerminal.js +0 -166
  524. package/dist/editor/ai/HelpTerminal.js.map +0 -1
  525. package/dist/editor/field-types/ReactQuill.d.ts +0 -125
  526. package/dist/editor/field-types/ReactQuill.js +0 -385
  527. package/dist/editor/field-types/ReactQuill.js.map +0 -1
  528. package/dist/editor/services-server/graphQL.d.ts +0 -29
  529. package/dist/editor/services-server/graphQL.js +0 -53
  530. package/dist/editor/services-server/graphQL.js.map +0 -1
  531. package/dist/editor/settings/AllAgentsPanel.d.ts +0 -5
  532. package/dist/editor/settings/AllAgentsPanel.js +0 -139
  533. package/dist/editor/settings/AllAgentsPanel.js.map +0 -1
  534. package/dist/editor/settings/LatestFeedback.d.ts +0 -1
  535. package/dist/editor/settings/LatestFeedback.js +0 -136
  536. package/dist/editor/settings/LatestFeedback.js.map +0 -1
  537. package/dist/editor/settings/Setup.d.ts +0 -1
  538. package/dist/editor/settings/Setup.js +0 -211
  539. package/dist/editor/settings/Setup.js.map +0 -1
  540. package/dist/editor/settings/panels/DatabasePanel.d.ts +0 -6
  541. package/dist/editor/settings/panels/DatabasePanel.js +0 -50
  542. package/dist/editor/settings/panels/DatabasePanel.js.map +0 -1
  543. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +0 -2
  544. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js +0 -195
  545. package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +0 -1
  546. package/dist/editor/settings/setup-steps/AiSetupStep/index.d.ts +0 -2
  547. package/dist/editor/settings/setup-steps/AiSetupStep/index.js +0 -21
  548. package/dist/editor/settings/setup-steps/AiSetupStep/index.js.map +0 -1
  549. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +0 -1
  550. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js +0 -233
  551. package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js.map +0 -1
  552. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +0 -15
  553. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +0 -14
  554. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +0 -1
  555. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +0 -1
  556. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +0 -94
  557. package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +0 -1
  558. package/dist/editor/settings/setup-steps/AiSetupStep/types.d.ts +0 -1
  559. package/dist/editor/settings/setup-steps/AiSetupStep/types.js +0 -2
  560. package/dist/editor/settings/setup-steps/AiSetupStep/types.js.map +0 -1
  561. package/dist/editor/settings/setup-steps/AiSetupStep/utils.d.ts +0 -5
  562. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js +0 -44
  563. package/dist/editor/settings/setup-steps/AiSetupStep/utils.js.map +0 -1
  564. package/dist/editor/settings/setup-steps/IndexSetupStep.d.ts +0 -2
  565. package/dist/editor/settings/setup-steps/IndexSetupStep.js +0 -36
  566. package/dist/editor/settings/setup-steps/IndexSetupStep.js.map +0 -1
  567. package/dist/editor/settings/setup-steps/SettingsSetupStep.d.ts +0 -2
  568. package/dist/editor/settings/setup-steps/SettingsSetupStep.js +0 -111
  569. package/dist/editor/settings/setup-steps/SettingsSetupStep.js.map +0 -1
  570. package/dist/editor/settings/setup-steps/SetupOverview.d.ts +0 -14
  571. package/dist/editor/settings/setup-steps/SetupOverview.js +0 -38
  572. package/dist/editor/settings/setup-steps/SetupOverview.js.map +0 -1
  573. package/dist/editor/sidebar/Debug.d.ts +0 -1
  574. package/dist/editor/sidebar/Debug.js +0 -70
  575. package/dist/editor/sidebar/Debug.js.map +0 -1
  576. package/dist/editor/sidebar/GraphQL.d.ts +0 -2
  577. package/dist/editor/sidebar/GraphQL.js +0 -234
  578. package/dist/editor/sidebar/GraphQL.js.map +0 -1
  579. package/dist/editor/sidebar/LeftToolbar.d.ts +0 -1
  580. package/dist/editor/sidebar/LeftToolbar.js +0 -12
  581. package/dist/editor/sidebar/LeftToolbar.js.map +0 -1
  582. package/dist/editor/sidebar/NavigationSidebar.d.ts +0 -4
  583. package/dist/editor/sidebar/NavigationSidebar.js +0 -254
  584. package/dist/editor/sidebar/NavigationSidebar.js.map +0 -1
  585. package/dist/editor/tree-indicators/GutterSelector.d.ts +0 -5
  586. package/dist/editor/tree-indicators/GutterSelector.js +0 -91
  587. package/dist/editor/tree-indicators/GutterSelector.js.map +0 -1
@@ -1,38 +1,435 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useCallback, useMemo } from "react";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useCallback, useMemo, useEffect, useRef, } from "react";
3
3
  import { Button } from "../../../components/ui/button";
4
4
  import { Checkbox } from "../../../components/ui/checkbox";
5
5
  import { Textarea } from "../../../components/ui/textarea";
6
- import { X, ClipboardList, MessageSquare } from "lucide-react";
6
+ import { X, ClipboardList, MessageSquare, AlertCircle, FileUp, Loader2, Paperclip, Trash2, } from "lucide-react";
7
+ import { ItemCollectionEditor, } from "../../ui/ItemCollectionEditor";
8
+ import { TreeListSelector } from "../../ui/TreeListSelector";
9
+ import { useEditContext } from "../../client/editContext";
10
+ import { cn } from "../../../lib/utils";
11
+ import { uploadDocument } from "../../services/agentService";
12
+ import { uploadAttachmentFile } from "../../../task-board/services/taskService";
13
+ const questionnaireDrafts = new Map();
14
+ const questionnairePendingFileDrafts = new Map();
15
+ const QUESTIONNAIRE_MAX_FILE_SIZE_MB = 10;
16
+ const QUESTIONNAIRE_MAX_FILE_SIZE_BYTES = QUESTIONNAIRE_MAX_FILE_SIZE_MB * 1024 * 1024;
17
+ const QUESTIONNAIRE_FILE_ACCEPT = ".txt,.md,.pdf,.docx,.xlsx,.pptx,.csv,.json,.xml,.cs,.js,.ts,.tsx,.jsx,.py,.java,.cpp,.c,.h,.hpp,.cshtml,.razor,.vb,.php,.rb,.go,.rs,.swift,.kt,.scala,.sql,.sh,.ps1,.bat,.yaml,.yml,.png,.jpg,.jpeg,.gif,.webp";
18
+ function isItemSelectionType(type) {
19
+ return type === "item-picker" || type === "item-collection";
20
+ }
21
+ function isFileUploadType(type) {
22
+ return type === "file-upload";
23
+ }
24
+ function createEmptyAnswer(questionId) {
25
+ return {
26
+ questionId,
27
+ selectedOptions: [],
28
+ selectedItems: [],
29
+ uploadedDocuments: [],
30
+ freetext: undefined,
31
+ };
32
+ }
33
+ function shouldStoreInAgentDocumentStore(question) {
34
+ return question.storeInAgentDocumentStore !== false;
35
+ }
36
+ function toUploadedDocumentReference(document) {
37
+ if (!document) {
38
+ return null;
39
+ }
40
+ return {
41
+ id: document.id,
42
+ agentId: document.agentId,
43
+ fileName: document.fileName,
44
+ fileSize: document.fileSize,
45
+ contentType: document.contentType,
46
+ uploadedBy: document.uploadedBy,
47
+ uploadedDate: document.uploadedDate,
48
+ };
49
+ }
50
+ function toUploadedDocumentReferenceFromTaskAttachment(attachment) {
51
+ return {
52
+ fileName: attachment.fileName,
53
+ fileSize: attachment.fileSize,
54
+ contentType: attachment.fileType ?? undefined,
55
+ uploadedBy: attachment.uploadedBy,
56
+ uploadedDate: attachment.uploadedAt,
57
+ };
58
+ }
59
+ function toItemCollectionItems(selectedItems, language) {
60
+ return (selectedItems ?? []).map((item) => ({
61
+ descriptor: {
62
+ id: item.id,
63
+ language,
64
+ version: 1,
65
+ name: item.name || "",
66
+ displayName: item.name || "",
67
+ path: item.path || "",
68
+ },
69
+ includeSubitems: Boolean(item.includeSubitems),
70
+ }));
71
+ }
72
+ function toSelectedItems(items) {
73
+ return items.map((item) => ({
74
+ id: item.descriptor.id,
75
+ name: item.descriptor.displayName ||
76
+ item.descriptor.name ||
77
+ item.descriptor.path ||
78
+ item.descriptor.id,
79
+ path: item.descriptor.path,
80
+ includeSubitems: item.includeSubitems,
81
+ }));
82
+ }
83
+ function createInitialAnswers(parameters, savedAnswers) {
84
+ const initial = new Map();
85
+ parameters.questions.forEach((q) => {
86
+ const preselectedItems = isItemSelectionType(q.type)
87
+ ? (q.preselectedItemIds ?? [])
88
+ .slice(q.type === "item-picker" && !q.allowMultiple ? -1 : 0)
89
+ .filter((id) => Boolean(id && id.trim()))
90
+ .map((id) => ({
91
+ id,
92
+ includeSubitems: false,
93
+ }))
94
+ : [];
95
+ const savedAnswer = savedAnswers?.get(q.id);
96
+ const isTextQuestion = !isItemSelectionType(q.type) &&
97
+ !isFileUploadType(q.type) &&
98
+ (q.options?.length ?? 0) === 0;
99
+ initial.set(q.id, {
100
+ questionId: q.id,
101
+ selectedOptions: savedAnswer?.selectedOptions ?? [],
102
+ selectedItems: savedAnswer?.selectedItems ?? preselectedItems,
103
+ uploadedDocuments: savedAnswer?.uploadedDocuments ?? [],
104
+ freetext: savedAnswer?.freetext ?? (isTextQuestion ? q.default : undefined),
105
+ });
106
+ });
107
+ return initial;
108
+ }
109
+ function createInitialPendingFiles(parameters, savedFiles) {
110
+ const initial = new Map();
111
+ parameters.questions.forEach((question) => {
112
+ if (!isFileUploadType(question.type)) {
113
+ return;
114
+ }
115
+ initial.set(question.id, [...(savedFiles?.get(question.id) ?? [])]);
116
+ });
117
+ return initial;
118
+ }
119
+ function QuestionnaireFileUploadField({ questionId, agentId, allowMultiple, selectedFiles, submissionError, disabled, storeInAgentDocumentStore, attachToTaskIfAvailable, taskId, onChange, }) {
120
+ const [isDragOver, setIsDragOver] = useState(false);
121
+ const [selectionError, setSelectionError] = useState(null);
122
+ const fileInputRef = useRef(null);
123
+ const canStoreInAgentDocumentStore = storeInAgentDocumentStore !== false;
124
+ const canAttachToTask = Boolean(attachToTaskIfAvailable && taskId);
125
+ const hasUploadDestination = canAttachToTask || Boolean(agentId && canStoreInAgentDocumentStore);
126
+ const handleFiles = useCallback((files) => {
127
+ if (!files || files.length === 0) {
128
+ return;
129
+ }
130
+ if (!hasUploadDestination) {
131
+ setSelectionError("File upload is unavailable because this questionnaire has no valid upload destination.");
132
+ return;
133
+ }
134
+ const nextValidFiles = [];
135
+ let nextError = null;
136
+ for (const file of Array.from(files)) {
137
+ if (file.size > QUESTIONNAIRE_MAX_FILE_SIZE_BYTES) {
138
+ nextError = `File "${file.name}" exceeds the maximum size of ${QUESTIONNAIRE_MAX_FILE_SIZE_MB} MB.`;
139
+ continue;
140
+ }
141
+ nextValidFiles.push(file);
142
+ }
143
+ if (nextValidFiles.length === 0) {
144
+ setSelectionError(nextError);
145
+ return;
146
+ }
147
+ setSelectionError(nextError);
148
+ onChange(allowMultiple
149
+ ? [...selectedFiles, ...nextValidFiles]
150
+ : nextValidFiles.slice(0, 1));
151
+ }, [allowMultiple, hasUploadDestination, onChange, selectedFiles]);
152
+ const removeSelectedFile = useCallback((fileIndex) => {
153
+ onChange(selectedFiles.filter((_, index) => index !== fileIndex));
154
+ }, [onChange, selectedFiles]);
155
+ return (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { "data-testid": "questionnaire-file-upload", "data-question-id": questionId, className: cn("rounded-lg border-2 border-dashed p-3 transition-colors", isDragOver
156
+ ? "border-indigo-400 bg-indigo-50"
157
+ : "border-gray-200 bg-gray-50/70"), onDragOver: (event) => {
158
+ event.preventDefault();
159
+ event.stopPropagation();
160
+ setIsDragOver(true);
161
+ }, onDragEnter: (event) => {
162
+ event.preventDefault();
163
+ event.stopPropagation();
164
+ setIsDragOver(true);
165
+ }, onDragLeave: (event) => {
166
+ event.preventDefault();
167
+ event.stopPropagation();
168
+ setIsDragOver(false);
169
+ }, onDrop: (event) => {
170
+ event.preventDefault();
171
+ event.stopPropagation();
172
+ setIsDragOver(false);
173
+ handleFiles(event.dataTransfer.files);
174
+ }, children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(FileUp, { className: "mt-0.5 h-4 w-4 shrink-0 text-indigo-500" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-xs font-medium text-gray-700", children: allowMultiple
175
+ ? "Drop files here or browse to attach"
176
+ : "Drop a file here or browse to attach" }), _jsxs("p", { className: "mt-0.5 text-[11px] text-gray-500", children: ["Files stay local until you submit the questionnaire. Max", " ", QUESTIONNAIRE_MAX_FILE_SIZE_MB, " MB per file.", canStoreInAgentDocumentStore
177
+ ? " Submitted files will be stored with this agent."
178
+ : "", canAttachToTask
179
+ ? canStoreInAgentDocumentStore
180
+ ? " They will also be attached to the current task."
181
+ : " Submitted files will be attached to the current task."
182
+ : ""] }), _jsxs("div", { className: "mt-2", children: [_jsx("input", { ref: fileInputRef, "data-testid": "questionnaire-file-input", "data-question-id": questionId, type: "file", className: "hidden", multiple: allowMultiple, accept: QUESTIONNAIRE_FILE_ACCEPT, onChange: (event) => {
183
+ handleFiles(event.target.files);
184
+ event.target.value = "";
185
+ } }), _jsx(Button, { type: "button", variant: "outline", size: "sm", disabled: disabled || !hasUploadDestination, onClick: () => fileInputRef.current?.click(), className: "h-8 text-xs", children: allowMultiple ? "Browse Files" : "Browse File" })] })] })] }) }), (selectionError || submissionError) && (_jsx("div", { "data-testid": "questionnaire-file-upload-error", "data-question-id": questionId, className: "rounded border border-red-200 bg-red-50 px-2 py-1.5 text-[11px] text-red-700", children: selectionError || submissionError })), selectedFiles.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2", children: selectedFiles.map((file, index) => (_jsxs("span", { "data-testid": "questionnaire-selected-file", "data-question-id": questionId, className: "inline-flex items-center gap-1.5 rounded-full border border-gray-200 bg-white px-2 py-1 text-xs text-gray-700", title: file.name, children: [_jsx(Paperclip, { className: "h-3 w-3 text-gray-500" }), _jsx("span", { className: "max-w-[220px] truncate", children: file.name }), _jsx("button", { type: "button", "data-testid": "questionnaire-remove-selected-file", "data-file-index": index, onClick: () => removeSelectedFile(index), className: "rounded p-0.5 text-gray-400 transition-colors hover:bg-gray-100 hover:text-gray-600", "aria-label": `Remove ${file.name}`, children: _jsx(Trash2, { className: "h-3 w-3" }) })] }, `${file.name}-${file.size}-${index}`))) }))] }));
186
+ }
187
+ function QuestionnaireItemCollectionField({ questionId, rootItemId, answer, language, onChange, }) {
188
+ const editContext = useEditContext();
189
+ const items = useMemo(() => toItemCollectionItems(answer?.selectedItems, language), [answer?.selectedItems, language]);
190
+ const [selectedInTree, setSelectedInTree] = useState([]);
191
+ const [selectedFromList, setSelectedFromList] = useState([]);
192
+ useEffect(() => {
193
+ setSelectedInTree([]);
194
+ setSelectedFromList([]);
195
+ }, [answer?.selectedItems]);
196
+ const commitItems = useCallback((nextItems) => {
197
+ onChange(toSelectedItems(nextItems));
198
+ }, [onChange]);
199
+ const addToList = useCallback(async (itemsToAdd) => {
200
+ const nextItems = [...items];
201
+ const sourceItems = itemsToAdd ?? selectedInTree;
202
+ const nodesToAdd = sourceItems.filter((node) => !nextItems.some((item) => item.descriptor.id === node.id));
203
+ const nodesNeedingFetch = nodesToAdd.filter((node) => !node.path || !node.name || !node.displayName);
204
+ if (nodesNeedingFetch.length > 0 && editContext?.itemsRepository) {
205
+ try {
206
+ const stubs = await editContext.itemsRepository.getItemsStubs(nodesNeedingFetch.map((node) => ({
207
+ id: node.id,
208
+ language: node.language || language,
209
+ version: node.version || 1,
210
+ })));
211
+ const stubMap = new Map(stubs.map((stub) => [stub.id, stub]));
212
+ nodesToAdd.forEach((node) => {
213
+ const stub = stubMap.get(node.id);
214
+ nextItems.push({
215
+ descriptor: {
216
+ id: node.id,
217
+ language: node.language || language,
218
+ version: node.version || 1,
219
+ name: stub?.name || node.name || "",
220
+ displayName: stub?.displayName || node.displayName || "",
221
+ path: stub?.path || node.path || node.idPath || "",
222
+ },
223
+ includeSubitems: false,
224
+ });
225
+ });
226
+ }
227
+ catch (error) {
228
+ console.error("Failed to fetch item stubs:", error);
229
+ nodesToAdd.forEach((node) => {
230
+ nextItems.push({
231
+ descriptor: {
232
+ id: node.id,
233
+ language: node.language || language,
234
+ version: node.version || 1,
235
+ name: node.name || "",
236
+ displayName: node.displayName || "",
237
+ path: node.path || node.idPath || "",
238
+ },
239
+ includeSubitems: false,
240
+ });
241
+ });
242
+ }
243
+ }
244
+ else {
245
+ nodesToAdd.forEach((node) => {
246
+ nextItems.push({
247
+ descriptor: {
248
+ id: node.id,
249
+ language: node.language || language,
250
+ version: node.version || 1,
251
+ name: node.name || "",
252
+ displayName: node.displayName || "",
253
+ path: node.path || node.idPath || "",
254
+ },
255
+ includeSubitems: false,
256
+ });
257
+ });
258
+ }
259
+ commitItems(nextItems);
260
+ setSelectedInTree([]);
261
+ setSelectedFromList([]);
262
+ }, [
263
+ items,
264
+ selectedInTree,
265
+ editContext?.itemsRepository,
266
+ language,
267
+ commitItems,
268
+ ]);
269
+ const handleAddItem = useCallback(async (item) => {
270
+ const itemId = item.id;
271
+ if (items.some((existing) => existing.descriptor.id === itemId)) {
272
+ return;
273
+ }
274
+ let itemDescriptor = {
275
+ id: itemId,
276
+ language: item.language || language,
277
+ version: item.version ?? 1,
278
+ name: item.name || "",
279
+ displayName: item.displayName || "",
280
+ path: item.path || "",
281
+ };
282
+ if ((!itemDescriptor.path ||
283
+ !itemDescriptor.name ||
284
+ !itemDescriptor.displayName) &&
285
+ editContext?.itemsRepository) {
286
+ try {
287
+ const stubs = await editContext.itemsRepository.getItemsStubs([
288
+ {
289
+ id: itemId,
290
+ language: itemDescriptor.language,
291
+ version: itemDescriptor.version,
292
+ },
293
+ ]);
294
+ if (stubs[0]) {
295
+ itemDescriptor = {
296
+ ...itemDescriptor,
297
+ name: stubs[0].name || itemDescriptor.name,
298
+ displayName: stubs[0].displayName || itemDescriptor.displayName,
299
+ path: stubs[0].path || itemDescriptor.path,
300
+ };
301
+ }
302
+ }
303
+ catch (error) {
304
+ console.error("Failed to fetch item stub:", error);
305
+ }
306
+ }
307
+ commitItems([
308
+ ...items,
309
+ {
310
+ descriptor: itemDescriptor,
311
+ includeSubitems: false,
312
+ },
313
+ ]);
314
+ setSelectedFromList([]);
315
+ }, [items, editContext?.itemsRepository, language, commitItems]);
316
+ const removeFromList = useCallback(() => {
317
+ const idsToRemove = new Set(selectedFromList.map((item) => item.descriptor.id));
318
+ commitItems(items.filter((item) => !idsToRemove.has(item.descriptor.id)));
319
+ setSelectedFromList([]);
320
+ }, [items, selectedFromList, commitItems]);
321
+ const removeItem = useCallback((index) => {
322
+ commitItems(items.filter((_, itemIndex) => itemIndex !== index));
323
+ setSelectedFromList([]);
324
+ }, [items, commitItems]);
325
+ const toggleSubitems = useCallback((index) => {
326
+ commitItems(items.map((item, itemIndex) => itemIndex === index
327
+ ? { ...item, includeSubitems: !item.includeSubitems }
328
+ : item));
329
+ setSelectedFromList([]);
330
+ }, [items, commitItems]);
331
+ return (_jsx(ItemCollectionEditor, { items: items, selectedInTree: selectedInTree, onSelectedInTreeChange: setSelectedInTree, selectedFromList: selectedFromList, onSelectedFromListChange: setSelectedFromList, onAddToList: addToList, onRemoveFromList: removeFromList, onAddItem: handleAddItem, onRemoveItem: removeItem, onToggleSubitems: toggleSubitems, language: language, rootItemIds: rootItemId ? [rootItemId] : undefined, selectedItemsLabel: "Selected Items", emptyMessage: "No items selected", emptyHint: "Browse or search to add items", height: 320, localStorageKey: `questionnaire-item-collection-${questionId}` }));
332
+ }
7
333
  /**
8
334
  * QuestionnaireInline - Inline component for displaying a questionnaire
9
335
  *
10
336
  * This is rendered directly inside the AgentTerminal rather than as a modal dialog.
11
337
  * Displays questions with multiple-choice options and optional freetext input.
12
338
  */
13
- export function QuestionnaireInline({ onClose, onCancel, title = "Questionnaire", description, parameters, }) {
339
+ export function QuestionnaireInline({ requestId, agentId, onClose, onCancel, title = "Questionnaire", description, parameters, footerActions, }) {
340
+ const editContext = useEditContext();
341
+ const language = editContext?.currentItemDescriptor?.language || "en";
342
+ const questionsScrollAreaRef = useRef(null);
343
+ const taskId = parameters.taskId?.trim() || undefined;
344
+ const [isHighlighted, setIsHighlighted] = useState(false);
345
+ useEffect(() => {
346
+ // Flash highlight on mount to grab user's attention
347
+ setIsHighlighted(true);
348
+ const highlightTimer = setTimeout(() => {
349
+ setIsHighlighted(false);
350
+ }, 4000);
351
+ return () => {
352
+ clearTimeout(highlightTimer);
353
+ };
354
+ }, [parameters.questions.length, requestId, title]);
14
355
  // State for each question's answers: Map<questionId, { selectedOptions, freetext }>
15
- const [answers, setAnswers] = useState(() => {
16
- const initial = new Map();
17
- // Initialize empty answers for each question
18
- parameters.questions.forEach((q) => {
19
- initial.set(q.id, {
20
- questionId: q.id,
21
- selectedOptions: [],
22
- freetext: undefined,
356
+ const [answers, setAnswers] = useState(() => createInitialAnswers(parameters, requestId ? questionnaireDrafts.get(requestId) : undefined));
357
+ const [pendingFiles, setPendingFiles] = useState(() => createInitialPendingFiles(parameters, requestId ? questionnairePendingFileDrafts.get(requestId) : undefined));
358
+ const [fileUploadErrors, setFileUploadErrors] = useState(() => new Map());
359
+ const [isSubmitting, setIsSubmitting] = useState(false);
360
+ useEffect(() => {
361
+ setAnswers(createInitialAnswers(parameters, requestId ? questionnaireDrafts.get(requestId) : undefined));
362
+ setPendingFiles(createInitialPendingFiles(parameters, requestId ? questionnairePendingFileDrafts.get(requestId) : undefined));
363
+ setFileUploadErrors(new Map());
364
+ setIsSubmitting(false);
365
+ }, [parameters, requestId]);
366
+ useEffect(() => {
367
+ const scrollArea = questionsScrollAreaRef.current;
368
+ if (!scrollArea) {
369
+ return;
370
+ }
371
+ scrollArea.scrollTop = 0;
372
+ }, [requestId, title, description, parameters.questions]);
373
+ useEffect(() => {
374
+ if (!requestId) {
375
+ return;
376
+ }
377
+ questionnaireDrafts.set(requestId, new Map(answers));
378
+ }, [answers, requestId]);
379
+ useEffect(() => {
380
+ if (!requestId) {
381
+ return;
382
+ }
383
+ questionnairePendingFileDrafts.set(requestId, new Map(pendingFiles));
384
+ }, [pendingFiles, requestId]);
385
+ const updateSelectedItems = useCallback((questionId, items) => {
386
+ setAnswers((prev) => {
387
+ const newMap = new Map(prev);
388
+ const currentAnswer = newMap.get(questionId) || createEmptyAnswer(questionId);
389
+ newMap.set(questionId, {
390
+ ...currentAnswer,
391
+ selectedItems: items,
23
392
  });
393
+ return newMap;
24
394
  });
25
- return initial;
26
- });
395
+ }, []);
396
+ const upsertSelectedItem = useCallback((questionId, item, allowMultiple) => {
397
+ setAnswers((prev) => {
398
+ const newMap = new Map(prev);
399
+ const currentAnswer = newMap.get(questionId) || createEmptyAnswer(questionId);
400
+ const existing = currentAnswer.selectedItems ?? [];
401
+ const next = allowMultiple
402
+ ? existing.some((i) => i.id === item.id)
403
+ ? existing
404
+ : [...existing, item]
405
+ : [item];
406
+ newMap.set(questionId, {
407
+ ...currentAnswer,
408
+ selectedItems: next,
409
+ });
410
+ return newMap;
411
+ });
412
+ }, []);
413
+ const updatePendingFiles = useCallback((questionId, files) => {
414
+ setPendingFiles((prev) => {
415
+ const newMap = new Map(prev);
416
+ newMap.set(questionId, files);
417
+ return newMap;
418
+ });
419
+ setFileUploadErrors((prev) => {
420
+ if (!prev.has(questionId)) {
421
+ return prev;
422
+ }
423
+ const newMap = new Map(prev);
424
+ newMap.delete(questionId);
425
+ return newMap;
426
+ });
427
+ }, []);
27
428
  // Toggle option selection for a question
28
429
  const toggleOption = useCallback((questionId, optionId, allowMultiple) => {
29
430
  setAnswers((prev) => {
30
431
  const newMap = new Map(prev);
31
- const currentAnswer = newMap.get(questionId) || {
32
- questionId,
33
- selectedOptions: [],
34
- freetext: undefined,
35
- };
432
+ const currentAnswer = newMap.get(questionId) || createEmptyAnswer(questionId);
36
433
  let newSelectedOptions;
37
434
  if (allowMultiple) {
38
435
  // Multi-select: toggle the option
@@ -63,11 +460,7 @@ export function QuestionnaireInline({ onClose, onCancel, title = "Questionnaire"
63
460
  const updateFreetext = useCallback((questionId, text) => {
64
461
  setAnswers((prev) => {
65
462
  const newMap = new Map(prev);
66
- const currentAnswer = newMap.get(questionId) || {
67
- questionId,
68
- selectedOptions: [],
69
- freetext: undefined,
70
- };
463
+ const currentAnswer = newMap.get(questionId) || createEmptyAnswer(questionId);
71
464
  newMap.set(questionId, {
72
465
  ...currentAnswer,
73
466
  freetext: text || undefined,
@@ -76,64 +469,239 @@ export function QuestionnaireInline({ onClose, onCancel, title = "Questionnaire"
76
469
  });
77
470
  }, []);
78
471
  // Check if a question has been answered (at least one option selected or freetext provided)
79
- const isQuestionAnswered = useCallback((questionId) => {
80
- const answer = answers.get(questionId);
472
+ const isQuestionAnswered = useCallback((question) => {
473
+ if (question.optional)
474
+ return true;
475
+ const answer = answers.get(question.id);
81
476
  if (!answer)
82
477
  return false;
478
+ if (isItemSelectionType(question.type)) {
479
+ return (answer.selectedItems?.length ?? 0) > 0;
480
+ }
481
+ if (isFileUploadType(question.type)) {
482
+ return ((pendingFiles.get(question.id)?.length ?? 0) > 0 ||
483
+ (answer.uploadedDocuments?.length ?? 0) > 0);
484
+ }
83
485
  return (answer.selectedOptions.length > 0 ||
84
486
  (answer.freetext !== undefined && answer.freetext.trim() !== ""));
85
- }, [answers]);
86
- // Check if all questions have been answered
87
- const allQuestionsAnswered = useMemo(() => {
88
- return parameters.questions.every((q) => isQuestionAnswered(q.id));
487
+ }, [answers, pendingFiles]);
488
+ // Check if all required questions have been answered
489
+ const allRequiredQuestionsAnswered = useMemo(() => {
490
+ return parameters.questions.every((q) => q.optional || isQuestionAnswered(q));
89
491
  }, [parameters.questions, isQuestionAnswered]);
90
- // Count answered questions
492
+ // Count actually answered questions (excluding optional auto-pass behavior)
91
493
  const answeredCount = useMemo(() => {
92
- return parameters.questions.filter((q) => isQuestionAnswered(q.id)).length;
494
+ return parameters.questions.filter((q) => {
495
+ const answer = answers.get(q.id);
496
+ if (!answer)
497
+ return false;
498
+ if (isItemSelectionType(q.type)) {
499
+ return (answer.selectedItems?.length ?? 0) > 0;
500
+ }
501
+ if (isFileUploadType(q.type)) {
502
+ return ((pendingFiles.get(q.id)?.length ?? 0) > 0 ||
503
+ (answer.uploadedDocuments?.length ?? 0) > 0);
504
+ }
505
+ return (answer.selectedOptions.length > 0 ||
506
+ (answer.freetext !== undefined && answer.freetext.trim() !== ""));
507
+ }).length;
508
+ }, [parameters.questions, answers, pendingFiles]);
509
+ const requiredQuestionCount = useMemo(() => {
510
+ return parameters.questions.filter((q) => !q.optional).length;
511
+ }, [parameters.questions]);
512
+ const answeredRequiredCount = useMemo(() => {
513
+ return parameters.questions.filter((q) => !q.optional && isQuestionAnswered(q)).length;
93
514
  }, [parameters.questions, isQuestionAnswered]);
94
515
  // Handle submit
95
- const handleSubmit = useCallback(() => {
96
- const result = {
97
- answers: Array.from(answers.values()).filter((a) => a.selectedOptions.length > 0 ||
98
- (a.freetext !== undefined && a.freetext.trim() !== "")),
99
- };
100
- onClose(result);
101
- }, [answers, onClose]);
102
- return (_jsxs("div", { "data-testid": "questionnaire-container", className: "border-t border-gray-200 bg-gradient-to-b from-indigo-50/50 to-white", children: [_jsxs("div", { className: "flex items-center justify-between border-b border-gray-100 px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(ClipboardList, { size: 18, className: "text-indigo-600", strokeWidth: 1.5 }), _jsxs("div", { children: [_jsx("h3", { "data-testid": "questionnaire-title", className: "text-sm font-semibold text-gray-900", children: title }), description && (_jsx("p", { "data-testid": "questionnaire-description", className: "mt-0.5 text-xs text-gray-500", children: description }))] })] }), _jsx("button", { onClick: () => {
103
- onCancel();
104
- }, "data-testid": "questionnaire-cancel-header", className: "rounded-full p-1 transition-colors hover:bg-gray-100", "aria-label": "Cancel", children: _jsx(X, { size: 16, className: "text-gray-400" }) })] }), _jsxs("div", { "data-testid": "questionnaire-progress", className: "flex items-center justify-between bg-gray-50/50 px-4 py-1.5 text-[11px] text-gray-400", children: [_jsxs("span", { children: [answeredCount, " of ", parameters.questions.length, " answered"] }), _jsx("span", { className: allQuestionsAnswered ? "text-green-600" : "text-amber-600", children: allQuestionsAnswered
516
+ const handleSubmit = useCallback(async () => {
517
+ if (isSubmitting) {
518
+ return;
519
+ }
520
+ setIsSubmitting(true);
521
+ setFileUploadErrors(new Map());
522
+ const nextAnswers = [];
523
+ const nextErrors = new Map();
524
+ try {
525
+ for (const question of parameters.questions) {
526
+ const currentAnswer = answers.get(question.id) || createEmptyAnswer(question.id);
527
+ if (!isFileUploadType(question.type)) {
528
+ nextAnswers.push(currentAnswer);
529
+ continue;
530
+ }
531
+ const files = pendingFiles.get(question.id) ?? [];
532
+ if (files.length === 0) {
533
+ nextAnswers.push({
534
+ ...currentAnswer,
535
+ uploadedDocuments: currentAnswer.uploadedDocuments ?? [],
536
+ });
537
+ continue;
538
+ }
539
+ const storeInAgentDocumentStore = shouldStoreInAgentDocumentStore(question);
540
+ const attachToTask = Boolean(question.attachToTaskIfAvailable && taskId);
541
+ if (storeInAgentDocumentStore && !agentId) {
542
+ nextErrors.set(question.id, "File upload to the agent document store is unavailable because no agent is associated with this questionnaire.");
543
+ continue;
544
+ }
545
+ if (!storeInAgentDocumentStore && !attachToTask) {
546
+ nextErrors.set(question.id, "This file upload question is configured without a valid upload destination.");
547
+ continue;
548
+ }
549
+ const uploadedDocuments = [];
550
+ for (const file of files) {
551
+ let uploadedDocument = null;
552
+ if (storeInAgentDocumentStore) {
553
+ const result = await uploadDocument(agentId, file);
554
+ if (!result.success || !result.document) {
555
+ nextErrors.set(question.id, result.error || `Failed to upload "${file.name}".`);
556
+ break;
557
+ }
558
+ uploadedDocument = toUploadedDocumentReference(result.document);
559
+ if (!uploadedDocument) {
560
+ nextErrors.set(question.id, `Failed to capture upload metadata for "${file.name}".`);
561
+ break;
562
+ }
563
+ }
564
+ if (attachToTask) {
565
+ const attachmentResult = await uploadAttachmentFile(taskId, file);
566
+ if (attachmentResult.type !== "success") {
567
+ nextErrors.set(question.id, attachmentResult.details ||
568
+ attachmentResult.summary ||
569
+ `Failed to attach "${file.name}" to the current task.`);
570
+ break;
571
+ }
572
+ if (!uploadedDocument && attachmentResult.data) {
573
+ uploadedDocument = toUploadedDocumentReferenceFromTaskAttachment(attachmentResult.data);
574
+ }
575
+ }
576
+ if (!uploadedDocument) {
577
+ nextErrors.set(question.id, `Failed to capture upload metadata for "${file.name}".`);
578
+ break;
579
+ }
580
+ uploadedDocuments.push(uploadedDocument);
581
+ }
582
+ if (nextErrors.has(question.id)) {
583
+ continue;
584
+ }
585
+ nextAnswers.push({
586
+ ...currentAnswer,
587
+ uploadedDocuments,
588
+ });
589
+ }
590
+ if (nextErrors.size > 0) {
591
+ setFileUploadErrors(nextErrors);
592
+ return;
593
+ }
594
+ if (requestId) {
595
+ questionnaireDrafts.delete(requestId);
596
+ questionnairePendingFileDrafts.delete(requestId);
597
+ }
598
+ const result = {
599
+ answers: nextAnswers.filter((answer) => answer.selectedOptions.length > 0 ||
600
+ (answer.selectedItems?.length ?? 0) > 0 ||
601
+ (answer.uploadedDocuments?.length ?? 0) > 0 ||
602
+ (answer.freetext !== undefined && answer.freetext.trim() !== "")),
603
+ };
604
+ onClose(result);
605
+ }
606
+ finally {
607
+ setIsSubmitting(false);
608
+ }
609
+ }, [
610
+ agentId,
611
+ answers,
612
+ isSubmitting,
613
+ onClose,
614
+ parameters.questions,
615
+ pendingFiles,
616
+ requestId,
617
+ taskId,
618
+ ]);
619
+ const handleCancel = useCallback(() => {
620
+ if (requestId) {
621
+ questionnaireDrafts.delete(requestId);
622
+ questionnairePendingFileDrafts.delete(requestId);
623
+ }
624
+ onCancel();
625
+ }, [onCancel, requestId]);
626
+ return (_jsxs("div", { "data-testid": "questionnaire-container", className: cn("flex h-full min-h-0 flex-col border-t border-gray-200 transition-all duration-1000", isHighlighted
627
+ ? "bg-amber-50 shadow-[0_-8px_25px_rgba(245,158,11,0.15)] ring-2 ring-amber-400/50"
628
+ : "bg-linear-to-b from-indigo-50/50 to-white shadow-none ring-0"), children: [_jsxs("div", { className: cn("flex items-center justify-between border-b px-4 py-3 transition-all duration-1000", isHighlighted
629
+ ? "border-amber-200 bg-amber-200/50"
630
+ : "border-gray-100"), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: cn("transition-all duration-500", isHighlighted ? "scale-110" : "scale-100"), children: isHighlighted ? (_jsx(AlertCircle, { size: 18, className: "text-amber-600" })) : (_jsx(ClipboardList, { size: 18, className: "text-gray-400" })) }), _jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("h3", { "data-testid": "questionnaire-title", className: "text-sm font-semibold text-gray-900", children: title }), isHighlighted && (_jsx("span", { className: "rounded-full bg-amber-500 px-2 py-0.5 text-[9px] font-bold tracking-widest text-white uppercase shadow-sm", children: "Waiting for you" }))] }), description && (_jsx("p", { "data-testid": "questionnaire-description", className: "mt-0.5 text-xs text-gray-500", children: description }))] })] }), _jsx("button", { onClick: () => {
631
+ handleCancel();
632
+ }, "data-testid": "questionnaire-cancel-header", className: cn("rounded-full p-1.5 transition-colors duration-300", isHighlighted
633
+ ? "bg-amber-100 hover:bg-amber-200"
634
+ : "hover:bg-gray-100"), "aria-label": "Cancel", children: _jsx(X, { size: 16, className: isHighlighted ? "text-amber-700" : "text-gray-400" }) })] }), _jsxs("div", { "data-testid": "questionnaire-progress", className: "flex items-center justify-between bg-gray-50/50 px-4 py-1.5 text-[11px] text-gray-400", children: [_jsxs("span", { children: [answeredRequiredCount, " of ", requiredQuestionCount, " required answered"] }), _jsx("span", { className: allRequiredQuestionsAnswered ? "text-green-600" : "text-amber-600", children: allRequiredQuestionsAnswered
105
635
  ? "Ready to submit"
106
- : "Please answer all questions" })] }), _jsx("div", { className: "max-h-[400px] overflow-auto", children: parameters.questions.length === 0 ? (_jsxs("div", { "data-testid": "questionnaire-empty", className: "flex flex-col items-center justify-center py-8 text-gray-400", children: [_jsx(ClipboardList, { size: 32, strokeWidth: 1, className: "mb-2 opacity-50" }), _jsx("p", { className: "text-xs", children: "No questions to display." })] })) : (_jsx("div", { className: "space-y-4 p-4", children: parameters.questions.map((question, index) => {
636
+ : "Please answer all required questions" })] }), _jsx("div", { ref: questionsScrollAreaRef, "data-testid": "questionnaire-scroll-area", className: "min-h-0 flex-1 overflow-auto", children: parameters.questions.length === 0 ? (_jsxs("div", { "data-testid": "questionnaire-empty", className: "flex h-full min-h-[220px] flex-col items-center justify-center py-8 text-gray-400", children: [_jsx(ClipboardList, { size: 32, strokeWidth: 1, className: "mb-2 opacity-50" }), _jsx("p", { className: "text-xs", children: "No questions to display." })] })) : (_jsx("div", { className: "space-y-4 p-4", children: parameters.questions.map((question, index) => {
107
637
  const answer = answers.get(question.id);
108
- const isAnswered = isQuestionAnswered(question.id);
109
- // Auto-enable freetext if options array is empty (defensive handling)
638
+ const isAnswered = isQuestionAnswered(question);
639
+ const isItemPicker = question.type === "item-picker";
640
+ const isItemCollection = question.type === "item-collection";
641
+ const isFileUpload = isFileUploadType(question.type);
642
+ const isItemSelection = isItemPicker || isItemCollection;
643
+ const isStructuredQuestion = isItemSelection || isFileUpload;
644
+ // Auto-enable freetext if options array is empty, but not for structured question types.
110
645
  const hasOptions = question.options && question.options.length > 0;
111
- const effectiveAllowFreetext = question.allowFreetext || !hasOptions;
646
+ const effectiveAllowFreetext = isStructuredQuestion
647
+ ? (question.allowFreetext ?? false)
648
+ : question.allowFreetext || !hasOptions;
649
+ const effectiveRootItemId = question.rootItemId || question.root;
112
650
  return (_jsxs("div", { "data-testid": "questionnaire-question", "data-question-id": question.id, className: `rounded-lg border p-3 transition-colors ${isAnswered
113
651
  ? "border-green-200 bg-green-50/30"
114
- : "border-gray-200 bg-white"}`, children: [_jsxs("div", { className: "mb-2 flex items-start gap-2", children: [_jsx("span", { className: `flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full text-[10px] font-semibold ${isAnswered
652
+ : "border-gray-200 bg-white"}`, children: [_jsxs("div", { className: "mb-2 flex items-start gap-2", children: [_jsx("span", { className: `flex h-5 w-5 shrink-0 items-center justify-center rounded-full text-[10px] font-semibold ${isAnswered
115
653
  ? "bg-green-100 text-green-700"
116
- : "bg-gray-100 text-gray-500"}`, children: index + 1 }), _jsxs("div", { className: "flex-1", children: [_jsx("p", { className: "text-sm font-medium text-gray-800", children: question.prompt }), _jsxs("p", { className: "mt-0.5 text-[10px] text-gray-400", children: [!hasOptions
117
- ? "Open-ended question"
118
- : question.allowMultiple
119
- ? "Select one or more options"
120
- : "Select one option", effectiveAllowFreetext &&
121
- hasOptions &&
122
- " • Freetext allowed"] })] })] }), hasOptions && (_jsx("div", { className: "ml-7 space-y-1", children: question.options.map((option) => {
654
+ : "bg-gray-100 text-gray-500"}`, children: index + 1 }), _jsxs("div", { className: "flex-1", children: [_jsx("p", { className: "text-sm font-medium text-gray-800", children: question.prompt }), _jsxs("p", { className: "mt-0.5 text-[10px] text-gray-400", children: [isItemCollection
655
+ ? "Select items and choose whether to include subitems"
656
+ : isItemPicker
657
+ ? question.allowMultiple
658
+ ? "Select one or more items"
659
+ : "Select one item"
660
+ : isFileUpload
661
+ ? question.allowMultiple
662
+ ? "Upload one or more files"
663
+ : "Upload a file"
664
+ : !hasOptions
665
+ ? "Open-ended question"
666
+ : question.allowMultiple
667
+ ? "Select one or more options"
668
+ : "Select one option", isFileUpload &&
669
+ question.attachToTaskIfAvailable &&
670
+ taskId &&
671
+ " • Also attaches to task", question.optional && " (optional)", effectiveAllowFreetext &&
672
+ (isItemSelection || hasOptions) &&
673
+ " • Freetext allowed"] })] })] }), isItemCollection && (_jsx("div", { className: "mt-2 ml-7", children: _jsx(QuestionnaireItemCollectionField, { questionId: question.id, rootItemId: effectiveRootItemId, answer: answer, language: language, onChange: (items) => updateSelectedItems(question.id, items) }) })), isItemPicker && (_jsxs("div", { className: "mt-2 ml-7", children: [_jsx("div", { className: "h-[250px] overflow-hidden rounded border border-gray-200", children: _jsx(TreeListSelector, { language: language, rootItemIds: effectiveRootItemId
674
+ ? [effectiveRootItemId]
675
+ : undefined, selectedItemIds: (answer?.selectedItems ?? []).map((i) => i.id), selectionMode: question.allowMultiple ? "multiple" : "single", multiSelectRequiresModifier: !question.allowMultiple, onSelectionChange: (items) => {
676
+ const effectiveItems = question.allowMultiple
677
+ ? items
678
+ : items.slice(-1);
679
+ updateSelectedItems(question.id, effectiveItems.map((i) => ({
680
+ id: i.id,
681
+ name: i.displayName || i.name,
682
+ path: i.path,
683
+ })));
684
+ }, onItemSelected: (item) => {
685
+ const id = item.id;
686
+ const name = item.name || item.path || item.id;
687
+ upsertSelectedItem(question.id, { id, name, path: item.path }, question.allowMultiple ?? false);
688
+ }, className: "h-full" }) }), (answer?.selectedItems?.length ?? 0) > 0 && (_jsxs("div", { className: "mt-2 flex flex-wrap gap-1", children: [(answer?.selectedItems ?? [])
689
+ .slice(0, 8)
690
+ .map((i) => (_jsx("span", { className: "rounded border border-gray-200 bg-gray-50 px-1.5 py-0.5 text-[10px] text-gray-600", title: i.path || i.id, children: i.name || i.path || i.id }, i.id))), (answer?.selectedItems?.length ?? 0) > 8 && (_jsxs("span", { className: "px-1.5 py-0.5 text-[10px] text-gray-400", children: ["+", (answer?.selectedItems?.length ?? 0) - 8, " more"] }))] }))] })), isFileUpload && (_jsx("div", { className: "mt-2 ml-7", children: _jsx(QuestionnaireFileUploadField, { questionId: question.id, agentId: agentId, allowMultiple: question.allowMultiple ?? false, selectedFiles: pendingFiles.get(question.id) ?? [], submissionError: fileUploadErrors.get(question.id), disabled: isSubmitting, storeInAgentDocumentStore: question.storeInAgentDocumentStore, attachToTaskIfAvailable: question.attachToTaskIfAvailable, taskId: taskId, onChange: (files) => updatePendingFiles(question.id, files) }) })), !isStructuredQuestion && hasOptions && (_jsx("div", { className: "ml-7 space-y-1", children: question.options.map((option) => {
123
691
  const isSelected = answer?.selectedOptions.includes(option.id) ?? false;
124
692
  return (_jsxs("div", { "data-testid": "questionnaire-option", "data-option-id": option.id, "data-selected": isSelected, className: `flex cursor-pointer items-center gap-2 rounded border px-2 py-1.5 transition-colors ${isSelected
125
693
  ? "border-indigo-200 bg-indigo-50"
126
694
  : "border-transparent hover:bg-gray-50"}`, onClick: () => toggleOption(question.id, option.id, question.allowMultiple ?? false), children: [question.allowMultiple ? (_jsx(Checkbox, { checked: isSelected, onCheckedChange: () => toggleOption(question.id, option.id, question.allowMultiple ?? false), className: "pointer-events-none h-3.5 w-3.5" })) : (_jsx("div", { className: `flex h-3.5 w-3.5 items-center justify-center rounded-full border-2 ${isSelected
127
695
  ? "border-indigo-600 bg-indigo-600"
128
696
  : "border-gray-300"}`, children: isSelected && (_jsx("div", { className: "h-1.5 w-1.5 rounded-full bg-white" })) })), _jsx("span", { className: "flex-1 text-xs text-gray-700", children: option.label })] }, option.id));
129
- }) })), effectiveAllowFreetext && (_jsxs("div", { className: hasOptions ? "ml-7 mt-2" : "ml-7", children: [_jsxs("div", { className: "flex items-center gap-1 text-[10px] text-gray-400", children: [_jsx(MessageSquare, { size: 10 }), _jsx("span", { children: hasOptions
697
+ }) })), effectiveAllowFreetext && (_jsxs("div", { className: hasOptions ? "mt-2 ml-7" : "ml-7", children: [_jsxs("div", { className: "flex items-center gap-1 text-[10px] text-gray-400", children: [_jsx(MessageSquare, { size: 10 }), _jsx("span", { children: hasOptions
130
698
  ? "Additional comments (optional)"
131
699
  : "Your response" })] }), _jsx(Textarea, { "data-testid": "questionnaire-freetext", value: answer?.freetext ?? "", onChange: (e) => updateFreetext(question.id, e.target.value), placeholder: "Enter your response...", className: "mt-1 min-h-[60px] text-xs" })] }))] }, question.id));
132
- }) })) }), _jsxs("div", { className: "flex items-center justify-end gap-2 border-t border-gray-100 bg-gray-50/50 px-4 py-3", children: [_jsx(Button, { variant: "outline", size: "sm", onClick: () => {
133
- onCancel();
134
- }, "data-testid": "questionnaire-cancel", className: "h-8 text-xs", children: "Cancel" }), _jsx(Button, { size: "sm", onClick: handleSubmit, disabled: !allQuestionsAnswered, "data-testid": "questionnaire-submit", className: "h-8 text-xs", children: answeredCount === 0
135
- ? "Submit Answers"
136
- : `Submit ${answeredCount} Answer${answeredCount !== 1 ? "s" : ""}` })] })] }));
700
+ }) })) }), _jsxs("div", { className: "flex items-center justify-end gap-2 border-t border-gray-100 bg-gray-50/50 px-4 py-3", children: [footerActions, _jsx(Button, { variant: "outline", size: "sm", onClick: () => {
701
+ handleCancel();
702
+ }, "data-testid": "questionnaire-cancel", className: "h-8 text-xs", children: "Cancel" }), _jsx(Button, { size: "sm", onClick: () => {
703
+ void handleSubmit();
704
+ }, disabled: !allRequiredQuestionsAnswered || isSubmitting, "data-testid": "questionnaire-submit", className: "h-8 text-xs", children: isSubmitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-1 h-3 w-3 animate-spin" }), "Submitting..."] })) : answeredCount === 0 ? ("Submit Answers") : (`Submit ${answeredCount} Answer${answeredCount !== 1 ? "s" : ""}`) })] })] }));
137
705
  }
138
706
  export default QuestionnaireInline;
139
707
  //# sourceMappingURL=QuestionnaireInline.js.map