n8n-editor-ui 1.90.1 → 1.91.1

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 (119) hide show
  1. package/dist/assets/{AnimatedSpinner-ChThynSJ.js → AnimatedSpinner-BrkRvAXQ.js} +1 -1
  2. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-WGp2Kuen.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-DRamY8Fo.js} +1 -1
  3. package/dist/assets/{AuthView-Dlhn_SQ-.js → AuthView-ehh7NFh5.js} +2 -2
  4. package/dist/assets/{CanvasChatSwitch-BuBg7TJP.js → CanvasChatSwitch-DUBgoMXw.js} +11 -11
  5. package/dist/assets/{ChangePasswordView-BKYXOoDf.js → ChangePasswordView-BLFb7_-o.js} +3 -3
  6. package/dist/assets/CollectionParameter-BaH_a73u.js +4 -0
  7. package/dist/assets/{CredentialsView-BNWIgrLb.js → CredentialsView-1uYUpp0G.js} +10 -9
  8. package/dist/assets/{DemoFooter-DR6r_2qR.js → DemoFooter-CNfkqkRC.js} +8 -8
  9. package/dist/assets/{ErrorView-Bu8Mt5FH.js → ErrorView-CmYweWFA.js} +1 -1
  10. package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-DvtOOOhh.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-DAWTDTON.js} +2 -2
  11. package/dist/assets/{ExecutionsView-C0WZAIi0.js → ExecutionsView-fotg1R4V.js} +11 -10
  12. package/dist/assets/{FileSaver.min-Cm0u4qyc.js → FileSaver.min-CcnqpaV-.js} +1 -1
  13. package/dist/assets/{FixedCollectionParameter-KmRZtBiP.js → FixedCollectionParameter-BYR4RzWw.js} +1 -1
  14. package/dist/assets/{ForgotMyPasswordView-GH7SqEFu.js → ForgotMyPasswordView-CQMKtpr-.js} +3 -3
  15. package/dist/assets/{InsightsChartAverageRuntime-SeBUN06R.js → InsightsChartAverageRuntime-B-9BU5qw.js} +7 -6
  16. package/dist/assets/{InsightsChartFailed-TYjH8LwV.js → InsightsChartFailed-Bd1BlFEm.js} +7 -6
  17. package/dist/assets/{InsightsChartFailureRate-D41Jv-6v.js → InsightsChartFailureRate-DPTCueAp.js} +7 -6
  18. package/dist/assets/{InsightsChartTimeSaved-TLPDAmPx.js → InsightsChartTimeSaved-CSVKB08W.js} +7 -6
  19. package/dist/assets/{InsightsChartTotal-CaKTe2mv.js → InsightsChartTotal-Bxjmisao.js} +7 -6
  20. package/dist/assets/InsightsDashboard-5cOORj5z.js +372 -0
  21. package/dist/assets/{InsightsDashboard-DPVczYm3.css → InsightsDashboard-Bx4vx9gz.css} +16 -0
  22. package/dist/assets/{InsightsPaywall-Z4Y0nO-i.js → InsightsPaywall-Bdo_3Ic_.js} +1 -1
  23. package/dist/assets/{InsightsSummary-FixbpmPJ.css → InsightsSummary-CdlaUpAt.css} +25 -25
  24. package/dist/assets/{InsightsSummary-DzYli0Pu.js → InsightsSummary-DB62HhNM.js} +16 -17
  25. package/dist/assets/{InsightsTableWorkflows-CUHAG57c.js → InsightsTableWorkflows-BEC5Yh0b.js} +2 -2
  26. package/dist/assets/{Logo-Dxp4M9dy.js → Logo-CK8euEWT.js} +1 -1
  27. package/dist/assets/{LogsPanel-zIrTNE6j.js → LogsPanel-CrGEYFLo.js} +480 -364
  28. package/dist/assets/{LogsPanel-DmPMCt9w.css → LogsPanel-DLC2TAqh.css} +203 -97
  29. package/dist/assets/{MainHeader-D4cIIoUA.js → MainHeader-C7XOaZKu.js} +122 -295
  30. package/dist/assets/MainHeader-CEPLiR-5.css +1044 -0
  31. package/dist/assets/{MainSidebar-BtW-9UPT.js → MainSidebar-DD_ugRL3.js} +2 -2
  32. package/dist/assets/{NodeCreation-thD32mA1.js → NodeCreation-S2FoBcnW.js} +4 -4
  33. package/dist/assets/{NodeCreator-B4mHaU45.js → NodeCreator-D6TKVgLu.js} +14 -4
  34. package/dist/assets/{NodeDetailsView-cO3Ci9jH.js → NodeDetailsView-DtvMtBqp.js} +40 -30
  35. package/dist/assets/{NodeView-E5b1ClVD.js → NodeView-BPhaaoWK.js} +135 -30
  36. package/dist/assets/{ProjectCardBadge-LnLKqSK-.js → ProjectCardBadge-C_L_pqWA.js} +1 -1
  37. package/dist/assets/{ProjectHeader-DC02ZuZ0.js → ProjectHeader-C0FZTxjm.js} +1 -1
  38. package/dist/assets/{ProjectSettings-Zr1UOp7s.js → ProjectSettings-DlggJ6Ti.js} +2 -2
  39. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-CM7WIpD3.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-BNtCDFSj.js} +1 -1
  40. package/dist/assets/{ResourcesListLayout-CglK2dXR.css → ResourcesListLayout-CtGME7aU.css} +8 -8
  41. package/dist/assets/{ResourcesListLayout-DTsuHdYx.js → ResourcesListLayout-HzoSFUaj.js} +2 -2
  42. package/dist/assets/{RunData-DepHcD2K.css → RunData-C9dtm1M2.css} +92 -73
  43. package/dist/assets/{RunData-Ds-U68nr.js → RunData-D8Eax0cQ.js} +319 -221
  44. package/dist/assets/{RunDataAi-DdK11EHU.js → RunDataAi-BUnCQIRN.js} +3 -3
  45. package/dist/assets/{RunDataJson-Txw0lqay.css → RunDataJson-BH9HLoGC.css} +12 -8
  46. package/dist/assets/{RunDataJson-B2WU5od1.js → RunDataJson-DXd3nZxI.js} +20 -14
  47. package/dist/assets/{RunDataJsonActions-DqZ2X1yJ.js → RunDataJsonActions-aivOaol2.js} +1 -1
  48. package/dist/assets/{RunDataSearch-CQsyZvGK.js → RunDataSearch-DJ9BZGTu.js} +1 -1
  49. package/dist/assets/{RunDataTable-DyUvXWfl.css → RunDataTable-CUxj7dHx.css} +47 -39
  50. package/dist/assets/{RunDataTable-BO0R4JT_.js → RunDataTable-vEPCwbcC.js} +41 -30
  51. package/dist/assets/{SamlOnboarding-CmwMX5y2.js → SamlOnboarding--OTxMEws.js} +3 -3
  52. package/dist/assets/{SettingsApiView-D6uBbi9-.js → SettingsApiView-BulxWyyY.js} +1 -1
  53. package/dist/assets/{SettingsCommunityNodesView-CJODtx_K.js → SettingsCommunityNodesView-4wwPXFO2.js} +4 -4
  54. package/dist/assets/{SettingsExternalSecrets-CVk14P_P.js → SettingsExternalSecrets-zt7dxBKK.js} +1 -1
  55. package/dist/assets/{SettingsLdapView-pg71FErj.js → SettingsLdapView-xneO6UIv.js} +1 -1
  56. package/dist/assets/{SettingsLogStreamingView-DUOI3Xb9.js → SettingsLogStreamingView-_h8wUzum.js} +1 -1
  57. package/dist/assets/{SettingsPersonalView-BFnOmBPC.js → SettingsPersonalView-CwYMP4sk.js} +1 -1
  58. package/dist/assets/{SettingsSourceControl-BUNmxcvB.js → SettingsSourceControl-B9Tg93u3.js} +1 -1
  59. package/dist/assets/{SettingsSso-Dx8Qw_2Z.js → SettingsSso-XaL1PzfW.js} +1 -1
  60. package/dist/assets/{SettingsUsageAndPlan-DTk86tXU.js → SettingsUsageAndPlan-Ci15FW81.js} +1 -1
  61. package/dist/assets/{SettingsUsersView-BviXcl30.js → SettingsUsersView-DBJV4vSK.js} +1 -1
  62. package/dist/assets/{SettingsView-fzPdUijx.js → SettingsView-DMzdPF-1.js} +1 -1
  63. package/dist/assets/{SetupView-DUTx1JXK.js → SetupView-BqWgdvDq.js} +3 -3
  64. package/dist/assets/{SetupWorkflowCredentialsButton-fApxCGHh.js → SetupWorkflowCredentialsButton-B2wnuUnF.js} +1 -1
  65. package/dist/assets/{SetupWorkflowFromTemplateView-C5t9fEKF.js → SetupWorkflowFromTemplateView-BwC_wFSc.js} +3 -3
  66. package/dist/assets/{SigninView-BRVoXQRW.js → SigninView-DpTLJJwD.js} +3 -3
  67. package/dist/assets/{SignoutView-Duh6wb4Y.js → SignoutView-dkTtOCo1.js} +1 -1
  68. package/dist/assets/{SignupView-DMkpTtjs.js → SignupView-CJFJJO3L.js} +3 -3
  69. package/dist/assets/{TemplateDetails-Df9_jph6.js → TemplateDetails-84YElIBA.js} +1 -1
  70. package/dist/assets/{TemplateList-qSnJvw0K.js → TemplateList-CGsfKuVA.js} +1 -1
  71. package/dist/assets/{TemplatesCollectionView--ccYXaCo.js → TemplatesCollectionView-2y8KZk0I.js} +5 -5
  72. package/dist/assets/{TemplatesSearchView-D1YgHKld.js → TemplatesSearchView-DgosiOzl.js} +3 -3
  73. package/dist/assets/{TemplatesView-B9CwObHN.js → TemplatesView-CgQSZO4a.js} +1 -1
  74. package/dist/assets/{TemplatesWorkflowView-DtLpUF59.js → TemplatesWorkflowView-2pSUmAbX.js} +5 -5
  75. package/dist/assets/{TestDefinitionEditView-DFcBlKnN.js → TestDefinitionEditView-C26sWE7p.js} +8 -8
  76. package/dist/assets/{TestDefinitionListView-C_mbolTO.js → TestDefinitionListView-Cyl6bsLP.js} +1 -1
  77. package/dist/assets/{TestDefinitionNewView-CvyM6TLE.js → TestDefinitionNewView-CfIZ0atk.js} +2 -2
  78. package/dist/assets/{TestDefinitionRootView-BXzJY0cY.js → TestDefinitionRootView-CYg7HBL-.js} +1 -1
  79. package/dist/assets/{VariablesView-BHFJj5IU.js → VariablesView-BFE9B0_b.js} +3 -3
  80. package/dist/assets/{WorkerView-CgIksFjP.js → WorkerView-BUMCMS_B.js} +6 -6
  81. package/dist/assets/WorkflowActivator-BDLto9c0.js +776 -0
  82. package/dist/assets/{MainHeader-CWA2JfVJ.css → WorkflowActivator-DAyH7N29.css} +74 -434
  83. package/dist/assets/{WorkflowExecutionsInfoAccordion-BcBLZ_Ul.js → WorkflowExecutionsInfoAccordion-manN-WIj.js} +1 -1
  84. package/dist/assets/{WorkflowExecutionsLandingPage-B9ByHnbR.js → WorkflowExecutionsLandingPage-BzGmpGvf.js} +2 -2
  85. package/dist/assets/{WorkflowExecutionsPreview-DCE7TYLh.js → WorkflowExecutionsPreview-CNEV2lom.js} +6 -6
  86. package/dist/assets/{WorkflowExecutionsView-DFoBpdS7.js → WorkflowExecutionsView-WiNvtAmD.js} +7 -7
  87. package/dist/assets/{WorkflowHistory-DolmPUM2.js → WorkflowHistory-6uJJqB4x.js} +4 -4
  88. package/dist/assets/{WorkflowOnboardingView-DQW48M8_.js → WorkflowOnboardingView-CPt_AUR-.js} +1 -1
  89. package/dist/assets/{WorkflowPreview-BFR6V9SO.js → WorkflowPreview-CHUEX6H6.js} +1 -1
  90. package/dist/assets/{WorkflowsView-CsM69PSv.css → WorkflowsView-B2_HJCJ5.css} +28 -162
  91. package/dist/assets/{WorkflowsView-B-feKuLZ.js → WorkflowsView-DbGBRbfc.js} +123 -216
  92. package/dist/assets/{chartjs.utils-BcXTJ2Te.js → chartjs.utils-C--HONKb.js} +2 -2
  93. package/dist/assets/{dateFormatter-CZI1kGYK.js → dateFormatter-DbKqmK4w.js} +5 -5
  94. package/dist/assets/{easyAiWorkflowUtils-ChToD_Yl.js → easyAiWorkflowUtils-BWgfZ0am.js} +1 -1
  95. package/dist/assets/{global-link-actions-OGaZVwsw.js → global-link-actions-COf-9vBh.js} +1 -1
  96. package/dist/assets/{import-curl-CAszzwx1.js → import-curl-BiXaU2jk.js} +1 -1
  97. package/dist/assets/{index-7WdERzqm.js → index-B6xE9gZ1.js} +1 -1
  98. package/dist/assets/{index-BpdkKRP4.js → index-BLAboPd2.js} +14034 -12086
  99. package/dist/assets/{index-C5OXOcIJ.css → index-sq5ggyEC.css} +6265 -4303
  100. package/dist/assets/{pickBy-mYqFOFbh.js → pickBy-gZHb6vZ2.js} +1 -1
  101. package/dist/assets/{templateActions-BX9arLbc.js → templateActions-DCx74tPa.js} +1 -1
  102. package/dist/assets/{useBeforeUnload-K7nQ15Rk.js → useBeforeUnload-DbfysOS-.js} +1 -1
  103. package/dist/assets/{useCanvasMapping-D_UPCxYX.js → useCanvasMapping-CSuq_dYj.js} +251 -96
  104. package/dist/assets/{useCanvasMapping-C--wac6H.css → useCanvasMapping-cuXLM-h-.css} +185 -4
  105. package/dist/assets/{useCanvasOperations-D6VFiC3b.js → useCanvasOperations-C0pQBHW3.js} +3 -2
  106. package/dist/assets/{useClearExecutionButtonVisible-D_0O6f0X.js → useClearExecutionButtonVisible-Cvfxw8xC.js} +2 -2
  107. package/dist/assets/{useExecutionDebugging-BNMaKOh7.js → useExecutionDebugging-D2H5O6fT.js} +1 -1
  108. package/dist/assets/{useExecutionHelpers-DN5HqPqY.js → useExecutionHelpers-C--m0pTQ.js} +2 -2
  109. package/dist/assets/{useImportCurlCommand-BSL596XF.js → useImportCurlCommand-XFn6Ezp2.js} +2 -2
  110. package/dist/assets/{usePushConnection-BdV7ILvK.js → usePushConnection-x0iF1Axz.js} +5 -3
  111. package/dist/assets/{useTestDefinitionForm-CIhrxyve.js → useTestDefinitionForm-2YP-8pAN.js} +1 -1
  112. package/dist/assets/{useWorkflowActivate-pZ62ib_C.js → useWorkflowActivate-CvmIpy5T.js} +1 -1
  113. package/dist/index.html +2 -2
  114. package/package.json +1 -1
  115. package/vite.config.mts +15 -1
  116. package/dist/assets/CollectionParameter-CQXiWluX.js +0 -4
  117. package/dist/assets/InsightsDashboard-o3JS9fjz.js +0 -178
  118. package/dist/assets/WorkflowActivator-BX59FxTZ.css +0 -260
  119. package/dist/assets/WorkflowActivator-O6i5XAk2.js +0 -231
@@ -1,8 +1,8 @@
1
- import { b1 as inject, b2 as isRef, i as createElementBlock, g as openBlock, k as createBaseVNode, d as defineComponent, q as computed, j as createVNode, e as createBlock, f as createCommentVNode, m as unref, t as toDisplayString, J as withModifiers, _ as _export_sfc, b3 as toRefs, r as ref, o as onMounted, n as normalizeClass, x as renderSlot, b4 as normalizeProps, b5 as guardReactiveProps, b6 as resolveDynamicComponent, b7 as mergeProps, b8 as VueMarkdown, F as Fragment, D as renderList, b9 as markdownLink, ba as useFileDialog, bb as onUnmounted, B as normalizeStyle, aC as withDirectives, bc as vModelText, H as withKeys, w as withCtx, I as watch, h as resolveComponent, l as createTextVNode, bd as N8nText, be as useClipboard, a as useToast, c as useI18n$1, aS as N8nTooltip, bf as N8nButton, aU as _sfc_main$h, aW as createSlots, aL as useStorage, a$ as watchEffect, y as onBeforeUnmount, K as useDebounce, bg as provide, bh as useProvideTooltipAppendTo, bi as IsInPiPWindowSymbol, bj as CHAT_TRIGGER_NODE_TYPE, bk as MANUAL_CHAT_TRIGGER_NODE_TYPE, bl as NodeConnectionTypes, bm as v4, bn as get, bo as isEmpty, bp as usePinnedData, ak as useMessage, al as MODAL_CONFIRM, bq as CHAIN_SUMMARIZATION_LANGCHAIN_NODE_TYPE, br as AI_SUBCATEGORY, bs as AI_CATEGORY_AGENTS, bt as AI_CATEGORY_CHAINS, bu as AI_CODE_NODE_TYPE, bv as getNodeInputs, bw as getConnectionTypes, bx as getNodeOutputs, U as useWorkflowsStore, by as useNodeTypesStore, a2 as useCanvasStore, b as useRouter, bz as useNodeHelpers, bA as useRunWorkflow, V as VIEWS, a_ as LOGS_PANEL_STATE, aZ as useTemplateRef, bB as _sfc_main$j, bC as I18nT, bD as N8nIcon, au as useNDVStore, bE as ElTree, bF as N8nRadioButtons, ai as useTelemetry, bG as uniqBy, aT as N8nLink, ax as useLocalStorage, bH as LOG_DETAILS_CONTENT, b0 as N8nResizeWrapper, bI as useStyles } from "./index-BpdkKRP4.js";
2
- import { u as useClearExecutionButtonVisible } from "./useClearExecutionButtonVisible-D_0O6f0X.js";
3
- import { H as HighlightJS, f as formatTokenUsageCount, _ as _sfc_main$i, g as getSubtreeTotalConsumedTokens, a as getTotalConsumedTokens, R as RunData, c as createLogEntries, b as findLogEntryToAutoSelect } from "./RunData-Ds-U68nr.js";
4
- import { t as toTime, a as toDayMonth } from "./dateFormatter-CZI1kGYK.js";
5
- import { u as upperFirst } from "./useCanvasOperations-D6VFiC3b.js";
1
+ import { b0 as inject, b1 as isRef, i as createElementBlock, g as openBlock, k as createBaseVNode, d as defineComponent, q as computed, j as createVNode, e as createBlock, f as createCommentVNode, m as unref, t as toDisplayString, b2 as withModifiers, _ as _export_sfc, b3 as toRefs, r as ref, o as onMounted, n as normalizeClass, x as renderSlot, b4 as normalizeProps, b5 as guardReactiveProps, b6 as resolveDynamicComponent, b7 as mergeProps, b8 as VueMarkdown, F as Fragment, D as renderList, b9 as markdownLink, ba as useFileDialog, bb as onUnmounted, B as normalizeStyle, aA as withDirectives, bc as vModelText, bd as withKeys, w as withCtx, X as watch, h as resolveComponent, l as createTextVNode, be as N8nText, bf as useClipboard, a as useToast, c as useI18n$1, aR as N8nTooltip, bg as N8nButton, aT as _sfc_main$i, aV as createSlots, aJ as useStorage, a_ as watchEffect, y as onBeforeUnmount, G as useDebounce, bh as provide, bi as useProvideTooltipAppendTo, bj as IsInPiPWindowSymbol, bk as CHAT_TRIGGER_NODE_TYPE, bl as MANUAL_CHAT_TRIGGER_NODE_TYPE, bm as NodeConnectionTypes, bn as v4, bo as get, bp as isEmpty, bq as usePinnedData, ai as useMessage, aj as MODAL_CONFIRM, br as CHAIN_SUMMARIZATION_LANGCHAIN_NODE_TYPE, bs as AI_SUBCATEGORY, bt as AI_CATEGORY_AGENTS, bu as AI_CATEGORY_CHAINS, bv as AI_CODE_NODE_TYPE, bw as getNodeInputs, bx as getConnectionTypes, by as getNodeOutputs, Q as useWorkflowsStore, bz as useNodeTypesStore, $ as useCanvasStore, b as useRouter, bA as useNodeHelpers, bB as useRunWorkflow, V as VIEWS, aZ as LOGS_PANEL_STATE, bC as _sfc_main$k, bD as I18nT, bE as N8nIcon, as as useNDVStore, bF as useVirtualList, bG as N8nRadioButtons, ag as useTelemetry, z as nextTick, bH as ndvEventBus, aS as N8nLink, av as useLocalStorage, bI as LOG_DETAILS_CONTENT, aY as useTemplateRef, a$ as N8nResizeWrapper, bJ as useStyles, bK as Workflow, bL as IN_PROGRESS_EXECUTION_ID, bM as useThrottleFn } from "./index-BLAboPd2.js";
2
+ import { u as useClearExecutionButtonVisible } from "./useClearExecutionButtonVisible-Cvfxw8xC.js";
3
+ import { H as HighlightJS, f as formatTokenUsageCount, _ as _sfc_main$j, g as getSubtreeTotalConsumedTokens, a as getTotalConsumedTokens, b as flattenLogEntries, R as RunData, c as createLogEntries, d as deepToRaw, e as findSelectedLogEntry } from "./RunData-D8Eax0cQ.js";
4
+ import { t as toTime, a as toDayMonth } from "./dateFormatter-DbKqmK4w.js";
5
+ import { u as upperFirst } from "./useCanvasOperations-C0pQBHW3.js";
6
6
  function bash(hljs) {
7
7
  const regex = hljs.regex;
8
8
  const VAR = {};
@@ -2518,13 +2518,13 @@ function useI18n() {
2518
2518
  }
2519
2519
  return { t, te };
2520
2520
  }
2521
- const _hoisted_1$c = {
2521
+ const _hoisted_1$e = {
2522
2522
  viewBox: "0 0 24 24",
2523
2523
  width: "1.2em",
2524
2524
  height: "1.2em"
2525
2525
  };
2526
2526
  function render$7(_ctx, _cache) {
2527
- return openBlock(), createElementBlock("svg", _hoisted_1$c, _cache[0] || (_cache[0] = [
2527
+ return openBlock(), createElementBlock("svg", _hoisted_1$e, _cache[0] || (_cache[0] = [
2528
2528
  createBaseVNode("path", {
2529
2529
  fill: "currentColor",
2530
2530
  d: "M20 6.91L17.09 4L12 9.09L6.91 4L4 6.91L9.09 12L4 17.09L6.91 20L12 14.91L17.09 20L20 17.09L14.91 12z"
@@ -2532,13 +2532,13 @@ function render$7(_ctx, _cache) {
2532
2532
  ]));
2533
2533
  }
2534
2534
  const IconDelete = { name: "mdi-closeThick", render: render$7 };
2535
- const _hoisted_1$b = {
2535
+ const _hoisted_1$d = {
2536
2536
  viewBox: "0 0 24 24",
2537
2537
  width: "1.2em",
2538
2538
  height: "1.2em"
2539
2539
  };
2540
2540
  function render$6(_ctx, _cache) {
2541
- return openBlock(), createElementBlock("svg", _hoisted_1$b, _cache[0] || (_cache[0] = [
2541
+ return openBlock(), createElementBlock("svg", _hoisted_1$d, _cache[0] || (_cache[0] = [
2542
2542
  createBaseVNode("path", {
2543
2543
  fill: "currentColor",
2544
2544
  d: "M13 9h5.5L13 3.5zM6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m0 18h12v-8l-4 4l-2-2zM8 9a2 2 0 0 0-2 2a2 2 0 0 0 2 2a2 2 0 0 0 2-2a2 2 0 0 0-2-2"
@@ -2546,13 +2546,13 @@ function render$6(_ctx, _cache) {
2546
2546
  ]));
2547
2547
  }
2548
2548
  const IconFileImage = { name: "mdi-fileImage", render: render$6 };
2549
- const _hoisted_1$a = {
2549
+ const _hoisted_1$c = {
2550
2550
  viewBox: "0 0 24 24",
2551
2551
  width: "1.2em",
2552
2552
  height: "1.2em"
2553
2553
  };
2554
2554
  function render$5(_ctx, _cache) {
2555
- return openBlock(), createElementBlock("svg", _hoisted_1$a, _cache[0] || (_cache[0] = [
2555
+ return openBlock(), createElementBlock("svg", _hoisted_1$c, _cache[0] || (_cache[0] = [
2556
2556
  createBaseVNode("path", {
2557
2557
  fill: "currentColor",
2558
2558
  d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zm-1 11h-2v5a2 2 0 0 1-2 2a2 2 0 0 1-2-2a2 2 0 0 1 2-2c.4 0 .7.1 1 .3V11h3zm0-4V3.5L18.5 9z"
@@ -2560,13 +2560,13 @@ function render$5(_ctx, _cache) {
2560
2560
  ]));
2561
2561
  }
2562
2562
  const IconFileMusic = { name: "mdi-fileMusic", render: render$5 };
2563
- const _hoisted_1$9 = {
2563
+ const _hoisted_1$b = {
2564
2564
  viewBox: "0 0 24 24",
2565
2565
  width: "1.2em",
2566
2566
  height: "1.2em"
2567
2567
  };
2568
2568
  function render$4(_ctx, _cache) {
2569
- return openBlock(), createElementBlock("svg", _hoisted_1$9, _cache[0] || (_cache[0] = [
2569
+ return openBlock(), createElementBlock("svg", _hoisted_1$b, _cache[0] || (_cache[0] = [
2570
2570
  createBaseVNode("path", {
2571
2571
  fill: "currentColor",
2572
2572
  d: "M13 9h5.5L13 3.5zM6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m9 16v-2H6v2zm3-4v-2H6v2z"
@@ -2574,13 +2574,13 @@ function render$4(_ctx, _cache) {
2574
2574
  ]));
2575
2575
  }
2576
2576
  const IconFileText = { name: "mdi-fileText", render: render$4 };
2577
- const _hoisted_1$8 = {
2577
+ const _hoisted_1$a = {
2578
2578
  viewBox: "0 0 24 24",
2579
2579
  width: "1.2em",
2580
2580
  height: "1.2em"
2581
2581
  };
2582
2582
  function render$3(_ctx, _cache) {
2583
- return openBlock(), createElementBlock("svg", _hoisted_1$8, _cache[0] || (_cache[0] = [
2583
+ return openBlock(), createElementBlock("svg", _hoisted_1$a, _cache[0] || (_cache[0] = [
2584
2584
  createBaseVNode("path", {
2585
2585
  fill: "currentColor",
2586
2586
  d: "M13 9h5.5L13 3.5zM6 2h8l6 6v12a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V4c0-1.11.89-2 2-2m11 17v-6l-3 2.2V13H7v6h7v-2.2z"
@@ -2588,13 +2588,13 @@ function render$3(_ctx, _cache) {
2588
2588
  ]));
2589
2589
  }
2590
2590
  const IconFileVideo = { name: "mdi-fileVideo", render: render$3 };
2591
- const _hoisted_1$7 = {
2591
+ const _hoisted_1$9 = {
2592
2592
  viewBox: "0 0 24 24",
2593
2593
  width: "1.2em",
2594
2594
  height: "1.2em"
2595
2595
  };
2596
2596
  function render$2(_ctx, _cache) {
2597
- return openBlock(), createElementBlock("svg", _hoisted_1$7, _cache[0] || (_cache[0] = [
2597
+ return openBlock(), createElementBlock("svg", _hoisted_1$9, _cache[0] || (_cache[0] = [
2598
2598
  createBaseVNode("path", {
2599
2599
  fill: "currentColor",
2600
2600
  d: "M14 3v2h3.59l-9.83 9.83l1.41 1.41L19 6.41V10h2V3m-2 16H5V5h7V3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7h-2z"
@@ -2602,8 +2602,8 @@ function render$2(_ctx, _cache) {
2602
2602
  ]));
2603
2603
  }
2604
2604
  const IconPreview = { name: "mdi-openInNew", render: render$2 };
2605
- const _hoisted_1$6 = { class: "chat-file-name" };
2606
- const _sfc_main$g = /* @__PURE__ */ defineComponent({
2605
+ const _hoisted_1$8 = { class: "chat-file-name" };
2606
+ const _sfc_main$h = /* @__PURE__ */ defineComponent({
2607
2607
  __name: "ChatFile",
2608
2608
  props: {
2609
2609
  file: {},
@@ -2638,7 +2638,7 @@ const _sfc_main$g = /* @__PURE__ */ defineComponent({
2638
2638
  onClick
2639
2639
  }, [
2640
2640
  createVNode(unref(TypeIcon)),
2641
- createBaseVNode("p", _hoisted_1$6, toDisplayString(_ctx.file.name), 1),
2641
+ createBaseVNode("p", _hoisted_1$8, toDisplayString(_ctx.file.name), 1),
2642
2642
  _ctx.isRemovable ? (openBlock(), createElementBlock("span", {
2643
2643
  key: 0,
2644
2644
  class: "chat-file-delete",
@@ -2653,16 +2653,16 @@ const _sfc_main$g = /* @__PURE__ */ defineComponent({
2653
2653
  };
2654
2654
  }
2655
2655
  });
2656
- const ChatFile = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["__scopeId", "data-v-70b9370d"]]);
2657
- const _hoisted_1$5 = {
2656
+ const ChatFile = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["__scopeId", "data-v-70b9370d"]]);
2657
+ const _hoisted_1$7 = {
2658
2658
  key: 0,
2659
2659
  class: "chat-message-actions"
2660
2660
  };
2661
- const _hoisted_2$2 = {
2661
+ const _hoisted_2$3 = {
2662
2662
  key: 2,
2663
2663
  class: "chat-message-files"
2664
2664
  };
2665
- const _sfc_main$f = /* @__PURE__ */ defineComponent({
2665
+ const _sfc_main$g = /* @__PURE__ */ defineComponent({
2666
2666
  __name: "Message",
2667
2667
  props: {
2668
2668
  message: {}
@@ -2740,7 +2740,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2740
2740
  ref: messageContainer,
2741
2741
  class: normalizeClass(["chat-message", classes.value])
2742
2742
  }, [
2743
- _ctx.$slots.beforeMessage ? (openBlock(), createElementBlock("div", _hoisted_1$5, [
2743
+ _ctx.$slots.beforeMessage ? (openBlock(), createElementBlock("div", _hoisted_1$7, [
2744
2744
  renderSlot(_ctx.$slots, "beforeMessage", normalizeProps(guardReactiveProps({ message: unref(message) })))
2745
2745
  ])) : createCommentVNode("", true),
2746
2746
  renderSlot(_ctx.$slots, "default", {}, () => [
@@ -2751,7 +2751,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2751
2751
  options: markdownOptions,
2752
2752
  plugins: [linksNewTabPlugin]
2753
2753
  }, null, 8, ["source", "plugins"])),
2754
- (unref(message).files ?? []).length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$2, [
2754
+ (unref(message).files ?? []).length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$3, [
2755
2755
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(message).files ?? [], (file) => {
2756
2756
  return openBlock(), createElementBlock("div", {
2757
2757
  key: file.name,
@@ -2770,13 +2770,13 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2770
2770
  };
2771
2771
  }
2772
2772
  });
2773
- const _hoisted_1$4 = {
2773
+ const _hoisted_1$6 = {
2774
2774
  viewBox: "0 0 24 24",
2775
2775
  width: "1.2em",
2776
2776
  height: "1.2em"
2777
2777
  };
2778
2778
  function render$1(_ctx, _cache) {
2779
- return openBlock(), createElementBlock("svg", _hoisted_1$4, _cache[0] || (_cache[0] = [
2779
+ return openBlock(), createElementBlock("svg", _hoisted_1$6, _cache[0] || (_cache[0] = [
2780
2780
  createBaseVNode("path", {
2781
2781
  fill: "currentColor",
2782
2782
  d: "M16.5 6v11.5a4 4 0 0 1-4 4a4 4 0 0 1-4-4V5A2.5 2.5 0 0 1 11 2.5A2.5 2.5 0 0 1 13.5 5v10.5a1 1 0 0 1-1 1a1 1 0 0 1-1-1V6H10v9.5a2.5 2.5 0 0 0 2.5 2.5a2.5 2.5 0 0 0 2.5-2.5V5a4 4 0 0 0-4-4a4 4 0 0 0-4 4v12.5a5.5 5.5 0 0 0 5.5 5.5a5.5 5.5 0 0 0 5.5-5.5V6z"
@@ -2784,13 +2784,13 @@ function render$1(_ctx, _cache) {
2784
2784
  ]));
2785
2785
  }
2786
2786
  const IconPaperclip = { name: "mdi-paperclip", render: render$1 };
2787
- const _hoisted_1$3 = {
2787
+ const _hoisted_1$5 = {
2788
2788
  viewBox: "0 0 24 24",
2789
2789
  width: "1.2em",
2790
2790
  height: "1.2em"
2791
2791
  };
2792
2792
  function render(_ctx, _cache) {
2793
- return openBlock(), createElementBlock("svg", _hoisted_1$3, _cache[0] || (_cache[0] = [
2793
+ return openBlock(), createElementBlock("svg", _hoisted_1$5, _cache[0] || (_cache[0] = [
2794
2794
  createBaseVNode("path", {
2795
2795
  fill: "currentColor",
2796
2796
  d: "m2 21l21-9L2 3v7l15 2l-15 2z"
@@ -2831,8 +2831,8 @@ function createEventBus() {
2831
2831
  };
2832
2832
  }
2833
2833
  const chatEventBus = createEventBus();
2834
- const _hoisted_1$2 = { class: "chat-inputs" };
2835
- const _hoisted_2$1 = {
2834
+ const _hoisted_1$4 = { class: "chat-inputs" };
2835
+ const _hoisted_2$2 = {
2836
2836
  key: 0,
2837
2837
  class: "chat-input-left-panel"
2838
2838
  };
@@ -2844,7 +2844,7 @@ const _hoisted_7 = {
2844
2844
  key: 0,
2845
2845
  class: "chat-files"
2846
2846
  };
2847
- const _sfc_main$e = /* @__PURE__ */ defineComponent({
2847
+ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2848
2848
  __name: "Input",
2849
2849
  props: {
2850
2850
  placeholder: { default: "inputPlaceholder" }
@@ -2992,8 +2992,8 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
2992
2992
  style: normalizeStyle(styleVars.value),
2993
2993
  onKeydown: withModifiers(onKeyDown, ["stop"])
2994
2994
  }, [
2995
- createBaseVNode("div", _hoisted_1$2, [
2996
- _ctx.$slots.leftPanel ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
2995
+ createBaseVNode("div", _hoisted_1$4, [
2996
+ _ctx.$slots.leftPanel ? (openBlock(), createElementBlock("div", _hoisted_2$2, [
2997
2997
  renderSlot(_ctx.$slots, "leftPanel", {}, void 0, true)
2998
2998
  ])) : createCommentVNode("", true),
2999
2999
  withDirectives(createBaseVNode("textarea", {
@@ -3050,8 +3050,8 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
3050
3050
  };
3051
3051
  }
3052
3052
  });
3053
- const ChatInput = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["__scopeId", "data-v-f0e5731e"]]);
3054
- const _sfc_main$d = /* @__PURE__ */ defineComponent({
3053
+ const ChatInput = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["__scopeId", "data-v-f0e5731e"]]);
3054
+ const _sfc_main$e = /* @__PURE__ */ defineComponent({
3055
3055
  __name: "MessageTyping",
3056
3056
  props: {
3057
3057
  animation: { default: "bouncing" }
@@ -3075,7 +3075,7 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
3075
3075
  messageContainer.value?.scrollToView();
3076
3076
  });
3077
3077
  return (_ctx, _cache) => {
3078
- return openBlock(), createBlock(unref(_sfc_main$f), {
3078
+ return openBlock(), createBlock(unref(_sfc_main$g), {
3079
3079
  ref_key: "messageContainer",
3080
3080
  ref: messageContainer,
3081
3081
  class: normalizeClass(classes.value),
@@ -3094,11 +3094,11 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
3094
3094
  };
3095
3095
  }
3096
3096
  });
3097
- const _hoisted_1$1 = {
3097
+ const _hoisted_1$3 = {
3098
3098
  key: 0,
3099
3099
  class: "empty-container"
3100
3100
  };
3101
- const _hoisted_2 = {
3101
+ const _hoisted_2$1 = {
3102
3102
  class: "empty",
3103
3103
  "data-test-id": "chat-messages-empty"
3104
3104
  };
@@ -3106,7 +3106,7 @@ const _hoisted_3 = {
3106
3106
  key: 1,
3107
3107
  class: "chat-messages-list"
3108
3108
  };
3109
- const _sfc_main$c = /* @__PURE__ */ defineComponent({
3109
+ const _sfc_main$d = /* @__PURE__ */ defineComponent({
3110
3110
  __name: "MessagesList",
3111
3111
  props: {
3112
3112
  messages: {},
@@ -3128,8 +3128,8 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
3128
3128
  return (_ctx, _cache) => {
3129
3129
  const _component_N8nIcon = resolveComponent("N8nIcon");
3130
3130
  const _component_N8nText = resolveComponent("N8nText");
3131
- return _ctx.emptyText && unref(initialMessages).length === 0 && _ctx.messages.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_1$1, [
3132
- createBaseVNode("div", _hoisted_2, [
3131
+ return _ctx.emptyText && unref(initialMessages).length === 0 && _ctx.messages.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_1$3, [
3132
+ createBaseVNode("div", _hoisted_2$1, [
3133
3133
  createVNode(_component_N8nIcon, {
3134
3134
  icon: "comment",
3135
3135
  size: "large",
@@ -3148,13 +3148,13 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
3148
3148
  ])
3149
3149
  ])) : (openBlock(), createElementBlock("div", _hoisted_3, [
3150
3150
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(initialMessages), (initialMessage) => {
3151
- return openBlock(), createBlock(_sfc_main$f, {
3151
+ return openBlock(), createBlock(_sfc_main$g, {
3152
3152
  key: initialMessage.id,
3153
3153
  message: initialMessage
3154
3154
  }, null, 8, ["message"]);
3155
3155
  }), 128)),
3156
3156
  (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.messages, (message) => {
3157
- return openBlock(), createBlock(_sfc_main$f, {
3157
+ return openBlock(), createBlock(_sfc_main$g, {
3158
3158
  key: message.id,
3159
3159
  ref_for: true,
3160
3160
  ref_key: "messageComponents",
@@ -3167,12 +3167,12 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
3167
3167
  _: 2
3168
3168
  }, 1032, ["message"]);
3169
3169
  }), 128)),
3170
- unref(waitingForResponse) ? (openBlock(), createBlock(_sfc_main$d, { key: 0 })) : createCommentVNode("", true)
3170
+ unref(waitingForResponse) ? (openBlock(), createBlock(_sfc_main$e, { key: 0 })) : createCommentVNode("", true)
3171
3171
  ]));
3172
3172
  };
3173
3173
  }
3174
3174
  });
3175
- const _sfc_main$b = /* @__PURE__ */ defineComponent({
3175
+ const _sfc_main$c = /* @__PURE__ */ defineComponent({
3176
3176
  __name: "MessageOptionTooltip",
3177
3177
  props: {
3178
3178
  placement: {
@@ -3209,15 +3209,15 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
3209
3209
  });
3210
3210
  const container$8 = "_container_pqtqf_123";
3211
3211
  const icon$3 = "_icon_pqtqf_129";
3212
- const style0$a = {
3212
+ const style0$b = {
3213
3213
  container: container$8,
3214
3214
  icon: icon$3
3215
3215
  };
3216
- const cssModules$a = {
3217
- "$style": style0$a
3216
+ const cssModules$b = {
3217
+ "$style": style0$b
3218
3218
  };
3219
- const MessageOptionTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__cssModules", cssModules$a]]);
3220
- const _sfc_main$a = /* @__PURE__ */ defineComponent({
3219
+ const MessageOptionTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__cssModules", cssModules$b]]);
3220
+ const _sfc_main$b = /* @__PURE__ */ defineComponent({
3221
3221
  __name: "MessageOptionAction",
3222
3222
  props: {
3223
3223
  label: {
@@ -3260,15 +3260,15 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
3260
3260
  });
3261
3261
  const container$7 = "_container_u1r1u_123";
3262
3262
  const icon$2 = "_icon_u1r1u_129";
3263
- const style0$9 = {
3263
+ const style0$a = {
3264
3264
  container: container$7,
3265
3265
  icon: icon$2
3266
3266
  };
3267
- const cssModules$9 = {
3268
- "$style": style0$9
3267
+ const cssModules$a = {
3268
+ "$style": style0$a
3269
3269
  };
3270
- const MessageOptionAction = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__cssModules", cssModules$9]]);
3271
- const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3270
+ const MessageOptionAction = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__cssModules", cssModules$a]]);
3271
+ const _sfc_main$a = /* @__PURE__ */ defineComponent({
3272
3272
  __name: "PanelHeader",
3273
3273
  props: {
3274
3274
  title: {}
@@ -3302,20 +3302,20 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3302
3302
  };
3303
3303
  }
3304
3304
  });
3305
- const container$6 = "_container_w45gq_123";
3306
- const title$2 = "_title_w45gq_144";
3307
- const actions$1 = "_actions_w45gq_152";
3308
- const style0$8 = {
3305
+ const container$6 = "_container_1uwbw_123";
3306
+ const title$2 = "_title_1uwbw_144";
3307
+ const actions$1 = "_actions_1uwbw_152";
3308
+ const style0$9 = {
3309
3309
  container: container$6,
3310
3310
  title: title$2,
3311
3311
  actions: actions$1
3312
3312
  };
3313
- const cssModules$8 = {
3314
- "$style": style0$8
3313
+ const cssModules$9 = {
3314
+ "$style": style0$9
3315
3315
  };
3316
- const PanelHeader = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__cssModules", cssModules$8]]);
3317
- const _hoisted_1 = ["onClick"];
3318
- const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3316
+ const PanelHeader = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__cssModules", cssModules$9]]);
3317
+ const _hoisted_1$2 = ["onClick"];
3318
+ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3319
3319
  __name: "ChatMessagesPanel",
3320
3320
  props: {
3321
3321
  pastChatMessages: {},
@@ -3435,7 +3435,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3435
3435
  content: unref(locale).baseText("chat.window.session.resetSession")
3436
3436
  }, {
3437
3437
  default: withCtx(() => [
3438
- createVNode(unref(_sfc_main$h), {
3438
+ createVNode(unref(_sfc_main$i), {
3439
3439
  class: normalizeClass(_ctx.$style.newHeaderButton),
3440
3440
  "data-test-id": "refresh-session-button",
3441
3441
  outline: "",
@@ -3475,7 +3475,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3475
3475
  ]),
3476
3476
  _: 1
3477
3477
  }),
3478
- createVNode(unref(_sfc_main$h), {
3478
+ createVNode(unref(_sfc_main$i), {
3479
3479
  class: normalizeClass(_ctx.$style.headerButton),
3480
3480
  "data-test-id": "refresh-session-button",
3481
3481
  outline: "",
@@ -3485,7 +3485,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3485
3485
  title: unref(locale).baseText("chat.window.session.reset"),
3486
3486
  onClick: onRefreshSession
3487
3487
  }, null, 8, ["class", "title"]),
3488
- _ctx.showCloseButton ? (openBlock(), createBlock(unref(_sfc_main$h), {
3488
+ _ctx.showCloseButton ? (openBlock(), createBlock(unref(_sfc_main$i), {
3489
3489
  key: 0,
3490
3490
  class: normalizeClass(_ctx.$style.headerButton),
3491
3491
  outline: "",
@@ -3500,7 +3500,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3500
3500
  key: 2,
3501
3501
  class: normalizeClass(_ctx.$style.chatBody)
3502
3502
  }, [
3503
- createVNode(_sfc_main$c, {
3503
+ createVNode(_sfc_main$d, {
3504
3504
  messages: _ctx.messages,
3505
3505
  class: normalizeClass(_ctx.$style.messages),
3506
3506
  "empty-text": _ctx.isNewLogsEnabled ? unref(locale).baseText("chat.window.chat.emptyChatMessage.v2") : void 0
@@ -3516,7 +3516,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3516
3516
  createBaseVNode("a", {
3517
3517
  href: "#",
3518
3518
  onClick: ($event) => emit("displayExecution", message.id)
3519
- }, toDisplayString(message.id), 9, _hoisted_1)
3519
+ }, toDisplayString(message.id), 9, _hoisted_1$2)
3520
3520
  ]),
3521
3521
  _: 2
3522
3522
  }, 1024)) : createCommentVNode("", true),
@@ -3592,7 +3592,7 @@ const newHeaderButton = "_newHeaderButton_1r0jy_188";
3592
3592
  const chatBody = "_chatBody_1r0jy_193";
3593
3593
  const messages = "_messages_1r0jy_202";
3594
3594
  const messagesInput = "_messagesInput_1r0jy_213";
3595
- const style0$7 = {
3595
+ const style0$8 = {
3596
3596
  chat: chat$1,
3597
3597
  chatHeader,
3598
3598
  chatTitle,
@@ -3605,10 +3605,10 @@ const style0$7 = {
3605
3605
  messages,
3606
3606
  messagesInput
3607
3607
  };
3608
- const cssModules$7 = {
3609
- "$style": style0$7
3608
+ const cssModules$8 = {
3609
+ "$style": style0$8
3610
3610
  };
3611
- const ChatMessagesPanel = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__cssModules", cssModules$7]]);
3611
+ const ChatMessagesPanel = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__cssModules", cssModules$8]]);
3612
3612
  const LOCAL_STORAGE_PANEL_HEIGHT = "N8N_CANVAS_CHAT_HEIGHT";
3613
3613
  const LOCAL_STORAGE_PANEL_WIDTH = "N8N_CANVAS_CHAT_WIDTH";
3614
3614
  const LOCAL_STORAGE_OVERVIEW_PANEL_WIDTH = "N8N_LOGS_OVERVIEW_PANEL_WIDTH";
@@ -4058,6 +4058,7 @@ function useChatState(isReadOnly, onWindowResize) {
4058
4058
  const { runWorkflow } = useRunWorkflow({ router });
4059
4059
  const messages2 = ref([]);
4060
4060
  const currentSessionId = ref(v4().replace(/-/g, ""));
4061
+ const previousChatMessages = computed(() => workflowsStore.getPastChatMessages);
4061
4062
  const canvasNodes = computed(() => workflowsStore.allNodes);
4062
4063
  const allConnections = computed(() => workflowsStore.allConnections);
4063
4064
  const logsPanelState = computed(() => workflowsStore.logsPanelState);
@@ -4189,6 +4190,9 @@ function useChatState(isReadOnly, onWindowResize) {
4189
4190
  nodeHelpers.updateNodesExecutionIssues();
4190
4191
  messages2.value = [];
4191
4192
  currentSessionId.value = v4().replace(/-/g, "");
4193
+ if (logsPanelState.value !== LOGS_PANEL_STATE.CLOSED) {
4194
+ chatEventBus.emit("focusInput");
4195
+ }
4192
4196
  }
4193
4197
  function displayExecution(executionId) {
4194
4198
  const route = router.resolve({
@@ -4200,6 +4204,7 @@ function useChatState(isReadOnly, onWindowResize) {
4200
4204
  return {
4201
4205
  currentSessionId,
4202
4206
  messages: computed(() => isReadOnly ? restoredChatMessages.value : messages2.value),
4207
+ previousChatMessages,
4203
4208
  chatTriggerNode,
4204
4209
  connectedNode,
4205
4210
  sendMessage,
@@ -4207,7 +4212,7 @@ function useChatState(isReadOnly, onWindowResize) {
4207
4212
  displayExecution
4208
4213
  };
4209
4214
  }
4210
- const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4215
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
4211
4216
  __name: "ConsumedTokenCountText",
4212
4217
  props: {
4213
4218
  consumedTokens: {}
@@ -4215,7 +4220,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4215
4220
  setup(__props) {
4216
4221
  const locale = useI18n$1();
4217
4222
  return (_ctx, _cache) => {
4218
- const _component_ConsumedTokensDetails = _sfc_main$i;
4223
+ const _component_ConsumedTokensDetails = _sfc_main$j;
4219
4224
  return _ctx.consumedTokens !== void 0 ? (openBlock(), createBlock(unref(N8nTooltip), {
4220
4225
  key: 0,
4221
4226
  enterable: false
@@ -4235,36 +4240,67 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4235
4240
  };
4236
4241
  }
4237
4242
  });
4243
+ const _hoisted_1$1 = { key: 0 };
4244
+ const _hoisted_2 = { key: 1 };
4245
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4246
+ __name: "NodeName",
4247
+ props: {
4248
+ name: {},
4249
+ latestName: {},
4250
+ isError: { type: Boolean },
4251
+ isDeleted: { type: Boolean }
4252
+ },
4253
+ setup(__props) {
4254
+ return (_ctx, _cache) => {
4255
+ return openBlock(), createBlock(unref(N8nText), {
4256
+ tag: "div",
4257
+ bold: true,
4258
+ size: "small",
4259
+ class: normalizeClass(_ctx.$style.name),
4260
+ color: _ctx.isError ? "danger" : void 0
4261
+ }, {
4262
+ default: withCtx(() => [
4263
+ _ctx.isDeleted || _ctx.name !== _ctx.latestName ? (openBlock(), createElementBlock("del", _hoisted_1$1, toDisplayString(_ctx.name), 1)) : createCommentVNode("", true),
4264
+ !_ctx.isDeleted ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(_ctx.latestName), 1)) : createCommentVNode("", true)
4265
+ ]),
4266
+ _: 1
4267
+ }, 8, ["class", "color"]);
4268
+ };
4269
+ }
4270
+ });
4271
+ const name$1 = "_name_1t0q3_123";
4272
+ const style0$7 = {
4273
+ name: name$1
4274
+ };
4275
+ const cssModules$7 = {
4276
+ "$style": style0$7
4277
+ };
4278
+ const NodeName = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__cssModules", cssModules$7]]);
4279
+ const _hoisted_1 = ["aria-expanded"];
4238
4280
  const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4239
4281
  __name: "LogsOverviewRow",
4240
4282
  props: {
4241
4283
  data: {},
4242
- node: {},
4243
4284
  isSelected: { type: Boolean },
4244
4285
  isReadOnly: { type: Boolean },
4245
4286
  shouldShowConsumedTokens: { type: Boolean },
4246
- isCompact: { type: Boolean }
4287
+ isCompact: { type: Boolean },
4288
+ latestInfo: {},
4289
+ expanded: { type: Boolean }
4247
4290
  },
4248
4291
  emits: ["toggleExpanded", "triggerPartialExecution", "openNdv"],
4249
4292
  setup(__props, { emit: __emit }) {
4250
4293
  const props = __props;
4251
4294
  const emit = __emit;
4252
4295
  const locale = useI18n$1();
4253
- const containerRef = useTemplateRef("containerRef");
4254
- const workflowsStore = useWorkflowsStore();
4255
4296
  const nodeTypeStore = useNodeTypesStore();
4256
- const node = computed(() => workflowsStore.nodesByName[props.data.node]);
4257
- const runData = computed(
4258
- () => node.value ? workflowsStore.workflowExecutionData?.data?.resultData.runData[node.value.name]?.[props.data.runIndex] : void 0
4259
- );
4260
- const type = computed(() => node.value ? nodeTypeStore.getNodeType(node.value.type) : void 0);
4261
- const depth = computed(() => (props.node.level ?? 1) - 1);
4297
+ const type = computed(() => nodeTypeStore.getNodeType(props.data.node.type));
4262
4298
  const isSettled = computed(
4263
- () => runData.value?.executionStatus && ["crashed", "error", "success"].includes(runData.value.executionStatus)
4299
+ () => props.data.runData.executionStatus && ["crashed", "error", "success"].includes(props.data.runData.executionStatus)
4264
4300
  );
4265
- const isError = computed(() => !!runData.value?.error);
4301
+ const isError = computed(() => !!props.data.runData.error);
4266
4302
  const startedAtText = computed(() => {
4267
- const time = new Date(runData.value?.startTime ?? 0);
4303
+ const time = new Date(props.data.runData.startTime);
4268
4304
  return locale.baseText("logs.overview.body.started", {
4269
4305
  interpolate: {
4270
4306
  time: `${toTime(time, true)}, ${toDayMonth(time)}`
@@ -4277,7 +4313,7 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4277
4313
  function isLastChild(level) {
4278
4314
  let parent = props.data.parent;
4279
4315
  let data = props.data;
4280
- for (let i = 0; i < depth.value - level; i++) {
4316
+ for (let i = 0; i < props.data.depth - level; i++) {
4281
4317
  data = parent;
4282
4318
  parent = parent?.parent;
4283
4319
  }
@@ -4285,21 +4321,12 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4285
4321
  const lastSibling = siblings[siblings.length - 1];
4286
4322
  return data === void 0 && lastSibling === void 0 || data?.node === lastSibling?.node && data?.runIndex === lastSibling?.runIndex;
4287
4323
  }
4288
- watch(
4289
- [() => props.isSelected, containerRef],
4290
- ([isSelected, ref2]) => {
4291
- if (isSelected && ref2) {
4292
- ref2.scrollIntoView({ behavior: "smooth", block: "nearest" });
4293
- }
4294
- },
4295
- { immediate: true }
4296
- );
4297
4324
  return (_ctx, _cache) => {
4298
- const _component_NodeIcon = _sfc_main$j;
4299
- return node.value !== void 0 ? (openBlock(), createElementBlock("div", {
4300
- key: 0,
4301
- ref_key: "containerRef",
4302
- ref: containerRef,
4325
+ const _component_NodeIcon = _sfc_main$k;
4326
+ return openBlock(), createElementBlock("div", {
4327
+ role: "treeitem",
4328
+ tabindex: "0",
4329
+ "aria-expanded": props.data.children.length > 0 && props.expanded,
4303
4330
  class: normalizeClass({
4304
4331
  [_ctx.$style.container]: true,
4305
4332
  [_ctx.$style.compact]: props.isCompact,
@@ -4307,45 +4334,41 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4307
4334
  [_ctx.$style.selected]: props.isSelected
4308
4335
  })
4309
4336
  }, [
4310
- (openBlock(true), createElementBlock(Fragment, null, renderList(depth.value, (level) => {
4337
+ (openBlock(true), createElementBlock(Fragment, null, renderList(props.data.depth, (level) => {
4311
4338
  return openBlock(), createElementBlock("div", {
4312
4339
  key: level,
4313
4340
  class: normalizeClass({
4314
4341
  [_ctx.$style.indent]: true,
4315
- [_ctx.$style.connectorCurved]: level === depth.value,
4342
+ [_ctx.$style.connectorCurved]: level === props.data.depth,
4316
4343
  [_ctx.$style.connectorStraight]: !isLastChild(level)
4317
4344
  })
4318
4345
  }, null, 2);
4319
4346
  }), 128)),
4320
4347
  createBaseVNode("div", {
4321
4348
  class: normalizeClass(_ctx.$style.background),
4322
- style: normalizeStyle({ "--indent-depth": depth.value })
4349
+ style: normalizeStyle({ "--indent-depth": props.data.depth })
4323
4350
  }, null, 6),
4324
4351
  createVNode(_component_NodeIcon, {
4325
4352
  "node-type": type.value,
4326
4353
  size: 16,
4327
4354
  class: normalizeClass(_ctx.$style.icon)
4328
4355
  }, null, 8, ["node-type", "class"]),
4329
- createVNode(unref(N8nText), {
4330
- tag: "div",
4331
- bold: true,
4332
- size: "small",
4356
+ createVNode(NodeName, {
4333
4357
  class: normalizeClass(_ctx.$style.name),
4334
- color: isError.value ? "danger" : void 0
4335
- }, {
4336
- default: withCtx(() => [
4337
- createTextVNode(toDisplayString(node.value.name), 1)
4338
- ]),
4339
- _: 1
4340
- }, 8, ["class", "color"]),
4341
- createVNode(unref(N8nText), {
4358
+ "latest-name": _ctx.latestInfo?.name ?? props.data.node.name,
4359
+ name: props.data.node.name,
4360
+ "is-error": isError.value,
4361
+ "is-deleted": _ctx.latestInfo?.deleted ?? false
4362
+ }, null, 8, ["class", "latest-name", "name", "is-error", "is-deleted"]),
4363
+ !_ctx.isCompact ? (openBlock(), createBlock(unref(N8nText), {
4364
+ key: 0,
4342
4365
  tag: "div",
4343
4366
  color: "text-light",
4344
4367
  size: "small",
4345
4368
  class: normalizeClass(_ctx.$style.timeTook)
4346
4369
  }, {
4347
4370
  default: withCtx(() => [
4348
- isSettled.value && runData.value ? (openBlock(), createBlock(unref(I18nT), {
4371
+ isSettled.value ? (openBlock(), createBlock(unref(I18nT), {
4349
4372
  key: 0,
4350
4373
  keypath: "logs.overview.body.summaryText"
4351
4374
  }, {
@@ -4361,24 +4384,25 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4361
4384
  icon: "exclamation-triangle",
4362
4385
  class: normalizeClass(_ctx.$style.errorIcon)
4363
4386
  }, null, 8, ["class"]),
4364
- createTextVNode(toDisplayString(unref(upperFirst)(runData.value.executionStatus)), 1)
4387
+ createTextVNode(toDisplayString(unref(upperFirst)(props.data.runData.executionStatus)), 1)
4365
4388
  ]),
4366
4389
  _: 1
4367
4390
  })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
4368
- createTextVNode(toDisplayString(unref(upperFirst)(runData.value.executionStatus)), 1)
4391
+ createTextVNode(toDisplayString(unref(upperFirst)(props.data.runData.executionStatus)), 1)
4369
4392
  ], 64))
4370
4393
  ]),
4371
4394
  time: withCtx(() => [
4372
- createTextVNode(toDisplayString(unref(locale).displayTimer(runData.value.executionTime, true)), 1)
4395
+ createTextVNode(toDisplayString(unref(locale).displayTimer(props.data.runData.executionTime, true)), 1)
4373
4396
  ]),
4374
4397
  _: 1
4375
4398
  })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
4376
- createTextVNode(toDisplayString(unref(upperFirst)(runData.value?.executionStatus)), 1)
4399
+ createTextVNode(toDisplayString(unref(upperFirst)(props.data.runData.executionStatus)), 1)
4377
4400
  ], 64))
4378
4401
  ]),
4379
4402
  _: 1
4380
- }, 8, ["class"]),
4381
- createVNode(unref(N8nText), {
4403
+ }, 8, ["class"])) : createCommentVNode("", true),
4404
+ !_ctx.isCompact ? (openBlock(), createBlock(unref(N8nText), {
4405
+ key: 1,
4382
4406
  tag: "div",
4383
4407
  color: "text-light",
4384
4408
  size: "small",
@@ -4388,16 +4412,16 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4388
4412
  createTextVNode(toDisplayString(startedAtText.value), 1)
4389
4413
  ]),
4390
4414
  _: 1
4391
- }, 8, ["class"]),
4392
- subtreeConsumedTokens.value !== void 0 ? (openBlock(), createBlock(unref(N8nText), {
4393
- key: 0,
4415
+ }, 8, ["class"])) : createCommentVNode("", true),
4416
+ !_ctx.isCompact && subtreeConsumedTokens.value !== void 0 ? (openBlock(), createBlock(unref(N8nText), {
4417
+ key: 2,
4394
4418
  tag: "div",
4395
4419
  color: "text-light",
4396
4420
  size: "small",
4397
4421
  class: normalizeClass(_ctx.$style.consumedTokens)
4398
4422
  }, {
4399
4423
  default: withCtx(() => [
4400
- subtreeConsumedTokens.value.totalTokens > 0 && (props.data.children.length === 0 || !props.node.expanded) ? (openBlock(), createBlock(_sfc_main$7, {
4424
+ subtreeConsumedTokens.value.totalTokens > 0 && (props.data.children.length === 0 || !props.expanded) ? (openBlock(), createBlock(_sfc_main$8, {
4401
4425
  key: 0,
4402
4426
  "consumed-tokens": subtreeConsumedTokens.value
4403
4427
  }, null, 8, ["consumed-tokens"])) : createCommentVNode("", true)
@@ -4405,33 +4429,36 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4405
4429
  _: 1
4406
4430
  }, 8, ["class"])) : createCommentVNode("", true),
4407
4431
  isError.value && _ctx.isCompact ? (openBlock(), createBlock(unref(N8nIcon), {
4408
- key: 1,
4432
+ key: 3,
4409
4433
  size: "medium",
4410
4434
  color: "danger",
4411
4435
  icon: "exclamation-triangle",
4412
4436
  class: normalizeClass(_ctx.$style.compactErrorIcon)
4413
4437
  }, null, 8, ["class"])) : createCommentVNode("", true),
4414
- !props.isReadOnly ? (openBlock(), createBlock(unref(_sfc_main$h), {
4415
- key: 2,
4438
+ !_ctx.isCompact || !props.isReadOnly && !props.latestInfo?.deleted && !props.latestInfo?.disabled ? (openBlock(), createBlock(unref(_sfc_main$i), {
4439
+ key: 4,
4416
4440
  type: "secondary",
4417
4441
  size: "small",
4418
4442
  icon: "play",
4419
4443
  style: { "color": "var(--color-text-base)" },
4420
4444
  "aria-label": unref(locale).baseText("logs.overview.body.run"),
4421
- class: normalizeClass([_ctx.$style.partialExecutionButton, depth.value > 0 ? _ctx.$style.unavailable : ""]),
4445
+ class: normalizeClass([_ctx.$style.partialExecutionButton, props.data.depth > 0 ? _ctx.$style.unavailable : ""]),
4446
+ disabled: props.latestInfo?.deleted || props.latestInfo?.disabled,
4422
4447
  onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("triggerPartialExecution", props.data), ["stop"]))
4423
- }, null, 8, ["aria-label", "class"])) : createCommentVNode("", true),
4424
- createVNode(unref(_sfc_main$h), {
4448
+ }, null, 8, ["aria-label", "class", "disabled"])) : createCommentVNode("", true),
4449
+ !_ctx.isCompact || !props.latestInfo?.deleted ? (openBlock(), createBlock(unref(_sfc_main$i), {
4450
+ key: 5,
4425
4451
  type: "secondary",
4426
4452
  size: "small",
4427
4453
  icon: "external-link-alt",
4428
4454
  style: { "color": "var(--color-text-base)" },
4455
+ disabled: props.latestInfo?.deleted,
4429
4456
  class: normalizeClass(_ctx.$style.openNdvButton),
4430
4457
  "aria-label": unref(locale).baseText("logs.overview.body.open"),
4431
4458
  onClick: _cache[1] || (_cache[1] = withModifiers(($event) => emit("openNdv", props.data), ["stop"]))
4432
- }, null, 8, ["class", "aria-label"]),
4459
+ }, null, 8, ["disabled", "class", "aria-label"])) : createCommentVNode("", true),
4433
4460
  !_ctx.isCompact || props.data.children.length > 0 ? (openBlock(), createBlock(unref(N8nButton), {
4434
- key: 3,
4461
+ key: 6,
4435
4462
  type: "secondary",
4436
4463
  size: "small",
4437
4464
  square: true,
@@ -4442,39 +4469,39 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4442
4469
  }),
4443
4470
  class: normalizeClass(_ctx.$style.toggleButton),
4444
4471
  "aria-label": unref(locale).baseText("logs.overview.body.toggleRow"),
4445
- onClick: _cache[2] || (_cache[2] = withModifiers(($event) => emit("toggleExpanded", props.node), ["stop"]))
4472
+ onClick: _cache[2] || (_cache[2] = withModifiers(($event) => emit("toggleExpanded", props.data), ["stop"]))
4446
4473
  }, {
4447
4474
  default: withCtx(() => [
4448
4475
  createVNode(unref(N8nIcon), {
4449
4476
  size: "medium",
4450
- icon: props.node.expanded ? "chevron-down" : "chevron-up"
4477
+ icon: props.expanded ? "chevron-down" : "chevron-up"
4451
4478
  }, null, 8, ["icon"])
4452
4479
  ]),
4453
4480
  _: 1
4454
4481
  }, 8, ["style", "class", "aria-label"])) : createCommentVNode("", true)
4455
- ], 2)) : createCommentVNode("", true);
4482
+ ], 10, _hoisted_1);
4456
4483
  };
4457
4484
  }
4458
4485
  });
4459
- const container$5 = "_container_jrkhv_123";
4460
- const background = "_background_jrkhv_140";
4461
- const selected = "_selected_jrkhv_149";
4462
- const error = "_error_jrkhv_152";
4463
- const indent = "_indent_jrkhv_156";
4464
- const connectorCurved = "_connectorCurved_jrkhv_165";
4465
- const connectorStraight = "_connectorStraight_jrkhv_175";
4466
- const icon$1 = "_icon_jrkhv_184";
4467
- const name$1 = "_name_jrkhv_190";
4468
- const timeTook = "_timeTook_jrkhv_196";
4469
- const errorIcon = "_errorIcon_jrkhv_201";
4470
- const compact = "_compact_jrkhv_205";
4471
- const startedAt = "_startedAt_jrkhv_215";
4472
- const consumedTokens = "_consumedTokens_jrkhv_224";
4473
- const compactErrorIcon = "_compactErrorIcon_jrkhv_240";
4474
- const partialExecutionButton = "_partialExecutionButton_jrkhv_248";
4475
- const openNdvButton = "_openNdvButton_jrkhv_249";
4476
- const unavailable = "_unavailable_jrkhv_259";
4477
- const toggleButton = "_toggleButton_jrkhv_267";
4486
+ const container$5 = "_container_12bsi_123";
4487
+ const background = "_background_12bsi_138";
4488
+ const selected = "_selected_12bsi_147";
4489
+ const error = "_error_12bsi_153";
4490
+ const indent = "_indent_12bsi_157";
4491
+ const connectorCurved = "_connectorCurved_12bsi_166";
4492
+ const connectorStraight = "_connectorStraight_12bsi_176";
4493
+ const icon$1 = "_icon_12bsi_185";
4494
+ const name = "_name_12bsi_191";
4495
+ const timeTook = "_timeTook_12bsi_197";
4496
+ const errorIcon = "_errorIcon_12bsi_202";
4497
+ const startedAt = "_startedAt_12bsi_207";
4498
+ const consumedTokens = "_consumedTokens_12bsi_213";
4499
+ const compactErrorIcon = "_compactErrorIcon_12bsi_220";
4500
+ const partialExecutionButton = "_partialExecutionButton_12bsi_228";
4501
+ const openNdvButton = "_openNdvButton_12bsi_229";
4502
+ const compact = "_compact_12bsi_220";
4503
+ const unavailable = "_unavailable_12bsi_239";
4504
+ const toggleButton = "_toggleButton_12bsi_247";
4478
4505
  const style0$6 = {
4479
4506
  container: container$5,
4480
4507
  background,
@@ -4484,15 +4511,15 @@ const style0$6 = {
4484
4511
  connectorCurved,
4485
4512
  connectorStraight,
4486
4513
  icon: icon$1,
4487
- name: name$1,
4514
+ name,
4488
4515
  timeTook,
4489
4516
  errorIcon,
4490
- compact,
4491
4517
  startedAt,
4492
4518
  consumedTokens,
4493
4519
  compactErrorIcon,
4494
4520
  partialExecutionButton,
4495
4521
  openNdvButton,
4522
+ compact,
4496
4523
  unavailable,
4497
4524
  toggleButton
4498
4525
  };
@@ -4526,7 +4553,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4526
4553
  }, {
4527
4554
  default: withCtx(() => [
4528
4555
  createBaseVNode("span", null, toDisplayString(executionStatusText.value), 1),
4529
- _ctx.consumedTokens.totalTokens > 0 ? (openBlock(), createBlock(_sfc_main$7, {
4556
+ _ctx.consumedTokens.totalTokens > 0 ? (openBlock(), createBlock(_sfc_main$8, {
4530
4557
  key: 0,
4531
4558
  "consumed-tokens": _ctx.consumedTokens
4532
4559
  }, null, 8, ["consumed-tokens"])) : createCommentVNode("", true)
@@ -4551,33 +4578,32 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4551
4578
  selected: {},
4552
4579
  isReadOnly: { type: Boolean },
4553
4580
  isCompact: { type: Boolean },
4554
- executionTree: {}
4581
+ execution: {},
4582
+ latestNodeInfo: {},
4583
+ scrollToSelection: { type: Boolean }
4555
4584
  },
4556
- emits: ["clickHeader", "select"],
4585
+ emits: ["clickHeader", "select", "clearExecutionData"],
4557
4586
  setup(__props, { emit: __emit }) {
4558
4587
  const emit = __emit;
4559
4588
  const locale = useI18n$1();
4560
4589
  const telemetry = useTelemetry();
4561
- const workflowsStore = useWorkflowsStore();
4562
4590
  const router = useRouter();
4563
4591
  const runWorkflow = useRunWorkflow({ router });
4564
4592
  const ndvStore = useNDVStore();
4565
- const nodeHelpers = useNodeHelpers();
4566
4593
  const isClearExecutionButtonVisible = useClearExecutionButtonVisible();
4567
- const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4568
- const isEmpty2 = computed(() => workflowsStore.workflowExecutionData === null);
4594
+ const isEmpty2 = computed(() => __props.execution === void 0);
4569
4595
  const switchViewOptions = computed(() => [
4570
- { label: locale.baseText("logs.overview.header.switch.details"), value: "details" },
4571
- { label: locale.baseText("logs.overview.header.switch.overview"), value: "overview" }
4596
+ { label: locale.baseText("logs.overview.header.switch.overview"), value: "overview" },
4597
+ { label: locale.baseText("logs.overview.header.switch.details"), value: "details" }
4572
4598
  ]);
4573
- const execution = computed(() => workflowsStore.workflowExecutionData);
4574
4599
  const consumedTokens2 = computed(
4575
- () => getTotalConsumedTokens(...__props.executionTree.map(getSubtreeTotalConsumedTokens))
4600
+ () => getTotalConsumedTokens(...(__props.execution?.tree ?? []).map(getSubtreeTotalConsumedTokens))
4576
4601
  );
4577
- function onClearExecutionData() {
4578
- workflowsStore.setWorkflowExecutionData(null);
4579
- nodeHelpers.updateNodesExecutionIssues();
4580
- }
4602
+ const collapsedEntries = ref({});
4603
+ const flatLogEntries = computed(
4604
+ () => flattenLogEntries(__props.execution?.tree ?? [], collapsedEntries.value)
4605
+ );
4606
+ const virtualList = useVirtualList(flatLogEntries, { itemHeight: 32 });
4581
4607
  function handleClickNode(clicked) {
4582
4608
  if (__props.selected?.node === clicked.node && __props.selected?.runIndex === clicked.runIndex) {
4583
4609
  emit("select", void 0);
@@ -4585,24 +4611,49 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4585
4611
  }
4586
4612
  emit("select", clicked);
4587
4613
  telemetry.track("User selected node in log view", {
4588
- node_type: workflowsStore.nodesByName[clicked.node].type,
4589
- node_id: workflowsStore.nodesByName[clicked.node].id,
4590
- execution_id: workflowsStore.workflowExecutionData?.id,
4591
- workflow_id: workflow.value.id
4614
+ node_type: clicked.node.type,
4615
+ node_id: clicked.node.id,
4616
+ execution_id: __props.execution?.id,
4617
+ workflow_id: __props.execution?.workflowData.id
4592
4618
  });
4593
4619
  }
4594
4620
  function handleSwitchView(value) {
4595
- emit("select", value === "overview" || __props.executionTree.length === 0 ? void 0 : __props.executionTree[0]);
4621
+ emit(
4622
+ "select",
4623
+ value === "overview" || (__props.execution?.tree ?? []).length === 0 ? void 0 : __props.execution?.tree[0]
4624
+ );
4596
4625
  }
4597
4626
  function handleToggleExpanded(treeNode) {
4598
- treeNode.expanded = !treeNode.expanded;
4627
+ collapsedEntries.value[treeNode.id] = !collapsedEntries.value[treeNode.id];
4599
4628
  }
4600
4629
  async function handleOpenNdv(treeNode) {
4601
- ndvStore.setActiveNodeName(treeNode.node);
4630
+ ndvStore.setActiveNodeName(treeNode.node.name);
4631
+ await nextTick(() => {
4632
+ const source = treeNode.runData.source[0];
4633
+ const inputBranch = source?.previousNodeOutput ?? 0;
4634
+ ndvEventBus.emit("updateInputNodeName", source?.previousNode);
4635
+ ndvEventBus.emit("setInputBranchIndex", inputBranch);
4636
+ ndvStore.setOutputRunIndex(treeNode.runIndex);
4637
+ });
4602
4638
  }
4603
4639
  async function handleTriggerPartialExecution(treeNode) {
4604
- await runWorkflow.runWorkflow({ destinationNode: treeNode.node });
4640
+ const latestName = __props.latestNodeInfo[treeNode.node.id]?.name ?? treeNode.node.name;
4641
+ if (latestName) {
4642
+ await runWorkflow.runWorkflow({ destinationNode: latestName });
4643
+ }
4605
4644
  }
4645
+ watch(
4646
+ () => __props.scrollToSelection ? __props.selected : void 0,
4647
+ async (entry) => {
4648
+ if (entry) {
4649
+ const index = flatLogEntries.value.findIndex((e) => e.id === entry.id);
4650
+ if (index >= 0) {
4651
+ await nextTick(() => virtualList.scrollTo(index));
4652
+ }
4653
+ }
4654
+ },
4655
+ { immediate: true }
4656
+ );
4606
4657
  return (_ctx, _cache) => {
4607
4658
  return openBlock(), createElementBlock("div", {
4608
4659
  class: normalizeClass(_ctx.$style.container),
@@ -4611,7 +4662,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4611
4662
  createVNode(PanelHeader, {
4612
4663
  title: unref(locale).baseText("logs.overview.header.title"),
4613
4664
  "data-test-id": "logs-overview-header",
4614
- onClick: _cache[0] || (_cache[0] = ($event) => emit("clickHeader"))
4665
+ onClick: _cache[1] || (_cache[1] = ($event) => emit("clickHeader"))
4615
4666
  }, {
4616
4667
  actions: withCtx(() => [
4617
4668
  unref(isClearExecutionButtonVisible) ? (openBlock(), createBlock(unref(N8nTooltip), {
@@ -4625,7 +4676,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4625
4676
  icon: "trash",
4626
4677
  "icon-size": "medium",
4627
4678
  class: normalizeClass(_ctx.$style.clearButton),
4628
- onClick: withModifiers(onClearExecutionData, ["stop"])
4679
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("clearExecutionData"), ["stop"]))
4629
4680
  }, {
4630
4681
  default: withCtx(() => [
4631
4682
  createTextVNode(toDisplayString(unref(locale).baseText("logs.overview.header.actions.clearExecution")), 1)
@@ -4656,71 +4707,63 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4656
4707
  createTextVNode(toDisplayString(unref(locale).baseText("logs.overview.body.empty.message")), 1)
4657
4708
  ]),
4658
4709
  _: 1
4659
- }, 8, ["class"])) : (openBlock(), createElementBlock("div", {
4660
- key: 1,
4661
- class: normalizeClass(_ctx.$style.scrollable)
4662
- }, [
4663
- execution.value ? (openBlock(), createBlock(ExecutionSummary, {
4710
+ }, 8, ["class"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
4711
+ _ctx.execution ? (openBlock(), createBlock(ExecutionSummary, {
4664
4712
  key: 0,
4665
4713
  class: normalizeClass(_ctx.$style.summary),
4666
- status: execution.value.status,
4714
+ status: _ctx.execution.status,
4667
4715
  "consumed-tokens": consumedTokens2.value,
4668
- "time-took": execution.value.startedAt && execution.value.stoppedAt ? +new Date(execution.value.stoppedAt) - +new Date(execution.value.startedAt) : void 0
4716
+ "time-took": _ctx.execution.startedAt && _ctx.execution.stoppedAt ? +new Date(_ctx.execution.stoppedAt) - +new Date(_ctx.execution.startedAt) : void 0
4669
4717
  }, null, 8, ["class", "status", "consumed-tokens", "time-took"])) : createCommentVNode("", true),
4670
- _ctx.executionTree.length > 0 ? (openBlock(), createBlock(unref(ElTree), {
4671
- key: 1,
4672
- "node-key": "id",
4673
- class: normalizeClass(_ctx.$style.tree),
4674
- indent: 0,
4675
- data: _ctx.executionTree,
4676
- "expand-on-click-node": false,
4677
- "default-expand-all": true,
4678
- onNodeClick: handleClickNode
4679
- }, {
4680
- default: withCtx(({ node: elTreeNode, data }) => [
4681
- createVNode(LogsOverviewRow, {
4682
- data,
4683
- node: elTreeNode,
4684
- "is-read-only": _ctx.isReadOnly,
4685
- "is-selected": data.node === _ctx.selected?.node && data.runIndex === _ctx.selected?.runIndex,
4686
- "is-compact": _ctx.isCompact,
4687
- "should-show-consumed-tokens": consumedTokens2.value.totalTokens > 0,
4688
- onToggleExpanded: handleToggleExpanded,
4689
- onOpenNdv: handleOpenNdv,
4690
- onTriggerPartialExecution: handleTriggerPartialExecution
4691
- }, null, 8, ["data", "node", "is-read-only", "is-selected", "is-compact", "should-show-consumed-tokens"])
4692
- ]),
4693
- _: 1
4694
- }, 8, ["class", "data"])) : createCommentVNode("", true),
4718
+ createBaseVNode("div", mergeProps({
4719
+ class: _ctx.$style.tree
4720
+ }, unref(virtualList).containerProps), [
4721
+ createBaseVNode("div", mergeProps(unref(virtualList).wrapperProps.value, { role: "tree" }), [
4722
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(virtualList).list.value, ({ data }) => {
4723
+ return openBlock(), createBlock(LogsOverviewRow, {
4724
+ key: data.id,
4725
+ data,
4726
+ "is-read-only": _ctx.isReadOnly,
4727
+ "is-selected": data.node.name === _ctx.selected?.node.name && data.runIndex === _ctx.selected?.runIndex,
4728
+ "is-compact": _ctx.isCompact,
4729
+ "should-show-consumed-tokens": consumedTokens2.value.totalTokens > 0,
4730
+ "latest-info": _ctx.latestNodeInfo[data.node.id],
4731
+ expanded: !collapsedEntries.value[data.id],
4732
+ onClick: withModifiers(($event) => handleClickNode(data), ["stop"]),
4733
+ onToggleExpanded: handleToggleExpanded,
4734
+ onOpenNdv: handleOpenNdv,
4735
+ onTriggerPartialExecution: handleTriggerPartialExecution
4736
+ }, null, 8, ["data", "is-read-only", "is-selected", "is-compact", "should-show-consumed-tokens", "latest-info", "expanded", "onClick"]);
4737
+ }), 128))
4738
+ ], 16)
4739
+ ], 16),
4695
4740
  createVNode(unref(N8nRadioButtons), {
4696
- size: "medium",
4741
+ size: "small-medium",
4697
4742
  class: normalizeClass(_ctx.$style.switchViewButtons),
4698
4743
  "model-value": _ctx.selected ? "details" : "overview",
4699
4744
  options: switchViewOptions.value,
4700
4745
  "onUpdate:modelValue": handleSwitchView
4701
4746
  }, null, 8, ["class", "model-value", "options"])
4702
- ], 2))
4747
+ ], 64))
4703
4748
  ], 2)) : createCommentVNode("", true)
4704
4749
  ], 2);
4705
4750
  };
4706
4751
  }
4707
4752
  });
4708
- const container$3 = "_container_ow69g_123";
4709
- const clearButton = "_clearButton_ow69g_133";
4710
- const content$1 = "_content_ow69g_138";
4711
- const empty = "_empty_ow69g_147";
4712
- const emptyText = "_emptyText_ow69g_152";
4713
- const scrollable = "_scrollable_ow69g_157";
4714
- const summary = "_summary_ow69g_163";
4715
- const tree = "_tree_ow69g_169";
4716
- const switchViewButtons = "_switchViewButtons_ow69g_176";
4753
+ const container$3 = "_container_acxst_123";
4754
+ const clearButton = "_clearButton_acxst_133";
4755
+ const content$1 = "_content_acxst_139";
4756
+ const empty = "_empty_acxst_148";
4757
+ const emptyText = "_emptyText_acxst_153";
4758
+ const summary = "_summary_acxst_158";
4759
+ const tree = "_tree_acxst_162";
4760
+ const switchViewButtons = "_switchViewButtons_acxst_169";
4717
4761
  const style0$4 = {
4718
4762
  container: container$3,
4719
4763
  clearButton,
4720
4764
  content: content$1,
4721
4765
  empty,
4722
4766
  emptyText,
4723
- scrollable,
4724
4767
  summary,
4725
4768
  tree,
4726
4769
  switchViewButtons
@@ -4734,38 +4777,36 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4734
4777
  props: {
4735
4778
  title: {},
4736
4779
  paneType: {},
4737
- logEntry: {}
4780
+ logEntry: {},
4781
+ workflow: {},
4782
+ execution: {}
4738
4783
  },
4739
4784
  setup(__props) {
4740
4785
  const locale = useI18n$1();
4741
- const workflowsStore = useWorkflowsStore();
4742
4786
  const ndvStore = useNDVStore();
4743
- const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4744
- const node = computed(() => {
4787
+ const isMultipleInput = computed(() => __props.paneType === "input" && __props.logEntry.runData.source.length > 1);
4788
+ const runDataProps = computed(() => {
4745
4789
  if (__props.logEntry.depth > 0 || __props.paneType === "output") {
4746
- return workflowsStore.nodesByName[__props.logEntry.node];
4790
+ return { node: __props.logEntry.node, runIndex: __props.logEntry.runIndex };
4747
4791
  }
4748
- const parent = workflow.value.getParentNodesByDepth(__props.logEntry.node)[0];
4749
- if (!parent) {
4792
+ const source = __props.logEntry.runData.source[0];
4793
+ const node = source && __props.workflow.getNode(source.previousNode);
4794
+ if (!source || !node) {
4750
4795
  return void 0;
4751
4796
  }
4752
- return workflowsStore.nodesByName[parent.name];
4797
+ return {
4798
+ node,
4799
+ runIndex: source.previousNodeRun ?? 0,
4800
+ overrideOutputs: [source.previousNodeOutput ?? 0]
4801
+ };
4753
4802
  });
4754
- const isMultipleInput = computed(
4755
- () => __props.paneType === "input" && uniqBy(
4756
- workflow.value.getParentNodesByDepth(__props.logEntry.node).filter((n) => n.name !== __props.logEntry.node),
4757
- (n) => n.name
4758
- ).length > 1
4759
- );
4760
4803
  function handleClickOpenNdv() {
4761
- ndvStore.setActiveNodeName(__props.logEntry.node);
4804
+ ndvStore.setActiveNodeName(__props.logEntry.node.name);
4762
4805
  }
4763
4806
  return (_ctx, _cache) => {
4764
- return node.value ? (openBlock(), createBlock(RunData, {
4765
- key: 0,
4766
- node: node.value,
4767
- workflow: workflow.value,
4768
- "run-index": _ctx.logEntry.runIndex,
4807
+ return runDataProps.value ? (openBlock(), createBlock(RunData, mergeProps({ key: 0 }, runDataProps.value, {
4808
+ workflow: _ctx.workflow,
4809
+ "workflow-execution": _ctx.execution,
4769
4810
  "too-much-data-title": unref(locale).baseText("ndv.output.tooMuchData.title"),
4770
4811
  "no-data-in-branch-message": unref(locale).baseText("ndv.output.noOutputDataInBranch"),
4771
4812
  "executing-message": unref(locale).baseText("ndv.output.executing"),
@@ -4774,8 +4815,9 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4774
4815
  compact: true,
4775
4816
  "disable-pin": true,
4776
4817
  "disable-edit": true,
4818
+ "disable-hover-highlight": true,
4777
4819
  "table-header-bg-color": "light"
4778
- }, createSlots({
4820
+ }), createSlots({
4779
4821
  header: withCtx(() => [
4780
4822
  createVNode(unref(N8nText), {
4781
4823
  class: normalizeClass(_ctx.$style.title),
@@ -4828,7 +4870,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4828
4870
  ]),
4829
4871
  key: "1"
4830
4872
  } : void 0
4831
- ]), 1032, ["node", "workflow", "run-index", "too-much-data-title", "no-data-in-branch-message", "executing-message", "pane-type"])) : createCommentVNode("", true);
4873
+ ]), 1040, ["workflow", "workflow-execution", "too-much-data-title", "no-data-in-branch-message", "executing-message", "pane-type"])) : createCommentVNode("", true);
4832
4874
  };
4833
4875
  }
4834
4876
  });
@@ -4851,26 +4893,28 @@ function useResizablePanel(localStorageKey, {
4851
4893
  allowFullSize
4852
4894
  }) {
4853
4895
  const containerSize = ref(0);
4854
- const size = useLocalStorage(localStorageKey, -1, { writeDefaults: false });
4896
+ const persistedSize = useLocalStorage(localStorageKey, -1, { writeDefaults: false });
4855
4897
  const isResizing = ref(false);
4898
+ const sizeOnResizeStart = ref();
4899
+ const minSizeValue = computed(() => resolveSize(minSize, containerSize.value));
4900
+ const maxSizeValue = computed(() => resolveSize(maxSize, containerSize.value));
4856
4901
  const constrainedSize = computed(() => {
4857
- if (isResizing.value && allowCollapse && size.value < 30) {
4902
+ const sizeInPixels = persistedSize.value >= 0 && persistedSize.value <= 1 ? containerSize.value * persistedSize.value : -1;
4903
+ if (isResizing.value && allowCollapse && sizeInPixels < 30) {
4858
4904
  return 0;
4859
4905
  }
4860
- if (isResizing.value && allowFullSize && size.value > containerSize.value - 30) {
4906
+ if (isResizing.value && allowFullSize && sizeInPixels > containerSize.value - 30) {
4861
4907
  return containerSize.value;
4862
4908
  }
4863
4909
  const defaultSizeValue = resolveSize(defaultSize, containerSize.value);
4864
- if (Number.isNaN(size.value) || size.value < 0) {
4910
+ if (Number.isNaN(sizeInPixels) || !Number.isFinite(sizeInPixels) || sizeInPixels < 0) {
4865
4911
  return defaultSizeValue;
4866
4912
  }
4867
- const minSizeValue = resolveSize(minSize, containerSize.value);
4868
- const maxSizeValue = resolveSize(maxSize, containerSize.value);
4869
4913
  return Math.max(
4870
- minSizeValue,
4914
+ minSizeValue.value,
4871
4915
  Math.min(
4872
- snap && Math.abs(defaultSizeValue - size.value) < 30 ? defaultSizeValue : size.value,
4873
- maxSizeValue
4916
+ snap && Math.abs(defaultSizeValue - sizeInPixels) < 30 ? defaultSizeValue : sizeInPixels,
4917
+ maxSizeValue.value
4874
4918
  )
4875
4919
  );
4876
4920
  });
@@ -4888,13 +4932,21 @@ function useResizablePanel(localStorageKey, {
4888
4932
  }
4889
4933
  function onResize(data) {
4890
4934
  const containerRect = unref(container2)?.getBoundingClientRect();
4891
- isResizing.value = true;
4892
- size.value = Math.max(
4935
+ const newSizeInPixels = Math.max(
4893
4936
  0,
4894
4937
  position === "bottom" ? (containerRect ? getSize(containerRect) : 0) - getValue(data) : getValue(data) - (containerRect ? getValue(containerRect) : 0)
4895
4938
  );
4939
+ isResizing.value = true;
4940
+ persistedSize.value = newSizeInPixels / containerSize.value;
4941
+ if (sizeOnResizeStart.value === void 0) {
4942
+ sizeOnResizeStart.value = persistedSize.value;
4943
+ }
4896
4944
  }
4897
4945
  function onResizeEnd() {
4946
+ if (minSizeValue.value > 0 && constrainedSize.value <= 0 || maxSizeValue.value < containerSize.value && constrainedSize.value >= containerSize.value) {
4947
+ persistedSize.value = sizeOnResizeStart.value;
4948
+ }
4949
+ sizeOnResizeStart.value = void 0;
4898
4950
  isResizing.value = false;
4899
4951
  }
4900
4952
  watch(
@@ -4912,12 +4964,6 @@ function useResizablePanel(localStorageKey, {
4912
4964
  },
4913
4965
  { immediate: true }
4914
4966
  );
4915
- watch(containerSize, (newValue, oldValue) => {
4916
- if (size.value > 0 && oldValue > 0) {
4917
- const ratio = size.value / oldValue;
4918
- size.value = Math.round(newValue * ratio);
4919
- }
4920
- });
4921
4967
  return {
4922
4968
  isResizing: computed(() => isResizing.value),
4923
4969
  isCollapsed: computed(() => isResizing.value && constrainedSize.value <= 0),
@@ -4933,21 +4979,23 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4933
4979
  props: {
4934
4980
  isOpen: { type: Boolean },
4935
4981
  logEntry: {},
4936
- window: {}
4982
+ workflow: {},
4983
+ execution: {},
4984
+ window: {},
4985
+ latestInfo: {}
4937
4986
  },
4938
4987
  emits: ["clickHeader"],
4939
4988
  setup(__props, { emit: __emit }) {
4940
4989
  const emit = __emit;
4941
4990
  const locale = useI18n$1();
4942
4991
  const telemetry = useTelemetry();
4943
- const workflowsStore = useWorkflowsStore();
4944
4992
  const nodeTypeStore = useNodeTypesStore();
4945
- const content2 = ref(LOG_DETAILS_CONTENT.BOTH);
4946
- const node = computed(() => workflowsStore.nodesByName[__props.logEntry.node]);
4947
- const type = computed(() => node.value ? nodeTypeStore.getNodeType(node.value.type) : void 0);
4948
- const runData = computed(
4949
- () => (workflowsStore.workflowExecutionData?.data?.resultData.runData[__props.logEntry.node] ?? [])[__props.logEntry.runIndex]
4993
+ const content2 = useLocalStorage(
4994
+ "N8N_LOGS_DETAIL_PANEL_CONTENT",
4995
+ LOG_DETAILS_CONTENT.OUTPUT,
4996
+ { writeDefaults: false }
4950
4997
  );
4998
+ const type = computed(() => nodeTypeStore.getNodeType(__props.logEntry.node.type));
4951
4999
  const consumedTokens2 = computed(() => getSubtreeTotalConsumedTokens(__props.logEntry));
4952
5000
  const isTriggerNode = computed(() => type.value?.group.includes("trigger"));
4953
5001
  const container2 = useTemplateRef("container");
@@ -5000,34 +5048,29 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5000
5048
  }, [
5001
5049
  createVNode(PanelHeader, {
5002
5050
  "data-test-id": "log-details-header",
5051
+ class: normalizeClass(_ctx.$style.header),
5003
5052
  onClick: _cache[0] || (_cache[0] = ($event) => emit("clickHeader"))
5004
5053
  }, {
5005
5054
  title: withCtx(() => [
5006
5055
  createBaseVNode("div", {
5007
5056
  class: normalizeClass(_ctx.$style.title)
5008
5057
  }, [
5009
- createVNode(_sfc_main$j, {
5058
+ createVNode(_sfc_main$k, {
5010
5059
  "node-type": type.value,
5011
5060
  size: 16,
5012
5061
  class: normalizeClass(_ctx.$style.icon)
5013
5062
  }, null, 8, ["node-type", "class"]),
5014
- createVNode(unref(N8nText), {
5015
- tag: "div",
5016
- bold: true,
5017
- size: "small",
5018
- class: normalizeClass(_ctx.$style.name)
5019
- }, {
5020
- default: withCtx(() => [
5021
- createTextVNode(toDisplayString(node.value?.name), 1)
5022
- ]),
5023
- _: 1
5024
- }, 8, ["class"]),
5063
+ createVNode(NodeName, {
5064
+ "latest-name": _ctx.latestInfo?.name ?? _ctx.logEntry.node.name,
5065
+ name: _ctx.logEntry.node.name,
5066
+ "is-deleted": _ctx.latestInfo?.deleted ?? false
5067
+ }, null, 8, ["latest-name", "name", "is-deleted"]),
5025
5068
  _ctx.isOpen ? (openBlock(), createBlock(ExecutionSummary, {
5026
5069
  key: 0,
5027
5070
  class: normalizeClass(_ctx.$style.executionSummary),
5028
- status: runData.value?.executionStatus ?? "unknown",
5071
+ status: _ctx.logEntry.runData.executionStatus ?? "unknown",
5029
5072
  "consumed-tokens": consumedTokens2.value,
5030
- "time-took": runData.value?.executionTime
5073
+ "time-took": _ctx.logEntry.runData.executionTime
5031
5074
  }, null, 8, ["class", "status", "consumed-tokens", "time-took"])) : createCommentVNode("", true)
5032
5075
  ], 2)
5033
5076
  ]),
@@ -5039,7 +5082,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5039
5082
  createVNode(unref(N8nButton), {
5040
5083
  size: "mini",
5041
5084
  type: "secondary",
5042
- class: normalizeClass(content2.value === unref(LOG_DETAILS_CONTENT).OUTPUT ? "" : _ctx.$style.pressed),
5085
+ class: normalizeClass(unref(content2) === unref(LOG_DETAILS_CONTENT).OUTPUT ? "" : _ctx.$style.pressed),
5043
5086
  onClick: withModifiers(handleToggleInput, ["stop"])
5044
5087
  }, {
5045
5088
  default: withCtx(() => [
@@ -5050,7 +5093,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5050
5093
  createVNode(unref(N8nButton), {
5051
5094
  size: "mini",
5052
5095
  type: "secondary",
5053
- class: normalizeClass(content2.value === unref(LOG_DETAILS_CONTENT).INPUT ? "" : _ctx.$style.pressed),
5096
+ class: normalizeClass(unref(content2) === unref(LOG_DETAILS_CONTENT).INPUT ? "" : _ctx.$style.pressed),
5054
5097
  onClick: withModifiers(handleToggleOutput, ["stop"])
5055
5098
  }, {
5056
5099
  default: withCtx(() => [
@@ -5062,13 +5105,13 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5062
5105
  renderSlot(_ctx.$slots, "actions")
5063
5106
  ]),
5064
5107
  _: 3
5065
- }),
5108
+ }, 8, ["class"]),
5066
5109
  _ctx.isOpen ? (openBlock(), createElementBlock("div", {
5067
5110
  key: 0,
5068
5111
  class: normalizeClass(_ctx.$style.content),
5069
5112
  "data-test-id": "logs-details-body"
5070
5113
  }, [
5071
- !isTriggerNode.value && content2.value !== unref(LOG_DETAILS_CONTENT).OUTPUT ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5114
+ !isTriggerNode.value && unref(content2) !== unref(LOG_DETAILS_CONTENT).OUTPUT ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5072
5115
  key: 0,
5073
5116
  class: normalizeClass({
5074
5117
  [_ctx.$style.inputResizer]: true,
@@ -5088,43 +5131,47 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5088
5131
  "data-test-id": "log-details-input",
5089
5132
  "pane-type": "input",
5090
5133
  title: unref(locale).baseText("logs.details.header.actions.input"),
5091
- "log-entry": _ctx.logEntry
5092
- }, null, 8, ["title", "log-entry"])
5134
+ "log-entry": _ctx.logEntry,
5135
+ workflow: _ctx.workflow,
5136
+ execution: _ctx.execution
5137
+ }, null, 8, ["title", "log-entry", "workflow", "execution"])
5093
5138
  ]),
5094
5139
  _: 1
5095
5140
  }, 8, ["class", "width", "style", "is-resizing-enabled", "window", "onResize"])) : createCommentVNode("", true),
5096
- isTriggerNode.value || content2.value !== unref(LOG_DETAILS_CONTENT).INPUT ? (openBlock(), createBlock(RunDataView, {
5141
+ isTriggerNode.value || unref(content2) !== unref(LOG_DETAILS_CONTENT).INPUT ? (openBlock(), createBlock(RunDataView, {
5097
5142
  key: 1,
5098
5143
  "data-test-id": "log-details-output",
5099
5144
  "pane-type": "output",
5100
5145
  class: normalizeClass(_ctx.$style.outputPanel),
5101
5146
  title: unref(locale).baseText("logs.details.header.actions.output"),
5102
- "log-entry": _ctx.logEntry
5103
- }, null, 8, ["class", "title", "log-entry"])) : createCommentVNode("", true)
5147
+ "log-entry": _ctx.logEntry,
5148
+ workflow: _ctx.workflow,
5149
+ execution: _ctx.execution
5150
+ }, null, 8, ["class", "title", "log-entry", "workflow", "execution"])) : createCommentVNode("", true)
5104
5151
  ], 2)) : createCommentVNode("", true)
5105
5152
  ], 2);
5106
5153
  };
5107
5154
  }
5108
5155
  });
5109
- const container$2 = "_container_v1vl1_123";
5110
- const actions = "_actions_v1vl1_132";
5111
- const pressed = "_pressed_v1vl1_138";
5112
- const title = "_title_v1vl1_142";
5113
- const icon = "_icon_v1vl1_148";
5114
- const name = "_name_v1vl1_152";
5115
- const executionSummary = "_executionSummary_v1vl1_158";
5116
- const content = "_content_v1vl1_162";
5117
- const outputPanel = "_outputPanel_v1vl1_170";
5118
- const inputResizer = "_inputResizer_v1vl1_175";
5119
- const collapsed = "_collapsed_v1vl1_179";
5120
- const full = "_full_v1vl1_179";
5156
+ const container$2 = "_container_pax0a_123";
5157
+ const header = "_header_pax0a_132";
5158
+ const actions = "_actions_pax0a_136";
5159
+ const pressed = "_pressed_pax0a_142";
5160
+ const title = "_title_pax0a_146";
5161
+ const icon = "_icon_pax0a_152";
5162
+ const executionSummary = "_executionSummary_pax0a_156";
5163
+ const content = "_content_pax0a_160";
5164
+ const outputPanel = "_outputPanel_pax0a_168";
5165
+ const inputResizer = "_inputResizer_pax0a_173";
5166
+ const collapsed = "_collapsed_pax0a_177";
5167
+ const full = "_full_pax0a_177";
5121
5168
  const style0$2 = {
5122
5169
  container: container$2,
5170
+ header,
5123
5171
  actions,
5124
5172
  pressed,
5125
5173
  title,
5126
5174
  icon,
5127
- name,
5128
5175
  executionSummary,
5129
5176
  content,
5130
5177
  outputPanel,
@@ -5163,7 +5210,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5163
5210
  content: popOutButtonText.value
5164
5211
  }, {
5165
5212
  default: withCtx(() => [
5166
- createVNode(unref(_sfc_main$h), {
5213
+ createVNode(unref(_sfc_main$i), {
5167
5214
  icon: "pop-out",
5168
5215
  type: "secondary",
5169
5216
  size: "small",
@@ -5180,7 +5227,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5180
5227
  content: toggleButtonText.value
5181
5228
  }, {
5182
5229
  default: withCtx(() => [
5183
- createVNode(unref(_sfc_main$h), {
5230
+ createVNode(unref(_sfc_main$i), {
5184
5231
  type: "secondary",
5185
5232
  size: "small",
5186
5233
  "icon-size": "medium",
@@ -5220,13 +5267,13 @@ function useLayout(pipContainer, pipContent2, container2, logsContainer2) {
5220
5267
  });
5221
5268
  const chatPanelResizer = useResizablePanel(LOCAL_STORAGE_PANEL_WIDTH, {
5222
5269
  container: container2,
5223
- defaultSize: (size) => size * 0.3,
5224
- minSize: 300,
5270
+ defaultSize: (size) => Math.min(800, size * 0.3),
5271
+ minSize: 240,
5225
5272
  maxSize: (size) => size * 0.8
5226
5273
  });
5227
5274
  const overviewPanelResizer = useResizablePanel(LOCAL_STORAGE_OVERVIEW_PANEL_WIDTH, {
5228
5275
  container: logsContainer2,
5229
- defaultSize: (size) => size * 0.3,
5276
+ defaultSize: (size) => Math.min(240, size * 0.2),
5230
5277
  minSize: 80,
5231
5278
  maxSize: 500,
5232
5279
  allowFullSize: true
@@ -5273,11 +5320,15 @@ function useLayout(pipContainer, pipContent2, container2, logsContainer2) {
5273
5320
  }
5274
5321
  resizer.onResizeEnd();
5275
5322
  }
5276
- watch([panelState, resizer.size], ([state, height]) => {
5277
- canvasStore.setPanelHeight(
5278
- state === LOGS_PANEL_STATE.FLOATING ? 0 : state === LOGS_PANEL_STATE.ATTACHED ? height : 32
5279
- );
5280
- });
5323
+ watch(
5324
+ [panelState, resizer.size],
5325
+ ([state, height]) => {
5326
+ canvasStore.setPanelHeight(
5327
+ state === LOGS_PANEL_STATE.FLOATING ? 0 : state === LOGS_PANEL_STATE.ATTACHED ? height : 32
5328
+ );
5329
+ },
5330
+ { immediate: true }
5331
+ );
5281
5332
  return {
5282
5333
  height: resizer.size,
5283
5334
  chatPanelWidth: chatPanelResizer.size,
@@ -5298,6 +5349,73 @@ function useLayout(pipContainer, pipContent2, container2, logsContainer2) {
5298
5349
  onOverviewPanelResizeEnd: overviewPanelResizer.onResizeEnd
5299
5350
  };
5300
5351
  }
5352
+ function useExecutionData() {
5353
+ const nodeHelpers = useNodeHelpers();
5354
+ const workflowsStore = useWorkflowsStore();
5355
+ const execData = ref();
5356
+ const workflow = computed(
5357
+ () => execData.value ? new Workflow({
5358
+ ...execData.value?.workflowData,
5359
+ nodeTypes: workflowsStore.getNodeTypes()
5360
+ }) : void 0
5361
+ );
5362
+ const latestNodeNameById = computed(
5363
+ () => Object.values(workflow.value?.nodes ?? {}).reduce(
5364
+ (acc, node) => {
5365
+ const nodeInStore = workflowsStore.getNodeById(node.id);
5366
+ acc[node.id] = {
5367
+ deleted: !nodeInStore,
5368
+ disabled: nodeInStore?.disabled ?? false,
5369
+ name: nodeInStore?.name ?? node.name
5370
+ };
5371
+ return acc;
5372
+ },
5373
+ {}
5374
+ )
5375
+ );
5376
+ const hasChat = computed(
5377
+ () => [Object.values(workflow.value?.nodes ?? {}), workflowsStore.workflow.nodes].some(
5378
+ (nodes) => nodes.some(isChatNode)
5379
+ )
5380
+ );
5381
+ const execution = computed(() => {
5382
+ if (!execData.value || !workflow.value) {
5383
+ return void 0;
5384
+ }
5385
+ return {
5386
+ ...execData.value,
5387
+ tree: createLogEntries(workflow.value, execData.value.data?.resultData.runData ?? {})
5388
+ };
5389
+ });
5390
+ const updateInterval = computed(() => (execution.value?.tree.length ?? 0) > 10 ? 300 : 0);
5391
+ const runStatusList = computed(
5392
+ () => workflowsStore.workflowExecutionData?.id === IN_PROGRESS_EXECUTION_ID ? Object.values(workflowsStore.workflowExecutionData?.data?.resultData.runData ?? {}).flatMap((tasks) => tasks.map((task) => task.executionStatus ?? "")).join("|") : ""
5393
+ );
5394
+ function resetExecutionData() {
5395
+ execData.value = void 0;
5396
+ workflowsStore.setWorkflowExecutionData(null);
5397
+ nodeHelpers.updateNodesExecutionIssues();
5398
+ }
5399
+ watch(
5400
+ // Fields that should trigger update
5401
+ [
5402
+ () => workflowsStore.workflowExecutionData?.id,
5403
+ () => workflowsStore.workflowExecutionData?.workflowData.id,
5404
+ () => workflowsStore.workflowExecutionData?.status,
5405
+ runStatusList
5406
+ ],
5407
+ useThrottleFn(
5408
+ () => {
5409
+ execData.value = deepToRaw(workflowsStore.workflowExecutionData ?? void 0);
5410
+ },
5411
+ updateInterval,
5412
+ true,
5413
+ true
5414
+ ),
5415
+ { immediate: true }
5416
+ );
5417
+ return { execution, workflow, hasChat, latestNodeNameById, resetExecutionData };
5418
+ }
5301
5419
  const _sfc_main = /* @__PURE__ */ defineComponent({
5302
5420
  __name: "LogsPanel",
5303
5421
  props: {
@@ -5305,12 +5423,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5305
5423
  },
5306
5424
  setup(__props) {
5307
5425
  const props = __props;
5308
- const workflowsStore = useWorkflowsStore();
5309
5426
  const container2 = useTemplateRef("container");
5310
5427
  const logsContainer2 = useTemplateRef("logsContainer");
5311
5428
  const pipContainer = useTemplateRef("pipContainer");
5312
5429
  const pipContent2 = useTemplateRef("pipContent");
5313
- const previousChatMessages = computed(() => workflowsStore.getPastChatMessages);
5314
5430
  const {
5315
5431
  height,
5316
5432
  chatPanelWidth,
@@ -5330,34 +5446,23 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5330
5446
  onOverviewPanelResize,
5331
5447
  onOverviewPanelResizeEnd
5332
5448
  } = useLayout(pipContainer, pipContent2, container2, logsContainer2);
5333
- const { currentSessionId, messages: messages2, sendMessage, refreshSession, displayExecution } = useChatState(
5334
- props.isReadOnly
5335
- );
5336
- const hasChat = computed(
5337
- () => workflowsStore.workflowTriggerNodes.some(isChatNode) && (!props.isReadOnly || messages2.value.length > 0)
5338
- );
5339
- const workflow = computed(() => workflowsStore.getCurrentWorkflow());
5340
- const executionTree = computed(
5341
- () => createLogEntries(
5342
- workflow.value,
5343
- workflowsStore.workflowExecutionData?.data?.resultData.runData ?? {}
5344
- )
5345
- );
5449
+ const {
5450
+ currentSessionId,
5451
+ messages: messages2,
5452
+ previousChatMessages,
5453
+ sendMessage,
5454
+ refreshSession,
5455
+ displayExecution
5456
+ } = useChatState(props.isReadOnly);
5457
+ const { workflow, execution, hasChat, latestNodeNameById, resetExecutionData } = useExecutionData();
5346
5458
  const manualLogEntrySelection = ref({ type: "initial" });
5347
- const autoSelectedLogEntry = computed(
5348
- () => findLogEntryToAutoSelect(
5349
- executionTree.value,
5350
- workflowsStore.nodesByName,
5351
- workflowsStore.workflowExecutionData?.data?.resultData.runData ?? {}
5352
- )
5353
- );
5354
5459
  const selectedLogEntry = computed(
5355
- () => manualLogEntrySelection.value.type === "initial" || manualLogEntrySelection.value.workflowId !== workflowsStore.workflow.id ? autoSelectedLogEntry.value : manualLogEntrySelection.value.type === "none" ? void 0 : manualLogEntrySelection.value.data
5460
+ () => findSelectedLogEntry(manualLogEntrySelection.value, execution.value)
5356
5461
  );
5357
- const isLogDetailsOpen = computed(
5358
- () => selectedLogEntry.value !== void 0 && !isCollapsingDetailsPanel.value
5462
+ const isLogDetailsOpen = computed(() => isOpen.value && selectedLogEntry.value !== void 0);
5463
+ const isLogDetailsVisuallyOpen = computed(
5464
+ () => isLogDetailsOpen.value && !isCollapsingDetailsPanel.value
5359
5465
  );
5360
- const isLogDetailsOpenOrCollapsing = computed(() => selectedLogEntry.value !== void 0);
5361
5466
  const logsPanelActionsProps = computed(() => ({
5362
5467
  isOpen: isOpen.value,
5363
5468
  showToggleButton: !isPoppedOut.value,
@@ -5366,7 +5471,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5366
5471
  onToggleOpen
5367
5472
  }));
5368
5473
  function handleSelectLogEntry(selected2) {
5369
- manualLogEntrySelection.value = selected2 === void 0 ? { type: "none", workflowId: workflowsStore.workflow.id } : { type: "selected", workflowId: workflowsStore.workflow.id, data: selected2 };
5474
+ const workflowId = execution.value?.workflowData.id;
5475
+ if (!workflowId) {
5476
+ return;
5477
+ }
5478
+ manualLogEntrySelection.value = selected2 === void 0 ? { type: "none", workflowId } : { type: "selected", workflowId, data: selected2 };
5370
5479
  }
5371
5480
  function handleResizeOverviewPanelEnd() {
5372
5481
  if (isOverviewPanelFullWidth.value) {
@@ -5400,7 +5509,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5400
5509
  class: normalizeClass([_ctx.$style.container, "ignore-key-press-canvas"]),
5401
5510
  tabindex: "0"
5402
5511
  }, [
5403
- hasChat.value ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5512
+ unref(hasChat) && (!props.isReadOnly || unref(messages2).length > 0) ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5404
5513
  key: 0,
5405
5514
  "supported-directions": ["right"],
5406
5515
  "is-resizing-enabled": unref(isOpen),
@@ -5418,7 +5527,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5418
5527
  "is-read-only": _ctx.isReadOnly,
5419
5528
  messages: unref(messages2),
5420
5529
  "session-id": unref(currentSessionId),
5421
- "past-chat-messages": previousChatMessages.value,
5530
+ "past-chat-messages": unref(previousChatMessages),
5422
5531
  "show-close-button": false,
5423
5532
  "is-new-logs-enabled": true,
5424
5533
  onClose: unref(onToggleOpen),
@@ -5438,45 +5547,52 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5438
5547
  createVNode(unref(N8nResizeWrapper), {
5439
5548
  class: normalizeClass(_ctx.$style.overviewResizer),
5440
5549
  width: unref(overviewPanelWidth),
5441
- style: normalizeStyle({ width: isLogDetailsOpen.value ? `${unref(overviewPanelWidth)}px` : "" }),
5550
+ style: normalizeStyle({ width: isLogDetailsVisuallyOpen.value ? `${unref(overviewPanelWidth)}px` : "" }),
5442
5551
  "supported-directions": ["right"],
5443
- "is-resizing-enabled": isLogDetailsOpenOrCollapsing.value,
5552
+ "is-resizing-enabled": isLogDetailsOpen.value,
5444
5553
  window: unref(pipWindow),
5445
5554
  onResize: unref(onOverviewPanelResize),
5446
5555
  onResizeend: handleResizeOverviewPanelEnd
5447
5556
  }, {
5448
5557
  default: withCtx(() => [
5449
- createVNode(LogsOverviewPanel, {
5558
+ (openBlock(), createBlock(LogsOverviewPanel, {
5559
+ key: unref(execution)?.id ?? "",
5450
5560
  class: normalizeClass(_ctx.$style.logsOverview),
5451
5561
  "is-open": unref(isOpen),
5452
5562
  "is-read-only": _ctx.isReadOnly,
5453
- "is-compact": isLogDetailsOpen.value,
5563
+ "is-compact": isLogDetailsVisuallyOpen.value,
5454
5564
  selected: selectedLogEntry.value,
5455
- "execution-tree": executionTree.value,
5565
+ execution: unref(execution),
5566
+ "scroll-to-selection": manualLogEntrySelection.value.type !== "selected" || manualLogEntrySelection.value.data.id !== selectedLogEntry.value?.id,
5567
+ "latest-node-info": unref(latestNodeNameById),
5456
5568
  onClickHeader: _cache[1] || (_cache[1] = ($event) => unref(onToggleOpen)(true)),
5457
- onSelect: handleSelectLogEntry
5569
+ onSelect: handleSelectLogEntry,
5570
+ onClearExecutionData: unref(resetExecutionData)
5458
5571
  }, {
5459
5572
  actions: withCtx(() => [
5460
- !isLogDetailsOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5573
+ !isLogDetailsVisuallyOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5461
5574
  ]),
5462
5575
  _: 1
5463
- }, 8, ["class", "is-open", "is-read-only", "is-compact", "selected", "execution-tree"])
5576
+ }, 8, ["class", "is-open", "is-read-only", "is-compact", "selected", "execution", "scroll-to-selection", "latest-node-info", "onClearExecutionData"]))
5464
5577
  ]),
5465
5578
  _: 1
5466
5579
  }, 8, ["class", "width", "style", "is-resizing-enabled", "window", "onResize"]),
5467
- isLogDetailsOpenOrCollapsing.value && selectedLogEntry.value ? (openBlock(), createBlock(LogsDetailsPanel, {
5580
+ isLogDetailsVisuallyOpen.value && selectedLogEntry.value && unref(workflow) && unref(execution) ? (openBlock(), createBlock(LogsDetailsPanel, {
5468
5581
  key: 0,
5469
5582
  class: normalizeClass(_ctx.$style.logDetails),
5470
5583
  "is-open": unref(isOpen),
5471
5584
  "log-entry": selectedLogEntry.value,
5585
+ workflow: unref(workflow),
5586
+ execution: unref(execution),
5472
5587
  window: unref(pipWindow),
5588
+ "latest-info": unref(latestNodeNameById)[selectedLogEntry.value.node.id],
5473
5589
  onClickHeader: _cache[2] || (_cache[2] = ($event) => unref(onToggleOpen)(true))
5474
5590
  }, {
5475
5591
  actions: withCtx(() => [
5476
- isLogDetailsOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5592
+ isLogDetailsVisuallyOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5477
5593
  ]),
5478
5594
  _: 1
5479
- }, 8, ["class", "is-open", "log-entry", "window"])) : createCommentVNode("", true)
5595
+ }, 8, ["class", "is-open", "log-entry", "workflow", "execution", "window", "latest-info"])) : createCommentVNode("", true)
5480
5596
  ], 2)
5481
5597
  ], 2)
5482
5598
  ]),