@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
@@ -60,6 +60,7 @@ vi.mock('./ModernAgentOutput/MessageInput', () => ({
60
60
  onSend: (message: string) => void;
61
61
  activeTaskCount?: number;
62
62
  activeWorkstreams?: Array<{ workstream_id: string; status: string }>;
63
+ onSelectWorkstream?: (workstreamId: string) => void;
63
64
  isCompleted?: boolean;
64
65
  isStreaming?: boolean;
65
66
  placeholder?: string;
@@ -90,6 +91,7 @@ vi.mock('./ModernAgentOutput/AllMessagesMixed', async () => {
90
91
  return {
91
92
  default: ({
92
93
  messages,
94
+ workstreamSourceMessages,
93
95
  streamingMessages,
94
96
  isCompleted,
95
97
  bottomRef,
@@ -101,6 +103,7 @@ vi.mock('./ModernAgentOutput/AllMessagesMixed', async () => {
101
103
  onActiveWorkstreamChange,
102
104
  }: {
103
105
  messages: AgentMessage[];
106
+ workstreamSourceMessages?: AgentMessage[];
104
107
  streamingMessages: Map<string, unknown>;
105
108
  isCompleted?: boolean;
106
109
  bottomRef: React.RefObject<HTMLDivElement>;
@@ -118,6 +121,7 @@ vi.mock('./ModernAgentOutput/AllMessagesMixed', async () => {
118
121
  );
119
122
  mocks.allMessagesMixedProps({
120
123
  messages,
124
+ workstreamSourceMessages,
121
125
  streamingMessages,
122
126
  isCompleted,
123
127
  onSendMessage,
@@ -230,6 +234,7 @@ function latestAllMessagesMixedProps() {
230
234
  return calls[calls.length - 1]?.[0] as
231
235
  | {
232
236
  messages: AgentMessage[];
237
+ workstreamSourceMessages?: AgentMessage[];
233
238
  streamingMessages: Map<string, unknown>;
234
239
  isCompleted?: boolean;
235
240
  showInitialRequest?: boolean;
@@ -253,6 +258,7 @@ function latestRightPanelProps() {
253
258
  describe('ModernAgentConversation send handling', () => {
254
259
  beforeEach(() => {
255
260
  vi.clearAllMocks();
261
+ window.sessionStorage.clear();
256
262
  mocks.restart.mockResolvedValue({ id: 'agent-run-1' });
257
263
  mocks.sendSignal.mockResolvedValue({});
258
264
  mocks.getActiveWorkstreams.mockResolvedValue({ running: [] });
@@ -337,6 +343,19 @@ describe('ModernAgentConversation send handling', () => {
337
343
  await waitFor(() => expect(onAgentWorkingChange).toHaveBeenLastCalledWith(false));
338
344
  });
339
345
 
346
+ it('shows the latest main-workstream error in the failed workflow box', () => {
347
+ mockStreamState({
348
+ messages: [createMessage(AgentMessageType.ERROR, 'Workflow failed: provider request timed out')],
349
+ agentRunStatus: 'FAILED',
350
+ });
351
+
352
+ renderConversation({ hideMessageInput: false });
353
+
354
+ expect(screen.getByText('Failed')).not.toBeNull();
355
+ expect(screen.getByText('Workflow failed: provider request timed out')).not.toBeNull();
356
+ expect(screen.queryByText('This Workflow is FAILED')).toBeNull();
357
+ });
358
+
340
359
  it('provides its resourceResolver prop to conversation content', () => {
341
360
  mockStreamState({ messages: [createMessage(AgentMessageType.COMPLETE, 'done')] });
342
361
 
@@ -561,6 +580,37 @@ describe('ModernAgentConversation send handling', () => {
561
580
  });
562
581
  });
563
582
 
583
+ it('collapses staged files in the start composer', () => {
584
+ const { container } = renderWithProviders(
585
+ <ModernAgentConversation startWorkflow={vi.fn()} hideHeader initialMessage="" />,
586
+ );
587
+ const input = container.querySelector('input[type="file"]');
588
+ const files = ['alpha.txt', 'beta.txt', 'gamma.txt', 'delta.txt', 'epsilon.txt'].map(
589
+ (name) => new File([name], name, { type: 'text/plain' }),
590
+ );
591
+
592
+ if (!input) {
593
+ throw new Error('Expected hidden file input to be rendered');
594
+ }
595
+
596
+ fireEvent.change(input, {
597
+ target: {
598
+ files,
599
+ },
600
+ });
601
+
602
+ expect(screen.getByText('alpha.txt')).not.toBeNull();
603
+ expect(screen.getByText('gamma.txt')).not.toBeNull();
604
+ expect(screen.queryByText('delta.txt')).toBeNull();
605
+ expect(screen.getByText('+2')).not.toBeNull();
606
+
607
+ fireEvent.click(screen.getByRole('button', { name: /show more/i }));
608
+
609
+ expect(screen.getByText('delta.txt')).not.toBeNull();
610
+ expect(screen.getByText('epsilon.txt')).not.toBeNull();
611
+ expect(screen.getByRole('button', { name: /show less/i })).not.toBeNull();
612
+ });
613
+
564
614
  it('signals approval mode changes for an active interactive run', async () => {
565
615
  mocks.retrieve.mockResolvedValue({
566
616
  tool_approval_mode: 'ask',
@@ -916,11 +966,13 @@ describe('ModernAgentConversation send handling', () => {
916
966
  onCompactContext?: () => void | Promise<void>;
917
967
  };
918
968
 
969
+ // Prompt-based, matching the server's checkpoint trigger: `total`
970
+ // includes reasoning/result tokens that never re-enter context.
919
971
  expect(latestMessageInputProps.contextWindowUsage).toEqual({
920
- usedTokens: 50_000,
972
+ usedTokens: 40_000,
921
973
  checkpointTokens: 100_000,
922
- usedPercent: 50,
923
- remainingPercent: 50,
974
+ usedPercent: 40,
975
+ remainingPercent: 60,
924
976
  });
925
977
 
926
978
  act(() => {
@@ -1059,6 +1111,7 @@ describe('ModernAgentConversation send handling', () => {
1059
1111
  const latestMessageInputProps = mocks.messageInputProps.mock.lastCall?.[0] as {
1060
1112
  activeTaskCount?: number;
1061
1113
  activeWorkstreams?: Array<{ workstream_id: string; status: string }>;
1114
+ onSelectWorkstream?: (workstreamId: string) => void;
1062
1115
  };
1063
1116
 
1064
1117
  expect(latestRightPanelProps.activeWorkstreams).toEqual([
@@ -1072,6 +1125,12 @@ describe('ModernAgentConversation send handling', () => {
1072
1125
  expect.objectContaining({ workstream_id: 'alpha', status: 'running' }),
1073
1126
  expect.objectContaining({ workstream_id: 'beta', status: 'running' }),
1074
1127
  ]);
1128
+
1129
+ act(() => {
1130
+ latestMessageInputProps.onSelectWorkstream?.('beta');
1131
+ });
1132
+
1133
+ expect(latestAllMessagesMixedProps()?.activeWorkstream).toBe('beta');
1075
1134
  });
1076
1135
 
1077
1136
  it('shows completed workstream lifecycle messages in the panel without counting them as active', async () => {
@@ -1488,6 +1547,80 @@ describe('ModernAgentConversation send handling', () => {
1488
1547
  );
1489
1548
  });
1490
1549
 
1550
+ it('does not resurrect an answered request overlay after remounting before the persisted echo arrives', async () => {
1551
+ const requestMessage = {
1552
+ ...createMessage(AgentMessageType.REQUEST_INPUT, 'What is your favorite color?'),
1553
+ details: {
1554
+ request_id: 'ask-user-1',
1555
+ ux: {
1556
+ options: [
1557
+ { id: 'red', label: 'Red' },
1558
+ { id: 'blue', label: 'Blue' },
1559
+ ],
1560
+ },
1561
+ },
1562
+ };
1563
+ mockStreamState({
1564
+ messages: [requestMessage],
1565
+ isCompleted: false,
1566
+ agentRunStatus: 'RUNNING',
1567
+ });
1568
+
1569
+ const firstView = renderConversation();
1570
+ fireEvent.click(screen.getByRole('button', { name: /Blue/ }));
1571
+
1572
+ await waitFor(() => expect(mocks.sendSignal).toHaveBeenCalledTimes(1));
1573
+ expect(mocks.sendSignal).toHaveBeenCalledWith(
1574
+ 'agent-run-1',
1575
+ 'UserInput',
1576
+ expect.objectContaining({
1577
+ metadata: expect.objectContaining({
1578
+ request_input_response: { request_id: 'ask-user-1' },
1579
+ }),
1580
+ }),
1581
+ );
1582
+
1583
+ firstView.unmount();
1584
+ renderConversation();
1585
+
1586
+ expect(screen.queryByText('What is your favorite color?')).toBeNull();
1587
+ expect(screen.queryByRole('button', { name: /Blue/ })).toBeNull();
1588
+ });
1589
+
1590
+ it('restores a request overlay after its response fails to send', async () => {
1591
+ mocks.sendSignal.mockRejectedValueOnce(new Error('offline'));
1592
+ const requestMessage = {
1593
+ ...createMessage(AgentMessageType.REQUEST_INPUT, 'What is your favorite color?'),
1594
+ details: {
1595
+ request_id: 'ask-user-1',
1596
+ ux: {
1597
+ options: [
1598
+ { id: 'red', label: 'Red' },
1599
+ { id: 'blue', label: 'Blue' },
1600
+ ],
1601
+ },
1602
+ },
1603
+ };
1604
+ mockStreamState({
1605
+ messages: [requestMessage],
1606
+ isCompleted: false,
1607
+ agentRunStatus: 'RUNNING',
1608
+ });
1609
+
1610
+ const firstView = renderConversation();
1611
+ fireEvent.click(screen.getByRole('button', { name: /Blue/ }));
1612
+
1613
+ await waitFor(() => {
1614
+ expect(mocks.updateOptimisticMessageStatus).toHaveBeenCalledWith(expect.any(String), 'failed');
1615
+ });
1616
+
1617
+ firstView.unmount();
1618
+ renderConversation();
1619
+
1620
+ expect(screen.getByText('What is your favorite color?')).not.toBeNull();
1621
+ expect(screen.getByRole('button', { name: /Blue/ })).not.toBeNull();
1622
+ });
1623
+
1491
1624
  it('hides a stale request overlay when a terminal run cannot continue', () => {
1492
1625
  mockStreamState({
1493
1626
  messages: [
@@ -2213,6 +2346,78 @@ describe('ModernAgentConversation send handling', () => {
2213
2346
  );
2214
2347
  });
2215
2348
 
2349
+ it('hides the debug button when the playback toggle is disabled', () => {
2350
+ mockStreamState({
2351
+ messages: [
2352
+ createMessage(AgentMessageType.QUESTION, 'first question'),
2353
+ createMessage(AgentMessageType.ANSWER, 'first answer'),
2354
+ ],
2355
+ });
2356
+
2357
+ renderConversation({ hideHeader: false, showPlaybackToggle: false });
2358
+
2359
+ expect(mocks.headerProps).toHaveBeenLastCalledWith(
2360
+ expect.objectContaining({
2361
+ showPlaybackButton: false,
2362
+ }),
2363
+ );
2364
+ });
2365
+
2366
+ it('filters transcript messages as conversation history updates', () => {
2367
+ const question = createMessage(AgentMessageType.QUESTION, 'Summarize the launch plan.');
2368
+ const internalUpdate = createMessage(AgentMessageType.UPDATE, 'Inspecting internal records.');
2369
+ const answer = createMessage(AgentMessageType.ANSWER, 'The launch plan is ready.');
2370
+ const messageFilter = (message: AgentMessage) => message.type !== AgentMessageType.UPDATE;
2371
+
2372
+ mockStreamState({ messages: [question, internalUpdate] });
2373
+ const view = renderConversation({ messageFilter });
2374
+
2375
+ expect(latestAllMessagesMixedProps()?.messages).toEqual([question]);
2376
+ expect(latestAllMessagesMixedProps()?.workstreamSourceMessages).toEqual([question]);
2377
+
2378
+ mockStreamState({ messages: [question, internalUpdate, answer] });
2379
+ view.rerender(
2380
+ <ModernAgentConversation
2381
+ agentRunId="agent-run-1"
2382
+ title="Agent"
2383
+ hideHeader
2384
+ hideMessageInput
2385
+ showRightPanel={false}
2386
+ messageFilter={messageFilter}
2387
+ />,
2388
+ );
2389
+
2390
+ expect(latestAllMessagesMixedProps()?.messages).toEqual([question, answer]);
2391
+ expect(latestAllMessagesMixedProps()?.workstreamSourceMessages).toEqual([question, answer]);
2392
+ expect(document.querySelector('[data-agent-live-message-count="3"]')).not.toBeNull();
2393
+ expect(document.querySelector('[data-agent-rendered-message-count="2"]')).not.toBeNull();
2394
+ });
2395
+
2396
+ it('keeps pending request input actionable when its transcript row is filtered out', () => {
2397
+ const requestMessage = {
2398
+ ...createMessage(AgentMessageType.REQUEST_INPUT, 'Choose a deployment region.'),
2399
+ details: {
2400
+ ux: {
2401
+ options: [
2402
+ { id: 'us', label: 'United States' },
2403
+ { id: 'eu', label: 'Europe' },
2404
+ ],
2405
+ },
2406
+ },
2407
+ };
2408
+ mockStreamState({
2409
+ messages: [requestMessage],
2410
+ isCompleted: false,
2411
+ agentRunStatus: 'RUNNING',
2412
+ });
2413
+
2414
+ renderConversation({ messageFilter: () => false });
2415
+
2416
+ expect(latestAllMessagesMixedProps()?.messages).toEqual([]);
2417
+ expect(screen.getByText('Choose a deployment region.')).not.toBeNull();
2418
+ expect(screen.getByRole('button', { name: /Europe/ })).not.toBeNull();
2419
+ });
2420
+
2216
2421
  it('keeps the replay fixture export action available while messages are empty', () => {
2217
2422
  mockStreamState({
2218
2423
  messages: [],
@@ -35,7 +35,7 @@ import {
35
35
  AgentResourceResolverProvider,
36
36
  isArtifactRefreshEvent,
37
37
  } from '@vertesia/ui/widgets';
38
- import { ArrowUpIcon, Bot, CheckCircle, Cpu, FileTextIcon, UploadIcon, XIcon } from 'lucide-react';
38
+ import { ArrowUpIcon, Bot, CheckCircle, ChevronDown, Cpu, FileTextIcon, UploadIcon, XIcon } from 'lucide-react';
39
39
  import type React from 'react';
40
40
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
41
41
  import { McpConnectionsActionMenu } from '../../oauth/McpConnectionsButton.js';
@@ -57,6 +57,7 @@ import type {
57
57
  AgentInitialRequestTemplateContext,
58
58
  } from './ModernAgentOutput/AllMessagesMixed';
59
59
  import AllMessagesMixed from './ModernAgentOutput/AllMessagesMixed';
60
+ import { collectDeliveredArtifactRefs } from './ModernAgentOutput/AttachmentPreview';
60
61
  import type { BatchProgressPanelClassNames } from './ModernAgentOutput/BatchProgressPanel';
61
62
  import Header from './ModernAgentOutput/Header';
62
63
  import MessageInput, {
@@ -65,7 +66,14 @@ import MessageInput, {
65
66
  type UploadedFile,
66
67
  } from './ModernAgentOutput/MessageInput';
67
68
  import type { MessageItemClassNames } from './ModernAgentOutput/MessageItem';
68
- import { getPendingRequestInputMessage } from './ModernAgentOutput/requestInputMessages';
69
+ import {
70
+ clearRequestInputIdAnsweredForSession,
71
+ getPendingRequestInputMessage,
72
+ getRequestInputResolutionKey,
73
+ getRequestInputResponseIdFromMetadata,
74
+ isRequestInputAnsweredForSession,
75
+ markRequestInputIdAnsweredForSession,
76
+ } from './ModernAgentOutput/requestInputMessages';
69
77
  import type { StreamingMessageClassNames } from './ModernAgentOutput/StreamingMessage';
70
78
  import type { ToolCallGroupClassNames } from './ModernAgentOutput/ToolCallGroup';
71
79
  import {
@@ -98,6 +106,9 @@ export interface StartWorkflowOptions {
98
106
  tool_approval_mode?: AgentToolApprovalMode;
99
107
  }
100
108
 
109
+ /** Controls whether a persisted message is included in the rendered conversation transcript. */
110
+ export type AgentMessageFilter = (message: AgentMessage) => boolean;
111
+
101
112
  export type StartWorkflowFn = (
102
113
  initialMessage?: string,
103
114
  options?: StartWorkflowOptions,
@@ -106,6 +117,7 @@ export type StartWorkflowFn = (
106
117
  export type SendAgentMessageFn = (message: string, inputMetadata?: Record<string, unknown>) => void;
107
118
 
108
119
  const EMPTY_STREAMING_MESSAGES = new Map<string, never>();
120
+ const COLLAPSED_STAGED_FILE_COUNT = 3;
109
121
 
110
122
  function getTimestampMs(timestamp: number | string | undefined): number {
111
123
  if (typeof timestamp === 'number') return timestamp;
@@ -137,8 +149,13 @@ function toContextWindowUsage(messages: AgentMessage[]): ContextWindowUsage | un
137
149
  const details = messages[index].details;
138
150
  if (!details) continue;
139
151
 
140
- const tokenUsage = details.token_usage as { total?: unknown } | undefined;
141
- const usedTokens = getNumberDetail(tokenUsage?.total);
152
+ const tokenUsage = details.token_usage as { prompt?: unknown; total?: unknown } | undefined;
153
+ // Mirror the server's checkpoint trigger (getContextPressureTokens):
154
+ // the last call's prompt size is the actual context; `total` includes
155
+ // reasoning output that never re-enters context and would overstate
156
+ // pressure on reasoning models. Fall back to total when no breakdown.
157
+ const promptTokens = getNumberDetail(tokenUsage?.prompt);
158
+ const usedTokens = promptTokens && promptTokens > 0 ? promptTokens : getNumberDetail(tokenUsage?.total);
142
159
  const checkpointTokens =
143
160
  getNumberDetail(details.checkpoint_threshold) ?? getNumberDetail(details.checkpoint_at);
144
161
 
@@ -220,12 +237,21 @@ function isWorkstreamActivityFailureMessage(message: AgentMessage): boolean {
220
237
  tool_event?: unknown;
221
238
  tool_run_id?: unknown;
222
239
  tool_status?: unknown;
240
+ workstream_id?: unknown;
223
241
  workstream_event?: unknown;
224
242
  }
225
243
  | undefined;
226
244
 
227
245
  if (details?.event_class !== 'activity') return false;
228
246
  if (details.workstream_event) return false;
247
+ const workstreamId =
248
+ typeof message.workstream_id === 'string' && message.workstream_id.trim()
249
+ ? message.workstream_id.trim()
250
+ : typeof details.workstream_id === 'string'
251
+ ? details.workstream_id.trim()
252
+ : '';
253
+ const normalizedWorkstreamId = workstreamId.toLowerCase();
254
+ if (!workstreamId || normalizedWorkstreamId === 'main' || normalizedWorkstreamId === 'all') return false;
229
255
 
230
256
  return !(
231
257
  details.tool ||
@@ -648,6 +674,11 @@ export interface ModernAgentConversationProps {
648
674
  hideDocumentPanel?: boolean;
649
675
  /** Message types to exclude from the conversation view */
650
676
  hiddenMessageTypes?: AgentMessageType[];
677
+ /**
678
+ * Optional presentation-only predicate for transcript messages. Returning false hides the message without
679
+ * changing the underlying conversation stream, workflow state, plans, or pending input.
680
+ */
681
+ messageFilter?: AgentMessageFilter;
651
682
 
652
683
  // Callback to get attached documents when sending messages
653
684
  // Returns array of { id, name } to include in message metadata and display
@@ -727,7 +758,7 @@ export interface ModernAgentConversationProps {
727
758
  initialToolApprovalMode?: AgentToolApprovalMode;
728
759
  /** Force display playback controls on or off. When omitted, local playback can be toggled from the header. */
729
760
  enablePlayback?: boolean;
730
- /** Show a local toggle for display playback controls in the conversation action rail. */
761
+ /** Show the Debug button for local playback controls. Defaults to true; set to false to hide it. */
731
762
  showPlaybackToggle?: boolean;
732
763
  }
733
764
 
@@ -817,6 +848,9 @@ function StartWorkflowView({
817
848
 
818
849
  // Staged files - stored locally until workflow starts
819
850
  const [stagedFiles, setStagedFiles] = useState<File[]>([]);
851
+ const [areStagedFilesExpanded, setAreStagedFilesExpanded] = useState(false);
852
+ const visibleStagedFiles = areStagedFilesExpanded ? stagedFiles : stagedFiles.slice(0, COLLAPSED_STAGED_FILE_COUNT);
853
+ const hiddenStagedFileCount = stagedFiles.length - COLLAPSED_STAGED_FILE_COUNT;
820
854
 
821
855
  useEffect(() => {
822
856
  onAgentWorkingChange?.(isSending);
@@ -914,6 +948,12 @@ function StartWorkflowView({
914
948
  setStagedFiles((prev) => prev.filter((_, i) => i !== index));
915
949
  }, []);
916
950
 
951
+ useEffect(() => {
952
+ if (stagedFiles.length <= COLLAPSED_STAGED_FILE_COUNT) {
953
+ setAreStagedFilesExpanded(false);
954
+ }
955
+ }, [stagedFiles.length]);
956
+
917
957
  useEffect(() => {
918
958
  // Focus the input field when component mounts
919
959
  if (inputRef.current) {
@@ -1208,7 +1248,7 @@ function StartWorkflowView({
1208
1248
  {/* Staged files display */}
1209
1249
  {canStageFiles && stagedFiles.length > 0 && (
1210
1250
  <div className="flex flex-wrap gap-2">
1211
- {stagedFiles.map((file, index) => (
1251
+ {visibleStagedFiles.map((file, index) => (
1212
1252
  <div
1213
1253
  key={`${file.name}-${file.size}-${file.lastModified}`}
1214
1254
  className="flex items-center gap-1.5 rounded-md bg-attention/10 px-2 py-1 text-sm text-attention"
@@ -1227,6 +1267,26 @@ function StartWorkflowView({
1227
1267
  </Button>
1228
1268
  </div>
1229
1269
  ))}
1270
+ {stagedFiles.length > COLLAPSED_STAGED_FILE_COUNT && (
1271
+ <Button
1272
+ type="button"
1273
+ variant="ghost"
1274
+ size="sm"
1275
+ aria-expanded={areStagedFilesExpanded}
1276
+ onClick={() => setAreStagedFilesExpanded((expanded) => !expanded)}
1277
+ className="h-8 shrink-0 gap-1 rounded-xl px-2.5 text-xs text-muted"
1278
+ >
1279
+ {!areStagedFilesExpanded && <span>+{hiddenStagedFileCount}</span>}
1280
+ {areStagedFilesExpanded ? t('agent.showLess') : t('agent.showMore')}
1281
+ <ChevronDown
1282
+ className={cn(
1283
+ 'size-3.5 transition-transform',
1284
+ areStagedFilesExpanded && 'rotate-180',
1285
+ )}
1286
+ aria-hidden="true"
1287
+ />
1288
+ </Button>
1289
+ )}
1230
1290
  </div>
1231
1291
  )}
1232
1292
 
@@ -1392,6 +1452,7 @@ function ModernAgentConversationInner({
1392
1452
  initialToolApprovalMode,
1393
1453
  enablePlayback,
1394
1454
  showPlaybackToggle = true,
1455
+ messageFilter,
1395
1456
  }: ModernAgentConversationProps & { agentRunId: string }) {
1396
1457
  const { t } = useUITranslation();
1397
1458
  const { client } = useUserSession();
@@ -1436,8 +1497,9 @@ function ModernAgentConversationInner({
1436
1497
  updateDocumentTitle,
1437
1498
  } = useDocumentPanel(messages);
1438
1499
 
1500
+ const deliveredArtifactRefs = useMemo(() => collectDeliveredArtifactRefs(messages), [messages]);
1439
1501
  const { processingFiles, hasProcessingFiles, handleFileUpload, removeProcessingFile, clearProcessingFiles } =
1440
- useFileProcessing(client, agentRunId, serverFileUpdates, toast);
1502
+ useFileProcessing(client, agentRunId, serverFileUpdates, toast, deliveredArtifactRefs);
1441
1503
  const canUploadFiles = interactive && !hideFileUpload;
1442
1504
 
1443
1505
  const handleRemoveProcessingFile = useCallback(
@@ -1549,6 +1611,16 @@ function ModernAgentConversationInner({
1549
1611
  () => effectiveWorkflowStatus?.toUpperCase() === 'FAILED' || agentRunStatus?.toUpperCase() === 'FAILED',
1550
1612
  [effectiveWorkflowStatus, agentRunStatus],
1551
1613
  );
1614
+ const workflowFailureReason = useMemo(() => {
1615
+ for (let index = messages.length - 1; index >= 0; index--) {
1616
+ const message = messages[index];
1617
+ if (message.type !== AgentMessageType.ERROR) continue;
1618
+ if (getWorkstreamId(message) !== 'main') continue;
1619
+ const text = typeof message.message === 'string' ? message.message.trim() : '';
1620
+ if (text) return text;
1621
+ }
1622
+ return undefined;
1623
+ }, [messages]);
1552
1624
 
1553
1625
  // Read inside handleSendMessage (a stable callback) without widening its deps.
1554
1626
  const isWorkflowTerminalRef = useRef(isWorkflowTerminal);
@@ -1621,13 +1693,16 @@ function ModernAgentConversationInner({
1621
1693
 
1622
1694
  const canShowPlaybackToggle = showPlaybackToggle && enablePlayback === undefined && isAgentChatPlaybackAvailable();
1623
1695
  const isPlaybackEnabled = enablePlayback ?? (isAgentChatPlaybackEnabled() || isPlaybackToggleEnabled);
1624
- const playbackSourceMessages = useMemo(() => {
1696
+ const transcriptSourceMessages = useMemo(() => {
1625
1697
  // Passive artifact autosaves are surfaced by the editor's own save indicator, not the chat.
1626
- const visibleMessages = messages.filter(
1698
+ return messages.filter(
1627
1699
  (message) => !isPassiveArtifactUpdate(message) && !(hiddenMessageTypes?.includes(message.type) ?? false),
1628
1700
  );
1629
- return filterMessagesForActiveWorkstream(visibleMessages, activeWorkstream);
1630
- }, [activeWorkstream, hiddenMessageTypes, messages]);
1701
+ }, [hiddenMessageTypes, messages]);
1702
+ const playbackSourceMessages = useMemo(
1703
+ () => filterMessagesForActiveWorkstream(transcriptSourceMessages, activeWorkstream),
1704
+ [activeWorkstream, transcriptSourceMessages],
1705
+ );
1631
1706
  const playbackState = useMemo(
1632
1707
  () => createPlaybackState(playbackSourceMessages, playbackCursor, isPlaybackEnabled),
1633
1708
  [isPlaybackEnabled, playbackCursor, playbackSourceMessages],
@@ -1637,6 +1712,17 @@ function ModernAgentConversationInner({
1637
1712
  const isPlaybackAtLatest =
1638
1713
  isPlaybackEnabled && !isPlaybackLive && playbackState.cursorIndex === playbackSourceMessages.length - 1;
1639
1714
  const displayedMessages = playbackState.displayedMessages;
1715
+ const renderedMessages = useMemo(
1716
+ () => (messageFilter ? displayedMessages.filter((message) => messageFilter(message)) : displayedMessages),
1717
+ [displayedMessages, messageFilter],
1718
+ );
1719
+ const renderedWorkstreamSourceMessages = useMemo(
1720
+ () =>
1721
+ messageFilter
1722
+ ? transcriptSourceMessages.filter((message) => messageFilter(message))
1723
+ : transcriptSourceMessages,
1724
+ [messageFilter, transcriptSourceMessages],
1725
+ );
1640
1726
  const displayedStreamingMessages = isPlaybackLive ? streamingMessages : EMPTY_STREAMING_MESSAGES;
1641
1727
  const playbackDerivedWorkstreams = useMemo(
1642
1728
  () => deriveWorkstreamsFromMessages(displayedMessages),
@@ -1653,10 +1739,15 @@ function ModernAgentConversationInner({
1653
1739
  useEffect(() => {
1654
1740
  onAgentWorkingChange?.(isAgentWorking);
1655
1741
  }, [isAgentWorking, onAgentWorkingChange]);
1656
- const pendingRequestInputMessage = useMemo(
1657
- () => getPendingRequestInputMessage(displayedMessages),
1658
- [displayedMessages],
1659
- );
1742
+ const pendingRequestInputMessage = useMemo(() => {
1743
+ const answeredRequestInputKeys = new Set<string>();
1744
+ for (const message of displayedMessages) {
1745
+ if (isRequestInputAnsweredForSession(agentRunId, message)) {
1746
+ answeredRequestInputKeys.add(getRequestInputResolutionKey(message));
1747
+ }
1748
+ }
1749
+ return getPendingRequestInputMessage(displayedMessages, 'main', answeredRequestInputKeys);
1750
+ }, [agentRunId, displayedMessages]);
1660
1751
  // A terminal run silently drops user input unless it can be continued (see the guard in
1661
1752
  // handleSendMessage), so never surface an actionable question overlay in that state —
1662
1753
  // the terminal status box renders instead.
@@ -1675,7 +1766,7 @@ function ModernAgentConversationInner({
1675
1766
  agentRunId,
1676
1767
  messageCount: messages.length,
1677
1768
  playbackMessageCount: playbackSourceMessages.length,
1678
- displayedMessageCount: displayedMessages.length,
1769
+ displayedMessageCount: renderedMessages.length,
1679
1770
  streamingCount: streamingMessages.size,
1680
1771
  displayedStreamingCount: displayedStreamingMessages.size,
1681
1772
  initialHistoryStatus,
@@ -1699,7 +1790,7 @@ function ModernAgentConversationInner({
1699
1790
  agentRunStatus,
1700
1791
  clampedPlaybackCursor,
1701
1792
  displayedIsCompleted,
1702
- displayedMessages.length,
1793
+ renderedMessages.length,
1703
1794
  displayedStreamingMessages.size,
1704
1795
  effectiveIsCompleted,
1705
1796
  effectiveWorkflowStatus,
@@ -2078,6 +2169,7 @@ function ModernAgentConversationInner({
2078
2169
  return;
2079
2170
  }
2080
2171
 
2172
+ const requestInputId = getRequestInputResponseIdFromMetadata(inputMetadata);
2081
2173
  setIsSending(true);
2082
2174
 
2083
2175
  const attachedDocs = getAttachedDocs?.() || [];
@@ -2120,6 +2212,9 @@ function ModernAgentConversationInner({
2120
2212
  _messageId: messageId,
2121
2213
  _deliveryStatus: 'sending',
2122
2214
  ...(inputMetadata?.editing_action ? { editing_action: inputMetadata.editing_action } : {}),
2215
+ ...(inputMetadata?.request_input_response
2216
+ ? { request_input_response: inputMetadata.request_input_response }
2217
+ : {}),
2123
2218
  },
2124
2219
  };
2125
2220
 
@@ -2151,6 +2246,9 @@ function ModernAgentConversationInner({
2151
2246
  // buffers the signal until the new run is ready to receive it. We reconnect
2152
2247
  // the stream in place (rather than remounting via onRestart) so the existing
2153
2248
  // timeline is preserved and the new exchange appends seamlessly at the bottom.
2249
+ if (requestInputId) {
2250
+ markRequestInputIdAnsweredForSession(agentRunId, requestInputId);
2251
+ }
2154
2252
  const deliver = (async () => {
2155
2253
  await waitForPendingToolApprovalModeChange();
2156
2254
  if (isWorkflowTerminalRef.current) {
@@ -2163,6 +2261,9 @@ function ModernAgentConversationInner({
2163
2261
 
2164
2262
  deliver
2165
2263
  .catch((err) => {
2264
+ if (requestInputId) {
2265
+ clearRequestInputIdAnsweredForSession(agentRunId, requestInputId);
2266
+ }
2166
2267
  updateOptimisticMessageStatus(messageId, 'failed');
2167
2268
  toast({
2168
2269
  status: 'error',
@@ -2202,7 +2303,7 @@ function ModernAgentConversationInner({
2202
2303
  // conversation for tool re-discovery and resume it with a confirmation message so the agent
2203
2304
  // continues automatically with the newly-available tools.
2204
2305
  const handleMcpConnected = useCallback(
2205
- async (cfg: McpConnectUxConfig) => {
2306
+ async (cfg: McpConnectUxConfig, metadata?: Record<string, unknown>) => {
2206
2307
  // Await the dirty-flag signal BEFORE sending the follow-up message so Temporal records
2207
2308
  // McpConfigChanged ahead of the UserInput. Otherwise the resume turn could run before
2208
2309
  // the flag is set and use the stale tool catalog. An omitted disabled list preserves
@@ -2212,7 +2313,7 @@ function ModernAgentConversationInner({
2212
2313
  } catch (err: unknown) {
2213
2314
  console.error('Failed to signal MCP config change', err);
2214
2315
  }
2215
- handleSendMessage(t('agent.mcpConnectedMessage', { name: cfg.name }));
2316
+ handleSendMessage(t('agent.mcpConnectedMessage', { name: cfg.name }), metadata);
2216
2317
  },
2217
2318
  [client, agentRunId, handleSendMessage, t],
2218
2319
  );
@@ -2594,7 +2695,7 @@ function ModernAgentConversationInner({
2594
2695
  data-agent-playback-enabled={isPlaybackEnabled || undefined}
2595
2696
  data-agent-playback-cursor={isPlaybackEnabled ? clampedPlaybackCursor : undefined}
2596
2697
  data-agent-live-message-count={messages.length}
2597
- data-agent-rendered-message-count={displayedMessages.length}
2698
+ data-agent-rendered-message-count={renderedMessages.length}
2598
2699
  className={cn(
2599
2700
  'flex flex-col min-h-0 min-w-0 border-0',
2600
2701
  conversationTab
@@ -2629,8 +2730,8 @@ function ModernAgentConversationInner({
2629
2730
  <PendingStartConversation message={pendingStartMessage} startedAt={pendingStartTimestamp} />
2630
2731
  ) : (
2631
2732
  <AllMessagesMixed
2632
- messages={displayedMessages}
2633
- workstreamSourceMessages={messages}
2733
+ messages={renderedMessages}
2734
+ workstreamSourceMessages={renderedWorkstreamSourceMessages}
2634
2735
  bottomRef={bottomRef as React.RefObject<HTMLDivElement>}
2635
2736
  isCompleted={displayedIsCompleted}
2636
2737
  plan={getActivePlan.plan}
@@ -2681,7 +2782,10 @@ function ModernAgentConversationInner({
2681
2782
  />
2682
2783
  ) : isViewingPlaybackHistory && playbackActiveWorkstreams.length > 0 ? (
2683
2784
  <div className="flex-shrink-0 pb-safe-area">
2684
- <ActiveWorkstreamsSummary activeWorkstreams={playbackActiveWorkstreams} />
2785
+ <ActiveWorkstreamsSummary
2786
+ activeWorkstreams={playbackActiveWorkstreams}
2787
+ onSelectWorkstream={setActiveWorkstream}
2788
+ />
2685
2789
  </div>
2686
2790
  ) : (
2687
2791
  shouldRenderLiveMessageInputArea && (
@@ -2691,8 +2795,8 @@ function ModernAgentConversationInner({
2691
2795
  // never render for a failed run. Use the caller's action when provided,
2692
2796
  // otherwise fall back to the default failed message box.
2693
2797
  (failedAction ?? (
2694
- <MessageBox status="error" icon={null} className="m-2">
2695
- This Workflow is FAILED
2798
+ <MessageBox status="error" title={t('agent.failed')} className="m-2">
2799
+ {workflowFailureReason ?? t('agent.error')}
2696
2800
  </MessageBox>
2697
2801
  ))
2698
2802
  ) : effectiveWorkflowStatus &&
@@ -2749,6 +2853,7 @@ function ModernAgentConversationInner({
2749
2853
  isCompactingContext={isCompactingContext}
2750
2854
  activeTaskCount={activeTaskCount}
2751
2855
  activeWorkstreams={composerActiveWorkstreams}
2856
+ onSelectWorkstream={setActiveWorkstream}
2752
2857
  placeholder={composerPlaceholder}
2753
2858
  onFilesSelected={canUploadFiles ? handleFileUpload : undefined}
2754
2859
  uploadedFiles={uploadedFiles}