@atom8n/n8n-editor-ui 2.2.0

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 (310) hide show
  1. package/.stylelintcache +1 -0
  2. package/README.md +59 -0
  3. package/biome.jsonc +8 -0
  4. package/build.log +55 -0
  5. package/data/node-popularity.json +3998 -0
  6. package/dist/assets/AddDataTableModal-UINkk54_.js +1555 -0
  7. package/dist/assets/AgentEditorModal-CVww87TJ.js +358 -0
  8. package/dist/assets/Alert-Dy86dyOr.js +102 -0
  9. package/dist/assets/AnimatedSpinner-DmPN4poP.js +15 -0
  10. package/dist/assets/AnnotationTagsDropdown.ee-BJ7N9lek.js +71 -0
  11. package/dist/assets/AuthView-D2LWHrMp.js +106 -0
  12. package/dist/assets/BottomMenu-CIQiK_dJ.js +532 -0
  13. package/dist/assets/CalendarDate-DgQUMbNo.js +875 -0
  14. package/dist/assets/ChangePasswordView-Z6tUkw0u.js +133 -0
  15. package/dist/assets/ChatAgentAvatar-50YBnv3N.js +67 -0
  16. package/dist/assets/ChatFile-xZxmc2nV.js +146 -0
  17. package/dist/assets/ChatLayout-CTE_5SiM.js +96 -0
  18. package/dist/assets/ChatPersonalAgentsView-BGpHk03K.js +149 -0
  19. package/dist/assets/ChatSidebar-BkVwIypC.js +528 -0
  20. package/dist/assets/ChatView-BbbdeU9x.js +1559 -0
  21. package/dist/assets/ChatWorkflowAgentsView-BtunOxlC.js +116 -0
  22. package/dist/assets/CollectionParameter-BdcPG1lu.js +52 -0
  23. package/dist/assets/CommitMonoVariable-ytizKI8U.woff2 +0 -0
  24. package/dist/assets/CommunityNodeUpdateInfo-C37kca4W.js +273 -0
  25. package/dist/assets/CopyInput-DDZVu2iU.js +74 -0
  26. package/dist/assets/CredentialIcon-8YdTTFZ1.js +80 -0
  27. package/dist/assets/CredentialPicker-DWtj314o.js +293 -0
  28. package/dist/assets/CredentialSelectorModal-DTW2fKh0.js +138 -0
  29. package/dist/assets/CredentialsView-BjUchcCu.js +480 -0
  30. package/dist/assets/DataTableActions-DpAkoxg_.js +95 -0
  31. package/dist/assets/DataTableDetailsView-Coq7zdW5.js +41922 -0
  32. package/dist/assets/DataTableView-Cs-BIkzw.js +293 -0
  33. package/dist/assets/DemoFooter-Cga3jvi-.js +65 -0
  34. package/dist/assets/Draggable-vfvXl9Sp.js +105 -0
  35. package/dist/assets/EmptySharedSectionActionBox-DOXZtTCv.js +36 -0
  36. package/dist/assets/EnterpriseEdition.ee-D_rCFexM.js +15 -0
  37. package/dist/assets/EntityNotFound-3dhTRWsE.js +85 -0
  38. package/dist/assets/EntityUnAuthorised-ChJYZakE.js +66 -0
  39. package/dist/assets/ErrorView-zT9cX76a.js +61 -0
  40. package/dist/assets/EvaluationsRootView-C-OVWYnY.js +523 -0
  41. package/dist/assets/EvaluationsView-CJwJTruc.js +469 -0
  42. package/dist/assets/ExecutionsTime-DEQiyozR.js +573 -0
  43. package/dist/assets/ExecutionsView-Bd5Oh8TH.js +791 -0
  44. package/dist/assets/ExternalSecretsProviderConnectionSwitch.ee-C7Ih-uRo.js +191 -0
  45. package/dist/assets/FixedCollectionParameter-CYuTDW9t.js +496 -0
  46. package/dist/assets/ForgotMyPasswordView-Bs_L9P27.js +102 -0
  47. package/dist/assets/InsightsChartAverageRuntime-Bp3VA8_7.js +62 -0
  48. package/dist/assets/InsightsChartFailed-KPaNWoEr.js +52 -0
  49. package/dist/assets/InsightsChartFailureRate-DE6kE3FM.js +54 -0
  50. package/dist/assets/InsightsChartTimeSaved-auABNZlc.js +68 -0
  51. package/dist/assets/InsightsChartTotal-BKzYRKE7.js +56 -0
  52. package/dist/assets/InsightsDashboard-JWx4W6Db.js +473 -0
  53. package/dist/assets/InsightsPaywall-C8zLLKe8.js +63 -0
  54. package/dist/assets/InsightsSummary-cmN1lHDm.js +210 -0
  55. package/dist/assets/InsightsTableWorkflows-CqcC3IbQ.js +203 -0
  56. package/dist/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
  57. package/dist/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
  58. package/dist/assets/ItemsRenderer-DC8WVyMv.js +922 -0
  59. package/dist/assets/KeyboardShortcutTooltip-D8PAK5JP.js +31 -0
  60. package/dist/assets/LogsPanel-BR06u9RK.js +52 -0
  61. package/dist/assets/LogsPanel-C-_acMHp.js +2325 -0
  62. package/dist/assets/MCPConnectWorkflowsModal-3g8_iUa4.js +303 -0
  63. package/dist/assets/MainHeader-DiQc1edn.js +2153 -0
  64. package/dist/assets/MainSidebar-CoPGG5Ea.js +804 -0
  65. package/dist/assets/MigrationRuleDetail-BAxk1Pvl.js +295 -0
  66. package/dist/assets/MigrationRules-IW9lZMpE.js +285 -0
  67. package/dist/assets/Modal-CIzXlZdZ.js +204 -0
  68. package/dist/assets/ModelByIdSelectorModal-DLvBjzJO.js +115 -0
  69. package/dist/assets/NDVEmptyState-33UoX00I.js +19743 -0
  70. package/dist/assets/NodeCreation-BNzbSWSB.js +240 -0
  71. package/dist/assets/NodeCreator-BftgCKx7.js +1288 -0
  72. package/dist/assets/NodeDetailsView-CsoQCpcF.js +1075 -0
  73. package/dist/assets/NodeDetailsViewV2-C_wNQR_3.js +981 -0
  74. package/dist/assets/NodeIcon-B9VW6tX6.js +87 -0
  75. package/dist/assets/NodeSettings-ZwVip6VR.js +1872 -0
  76. package/dist/assets/NodeView-D4WUEvLB.js +2452 -0
  77. package/dist/assets/OAuthConsentView-DlrUqZbT.js +230 -0
  78. package/dist/assets/PageViewLayout-NT1KPFgy.js +12 -0
  79. package/dist/assets/ParameterInputList-sG2nz-Jo.js +38091 -0
  80. package/dist/assets/PrebuiltAgentTemplatesView-Csi5U8dc.js +154 -0
  81. package/dist/assets/ProjectBreadcrumb-C_XiY7sc.js +98 -0
  82. package/dist/assets/ProjectCardBadge-t_hs7vzx.js +209 -0
  83. package/dist/assets/ProjectHeader-Dq5Ihb26.js +549 -0
  84. package/dist/assets/ProjectIcon-DY8gGuHX.js +64 -0
  85. package/dist/assets/ProjectRoleView-Du-KTrAC.js +435 -0
  86. package/dist/assets/ProjectRolesView-DjxM_y4u.js +239 -0
  87. package/dist/assets/ProjectSettings-C6kWuV21.js +966 -0
  88. package/dist/assets/ProjectSharing-CVUgNWAY.js +262 -0
  89. package/dist/assets/ProjectVariables-CJlAo3dv.js +467 -0
  90. package/dist/assets/ProviderSettingsModal-BUFC2ZLv.js +307 -0
  91. package/dist/assets/PushConnectionTracker-DPBnGV0v.js +27 -0
  92. package/dist/assets/ResolversView-3BdkvvYA.js +209 -0
  93. package/dist/assets/ResourceFiltersDropdown-dgyXpcEX.js +159 -0
  94. package/dist/assets/ResourcesListLayout-qBLtomK6.js +631 -0
  95. package/dist/assets/RunDataHtml-BrW0OQra.js +7 -0
  96. package/dist/assets/RunDataHtml-Cleia4Cj.js +40 -0
  97. package/dist/assets/RunDataJson-uxkrhYRK.js +227 -0
  98. package/dist/assets/RunDataJsonActions-DkPk7E8d.js +5007 -0
  99. package/dist/assets/RunDataParsedAiContent-CtPRjig-.js +26 -0
  100. package/dist/assets/RunDataParsedAiContent-WAuqLQ5M.js +192 -0
  101. package/dist/assets/RunDataSearch-YBWUr93C.js +141 -0
  102. package/dist/assets/RunDataTable-DcXaBynW.js +631 -0
  103. package/dist/assets/SamlOnboarding-BTdQ_hr3.js +78 -0
  104. package/dist/assets/SaveButton-D5sQSxIk.js +89 -0
  105. package/dist/assets/SelectedItemsInfo-BHZ-NvF5.js +58 -0
  106. package/dist/assets/SettingsApiView-IfZTMXx1.js +313 -0
  107. package/dist/assets/SettingsChatHubView-gWh2X6vX.js +285 -0
  108. package/dist/assets/SettingsCommunityNodesView-D8VQtpGY.js +349 -0
  109. package/dist/assets/SettingsExternalSecrets-CpMc7mkW.js +233 -0
  110. package/dist/assets/SettingsLdapView-CU5a2MAy.js +2553 -0
  111. package/dist/assets/SettingsLogStreamingView-uojTe-oX.js +375 -0
  112. package/dist/assets/SettingsMCPView-B5Swp1C_.js +1214 -0
  113. package/dist/assets/SettingsPersonalView-Cr3aGood.js +402 -0
  114. package/dist/assets/SettingsSourceControl-DXOvFDEY.js +547 -0
  115. package/dist/assets/SettingsSso-27MfU1HV.js +1032 -0
  116. package/dist/assets/SettingsUsageAndPlan-DqIO-G46.js +419 -0
  117. package/dist/assets/SettingsUsersView-DfHB4_Kh.js +833 -0
  118. package/dist/assets/SettingsView-C4sA7Uny.js +90 -0
  119. package/dist/assets/SetupTemplateFormStep-BmiSzZin.js +258 -0
  120. package/dist/assets/SetupView-VORZ-L_u.js +112 -0
  121. package/dist/assets/SetupWorkflowCredentialsButton-DTmkOAW5.js +73 -0
  122. package/dist/assets/SetupWorkflowFromTemplateView-B9NupdJE.js +286 -0
  123. package/dist/assets/SeverityTag-CX1qTTNA.js +45 -0
  124. package/dist/assets/SigninView-D9_Pm16j.js +358 -0
  125. package/dist/assets/SignoutView-BFsjEAGz.js +19 -0
  126. package/dist/assets/SignupView-Am4ot0QZ.js +137 -0
  127. package/dist/assets/SkeletonAgentCard-C5TL-h8F.js +191 -0
  128. package/dist/assets/TagsDropdown-Bvx_Hd6Q.js +230 -0
  129. package/dist/assets/TemplateCard-CyQ1GuVz.js +105 -0
  130. package/dist/assets/TemplateDetails-CZRusTxE.js +124 -0
  131. package/dist/assets/TemplateList-DKvbwuiY.js +333 -0
  132. package/dist/assets/TemplatesCollectionView-D8dxU8By.js +184 -0
  133. package/dist/assets/TemplatesSearchView-CebC_GLs.js +1230 -0
  134. package/dist/assets/TemplatesView-025CcmIY.js +57 -0
  135. package/dist/assets/TemplatesWorkflowView-C2JfwJAn.js +170 -0
  136. package/dist/assets/TestRunDetailView-Ck78TTWO.js +395 -0
  137. package/dist/assets/TextWithHighlights-BxumwGnv.js +57 -0
  138. package/dist/assets/TimeAgo-C6EN4lCs.js +123 -0
  139. package/dist/assets/ToolsSelectorModal-8QJoUvRL.js +368 -0
  140. package/dist/assets/TriggerPanel-B6pacLkk.js +1225 -0
  141. package/dist/assets/VirtualSchema-B3zGe_8b.js +2402 -0
  142. package/dist/assets/VirtualSchema-Dkh0Cu5z.js +37 -0
  143. package/dist/assets/VueMarkdown-CQqJL9vK.js +28 -0
  144. package/dist/assets/WorkerView-Caznsljo.js +563 -0
  145. package/dist/assets/WorkflowActivationErrorMessage-CGrfPi9O.js +17 -0
  146. package/dist/assets/WorkflowActivator-BINnz0f7.js +362 -0
  147. package/dist/assets/WorkflowExecutionsInfoAccordion-Dg37yEfT.js +166 -0
  148. package/dist/assets/WorkflowExecutionsLandingPage-V2wdubhK.js +93 -0
  149. package/dist/assets/WorkflowExecutionsPreview-DdJaqYV6.js +616 -0
  150. package/dist/assets/WorkflowExecutionsView-DV8ySTfn.js +808 -0
  151. package/dist/assets/WorkflowHistory-GtaBMzIM.js +973 -0
  152. package/dist/assets/WorkflowLocation-CQ9Sq-2y.js +164 -0
  153. package/dist/assets/WorkflowOnboardingView-C49gt0Jr.js +61 -0
  154. package/dist/assets/WorkflowPreview-CXdvv4Nq.js +186 -0
  155. package/dist/assets/WorkflowTagsDropdown-QwbICWjN.js +71 -0
  156. package/dist/assets/WorkflowsView-B-MWIECO.js +3253 -0
  157. package/dist/assets/_MapCache-CcdIl4Ae.js +363 -0
  158. package/dist/assets/_baseOrderBy-N8Be_6z6.js +2989 -0
  159. package/dist/assets/_initCloneObject-viQQyT6o.js +80 -0
  160. package/dist/assets/_plugin-vue_export-helper-BwBpWJRZ.js +6 -0
  161. package/dist/assets/aiTemplatesStarterCollection.store-nL9nePkK.js +656 -0
  162. package/dist/assets/apiKeys.store-BhOFmP2j.js +51 -0
  163. package/dist/assets/assistant.store-CNywgN4S.js +518 -0
  164. package/dist/assets/auth.eventBus-CWXS0Qp7.js +5 -0
  165. package/dist/assets/banners.store-CGEcBTDn.js +195 -0
  166. package/dist/assets/builder.store-Czk2ipDE.js +31417 -0
  167. package/dist/assets/buttons.esm-yintpW2E.js +364 -0
  168. package/dist/assets/chart-CNvyywtJ.js +10958 -0
  169. package/dist/assets/chartjs.utils-BAE52Cv9.js +155 -0
  170. package/dist/assets/chat.store-290YeyrQ.js +865 -0
  171. package/dist/assets/chatPanel.store-NDaawEZL.js +118 -0
  172. package/dist/assets/chunk-6z4oVpB-.js +36 -0
  173. package/dist/assets/col-Cmt4cmuS.js +158 -0
  174. package/dist/assets/constants-C8OH4tTq.js +106256 -0
  175. package/dist/assets/constants-DMrsrpD7.js +32 -0
  176. package/dist/assets/core-B9gt_4yk.js +4 -0
  177. package/dist/assets/core-CP5FY4aX.js +1202 -0
  178. package/dist/assets/core-CRbPymLT.js +9741 -0
  179. package/dist/assets/dataTable.store-DmipQsol.js +207 -0
  180. package/dist/assets/date-picker-2IDsBs2n.js +4115 -0
  181. package/dist/assets/dateFormatter-ik4-9_9r.js +33 -0
  182. package/dist/assets/dateformat-hG8NERse.js +181 -0
  183. package/dist/assets/dialog-lMho1TD8.js +425 -0
  184. package/dist/assets/dist-Cw46Is-h.js +151 -0
  185. package/dist/assets/doppler-B__k0MeW.webp +0 -0
  186. package/dist/assets/element-icons-B-tDfklg.woff +0 -0
  187. package/dist/assets/element-icons-_lZGOqcG.ttf +0 -0
  188. package/dist/assets/empty-BuGRxzl4.js +2210 -0
  189. package/dist/assets/en-CF30SCh2.js +95 -0
  190. package/dist/assets/en-DyO2pPiC.js +2 -0
  191. package/dist/assets/es-BkUFJVtD.js +43338 -0
  192. package/dist/assets/evaluation.constants-GYAwmJnh.js +284 -0
  193. package/dist/assets/executions.store-B9uRYwgv.js +205 -0
  194. package/dist/assets/exports-Crx_gvt_.js +1799 -0
  195. package/dist/assets/externalSecrets.ee.store-BJh4a_6G.js +118 -0
  196. package/dist/assets/fileUtils-CRWqOQje.js +20 -0
  197. package/dist/assets/folders.store-yAFj-5Vl.js +235 -0
  198. package/dist/assets/get-BcEmeOxn.js +2781 -0
  199. package/dist/assets/index-SL8542zQ.js +28372 -0
  200. package/dist/assets/insights.constants-BkJCYJTL.js +55 -0
  201. package/dist/assets/insights.store-BFc3kDUo.js +61 -0
  202. package/dist/assets/insights.utils-CcLXdrrz.js +77 -0
  203. package/dist/assets/isEmpty-C3XXoHqJ.js +35216 -0
  204. package/dist/assets/languageModules-9LyndCqU.js +13862 -0
  205. package/dist/assets/logStreaming.store-IZhWe_VK.js +190 -0
  206. package/dist/assets/mcp.constants-_Jcn7fPq.js +10 -0
  207. package/dist/assets/mcp.store-B9yfcAN9.js +116 -0
  208. package/dist/assets/merge-DhuTk1HM.js +564 -0
  209. package/dist/assets/nodeCreator.store-Bpnrwp2l.js +5444 -0
  210. package/dist/assets/nodeIcon-D6X-ENYt.js +102 -0
  211. package/dist/assets/nodeTransforms-RzcOM0v2.js +42 -0
  212. package/dist/assets/orderBy-Cu9F9DU_.js +15 -0
  213. package/dist/assets/path-browserify-RUt2u7iT.js +328 -0
  214. package/dist/assets/personalizedTemplatesV3.store-BGYp0YBN.js +334 -0
  215. package/dist/assets/pickBy-UI0Jt4wC.js +18 -0
  216. package/dist/assets/preload-helper-dyVz7ck7.js +59 -0
  217. package/dist/assets/radio-CSce3UT0.js +262 -0
  218. package/dist/assets/readyToRun.store-YEMvPUqo.js +626 -0
  219. package/dist/assets/readyToRunWorkflows.store-G3srgIze.js +1319 -0
  220. package/dist/assets/retry-BgHaYzbB.js +23 -0
  221. package/dist/assets/roles.store-CRf_zJTb.js +51 -0
  222. package/dist/assets/router-DNpzz3GH.js +2631 -0
  223. package/dist/assets/sanitize-html-CbW56HUN.js +10758 -0
  224. package/dist/assets/schemaPreview.store-DUgN1yVE.js +113 -0
  225. package/dist/assets/semver-Bk6DGseV.js +1306 -0
  226. package/dist/assets/smartDecimal-DAZl4HKA.js +6 -0
  227. package/dist/assets/sortByProperty-Cn7iGKYu.js +8 -0
  228. package/dist/assets/sourceControl.eventBus-D47xXSc_.js +3 -0
  229. package/dist/assets/sqlite3-DBpDb1lf.wasm +0 -0
  230. package/dist/assets/sqlite3-opfs-async-proxy-vVtmDGHX.js +461 -0
  231. package/dist/assets/sqlite3-worker1-bundler-friendly-DLarOZDL.js +9405 -0
  232. package/dist/assets/src-jviYSG25.js +55454 -0
  233. package/dist/assets/sso.store-DyApJwhx.js +139 -0
  234. package/dist/assets/style-E3CrYFV8.css +111829 -0
  235. package/dist/assets/table-we1DjFMV.js +3944 -0
  236. package/dist/assets/templateActions-bEDSARw2.js +65 -0
  237. package/dist/assets/templateTransforms-BHWiRbtR.js +43 -0
  238. package/dist/assets/truncate-C0KYt7i3.js +4176 -0
  239. package/dist/assets/typescript.worker-CYqLvLHh.js +152048 -0
  240. package/dist/assets/uniqBy-xDyuCRP0.js +10 -0
  241. package/dist/assets/usage.store-CU5J_nGm.js +100 -0
  242. package/dist/assets/useActions-B1JckIRj.js +255 -0
  243. package/dist/assets/useBeforeUnload-DiDkvI8p.js +40 -0
  244. package/dist/assets/useCanvasMapping-BXT7rGhC.js +12570 -0
  245. package/dist/assets/useCanvasOperations-8ULLtMkY.js +1765 -0
  246. package/dist/assets/useClipboard-DvjhVHqJ.js +39 -0
  247. package/dist/assets/useCommandBar-C4tLJbKt.js +2425 -0
  248. package/dist/assets/useCredentialResolvers-BKeFGJnY.js +78 -0
  249. package/dist/assets/useCustomAgent-DpILEt5e.js +471 -0
  250. package/dist/assets/useDebounce-Br5_1ug-.js +147 -0
  251. package/dist/assets/useExecutionData-M5iKsX6z.js +23 -0
  252. package/dist/assets/useExecutionDebugging-8azMzbnd.js +191 -0
  253. package/dist/assets/useExecutionHelpers-BgRRhpBM.js +91 -0
  254. package/dist/assets/useImportCurlCommand-CKiEmX5P.js +8891 -0
  255. package/dist/assets/useIntersectionObserver-BWMwOueh.js +33 -0
  256. package/dist/assets/useKeybindings-B2jfN6rd.js +62 -0
  257. package/dist/assets/useLogsTreeExpand-sZViUfdM.js +843 -0
  258. package/dist/assets/useMcp-DoMOIfqT.js +27 -0
  259. package/dist/assets/usePageRedirectionHelper-DjkznpX6.js +51 -0
  260. package/dist/assets/usePinnedData-BhZkqttf.js +203 -0
  261. package/dist/assets/usePushConnection-DMS-F_IW.js +513 -0
  262. package/dist/assets/useRecentResources-BVORr7eM.js +118 -0
  263. package/dist/assets/useRunWorkflow-LO7ffLp9.js +950 -0
  264. package/dist/assets/useSettingsItems-BhZXwMZn.js +144 -0
  265. package/dist/assets/useTelemetryContext-V6bv4YRq.js +34 -0
  266. package/dist/assets/useWorkflowActivate-DeSmDXjI.js +152 -0
  267. package/dist/assets/useWorkflowsCache-DtcEEAIR.js +179 -0
  268. package/dist/assets/userRoleProvisioning.store-kkSIdeTo.js +33 -0
  269. package/dist/assets/utils-DI7dLldp.js +54 -0
  270. package/dist/assets/versions.store-B1z2OrLE.js +191 -0
  271. package/dist/assets/vue-CydWIhxN.js +4378 -0
  272. package/dist/assets/vue-json-pretty-CsGX66mG.js +1130 -0
  273. package/dist/assets/vue.runtime.esm-bundler-tP5dCd7J.js +7325 -0
  274. package/dist/assets/xml-B_oj6Mle.js +2060 -0
  275. package/dist/favicon.ico +0 -0
  276. package/dist/index.html +157 -0
  277. package/dist/static/base-path.js +1 -0
  278. package/dist/static/community_package_tooltip_img.png +0 -0
  279. package/dist/static/data-mapping-gif.gif +0 -0
  280. package/dist/static/form-grey.svg +1 -0
  281. package/dist/static/google-auth/disabled.dark.png +0 -0
  282. package/dist/static/google-auth/disabled.png +0 -0
  283. package/dist/static/google-auth/focus.dark.png +0 -0
  284. package/dist/static/google-auth/focus.png +0 -0
  285. package/dist/static/google-auth/normal.dark.png +0 -0
  286. package/dist/static/google-auth/normal.png +0 -0
  287. package/dist/static/google-auth/pressed.dark.png +0 -0
  288. package/dist/static/google-auth/pressed.png +0 -0
  289. package/dist/static/n8n-logo.png +0 -0
  290. package/dist/static/og_image.png +0 -0
  291. package/dist/static/open-ai.svg +1 -0
  292. package/dist/static/openChat.png +0 -0
  293. package/dist/static/posthog.init.js +41 -0
  294. package/dist/static/prefers-color-scheme.css +5 -0
  295. package/dist/static/webhook-icon.svg +1 -0
  296. package/dist/tree-sitter-bash.wasm +0 -0
  297. package/dist/tree-sitter.wasm +0 -0
  298. package/eslint.config.mjs +59 -0
  299. package/index.html +45 -0
  300. package/index.js +0 -0
  301. package/package.json +147 -0
  302. package/postcss.config.cjs +6 -0
  303. package/scripts/fetch-node-popularity.mjs +102 -0
  304. package/stylelint.config.mjs +9 -0
  305. package/tailwind.config.js +8 -0
  306. package/tsconfig.json +36 -0
  307. package/vite/i18n-locales-hmr-helpers.ts +19 -0
  308. package/vite/source-map-js-shim.ts +1 -0
  309. package/vite/vite-plugin-node-popularity.mts +32 -0
  310. package/vite.config.mts +304 -0
@@ -0,0 +1,865 @@
1
+ import { C as computed, It as ref } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
2
+ import { rt as useI18n } from "./core-CRbPymLT.js";
3
+ import { k as useTelemetry, us as v4_default, y as useToast } from "./builder.store-Czk2ipDE.js";
4
+ import { $r as chatHubProviderSchema, ei as emptyChatModelsResponse, wa as deepCopy } from "./constants-C8OH4tTq.js";
5
+ import { k as defineStore, p as streamRequest, r as useRootStore, s as ResponseError, u as makeRestApiRequest } from "./_baseOrderBy-N8Be_6z6.js";
6
+ import { t as retry } from "./retry-BgHaYzbB.js";
7
+ import { l as CHAT_STORE, s as CHAT_SESSIONS_PAGE_SIZE, u as CHAT_VIEW } from "./constants-DMrsrpD7.js";
8
+ import { t as convertFileToBinaryData } from "./fileUtils-CRWqOQje.js";
9
+ var STREAM_SEPARATOR = "\n";
10
+ const fetchChatModelsApi = async (context, payload) => {
11
+ return await makeRestApiRequest(context, "POST", "/chat/models", payload);
12
+ };
13
+ function sendMessageApi(ctx, payload, onMessageUpdated, onDone, onError) {
14
+ streamRequest(ctx, "/chat/conversations/send", payload, onMessageUpdated, onDone, onError, STREAM_SEPARATOR);
15
+ }
16
+ function editMessageApi(ctx, request, onMessageUpdated, onDone, onError) {
17
+ streamRequest(ctx, `/chat/conversations/${request.sessionId}/messages/${request.editId}/edit`, request.payload, onMessageUpdated, onDone, onError, STREAM_SEPARATOR);
18
+ }
19
+ function regenerateMessageApi(ctx, request, onMessageUpdated, onDone, onError) {
20
+ streamRequest(ctx, `/chat/conversations/${request.sessionId}/messages/${request.retryId}/regenerate`, request.payload, onMessageUpdated, onDone, onError, STREAM_SEPARATOR);
21
+ }
22
+ const stopGenerationApi = async (context, sessionId, messageId) => {
23
+ await makeRestApiRequest(context, "POST", `/chat/conversations/${sessionId}/messages/${messageId}/stop`);
24
+ };
25
+ const fetchConversationsApi = async (context, limit, cursor) => {
26
+ const queryParams = new URLSearchParams();
27
+ queryParams.append("limit", limit.toString());
28
+ if (cursor) queryParams.append("cursor", cursor);
29
+ return await makeRestApiRequest(context, "GET", `/chat/conversations?${queryParams.toString()}`);
30
+ };
31
+ const updateConversationApi = async (context, sessionId, updates) => {
32
+ return await makeRestApiRequest(context, "PATCH", `/chat/conversations/${sessionId}`, updates);
33
+ };
34
+ const updateConversationTitleApi = async (context, sessionId, title) => {
35
+ return await updateConversationApi(context, sessionId, { title });
36
+ };
37
+ const deleteConversationApi = async (context, sessionId) => {
38
+ await makeRestApiRequest(context, "DELETE", `/chat/conversations/${sessionId}`);
39
+ };
40
+ const fetchSingleConversationApi = async (context, sessionId) => {
41
+ return await makeRestApiRequest(context, "GET", `/chat/conversations/${sessionId}`);
42
+ };
43
+ const fetchAgentApi = async (context, agentId) => {
44
+ return await makeRestApiRequest(context, "GET", `/chat/agents/${agentId}`);
45
+ };
46
+ const createAgentApi = async (context, payload) => {
47
+ return await makeRestApiRequest(context, "POST", "/chat/agents", payload);
48
+ };
49
+ const updateAgentApi = async (context, agentId, payload) => {
50
+ return await makeRestApiRequest(context, "POST", `/chat/agents/${agentId}`, payload);
51
+ };
52
+ const deleteAgentApi = async (context, agentId) => {
53
+ await makeRestApiRequest(context, "DELETE", `/chat/agents/${agentId}`);
54
+ };
55
+ const fetchChatSettingsApi = async (context) => {
56
+ return (await makeRestApiRequest(context, "GET", "/chat/settings")).providers;
57
+ };
58
+ const fetchChatProviderSettingsApi = async (context, provider) => {
59
+ return (await makeRestApiRequest(context, "GET", "/chat/settings/" + provider)).settings;
60
+ };
61
+ const updateChatSettingsApi = async (context, settings) => {
62
+ return await makeRestApiRequest(context, "POST", "/chat/settings", { payload: settings });
63
+ };
64
+ function buildChatAttachmentUrl(context, sessionId, messageId, attachmentIndex) {
65
+ return `${context.baseUrl}/chat/conversations/${sessionId}/messages/${messageId}/attachments/${attachmentIndex}`;
66
+ }
67
+ function getRelativeDate(now, dateString) {
68
+ const date = new Date(dateString);
69
+ const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
70
+ const yesterday = new Date(today);
71
+ yesterday.setDate(yesterday.getDate() - 1);
72
+ const lastWeek = new Date(today);
73
+ lastWeek.setDate(lastWeek.getDate() - 7);
74
+ const conversationDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
75
+ if (conversationDate.getTime() === today.getTime()) return "Today";
76
+ else if (conversationDate.getTime() === yesterday.getTime()) return "Yesterday";
77
+ else if (conversationDate >= lastWeek) return "This week";
78
+ else return "Older";
79
+ }
80
+ function groupConversationsByDate(sessions) {
81
+ const now = /* @__PURE__ */ new Date();
82
+ const groups = /* @__PURE__ */ new Map();
83
+ for (const session of sessions) {
84
+ const group = getRelativeDate(now, session.lastMessageAt ?? session.updatedAt);
85
+ if (!groups.has(group)) groups.set(group, []);
86
+ groups.get(group).push(session);
87
+ }
88
+ return [
89
+ "Today",
90
+ "Yesterday",
91
+ "This week",
92
+ "Older"
93
+ ].flatMap((groupName) => {
94
+ const sessions$1 = groups.get(groupName) ?? [];
95
+ return sessions$1.length > 0 ? [{
96
+ group: groupName,
97
+ sessions: sessions$1.sort((a, b) => Date.parse(b.lastMessageAt ?? b.updatedAt) - Date.parse(a.lastMessageAt ?? a.updatedAt))
98
+ }] : [];
99
+ });
100
+ }
101
+ function getAgentRoute(model) {
102
+ if (model.provider === "n8n") return {
103
+ name: CHAT_VIEW,
104
+ query: { workflowId: model.workflowId }
105
+ };
106
+ if (model.provider === "custom-agent") return {
107
+ name: CHAT_VIEW,
108
+ query: { agentId: model.agentId }
109
+ };
110
+ return {
111
+ name: CHAT_VIEW,
112
+ query: {
113
+ provider: model.provider,
114
+ model: model.model
115
+ }
116
+ };
117
+ }
118
+ function flattenModel(model) {
119
+ return {
120
+ provider: model.provider,
121
+ model: model?.provider === "n8n" || model?.provider === "custom-agent" ? null : model?.model ?? null,
122
+ workflowId: model?.provider === "n8n" ? model.workflowId : null,
123
+ agentId: model?.provider === "custom-agent" ? model.agentId : null
124
+ };
125
+ }
126
+ function unflattenModel(messageOrSession) {
127
+ if (messageOrSession.provider === null) return null;
128
+ switch (messageOrSession.provider) {
129
+ case "custom-agent":
130
+ if (!messageOrSession.agentId) return null;
131
+ return {
132
+ provider: "custom-agent",
133
+ agentId: messageOrSession.agentId
134
+ };
135
+ case "n8n":
136
+ if (!messageOrSession.workflowId) return null;
137
+ return {
138
+ provider: "n8n",
139
+ workflowId: messageOrSession.workflowId
140
+ };
141
+ default:
142
+ if (messageOrSession.model === null) return null;
143
+ return {
144
+ provider: messageOrSession.provider,
145
+ model: messageOrSession.model
146
+ };
147
+ }
148
+ }
149
+ function filterAndSortAgents(models, filter) {
150
+ let filtered = models;
151
+ if (filter.search.trim()) {
152
+ const query = filter.search.toLowerCase();
153
+ filtered = filtered.filter((model) => model.name.toLowerCase().includes(query));
154
+ }
155
+ filtered = [...filtered].sort((a, b) => {
156
+ const dateAStr = a[filter.sortBy];
157
+ const dateBStr = b[filter.sortBy];
158
+ const dateA = dateAStr ? Date.parse(dateAStr) : void 0;
159
+ const dateB = dateBStr ? Date.parse(dateBStr) : void 0;
160
+ if (dateA && dateB) return dateB - dateA;
161
+ if (dateA && !dateB) return -1;
162
+ if (!dateA && dateB) return 1;
163
+ return 0;
164
+ });
165
+ return filtered;
166
+ }
167
+ function stringifyModel(model) {
168
+ return `${model.provider}::${model.provider === "custom-agent" ? model.agentId : model.provider === "n8n" ? model.workflowId : model.model}`;
169
+ }
170
+ function fromStringToModel(value) {
171
+ const [provider, identifier] = value.split("::");
172
+ const parsedProvider = chatHubProviderSchema.safeParse(provider).data;
173
+ if (!parsedProvider) return;
174
+ return parsedProvider === "n8n" ? {
175
+ provider: "n8n",
176
+ workflowId: identifier
177
+ } : parsedProvider === "custom-agent" ? {
178
+ provider: "custom-agent",
179
+ agentId: identifier
180
+ } : {
181
+ provider: parsedProvider,
182
+ model: identifier
183
+ };
184
+ }
185
+ function isMatchedAgent(agent, model) {
186
+ if (model.provider === "n8n") return agent.model.provider === "n8n" && agent.model.workflowId === model.workflowId;
187
+ if (model.provider === "custom-agent") return agent.model.provider === "custom-agent" && agent.model.agentId === model.agentId;
188
+ return agent.model.provider === model.provider && agent.model.model === model.model;
189
+ }
190
+ function createAiMessageFromStreamingState(sessionId, messageId, streaming) {
191
+ return {
192
+ id: messageId,
193
+ sessionId,
194
+ type: "ai",
195
+ name: "AI",
196
+ content: "",
197
+ executionId: streaming?.executionId ?? null,
198
+ status: "running",
199
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
200
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
201
+ previousMessageId: streaming?.previousMessageId ?? null,
202
+ retryOfMessageId: streaming?.retryOfMessageId ?? null,
203
+ revisionOfMessageId: null,
204
+ responses: [],
205
+ alternatives: [],
206
+ attachments: [],
207
+ ...streaming?.agent ? flattenModel(streaming.agent.model) : {
208
+ provider: null,
209
+ model: null,
210
+ workflowId: null,
211
+ agentId: null
212
+ }
213
+ };
214
+ }
215
+ function createHumanMessageFromStreamingState(streaming) {
216
+ return {
217
+ id: streaming.promptId,
218
+ sessionId: streaming.sessionId,
219
+ type: "human",
220
+ name: "User",
221
+ content: streaming.promptText,
222
+ provider: null,
223
+ model: null,
224
+ workflowId: null,
225
+ executionId: null,
226
+ agentId: null,
227
+ status: "success",
228
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
229
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
230
+ previousMessageId: streaming.promptPreviousMessageId,
231
+ retryOfMessageId: null,
232
+ revisionOfMessageId: streaming.revisionOfMessageId,
233
+ responses: [],
234
+ alternatives: [],
235
+ attachments: streaming.attachments
236
+ };
237
+ }
238
+ function buildUiMessages(sessionId, conversation, streaming) {
239
+ const messagesToShow = [];
240
+ let foundRunning = false;
241
+ for (let index = 0; index < conversation.activeMessageChain.length; index++) {
242
+ const id = conversation.activeMessageChain[index];
243
+ const message = conversation.messages[id];
244
+ if (!message) continue;
245
+ foundRunning = foundRunning || message.status === "running";
246
+ if (foundRunning || streaming?.sessionId !== sessionId || message.type !== "ai") {
247
+ messagesToShow.push(message);
248
+ continue;
249
+ }
250
+ if (streaming.retryOfMessageId === id && !streaming.messageId) {
251
+ messagesToShow.push({
252
+ ...message,
253
+ content: "",
254
+ status: "running",
255
+ ...flattenModel(streaming.agent.model)
256
+ });
257
+ foundRunning = true;
258
+ continue;
259
+ }
260
+ if (streaming.messageId && index === conversation.activeMessageChain.length - 1) {
261
+ messagesToShow.push({
262
+ ...message,
263
+ status: "running"
264
+ });
265
+ foundRunning = true;
266
+ continue;
267
+ }
268
+ messagesToShow.push(message);
269
+ }
270
+ return messagesToShow;
271
+ }
272
+ function isLlmProvider(provider) {
273
+ return provider !== "n8n" && provider !== "custom-agent";
274
+ }
275
+ function isLlmProviderModel(model) {
276
+ return isLlmProvider(model?.provider);
277
+ }
278
+ function findOneFromModelsResponse(response, providerSettings) {
279
+ for (const provider of chatHubProviderSchema.options) {
280
+ const settings = isLlmProvider(provider) ? providerSettings[provider] : void 0;
281
+ if (!settings?.enabled) continue;
282
+ const availableModels = response[provider].models.filter((providerModel) => {
283
+ const { model } = providerModel;
284
+ if (isLlmProviderModel(model) && settings.allowedModels.length > 0) return settings.allowedModels.some((allowed) => allowed.model === model.model);
285
+ return true;
286
+ });
287
+ if (availableModels.length > 0) return availableModels[0];
288
+ }
289
+ }
290
+ function createSessionFromStreamingState(streaming) {
291
+ return {
292
+ id: streaming.sessionId,
293
+ title: "New Chat",
294
+ ownerId: "",
295
+ lastMessageAt: (/* @__PURE__ */ new Date()).toISOString(),
296
+ credentialId: null,
297
+ agentName: streaming.agent.name,
298
+ agentIcon: streaming.agent.icon,
299
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
300
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
301
+ tools: streaming.tools,
302
+ ...flattenModel(streaming.agent.model)
303
+ };
304
+ }
305
+ function createMimeTypes(modalities) {
306
+ if (modalities.includes("file")) return "*/*";
307
+ const mimeTypes = ["text/*"];
308
+ for (const modality of modalities) {
309
+ if (modality === "image") mimeTypes.push("image/*");
310
+ if (modality === "audio") mimeTypes.push("audio/*");
311
+ if (modality === "video") mimeTypes.push("video/*");
312
+ }
313
+ return mimeTypes.join(",");
314
+ }
315
+ const personalAgentDefaultIcon = {
316
+ type: "icon",
317
+ value: "message-square"
318
+ };
319
+ const workflowAgentDefaultIcon = {
320
+ type: "icon",
321
+ value: "bot"
322
+ };
323
+ function promisifyStreamingApi(streamingApi) {
324
+ return async (ctx, payload, onChunk, onDone, onError) => {
325
+ let settled = false;
326
+ let resolvePromise;
327
+ let rejectPromise;
328
+ const promise = new Promise((resolve, reject) => {
329
+ resolvePromise = resolve;
330
+ rejectPromise = reject;
331
+ });
332
+ streamingApi(ctx, payload, (chunk) => {
333
+ if (!settled) {
334
+ settled = true;
335
+ resolvePromise();
336
+ }
337
+ onChunk(chunk);
338
+ }, () => {
339
+ if (!settled) {
340
+ settled = true;
341
+ resolvePromise();
342
+ }
343
+ onDone();
344
+ }, (error) => {
345
+ if (!settled) {
346
+ settled = true;
347
+ rejectPromise(error);
348
+ }
349
+ onError(error);
350
+ });
351
+ return await promise;
352
+ };
353
+ }
354
+ const useChatStore = defineStore(CHAT_STORE, () => {
355
+ const rootStore = useRootStore();
356
+ const toast = useToast();
357
+ const telemetry = useTelemetry();
358
+ const i18n = useI18n();
359
+ const agents = ref(null);
360
+ const customAgents = ref({});
361
+ const sessions = ref({
362
+ byId: {},
363
+ ids: null,
364
+ hasMore: false,
365
+ nextCursor: null
366
+ });
367
+ const sessionsLoadingMore = ref(false);
368
+ const streaming = ref();
369
+ const settingsLoading = ref(false);
370
+ const settings = ref(null);
371
+ const conversationsBySession = ref(/* @__PURE__ */ new Map());
372
+ const getConversation = (sessionId) => conversationsBySession.value.get(sessionId);
373
+ const getActiveMessages = (sessionId) => {
374
+ const conversation = getConversation(sessionId);
375
+ if (!conversation) return [];
376
+ return buildUiMessages(sessionId, conversation, streaming.value);
377
+ };
378
+ function ensureConversation(sessionId) {
379
+ if (!conversationsBySession.value.has(sessionId)) conversationsBySession.value.set(sessionId, {
380
+ messages: {},
381
+ activeMessageChain: []
382
+ });
383
+ const conversation = conversationsBySession.value.get(sessionId);
384
+ if (!conversation) throw new Error(`Conversation for session ID ${sessionId} not found`);
385
+ return conversation;
386
+ }
387
+ function lastMessage(sessionId) {
388
+ const conversation = getConversation(sessionId);
389
+ if (!conversation || conversation.activeMessageChain.length === 0) return null;
390
+ const messageId = conversation.activeMessageChain[conversation.activeMessageChain.length - 1];
391
+ return conversation.messages[messageId] ?? null;
392
+ }
393
+ function isResponding(sessionId) {
394
+ return streaming.value?.sessionId === sessionId;
395
+ }
396
+ function computeActiveChain(messages, messageId) {
397
+ const chain = [];
398
+ if (!messageId) return chain;
399
+ let latest = messageId;
400
+ while (true) {
401
+ const responses = messages[latest].responses;
402
+ if (responses.length === 0) break;
403
+ latest = responses[responses.length - 1];
404
+ }
405
+ let current = latest;
406
+ const visited = /* @__PURE__ */ new Set();
407
+ while (current && !visited.has(current)) {
408
+ chain.unshift(current);
409
+ visited.add(current);
410
+ current = messages[current]?.previousMessageId ?? null;
411
+ }
412
+ return chain;
413
+ }
414
+ function linkMessages(messages) {
415
+ const messagesGraph = {};
416
+ for (const message of messages) messagesGraph[message.id] = {
417
+ ...message,
418
+ responses: [],
419
+ alternatives: []
420
+ };
421
+ for (const node of Object.values(messagesGraph)) {
422
+ if (node.previousMessageId && messagesGraph[node.previousMessageId]) messagesGraph[node.previousMessageId].responses.push(node.id);
423
+ if (node.retryOfMessageId && messagesGraph[node.retryOfMessageId]) messagesGraph[node.retryOfMessageId].alternatives.push(node.id);
424
+ if (node.revisionOfMessageId && messagesGraph[node.revisionOfMessageId]) messagesGraph[node.revisionOfMessageId].alternatives.push(node.id);
425
+ }
426
+ const sortByRunThenTime = (first, second) => {
427
+ const a = messagesGraph[first];
428
+ const b = messagesGraph[second];
429
+ if (a.createdAt !== b.createdAt) return a.createdAt < b.createdAt ? -1 : 1;
430
+ return a.id < b.id ? -1 : 1;
431
+ };
432
+ for (const node of Object.values(messagesGraph)) {
433
+ if (!node.alternatives.includes(node.id)) node.alternatives.push(node.id);
434
+ if (node.retryOfMessageId && messagesGraph[node.retryOfMessageId]) {
435
+ node.alternatives.push(node.retryOfMessageId);
436
+ for (const other of messagesGraph[node.retryOfMessageId].alternatives) if (other !== node.id && !node.alternatives.includes(other)) node.alternatives.push(other);
437
+ }
438
+ if (node.revisionOfMessageId && messagesGraph[node.revisionOfMessageId]) {
439
+ node.alternatives.push(node.revisionOfMessageId);
440
+ for (const other of messagesGraph[node.revisionOfMessageId].alternatives) if (other !== node.id && !node.alternatives.includes(other)) node.alternatives.push(other);
441
+ }
442
+ node.responses.sort(sortByRunThenTime);
443
+ node.alternatives.sort(sortByRunThenTime);
444
+ }
445
+ return messagesGraph;
446
+ }
447
+ function addMessage(sessionId, message) {
448
+ const conversation = ensureConversation(sessionId);
449
+ conversation.messages[message.id] = message;
450
+ conversation.messages = linkMessages(Object.values(conversation.messages));
451
+ conversation.activeMessageChain = computeActiveChain(conversation.messages, message.id);
452
+ return message;
453
+ }
454
+ function replaceMessageContent(sessionId, messageId, content) {
455
+ const message = ensureConversation(sessionId).messages[messageId];
456
+ if (!message) throw new Error(`Message with ID ${messageId} not found in session ${sessionId}`);
457
+ message.content = content;
458
+ }
459
+ function appendMessage(sessionId, messageId, chunk) {
460
+ const message = ensureConversation(sessionId).messages[messageId];
461
+ if (!message) throw new Error(`Message with ID ${messageId} not found in session ${sessionId}`);
462
+ message.content += chunk;
463
+ }
464
+ function updateMessage(sessionId, messageId, status, content) {
465
+ const message = ensureConversation(sessionId).messages[messageId];
466
+ if (!message) throw new Error(`Message with ID ${messageId} not found in session ${sessionId}`);
467
+ message.status = status;
468
+ if (content) message.content = content;
469
+ message.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
470
+ }
471
+ async function fetchAgents(credentialMap, options = {}) {
472
+ [agents.value] = await Promise.all([fetchChatModelsApi(rootStore.restApiContext, { credentials: credentialMap }), new Promise((r) => setTimeout(r, options.minLoadingTime ?? 0))]);
473
+ return agents.value;
474
+ }
475
+ async function fetchSessions(reset, options = {}) {
476
+ if (sessionsLoadingMore.value) return;
477
+ if (!reset && sessions.value && !sessions.value.hasMore && (sessions.value.ids ?? []).length > 0) return;
478
+ if (!reset) sessionsLoadingMore.value = true;
479
+ try {
480
+ const cursor = reset ? void 0 : sessions.value?.nextCursor ?? void 0;
481
+ const [response] = await Promise.all([fetchConversationsApi(rootStore.restApiContext, 18, cursor), new Promise((resolve) => setTimeout(resolve, options.minLoadingTime ?? 0))]);
482
+ if (reset || sessions.value.ids === null) sessions.value.ids = [];
483
+ sessions.value.hasMore = response.hasMore;
484
+ sessions.value.nextCursor = response.nextCursor;
485
+ for (const session of response.data) {
486
+ sessions.value.ids.push(session.id);
487
+ sessions.value.byId[session.id] = session;
488
+ }
489
+ } finally {
490
+ sessionsLoadingMore.value = false;
491
+ }
492
+ }
493
+ async function fetchMoreSessions(options = {}) {
494
+ if (sessions.value?.hasMore && !sessionsLoadingMore.value) await fetchSessions(false, options);
495
+ }
496
+ async function fetchMessages(sessionId) {
497
+ const { conversation, session } = await fetchSingleConversationApi(rootStore.restApiContext, sessionId);
498
+ const messages = linkMessages(Object.values(conversation.messages));
499
+ const latestMessage = Object.values(messages).sort((a, b) => a.createdAt < b.createdAt ? -1 : 1).pop();
500
+ conversationsBySession.value.set(sessionId, {
501
+ messages,
502
+ activeMessageChain: computeActiveChain(messages, latestMessage?.id ?? null)
503
+ });
504
+ sessions.value.byId[sessionId] = session;
505
+ }
506
+ async function fetchConversationTitle(sessionId) {
507
+ const current = sessions.value.byId[sessionId];
508
+ if (!current || current.title === "New Chat") await retry(async () => {
509
+ try {
510
+ return (await fetchSingleConversationApi(rootStore.restApiContext, sessionId)).session.title !== "New Chat";
511
+ } catch (e) {
512
+ return false;
513
+ }
514
+ }, 2e3, 10);
515
+ await fetchSessions(true);
516
+ }
517
+ function onBeginMessage() {
518
+ if (!streaming.value?.messageId) return;
519
+ if (!streaming.value.retryOfMessageId) addMessage(streaming.value.sessionId, createHumanMessageFromStreamingState(streaming.value));
520
+ if (!sessions.value.byId[streaming.value.sessionId]) {
521
+ sessions.value.byId[streaming.value.sessionId] = createSessionFromStreamingState(streaming.value);
522
+ sessions.value.ids ??= [];
523
+ sessions.value.ids.unshift(streaming.value.sessionId);
524
+ }
525
+ const message = createAiMessageFromStreamingState(streaming.value.sessionId, streaming.value.messageId, streaming.value);
526
+ addMessage(streaming.value.sessionId, message);
527
+ }
528
+ function ensureMessage(sessionId, messageId) {
529
+ const message = ensureConversation(sessionId).messages[messageId];
530
+ if (message) return message;
531
+ return addMessage(sessionId, createAiMessageFromStreamingState(sessionId, messageId, streaming.value));
532
+ }
533
+ function onChunk(chunk) {
534
+ if (streaming.value?.messageId) appendMessage(streaming.value.sessionId, streaming.value.messageId, chunk);
535
+ }
536
+ function onEndMessage() {
537
+ if (streaming.value?.messageId) updateMessage(streaming.value.sessionId, streaming.value.messageId, "success");
538
+ }
539
+ function onStreamMessage(chunk) {
540
+ if (!streaming.value) return;
541
+ const { sessionId } = streaming.value;
542
+ streaming.value = {
543
+ ...streaming.value,
544
+ ...chunk.metadata
545
+ };
546
+ switch (chunk.type) {
547
+ case "begin":
548
+ onBeginMessage();
549
+ break;
550
+ case "item":
551
+ onChunk(chunk.content ?? "");
552
+ break;
553
+ case "end":
554
+ onEndMessage();
555
+ break;
556
+ case "error":
557
+ if (ensureMessage(sessionId, chunk.metadata.messageId).status === "cancelled") return;
558
+ updateMessage(sessionId, chunk.metadata.messageId, "error", chunk.content);
559
+ break;
560
+ }
561
+ }
562
+ async function onStreamDone() {
563
+ if (!streaming.value) return;
564
+ const { sessionId } = streaming.value;
565
+ streaming.value = void 0;
566
+ await fetchConversationTitle(sessionId);
567
+ }
568
+ function getErrorMessageByStatusCode(statusCode, message) {
569
+ const errorMessages = {
570
+ [413]: i18n.baseText("chatHub.error.payloadTooLarge"),
571
+ [400]: message ?? i18n.baseText("chatHub.error.badRequest"),
572
+ [403]: i18n.baseText("chatHub.error.forbidden"),
573
+ [500]: message ? i18n.baseText("chatHub.error.serverErrorWithReason", { interpolate: { error: message } }) : i18n.baseText("chatHub.error.serverError")
574
+ };
575
+ return statusCode && errorMessages[statusCode] || message || i18n.baseText("chatHub.error.unknown");
576
+ }
577
+ async function onStreamError(error) {
578
+ if (!streaming.value) return;
579
+ const cause = error instanceof ResponseError ? new Error(getErrorMessageByStatusCode(error.httpStatusCode, error.message)) : error instanceof Error && error.message.includes("Failed to fetch") ? new Error(i18n.baseText("chatHub.error.noConnection")) : error;
580
+ toast.showError(cause, i18n.baseText("chatHub.error.sendMessageFailed"));
581
+ const { sessionId } = streaming.value;
582
+ streaming.value = void 0;
583
+ await fetchConversationTitle(sessionId);
584
+ }
585
+ async function sendMessage(sessionId, message, agent, credentials, tools, files = []) {
586
+ const messageId = v4_default();
587
+ const conversation = ensureConversation(sessionId);
588
+ const previousMessageId = conversation.activeMessageChain.length ? conversation.activeMessageChain[conversation.activeMessageChain.length - 1] : null;
589
+ const attachments = (await Promise.all(files.map(convertFileToBinaryData))).map((attachment) => ({
590
+ fileName: attachment.fileName ?? "unnamed file",
591
+ mimeType: attachment.mimeType,
592
+ data: attachment.data
593
+ }));
594
+ streaming.value = {
595
+ promptPreviousMessageId: previousMessageId,
596
+ promptId: messageId,
597
+ promptText: message,
598
+ sessionId,
599
+ retryOfMessageId: null,
600
+ revisionOfMessageId: null,
601
+ tools,
602
+ attachments,
603
+ agent
604
+ };
605
+ telemetry.track("User sent chat hub message", {
606
+ ...flattenModel(agent.model),
607
+ is_custom: agent.model.provider === "custom-agent",
608
+ chat_session_id: sessionId
609
+ });
610
+ await promisifyStreamingApi(sendMessageApi)(rootStore.restApiContext, {
611
+ model: agent.model,
612
+ messageId,
613
+ sessionId,
614
+ message,
615
+ credentials,
616
+ previousMessageId,
617
+ tools,
618
+ attachments,
619
+ agentName: agent.name,
620
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone
621
+ }, onStreamMessage, onStreamDone, onStreamError);
622
+ }
623
+ async function editMessage(sessionId, editId, content, agent, credentials, keepAttachmentIndices = [], newFiles = []) {
624
+ const promptId = v4_default();
625
+ const message = ensureConversation(sessionId).messages[editId];
626
+ const previousMessageId = message?.previousMessageId ?? null;
627
+ const binaryData = await Promise.all(newFiles.map(convertFileToBinaryData));
628
+ const payload = {
629
+ model: agent.model,
630
+ messageId: promptId,
631
+ message: content,
632
+ credentials,
633
+ newAttachments: binaryData.map((attachment) => ({
634
+ fileName: attachment.fileName ?? "unnamed file",
635
+ mimeType: attachment.mimeType,
636
+ data: attachment.data
637
+ })),
638
+ keepAttachmentIndices,
639
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone
640
+ };
641
+ if (message?.type === "ai") replaceMessageContent(sessionId, editId, content);
642
+ streaming.value = {
643
+ promptPreviousMessageId: previousMessageId,
644
+ promptId,
645
+ promptText: content,
646
+ sessionId,
647
+ agent,
648
+ retryOfMessageId: null,
649
+ revisionOfMessageId: editId,
650
+ tools: [],
651
+ attachments: [...keepAttachmentIndices.flatMap((index) => {
652
+ const attachment = message?.attachments[index];
653
+ if (!attachment) return [];
654
+ return [{
655
+ fileName: attachment.fileName ?? "unnamed file",
656
+ mimeType: attachment.mimeType ?? "application/octet-stream",
657
+ data: ""
658
+ }];
659
+ }), ...binaryData]
660
+ };
661
+ telemetry.track("User edited chat hub message", {
662
+ ...flattenModel(agent.model),
663
+ is_custom: agent.model.provider === "custom-agent",
664
+ chat_session_id: sessionId,
665
+ chat_message_id: editId
666
+ });
667
+ await promisifyStreamingApi(editMessageApi)(rootStore.restApiContext, {
668
+ sessionId,
669
+ editId,
670
+ payload
671
+ }, onStreamMessage, onStreamDone, onStreamError);
672
+ }
673
+ async function regenerateMessage(sessionId, retryId, agent, credentials) {
674
+ const previousMessageId = ensureConversation(sessionId).messages[retryId]?.previousMessageId ?? null;
675
+ const payload = {
676
+ model: agent.model,
677
+ credentials,
678
+ timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone
679
+ };
680
+ if (!previousMessageId) throw new Error("No previous message to base regeneration on");
681
+ streaming.value = {
682
+ promptPreviousMessageId: previousMessageId,
683
+ promptId: retryId,
684
+ promptText: "",
685
+ sessionId,
686
+ agent,
687
+ retryOfMessageId: retryId,
688
+ revisionOfMessageId: null,
689
+ tools: [],
690
+ attachments: []
691
+ };
692
+ telemetry.track("User regenerated chat hub message", {
693
+ ...flattenModel(agent.model),
694
+ is_custom: agent.model.provider === "custom-agent",
695
+ chat_session_id: sessionId,
696
+ chat_message_id: retryId
697
+ });
698
+ await promisifyStreamingApi(regenerateMessageApi)(rootStore.restApiContext, {
699
+ sessionId,
700
+ retryId,
701
+ payload
702
+ }, onStreamMessage, onStreamDone, onStreamError);
703
+ }
704
+ async function stopStreamingMessage(sessionId) {
705
+ const currentMessage = lastMessage(sessionId);
706
+ if (currentMessage && currentMessage.status === "running") {
707
+ updateMessage(sessionId, currentMessage.id, "cancelled");
708
+ await stopGenerationApi(rootStore.restApiContext, sessionId, currentMessage.id);
709
+ await onStreamDone();
710
+ }
711
+ }
712
+ function updateSession(sessionId, toUpdate) {
713
+ const session = sessions.value.byId[sessionId];
714
+ if (session) sessions.value.byId[sessionId] = {
715
+ ...session,
716
+ ...toUpdate
717
+ };
718
+ }
719
+ async function updateToolsInSession(sessionId, tools) {
720
+ if (!sessions.value?.byId[sessionId]) throw new Error(`Session with ID ${sessionId} not found`);
721
+ updateSession(sessionId, (await updateConversationApi(rootStore.restApiContext, sessionId, { tools })).session);
722
+ }
723
+ async function renameSession(sessionId, title) {
724
+ updateSession(sessionId, (await updateConversationTitleApi(rootStore.restApiContext, sessionId, title)).session);
725
+ }
726
+ async function updateSessionModel(sessionId, model, agentName) {
727
+ updateSession(sessionId, (await updateConversationApi(rootStore.restApiContext, sessionId, { agent: {
728
+ model,
729
+ name: agentName
730
+ } })).session);
731
+ }
732
+ async function deleteSession(sessionId) {
733
+ await deleteConversationApi(rootStore.restApiContext, sessionId);
734
+ delete sessions.value.byId[sessionId];
735
+ sessions.value.ids = sessions.value.ids?.filter((id) => id !== sessionId) ?? null;
736
+ }
737
+ function switchAlternative(sessionId, messageId) {
738
+ const conversation = getConversation(sessionId);
739
+ if (!conversation?.messages[messageId]) throw new Error(`Message with ID ${messageId} not found in session ${sessionId}`);
740
+ conversation.activeMessageChain = computeActiveChain(conversation.messages, messageId);
741
+ }
742
+ async function fetchCustomAgent(agentId) {
743
+ const customAgent = await fetchAgentApi(rootStore.restApiContext, agentId);
744
+ customAgents.value[agentId] = customAgent;
745
+ }
746
+ function getCustomAgent(agentId) {
747
+ return agents.value?.["custom-agent"].models.find((model) => "agentId" in model && model.agentId === agentId);
748
+ }
749
+ async function createCustomAgent(payload, credentials) {
750
+ const customAgent = await createAgentApi(rootStore.restApiContext, payload);
751
+ const baseModel = agents.value?.[customAgent.provider]?.models.find((model) => model.name === customAgent.model);
752
+ const agent = {
753
+ model: {
754
+ provider: "custom-agent",
755
+ agentId: customAgent.id
756
+ },
757
+ name: customAgent.name,
758
+ description: customAgent.description ?? null,
759
+ icon: customAgent.icon,
760
+ createdAt: customAgent.createdAt,
761
+ updatedAt: customAgent.updatedAt,
762
+ metadata: baseModel?.metadata ?? {
763
+ capabilities: { functionCalling: false },
764
+ inputModalities: [],
765
+ available: true
766
+ }
767
+ };
768
+ agents.value?.["custom-agent"].models.push(agent);
769
+ customAgents.value[customAgent.id] = customAgent;
770
+ await fetchAgents(credentials);
771
+ telemetry.track("User created agent", { ...flattenModel(payload) });
772
+ return agent;
773
+ }
774
+ async function updateCustomAgent(agentId, payload, credentials) {
775
+ const customAgent = await updateAgentApi(rootStore.restApiContext, agentId, payload);
776
+ if (agents.value?.["custom-agent"]) agents.value["custom-agent"].models = agents.value["custom-agent"].models.map((model) => "agentId" in model && model.agentId === agentId ? {
777
+ ...model,
778
+ name: customAgent.name
779
+ } : model);
780
+ customAgents.value[agentId] = customAgent;
781
+ await fetchAgents(credentials);
782
+ return customAgent;
783
+ }
784
+ async function deleteCustomAgent(agentId, credentials) {
785
+ await deleteAgentApi(rootStore.restApiContext, agentId);
786
+ if (agents.value?.["custom-agent"]) agents.value["custom-agent"].models = agents.value["custom-agent"].models.filter((model) => !("agentId" in model) || model.agentId !== agentId);
787
+ delete customAgents.value[agentId];
788
+ await fetchAgents(credentials);
789
+ }
790
+ function getAgent(model, fallback) {
791
+ const agent = agents.value?.[model.provider]?.models.find((candidate) => isMatchedAgent(candidate, model));
792
+ if (agent) return agent;
793
+ return {
794
+ model,
795
+ name: fallback?.name ?? "",
796
+ description: null,
797
+ icon: fallback?.icon ?? null,
798
+ createdAt: null,
799
+ updatedAt: null,
800
+ metadata: {
801
+ inputModalities: ["text", "file"],
802
+ capabilities: { functionCalling: true },
803
+ available: true
804
+ }
805
+ };
806
+ }
807
+ async function fetchAllChatSettings() {
808
+ try {
809
+ settingsLoading.value = true;
810
+ settings.value = await fetchChatSettingsApi(rootStore.restApiContext);
811
+ } finally {
812
+ settingsLoading.value = false;
813
+ }
814
+ return settings.value;
815
+ }
816
+ async function fetchProviderSettings(provider) {
817
+ const providerSettings = await fetchChatProviderSettingsApi(rootStore.restApiContext, provider);
818
+ if (settings.value) settings.value[provider] = deepCopy(providerSettings);
819
+ return providerSettings;
820
+ }
821
+ async function updateProviderSettings(updated) {
822
+ if (!updated.enabled) updated.allowedModels = [];
823
+ const saved = await updateChatSettingsApi(rootStore.restApiContext, updated);
824
+ if (settings.value) settings.value[updated.provider] = deepCopy(saved);
825
+ return saved;
826
+ }
827
+ return {
828
+ agents: computed(() => agents.value ?? emptyChatModelsResponse),
829
+ agentsReady: computed(() => agents.value !== null),
830
+ customAgents,
831
+ getAgent,
832
+ fetchAgents,
833
+ getCustomAgent,
834
+ fetchCustomAgent,
835
+ createCustomAgent,
836
+ updateCustomAgent,
837
+ deleteCustomAgent,
838
+ sessions,
839
+ sessionsReady: computed(() => sessions.value.ids !== null),
840
+ sessionsLoading: computed(() => sessionsLoadingMore.value),
841
+ fetchSessions,
842
+ fetchMoreSessions,
843
+ renameSession,
844
+ updateSessionModel,
845
+ deleteSession,
846
+ updateToolsInSession,
847
+ getConversation,
848
+ fetchMessages,
849
+ getActiveMessages,
850
+ switchAlternative,
851
+ lastMessage,
852
+ streaming,
853
+ isResponding,
854
+ sendMessage,
855
+ editMessage,
856
+ regenerateMessage,
857
+ stopStreamingMessage,
858
+ settings,
859
+ settingsLoading,
860
+ fetchAllChatSettings,
861
+ fetchProviderSettings,
862
+ updateProviderSettings
863
+ };
864
+ });
865
+ export { flattenModel as a, groupConversationsByDate as c, personalAgentDefaultIcon as d, stringifyModel as f, fetchChatModelsApi as g, buildChatAttachmentUrl as h, findOneFromModelsResponse as i, isLlmProvider as l, workflowAgentDefaultIcon as m, createMimeTypes as n, fromStringToModel as o, unflattenModel as p, filterAndSortAgents as r, getAgentRoute as s, useChatStore as t, isLlmProviderModel as u };