@vertesia/ui 1.5.0-dev.20260725.083715Z → 1.5.0-dev.20260806.125520Z

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 (403) hide show
  1. package/lib/core/components/ComboBox.d.ts.map +1 -1
  2. package/lib/core/components/ComboBox.js +4 -4
  3. package/lib/core/components/ComboBox.js.map +1 -1
  4. package/lib/core/components/FileUpload.js.map +1 -1
  5. package/lib/core/components/MenuList.d.ts +2 -1
  6. package/lib/core/components/MenuList.d.ts.map +1 -1
  7. package/lib/core/components/TagsInput.js +1 -1
  8. package/lib/core/components/popup/PopupController.d.ts.map +1 -1
  9. package/lib/core/components/popup/PopupController.js.map +1 -1
  10. package/lib/core/components/popup/position.js.map +1 -1
  11. package/lib/core/components/popup/utils.js.map +1 -1
  12. package/lib/core/components/shadcn/LanguageSwitcher.js.map +1 -1
  13. package/lib/core/components/shadcn/MessageBox.js.map +1 -1
  14. package/lib/core/components/shadcn/Panel.js +1 -1
  15. package/lib/core/components/shadcn/badge.d.ts +2 -2
  16. package/lib/core/components/shadcn/button.d.ts +2 -2
  17. package/lib/core/components/shadcn/button.js +1 -1
  18. package/lib/core/components/shadcn/command.d.ts +4 -4
  19. package/lib/core/components/shadcn/command.d.ts.map +1 -1
  20. package/lib/core/components/shadcn/filters/DynamicLabel.js +1 -1
  21. package/lib/core/components/shadcn/filters/comboBox/DateCombobox.d.ts.map +1 -1
  22. package/lib/core/components/shadcn/filters/comboBox/DateCombobox.js +1 -1
  23. package/lib/core/components/shadcn/filters/comboBox/SelectCombobox.d.ts.map +1 -1
  24. package/lib/core/components/shadcn/filters/comboBox/SelectCombobox.js +1 -1
  25. package/lib/core/components/shadcn/filters/comboBox/StringListCombobox.d.ts.map +1 -1
  26. package/lib/core/components/shadcn/filters/comboBox/TextCombobox.d.ts.map +1 -1
  27. package/lib/core/components/shadcn/filters/filter/dateFilter.js +1 -1
  28. package/lib/core/components/shadcn/filters/filterBar.d.ts.map +1 -1
  29. package/lib/core/components/shadcn/filters/filters.js.map +1 -1
  30. package/lib/core/components/shadcn/input.d.ts +2 -2
  31. package/lib/core/components/shadcn/modal/dialog.d.ts.map +1 -1
  32. package/lib/core/components/shadcn/popover.d.ts +1 -1
  33. package/lib/core/components/shadcn/popover.d.ts.map +1 -1
  34. package/lib/core/components/shadcn/popover.js.map +1 -1
  35. package/lib/core/components/shadcn/radioGroup.d.ts.map +1 -1
  36. package/lib/core/components/shadcn/selectBox.js +1 -1
  37. package/lib/core/components/shadcn/tabs.d.ts.map +1 -1
  38. package/lib/core/components/shadcn/tabs.js +1 -1
  39. package/lib/core/components/shadcn/text.d.ts +2 -2
  40. package/lib/core/components/shadcn/theme/ThemeSwitcher.js.map +1 -1
  41. package/lib/core/components/toast/ToastProvider.js +1 -1
  42. package/lib/core/hooks/CompositeState.d.ts +1 -1
  43. package/lib/core/hooks/CompositeState.d.ts.map +1 -1
  44. package/lib/core/hooks/CompositeState.js.map +1 -1
  45. package/lib/core/hooks/SharedState.d.ts.map +1 -1
  46. package/lib/core/hooks/useFetch.d.ts.map +1 -1
  47. package/lib/core/hooks/useFetch.js +2 -1
  48. package/lib/core/hooks/useFetch.js.map +1 -1
  49. package/lib/core/hooks/useFlag.d.ts.map +1 -1
  50. package/lib/core/hooks/useIntersectionObserver.js.map +1 -1
  51. package/lib/core/hooks/useSafeLayoutEffect.d.ts +2 -2
  52. package/lib/core/hooks/useSafeLayoutEffect.d.ts.map +1 -1
  53. package/lib/core/hooks/useScrollableSearch.d.ts +1 -1
  54. package/lib/core/hooks/useScrollableSearch.d.ts.map +1 -1
  55. package/lib/core/hooks/useScrollableSearch.js +15 -2
  56. package/lib/core/hooks/useScrollableSearch.js.map +1 -1
  57. package/lib/core/hooks/useSharedValue.d.ts.map +1 -1
  58. package/lib/core/hooks/useSharedValue.js.map +1 -1
  59. package/lib/core/utils/a11y.d.ts.map +1 -1
  60. package/lib/env/index.d.ts +4 -0
  61. package/lib/env/index.d.ts.map +1 -1
  62. package/lib/env/index.js.map +1 -1
  63. package/lib/features/agent/PayloadBuilder.d.ts +1 -1
  64. package/lib/features/agent/PayloadBuilder.d.ts.map +1 -1
  65. package/lib/features/agent/PayloadBuilder.js.map +1 -1
  66. package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts +1 -1
  67. package/lib/features/agent/chat/AgentRequestInputOverlay.d.ts.map +1 -1
  68. package/lib/features/agent/chat/AgentRequestInputOverlay.js +3 -8
  69. package/lib/features/agent/chat/AgentRequestInputOverlay.js.map +1 -1
  70. package/lib/features/agent/chat/ArtifactsTab.js +1 -1
  71. package/lib/features/agent/chat/AskUserWidget.js +1 -1
  72. package/lib/features/agent/chat/DocumentEditingActionCard.js +1 -1
  73. package/lib/features/agent/chat/ModernAgentConversation.d.ts +8 -1
  74. package/lib/features/agent/chat/ModernAgentConversation.d.ts.map +1 -1
  75. package/lib/features/agent/chat/ModernAgentConversation.js +79 -20
  76. package/lib/features/agent/chat/ModernAgentConversation.js.map +1 -1
  77. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts +2 -1
  78. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.d.ts.map +1 -1
  79. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js +25 -10
  80. package/lib/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.js.map +1 -1
  81. package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.d.ts.map +1 -1
  82. package/lib/features/agent/chat/ModernAgentOutput/AgentMarkdownAnchor.js.map +1 -1
  83. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.d.ts.map +1 -1
  84. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js +25 -10
  85. package/lib/features/agent/chat/ModernAgentOutput/AllMessagesMixed.js.map +1 -1
  86. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts +7 -0
  87. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.d.ts.map +1 -1
  88. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js +40 -3
  89. package/lib/features/agent/chat/ModernAgentOutput/AttachmentPreview.js.map +1 -1
  90. package/lib/features/agent/chat/ModernAgentOutput/BatchProgressPanel.d.ts.map +1 -1
  91. package/lib/features/agent/chat/ModernAgentOutput/Header.js +2 -2
  92. package/lib/features/agent/chat/ModernAgentOutput/Header.js.map +1 -1
  93. package/lib/features/agent/chat/ModernAgentOutput/InlineSlidingPlanPanel.d.ts.map +1 -1
  94. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts +2 -1
  95. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.d.ts.map +1 -1
  96. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js +2 -2
  97. package/lib/features/agent/chat/ModernAgentOutput/MessageInput.js.map +1 -1
  98. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.d.ts.map +1 -1
  99. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js +2 -2
  100. package/lib/features/agent/chat/ModernAgentOutput/MessageItem.js.map +1 -1
  101. package/lib/features/agent/chat/ModernAgentOutput/ResourceChip.js +1 -1
  102. package/lib/features/agent/chat/ModernAgentOutput/SlideInPanel.js +1 -1
  103. package/lib/features/agent/chat/ModernAgentOutput/StreamingMessage.d.ts.map +1 -1
  104. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.d.ts.map +1 -1
  105. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js +8 -0
  106. package/lib/features/agent/chat/ModernAgentOutput/SummaryConversation.js.map +1 -1
  107. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.d.ts.map +1 -1
  108. package/lib/features/agent/chat/ModernAgentOutput/ToolCallGroup.js +1 -1
  109. package/lib/features/agent/chat/ModernAgentOutput/WorkstreamTabs.js +1 -1
  110. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts +9 -1
  111. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.d.ts.map +1 -1
  112. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js +97 -2
  113. package/lib/features/agent/chat/ModernAgentOutput/requestInputMessages.js.map +1 -1
  114. package/lib/features/agent/chat/ModernAgentOutput/utils.d.ts.map +1 -1
  115. package/lib/features/agent/chat/SlidingThinkingIndicator.js +1 -1
  116. package/lib/features/agent/chat/VegaLiteChart.js +1 -1
  117. package/lib/features/agent/chat/VegaLiteChart.js.map +1 -1
  118. package/lib/features/agent/chat/hooks/useAgentStream.d.ts.map +1 -1
  119. package/lib/features/agent/chat/hooks/useAgentStream.js +38 -3
  120. package/lib/features/agent/chat/hooks/useAgentStream.js.map +1 -1
  121. package/lib/features/agent/chat/hooks/useFileProcessing.d.ts +8 -1
  122. package/lib/features/agent/chat/hooks/useFileProcessing.d.ts.map +1 -1
  123. package/lib/features/agent/chat/hooks/useFileProcessing.js +31 -2
  124. package/lib/features/agent/chat/hooks/useFileProcessing.js.map +1 -1
  125. package/lib/features/agent/chat/index.d.ts +1 -1
  126. package/lib/features/agent/chat/index.d.ts.map +1 -1
  127. package/lib/features/agent/chat/index.js.map +1 -1
  128. package/lib/features/agent/chat/useArtifactUrlCache.js.map +1 -1
  129. package/lib/features/agent/chat/workstreams.d.ts +1 -1
  130. package/lib/features/facets/AgentRunnerFacetsNav.d.ts.map +1 -1
  131. package/lib/features/facets/CollectionsFacetsNav.d.ts.map +1 -1
  132. package/lib/features/facets/DocumentsFacetsNav.d.ts.map +1 -1
  133. package/lib/features/facets/InteractionsFacetsNav.d.ts.map +1 -1
  134. package/lib/features/facets/PromptsFacetsNav.d.ts +8 -6
  135. package/lib/features/facets/PromptsFacetsNav.d.ts.map +1 -1
  136. package/lib/features/facets/PromptsFacetsNav.js +8 -3
  137. package/lib/features/facets/PromptsFacetsNav.js.map +1 -1
  138. package/lib/features/facets/RunsFacetsNav.d.ts.map +1 -1
  139. package/lib/features/facets/WorkflowExecutionsFacetsNav.d.ts.map +1 -1
  140. package/lib/features/magic-pdf/GroundedExtractionView.js +1 -1
  141. package/lib/features/magic-pdf/MagicPdfProvider.d.ts.map +1 -1
  142. package/lib/features/magic-pdf/MagicPdfProvider.js.map +1 -1
  143. package/lib/features/oauth/McpConnectionsButton.js +1 -1
  144. package/lib/features/oauth/OAuthProviderConnectButton.js +1 -1
  145. package/lib/features/oauth/RemoteMcpConnectionButton.js +1 -1
  146. package/lib/features/pdf-viewer/PdfPageRenderer.js +1 -1
  147. package/lib/features/pdf-viewer/PdfPageSlider.js +1 -1
  148. package/lib/features/permissions/UserPermissionsProvider.d.ts.map +1 -1
  149. package/lib/features/permissions/UserPermissionsProvider.js.map +1 -1
  150. package/lib/features/store/collections/CollectionsTable.js +2 -2
  151. package/lib/features/store/collections/CollectionsTable.js.map +1 -1
  152. package/lib/features/store/collections/CreateCollection.js +1 -1
  153. package/lib/features/store/collections/EditCollectionView.js +1 -1
  154. package/lib/features/store/objects/DocumentQuickFilter.js +1 -1
  155. package/lib/features/store/objects/DocumentSelectionProvider.d.ts.map +1 -1
  156. package/lib/features/store/objects/DocumentSelectionProvider.js.map +1 -1
  157. package/lib/features/store/objects/components/ContentDispositionButton.d.ts +2 -1
  158. package/lib/features/store/objects/components/ContentDispositionButton.d.ts.map +1 -1
  159. package/lib/features/store/objects/components/ContentOverview.js +5 -2
  160. package/lib/features/store/objects/components/ContentOverview.js.map +1 -1
  161. package/lib/features/store/objects/components/DocumentEditingPanel.js +1 -1
  162. package/lib/features/store/objects/components/PropertiesEditorModal.js +1 -1
  163. package/lib/features/store/objects/components/TextEditorPanel.js +1 -1
  164. package/lib/features/store/objects/components/documentEditingTarget.d.ts.map +1 -1
  165. package/lib/features/store/objects/components/useContentPanelHooks.d.ts +31 -3
  166. package/lib/features/store/objects/components/useContentPanelHooks.d.ts.map +1 -1
  167. package/lib/features/store/objects/layout/DocumentTableColumn.d.ts +1 -1
  168. package/lib/features/store/objects/layout/DocumentTableColumn.d.ts.map +1 -1
  169. package/lib/features/store/objects/layout/DocumentTableColumn.js.map +1 -1
  170. package/lib/features/store/objects/layout/documentLayout.js +1 -1
  171. package/lib/features/store/objects/layout/renderers.d.ts.map +1 -1
  172. package/lib/features/store/objects/search/DocumentSearchContext.d.ts +129 -7
  173. package/lib/features/store/objects/search/DocumentSearchContext.d.ts.map +1 -1
  174. package/lib/features/store/objects/search/DocumentSearchContext.js.map +1 -1
  175. package/lib/features/store/objects/selection/ObjectsActionContext.d.ts +2 -2
  176. package/lib/features/store/objects/selection/ObjectsActionContext.d.ts.map +1 -1
  177. package/lib/features/store/objects/selection/ObjectsActionContextClass.d.ts.map +1 -1
  178. package/lib/features/store/objects/selection/ObjectsActionContextClass.js.map +1 -1
  179. package/lib/features/store/objects/selection/ObjectsActionSpec.d.ts +2 -2
  180. package/lib/features/store/objects/selection/ObjectsActionSpec.d.ts.map +1 -1
  181. package/lib/features/store/objects/selection/SelectionActions.d.ts +2 -2
  182. package/lib/features/store/objects/selection/SelectionActions.d.ts.map +1 -1
  183. package/lib/features/store/objects/selection/SelectionActions.js +1 -1
  184. package/lib/features/store/objects/selection/actions/ConfirmAction.js +1 -1
  185. package/lib/features/store/objects/selection/actions/DeleteObjectsAction.js +1 -1
  186. package/lib/features/store/objects/selection/actions/StartWorkflowButton.js +1 -1
  187. package/lib/features/store/objects/upload/DocumentUploadModal.js +1 -1
  188. package/lib/features/store/objects/upload/DocumentUploadModal.js.map +1 -1
  189. package/lib/features/store/objects/upload/useSmartFileUploadProcessing.d.ts.map +1 -1
  190. package/lib/features/store/objects/upload/useUploadHandler.d.ts.map +1 -1
  191. package/lib/features/store/types/ContentObjectTypesSearch.js +1 -1
  192. package/lib/features/store/types/IntakePolicyEditor.d.ts +2 -2
  193. package/lib/features/store/types/IntakePolicyEditor.d.ts.map +1 -1
  194. package/lib/features/store/types/IntakePolicyEditor.js +6 -2
  195. package/lib/features/store/types/IntakePolicyEditor.js.map +1 -1
  196. package/lib/features/store/types/IntakePolicyForm.d.ts.map +1 -1
  197. package/lib/features/store/types/IntakePolicyForm.js +2 -2
  198. package/lib/features/store/types/IntakePolicyForm.js.map +1 -1
  199. package/lib/features/store/types/ObjectSchemaEditor.d.ts +2 -2
  200. package/lib/features/store/types/ObjectSchemaEditor.d.ts.map +1 -1
  201. package/lib/features/store/types/SelectContentType.d.ts +2 -2
  202. package/lib/features/store/types/SelectContentType.d.ts.map +1 -1
  203. package/lib/features/store/types/SelectContentType.js.map +1 -1
  204. package/lib/features/store/types/SelectContentTypeModal.d.ts +2 -2
  205. package/lib/features/store/types/SelectContentTypeModal.d.ts.map +1 -1
  206. package/lib/features/store/types/SelectContentTypeModal.js.map +1 -1
  207. package/lib/features/store/types/TableLayoutEditor.d.ts +2 -2
  208. package/lib/features/store/types/TableLayoutEditor.d.ts.map +1 -1
  209. package/lib/features/store/types/TypeRegistry.d.ts +1267 -6
  210. package/lib/features/store/types/TypeRegistry.d.ts.map +1 -1
  211. package/lib/features/store/types/TypeRegistry.js +5 -0
  212. package/lib/features/store/types/TypeRegistry.js.map +1 -1
  213. package/lib/features/store/types/intake-policy-editor.logic.d.ts +9 -1
  214. package/lib/features/store/types/intake-policy-editor.logic.d.ts.map +1 -1
  215. package/lib/features/store/types/intake-policy-editor.logic.js +9 -1
  216. package/lib/features/store/types/intake-policy-editor.logic.js.map +1 -1
  217. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts +1252 -2
  218. package/lib/features/store/types/search/ObjectTypeSearchContext.d.ts.map +1 -1
  219. package/lib/features/store/types/search/ObjectTypeSearchContext.js.map +1 -1
  220. package/lib/features/store/types/typeCatalogCache.d.ts +2 -2
  221. package/lib/features/store/types/typeCatalogCache.d.ts.map +1 -1
  222. package/lib/features/store/types/typeCatalogCache.js +4 -0
  223. package/lib/features/store/types/typeCatalogCache.js.map +1 -1
  224. package/lib/features/user/UserInfo.d.ts +118 -7
  225. package/lib/features/user/UserInfo.d.ts.map +1 -1
  226. package/lib/features/user/UserInfo.js +1 -1
  227. package/lib/features/user/UserInfo.js.map +1 -1
  228. package/lib/features/utils/mimeType.d.ts.map +1 -1
  229. package/lib/features/utils/rendition.js.map +1 -1
  230. package/lib/features/utils/text.js.map +1 -1
  231. package/lib/i18n/locales/ar.json +27 -1
  232. package/lib/i18n/locales/de.json +27 -1
  233. package/lib/i18n/locales/en.json +30 -1
  234. package/lib/i18n/locales/es.json +27 -1
  235. package/lib/i18n/locales/fr.json +27 -1
  236. package/lib/i18n/locales/it.json +27 -1
  237. package/lib/i18n/locales/ja.json +27 -1
  238. package/lib/i18n/locales/ko.json +27 -1
  239. package/lib/i18n/locales/pt.json +27 -1
  240. package/lib/i18n/locales/ru.json +27 -1
  241. package/lib/i18n/locales/tr.json +27 -1
  242. package/lib/i18n/locales/zh-TW.json +27 -1
  243. package/lib/i18n/locales/zh.json +27 -1
  244. package/lib/i18n/rtl.d.ts +1 -1
  245. package/lib/i18n/rtl.d.ts.map +1 -1
  246. package/lib/layout/FullHeightLayout.d.ts +7 -6
  247. package/lib/layout/FullHeightLayout.d.ts.map +1 -1
  248. package/lib/layout/Sidebar.d.ts +1 -1
  249. package/lib/layout/Sidebar.js +1 -1
  250. package/lib/rich-text/EditorToolbar.js +1 -1
  251. package/lib/router/HistoryNavigator.d.ts +2 -2
  252. package/lib/router/HistoryNavigator.d.ts.map +1 -1
  253. package/lib/router/HistoryNavigator.js.map +1 -1
  254. package/lib/router/PathMatcher.d.ts.map +1 -1
  255. package/lib/router/PathMatcher.js.map +1 -1
  256. package/lib/router/PathWithParams.d.ts.map +1 -1
  257. package/lib/router/Redirect.js.map +1 -1
  258. package/lib/router/Route404.js +1 -1
  259. package/lib/router/Router.d.ts.map +1 -1
  260. package/lib/router/Router.js.map +1 -1
  261. package/lib/session/UserSession.d.ts +18 -4
  262. package/lib/session/UserSession.d.ts.map +1 -1
  263. package/lib/session/UserSession.js.map +1 -1
  264. package/lib/session/UserSessionProvider.d.ts +2 -0
  265. package/lib/session/UserSessionProvider.d.ts.map +1 -1
  266. package/lib/session/UserSessionProvider.js +81 -53
  267. package/lib/session/UserSessionProvider.js.map +1 -1
  268. package/lib/session/auth/composable.d.ts +49 -1
  269. package/lib/session/auth/composable.d.ts.map +1 -1
  270. package/lib/session/auth/composable.js +179 -53
  271. package/lib/session/auth/composable.js.map +1 -1
  272. package/lib/shell/VertesiaShell.js +1 -1
  273. package/lib/shell/apps/AppInstallationProvider.d.ts +230 -2
  274. package/lib/shell/apps/AppInstallationProvider.d.ts.map +1 -1
  275. package/lib/shell/apps/AppProjectSelector.js +1 -1
  276. package/lib/shell/login/InviteAcceptModal.js.map +1 -1
  277. package/lib/shell/login/SignInEmailStep.js +1 -1
  278. package/lib/shell/login/SignInPrimitives.d.ts +21 -20
  279. package/lib/shell/login/SignInPrimitives.d.ts.map +1 -1
  280. package/lib/shell/login/SignInPrimitives.js.map +1 -1
  281. package/lib/shell/login/SignInRecoveryStep.d.ts +22 -0
  282. package/lib/shell/login/SignInRecoveryStep.d.ts.map +1 -0
  283. package/lib/shell/login/SignInRecoveryStep.js +59 -0
  284. package/lib/shell/login/SignInRecoveryStep.js.map +1 -0
  285. package/lib/shell/login/SigninScreen.d.ts.map +1 -1
  286. package/lib/shell/login/SigninScreen.js +84 -11
  287. package/lib/shell/login/SigninScreen.js.map +1 -1
  288. package/lib/shell/login/SignupForm.js +1 -1
  289. package/lib/shell/login/TerminalLogin.js +1 -1
  290. package/lib/shell/login/UserSessionMenu.js +1 -1
  291. package/lib/vertesia-ui-core.js +1 -1
  292. package/lib/vertesia-ui-core.js.map +1 -1
  293. package/lib/vertesia-ui-features.js +34 -34
  294. package/lib/vertesia-ui-features.js.map +1 -1
  295. package/lib/vertesia-ui-i18n.js +13 -13
  296. package/lib/vertesia-ui-layout.js.map +1 -1
  297. package/lib/vertesia-ui-rich-text.js.map +1 -1
  298. package/lib/vertesia-ui-router.js.map +1 -1
  299. package/lib/vertesia-ui-session.js +1 -1
  300. package/lib/vertesia-ui-session.js.map +1 -1
  301. package/lib/vertesia-ui-shell.js +1 -1
  302. package/lib/vertesia-ui-shell.js.map +1 -1
  303. package/lib/vertesia-ui-widgets.js +18 -18
  304. package/lib/vertesia-ui-widgets.js.map +1 -1
  305. package/lib/widgets/form/FormContext.d.ts.map +1 -1
  306. package/lib/widgets/form/FormContext.js.map +1 -1
  307. package/lib/widgets/form/ManagedObject.d.ts +2 -2
  308. package/lib/widgets/form/ManagedObject.d.ts.map +1 -1
  309. package/lib/widgets/form/ManagedObject.js.map +1 -1
  310. package/lib/widgets/form/schema.d.ts.map +1 -1
  311. package/lib/widgets/form/schema.js.map +1 -1
  312. package/lib/widgets/json-view/JSONCode.js +1 -1
  313. package/lib/widgets/json-view/JSONTable.js +1 -1
  314. package/lib/widgets/markdown/ArtifactContentRenderer.js.map +1 -1
  315. package/lib/widgets/markdown/CodeBlockPlaceholder.d.ts +1 -1
  316. package/lib/widgets/markdown/CodeBlockPlaceholder.d.ts.map +1 -1
  317. package/lib/widgets/markdown/CodeBlockPlaceholder.js +1 -1
  318. package/lib/widgets/markdown/CodeBlockRendering.d.ts.map +1 -1
  319. package/lib/widgets/markdown/CollaborativeMarkdownRenderer.js +1 -1
  320. package/lib/widgets/markdown/remarkDirectiveHandler.d.ts.map +1 -1
  321. package/lib/widgets/markdown/textDiff.js.map +1 -1
  322. package/lib/widgets/monacoEditor/MonacoEditor.d.ts +7 -1
  323. package/lib/widgets/monacoEditor/MonacoEditor.d.ts.map +1 -1
  324. package/lib/widgets/monacoEditor/MonacoEditor.js +62 -6
  325. package/lib/widgets/monacoEditor/MonacoEditor.js.map +1 -1
  326. package/lib/widgets/schema-editor/ManagedSchema.d.ts.map +1 -1
  327. package/lib/widgets/schema-editor/editor/PropertyEditor.js +1 -1
  328. package/lib/widgets/schema-editor/json-schema4-utils.js.map +1 -1
  329. package/lib/widgets/xml-viewer/components/Elements/index.js +1 -1
  330. package/lib/widgets/xml-viewer/components/Tag/index.js +1 -1
  331. package/lib/widgets/xml-viewer/constants/index.d.ts.map +1 -1
  332. package/lib/widgets/xml-viewer/helpers/index.d.ts +1 -1
  333. package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts +1 -1
  334. package/lib/widgets/xml-viewer/hooks/useCollapsible.d.ts.map +1 -1
  335. package/package.json +33 -33
  336. package/src/core/hooks/useFetch.ts +2 -1
  337. package/src/core/hooks/useScrollableSearch.test.tsx +139 -0
  338. package/src/core/hooks/useScrollableSearch.tsx +17 -3
  339. package/src/env/index.ts +2 -0
  340. package/src/features/agent/chat/AgentChatPlaybackControls.test.tsx +2 -0
  341. package/src/features/agent/chat/AgentRequestInputOverlay.test.tsx +51 -6
  342. package/src/features/agent/chat/AgentRequestInputOverlay.tsx +5 -7
  343. package/src/features/agent/chat/ModernAgentConversation.test.tsx +208 -3
  344. package/src/features/agent/chat/ModernAgentConversation.tsx +130 -25
  345. package/src/features/agent/chat/ModernAgentOutput/ActiveWorkstreamsSummary.tsx +75 -20
  346. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.test.tsx +112 -0
  347. package/src/features/agent/chat/ModernAgentOutput/AllMessagesMixed.tsx +62 -10
  348. package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.test.ts +38 -0
  349. package/src/features/agent/chat/ModernAgentOutput/AttachmentPreview.tsx +62 -4
  350. package/src/features/agent/chat/ModernAgentOutput/Header.tsx +2 -2
  351. package/src/features/agent/chat/ModernAgentOutput/MessageInput.test.tsx +71 -0
  352. package/src/features/agent/chat/ModernAgentOutput/MessageInput.tsx +3 -1
  353. package/src/features/agent/chat/ModernAgentOutput/MessageItem.tsx +18 -4
  354. package/src/features/agent/chat/ModernAgentOutput/SummaryConversation.ts +9 -0
  355. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.test.ts +95 -0
  356. package/src/features/agent/chat/ModernAgentOutput/requestInputMessages.ts +111 -1
  357. package/src/features/agent/chat/ModernAgentOutput/utils.test.ts +21 -0
  358. package/src/features/agent/chat/hooks/useAgentStream.test.tsx +172 -0
  359. package/src/features/agent/chat/hooks/useAgentStream.ts +38 -3
  360. package/src/features/agent/chat/hooks/useFileProcessing.test.tsx +87 -0
  361. package/src/features/agent/chat/hooks/useFileProcessing.ts +32 -1
  362. package/src/features/agent/chat/index.ts +1 -0
  363. package/src/features/facets/PromptsFacetsNav.tsx +17 -9
  364. package/src/features/store/collections/CollectionsTable.tsx +1 -1
  365. package/src/features/store/objects/components/ContentOverview.tsx +4 -1
  366. package/src/features/store/objects/selection/ObjectsActionContext.tsx +2 -2
  367. package/src/features/store/objects/selection/ObjectsActionSpec.ts +2 -2
  368. package/src/features/store/objects/selection/SelectionActions.tsx +2 -2
  369. package/src/features/store/objects/upload/DocumentUploadModal.tsx +2 -2
  370. package/src/features/store/types/IntakePolicyEditor.tsx +12 -4
  371. package/src/features/store/types/IntakePolicyForm.tsx +25 -0
  372. package/src/features/store/types/ObjectSchemaEditor.tsx +2 -2
  373. package/src/features/store/types/SelectContentType.tsx +9 -9
  374. package/src/features/store/types/SelectContentTypeModal.tsx +5 -5
  375. package/src/features/store/types/TableLayoutEditor.tsx +2 -2
  376. package/src/features/store/types/TypeRegistry.ts +8 -3
  377. package/src/features/store/types/intake-policy-editor.logic.ts +10 -2
  378. package/src/features/store/types/typeCatalogCache.ts +10 -3
  379. package/src/i18n/locales/ar.json +27 -1
  380. package/src/i18n/locales/de.json +27 -1
  381. package/src/i18n/locales/en.json +30 -1
  382. package/src/i18n/locales/es.json +27 -1
  383. package/src/i18n/locales/fr.json +27 -1
  384. package/src/i18n/locales/it.json +27 -1
  385. package/src/i18n/locales/ja.json +27 -1
  386. package/src/i18n/locales/ko.json +27 -1
  387. package/src/i18n/locales/pt.json +27 -1
  388. package/src/i18n/locales/ru.json +27 -1
  389. package/src/i18n/locales/tr.json +27 -1
  390. package/src/i18n/locales/zh-TW.json +27 -1
  391. package/src/i18n/locales/zh.json +27 -1
  392. package/src/session/UserSessionProvider.test.ts +69 -0
  393. package/src/session/UserSessionProvider.tsx +96 -60
  394. package/src/session/auth/composable.scope.test.ts +88 -0
  395. package/src/session/auth/composable.test.ts +205 -0
  396. package/src/session/auth/composable.ts +227 -58
  397. package/src/shell/login/InviteAcceptModal.tsx +4 -4
  398. package/src/shell/login/SignInPrimitives.tsx +1 -0
  399. package/src/shell/login/SignInRecoveryStep.test.tsx +112 -0
  400. package/src/shell/login/SignInRecoveryStep.tsx +177 -0
  401. package/src/shell/login/SigninScreen.tsx +145 -27
  402. package/src/widgets/markdown/ArtifactEditingSurface.test.tsx +13 -9
  403. package/src/widgets/monacoEditor/MonacoEditor.tsx +83 -7
@@ -66,6 +66,7 @@ interface MessageInputProps {
66
66
  isCompactingContext?: boolean;
67
67
  activeTaskCount?: number;
68
68
  activeWorkstreams?: WorkstreamInfo[];
69
+ onSelectWorkstream?: (workstreamId: string) => void;
69
70
  placeholder?: string;
70
71
 
71
72
  // File upload props
@@ -133,6 +134,7 @@ export default function MessageInput({
133
134
  isCompactingContext = false,
134
135
  activeTaskCount = 0,
135
136
  activeWorkstreams = [],
137
+ onSelectWorkstream,
136
138
  placeholder,
137
139
  // File upload props
138
140
  onFilesSelected,
@@ -474,7 +476,7 @@ export default function MessageInput({
474
476
  />
475
477
  )}
476
478
 
477
- <ActiveWorkstreamsSummary activeWorkstreams={activeWorkstreams} />
479
+ <ActiveWorkstreamsSummary activeWorkstreams={activeWorkstreams} onSelectWorkstream={onSelectWorkstream} />
478
480
 
479
481
  {/* Input row */}
480
482
  <div className="mx-auto flex max-w-3xl flex-col gap-2 rounded-2xl border border-border/70 bg-mixer-muted/15 p-2.5 shadow-lg shadow-black/5">
@@ -37,7 +37,7 @@ import { createAgentMarkdownAnchor } from './AgentMarkdownAnchor';
37
37
  import { AttachmentPreviewList, parseUserMessageAttachments } from './AttachmentPreview';
38
38
  import { MessageDeliveryStatus } from './MessageDeliveryStatus';
39
39
  import { processContentForMarkdown } from './processContentForMarkdown';
40
- import { getToolApprovalResponseMetadata } from './requestInputMessages';
40
+ import { getToolApprovalResponseMetadata, sendRequestInputResponse } from './requestInputMessages';
41
41
  import { getWorkstreamId } from './utils';
42
42
 
43
43
  /** className overrides for MessageItem — single source of truth for all className overrides. */
@@ -625,13 +625,27 @@ function MessageItemComponent({
625
625
  variant={askUserUx.variant}
626
626
  multiSelect={askUserUx.multiSelect}
627
627
  onSelect={(optionId) =>
628
- onSendMessage?.(optionId, getToolApprovalResponseMetadata(message, optionId))
628
+ sendRequestInputResponse(
629
+ onSendMessage,
630
+ message,
631
+ optionId,
632
+ getToolApprovalResponseMetadata(message, optionId),
633
+ )
634
+ }
635
+ onMultiSelect={(optionIds) =>
636
+ sendRequestInputResponse(onSendMessage, message, optionIds.join(', '))
629
637
  }
630
- onMultiSelect={(optionIds) => onSendMessage?.(optionIds.join(', '))}
631
638
  allowFreeResponse={!askUserUx.options?.length || !!askUserUx.free_response}
632
639
  placeholder={askUserUx.free_response?.placeholder}
633
640
  submitLabel={askUserUx.free_response?.submit_label}
634
- onSubmit={(value) => onSendMessage?.(value, askUserUx.free_response?.metadata)}
641
+ onSubmit={(value) =>
642
+ sendRequestInputResponse(
643
+ onSendMessage,
644
+ message,
645
+ value,
646
+ askUserUx.free_response?.metadata,
647
+ )
648
+ }
635
649
  hideBorder
636
650
  compact
637
651
  answered={requestInputAnswered}
@@ -181,12 +181,21 @@ function isWorkstreamActivityFailureMessage(message: AgentMessage): boolean {
181
181
  tool_event?: unknown;
182
182
  tool_run_id?: unknown;
183
183
  tool_status?: unknown;
184
+ workstream_id?: unknown;
184
185
  workstream_event?: unknown;
185
186
  }
186
187
  | undefined;
187
188
 
188
189
  if (details?.event_class !== 'activity') return false;
189
190
  if (details.workstream_event) return false;
191
+ const workstreamId =
192
+ typeof message.workstream_id === 'string' && message.workstream_id.trim()
193
+ ? message.workstream_id.trim()
194
+ : typeof details.workstream_id === 'string'
195
+ ? details.workstream_id.trim()
196
+ : '';
197
+ const normalizedWorkstreamId = workstreamId.toLowerCase();
198
+ if (!workstreamId || normalizedWorkstreamId === 'main' || normalizedWorkstreamId === 'all') return false;
190
199
 
191
200
  return !(
192
201
  details.tool ||
@@ -1,9 +1,16 @@
1
1
  import { type AgentMessage, AgentMessageType } from '@vertesia/common';
2
2
  import { describe, expect, it } from 'vitest';
3
3
  import {
4
+ clearRequestInputIdAnsweredForSession,
5
+ getAnsweredRequestInputKeys,
4
6
  getAnsweredToolApprovalRequestInputKeys,
7
+ getPendingRequestInputMessage,
5
8
  getRequestInputMessageKey,
9
+ getRequestInputResponseIdFromMetadata,
10
+ getRequestInputResponseMetadata,
6
11
  getToolApprovalResponseMetadata,
12
+ isRequestInputAnsweredForSession,
13
+ markRequestInputIdAnsweredForSession,
7
14
  } from './requestInputMessages';
8
15
 
9
16
  const APPROVAL_KEY = 'create_interaction:name:JDE AR Payment Processing Agent';
@@ -78,3 +85,91 @@ describe('getAnsweredToolApprovalRequestInputKeys', () => {
78
85
  expect(answered.size).toBe(0);
79
86
  });
80
87
  });
88
+
89
+ describe('request input correlation', () => {
90
+ it('does not apply session acknowledgement to non-request-input messages with the same id', () => {
91
+ const agentRunId = 'agent-run-1';
92
+ const requestId = 'request-1';
93
+ const request = {
94
+ ...makeApprovalRequest(),
95
+ details: { request_id: requestId, ux: { options: [{ id: 'allow_once' }] } },
96
+ };
97
+ const unrelatedMessage = {
98
+ ...makeUserAnswer('Still working'),
99
+ details: { request_id: requestId },
100
+ };
101
+
102
+ markRequestInputIdAnsweredForSession(agentRunId, requestId);
103
+
104
+ expect(isRequestInputAnsweredForSession(agentRunId, request)).toBe(true);
105
+ expect(isRequestInputAnsweredForSession(agentRunId, unrelatedMessage)).toBe(false);
106
+
107
+ clearRequestInputIdAnsweredForSession(agentRunId, requestId);
108
+ });
109
+
110
+ it('correlates a persisted response to the matching request id', () => {
111
+ const firstRequest = {
112
+ ...makeApprovalRequest(),
113
+ details: { request_id: 'request-1', ux: { options: [{ id: 'red', label: 'Red' }] } },
114
+ };
115
+ const secondRequest = {
116
+ ...makeApprovalRequest(),
117
+ timestamp: 2,
118
+ details: { request_id: 'request-2', ux: { options: [{ id: 'blue', label: 'Blue' }] } },
119
+ };
120
+ const answer = {
121
+ ...makeUserAnswer('red'),
122
+ timestamp: 3,
123
+ details: { request_input_response: { request_id: 'request-1' } },
124
+ };
125
+
126
+ const answered = getAnsweredRequestInputKeys([firstRequest, secondRequest, answer]);
127
+
128
+ expect(answered.has(getRequestInputMessageKey(firstRequest))).toBe(true);
129
+ expect(answered.has(getRequestInputMessageKey(secondRequest))).toBe(false);
130
+ expect(getPendingRequestInputMessage([firstRequest, secondRequest, answer])).toBe(secondRequest);
131
+ });
132
+
133
+ it('adds the request id without discarding existing response metadata', () => {
134
+ const request = {
135
+ ...makeApprovalRequest(),
136
+ details: { request_id: 'request-1', ux: { options: [{ id: 'red', label: 'Red' }] } },
137
+ };
138
+
139
+ expect(getRequestInputResponseMetadata(request, { source: 'free-response' })).toEqual({
140
+ source: 'free-response',
141
+ request_input_response: { request_id: 'request-1' },
142
+ });
143
+ });
144
+
145
+ it('does not let an earlier response resolve a later prompt that reused its request id', () => {
146
+ const firstRequest = {
147
+ ...makeApprovalRequest(),
148
+ details: { request_id: 'reused-request', ux: { options: [{ id: 'allow_once' }] } },
149
+ };
150
+ const firstAnswer = {
151
+ ...makeUserAnswer('allow_once'),
152
+ details: { request_input_response: { request_id: 'reused-request' } },
153
+ };
154
+ const secondRequest = {
155
+ ...makeApprovalRequest(),
156
+ timestamp: 3,
157
+ details: { request_id: 'reused-request', ux: { options: [{ id: 'allow_once' }] } },
158
+ };
159
+
160
+ const answered = getAnsweredRequestInputKeys([firstRequest, firstAnswer, secondRequest]);
161
+
162
+ expect(answered.has(getRequestInputMessageKey(firstRequest))).toBe(true);
163
+ expect(answered.has(getRequestInputMessageKey(secondRequest))).toBe(false);
164
+ expect(getPendingRequestInputMessage([firstRequest, firstAnswer, secondRequest])).toBe(secondRequest);
165
+ });
166
+
167
+ it('reads a request id from response metadata', () => {
168
+ expect(
169
+ getRequestInputResponseIdFromMetadata({
170
+ request_input_response: { request_id: 'request-1' },
171
+ }),
172
+ ).toBe('request-1');
173
+ expect(getRequestInputResponseIdFromMetadata({ request_input_response: {} })).toBeUndefined();
174
+ });
175
+ });
@@ -96,6 +96,65 @@ export function getRequestInputMessageKey(message: AgentMessage): string {
96
96
  .join('|');
97
97
  }
98
98
 
99
+ export function getRequestInputId(message: AgentMessage): string | undefined {
100
+ const details = message.details as Record<string, unknown> | undefined;
101
+ const requestId = details?.request_id ?? details?.tool_use_id;
102
+ return typeof requestId === 'string' && requestId ? requestId : undefined;
103
+ }
104
+
105
+ export function getRequestInputResolutionKey(message: AgentMessage): string {
106
+ return getRequestInputId(message) ?? getRequestInputMessageKey(message);
107
+ }
108
+
109
+ const ANSWERED_REQUEST_INPUT_STORAGE_PREFIX = 'vertesia:answered-request-input:';
110
+
111
+ function getAnsweredRequestInputStorageKey(agentRunId: string, requestId: string): string {
112
+ return `${ANSWERED_REQUEST_INPUT_STORAGE_PREFIX}${agentRunId}:${requestId}`;
113
+ }
114
+
115
+ export function markRequestInputIdAnsweredForSession(agentRunId: string, requestId: string): void {
116
+ if (typeof window === 'undefined') return;
117
+
118
+ try {
119
+ window.sessionStorage.setItem(getAnsweredRequestInputStorageKey(agentRunId, requestId), '1');
120
+ } catch {
121
+ // Session storage can be unavailable in privacy-restricted browser contexts.
122
+ }
123
+ }
124
+
125
+ export function clearRequestInputIdAnsweredForSession(agentRunId: string, requestId: string): void {
126
+ if (typeof window === 'undefined') return;
127
+
128
+ try {
129
+ window.sessionStorage.removeItem(getAnsweredRequestInputStorageKey(agentRunId, requestId));
130
+ } catch {
131
+ // Session storage can be unavailable in privacy-restricted browser contexts.
132
+ }
133
+ }
134
+
135
+ export function isRequestInputAnsweredForSession(agentRunId: string, message: AgentMessage): boolean {
136
+ if (message.type !== AgentMessageType.REQUEST_INPUT) return false;
137
+
138
+ const requestId = getRequestInputId(message);
139
+ if (!requestId || typeof window === 'undefined') return false;
140
+
141
+ try {
142
+ return window.sessionStorage.getItem(getAnsweredRequestInputStorageKey(agentRunId, requestId)) === '1';
143
+ } catch {
144
+ return false;
145
+ }
146
+ }
147
+
148
+ function getRequestInputResponseId(message: AgentMessage): string | undefined {
149
+ if (message.type !== AgentMessageType.QUESTION) return undefined;
150
+
151
+ const details = getRecord(message.details);
152
+ const metadata = getRecord(details?.metadata);
153
+ const response = getRecord(details?.request_input_response) ?? getRecord(metadata?.request_input_response);
154
+ const requestId = response?.request_id;
155
+ return typeof requestId === 'string' && requestId ? requestId : undefined;
156
+ }
157
+
99
158
  export function getRequestInputAnswerMessageKey(message: AgentMessage): string {
100
159
  const details = message.details as Record<string, unknown> | undefined;
101
160
  const keyParts = [
@@ -114,10 +173,22 @@ export function getRequestInputAnswerMessageKey(message: AgentMessage): string {
114
173
 
115
174
  export function getAnsweredRequestInputKeys(messages: AgentMessage[]): Set<string> {
116
175
  const answered = new Set<string>();
176
+ const latestResponseIndexByRequestId = new Map<string, number>();
177
+ messages.forEach((message, index) => {
178
+ const requestId = getRequestInputResponseId(message);
179
+ if (requestId) latestResponseIndexByRequestId.set(requestId, index);
180
+ });
117
181
 
118
182
  messages.forEach((message, index) => {
119
183
  if (message.type !== AgentMessageType.REQUEST_INPUT) return;
120
184
 
185
+ const requestId = getRequestInputId(message);
186
+ const correlatedResponseIndex = requestId ? latestResponseIndexByRequestId.get(requestId) : undefined;
187
+ if (correlatedResponseIndex !== undefined && correlatedResponseIndex > index) {
188
+ answered.add(getRequestInputMessageKey(message));
189
+ return;
190
+ }
191
+
121
192
  const workstreamId = getWorkstreamId(message);
122
193
  for (let nextIndex = index + 1; nextIndex < messages.length; nextIndex += 1) {
123
194
  const nextMessage = messages[nextIndex];
@@ -125,7 +196,9 @@ export function getAnsweredRequestInputKeys(messages: AgentMessage[]): Set<strin
125
196
 
126
197
  if (nextMessage.type === AgentMessageType.REQUEST_INPUT) break;
127
198
  if (nextMessage.type === AgentMessageType.QUESTION) {
128
- answered.add(getRequestInputMessageKey(message));
199
+ if (!getRequestInputResponseId(nextMessage)) {
200
+ answered.add(getRequestInputMessageKey(message));
201
+ }
129
202
  break;
130
203
  }
131
204
  }
@@ -134,6 +207,41 @@ export function getAnsweredRequestInputKeys(messages: AgentMessage[]): Set<strin
134
207
  return answered;
135
208
  }
136
209
 
210
+ export function getRequestInputResponseMetadata(
211
+ message: AgentMessage,
212
+ metadata?: Record<string, unknown>,
213
+ ): Record<string, unknown> | undefined {
214
+ const requestId = getRequestInputId(message);
215
+ if (!requestId) return metadata;
216
+
217
+ return {
218
+ ...metadata,
219
+ request_input_response: { request_id: requestId },
220
+ };
221
+ }
222
+
223
+ export function sendRequestInputResponse(
224
+ onSendMessage: ((message: string, metadata?: Record<string, unknown>) => void) | undefined,
225
+ requestMessage: AgentMessage,
226
+ response: string,
227
+ metadata?: Record<string, unknown>,
228
+ ): void {
229
+ if (!onSendMessage) return;
230
+
231
+ const responseMetadata = getRequestInputResponseMetadata(requestMessage, metadata);
232
+ if (responseMetadata) {
233
+ onSendMessage(response, responseMetadata);
234
+ } else {
235
+ onSendMessage(response);
236
+ }
237
+ }
238
+
239
+ export function getRequestInputResponseIdFromMetadata(metadata?: Record<string, unknown>): string | undefined {
240
+ const response = getRecord(metadata?.request_input_response);
241
+ const requestId = response?.request_id;
242
+ return typeof requestId === 'string' && requestId ? requestId : undefined;
243
+ }
244
+
137
245
  export function getResolvedToolApprovalKeys(messages: AgentMessage[]): Set<string> {
138
246
  const resolved = new Set<string>();
139
247
 
@@ -300,6 +408,7 @@ export function isRequestInputAnswered(message: AgentMessage, answeredRequestInp
300
408
  export function getPendingRequestInputMessage(
301
409
  messages: AgentMessage[],
302
410
  workstreamId = 'main',
411
+ locallyAnsweredRequestInputKeys?: ReadonlySet<string>,
303
412
  ): RequestInputMessageWithUx | undefined {
304
413
  const answeredRequestInputKeys = getAnsweredRequestInputKeys(messages);
305
414
  const resolvedToolApprovalKeys = getResolvedToolApprovalKeys(messages);
@@ -308,6 +417,7 @@ export function getPendingRequestInputMessage(
308
417
  const message = messages[index];
309
418
  if (!hasRequestInputUx(message)) continue;
310
419
  if (getWorkstreamId(message) !== workstreamId) continue;
420
+ if (locallyAnsweredRequestInputKeys?.has(getRequestInputResolutionKey(message))) continue;
311
421
  if (isRequestInputAnswered(message, answeredRequestInputKeys)) continue;
312
422
  if (isRequestInputResolvedByToolApprovalEvent(message, resolvedToolApprovalKeys)) continue;
313
423
  return message;
@@ -576,6 +576,27 @@ describe('ModernAgentOutput summary conversation items', () => {
576
576
  ]);
577
577
  });
578
578
 
579
+ it('keeps a main-workstream activity error visible as a primary message', () => {
580
+ const question = makeMessage({
581
+ timestamp: 1000,
582
+ type: AgentMessageType.QUESTION,
583
+ message: 'do the thing',
584
+ });
585
+ const terminationError = makeMessage({
586
+ timestamp: 1100,
587
+ type: AgentMessageType.ERROR,
588
+ message: 'Stopped: the agent called create_document with the same input 4 times in a row.',
589
+ details: { event_class: 'activity' },
590
+ });
591
+
592
+ const items = buildSummaryConversationItems([question, terminationError], true);
593
+
594
+ expect(items).toEqual([
595
+ { type: 'message', message: question },
596
+ { type: 'message', message: terminationError },
597
+ ]);
598
+ });
599
+
579
600
  it('hides transient thinking once the work segment completes', () => {
580
601
  const tool = makeMessage({
581
602
  timestamp: 1000,
@@ -312,6 +312,68 @@ describe('useAgentStream', () => {
312
312
  expect(onMessage).toHaveBeenCalledTimes(1);
313
313
  });
314
314
 
315
+ it('does not apply replayed file_processing snapshots to server file updates', async () => {
316
+ let deliver: ((message: AgentMessage) => void) | undefined;
317
+ const fileSnapshot = (timestamp: number, id: string): AgentMessage => ({
318
+ timestamp,
319
+ workflow_run_id: 'run-1',
320
+ type: AgentMessageType.SYSTEM,
321
+ message: '',
322
+ workstream_id: 'main',
323
+ details: {
324
+ system_type: 'file_processing',
325
+ batch_id: 'batch-1',
326
+ files: [
327
+ {
328
+ id,
329
+ name: `${id}.pdf`,
330
+ content_type: 'application/pdf',
331
+ size: 1,
332
+ status: FileProcessingStatus.READY,
333
+ artifact_path: `files/${id}.pdf`,
334
+ reference: `artifact:files/${id}.pdf`,
335
+ started_at: timestamp,
336
+ },
337
+ ],
338
+ pending_count: 0,
339
+ ready_count: 1,
340
+ error_count: 0,
341
+ },
342
+ });
343
+ const historical = fileSnapshot(1_000, 'old-upload');
344
+ const streamMessages = vi.fn<
345
+ (
346
+ id: string,
347
+ onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
348
+ since?: number,
349
+ signal?: AbortSignal,
350
+ options?: AgentRunStreamMessagesOptions,
351
+ ) => Promise<unknown>
352
+ >(async (_id, onMessage, _since, _signal, options) => {
353
+ deliver = onMessage;
354
+ options?.onHistoryLoaded?.([historical]);
355
+ // Completed runs replay archived file_processing snapshots through the
356
+ // live callback; applying them would rehydrate every historical upload
357
+ // as a staged composer chip on reopen.
358
+ onMessage?.(historical);
359
+ return null;
360
+ });
361
+ const client = createClient(streamMessages);
362
+ const { result } = renderHook(() => useAgentStream(client, 'agent-run-1', vi.fn()));
363
+
364
+ await waitFor(() => expect(deliver).toBeDefined());
365
+ // History hydrates the latest archived inventory once so an unconsumed staged file
366
+ // survives a reload; the live replay of that same snapshot is ignored, leaving the
367
+ // hydrated entry untouched. Already-delivered files are dropped downstream by
368
+ // useFileProcessing (consumed_at + delivered artifact refs), not by refusing to hydrate.
369
+ expect(result.current.serverFileUpdates.size).toBe(1);
370
+ expect(result.current.serverFileUpdates.has('old-upload')).toBe(true);
371
+
372
+ act(() => deliver?.(fileSnapshot(1_100, 'new-upload')));
373
+ expect(result.current.serverFileUpdates.size).toBe(1);
374
+ expect(result.current.serverFileUpdates.has('new-upload')).toBe(true);
375
+ });
376
+
315
377
  it('marks initial history as errored when the history fetch fails', async () => {
316
378
  const streamMessages = vi.fn<
317
379
  (
@@ -786,4 +848,114 @@ describe('useAgentStream', () => {
786
848
 
787
849
  expect(result.current.serverFileUpdates.has('file-1')).toBe(false);
788
850
  });
851
+
852
+ it('hydrates the latest historical file snapshot once and ignores its live replay', async () => {
853
+ let deliver: ((message: AgentMessage) => void) | undefined;
854
+ const fileSnapshot = (timestamp: number, id: string): AgentMessage => ({
855
+ timestamp,
856
+ workflow_run_id: 'run-1',
857
+ type: AgentMessageType.SYSTEM,
858
+ message: '',
859
+ workstream_id: 'main',
860
+ details: {
861
+ system_type: 'file_processing',
862
+ batch_id: 'batch-1',
863
+ files: [
864
+ {
865
+ id,
866
+ name: `${id}.pdf`,
867
+ content_type: 'application/pdf',
868
+ size: 1,
869
+ status: FileProcessingStatus.READY,
870
+ artifact_path: `files/${id}.pdf`,
871
+ reference: `artifact:files/${id}.pdf`,
872
+ started_at: timestamp,
873
+ },
874
+ ],
875
+ pending_count: 0,
876
+ ready_count: 1,
877
+ error_count: 0,
878
+ },
879
+ });
880
+ const olderHistorical = fileSnapshot(1_000, 'older-upload');
881
+ const latestHistorical = fileSnapshot(1_100, 'staged-upload');
882
+ const streamMessages = vi.fn<
883
+ (
884
+ id: string,
885
+ onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
886
+ since?: number,
887
+ signal?: AbortSignal,
888
+ options?: AgentRunStreamMessagesOptions,
889
+ ) => Promise<unknown>
890
+ >(async (_id, onMessage, _since, _signal, options) => {
891
+ deliver = onMessage;
892
+ options?.onHistoryLoaded?.([olderHistorical, latestHistorical]);
893
+ // Completed runs replay archived file_processing snapshots through the
894
+ // live callback. Replaying the older snapshot must not replace the latest
895
+ // inventory selected from history.
896
+ onMessage?.(olderHistorical);
897
+ return null;
898
+ });
899
+ const client = createClient(streamMessages);
900
+ const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
901
+
902
+ await waitFor(() => expect(deliver).toBeDefined());
903
+ expect(result.current.serverFileUpdates.size).toBe(1);
904
+ expect(result.current.serverFileUpdates.has('staged-upload')).toBe(true);
905
+
906
+ act(() => deliver?.(fileSnapshot(1_200, 'new-upload')));
907
+ expect(result.current.serverFileUpdates.size).toBe(1);
908
+ expect(result.current.serverFileUpdates.has('new-upload')).toBe(true);
909
+ });
910
+
911
+ it('selects the newest historical file snapshot even when history arrives out of order', async () => {
912
+ let deliver: ((message: AgentMessage) => void) | undefined;
913
+ const fileSnapshot = (timestamp: number, id: string): AgentMessage => ({
914
+ timestamp,
915
+ workflow_run_id: 'run-1',
916
+ type: AgentMessageType.SYSTEM,
917
+ message: '',
918
+ workstream_id: 'main',
919
+ details: {
920
+ system_type: 'file_processing',
921
+ batch_id: 'batch-1',
922
+ files: [
923
+ {
924
+ id,
925
+ name: `${id}.pdf`,
926
+ content_type: 'application/pdf',
927
+ size: 1,
928
+ status: FileProcessingStatus.READY,
929
+ artifact_path: `files/${id}.pdf`,
930
+ reference: `artifact:files/${id}.pdf`,
931
+ started_at: timestamp,
932
+ },
933
+ ],
934
+ pending_count: 0,
935
+ ready_count: 1,
936
+ error_count: 0,
937
+ },
938
+ });
939
+ const streamMessages = vi.fn<
940
+ (
941
+ id: string,
942
+ onMessage?: (message: AgentMessage, exitFn?: (payload: unknown) => void) => void,
943
+ since?: number,
944
+ signal?: AbortSignal,
945
+ options?: AgentRunStreamMessagesOptions,
946
+ ) => Promise<unknown>
947
+ >(async (_id, onMessage, _since, _signal, options) => {
948
+ deliver = onMessage;
949
+ // retrieveMessages returns GET /updates unsorted, so the newest snapshot is not
950
+ // necessarily last. Selection must be by timestamp, not arrival order.
951
+ options?.onHistoryLoaded?.([fileSnapshot(1_100, 'staged-upload'), fileSnapshot(1_000, 'older-upload')]);
952
+ return null;
953
+ });
954
+ const client = createClient(streamMessages);
955
+ const { result } = renderHook(() => useAgentStream(client, 'agent-run-1'));
956
+
957
+ await waitFor(() => expect(deliver).toBeDefined());
958
+ expect(result.current.serverFileUpdates.size).toBe(1);
959
+ expect(result.current.serverFileUpdates.has('staged-upload')).toBe(true);
960
+ });
789
961
  });
@@ -357,9 +357,12 @@ export function useAgentStream(
357
357
  (message) => {
358
358
  if (abortController.signal.aborted) return;
359
359
  // Completed and idle runs replay their archived history through the live
360
- // stream. Only forward genuinely new deliveries so onMessage consumers
360
+ // stream. Track replay status once, before the cursor advances below —
361
+ // every replay-sensitive consumer in this callback must use it.
362
+ const isReplay = Boolean(message.timestamp && message.timestamp <= lastDeliveredTsRef.current);
363
+ // Only forward genuinely new deliveries so onMessage consumers
361
364
  // never treat replayed events as fresh ones.
362
- if (!message.timestamp || message.timestamp > lastDeliveredTsRef.current) {
365
+ if (!isReplay) {
363
366
  onMessageRef.current?.(message);
364
367
  }
365
368
 
@@ -426,7 +429,13 @@ export function useAgentStream(
426
429
  if (message.type === AgentMessageType.SYSTEM) {
427
430
  const details = message.details as FileProcessingDetails | undefined;
428
431
  if (details?.system_type === 'file_processing' && details.files) {
429
- setServerFileUpdates(new Map(details.files.map((file) => [file.id, file])));
432
+ // Replayed snapshots list every file ever uploaded to the run as
433
+ // READY; applying them on reconnect would rehydrate historical
434
+ // uploads as staged composer chips. Only genuinely new updates
435
+ // may touch the file state.
436
+ if (!isReplay) {
437
+ setServerFileUpdates(new Map(details.files.map((file) => [file.id, file])));
438
+ }
430
439
  return;
431
440
  }
432
441
  // Other SYSTEM messages fall through to normal handling
@@ -467,13 +476,39 @@ export function useAgentStream(
467
476
  onHistoryLoaded: (historical) => {
468
477
  if (abortController.signal.aborted) return;
469
478
  const timelineMessages = historical.filter(shouldStoreTimelineMessage);
479
+ let latestFileSnapshot: FileProcessingDetails | undefined;
480
+ let latestFileSnapshotTs = Number.NEGATIVE_INFINITY;
470
481
  // Advance the watermark synchronously before React processes the
471
482
  // history state update. Some completed streams replay history via
472
483
  // the live callback immediately after onHistoryLoaded returns.
484
+ // Must cover every historical message, not just the timeline subset:
485
+ // file_processing snapshots are excluded from timelineMessages, so
486
+ // scanning only that subset would leave the cursor behind them and
487
+ // the replay guard would never fire for a file-only history.
473
488
  for (const message of historical) {
474
489
  if (message.timestamp && message.timestamp > lastDeliveredTsRef.current) {
475
490
  lastDeliveredTsRef.current = message.timestamp;
476
491
  }
492
+ if (message.type === AgentMessageType.SYSTEM) {
493
+ const details = message.details as FileProcessingDetails | undefined;
494
+ if (details?.system_type === 'file_processing' && details.files) {
495
+ // GET /updates is returned unsorted (the client only ever
496
+ // takes a Math.max over timestamps), so select the newest
497
+ // snapshot by timestamp instead of trusting arrival order.
498
+ // >= keeps last-wins for ties and for untimestamped messages.
499
+ const timestamp = message.timestamp ?? Number.NEGATIVE_INFINITY;
500
+ if (!latestFileSnapshot || timestamp >= latestFileSnapshotTs) {
501
+ latestFileSnapshot = details;
502
+ latestFileSnapshotTs = timestamp;
503
+ }
504
+ }
505
+ }
506
+ }
507
+ // Hydrate the latest archived inventory once so an unconsumed staged file
508
+ // remains visible after reload. Subsequent live-callback replay is ignored
509
+ // by isReplay above, while useFileProcessing filters consumed/delivered files.
510
+ if (latestFileSnapshot) {
511
+ setServerFileUpdates(new Map(latestFileSnapshot.files.map((file) => [file.id, file])));
477
512
  }
478
513
  debugAgentChat('history loaded', {
479
514
  agentRunId,