n8n-editor-ui 1.90.1 → 1.92.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/assets/{AnimatedSpinner-ChThynSJ.js → AnimatedSpinner-CtKKeDrz.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-DR6h_xsK.js} +1 -1
  3. package/dist/assets/{AuthView-Dlhn_SQ-.js → AuthView-mKkzBRxh.js} +2 -2
  4. package/dist/assets/{CanvasChatSwitch-BuBg7TJP.js → CanvasChatSwitch-Bu2VD2kp.js} +24 -12
  5. package/dist/assets/{ChangePasswordView-BKYXOoDf.js → ChangePasswordView-D5UI1v-J.js} +3 -3
  6. package/dist/assets/CollectionParameter-BeCTpZ-q.js +4 -0
  7. package/dist/assets/{CredentialsView-BNWIgrLb.js → CredentialsView-B78eNJO5.js} +10 -9
  8. package/dist/assets/{DemoFooter-DR6r_2qR.js → DemoFooter-DP26HpCu.js} +8 -8
  9. package/dist/assets/{ErrorView-Bu8Mt5FH.js → ErrorView-C3fvEdCg.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-BBpwYdHY.js} +2 -2
  11. package/dist/assets/{ExecutionsView-C0WZAIi0.js → ExecutionsView-BvlDZwIs.js} +11 -10
  12. package/dist/assets/{FileSaver.min-Cm0u4qyc.js → FileSaver.min-BzAtcQXX.js} +1 -1
  13. package/dist/assets/{FixedCollectionParameter-KmRZtBiP.js → FixedCollectionParameter-CS5zXMAh.js} +1 -1
  14. package/dist/assets/{ForgotMyPasswordView-GH7SqEFu.js → ForgotMyPasswordView-CVQ7pcIG.js} +3 -3
  15. package/dist/assets/{InsightsChartAverageRuntime-SeBUN06R.js → InsightsChartAverageRuntime-Boh0SMb3.js} +7 -6
  16. package/dist/assets/{InsightsChartFailed-TYjH8LwV.js → InsightsChartFailed-IZ-KYOU9.js} +7 -6
  17. package/dist/assets/{InsightsChartFailureRate-D41Jv-6v.js → InsightsChartFailureRate-2fWw3p0L.js} +7 -6
  18. package/dist/assets/{InsightsChartTimeSaved-TLPDAmPx.js → InsightsChartTimeSaved-B2pLVys1.js} +7 -6
  19. package/dist/assets/{InsightsChartTotal-CaKTe2mv.js → InsightsChartTotal-2QD4wPLR.js} +7 -6
  20. package/dist/assets/{InsightsDashboard-DPVczYm3.css → InsightsDashboard-Bx4vx9gz.css} +16 -0
  21. package/dist/assets/InsightsDashboard-CbiFbJ8w.js +372 -0
  22. package/dist/assets/{InsightsPaywall-Z4Y0nO-i.js → InsightsPaywall-5d-cSdiS.js} +1 -1
  23. package/dist/assets/{InsightsSummary-FixbpmPJ.css → InsightsSummary-CdlaUpAt.css} +25 -25
  24. package/dist/assets/{InsightsSummary-DzYli0Pu.js → InsightsSummary-gldDQ9rg.js} +16 -17
  25. package/dist/assets/{InsightsTableWorkflows-CUHAG57c.js → InsightsTableWorkflows-_eTCUNCX.js} +2 -2
  26. package/dist/assets/{Logo-Dxp4M9dy.js → Logo-Dl2xVRIu.js} +1 -1
  27. package/dist/assets/{LogsPanel-zIrTNE6j.js → LogsPanel-JnYirDqa.js} +520 -436
  28. package/dist/assets/{LogsPanel-DmPMCt9w.css → LogsPanel-mTaFEGk_.css} +208 -98
  29. package/dist/assets/{MainHeader-D4cIIoUA.js → MainHeader-Bk29pgmL.js} +122 -295
  30. package/dist/assets/MainHeader-CEPLiR-5.css +1044 -0
  31. package/dist/assets/{MainSidebar-BtW-9UPT.js → MainSidebar-BM5ku_wM.js} +11 -11
  32. package/dist/assets/{MainSidebar-CKMiDGvH.css → MainSidebar-zZpP3qQ0.css} +13 -12
  33. package/dist/assets/{NodeCreation-thD32mA1.js → NodeCreation-BEjdAYc_.js} +4 -4
  34. package/dist/assets/{NodeCreator-B4mHaU45.js → NodeCreator-cEUgbAI9.js} +14 -4
  35. package/dist/assets/{NodeDetailsView-cO3Ci9jH.js → NodeDetailsView-D4O9dKTA.js} +93 -68
  36. package/dist/assets/{NodeDetailsView-CGgV4Pn_.css → NodeDetailsView-DsFLtbxi.css} +20 -20
  37. package/dist/assets/{NodeView-E5b1ClVD.js → NodeView-DDSOUm8E.js} +152 -34
  38. package/dist/assets/{ProjectCardBadge-LnLKqSK-.js → ProjectCardBadge-BNn2hiMe.js} +1 -1
  39. package/dist/assets/{ProjectHeader-DC02ZuZ0.js → ProjectHeader-CaEZ2OPj.js} +1 -1
  40. package/dist/assets/{ProjectSettings-Zr1UOp7s.js → ProjectSettings-otA8E-yW.js} +2 -2
  41. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-CM7WIpD3.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-C3JbZMCk.js} +1 -1
  42. package/dist/assets/{ResourcesListLayout-DTsuHdYx.js → ResourcesListLayout-1d9Ic6VX.js} +2 -2
  43. package/dist/assets/{ResourcesListLayout-CglK2dXR.css → ResourcesListLayout-CtGME7aU.css} +8 -8
  44. package/dist/assets/{RunData-DepHcD2K.css → RunData-BjlZgIyx.css} +102 -73
  45. package/dist/assets/{RunData-Ds-U68nr.js → RunData-Bx47sNQp.js} +690 -398
  46. package/dist/assets/{RunDataAi-BF2gZZGr.css → RunDataAi-D9VLFXIf.css} +10 -51
  47. package/dist/assets/{RunDataAi-DdK11EHU.js → RunDataAi-DOac7nwD.js} +27 -310
  48. package/dist/assets/{RunDataJson-Txw0lqay.css → RunDataJson-BH9HLoGC.css} +12 -8
  49. package/dist/assets/{RunDataJson-B2WU5od1.js → RunDataJson-Pev6yNEV.js} +20 -14
  50. package/dist/assets/{RunDataJsonActions-DqZ2X1yJ.js → RunDataJsonActions-Co4xgmVq.js} +1 -1
  51. package/dist/assets/RunDataParsedAiContent-9EEUzCKp.css +176 -0
  52. package/dist/assets/RunDataParsedAiContent-D6MNLmT3.js +148 -0
  53. package/dist/assets/{RunDataSearch-CQsyZvGK.js → RunDataSearch-C8orcAlP.js} +1 -1
  54. package/dist/assets/{RunDataTable-DyUvXWfl.css → RunDataTable-CUxj7dHx.css} +47 -39
  55. package/dist/assets/{RunDataTable-BO0R4JT_.js → RunDataTable-oi_l8dhA.js} +41 -30
  56. package/dist/assets/{SamlOnboarding-CmwMX5y2.js → SamlOnboarding-CT5J6dx0.js} +3 -3
  57. package/dist/assets/{SettingsApiView-D6uBbi9-.js → SettingsApiView-CupjcI9v.js} +1 -1
  58. package/dist/assets/{SettingsCommunityNodesView-CJODtx_K.js → SettingsCommunityNodesView-B5K2VLyJ.js} +4 -4
  59. package/dist/assets/{SettingsExternalSecrets-CVk14P_P.js → SettingsExternalSecrets-BidJCf_t.js} +1 -1
  60. package/dist/assets/{SettingsLdapView-pg71FErj.js → SettingsLdapView-Cva6akhW.js} +1 -1
  61. package/dist/assets/{SettingsLogStreamingView-DUOI3Xb9.js → SettingsLogStreamingView-Cy-rAKUO.js} +1 -1
  62. package/dist/assets/{SettingsPersonalView-BFnOmBPC.js → SettingsPersonalView-ZJ1Syok2.js} +14 -13
  63. package/dist/assets/{SettingsSourceControl-BUNmxcvB.js → SettingsSourceControl-CMtqqlkO.js} +1 -1
  64. package/dist/assets/{SettingsSso-Dx8Qw_2Z.js → SettingsSso-Bi3OpykL.js} +1 -1
  65. package/dist/assets/{SettingsUsageAndPlan-DTk86tXU.js → SettingsUsageAndPlan-C5TbwZhP.js} +1 -1
  66. package/dist/assets/{SettingsUsersView-BviXcl30.js → SettingsUsersView-BHuP5k0A.js} +1 -1
  67. package/dist/assets/{SettingsView-fzPdUijx.js → SettingsView-DPIIqaKN.js} +1 -1
  68. package/dist/assets/{SetupView-DUTx1JXK.js → SetupView-C4V9j6sh.js} +3 -3
  69. package/dist/assets/{SetupWorkflowCredentialsButton-fApxCGHh.js → SetupWorkflowCredentialsButton-BZ9ILQUp.js} +1 -1
  70. package/dist/assets/{SetupWorkflowFromTemplateView-C5t9fEKF.js → SetupWorkflowFromTemplateView-3uV3zSU2.js} +3 -3
  71. package/dist/assets/{SigninView-BRVoXQRW.js → SigninView-DWZHdCjG.js} +3 -3
  72. package/dist/assets/{SignoutView-Duh6wb4Y.js → SignoutView-DbduXAir.js} +1 -1
  73. package/dist/assets/{SignupView-DMkpTtjs.js → SignupView-DWq6VACk.js} +3 -3
  74. package/dist/assets/{TemplateDetails-Df9_jph6.js → TemplateDetails-BckqE6GK.js} +1 -1
  75. package/dist/assets/{TemplateList-qSnJvw0K.js → TemplateList-Bw0JeBMP.js} +1 -1
  76. package/dist/assets/{TemplatesCollectionView--ccYXaCo.js → TemplatesCollectionView-CAKT-mpV.js} +5 -5
  77. package/dist/assets/{TemplatesSearchView-D1YgHKld.js → TemplatesSearchView-I2a5us58.js} +3 -3
  78. package/dist/assets/{TemplatesView-B9CwObHN.js → TemplatesView-6EwGFFJK.js} +1 -1
  79. package/dist/assets/{TemplatesWorkflowView-DtLpUF59.js → TemplatesWorkflowView-C8xYMhwu.js} +5 -5
  80. package/dist/assets/{TestDefinitionEditView-DFcBlKnN.js → TestDefinitionEditView-CNd3Cuzq.js} +8 -8
  81. package/dist/assets/{TestDefinitionListView-C_mbolTO.js → TestDefinitionListView-BwTWIaAM.js} +1 -1
  82. package/dist/assets/{TestDefinitionNewView-CvyM6TLE.js → TestDefinitionNewView-BQas0_G1.js} +2 -2
  83. package/dist/assets/{TestDefinitionRootView-BXzJY0cY.js → TestDefinitionRootView-D971MFye.js} +1 -1
  84. package/dist/assets/{VariablesView-BHFJj5IU.js → VariablesView-DcBBuFxh.js} +3 -3
  85. package/dist/assets/{WorkerView-CgIksFjP.js → WorkerView-DSgBNIeb.js} +6 -6
  86. package/dist/assets/WorkflowActivator-CPCbgb_n.js +776 -0
  87. package/dist/assets/{MainHeader-CWA2JfVJ.css → WorkflowActivator-DAyH7N29.css} +74 -434
  88. package/dist/assets/{WorkflowExecutionsInfoAccordion-BcBLZ_Ul.js → WorkflowExecutionsInfoAccordion-Bc6vzAZu.js} +1 -1
  89. package/dist/assets/{WorkflowExecutionsLandingPage-B9ByHnbR.js → WorkflowExecutionsLandingPage-BPPS4V9i.js} +2 -2
  90. package/dist/assets/{WorkflowExecutionsPreview-DCE7TYLh.js → WorkflowExecutionsPreview-Bbb5MB8Z.js} +6 -6
  91. package/dist/assets/{WorkflowExecutionsView-DFoBpdS7.js → WorkflowExecutionsView-Pz-7iHJY.js} +11 -9
  92. package/dist/assets/{WorkflowHistory-DolmPUM2.js → WorkflowHistory-Czo9IuI6.js} +4 -4
  93. package/dist/assets/{WorkflowOnboardingView-DQW48M8_.js → WorkflowOnboardingView-B8DdkfJ5.js} +1 -1
  94. package/dist/assets/{WorkflowPreview-BFR6V9SO.js → WorkflowPreview-eVlO1itk.js} +1 -1
  95. package/dist/assets/{WorkflowsView-CsM69PSv.css → WorkflowsView-B2_HJCJ5.css} +28 -162
  96. package/dist/assets/{WorkflowsView-B-feKuLZ.js → WorkflowsView-Cr2D0vym.js} +124 -217
  97. package/dist/assets/{chartjs.utils-BcXTJ2Te.js → chartjs.utils-Dk1WO3Mr.js} +2 -2
  98. package/dist/assets/{dateFormatter-CZI1kGYK.js → dateFormatter-C8N5khiG.js} +5 -5
  99. package/dist/assets/{easyAiWorkflowUtils-ChToD_Yl.js → easyAiWorkflowUtils-CLqHnasO.js} +1 -1
  100. package/dist/assets/{global-link-actions-OGaZVwsw.js → global-link-actions-BvoZh8u9.js} +1 -1
  101. package/dist/assets/{import-curl-CAszzwx1.js → import-curl-BpxkGYMX.js} +1 -1
  102. package/dist/assets/{index-BpdkKRP4.js → index-B6eunbxp.js} +14227 -11881
  103. package/dist/assets/{index-7WdERzqm.js → index-Br8T1Gn6.js} +1 -1
  104. package/dist/assets/{index-C5OXOcIJ.css → index-DCpy4nCU.css} +6147 -4061
  105. package/dist/assets/{pickBy-mYqFOFbh.js → pickBy-8Urz9lDY.js} +1 -1
  106. package/dist/assets/{templateActions-BX9arLbc.js → templateActions-DzjysjbQ.js} +1 -1
  107. package/dist/assets/{useBeforeUnload-K7nQ15Rk.js → useBeforeUnload-DxrN8vOO.js} +1 -1
  108. package/dist/assets/{useCanvasMapping-D_UPCxYX.js → useCanvasMapping-C2BQB9QB.js} +270 -112
  109. package/dist/assets/{useCanvasMapping-C--wac6H.css → useCanvasMapping-cuXLM-h-.css} +185 -4
  110. package/dist/assets/{useCanvasOperations-D6VFiC3b.js → useCanvasOperations-DaP5jKbH.js} +4 -3
  111. package/dist/assets/{useClearExecutionButtonVisible-D_0O6f0X.js → useClearExecutionButtonVisible-BV-jMf2m.js} +2 -2
  112. package/dist/assets/{useExecutionDebugging-BNMaKOh7.js → useExecutionDebugging-0pPCimcw.js} +1 -1
  113. package/dist/assets/{useExecutionHelpers-DN5HqPqY.js → useExecutionHelpers-DIvhViMz.js} +2 -2
  114. package/dist/assets/{useImportCurlCommand-BSL596XF.js → useImportCurlCommand-BWf4R83s.js} +19 -10
  115. package/dist/assets/usePushConnection-Pobjq0U9.js +632 -0
  116. package/dist/assets/{useTestDefinitionForm-CIhrxyve.js → useTestDefinitionForm-BA3IS_2B.js} +1 -1
  117. package/dist/assets/{useWorkflowActivate-pZ62ib_C.js → useWorkflowActivate-DFqvrpj6.js} +1 -1
  118. package/dist/assets/useWorkflowSaving-BACesUoL.js +66 -0
  119. package/dist/index.html +2 -2
  120. package/package.json +1 -1
  121. package/vite.config.mts +15 -1
  122. package/dist/assets/CollectionParameter-CQXiWluX.js +0 -4
  123. package/dist/assets/InsightsDashboard-o3JS9fjz.js +0 -178
  124. package/dist/assets/WorkflowActivator-BX59FxTZ.css +0 -260
  125. package/dist/assets/WorkflowActivator-O6i5XAk2.js +0 -231
  126. package/dist/assets/usePushConnection-BdV7ILvK.js +0 -535
@@ -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, 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, $ as useCanvasStore, bK as Workflow, bL as IN_PROGRESS_EXECUTION_ID, bM as useThrottleFn } from "./index-B6eunbxp.js";
2
+ import { u as useClearExecutionButtonVisible } from "./useClearExecutionButtonVisible-BV-jMf2m.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-Bx47sNQp.js";
4
+ import { t as toTime, a as toDayMonth } from "./dateFormatter-C8N5khiG.js";
5
+ import { u as upperFirst } from "./useCanvasOperations-DaP5jKbH.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: {},
@@ -3396,6 +3396,17 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3396
3396
  type: "success"
3397
3397
  });
3398
3398
  }
3399
+ watch(
3400
+ () => props.isOpen,
3401
+ (isOpen) => {
3402
+ if (isOpen) {
3403
+ setTimeout(() => {
3404
+ chatEventBus.emit("focusInput");
3405
+ }, 0);
3406
+ }
3407
+ },
3408
+ { immediate: true }
3409
+ );
3399
3410
  return (_ctx, _cache) => {
3400
3411
  return openBlock(), createElementBlock("div", {
3401
3412
  class: normalizeClass(_ctx.$style.chat),
@@ -3435,7 +3446,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3435
3446
  content: unref(locale).baseText("chat.window.session.resetSession")
3436
3447
  }, {
3437
3448
  default: withCtx(() => [
3438
- createVNode(unref(_sfc_main$h), {
3449
+ createVNode(unref(_sfc_main$i), {
3439
3450
  class: normalizeClass(_ctx.$style.newHeaderButton),
3440
3451
  "data-test-id": "refresh-session-button",
3441
3452
  outline: "",
@@ -3475,7 +3486,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3475
3486
  ]),
3476
3487
  _: 1
3477
3488
  }),
3478
- createVNode(unref(_sfc_main$h), {
3489
+ createVNode(unref(_sfc_main$i), {
3479
3490
  class: normalizeClass(_ctx.$style.headerButton),
3480
3491
  "data-test-id": "refresh-session-button",
3481
3492
  outline: "",
@@ -3485,7 +3496,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3485
3496
  title: unref(locale).baseText("chat.window.session.reset"),
3486
3497
  onClick: onRefreshSession
3487
3498
  }, null, 8, ["class", "title"]),
3488
- _ctx.showCloseButton ? (openBlock(), createBlock(unref(_sfc_main$h), {
3499
+ _ctx.showCloseButton ? (openBlock(), createBlock(unref(_sfc_main$i), {
3489
3500
  key: 0,
3490
3501
  class: normalizeClass(_ctx.$style.headerButton),
3491
3502
  outline: "",
@@ -3500,7 +3511,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3500
3511
  key: 2,
3501
3512
  class: normalizeClass(_ctx.$style.chatBody)
3502
3513
  }, [
3503
- createVNode(_sfc_main$c, {
3514
+ createVNode(_sfc_main$d, {
3504
3515
  messages: _ctx.messages,
3505
3516
  class: normalizeClass(_ctx.$style.messages),
3506
3517
  "empty-text": _ctx.isNewLogsEnabled ? unref(locale).baseText("chat.window.chat.emptyChatMessage.v2") : void 0
@@ -3516,7 +3527,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3516
3527
  createBaseVNode("a", {
3517
3528
  href: "#",
3518
3529
  onClick: ($event) => emit("displayExecution", message.id)
3519
- }, toDisplayString(message.id), 9, _hoisted_1)
3530
+ }, toDisplayString(message.id), 9, _hoisted_1$2)
3520
3531
  ]),
3521
3532
  _: 2
3522
3533
  }, 1024)) : createCommentVNode("", true),
@@ -3592,7 +3603,7 @@ const newHeaderButton = "_newHeaderButton_1r0jy_188";
3592
3603
  const chatBody = "_chatBody_1r0jy_193";
3593
3604
  const messages = "_messages_1r0jy_202";
3594
3605
  const messagesInput = "_messagesInput_1r0jy_213";
3595
- const style0$7 = {
3606
+ const style0$8 = {
3596
3607
  chat: chat$1,
3597
3608
  chatHeader,
3598
3609
  chatTitle,
@@ -3605,10 +3616,10 @@ const style0$7 = {
3605
3616
  messages,
3606
3617
  messagesInput
3607
3618
  };
3608
- const cssModules$7 = {
3609
- "$style": style0$7
3619
+ const cssModules$8 = {
3620
+ "$style": style0$8
3610
3621
  };
3611
- const ChatMessagesPanel = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__cssModules", cssModules$7]]);
3622
+ const ChatMessagesPanel = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__cssModules", cssModules$8]]);
3612
3623
  const LOCAL_STORAGE_PANEL_HEIGHT = "N8N_CANVAS_CHAT_HEIGHT";
3613
3624
  const LOCAL_STORAGE_PANEL_WIDTH = "N8N_CANVAS_CHAT_WIDTH";
3614
3625
  const LOCAL_STORAGE_OVERVIEW_PANEL_WIDTH = "N8N_LOGS_OVERVIEW_PANEL_WIDTH";
@@ -3983,16 +3994,9 @@ function useChatMessaging({
3983
3994
  sendMessage
3984
3995
  };
3985
3996
  }
3986
- function useChatTrigger({
3987
- getNodeByName,
3988
- getNodeType,
3989
- canvasNodes,
3990
- workflow
3991
- }) {
3992
- const chatTriggerName = ref(null);
3993
- const connectedNode = ref(null);
3997
+ function useChatTrigger({ getNodeByName, getNodeType, workflow }) {
3994
3998
  const chatTriggerNode = computed(
3995
- () => chatTriggerName.value ? getNodeByName(chatTriggerName.value) : null
3999
+ () => Object.values(workflow.value.nodes).find(isChatNode) ?? null
3996
4000
  );
3997
4001
  const allowFileUploads = computed(() => {
3998
4002
  return chatTriggerNode.value?.parameters?.options?.allowFileUploads === true;
@@ -4000,17 +4004,10 @@ function useChatTrigger({
4000
4004
  const allowedFilesMimeTypes = computed(() => {
4001
4005
  return chatTriggerNode.value?.parameters?.options?.allowedFilesMimeTypes?.toString() ?? "";
4002
4006
  });
4003
- function setChatTriggerNode() {
4004
- const triggerNode = unref(canvasNodes).find(isChatNode);
4005
- if (!triggerNode) {
4006
- return;
4007
- }
4008
- chatTriggerName.value = triggerNode.name;
4009
- }
4010
- function setConnectedNode() {
4007
+ const connectedNode = computed(() => {
4011
4008
  const triggerNode = chatTriggerNode.value;
4012
4009
  if (!triggerNode) {
4013
- return;
4010
+ return null;
4014
4011
  }
4015
4012
  const chatChildren = workflow.value.getChildNodes(triggerNode.name);
4016
4013
  const chatRootNode = chatChildren.reverse().map((nodeName) => getNodeByName(nodeName)).filter((n) => n !== null).reverse().find((storeNode) => {
@@ -4037,41 +4034,29 @@ function useChatTrigger({
4037
4034
  const result = Boolean(isChatChild && (isAgent || isChain || isCustomChainOrAgent));
4038
4035
  return result;
4039
4036
  });
4040
- connectedNode.value = chatRootNode ?? null;
4041
- }
4037
+ return chatRootNode ?? null;
4038
+ });
4042
4039
  return {
4043
4040
  allowFileUploads,
4044
4041
  allowedFilesMimeTypes,
4045
4042
  chatTriggerNode,
4046
- connectedNode: computed(() => connectedNode.value),
4047
- setChatTriggerNode,
4048
- setConnectedNode
4043
+ connectedNode
4049
4044
  };
4050
4045
  }
4051
- function useChatState(isReadOnly, onWindowResize) {
4046
+ function useChatState(isReadOnly) {
4052
4047
  const locale = useI18n$1();
4053
4048
  const workflowsStore = useWorkflowsStore();
4054
4049
  const nodeTypesStore = useNodeTypesStore();
4055
- const canvasStore = useCanvasStore();
4056
4050
  const router = useRouter();
4057
4051
  const nodeHelpers = useNodeHelpers();
4058
4052
  const { runWorkflow } = useRunWorkflow({ router });
4059
4053
  const messages2 = ref([]);
4060
4054
  const currentSessionId = ref(v4().replace(/-/g, ""));
4061
- const canvasNodes = computed(() => workflowsStore.allNodes);
4062
- const allConnections = computed(() => workflowsStore.allConnections);
4055
+ const previousChatMessages = computed(() => workflowsStore.getPastChatMessages);
4063
4056
  const logsPanelState = computed(() => workflowsStore.logsPanelState);
4064
4057
  const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4065
- const {
4066
- chatTriggerNode,
4067
- connectedNode,
4068
- allowFileUploads,
4069
- allowedFilesMimeTypes,
4070
- setChatTriggerNode,
4071
- setConnectedNode
4072
- } = useChatTrigger({
4058
+ const { chatTriggerNode, connectedNode, allowFileUploads, allowedFilesMimeTypes } = useChatTrigger({
4073
4059
  workflow,
4074
- canvasNodes,
4075
4060
  getNodeByName: workflowsStore.getNodeByName,
4076
4061
  getNodeType: nodeTypesStore.getNodeType
4077
4062
  });
@@ -4127,33 +4112,6 @@ function useChatState(isReadOnly, onWindowResize) {
4127
4112
  );
4128
4113
  provide(ChatSymbol, chatConfig);
4129
4114
  provide(ChatOptionsSymbol, chatOptions);
4130
- watch(
4131
- () => logsPanelState.value,
4132
- (state) => {
4133
- if (state !== LOGS_PANEL_STATE.CLOSED) {
4134
- setChatTriggerNode();
4135
- setConnectedNode();
4136
- setTimeout(() => {
4137
- onWindowResize?.();
4138
- chatEventBus.emit("focusInput");
4139
- }, 0);
4140
- }
4141
- },
4142
- { immediate: true }
4143
- );
4144
- watch(
4145
- () => allConnections.value,
4146
- () => {
4147
- if (canvasStore.isLoading) return;
4148
- setTimeout(() => {
4149
- if (!chatTriggerNode.value) {
4150
- setChatTriggerNode();
4151
- }
4152
- setConnectedNode();
4153
- }, 0);
4154
- },
4155
- { deep: true }
4156
- );
4157
4115
  async function createExecutionPromise() {
4158
4116
  return await new Promise((resolve) => {
4159
4117
  const resolveIfFinished = (isRunning) => {
@@ -4189,6 +4147,9 @@ function useChatState(isReadOnly, onWindowResize) {
4189
4147
  nodeHelpers.updateNodesExecutionIssues();
4190
4148
  messages2.value = [];
4191
4149
  currentSessionId.value = v4().replace(/-/g, "");
4150
+ if (logsPanelState.value !== LOGS_PANEL_STATE.CLOSED) {
4151
+ chatEventBus.emit("focusInput");
4152
+ }
4192
4153
  }
4193
4154
  function displayExecution(executionId) {
4194
4155
  const route = router.resolve({
@@ -4200,6 +4161,7 @@ function useChatState(isReadOnly, onWindowResize) {
4200
4161
  return {
4201
4162
  currentSessionId,
4202
4163
  messages: computed(() => isReadOnly ? restoredChatMessages.value : messages2.value),
4164
+ previousChatMessages,
4203
4165
  chatTriggerNode,
4204
4166
  connectedNode,
4205
4167
  sendMessage,
@@ -4207,7 +4169,7 @@ function useChatState(isReadOnly, onWindowResize) {
4207
4169
  displayExecution
4208
4170
  };
4209
4171
  }
4210
- const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4172
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
4211
4173
  __name: "ConsumedTokenCountText",
4212
4174
  props: {
4213
4175
  consumedTokens: {}
@@ -4215,7 +4177,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4215
4177
  setup(__props) {
4216
4178
  const locale = useI18n$1();
4217
4179
  return (_ctx, _cache) => {
4218
- const _component_ConsumedTokensDetails = _sfc_main$i;
4180
+ const _component_ConsumedTokensDetails = _sfc_main$j;
4219
4181
  return _ctx.consumedTokens !== void 0 ? (openBlock(), createBlock(unref(N8nTooltip), {
4220
4182
  key: 0,
4221
4183
  enterable: false
@@ -4235,36 +4197,67 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4235
4197
  };
4236
4198
  }
4237
4199
  });
4200
+ const _hoisted_1$1 = { key: 0 };
4201
+ const _hoisted_2 = { key: 1 };
4202
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4203
+ __name: "NodeName",
4204
+ props: {
4205
+ name: {},
4206
+ latestName: {},
4207
+ isError: { type: Boolean },
4208
+ isDeleted: { type: Boolean }
4209
+ },
4210
+ setup(__props) {
4211
+ return (_ctx, _cache) => {
4212
+ return openBlock(), createBlock(unref(N8nText), {
4213
+ tag: "div",
4214
+ bold: true,
4215
+ size: "small",
4216
+ class: normalizeClass(_ctx.$style.name),
4217
+ color: _ctx.isError ? "danger" : void 0
4218
+ }, {
4219
+ default: withCtx(() => [
4220
+ _ctx.isDeleted || _ctx.name !== _ctx.latestName ? (openBlock(), createElementBlock("del", _hoisted_1$1, toDisplayString(_ctx.name), 1)) : createCommentVNode("", true),
4221
+ !_ctx.isDeleted ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(_ctx.latestName), 1)) : createCommentVNode("", true)
4222
+ ]),
4223
+ _: 1
4224
+ }, 8, ["class", "color"]);
4225
+ };
4226
+ }
4227
+ });
4228
+ const name$1 = "_name_1t0q3_123";
4229
+ const style0$7 = {
4230
+ name: name$1
4231
+ };
4232
+ const cssModules$7 = {
4233
+ "$style": style0$7
4234
+ };
4235
+ const NodeName = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__cssModules", cssModules$7]]);
4236
+ const _hoisted_1 = ["aria-expanded"];
4238
4237
  const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4239
4238
  __name: "LogsOverviewRow",
4240
4239
  props: {
4241
4240
  data: {},
4242
- node: {},
4243
4241
  isSelected: { type: Boolean },
4244
4242
  isReadOnly: { type: Boolean },
4245
4243
  shouldShowConsumedTokens: { type: Boolean },
4246
- isCompact: { type: Boolean }
4244
+ isCompact: { type: Boolean },
4245
+ latestInfo: {},
4246
+ expanded: { type: Boolean }
4247
4247
  },
4248
4248
  emits: ["toggleExpanded", "triggerPartialExecution", "openNdv"],
4249
4249
  setup(__props, { emit: __emit }) {
4250
4250
  const props = __props;
4251
4251
  const emit = __emit;
4252
4252
  const locale = useI18n$1();
4253
- const containerRef = useTemplateRef("containerRef");
4254
- const workflowsStore = useWorkflowsStore();
4255
4253
  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);
4254
+ const type = computed(() => nodeTypeStore.getNodeType(props.data.node.type));
4262
4255
  const isSettled = computed(
4263
- () => runData.value?.executionStatus && ["crashed", "error", "success"].includes(runData.value.executionStatus)
4256
+ () => props.data.runData.executionStatus && ["crashed", "error", "success"].includes(props.data.runData.executionStatus)
4264
4257
  );
4265
- const isError = computed(() => !!runData.value?.error);
4258
+ const isError = computed(() => !!props.data.runData.error);
4266
4259
  const startedAtText = computed(() => {
4267
- const time = new Date(runData.value?.startTime ?? 0);
4260
+ const time = new Date(props.data.runData.startTime);
4268
4261
  return locale.baseText("logs.overview.body.started", {
4269
4262
  interpolate: {
4270
4263
  time: `${toTime(time, true)}, ${toDayMonth(time)}`
@@ -4277,7 +4270,7 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4277
4270
  function isLastChild(level) {
4278
4271
  let parent = props.data.parent;
4279
4272
  let data = props.data;
4280
- for (let i = 0; i < depth.value - level; i++) {
4273
+ for (let i = 0; i < props.data.depth - level; i++) {
4281
4274
  data = parent;
4282
4275
  parent = parent?.parent;
4283
4276
  }
@@ -4285,21 +4278,12 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4285
4278
  const lastSibling = siblings[siblings.length - 1];
4286
4279
  return data === void 0 && lastSibling === void 0 || data?.node === lastSibling?.node && data?.runIndex === lastSibling?.runIndex;
4287
4280
  }
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
4281
  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,
4282
+ const _component_NodeIcon = _sfc_main$k;
4283
+ return openBlock(), createElementBlock("div", {
4284
+ role: "treeitem",
4285
+ tabindex: "0",
4286
+ "aria-expanded": props.data.children.length > 0 && props.expanded,
4303
4287
  class: normalizeClass({
4304
4288
  [_ctx.$style.container]: true,
4305
4289
  [_ctx.$style.compact]: props.isCompact,
@@ -4307,45 +4291,41 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4307
4291
  [_ctx.$style.selected]: props.isSelected
4308
4292
  })
4309
4293
  }, [
4310
- (openBlock(true), createElementBlock(Fragment, null, renderList(depth.value, (level) => {
4294
+ (openBlock(true), createElementBlock(Fragment, null, renderList(props.data.depth, (level) => {
4311
4295
  return openBlock(), createElementBlock("div", {
4312
4296
  key: level,
4313
4297
  class: normalizeClass({
4314
4298
  [_ctx.$style.indent]: true,
4315
- [_ctx.$style.connectorCurved]: level === depth.value,
4299
+ [_ctx.$style.connectorCurved]: level === props.data.depth,
4316
4300
  [_ctx.$style.connectorStraight]: !isLastChild(level)
4317
4301
  })
4318
4302
  }, null, 2);
4319
4303
  }), 128)),
4320
4304
  createBaseVNode("div", {
4321
4305
  class: normalizeClass(_ctx.$style.background),
4322
- style: normalizeStyle({ "--indent-depth": depth.value })
4306
+ style: normalizeStyle({ "--indent-depth": props.data.depth })
4323
4307
  }, null, 6),
4324
4308
  createVNode(_component_NodeIcon, {
4325
4309
  "node-type": type.value,
4326
4310
  size: 16,
4327
4311
  class: normalizeClass(_ctx.$style.icon)
4328
4312
  }, null, 8, ["node-type", "class"]),
4329
- createVNode(unref(N8nText), {
4330
- tag: "div",
4331
- bold: true,
4332
- size: "small",
4313
+ createVNode(NodeName, {
4333
4314
  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), {
4315
+ "latest-name": _ctx.latestInfo?.name ?? props.data.node.name,
4316
+ name: props.data.node.name,
4317
+ "is-error": isError.value,
4318
+ "is-deleted": _ctx.latestInfo?.deleted ?? false
4319
+ }, null, 8, ["class", "latest-name", "name", "is-error", "is-deleted"]),
4320
+ !_ctx.isCompact ? (openBlock(), createBlock(unref(N8nText), {
4321
+ key: 0,
4342
4322
  tag: "div",
4343
4323
  color: "text-light",
4344
4324
  size: "small",
4345
4325
  class: normalizeClass(_ctx.$style.timeTook)
4346
4326
  }, {
4347
4327
  default: withCtx(() => [
4348
- isSettled.value && runData.value ? (openBlock(), createBlock(unref(I18nT), {
4328
+ isSettled.value ? (openBlock(), createBlock(unref(I18nT), {
4349
4329
  key: 0,
4350
4330
  keypath: "logs.overview.body.summaryText"
4351
4331
  }, {
@@ -4361,24 +4341,25 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4361
4341
  icon: "exclamation-triangle",
4362
4342
  class: normalizeClass(_ctx.$style.errorIcon)
4363
4343
  }, null, 8, ["class"]),
4364
- createTextVNode(toDisplayString(unref(upperFirst)(runData.value.executionStatus)), 1)
4344
+ createTextVNode(toDisplayString(unref(upperFirst)(props.data.runData.executionStatus)), 1)
4365
4345
  ]),
4366
4346
  _: 1
4367
4347
  })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
4368
- createTextVNode(toDisplayString(unref(upperFirst)(runData.value.executionStatus)), 1)
4348
+ createTextVNode(toDisplayString(unref(upperFirst)(props.data.runData.executionStatus)), 1)
4369
4349
  ], 64))
4370
4350
  ]),
4371
4351
  time: withCtx(() => [
4372
- createTextVNode(toDisplayString(unref(locale).displayTimer(runData.value.executionTime, true)), 1)
4352
+ createTextVNode(toDisplayString(unref(locale).displayTimer(props.data.runData.executionTime, true)), 1)
4373
4353
  ]),
4374
4354
  _: 1
4375
4355
  })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
4376
- createTextVNode(toDisplayString(unref(upperFirst)(runData.value?.executionStatus)), 1)
4356
+ createTextVNode(toDisplayString(unref(upperFirst)(props.data.runData.executionStatus)), 1)
4377
4357
  ], 64))
4378
4358
  ]),
4379
4359
  _: 1
4380
- }, 8, ["class"]),
4381
- createVNode(unref(N8nText), {
4360
+ }, 8, ["class"])) : createCommentVNode("", true),
4361
+ !_ctx.isCompact ? (openBlock(), createBlock(unref(N8nText), {
4362
+ key: 1,
4382
4363
  tag: "div",
4383
4364
  color: "text-light",
4384
4365
  size: "small",
@@ -4388,16 +4369,16 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4388
4369
  createTextVNode(toDisplayString(startedAtText.value), 1)
4389
4370
  ]),
4390
4371
  _: 1
4391
- }, 8, ["class"]),
4392
- subtreeConsumedTokens.value !== void 0 ? (openBlock(), createBlock(unref(N8nText), {
4393
- key: 0,
4372
+ }, 8, ["class"])) : createCommentVNode("", true),
4373
+ !_ctx.isCompact && subtreeConsumedTokens.value !== void 0 ? (openBlock(), createBlock(unref(N8nText), {
4374
+ key: 2,
4394
4375
  tag: "div",
4395
4376
  color: "text-light",
4396
4377
  size: "small",
4397
4378
  class: normalizeClass(_ctx.$style.consumedTokens)
4398
4379
  }, {
4399
4380
  default: withCtx(() => [
4400
- subtreeConsumedTokens.value.totalTokens > 0 && (props.data.children.length === 0 || !props.node.expanded) ? (openBlock(), createBlock(_sfc_main$7, {
4381
+ subtreeConsumedTokens.value.totalTokens > 0 && (props.data.children.length === 0 || !props.expanded) ? (openBlock(), createBlock(_sfc_main$8, {
4401
4382
  key: 0,
4402
4383
  "consumed-tokens": subtreeConsumedTokens.value
4403
4384
  }, null, 8, ["consumed-tokens"])) : createCommentVNode("", true)
@@ -4405,33 +4386,36 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4405
4386
  _: 1
4406
4387
  }, 8, ["class"])) : createCommentVNode("", true),
4407
4388
  isError.value && _ctx.isCompact ? (openBlock(), createBlock(unref(N8nIcon), {
4408
- key: 1,
4389
+ key: 3,
4409
4390
  size: "medium",
4410
4391
  color: "danger",
4411
4392
  icon: "exclamation-triangle",
4412
4393
  class: normalizeClass(_ctx.$style.compactErrorIcon)
4413
4394
  }, null, 8, ["class"])) : createCommentVNode("", true),
4414
- !props.isReadOnly ? (openBlock(), createBlock(unref(_sfc_main$h), {
4415
- key: 2,
4395
+ !_ctx.isCompact || !props.latestInfo?.deleted ? (openBlock(), createBlock(unref(_sfc_main$i), {
4396
+ key: 4,
4416
4397
  type: "secondary",
4417
- size: "small",
4418
- icon: "play",
4398
+ size: "medium",
4399
+ icon: "edit",
4419
4400
  style: { "color": "var(--color-text-base)" },
4420
- "aria-label": unref(locale).baseText("logs.overview.body.run"),
4421
- class: normalizeClass([_ctx.$style.partialExecutionButton, depth.value > 0 ? _ctx.$style.unavailable : ""]),
4422
- 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), {
4401
+ disabled: props.latestInfo?.deleted,
4402
+ class: normalizeClass(_ctx.$style.openNdvButton),
4403
+ "aria-label": unref(locale).baseText("logs.overview.body.open"),
4404
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("openNdv", props.data), ["stop"]))
4405
+ }, null, 8, ["disabled", "class", "aria-label"])) : createCommentVNode("", true),
4406
+ !_ctx.isCompact || !props.isReadOnly && !props.latestInfo?.deleted && !props.latestInfo?.disabled ? (openBlock(), createBlock(unref(_sfc_main$i), {
4407
+ key: 5,
4425
4408
  type: "secondary",
4426
4409
  size: "small",
4427
- icon: "external-link-alt",
4410
+ icon: "play",
4428
4411
  style: { "color": "var(--color-text-base)" },
4429
- class: normalizeClass(_ctx.$style.openNdvButton),
4430
- "aria-label": unref(locale).baseText("logs.overview.body.open"),
4431
- onClick: _cache[1] || (_cache[1] = withModifiers(($event) => emit("openNdv", props.data), ["stop"]))
4432
- }, null, 8, ["class", "aria-label"]),
4412
+ "aria-label": unref(locale).baseText("logs.overview.body.run"),
4413
+ class: normalizeClass([_ctx.$style.partialExecutionButton, props.data.depth > 0 ? _ctx.$style.unavailable : ""]),
4414
+ disabled: props.latestInfo?.deleted || props.latestInfo?.disabled,
4415
+ onClick: _cache[1] || (_cache[1] = withModifiers(($event) => emit("triggerPartialExecution", props.data), ["stop"]))
4416
+ }, null, 8, ["aria-label", "class", "disabled"])) : createCommentVNode("", true),
4433
4417
  !_ctx.isCompact || props.data.children.length > 0 ? (openBlock(), createBlock(unref(N8nButton), {
4434
- key: 3,
4418
+ key: 6,
4435
4419
  type: "secondary",
4436
4420
  size: "small",
4437
4421
  square: true,
@@ -4442,39 +4426,39 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4442
4426
  }),
4443
4427
  class: normalizeClass(_ctx.$style.toggleButton),
4444
4428
  "aria-label": unref(locale).baseText("logs.overview.body.toggleRow"),
4445
- onClick: _cache[2] || (_cache[2] = withModifiers(($event) => emit("toggleExpanded", props.node), ["stop"]))
4429
+ onClick: _cache[2] || (_cache[2] = withModifiers(($event) => emit("toggleExpanded", props.data), ["stop"]))
4446
4430
  }, {
4447
4431
  default: withCtx(() => [
4448
4432
  createVNode(unref(N8nIcon), {
4449
4433
  size: "medium",
4450
- icon: props.node.expanded ? "chevron-down" : "chevron-up"
4434
+ icon: props.expanded ? "chevron-down" : "chevron-up"
4451
4435
  }, null, 8, ["icon"])
4452
4436
  ]),
4453
4437
  _: 1
4454
4438
  }, 8, ["style", "class", "aria-label"])) : createCommentVNode("", true)
4455
- ], 2)) : createCommentVNode("", true);
4439
+ ], 10, _hoisted_1);
4456
4440
  };
4457
4441
  }
4458
4442
  });
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";
4443
+ const container$5 = "_container_1ohan_123";
4444
+ const background = "_background_1ohan_138";
4445
+ const selected = "_selected_1ohan_147";
4446
+ const error = "_error_1ohan_153";
4447
+ const indent = "_indent_1ohan_157";
4448
+ const connectorCurved = "_connectorCurved_1ohan_166";
4449
+ const connectorStraight = "_connectorStraight_1ohan_176";
4450
+ const icon$1 = "_icon_1ohan_185";
4451
+ const name = "_name_1ohan_191";
4452
+ const timeTook = "_timeTook_1ohan_197";
4453
+ const errorIcon = "_errorIcon_1ohan_202";
4454
+ const startedAt = "_startedAt_1ohan_207";
4455
+ const consumedTokens = "_consumedTokens_1ohan_213";
4456
+ const compactErrorIcon = "_compactErrorIcon_1ohan_220";
4457
+ const partialExecutionButton = "_partialExecutionButton_1ohan_228";
4458
+ const openNdvButton = "_openNdvButton_1ohan_229";
4459
+ const compact = "_compact_1ohan_220";
4460
+ const unavailable = "_unavailable_1ohan_239";
4461
+ const toggleButton = "_toggleButton_1ohan_247";
4478
4462
  const style0$6 = {
4479
4463
  container: container$5,
4480
4464
  background,
@@ -4484,15 +4468,15 @@ const style0$6 = {
4484
4468
  connectorCurved,
4485
4469
  connectorStraight,
4486
4470
  icon: icon$1,
4487
- name: name$1,
4471
+ name,
4488
4472
  timeTook,
4489
4473
  errorIcon,
4490
- compact,
4491
4474
  startedAt,
4492
4475
  consumedTokens,
4493
4476
  compactErrorIcon,
4494
4477
  partialExecutionButton,
4495
4478
  openNdvButton,
4479
+ compact,
4496
4480
  unavailable,
4497
4481
  toggleButton
4498
4482
  };
@@ -4526,7 +4510,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4526
4510
  }, {
4527
4511
  default: withCtx(() => [
4528
4512
  createBaseVNode("span", null, toDisplayString(executionStatusText.value), 1),
4529
- _ctx.consumedTokens.totalTokens > 0 ? (openBlock(), createBlock(_sfc_main$7, {
4513
+ _ctx.consumedTokens.totalTokens > 0 ? (openBlock(), createBlock(_sfc_main$8, {
4530
4514
  key: 0,
4531
4515
  "consumed-tokens": _ctx.consumedTokens
4532
4516
  }, null, 8, ["consumed-tokens"])) : createCommentVNode("", true)
@@ -4551,33 +4535,32 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4551
4535
  selected: {},
4552
4536
  isReadOnly: { type: Boolean },
4553
4537
  isCompact: { type: Boolean },
4554
- executionTree: {}
4538
+ execution: {},
4539
+ latestNodeInfo: {},
4540
+ scrollToSelection: { type: Boolean }
4555
4541
  },
4556
- emits: ["clickHeader", "select"],
4542
+ emits: ["clickHeader", "select", "clearExecutionData"],
4557
4543
  setup(__props, { emit: __emit }) {
4558
4544
  const emit = __emit;
4559
4545
  const locale = useI18n$1();
4560
4546
  const telemetry = useTelemetry();
4561
- const workflowsStore = useWorkflowsStore();
4562
4547
  const router = useRouter();
4563
4548
  const runWorkflow = useRunWorkflow({ router });
4564
4549
  const ndvStore = useNDVStore();
4565
- const nodeHelpers = useNodeHelpers();
4566
4550
  const isClearExecutionButtonVisible = useClearExecutionButtonVisible();
4567
- const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4568
- const isEmpty2 = computed(() => workflowsStore.workflowExecutionData === null);
4551
+ const isEmpty2 = computed(() => __props.execution === void 0);
4569
4552
  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" }
4553
+ { label: locale.baseText("logs.overview.header.switch.overview"), value: "overview" },
4554
+ { label: locale.baseText("logs.overview.header.switch.details"), value: "details" }
4572
4555
  ]);
4573
- const execution = computed(() => workflowsStore.workflowExecutionData);
4574
4556
  const consumedTokens2 = computed(
4575
- () => getTotalConsumedTokens(...__props.executionTree.map(getSubtreeTotalConsumedTokens))
4557
+ () => getTotalConsumedTokens(...(__props.execution?.tree ?? []).map(getSubtreeTotalConsumedTokens))
4576
4558
  );
4577
- function onClearExecutionData() {
4578
- workflowsStore.setWorkflowExecutionData(null);
4579
- nodeHelpers.updateNodesExecutionIssues();
4580
- }
4559
+ const collapsedEntries = ref({});
4560
+ const flatLogEntries = computed(
4561
+ () => flattenLogEntries(__props.execution?.tree ?? [], collapsedEntries.value)
4562
+ );
4563
+ const virtualList = useVirtualList(flatLogEntries, { itemHeight: 32 });
4581
4564
  function handleClickNode(clicked) {
4582
4565
  if (__props.selected?.node === clicked.node && __props.selected?.runIndex === clicked.runIndex) {
4583
4566
  emit("select", void 0);
@@ -4585,24 +4568,49 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4585
4568
  }
4586
4569
  emit("select", clicked);
4587
4570
  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
4571
+ node_type: clicked.node.type,
4572
+ node_id: clicked.node.id,
4573
+ execution_id: __props.execution?.id,
4574
+ workflow_id: __props.execution?.workflowData.id
4592
4575
  });
4593
4576
  }
4594
4577
  function handleSwitchView(value) {
4595
- emit("select", value === "overview" || __props.executionTree.length === 0 ? void 0 : __props.executionTree[0]);
4578
+ emit(
4579
+ "select",
4580
+ value === "overview" || (__props.execution?.tree ?? []).length === 0 ? void 0 : __props.execution?.tree[0]
4581
+ );
4596
4582
  }
4597
4583
  function handleToggleExpanded(treeNode) {
4598
- treeNode.expanded = !treeNode.expanded;
4584
+ collapsedEntries.value[treeNode.id] = !collapsedEntries.value[treeNode.id];
4599
4585
  }
4600
4586
  async function handleOpenNdv(treeNode) {
4601
- ndvStore.setActiveNodeName(treeNode.node);
4587
+ ndvStore.setActiveNodeName(treeNode.node.name);
4588
+ await nextTick(() => {
4589
+ const source = treeNode.runData.source[0];
4590
+ const inputBranch = source?.previousNodeOutput ?? 0;
4591
+ ndvEventBus.emit("updateInputNodeName", source?.previousNode);
4592
+ ndvEventBus.emit("setInputBranchIndex", inputBranch);
4593
+ ndvStore.setOutputRunIndex(treeNode.runIndex);
4594
+ });
4602
4595
  }
4603
4596
  async function handleTriggerPartialExecution(treeNode) {
4604
- await runWorkflow.runWorkflow({ destinationNode: treeNode.node });
4597
+ const latestName = __props.latestNodeInfo[treeNode.node.id]?.name ?? treeNode.node.name;
4598
+ if (latestName) {
4599
+ await runWorkflow.runWorkflow({ destinationNode: latestName });
4600
+ }
4605
4601
  }
4602
+ watch(
4603
+ () => __props.scrollToSelection ? __props.selected : void 0,
4604
+ async (entry) => {
4605
+ if (entry) {
4606
+ const index = flatLogEntries.value.findIndex((e) => e.id === entry.id);
4607
+ if (index >= 0) {
4608
+ await nextTick(() => virtualList.scrollTo(index));
4609
+ }
4610
+ }
4611
+ },
4612
+ { immediate: true }
4613
+ );
4606
4614
  return (_ctx, _cache) => {
4607
4615
  return openBlock(), createElementBlock("div", {
4608
4616
  class: normalizeClass(_ctx.$style.container),
@@ -4611,7 +4619,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4611
4619
  createVNode(PanelHeader, {
4612
4620
  title: unref(locale).baseText("logs.overview.header.title"),
4613
4621
  "data-test-id": "logs-overview-header",
4614
- onClick: _cache[0] || (_cache[0] = ($event) => emit("clickHeader"))
4622
+ onClick: _cache[1] || (_cache[1] = ($event) => emit("clickHeader"))
4615
4623
  }, {
4616
4624
  actions: withCtx(() => [
4617
4625
  unref(isClearExecutionButtonVisible) ? (openBlock(), createBlock(unref(N8nTooltip), {
@@ -4625,7 +4633,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4625
4633
  icon: "trash",
4626
4634
  "icon-size": "medium",
4627
4635
  class: normalizeClass(_ctx.$style.clearButton),
4628
- onClick: withModifiers(onClearExecutionData, ["stop"])
4636
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("clearExecutionData"), ["stop"]))
4629
4637
  }, {
4630
4638
  default: withCtx(() => [
4631
4639
  createTextVNode(toDisplayString(unref(locale).baseText("logs.overview.header.actions.clearExecution")), 1)
@@ -4656,71 +4664,63 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4656
4664
  createTextVNode(toDisplayString(unref(locale).baseText("logs.overview.body.empty.message")), 1)
4657
4665
  ]),
4658
4666
  _: 1
4659
- }, 8, ["class"])) : (openBlock(), createElementBlock("div", {
4660
- key: 1,
4661
- class: normalizeClass(_ctx.$style.scrollable)
4662
- }, [
4663
- execution.value ? (openBlock(), createBlock(ExecutionSummary, {
4667
+ }, 8, ["class"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
4668
+ _ctx.execution ? (openBlock(), createBlock(ExecutionSummary, {
4664
4669
  key: 0,
4665
4670
  class: normalizeClass(_ctx.$style.summary),
4666
- status: execution.value.status,
4671
+ status: _ctx.execution.status,
4667
4672
  "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
4673
+ "time-took": _ctx.execution.startedAt && _ctx.execution.stoppedAt ? +new Date(_ctx.execution.stoppedAt) - +new Date(_ctx.execution.startedAt) : void 0
4669
4674
  }, 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),
4675
+ createBaseVNode("div", mergeProps({
4676
+ class: _ctx.$style.tree
4677
+ }, unref(virtualList).containerProps), [
4678
+ createBaseVNode("div", mergeProps(unref(virtualList).wrapperProps.value, { role: "tree" }), [
4679
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(virtualList).list.value, ({ data, index }) => {
4680
+ return openBlock(), createBlock(LogsOverviewRow, {
4681
+ key: index,
4682
+ data,
4683
+ "is-read-only": _ctx.isReadOnly,
4684
+ "is-selected": data.node.name === _ctx.selected?.node.name && data.runIndex === _ctx.selected?.runIndex,
4685
+ "is-compact": _ctx.isCompact,
4686
+ "should-show-consumed-tokens": consumedTokens2.value.totalTokens > 0,
4687
+ "latest-info": _ctx.latestNodeInfo[data.node.id],
4688
+ expanded: !collapsedEntries.value[data.id],
4689
+ onClick: withModifiers(($event) => handleClickNode(data), ["stop"]),
4690
+ onToggleExpanded: handleToggleExpanded,
4691
+ onOpenNdv: handleOpenNdv,
4692
+ onTriggerPartialExecution: handleTriggerPartialExecution
4693
+ }, null, 8, ["data", "is-read-only", "is-selected", "is-compact", "should-show-consumed-tokens", "latest-info", "expanded", "onClick"]);
4694
+ }), 128))
4695
+ ], 16)
4696
+ ], 16),
4695
4697
  createVNode(unref(N8nRadioButtons), {
4696
- size: "medium",
4698
+ size: "small-medium",
4697
4699
  class: normalizeClass(_ctx.$style.switchViewButtons),
4698
4700
  "model-value": _ctx.selected ? "details" : "overview",
4699
4701
  options: switchViewOptions.value,
4700
4702
  "onUpdate:modelValue": handleSwitchView
4701
4703
  }, null, 8, ["class", "model-value", "options"])
4702
- ], 2))
4704
+ ], 64))
4703
4705
  ], 2)) : createCommentVNode("", true)
4704
4706
  ], 2);
4705
4707
  };
4706
4708
  }
4707
4709
  });
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";
4710
+ const container$3 = "_container_acxst_123";
4711
+ const clearButton = "_clearButton_acxst_133";
4712
+ const content$1 = "_content_acxst_139";
4713
+ const empty = "_empty_acxst_148";
4714
+ const emptyText = "_emptyText_acxst_153";
4715
+ const summary = "_summary_acxst_158";
4716
+ const tree = "_tree_acxst_162";
4717
+ const switchViewButtons = "_switchViewButtons_acxst_169";
4717
4718
  const style0$4 = {
4718
4719
  container: container$3,
4719
4720
  clearButton,
4720
4721
  content: content$1,
4721
4722
  empty,
4722
4723
  emptyText,
4723
- scrollable,
4724
4724
  summary,
4725
4725
  tree,
4726
4726
  switchViewButtons
@@ -4734,38 +4734,44 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4734
4734
  props: {
4735
4735
  title: {},
4736
4736
  paneType: {},
4737
- logEntry: {}
4737
+ logEntry: {},
4738
+ workflow: {},
4739
+ execution: {}
4738
4740
  },
4739
4741
  setup(__props) {
4740
4742
  const locale = useI18n$1();
4741
- const workflowsStore = useWorkflowsStore();
4742
4743
  const ndvStore = useNDVStore();
4743
- const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4744
- const node = computed(() => {
4744
+ const displayMode = ref(__props.paneType === "input" ? "schema" : "table");
4745
+ const isMultipleInput = computed(() => __props.paneType === "input" && __props.logEntry.runData.source.length > 1);
4746
+ const runDataProps = computed(() => {
4745
4747
  if (__props.logEntry.depth > 0 || __props.paneType === "output") {
4746
- return workflowsStore.nodesByName[__props.logEntry.node];
4748
+ return { node: __props.logEntry.node, runIndex: __props.logEntry.runIndex };
4747
4749
  }
4748
- const parent = workflow.value.getParentNodesByDepth(__props.logEntry.node)[0];
4749
- if (!parent) {
4750
+ const source = __props.logEntry.runData.source[0];
4751
+ const node = source && __props.workflow.getNode(source.previousNode);
4752
+ if (!source || !node) {
4750
4753
  return void 0;
4751
4754
  }
4752
- return workflowsStore.nodesByName[parent.name];
4755
+ return {
4756
+ node: {
4757
+ ...node,
4758
+ disabled: false
4759
+ // For RunData component to render data from disabled nodes as well
4760
+ },
4761
+ runIndex: source.previousNodeRun ?? 0,
4762
+ overrideOutputs: [source.previousNodeOutput ?? 0]
4763
+ };
4753
4764
  });
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
4765
  function handleClickOpenNdv() {
4761
- ndvStore.setActiveNodeName(__props.logEntry.node);
4766
+ ndvStore.setActiveNodeName(__props.logEntry.node.name);
4767
+ }
4768
+ function handleChangeDisplayMode(value) {
4769
+ displayMode.value = value;
4762
4770
  }
4763
4771
  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,
4772
+ return runDataProps.value ? (openBlock(), createBlock(RunData, mergeProps({ key: 0 }, runDataProps.value, {
4773
+ workflow: _ctx.workflow,
4774
+ "workflow-execution": _ctx.execution,
4769
4775
  "too-much-data-title": unref(locale).baseText("ndv.output.tooMuchData.title"),
4770
4776
  "no-data-in-branch-message": unref(locale).baseText("ndv.output.noOutputDataInBranch"),
4771
4777
  "executing-message": unref(locale).baseText("ndv.output.executing"),
@@ -4774,8 +4780,12 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4774
4780
  compact: true,
4775
4781
  "disable-pin": true,
4776
4782
  "disable-edit": true,
4777
- "table-header-bg-color": "light"
4778
- }, createSlots({
4783
+ "disable-hover-highlight": true,
4784
+ "display-mode": displayMode.value,
4785
+ "disable-ai-content": _ctx.logEntry.depth === 0,
4786
+ "table-header-bg-color": "light",
4787
+ onDisplayModeChange: handleChangeDisplayMode
4788
+ }), createSlots({
4779
4789
  header: withCtx(() => [
4780
4790
  createVNode(unref(N8nText), {
4781
4791
  class: normalizeClass(_ctx.$style.title),
@@ -4828,7 +4838,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4828
4838
  ]),
4829
4839
  key: "1"
4830
4840
  } : void 0
4831
- ]), 1032, ["node", "workflow", "run-index", "too-much-data-title", "no-data-in-branch-message", "executing-message", "pane-type"])) : createCommentVNode("", true);
4841
+ ]), 1040, ["workflow", "workflow-execution", "too-much-data-title", "no-data-in-branch-message", "executing-message", "pane-type", "display-mode", "disable-ai-content"])) : createCommentVNode("", true);
4832
4842
  };
4833
4843
  }
4834
4844
  });
@@ -4851,26 +4861,28 @@ function useResizablePanel(localStorageKey, {
4851
4861
  allowFullSize
4852
4862
  }) {
4853
4863
  const containerSize = ref(0);
4854
- const size = useLocalStorage(localStorageKey, -1, { writeDefaults: false });
4864
+ const persistedSize = useLocalStorage(localStorageKey, -1, { writeDefaults: false });
4855
4865
  const isResizing = ref(false);
4866
+ const sizeOnResizeStart = ref();
4867
+ const minSizeValue = computed(() => resolveSize(minSize, containerSize.value));
4868
+ const maxSizeValue = computed(() => resolveSize(maxSize, containerSize.value));
4856
4869
  const constrainedSize = computed(() => {
4857
- if (isResizing.value && allowCollapse && size.value < 30) {
4870
+ const sizeInPixels = persistedSize.value >= 0 && persistedSize.value <= 1 ? containerSize.value * persistedSize.value : -1;
4871
+ if (isResizing.value && allowCollapse && sizeInPixels < 30) {
4858
4872
  return 0;
4859
4873
  }
4860
- if (isResizing.value && allowFullSize && size.value > containerSize.value - 30) {
4874
+ if (isResizing.value && allowFullSize && sizeInPixels > containerSize.value - 30) {
4861
4875
  return containerSize.value;
4862
4876
  }
4863
4877
  const defaultSizeValue = resolveSize(defaultSize, containerSize.value);
4864
- if (Number.isNaN(size.value) || size.value < 0) {
4878
+ if (Number.isNaN(sizeInPixels) || !Number.isFinite(sizeInPixels) || sizeInPixels < 0) {
4865
4879
  return defaultSizeValue;
4866
4880
  }
4867
- const minSizeValue = resolveSize(minSize, containerSize.value);
4868
- const maxSizeValue = resolveSize(maxSize, containerSize.value);
4869
4881
  return Math.max(
4870
- minSizeValue,
4882
+ minSizeValue.value,
4871
4883
  Math.min(
4872
- snap && Math.abs(defaultSizeValue - size.value) < 30 ? defaultSizeValue : size.value,
4873
- maxSizeValue
4884
+ snap && Math.abs(defaultSizeValue - sizeInPixels) < 30 ? defaultSizeValue : sizeInPixels,
4885
+ maxSizeValue.value
4874
4886
  )
4875
4887
  );
4876
4888
  });
@@ -4888,13 +4900,21 @@ function useResizablePanel(localStorageKey, {
4888
4900
  }
4889
4901
  function onResize(data) {
4890
4902
  const containerRect = unref(container2)?.getBoundingClientRect();
4891
- isResizing.value = true;
4892
- size.value = Math.max(
4903
+ const newSizeInPixels = Math.max(
4893
4904
  0,
4894
4905
  position === "bottom" ? (containerRect ? getSize(containerRect) : 0) - getValue(data) : getValue(data) - (containerRect ? getValue(containerRect) : 0)
4895
4906
  );
4907
+ isResizing.value = true;
4908
+ persistedSize.value = newSizeInPixels / containerSize.value;
4909
+ if (sizeOnResizeStart.value === void 0) {
4910
+ sizeOnResizeStart.value = persistedSize.value;
4911
+ }
4896
4912
  }
4897
4913
  function onResizeEnd() {
4914
+ if (minSizeValue.value > 0 && constrainedSize.value <= 0 || maxSizeValue.value < containerSize.value && constrainedSize.value >= containerSize.value) {
4915
+ persistedSize.value = sizeOnResizeStart.value;
4916
+ }
4917
+ sizeOnResizeStart.value = void 0;
4898
4918
  isResizing.value = false;
4899
4919
  }
4900
4920
  watch(
@@ -4912,12 +4932,6 @@ function useResizablePanel(localStorageKey, {
4912
4932
  },
4913
4933
  { immediate: true }
4914
4934
  );
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
4935
  return {
4922
4936
  isResizing: computed(() => isResizing.value),
4923
4937
  isCollapsed: computed(() => isResizing.value && constrainedSize.value <= 0),
@@ -4933,21 +4947,23 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4933
4947
  props: {
4934
4948
  isOpen: { type: Boolean },
4935
4949
  logEntry: {},
4936
- window: {}
4950
+ workflow: {},
4951
+ execution: {},
4952
+ window: {},
4953
+ latestInfo: {}
4937
4954
  },
4938
4955
  emits: ["clickHeader"],
4939
4956
  setup(__props, { emit: __emit }) {
4940
4957
  const emit = __emit;
4941
4958
  const locale = useI18n$1();
4942
4959
  const telemetry = useTelemetry();
4943
- const workflowsStore = useWorkflowsStore();
4944
4960
  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]
4961
+ const content2 = useLocalStorage(
4962
+ "N8N_LOGS_DETAIL_PANEL_CONTENT",
4963
+ LOG_DETAILS_CONTENT.OUTPUT,
4964
+ { writeDefaults: false }
4950
4965
  );
4966
+ const type = computed(() => nodeTypeStore.getNodeType(__props.logEntry.node.type));
4951
4967
  const consumedTokens2 = computed(() => getSubtreeTotalConsumedTokens(__props.logEntry));
4952
4968
  const isTriggerNode = computed(() => type.value?.group.includes("trigger"));
4953
4969
  const container2 = useTemplateRef("container");
@@ -5000,34 +5016,29 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5000
5016
  }, [
5001
5017
  createVNode(PanelHeader, {
5002
5018
  "data-test-id": "log-details-header",
5019
+ class: normalizeClass(_ctx.$style.header),
5003
5020
  onClick: _cache[0] || (_cache[0] = ($event) => emit("clickHeader"))
5004
5021
  }, {
5005
5022
  title: withCtx(() => [
5006
5023
  createBaseVNode("div", {
5007
5024
  class: normalizeClass(_ctx.$style.title)
5008
5025
  }, [
5009
- createVNode(_sfc_main$j, {
5026
+ createVNode(_sfc_main$k, {
5010
5027
  "node-type": type.value,
5011
5028
  size: 16,
5012
5029
  class: normalizeClass(_ctx.$style.icon)
5013
5030
  }, 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"]),
5031
+ createVNode(NodeName, {
5032
+ "latest-name": _ctx.latestInfo?.name ?? _ctx.logEntry.node.name,
5033
+ name: _ctx.logEntry.node.name,
5034
+ "is-deleted": _ctx.latestInfo?.deleted ?? false
5035
+ }, null, 8, ["latest-name", "name", "is-deleted"]),
5025
5036
  _ctx.isOpen ? (openBlock(), createBlock(ExecutionSummary, {
5026
5037
  key: 0,
5027
5038
  class: normalizeClass(_ctx.$style.executionSummary),
5028
- status: runData.value?.executionStatus ?? "unknown",
5039
+ status: _ctx.logEntry.runData.executionStatus ?? "unknown",
5029
5040
  "consumed-tokens": consumedTokens2.value,
5030
- "time-took": runData.value?.executionTime
5041
+ "time-took": _ctx.logEntry.runData.executionTime
5031
5042
  }, null, 8, ["class", "status", "consumed-tokens", "time-took"])) : createCommentVNode("", true)
5032
5043
  ], 2)
5033
5044
  ]),
@@ -5039,7 +5050,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5039
5050
  createVNode(unref(N8nButton), {
5040
5051
  size: "mini",
5041
5052
  type: "secondary",
5042
- class: normalizeClass(content2.value === unref(LOG_DETAILS_CONTENT).OUTPUT ? "" : _ctx.$style.pressed),
5053
+ class: normalizeClass(unref(content2) === unref(LOG_DETAILS_CONTENT).OUTPUT ? "" : _ctx.$style.pressed),
5043
5054
  onClick: withModifiers(handleToggleInput, ["stop"])
5044
5055
  }, {
5045
5056
  default: withCtx(() => [
@@ -5050,7 +5061,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5050
5061
  createVNode(unref(N8nButton), {
5051
5062
  size: "mini",
5052
5063
  type: "secondary",
5053
- class: normalizeClass(content2.value === unref(LOG_DETAILS_CONTENT).INPUT ? "" : _ctx.$style.pressed),
5064
+ class: normalizeClass(unref(content2) === unref(LOG_DETAILS_CONTENT).INPUT ? "" : _ctx.$style.pressed),
5054
5065
  onClick: withModifiers(handleToggleOutput, ["stop"])
5055
5066
  }, {
5056
5067
  default: withCtx(() => [
@@ -5062,13 +5073,13 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5062
5073
  renderSlot(_ctx.$slots, "actions")
5063
5074
  ]),
5064
5075
  _: 3
5065
- }),
5076
+ }, 8, ["class"]),
5066
5077
  _ctx.isOpen ? (openBlock(), createElementBlock("div", {
5067
5078
  key: 0,
5068
5079
  class: normalizeClass(_ctx.$style.content),
5069
5080
  "data-test-id": "logs-details-body"
5070
5081
  }, [
5071
- !isTriggerNode.value && content2.value !== unref(LOG_DETAILS_CONTENT).OUTPUT ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5082
+ !isTriggerNode.value && unref(content2) !== unref(LOG_DETAILS_CONTENT).OUTPUT ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5072
5083
  key: 0,
5073
5084
  class: normalizeClass({
5074
5085
  [_ctx.$style.inputResizer]: true,
@@ -5088,43 +5099,47 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5088
5099
  "data-test-id": "log-details-input",
5089
5100
  "pane-type": "input",
5090
5101
  title: unref(locale).baseText("logs.details.header.actions.input"),
5091
- "log-entry": _ctx.logEntry
5092
- }, null, 8, ["title", "log-entry"])
5102
+ "log-entry": _ctx.logEntry,
5103
+ workflow: _ctx.workflow,
5104
+ execution: _ctx.execution
5105
+ }, null, 8, ["title", "log-entry", "workflow", "execution"])
5093
5106
  ]),
5094
5107
  _: 1
5095
5108
  }, 8, ["class", "width", "style", "is-resizing-enabled", "window", "onResize"])) : createCommentVNode("", true),
5096
- isTriggerNode.value || content2.value !== unref(LOG_DETAILS_CONTENT).INPUT ? (openBlock(), createBlock(RunDataView, {
5109
+ isTriggerNode.value || unref(content2) !== unref(LOG_DETAILS_CONTENT).INPUT ? (openBlock(), createBlock(RunDataView, {
5097
5110
  key: 1,
5098
5111
  "data-test-id": "log-details-output",
5099
5112
  "pane-type": "output",
5100
5113
  class: normalizeClass(_ctx.$style.outputPanel),
5101
5114
  title: unref(locale).baseText("logs.details.header.actions.output"),
5102
- "log-entry": _ctx.logEntry
5103
- }, null, 8, ["class", "title", "log-entry"])) : createCommentVNode("", true)
5115
+ "log-entry": _ctx.logEntry,
5116
+ workflow: _ctx.workflow,
5117
+ execution: _ctx.execution
5118
+ }, null, 8, ["class", "title", "log-entry", "workflow", "execution"])) : createCommentVNode("", true)
5104
5119
  ], 2)) : createCommentVNode("", true)
5105
5120
  ], 2);
5106
5121
  };
5107
5122
  }
5108
5123
  });
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";
5124
+ const container$2 = "_container_pax0a_123";
5125
+ const header = "_header_pax0a_132";
5126
+ const actions = "_actions_pax0a_136";
5127
+ const pressed = "_pressed_pax0a_142";
5128
+ const title = "_title_pax0a_146";
5129
+ const icon = "_icon_pax0a_152";
5130
+ const executionSummary = "_executionSummary_pax0a_156";
5131
+ const content = "_content_pax0a_160";
5132
+ const outputPanel = "_outputPanel_pax0a_168";
5133
+ const inputResizer = "_inputResizer_pax0a_173";
5134
+ const collapsed = "_collapsed_pax0a_177";
5135
+ const full = "_full_pax0a_177";
5121
5136
  const style0$2 = {
5122
5137
  container: container$2,
5138
+ header,
5123
5139
  actions,
5124
5140
  pressed,
5125
5141
  title,
5126
5142
  icon,
5127
- name,
5128
5143
  executionSummary,
5129
5144
  content,
5130
5145
  outputPanel,
@@ -5163,7 +5178,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5163
5178
  content: popOutButtonText.value
5164
5179
  }, {
5165
5180
  default: withCtx(() => [
5166
- createVNode(unref(_sfc_main$h), {
5181
+ createVNode(unref(_sfc_main$i), {
5167
5182
  icon: "pop-out",
5168
5183
  type: "secondary",
5169
5184
  size: "small",
@@ -5180,7 +5195,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5180
5195
  content: toggleButtonText.value
5181
5196
  }, {
5182
5197
  default: withCtx(() => [
5183
- createVNode(unref(_sfc_main$h), {
5198
+ createVNode(unref(_sfc_main$i), {
5184
5199
  type: "secondary",
5185
5200
  size: "small",
5186
5201
  "icon-size": "medium",
@@ -5220,13 +5235,13 @@ function useLayout(pipContainer, pipContent2, container2, logsContainer2) {
5220
5235
  });
5221
5236
  const chatPanelResizer = useResizablePanel(LOCAL_STORAGE_PANEL_WIDTH, {
5222
5237
  container: container2,
5223
- defaultSize: (size) => size * 0.3,
5224
- minSize: 300,
5238
+ defaultSize: (size) => Math.min(800, size * 0.3),
5239
+ minSize: 240,
5225
5240
  maxSize: (size) => size * 0.8
5226
5241
  });
5227
5242
  const overviewPanelResizer = useResizablePanel(LOCAL_STORAGE_OVERVIEW_PANEL_WIDTH, {
5228
5243
  container: logsContainer2,
5229
- defaultSize: (size) => size * 0.3,
5244
+ defaultSize: (size) => Math.min(240, size * 0.2),
5230
5245
  minSize: 80,
5231
5246
  maxSize: 500,
5232
5247
  allowFullSize: true
@@ -5273,11 +5288,15 @@ function useLayout(pipContainer, pipContent2, container2, logsContainer2) {
5273
5288
  }
5274
5289
  resizer.onResizeEnd();
5275
5290
  }
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
- });
5291
+ watch(
5292
+ [panelState, resizer.size],
5293
+ ([state, height]) => {
5294
+ canvasStore.setPanelHeight(
5295
+ state === LOGS_PANEL_STATE.FLOATING ? 0 : state === LOGS_PANEL_STATE.ATTACHED ? height : 32
5296
+ );
5297
+ },
5298
+ { immediate: true }
5299
+ );
5281
5300
  return {
5282
5301
  height: resizer.size,
5283
5302
  chatPanelWidth: chatPanelResizer.size,
@@ -5298,6 +5317,73 @@ function useLayout(pipContainer, pipContent2, container2, logsContainer2) {
5298
5317
  onOverviewPanelResizeEnd: overviewPanelResizer.onResizeEnd
5299
5318
  };
5300
5319
  }
5320
+ function useExecutionData() {
5321
+ const nodeHelpers = useNodeHelpers();
5322
+ const workflowsStore = useWorkflowsStore();
5323
+ const execData = ref();
5324
+ const workflow = computed(
5325
+ () => execData.value ? new Workflow({
5326
+ ...execData.value?.workflowData,
5327
+ nodeTypes: workflowsStore.getNodeTypes()
5328
+ }) : void 0
5329
+ );
5330
+ const latestNodeNameById = computed(
5331
+ () => Object.values(workflow.value?.nodes ?? {}).reduce(
5332
+ (acc, node) => {
5333
+ const nodeInStore = workflowsStore.getNodeById(node.id);
5334
+ acc[node.id] = {
5335
+ deleted: !nodeInStore,
5336
+ disabled: nodeInStore?.disabled ?? false,
5337
+ name: nodeInStore?.name ?? node.name
5338
+ };
5339
+ return acc;
5340
+ },
5341
+ {}
5342
+ )
5343
+ );
5344
+ const hasChat = computed(
5345
+ () => [Object.values(workflow.value?.nodes ?? {}), workflowsStore.workflow.nodes].some(
5346
+ (nodes) => nodes.some(isChatNode)
5347
+ )
5348
+ );
5349
+ const execution = computed(() => {
5350
+ if (!execData.value || !workflow.value) {
5351
+ return void 0;
5352
+ }
5353
+ return {
5354
+ ...execData.value,
5355
+ tree: createLogEntries(workflow.value, execData.value.data?.resultData.runData ?? {})
5356
+ };
5357
+ });
5358
+ const updateInterval = computed(() => (execution.value?.tree.length ?? 0) > 10 ? 300 : 0);
5359
+ const runStatusList = computed(
5360
+ () => workflowsStore.workflowExecutionData?.id === IN_PROGRESS_EXECUTION_ID ? Object.values(workflowsStore.workflowExecutionData?.data?.resultData.runData ?? {}).flatMap((tasks) => tasks.map((task) => task.executionStatus ?? "")).join("|") : ""
5361
+ );
5362
+ function resetExecutionData() {
5363
+ execData.value = void 0;
5364
+ workflowsStore.setWorkflowExecutionData(null);
5365
+ nodeHelpers.updateNodesExecutionIssues();
5366
+ }
5367
+ watch(
5368
+ // Fields that should trigger update
5369
+ [
5370
+ () => workflowsStore.workflowExecutionData?.id,
5371
+ () => workflowsStore.workflowExecutionData?.workflowData.id,
5372
+ () => workflowsStore.workflowExecutionData?.status,
5373
+ runStatusList
5374
+ ],
5375
+ useThrottleFn(
5376
+ () => {
5377
+ execData.value = deepToRaw(workflowsStore.workflowExecutionData ?? void 0);
5378
+ },
5379
+ updateInterval,
5380
+ true,
5381
+ true
5382
+ ),
5383
+ { immediate: true }
5384
+ );
5385
+ return { execution, workflow, hasChat, latestNodeNameById, resetExecutionData };
5386
+ }
5301
5387
  const _sfc_main = /* @__PURE__ */ defineComponent({
5302
5388
  __name: "LogsPanel",
5303
5389
  props: {
@@ -5305,12 +5391,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5305
5391
  },
5306
5392
  setup(__props) {
5307
5393
  const props = __props;
5308
- const workflowsStore = useWorkflowsStore();
5309
5394
  const container2 = useTemplateRef("container");
5310
5395
  const logsContainer2 = useTemplateRef("logsContainer");
5311
5396
  const pipContainer = useTemplateRef("pipContainer");
5312
5397
  const pipContent2 = useTemplateRef("pipContent");
5313
- const previousChatMessages = computed(() => workflowsStore.getPastChatMessages);
5314
5398
  const {
5315
5399
  height,
5316
5400
  chatPanelWidth,
@@ -5330,34 +5414,23 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5330
5414
  onOverviewPanelResize,
5331
5415
  onOverviewPanelResizeEnd
5332
5416
  } = 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
- );
5417
+ const {
5418
+ currentSessionId,
5419
+ messages: messages2,
5420
+ previousChatMessages,
5421
+ sendMessage,
5422
+ refreshSession,
5423
+ displayExecution
5424
+ } = useChatState(props.isReadOnly);
5425
+ const { workflow, execution, hasChat, latestNodeNameById, resetExecutionData } = useExecutionData();
5346
5426
  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
5427
  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
5428
+ () => findSelectedLogEntry(manualLogEntrySelection.value, execution.value)
5356
5429
  );
5357
- const isLogDetailsOpen = computed(
5358
- () => selectedLogEntry.value !== void 0 && !isCollapsingDetailsPanel.value
5430
+ const isLogDetailsOpen = computed(() => isOpen.value && selectedLogEntry.value !== void 0);
5431
+ const isLogDetailsVisuallyOpen = computed(
5432
+ () => isLogDetailsOpen.value && !isCollapsingDetailsPanel.value
5359
5433
  );
5360
- const isLogDetailsOpenOrCollapsing = computed(() => selectedLogEntry.value !== void 0);
5361
5434
  const logsPanelActionsProps = computed(() => ({
5362
5435
  isOpen: isOpen.value,
5363
5436
  showToggleButton: !isPoppedOut.value,
@@ -5366,7 +5439,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5366
5439
  onToggleOpen
5367
5440
  }));
5368
5441
  function handleSelectLogEntry(selected2) {
5369
- manualLogEntrySelection.value = selected2 === void 0 ? { type: "none", workflowId: workflowsStore.workflow.id } : { type: "selected", workflowId: workflowsStore.workflow.id, data: selected2 };
5442
+ const workflowId = execution.value?.workflowData.id;
5443
+ if (!workflowId) {
5444
+ return;
5445
+ }
5446
+ manualLogEntrySelection.value = selected2 === void 0 ? { type: "none", workflowId } : { type: "selected", workflowId, data: selected2 };
5370
5447
  }
5371
5448
  function handleResizeOverviewPanelEnd() {
5372
5449
  if (isOverviewPanelFullWidth.value) {
@@ -5400,7 +5477,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5400
5477
  class: normalizeClass([_ctx.$style.container, "ignore-key-press-canvas"]),
5401
5478
  tabindex: "0"
5402
5479
  }, [
5403
- hasChat.value ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5480
+ unref(hasChat) && (!props.isReadOnly || unref(messages2).length > 0) ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5404
5481
  key: 0,
5405
5482
  "supported-directions": ["right"],
5406
5483
  "is-resizing-enabled": unref(isOpen),
@@ -5418,7 +5495,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5418
5495
  "is-read-only": _ctx.isReadOnly,
5419
5496
  messages: unref(messages2),
5420
5497
  "session-id": unref(currentSessionId),
5421
- "past-chat-messages": previousChatMessages.value,
5498
+ "past-chat-messages": unref(previousChatMessages),
5422
5499
  "show-close-button": false,
5423
5500
  "is-new-logs-enabled": true,
5424
5501
  onClose: unref(onToggleOpen),
@@ -5438,45 +5515,52 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
5438
5515
  createVNode(unref(N8nResizeWrapper), {
5439
5516
  class: normalizeClass(_ctx.$style.overviewResizer),
5440
5517
  width: unref(overviewPanelWidth),
5441
- style: normalizeStyle({ width: isLogDetailsOpen.value ? `${unref(overviewPanelWidth)}px` : "" }),
5518
+ style: normalizeStyle({ width: isLogDetailsVisuallyOpen.value ? `${unref(overviewPanelWidth)}px` : "" }),
5442
5519
  "supported-directions": ["right"],
5443
- "is-resizing-enabled": isLogDetailsOpenOrCollapsing.value,
5520
+ "is-resizing-enabled": isLogDetailsOpen.value,
5444
5521
  window: unref(pipWindow),
5445
5522
  onResize: unref(onOverviewPanelResize),
5446
5523
  onResizeend: handleResizeOverviewPanelEnd
5447
5524
  }, {
5448
5525
  default: withCtx(() => [
5449
- createVNode(LogsOverviewPanel, {
5526
+ (openBlock(), createBlock(LogsOverviewPanel, {
5527
+ key: unref(execution)?.id ?? "",
5450
5528
  class: normalizeClass(_ctx.$style.logsOverview),
5451
5529
  "is-open": unref(isOpen),
5452
5530
  "is-read-only": _ctx.isReadOnly,
5453
- "is-compact": isLogDetailsOpen.value,
5531
+ "is-compact": isLogDetailsVisuallyOpen.value,
5454
5532
  selected: selectedLogEntry.value,
5455
- "execution-tree": executionTree.value,
5533
+ execution: unref(execution),
5534
+ "scroll-to-selection": manualLogEntrySelection.value.type !== "selected" || manualLogEntrySelection.value.data.id !== selectedLogEntry.value?.id,
5535
+ "latest-node-info": unref(latestNodeNameById),
5456
5536
  onClickHeader: _cache[1] || (_cache[1] = ($event) => unref(onToggleOpen)(true)),
5457
- onSelect: handleSelectLogEntry
5537
+ onSelect: handleSelectLogEntry,
5538
+ onClearExecutionData: unref(resetExecutionData)
5458
5539
  }, {
5459
5540
  actions: withCtx(() => [
5460
- !isLogDetailsOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5541
+ !isLogDetailsVisuallyOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5461
5542
  ]),
5462
5543
  _: 1
5463
- }, 8, ["class", "is-open", "is-read-only", "is-compact", "selected", "execution-tree"])
5544
+ }, 8, ["class", "is-open", "is-read-only", "is-compact", "selected", "execution", "scroll-to-selection", "latest-node-info", "onClearExecutionData"]))
5464
5545
  ]),
5465
5546
  _: 1
5466
5547
  }, 8, ["class", "width", "style", "is-resizing-enabled", "window", "onResize"]),
5467
- isLogDetailsOpenOrCollapsing.value && selectedLogEntry.value ? (openBlock(), createBlock(LogsDetailsPanel, {
5548
+ isLogDetailsVisuallyOpen.value && selectedLogEntry.value && unref(workflow) && unref(execution) ? (openBlock(), createBlock(LogsDetailsPanel, {
5468
5549
  key: 0,
5469
5550
  class: normalizeClass(_ctx.$style.logDetails),
5470
5551
  "is-open": unref(isOpen),
5471
5552
  "log-entry": selectedLogEntry.value,
5553
+ workflow: unref(workflow),
5554
+ execution: unref(execution),
5472
5555
  window: unref(pipWindow),
5556
+ "latest-info": unref(latestNodeNameById)[selectedLogEntry.value.node.id],
5473
5557
  onClickHeader: _cache[2] || (_cache[2] = ($event) => unref(onToggleOpen)(true))
5474
5558
  }, {
5475
5559
  actions: withCtx(() => [
5476
- isLogDetailsOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5560
+ isLogDetailsVisuallyOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5477
5561
  ]),
5478
5562
  _: 1
5479
- }, 8, ["class", "is-open", "log-entry", "window"])) : createCommentVNode("", true)
5563
+ }, 8, ["class", "is-open", "log-entry", "workflow", "execution", "window", "latest-info"])) : createCommentVNode("", true)
5480
5564
  ], 2)
5481
5565
  ], 2)
5482
5566
  ]),