n8n-editor-ui 1.86.0 → 1.87.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/dist/assets/AnimatedSpinner-BJKBduqI.js +18 -0
  2. package/dist/assets/AnimatedSpinner-ChSRgyeI.css +39 -0
  3. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-DofUIs9S.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-BNiwICGe.js} +1 -1
  4. package/dist/assets/{AuthView-CyY2quTd.js → AuthView-DrViDPFs.js} +2 -2
  5. package/dist/assets/{CanvasChatSwitch-CRtE2Fld.css → CanvasChatSwitch-0IWSu8RE.css} +249 -45
  6. package/dist/assets/{CanvasChatSwitch-BTInPgKl.js → CanvasChatSwitch-BnTApoNZ.js} +436 -268
  7. package/dist/assets/{ChangePasswordView-Db-MkXhZ.js → ChangePasswordView-DPUv2ZhO.js} +3 -3
  8. package/dist/assets/CollectionParameter-14_bIMyy.js +4 -0
  9. package/dist/assets/{CredentialsView-CLr_6U2B.js → CredentialsView-Cx3MfjwO.js} +8 -8
  10. package/dist/assets/{ErrorView-CUS5vnCW.js → ErrorView-C3Sxa6Qs.js} +1 -1
  11. package/dist/assets/{ExecutionsTime-BOPJEomw.css → ExecutionsTime-DZHUIJjP.css} +6 -6
  12. package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-D15zjPBZ.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-B0NnOKRw.js} +23 -20
  13. package/dist/assets/{ExecutionsView-1df-oH5P.js → ExecutionsView-BD9a5MiE.js} +48 -56
  14. package/dist/assets/{ExecutionsView-BnBpSqVn.css → ExecutionsView-ByQf9yli.css} +13 -47
  15. package/dist/assets/{FileSaver.min-DLKMtSuf.js → FileSaver.min-CsyH54Dh.js} +1 -1
  16. package/dist/assets/{FixedCollectionParameter-CcqTLBeP.js → FixedCollectionParameter-icyYiANk.js} +1 -1
  17. package/dist/assets/{ForgotMyPasswordView-BHRWkO2H.js → ForgotMyPasswordView-B7m6OAyt.js} +3 -3
  18. package/dist/assets/InsightsChartAverageRuntime-CiI5y8BG.js +61 -0
  19. package/dist/assets/InsightsChartFailed-BAnQv9pU.js +57 -0
  20. package/dist/assets/InsightsChartFailureRate-CGRL86zw.js +57 -0
  21. package/dist/assets/InsightsChartTimeSaved-BJmjC9xP.js +71 -0
  22. package/dist/assets/InsightsChartTotal-YSqQgGkL.js +59 -0
  23. package/dist/assets/InsightsDashboard-CB4vHnBh.css +152 -0
  24. package/dist/assets/InsightsDashboard-oe5QP-_0.js +154 -0
  25. package/dist/assets/InsightsPaywall-BCSe1GCl.js +58 -0
  26. package/dist/assets/InsightsPaywall-OeXh6LeZ.css +133 -0
  27. package/dist/assets/InsightsSummary-Bf61oFlG.js +185 -0
  28. package/dist/assets/{InsightsSummary-DcRuPjLJ.css → InsightsSummary-W08OzElS.css} +57 -35
  29. package/dist/assets/InsightsTableWorkflows-B5M_o3Di.js +129 -0
  30. package/dist/assets/InsightsTableWorkflows-Us3j4UTO.css +128 -0
  31. package/dist/assets/{Logo-DbXTFYA8.js → Logo-DZ8mhDMd.js} +1 -1
  32. package/dist/assets/{MainHeader-BfQR9Td3.js → MainHeader-CItoJWMi.js} +9 -10
  33. package/dist/assets/{MainSidebar-CDUegYGN.js → MainSidebar-Cponf9eD.js} +11 -2
  34. package/dist/assets/{NodeCreation-BBXRRxZa.js → NodeCreation-DiUBT9p0.js} +4 -4
  35. package/dist/assets/{NodeCreator-BiyvtIjb.js → NodeCreator-BHji7uJa.js} +3 -3
  36. package/dist/assets/{NodeDetailsView-BcVu3kf0.css → NodeDetailsView-BT-ro74o.css} +63 -70
  37. package/dist/assets/{NodeDetailsView-Ph7FVpa8.js → NodeDetailsView-CPsaG2IZ.js} +123 -444
  38. package/dist/assets/{NodeView-BEJ48TF4.js → NodeView-9P-9rNOD.js} +19 -21
  39. package/dist/assets/{ProjectCardBadge-B7cCM6Eo.js → ProjectCardBadge-BdyDghHf.js} +1 -1
  40. package/dist/assets/{ProjectHeader-BjPaep-H.js → ProjectHeader-D8-9oE80.js} +1 -1
  41. package/dist/assets/{ProjectSettings-C1By1g0Z.js → ProjectSettings-Brpx7x2l.js} +2 -2
  42. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-UHiXbqwy.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-CShLauba.js} +1 -2
  43. package/dist/assets/{ResourcesListLayout-CiiXWGd5.js → ResourcesListLayout-nD22utQX.js} +1 -1
  44. package/dist/assets/{RunDataAi-CN9FrT9c.css → RunDataAi-CUUDqZRP.css} +128 -0
  45. package/dist/assets/{RunDataAi-CQE0VYut.js → RunDataAi-DULZvgnn.js} +88 -37
  46. package/dist/assets/{RunDataJson-BY9cOxFp.js → RunDataJson-jnag_uEf.js} +11 -12
  47. package/dist/assets/{RunDataJsonActions-CuFjccfe.js → RunDataJsonActions-CWCdb4Yi.js} +1 -2
  48. package/dist/assets/{RunDataSearch-afEc-21Y.js → RunDataSearch-CI5OdX2M.js} +1 -1
  49. package/dist/assets/{RunDataTable-N6yWFXKt.js → RunDataTable-CQc98S7W.js} +10 -8
  50. package/dist/assets/{SamlOnboarding-HDQzVmha.js → SamlOnboarding-mdVsZszT.js} +3 -3
  51. package/dist/assets/{SettingsApiView-DQMZT3uc.js → SettingsApiView-CRDQ66Jq.js} +1 -1
  52. package/dist/assets/{SettingsCommunityNodesView-BlQT_0E8.js → SettingsCommunityNodesView-DCp8y1mn.js} +4 -5
  53. package/dist/assets/{SettingsExternalSecrets-BL_3qoNS.js → SettingsExternalSecrets-PhLe1dhs.js} +1 -1
  54. package/dist/assets/{SettingsLdapView-BMsfXg-A.js → SettingsLdapView-DrPh9Cmp.js} +1 -1
  55. package/dist/assets/{SettingsLogStreamingView-Bm5vaSO2.js → SettingsLogStreamingView-D_dGzLfg.js} +1 -1
  56. package/dist/assets/{SettingsPersonalView-Djl1VXnE.js → SettingsPersonalView-C6XeNBcf.js} +1 -1
  57. package/dist/assets/{SettingsSourceControl-A-9nD8hG.js → SettingsSourceControl-Bu_qi87k.js} +1 -1
  58. package/dist/assets/{SettingsSso-DZCscZY6.js → SettingsSso-BF8Nr76R.js} +1 -1
  59. package/dist/assets/{SettingsUsageAndPlan-Rd5AGlNl.js → SettingsUsageAndPlan-DTyc2TI4.js} +1 -1
  60. package/dist/assets/{SettingsUsersView-NEahsGVs.js → SettingsUsersView-BfK_vKh5.js} +1 -1
  61. package/dist/assets/{SettingsView-CeXAUGXE.js → SettingsView-bkz5b7Ks.js} +1 -1
  62. package/dist/assets/{SetupView-BI7oJfg0.js → SetupView--_MmPcKt.js} +3 -3
  63. package/dist/assets/{SetupWorkflowCredentialsButton-DMZX1S1F.js → SetupWorkflowCredentialsButton-C94b-j6c.js} +2 -4
  64. package/dist/assets/{SetupWorkflowFromTemplateView-DZsPVdhN.js → SetupWorkflowFromTemplateView-Bn6NUya1.js} +3 -12
  65. package/dist/assets/{SigninView-CzVnEKyz.js → SigninView-s9B3HXBX.js} +3 -3
  66. package/dist/assets/{SignoutView-C4ynr4AN.js → SignoutView-CvFIZuRL.js} +1 -1
  67. package/dist/assets/{SignupView-9nwGonm9.js → SignupView-B6YMoGnc.js} +3 -3
  68. package/dist/assets/{TemplateDetails-DT1tI4AF.js → TemplateDetails-DOGmuYC4.js} +1 -1
  69. package/dist/assets/{TemplateList-DGPm_Qol.js → TemplateList-BRL4OSZK.js} +1 -1
  70. package/dist/assets/{TemplatesCollectionView-DwXY5s5G.js → TemplatesCollectionView-Ct2GIDCZ.js} +7 -9
  71. package/dist/assets/{TemplatesSearchView-D0R7uF40.js → TemplatesSearchView-CWGmY4-P.js} +3 -3
  72. package/dist/assets/{TemplatesView-BZ-ntkfi.js → TemplatesView-vYQo2Y75.js} +1 -1
  73. package/dist/assets/{TemplatesWorkflowView-TwVAHvD7.js → TemplatesWorkflowView-Cw6mc6wy.js} +5 -7
  74. package/dist/assets/{TestDefinitionEditView-o2Gc4BjN.js → TestDefinitionEditView-CZnzTAsp.js} +163 -199
  75. package/dist/assets/{TestDefinitionEditView-C3nnWQ4Q.css → TestDefinitionEditView-Cwkrz308.css} +12 -18
  76. package/dist/assets/{TestDefinitionListView-BuUWjPAl.js → TestDefinitionListView-CKsRlhn4.js} +1 -1
  77. package/dist/assets/{TestDefinitionNewView-DmSFNxfn.js → TestDefinitionNewView-B1KZ2Qnt.js} +2 -2
  78. package/dist/assets/{TestDefinitionRootView-1dNmGZUI.js → TestDefinitionRootView-V43FaNr3.js} +1 -1
  79. package/dist/assets/{VariablesView-D46tH9pw.js → VariablesView-DLB1Vvnc.js} +3 -3
  80. package/dist/assets/{WorkerView-G0K849qT.js → WorkerView-Iqi25XGQ.js} +6 -7
  81. package/dist/assets/{WorkflowActivator-DfalOPsa.js → WorkflowActivator-D9fExB06.js} +2 -2
  82. package/dist/assets/{WorkflowExecutionsInfoAccordion-BcD7ZskD.js → WorkflowExecutionsInfoAccordion-Md7C2uBw.js} +1 -1
  83. package/dist/assets/{WorkflowExecutionsLandingPage-BhPbJi5K.js → WorkflowExecutionsLandingPage-CKOlfG7s.js} +2 -2
  84. package/dist/assets/{WorkflowExecutionsPreview-CHu6M3Dh.css → WorkflowExecutionsPreview-D7jTJ8GL.css} +16 -48
  85. package/dist/assets/{WorkflowExecutionsPreview-CowaFwPg.js → WorkflowExecutionsPreview-DS6HDJng.js} +24 -256
  86. package/dist/assets/{WorkflowExecutionsView-BAojAjIM.js → WorkflowExecutionsView-LF3g9gDB.js} +11 -17
  87. package/dist/assets/{WorkflowHistory-Bj5_YFN8.js → WorkflowHistory-Cu7OIIMi.js} +4 -4
  88. package/dist/assets/{WorkflowOnboardingView-D9peqUJs.js → WorkflowOnboardingView-B2WUKfr6.js} +1 -1
  89. package/dist/assets/{WorkflowPreview-gflk06YT.js → WorkflowPreview-DlKRTeNZ.js} +1 -1
  90. package/dist/assets/{WorkflowsView-CmgKYCQ6.js → WorkflowsView-dot2ovV7.js} +10 -10
  91. package/dist/assets/chartjs.utils-BLcAAfTE.js +193 -0
  92. package/dist/assets/dateFormatter-Cdy8FmTT.js +21 -0
  93. package/dist/assets/{easyAiWorkflowUtils-CLssJdgl.js → easyAiWorkflowUtils-C5xkiwuo.js} +1 -1
  94. package/dist/assets/{global-link-actions-BphqczCY.js → global-link-actions-CfWIYTMM.js} +1 -1
  95. package/dist/assets/{import-curl-C9KhAemD.js → import-curl-DO7fae0m.js} +1 -1
  96. package/dist/assets/{index-C0DaAYgf.js → index-Bo3CExk-.js} +3 -1
  97. package/dist/assets/{index-CkOV8f0Z.js → index-D76xStxp.js} +9450 -3622
  98. package/dist/assets/{index-BaqhUIB7.css → index-DJ205bL0.css} +369 -44
  99. package/dist/assets/{pickBy-DUugkW7s.js → pickBy-DdpxIwij.js} +1 -1
  100. package/dist/assets/{templateActions-Czp13jCM.js → templateActions-BCMgItKi.js} +2 -7
  101. package/dist/assets/{useBeforeUnload-BBbiw-FV.js → useBeforeUnload-CDzomPGL.js} +1 -1
  102. package/dist/assets/{useCanvasMapping-Cla--atl.js → useCanvasMapping-D1DfqsUU.js} +6 -6
  103. package/dist/assets/{useCanvasOperations-FyzGfva5.js → useCanvasOperations-CAthHfOB.js} +27 -256
  104. package/dist/assets/{useClearExecutionButtonVisible-fESJZE5R.js → useClearExecutionButtonVisible-CnDyjcGF.js} +2 -2
  105. package/dist/assets/{useExecutionDebugging-D4s4CdaL.js → useExecutionDebugging-Bm9sy3W3.js} +1 -1
  106. package/dist/assets/{useExecutionHelpers-Bm91b8wb.js → useExecutionHelpers-C_yBGArA.js} +2 -19
  107. package/dist/assets/{useImportCurlCommand-BPNuR5ZX.js → useImportCurlCommand-CK-lTdZr.js} +2 -2
  108. package/dist/assets/{usePushConnection-BbQhNUm8.js → usePushConnection-potv7eom.js} +3 -4
  109. package/dist/assets/{useTestDefinitionForm-ZJngcsSH.js → useTestDefinitionForm-Dlzud2C-.js} +1 -1
  110. package/dist/assets/{useWorkflowActivate-CkCvd-g6.js → useWorkflowActivate-BvmFVCGP.js} +1 -1
  111. package/dist/index.html +2 -2
  112. package/package.json +1 -1
  113. package/dist/assets/CollectionParameter-BD3jmKi_.js +0 -4
  114. package/dist/assets/InsightsSummary-CyilLKXz.js +0 -152
  115. package/dist/assets/pushConnection.store-Cb2TGyrZ.js +0 -238
  116. package/dist/assets/useRunWorkflow-DnbQqqcB.js +0 -527
@@ -1,10 +1,9 @@
1
- import { aY as inject, aZ 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, a_ as toRefs, r as ref, o as onMounted, n as normalizeClass, x as renderSlot, a$ as normalizeProps, b0 as guardReactiveProps, b1 as resolveDynamicComponent, b2 as mergeProps, b3 as VueMarkdown, F as Fragment, D as renderList, b4 as markdownLink, b5 as useFileDialog, b6 as onUnmounted, B as normalizeStyle, aB as withDirectives, b7 as vModelText, H as withKeys, w as withCtx, I as watch, h as resolveComponent, l as createTextVNode, b8 as N8nText, b9 as useClipboard, a as useToast, c as useI18n$1, aR as N8nTooltip, ba as N8nButton, aT as _sfc_main$g, aV as createSlots, aK as useStorage, bb as watchEffect, y as onBeforeUnmount, K as useDebounce, bc as provide, bd as useProvideTooltipAppendTo, be as IsInPiPWindowSymbol, bf as NodeConnectionTypes, bg as get, bh as last, bi as isEmpty, aj as useMessage, ak as MODAL_CONFIRM, bj as v4, bk as MANUAL_CHAT_TRIGGER_NODE_TYPE, bl as CHAT_TRIGGER_NODE_TYPE, bm as CHAIN_SUMMARIZATION_LANGCHAIN_NODE_TYPE, bn as AI_SUBCATEGORY, bo as AI_CATEGORY_AGENTS, bp as AI_CATEGORY_CHAINS, bq as AI_CODE_NODE_TYPE, br as getNodeInputs, bs as getConnectionTypes, bt as getNodeOutputs, bu as CHAT_TRIGGER_NODE_TYPE$1, T as useWorkflowsStore, bv as useNodeTypesStore, a1 as useCanvasStore, b as useRouter, bw as useNodeHelpers, V as VIEWS, bx as useTemplateRef, by as N8nResizeWrapper, ah as useTelemetry, bz as _sfc_main$i, bA as ElTree, bB as N8nRadioButtons, bC as useStyles, p as useSettingsStore } from "./index-CkOV8f0Z.js";
2
- import { H as HighlightJS, R as RunDataAi, f as formatTokenUsageCount, _ as _sfc_main$h, g as getSubtreeTotalConsumedTokens, a as getTreeNodeData, c as createAiData, b as getTotalConsumedTokens } from "./RunDataAi-CQE0VYut.js";
3
- import { u as usePinnedData, a as upperFirst } from "./useCanvasOperations-FyzGfva5.js";
4
- import { u as useRunWorkflow } from "./useRunWorkflow-DnbQqqcB.js";
5
- import { u as useClearExecutionButtonVisible } from "./useClearExecutionButtonVisible-fESJZE5R.js";
6
- import "./useExecutionHelpers-Bm91b8wb.js";
7
- import "./pushConnection.store-Cb2TGyrZ.js";
1
+ import { aZ as inject, a_ 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, a$ as toRefs, r as ref, o as onMounted, n as normalizeClass, x as renderSlot, b0 as normalizeProps, b1 as guardReactiveProps, b2 as resolveDynamicComponent, b3 as mergeProps, b4 as VueMarkdown, F as Fragment, D as renderList, b5 as markdownLink, b6 as useFileDialog, b7 as onUnmounted, B as normalizeStyle, aC as withDirectives, b8 as vModelText, H as withKeys, w as withCtx, I as watch, h as resolveComponent, l as createTextVNode, b9 as N8nText, ba as useClipboard, a as useToast, c as useI18n$1, aS as N8nTooltip, bb as N8nButton, aU as _sfc_main$i, aW as createSlots, aL as useStorage, bc as watchEffect, y as onBeforeUnmount, K as useDebounce, bd as provide, be as useProvideTooltipAppendTo, bf as IsInPiPWindowSymbol, bg as isEmpty, bh as get, bi as usePinnedData, ak as useMessage, al as MODAL_CONFIRM, bj as v4, bk as MANUAL_CHAT_TRIGGER_NODE_TYPE, bl as CHAT_TRIGGER_NODE_TYPE, bm as CHAIN_SUMMARIZATION_LANGCHAIN_NODE_TYPE, bn as AI_SUBCATEGORY, bo as AI_CATEGORY_AGENTS, bp as AI_CATEGORY_CHAINS, bq as AI_CODE_NODE_TYPE, br as getNodeInputs, bs as getConnectionTypes, bt as getNodeOutputs, bu as NodeConnectionTypes, bv as CHAT_TRIGGER_NODE_TYPE$1, U as useWorkflowsStore, bw as useNodeTypesStore, a2 as useCanvasStore, b as useRouter, bx as useNodeHelpers, by as useRunWorkflow, V as VIEWS, bz as LOGS_PANEL_STATE, bA as useTemplateRef, bB as N8nResizeWrapper, ai as useTelemetry, bC as _sfc_main$k, bD as I18nT, bE as N8nIcon, au as useNDVStore, bF as ElTree, bG as N8nRadioButtons, bH as useStyles, p as useSettingsStore } from "./index-D76xStxp.js";
2
+ import { H as HighlightJS, R as RunDataAi, f as formatTokenUsageCount, _ as _sfc_main$j, g as getSubtreeTotalConsumedTokens, a as getTreeNodeData, c as createAiData, b as getTotalConsumedTokens } from "./RunDataAi-DULZvgnn.js";
3
+ import { u as useClearExecutionButtonVisible } from "./useClearExecutionButtonVisible-CnDyjcGF.js";
4
+ import { t as toTime, a as toDayMonth } from "./dateFormatter-Cdy8FmTT.js";
5
+ import { u as upperFirst } from "./useCanvasOperations-CAthHfOB.js";
6
+ import "./useExecutionHelpers-C_yBGArA.js";
8
7
  function bash(hljs) {
9
8
  const regex = hljs.regex;
10
9
  const VAR = {};
@@ -2605,7 +2604,7 @@ function render$2(_ctx, _cache) {
2605
2604
  }
2606
2605
  const IconPreview = { name: "mdi-openInNew", render: render$2 };
2607
2606
  const _hoisted_1$7 = { class: "chat-file-name" };
2608
- const _sfc_main$f = /* @__PURE__ */ defineComponent({
2607
+ const _sfc_main$h = /* @__PURE__ */ defineComponent({
2609
2608
  __name: "ChatFile",
2610
2609
  props: {
2611
2610
  file: {},
@@ -2655,7 +2654,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2655
2654
  };
2656
2655
  }
2657
2656
  });
2658
- const ChatFile = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["__scopeId", "data-v-70b9370d"]]);
2657
+ const ChatFile = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["__scopeId", "data-v-70b9370d"]]);
2659
2658
  const _hoisted_1$6 = {
2660
2659
  key: 0,
2661
2660
  class: "chat-message-actions"
@@ -2664,7 +2663,7 @@ const _hoisted_2$3 = {
2664
2663
  key: 2,
2665
2664
  class: "chat-message-files"
2666
2665
  };
2667
- const _sfc_main$e = /* @__PURE__ */ defineComponent({
2666
+ const _sfc_main$g = /* @__PURE__ */ defineComponent({
2668
2667
  __name: "Message",
2669
2668
  props: {
2670
2669
  message: {}
@@ -2730,8 +2729,8 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
2730
2729
  try {
2731
2730
  const dataURL = await readFileAsDataURL(file);
2732
2731
  fileSources.value[file.name] = dataURL;
2733
- } catch (error) {
2734
- console.error("Error reading file:", error);
2732
+ } catch (error2) {
2733
+ console.error("Error reading file:", error2);
2735
2734
  }
2736
2735
  }
2737
2736
  }
@@ -2846,7 +2845,7 @@ const _hoisted_7 = {
2846
2845
  key: 0,
2847
2846
  class: "chat-files"
2848
2847
  };
2849
- const _sfc_main$d = /* @__PURE__ */ defineComponent({
2848
+ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2850
2849
  __name: "Input",
2851
2850
  props: {
2852
2851
  placeholder: { default: "inputPlaceholder" }
@@ -3051,8 +3050,8 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
3051
3050
  };
3052
3051
  }
3053
3052
  });
3054
- const ChatInput = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["__scopeId", "data-v-9f775274"]]);
3055
- const _sfc_main$c = /* @__PURE__ */ defineComponent({
3053
+ const ChatInput = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["__scopeId", "data-v-9f775274"]]);
3054
+ const _sfc_main$e = /* @__PURE__ */ defineComponent({
3056
3055
  __name: "MessageTyping",
3057
3056
  props: {
3058
3057
  animation: { default: "bouncing" }
@@ -3077,7 +3076,7 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
3077
3076
  messageContainer.value?.scrollToView();
3078
3077
  });
3079
3078
  return (_ctx, _cache) => {
3080
- return openBlock(), createBlock(unref(_sfc_main$e), {
3079
+ return openBlock(), createBlock(unref(_sfc_main$g), {
3081
3080
  ref_key: "messageContainer",
3082
3081
  ref: messageContainer,
3083
3082
  class: normalizeClass(classes.value),
@@ -3100,12 +3099,15 @@ const _hoisted_1$2 = {
3100
3099
  key: 0,
3101
3100
  class: "empty-container"
3102
3101
  };
3103
- const _hoisted_2$1 = { class: "empty" };
3102
+ const _hoisted_2$1 = {
3103
+ class: "empty",
3104
+ "data-test-id": "chat-messages-empty"
3105
+ };
3104
3106
  const _hoisted_3 = {
3105
3107
  key: 1,
3106
3108
  class: "chat-messages-list"
3107
3109
  };
3108
- const _sfc_main$b = /* @__PURE__ */ defineComponent({
3110
+ const _sfc_main$d = /* @__PURE__ */ defineComponent({
3109
3111
  __name: "MessagesList",
3110
3112
  props: {
3111
3113
  messages: {},
@@ -3147,13 +3149,13 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
3147
3149
  ])
3148
3150
  ])) : (openBlock(), createElementBlock("div", _hoisted_3, [
3149
3151
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(initialMessages), (initialMessage) => {
3150
- return openBlock(), createBlock(_sfc_main$e, {
3152
+ return openBlock(), createBlock(_sfc_main$g, {
3151
3153
  key: initialMessage.id,
3152
3154
  message: initialMessage
3153
3155
  }, null, 8, ["message"]);
3154
3156
  }), 128)),
3155
3157
  (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.messages, (message) => {
3156
- return openBlock(), createBlock(_sfc_main$e, {
3158
+ return openBlock(), createBlock(_sfc_main$g, {
3157
3159
  key: message.id,
3158
3160
  ref_for: true,
3159
3161
  ref_key: "messageComponents",
@@ -3166,12 +3168,12 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
3166
3168
  _: 2
3167
3169
  }, 1032, ["message"]);
3168
3170
  }), 128)),
3169
- unref(waitingForResponse) ? (openBlock(), createBlock(_sfc_main$c, { key: 0 })) : createCommentVNode("", true)
3171
+ unref(waitingForResponse) ? (openBlock(), createBlock(_sfc_main$e, { key: 0 })) : createCommentVNode("", true)
3170
3172
  ]));
3171
3173
  };
3172
3174
  }
3173
3175
  });
3174
- const _sfc_main$a = /* @__PURE__ */ defineComponent({
3176
+ const _sfc_main$c = /* @__PURE__ */ defineComponent({
3175
3177
  __name: "MessageOptionTooltip",
3176
3178
  props: {
3177
3179
  placement: {
@@ -3206,17 +3208,17 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
3206
3208
  };
3207
3209
  }
3208
3210
  });
3209
- const container$6 = "_container_pqtqf_123";
3211
+ const container$7 = "_container_pqtqf_123";
3210
3212
  const icon$2 = "_icon_pqtqf_129";
3211
- const style0$8 = {
3212
- container: container$6,
3213
+ const style0$9 = {
3214
+ container: container$7,
3213
3215
  icon: icon$2
3214
3216
  };
3215
- const cssModules$8 = {
3216
- "$style": style0$8
3217
+ const cssModules$9 = {
3218
+ "$style": style0$9
3217
3219
  };
3218
- const MessageOptionTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__cssModules", cssModules$8]]);
3219
- const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3220
+ const MessageOptionTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__cssModules", cssModules$9]]);
3221
+ const _sfc_main$b = /* @__PURE__ */ defineComponent({
3220
3222
  __name: "MessageOptionAction",
3221
3223
  props: {
3222
3224
  label: {
@@ -3257,17 +3259,17 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3257
3259
  };
3258
3260
  }
3259
3261
  });
3260
- const container$5 = "_container_u1r1u_123";
3262
+ const container$6 = "_container_u1r1u_123";
3261
3263
  const icon$1 = "_icon_u1r1u_129";
3262
- const style0$7 = {
3263
- container: container$5,
3264
+ const style0$8 = {
3265
+ container: container$6,
3264
3266
  icon: icon$1
3265
3267
  };
3266
- const cssModules$7 = {
3267
- "$style": style0$7
3268
+ const cssModules$8 = {
3269
+ "$style": style0$8
3268
3270
  };
3269
- const MessageOptionAction = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__cssModules", cssModules$7]]);
3270
- const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3271
+ const MessageOptionAction = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__cssModules", cssModules$8]]);
3272
+ const _sfc_main$a = /* @__PURE__ */ defineComponent({
3271
3273
  __name: "PanelHeader",
3272
3274
  props: {
3273
3275
  title: {}
@@ -3299,20 +3301,20 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3299
3301
  };
3300
3302
  }
3301
3303
  });
3302
- const container$4 = "_container_u9nuz_123";
3304
+ const container$5 = "_container_u9nuz_123";
3303
3305
  const title = "_title_u9nuz_144";
3304
3306
  const actions$1 = "_actions_u9nuz_149";
3305
- const style0$6 = {
3306
- container: container$4,
3307
+ const style0$7 = {
3308
+ container: container$5,
3307
3309
  title,
3308
3310
  actions: actions$1
3309
3311
  };
3310
- const cssModules$6 = {
3311
- "$style": style0$6
3312
+ const cssModules$7 = {
3313
+ "$style": style0$7
3312
3314
  };
3313
- const PanelHeader = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__cssModules", cssModules$6]]);
3315
+ const PanelHeader = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__cssModules", cssModules$7]]);
3314
3316
  const _hoisted_1$1 = ["onClick"];
3315
- const _sfc_main$7 = /* @__PURE__ */ defineComponent({
3317
+ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3316
3318
  __name: "ChatMessagesPanel",
3317
3319
  props: {
3318
3320
  pastChatMessages: {},
@@ -3399,6 +3401,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
3399
3401
  }, [
3400
3402
  _ctx.isNewLogsEnabled ? (openBlock(), createBlock(PanelHeader, {
3401
3403
  key: 0,
3404
+ "data-test-id": "chat-header",
3402
3405
  title: unref(locale).baseText("chat.window.title"),
3403
3406
  onClick: _cache[0] || (_cache[0] = ($event) => emit("clickHeader"))
3404
3407
  }, {
@@ -3429,7 +3432,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
3429
3432
  content: unref(locale).baseText("chat.window.session.resetSession")
3430
3433
  }, {
3431
3434
  default: withCtx(() => [
3432
- createVNode(unref(_sfc_main$g), {
3435
+ createVNode(unref(_sfc_main$i), {
3433
3436
  class: normalizeClass(_ctx.$style.headerButton),
3434
3437
  "data-test-id": "refresh-session-button",
3435
3438
  outline: "",
@@ -3469,7 +3472,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
3469
3472
  ]),
3470
3473
  _: 1
3471
3474
  }),
3472
- createVNode(unref(_sfc_main$g), {
3475
+ createVNode(unref(_sfc_main$i), {
3473
3476
  class: normalizeClass(_ctx.$style.headerButton),
3474
3477
  "data-test-id": "refresh-session-button",
3475
3478
  outline: "",
@@ -3479,7 +3482,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
3479
3482
  title: unref(locale).baseText("chat.window.session.reset"),
3480
3483
  onClick: onRefreshSession
3481
3484
  }, null, 8, ["class", "title"]),
3482
- _ctx.showCloseButton ? (openBlock(), createBlock(unref(_sfc_main$g), {
3485
+ _ctx.showCloseButton ? (openBlock(), createBlock(unref(_sfc_main$i), {
3483
3486
  key: 0,
3484
3487
  class: normalizeClass(_ctx.$style.headerButton),
3485
3488
  outline: "",
@@ -3494,7 +3497,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
3494
3497
  key: 2,
3495
3498
  class: normalizeClass(_ctx.$style.chatBody)
3496
3499
  }, [
3497
- createVNode(_sfc_main$b, {
3500
+ createVNode(_sfc_main$d, {
3498
3501
  messages: _ctx.messages,
3499
3502
  class: normalizeClass(_ctx.$style.messages),
3500
3503
  "empty-text": _ctx.isNewLogsEnabled ? unref(locale).baseText("chat.window.chat.emptyChatMessage.v2") : void 0
@@ -3585,7 +3588,7 @@ const headerButton = "_headerButton_14fd2_183";
3585
3588
  const chatBody = "_chatBody_14fd2_188";
3586
3589
  const messages = "_messages_14fd2_197";
3587
3590
  const messagesInput = "_messagesInput_14fd2_208";
3588
- const style0$5 = {
3591
+ const style0$6 = {
3589
3592
  chat: chat$2,
3590
3593
  chatHeader,
3591
3594
  chatTitle,
@@ -3597,13 +3600,13 @@ const style0$5 = {
3597
3600
  messages,
3598
3601
  messagesInput
3599
3602
  };
3600
- const cssModules$5 = {
3601
- "$style": style0$5
3603
+ const cssModules$6 = {
3604
+ "$style": style0$6
3602
3605
  };
3603
- const ChatMessagesPanel = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__cssModules", cssModules$5]]);
3606
+ const ChatMessagesPanel = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__cssModules", cssModules$6]]);
3604
3607
  const _hoisted_1 = { class: "meta" };
3605
3608
  const _hoisted_2 = { key: 0 };
3606
- const _sfc_main$6 = /* @__PURE__ */ defineComponent({
3609
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3607
3610
  __name: "ChatLogsPanel",
3608
3611
  props: {
3609
3612
  node: {},
@@ -3650,17 +3653,17 @@ const logsWrapper = "_logsWrapper_1n9n2_140";
3650
3653
  const logsTitle = "_logsTitle_1n9n2_149";
3651
3654
  const logs$1 = "_logs_1n9n2_123";
3652
3655
  const actions = "_actions_1n9n2_159";
3653
- const style0$4 = {
3656
+ const style0$5 = {
3654
3657
  logsHeader,
3655
3658
  logsWrapper,
3656
3659
  logsTitle,
3657
3660
  logs: logs$1,
3658
3661
  actions
3659
3662
  };
3660
- const cssModules$4 = {
3661
- "$style": style0$4
3663
+ const cssModules$5 = {
3664
+ "$style": style0$5
3662
3665
  };
3663
- const ChatLogsPanel = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__cssModules", cssModules$4]]);
3666
+ const ChatLogsPanel = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__cssModules", cssModules$5]]);
3664
3667
  const LOCAL_STORAGE_PANEL_HEIGHT = "N8N_CANVAS_CHAT_HEIGHT";
3665
3668
  const LOCAL_STORAGE_PANEL_WIDTH = "N8N_CANVAS_CHAT_WIDTH";
3666
3669
  const MAX_WIDTH_PERCENTAGE = 0.8;
@@ -3816,12 +3819,9 @@ function usePiPWindow({
3816
3819
  }
3817
3820
  function useChatMessaging({
3818
3821
  chatTrigger,
3819
- connectedNode,
3820
3822
  messages: messages2,
3821
3823
  sessionId: sessionId2,
3822
- workflow,
3823
3824
  executionResultData,
3824
- getWorkflowResultDataByNodeName,
3825
3825
  onRunChatWorkflow
3826
3826
  }) {
3827
3827
  const locale = useI18n$1();
@@ -3982,31 +3982,11 @@ function useChatMessaging({
3982
3982
  messages2.value.push(newMessage);
3983
3983
  await startWorkflowWithMessage(newMessage.text, files);
3984
3984
  }
3985
- function getChatMessages() {
3986
- if (!connectedNode.value) return [];
3987
- const connectedMemoryInputs = workflow.value.connectionsByDestinationNode?.[connectedNode.value.name]?.[NodeConnectionTypes.AiMemory];
3988
- if (!connectedMemoryInputs) return [];
3989
- const memoryConnection = (connectedMemoryInputs ?? []).find((i) => (i ?? []).length > 0)?.[0];
3990
- if (!memoryConnection) return [];
3991
- const nodeResultData = getWorkflowResultDataByNodeName(memoryConnection.node);
3992
- const memoryOutputData = (nodeResultData ?? []).map(
3993
- (data) => get(data, ["data", NodeConnectionTypes.AiMemory, 0, 0, "json"])
3994
- ).find((data) => data && data.action === "saveContext");
3995
- return (memoryOutputData?.chatHistory ?? []).map((message, index) => {
3996
- return {
3997
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
3998
- text: message.kwargs.content,
3999
- id: `preload__${index}`,
4000
- sender: last(message.id) === "HumanMessage" ? "user" : "bot"
4001
- };
4002
- });
4003
- }
4004
3985
  return {
4005
3986
  previousMessageIndex,
4006
3987
  isLoading: computed(() => isLoading.value),
4007
3988
  sendMessage,
4008
- extractResponseMessage,
4009
- getChatMessages
3989
+ extractResponseMessage
4010
3990
  };
4011
3991
  }
4012
3992
  function useChatTrigger({
@@ -4087,7 +4067,7 @@ function useChatState(isDisabled, onWindowResize) {
4087
4067
  const currentSessionId = ref(v4().replace(/-/g, ""));
4088
4068
  const canvasNodes = computed(() => workflowsStore.allNodes);
4089
4069
  const allConnections = computed(() => workflowsStore.allConnections);
4090
- const chatPanelState = computed(() => workflowsStore.chatPanelState);
4070
+ const logsPanelState = computed(() => workflowsStore.logsPanelState);
4091
4071
  const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4092
4072
  const {
4093
4073
  chatTriggerNode,
@@ -4102,14 +4082,11 @@ function useChatState(isDisabled, onWindowResize) {
4102
4082
  getNodeByName: workflowsStore.getNodeByName,
4103
4083
  getNodeType: nodeTypesStore.getNodeType
4104
4084
  });
4105
- const { sendMessage, getChatMessages, isLoading } = useChatMessaging({
4085
+ const { sendMessage, isLoading } = useChatMessaging({
4106
4086
  chatTrigger: chatTriggerNode,
4107
- connectedNode,
4108
4087
  messages: messages2,
4109
4088
  sessionId: currentSessionId,
4110
- workflow,
4111
4089
  executionResultData: computed(() => workflowsStore.getWorkflowExecution?.data?.resultData),
4112
- getWorkflowResultDataByNodeName: workflowsStore.getWorkflowResultDataByNodeName,
4113
4090
  onRunChatWorkflow
4114
4091
  });
4115
4092
  function createChatConfig(params) {
@@ -4152,14 +4129,11 @@ function useChatState(isDisabled, onWindowResize) {
4152
4129
  provide(ChatSymbol, chatConfig);
4153
4130
  provide(ChatOptionsSymbol, chatOptions);
4154
4131
  watch(
4155
- () => chatPanelState.value,
4132
+ () => logsPanelState.value,
4156
4133
  (state) => {
4157
- if (state !== "closed") {
4134
+ if (state !== LOGS_PANEL_STATE.CLOSED) {
4158
4135
  setChatTriggerNode();
4159
4136
  setConnectedNode();
4160
- if (messages2.value.length === 0) {
4161
- messages2.value = getChatMessages();
4162
- }
4163
4137
  setTimeout(() => {
4164
4138
  onWindowResize();
4165
4139
  chatEventBus.emit("focusInput");
@@ -4234,7 +4208,7 @@ function useChatState(isDisabled, onWindowResize) {
4234
4208
  displayExecution
4235
4209
  };
4236
4210
  }
4237
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4211
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4238
4212
  __name: "CanvasChat",
4239
4213
  setup(__props, { expose: __expose }) {
4240
4214
  const workflowsStore = useWorkflowsStore();
@@ -4244,7 +4218,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4244
4218
  const pipContainer = useTemplateRef("pipContainer");
4245
4219
  const pipContent2 = useTemplateRef("pipContent");
4246
4220
  const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4247
- const chatPanelState = computed(() => workflowsStore.chatPanelState);
4221
+ const chatPanelState = computed(() => workflowsStore.logsPanelState);
4248
4222
  const previousChatMessages = computed(() => workflowsStore.getPastChatMessages);
4249
4223
  const resultData = computed(() => workflowsStore.getWorkflowRunData);
4250
4224
  const telemetry = useTelemetry();
@@ -4262,13 +4236,13 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4262
4236
  initialWidth: window.document.body.offsetWidth * 0.8,
4263
4237
  container: pipContainer,
4264
4238
  content: pipContent2,
4265
- shouldPopOut: computed(() => chatPanelState.value === "floating"),
4239
+ shouldPopOut: computed(() => chatPanelState.value === LOGS_PANEL_STATE.FLOATING),
4266
4240
  onRequestClose: () => {
4267
- if (chatPanelState.value === "closed") {
4241
+ if (chatPanelState.value === LOGS_PANEL_STATE.CLOSED) {
4268
4242
  return;
4269
4243
  }
4270
4244
  telemetry.track("User toggled log view", { new_state: "attached" });
4271
- workflowsStore.setPanelState("attached");
4245
+ workflowsStore.setPreferPoppedOutLogsView(false);
4272
4246
  }
4273
4247
  });
4274
4248
  const {
@@ -4287,14 +4261,15 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4287
4261
  workflow
4288
4262
  });
4289
4263
  const closePanel = () => {
4290
- workflowsStore.setPanelState("closed");
4264
+ workflowsStore.toggleLogsPanelOpen(false);
4291
4265
  };
4292
4266
  function onPopOut() {
4293
4267
  telemetry.track("User toggled log view", { new_state: "floating" });
4294
- workflowsStore.setPanelState("floating");
4268
+ workflowsStore.toggleLogsPanelOpen(true);
4269
+ workflowsStore.setPreferPoppedOutLogsView(true);
4295
4270
  }
4296
4271
  watchEffect(() => {
4297
- canvasStore.setPanelHeight(chatPanelState.value === "attached" ? height.value : 0);
4272
+ canvasStore.setPanelHeight(chatPanelState.value === LOGS_PANEL_STATE.ATTACHED ? height.value : 0);
4298
4273
  });
4299
4274
  return (_ctx, _cache) => {
4300
4275
  const _component_n8n_icon_button = resolveComponent("n8n-icon-button");
@@ -4309,9 +4284,9 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4309
4284
  }, [
4310
4285
  unref(chatTriggerNode) ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
4311
4286
  key: 0,
4312
- "is-resizing-enabled": !unref(isPoppedOut) && chatPanelState.value === "attached",
4287
+ "is-resizing-enabled": !unref(isPoppedOut) && chatPanelState.value === unref(LOGS_PANEL_STATE).ATTACHED,
4313
4288
  "supported-directions": ["top"],
4314
- class: normalizeClass([_ctx.$style.resizeWrapper, chatPanelState.value === "closed" && _ctx.$style.empty]),
4289
+ class: normalizeClass([_ctx.$style.resizeWrapper, chatPanelState.value === unref(LOGS_PANEL_STATE).CLOSED && _ctx.$style.empty]),
4315
4290
  height: unref(height),
4316
4291
  style: normalizeStyle(unref(rootStyles)),
4317
4292
  onResize: unref(onResizeDebounced)
@@ -4323,7 +4298,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4323
4298
  class: normalizeClass([_ctx.$style.container, "ignore-key-press-canvas"]),
4324
4299
  tabindex: "0"
4325
4300
  }, [
4326
- chatPanelState.value !== "closed" ? (openBlock(), createElementBlock("div", {
4301
+ chatPanelState.value !== unref(LOGS_PANEL_STATE).CLOSED ? (openBlock(), createElementBlock("div", {
4327
4302
  key: 0,
4328
4303
  class: normalizeClass(_ctx.$style.chatResizer)
4329
4304
  }, [
@@ -4397,28 +4372,28 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4397
4372
  const resizeWrapper$1 = "_resizeWrapper_1aajp_124";
4398
4373
  const pipContent$1 = "_pipContent_1aajp_129";
4399
4374
  const empty$1 = "_empty_1aajp_140";
4400
- const container$3 = "_container_1aajp_146";
4375
+ const container$4 = "_container_1aajp_146";
4401
4376
  const chatResizer = "_chatResizer_1aajp_154";
4402
4377
  const footer = "_footer_1aajp_161";
4403
4378
  const chat$1 = "_chat_1aajp_154";
4404
4379
  const inner = "_inner_1aajp_180";
4405
4380
  const logs = "_logs_1aajp_188";
4406
- const style0$3 = {
4381
+ const style0$4 = {
4407
4382
  resizeWrapper: resizeWrapper$1,
4408
4383
  pipContent: pipContent$1,
4409
4384
  empty: empty$1,
4410
- container: container$3,
4385
+ container: container$4,
4411
4386
  chatResizer,
4412
4387
  footer,
4413
4388
  chat: chat$1,
4414
4389
  inner,
4415
4390
  logs
4416
4391
  };
4417
- const cssModules$3 = {
4418
- "$style": style0$3
4392
+ const cssModules$4 = {
4393
+ "$style": style0$4
4419
4394
  };
4420
- const __unplugin_components_0$1 = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__cssModules", cssModules$3]]);
4421
- const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4395
+ const __unplugin_components_0 = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__cssModules", cssModules$4]]);
4396
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4422
4397
  __name: "ConsumedTokenCountText",
4423
4398
  props: {
4424
4399
  consumedTokens: {}
@@ -4426,7 +4401,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4426
4401
  setup(__props) {
4427
4402
  const locale = useI18n$1();
4428
4403
  return (_ctx, _cache) => {
4429
- const _component_ConsumedTokensDetails = _sfc_main$h;
4404
+ const _component_ConsumedTokensDetails = _sfc_main$j;
4430
4405
  return _ctx.consumedTokens !== void 0 ? (openBlock(), createBlock(unref(N8nTooltip), {
4431
4406
  key: 0,
4432
4407
  enterable: false
@@ -4446,15 +4421,16 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4446
4421
  };
4447
4422
  }
4448
4423
  });
4449
- const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4424
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4450
4425
  __name: "LogsOverviewRow",
4451
4426
  props: {
4452
4427
  data: {},
4453
4428
  node: {},
4454
4429
  isSelected: { type: Boolean },
4455
- shouldShowConsumedTokens: { type: Boolean }
4430
+ shouldShowConsumedTokens: { type: Boolean },
4431
+ isCompact: { type: Boolean }
4456
4432
  },
4457
- emits: ["toggleExpanded"],
4433
+ emits: ["toggleExpanded", "triggerPartialExecution", "openNdv"],
4458
4434
  setup(__props, { emit: __emit }) {
4459
4435
  const props = __props;
4460
4436
  const emit = __emit;
@@ -4467,28 +4443,18 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4467
4443
  );
4468
4444
  const type = computed(() => node.value ? nodeTypeStore.getNodeType(node.value.type) : void 0);
4469
4445
  const depth = computed(() => (props.node.level ?? 1) - 1);
4470
- const timeTookText = computed(() => {
4471
- const finalStatuses = ["crashed", "error", "success"];
4472
- const status = runData.value?.executionStatus;
4473
- if (!status) {
4474
- return "";
4475
- }
4476
- const statusText = upperFirst(status);
4477
- return finalStatuses.includes(status) ? locale.baseText("logs.overview.body.summaryText", {
4446
+ const isSettled = computed(
4447
+ () => runData.value?.executionStatus && ["crashed", "error", "success"].includes(runData.value.executionStatus)
4448
+ );
4449
+ const isError = computed(() => !!runData.value?.error);
4450
+ const startedAtText = computed(() => {
4451
+ const time = new Date(runData.value?.startTime ?? 0);
4452
+ return locale.baseText("logs.overview.body.started", {
4478
4453
  interpolate: {
4479
- status: statusText,
4480
- time: locale.displayTimer(runData.value.executionTime, true)
4454
+ time: `${toTime(time, true)}, ${toDayMonth(time)}`
4481
4455
  }
4482
- }) : statusText;
4456
+ });
4483
4457
  });
4484
- const startedAtText = computed(
4485
- () => locale.baseText("logs.overview.body.started", {
4486
- interpolate: {
4487
- time: new Date(runData.value?.startTime ?? 0).toISOString()
4488
- // TODO: confirm date format
4489
- }
4490
- })
4491
- );
4492
4458
  const subtreeConsumedTokens = computed(
4493
4459
  () => props.shouldShowConsumedTokens ? getSubtreeTotalConsumedTokens(props.data) : void 0
4494
4460
  );
@@ -4503,10 +4469,15 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4503
4469
  return data === siblings[siblings.length - 1];
4504
4470
  }
4505
4471
  return (_ctx, _cache) => {
4506
- const _component_NodeIcon = _sfc_main$i;
4472
+ const _component_NodeIcon = _sfc_main$k;
4507
4473
  return node.value !== void 0 ? (openBlock(), createElementBlock("div", {
4508
4474
  key: 0,
4509
- class: normalizeClass({ [_ctx.$style.container]: true, [_ctx.$style.selected]: props.isSelected })
4475
+ class: normalizeClass({
4476
+ [_ctx.$style.container]: true,
4477
+ [_ctx.$style.compact]: props.isCompact,
4478
+ [_ctx.$style.error]: isError.value,
4479
+ [_ctx.$style.selected]: props.isSelected
4480
+ })
4510
4481
  }, [
4511
4482
  (openBlock(true), createElementBlock(Fragment, null, renderList(depth.value, (level) => {
4512
4483
  return openBlock(), createElementBlock("div", {
@@ -4518,6 +4489,10 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4518
4489
  })
4519
4490
  }, null, 2);
4520
4491
  }), 128)),
4492
+ createBaseVNode("div", {
4493
+ class: normalizeClass(_ctx.$style.background),
4494
+ style: normalizeStyle({ "--indent-depth": depth.value })
4495
+ }, null, 6),
4521
4496
  createVNode(_component_NodeIcon, {
4522
4497
  "node-type": type.value,
4523
4498
  size: 16,
@@ -4527,13 +4502,14 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4527
4502
  tag: "div",
4528
4503
  bold: true,
4529
4504
  size: "small",
4530
- class: normalizeClass(_ctx.$style.name)
4505
+ class: normalizeClass(_ctx.$style.name),
4506
+ color: isError.value ? "danger" : void 0
4531
4507
  }, {
4532
4508
  default: withCtx(() => [
4533
4509
  createTextVNode(toDisplayString(node.value.name), 1)
4534
4510
  ]),
4535
4511
  _: 1
4536
- }, 8, ["class"]),
4512
+ }, 8, ["class", "color"]),
4537
4513
  createVNode(unref(N8nText), {
4538
4514
  tag: "div",
4539
4515
  color: "text-light",
@@ -4541,7 +4517,36 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4541
4517
  class: normalizeClass(_ctx.$style.timeTook)
4542
4518
  }, {
4543
4519
  default: withCtx(() => [
4544
- createTextVNode(toDisplayString(timeTookText.value), 1)
4520
+ isSettled.value && runData.value ? (openBlock(), createBlock(unref(I18nT), {
4521
+ key: 0,
4522
+ keypath: "logs.overview.body.summaryText"
4523
+ }, {
4524
+ status: withCtx(() => [
4525
+ isError.value ? (openBlock(), createBlock(unref(N8nText), {
4526
+ key: 0,
4527
+ color: "danger",
4528
+ bold: true,
4529
+ size: "small"
4530
+ }, {
4531
+ default: withCtx(() => [
4532
+ createVNode(unref(N8nIcon), {
4533
+ icon: "exclamation-triangle",
4534
+ class: normalizeClass(_ctx.$style.errorIcon)
4535
+ }, null, 8, ["class"]),
4536
+ createTextVNode(toDisplayString(unref(upperFirst)(runData.value.executionStatus)), 1)
4537
+ ]),
4538
+ _: 1
4539
+ })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
4540
+ createTextVNode(toDisplayString(unref(upperFirst)(runData.value.executionStatus)), 1)
4541
+ ], 64))
4542
+ ]),
4543
+ time: withCtx(() => [
4544
+ createTextVNode(toDisplayString(unref(locale).displayTimer(runData.value.executionTime, true)), 1)
4545
+ ]),
4546
+ _: 1
4547
+ })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
4548
+ createTextVNode(toDisplayString(unref(upperFirst)(runData.value?.executionStatus)), 1)
4549
+ ], 64))
4545
4550
  ]),
4546
4551
  _: 1
4547
4552
  }, 8, ["class"]),
@@ -4564,71 +4569,124 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4564
4569
  class: normalizeClass(_ctx.$style.consumedTokens)
4565
4570
  }, {
4566
4571
  default: withCtx(() => [
4567
- subtreeConsumedTokens.value.totalTokens > 0 && (props.data.children.length === 0 || !props.node.expanded) ? (openBlock(), createBlock(_sfc_main$4, {
4572
+ subtreeConsumedTokens.value.totalTokens > 0 && (props.data.children.length === 0 || !props.node.expanded) ? (openBlock(), createBlock(_sfc_main$6, {
4568
4573
  key: 0,
4569
4574
  "consumed-tokens": subtreeConsumedTokens.value
4570
4575
  }, null, 8, ["consumed-tokens"])) : createCommentVNode("", true)
4571
4576
  ]),
4572
4577
  _: 1
4573
4578
  }, 8, ["class"])) : createCommentVNode("", true),
4574
- createBaseVNode("div", null, [
4575
- createVNode(unref(_sfc_main$g), {
4576
- type: "secondary",
4577
- size: "medium",
4578
- icon: props.node.expanded ? "chevron-down" : "chevron-up",
4579
- style: normalizeStyle({
4580
- visibility: props.data.children.length === 0 ? "hidden" : "",
4581
- color: "var(--color-text-base)"
4582
- // give higher specificity than the style from the component itself
4583
- }),
4584
- class: normalizeClass(_ctx.$style.toggleButton),
4585
- onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("toggleExpanded", props.node), ["stop"]))
4586
- }, null, 8, ["icon", "style", "class"])
4587
- ])
4579
+ isError.value && _ctx.isCompact ? (openBlock(), createBlock(unref(N8nIcon), {
4580
+ key: 1,
4581
+ size: "medium",
4582
+ color: "danger",
4583
+ icon: "exclamation-triangle",
4584
+ class: normalizeClass(_ctx.$style.compactErrorIcon)
4585
+ }, null, 8, ["class"])) : createCommentVNode("", true),
4586
+ createVNode(unref(_sfc_main$i), {
4587
+ type: "secondary",
4588
+ size: "small",
4589
+ icon: "play",
4590
+ style: { "color": "var(--color-text-base)" },
4591
+ "aria-label": unref(locale).baseText("logs.overview.body.run"),
4592
+ class: normalizeClass([_ctx.$style.partialExecutionButton, depth.value > 0 ? _ctx.$style.unavailable : ""]),
4593
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("triggerPartialExecution", props.data), ["stop"]))
4594
+ }, null, 8, ["aria-label", "class"]),
4595
+ createVNode(unref(_sfc_main$i), {
4596
+ type: "secondary",
4597
+ size: "small",
4598
+ icon: "external-link-alt",
4599
+ style: { "color": "var(--color-text-base)" },
4600
+ class: normalizeClass(_ctx.$style.openNdvButton),
4601
+ "aria-label": unref(locale).baseText("logs.overview.body.open"),
4602
+ onClick: _cache[1] || (_cache[1] = withModifiers(($event) => emit("openNdv", props.data), ["stop"]))
4603
+ }, null, 8, ["class", "aria-label"]),
4604
+ !_ctx.isCompact || props.data.children.length > 0 ? (openBlock(), createBlock(unref(N8nButton), {
4605
+ key: 2,
4606
+ type: "secondary",
4607
+ size: "small",
4608
+ square: true,
4609
+ style: normalizeStyle({
4610
+ visibility: props.data.children.length === 0 ? "hidden" : "",
4611
+ color: "var(--color-text-base)"
4612
+ // give higher specificity than the style from the component itself
4613
+ }),
4614
+ class: normalizeClass(_ctx.$style.toggleButton),
4615
+ "aria-label": unref(locale).baseText("logs.overview.body.toggleRow"),
4616
+ onClick: _cache[2] || (_cache[2] = withModifiers(($event) => emit("toggleExpanded", props.node), ["stop"]))
4617
+ }, {
4618
+ default: withCtx(() => [
4619
+ createVNode(unref(N8nIcon), {
4620
+ size: "medium",
4621
+ icon: props.node.expanded ? "chevron-down" : "chevron-up"
4622
+ }, null, 8, ["icon"])
4623
+ ]),
4624
+ _: 1
4625
+ }, 8, ["style", "class", "aria-label"])) : createCommentVNode("", true)
4588
4626
  ], 2)) : createCommentVNode("", true);
4589
4627
  };
4590
4628
  }
4591
4629
  });
4592
- const container$2 = "_container_16ks1_123";
4593
- const toggleButton = "_toggleButton_16ks1_135";
4594
- const icon = "_icon_16ks1_141";
4595
- const selected = "_selected_16ks1_149";
4596
- const indent = "_indent_16ks1_149";
4597
- const connectorCurved = "_connectorCurved_16ks1_161";
4598
- const connectorStraight = "_connectorStraight_16ks1_171";
4599
- const name = "_name_16ks1_185";
4600
- const timeTook = "_timeTook_16ks1_190";
4601
- const startedAt = "_startedAt_16ks1_196";
4602
- const consumedTokens = "_consumedTokens_16ks1_202";
4603
- const style0$2 = {
4604
- container: container$2,
4605
- toggleButton,
4606
- icon,
4630
+ const container$3 = "_container_1jepl_123";
4631
+ const background = "_background_1jepl_140";
4632
+ const selected = "_selected_1jepl_149";
4633
+ const error = "_error_1jepl_152";
4634
+ const indent = "_indent_1jepl_156";
4635
+ const connectorCurved = "_connectorCurved_1jepl_165";
4636
+ const connectorStraight = "_connectorStraight_1jepl_175";
4637
+ const icon = "_icon_1jepl_184";
4638
+ const name = "_name_1jepl_190";
4639
+ const timeTook = "_timeTook_1jepl_195";
4640
+ const errorIcon = "_errorIcon_1jepl_200";
4641
+ const compact = "_compact_1jepl_204";
4642
+ const startedAt = "_startedAt_1jepl_211";
4643
+ const consumedTokens = "_consumedTokens_1jepl_220";
4644
+ const compactErrorIcon = "_compactErrorIcon_1jepl_233";
4645
+ const partialExecutionButton = "_partialExecutionButton_1jepl_241";
4646
+ const openNdvButton = "_openNdvButton_1jepl_242";
4647
+ const unavailable = "_unavailable_1jepl_252";
4648
+ const toggleButton = "_toggleButton_1jepl_260";
4649
+ const style0$3 = {
4650
+ container: container$3,
4651
+ background,
4607
4652
  selected,
4653
+ error,
4608
4654
  indent,
4609
4655
  connectorCurved,
4610
4656
  connectorStraight,
4657
+ icon,
4611
4658
  name,
4612
4659
  timeTook,
4660
+ errorIcon,
4661
+ compact,
4613
4662
  startedAt,
4614
- consumedTokens
4663
+ consumedTokens,
4664
+ compactErrorIcon,
4665
+ partialExecutionButton,
4666
+ openNdvButton,
4667
+ unavailable,
4668
+ toggleButton
4615
4669
  };
4616
- const cssModules$2 = {
4617
- "$style": style0$2
4670
+ const cssModules$3 = {
4671
+ "$style": style0$3
4618
4672
  };
4619
- const __unplugin_components_0 = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__cssModules", cssModules$2]]);
4620
- const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4673
+ const LogsOverviewRow = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__cssModules", cssModules$3]]);
4674
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4621
4675
  __name: "LogsOverviewPanel",
4622
4676
  props: {
4623
4677
  isOpen: { type: Boolean },
4624
- node: {}
4678
+ node: {},
4679
+ selected: {}
4625
4680
  },
4626
- emits: ["clickHeader"],
4681
+ emits: ["clickHeader", "select"],
4627
4682
  setup(__props, { emit: __emit }) {
4628
4683
  const emit = __emit;
4629
4684
  const locale = useI18n$1();
4630
4685
  const telemetry = useTelemetry();
4631
4686
  const workflowsStore = useWorkflowsStore();
4687
+ const router = useRouter();
4688
+ const runWorkflow = useRunWorkflow({ router });
4689
+ const ndvStore = useNDVStore();
4632
4690
  const nodeHelpers = useNodeHelpers();
4633
4691
  const isClearExecutionButtonVisible = useClearExecutionButtonVisible();
4634
4692
  const workflow = computed(() => workflowsStore.getCurrentWorkflow());
@@ -4665,17 +4723,16 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4665
4723
  const consumedTokens2 = computed(
4666
4724
  () => getTotalConsumedTokens(...executionTree.value.map(getSubtreeTotalConsumedTokens))
4667
4725
  );
4668
- const selectedRun = ref(void 0);
4669
4726
  function onClearExecutionData() {
4670
4727
  workflowsStore.setWorkflowExecutionData(null);
4671
4728
  nodeHelpers.updateNodesExecutionIssues();
4672
4729
  }
4673
4730
  function handleClickNode(clicked) {
4674
- if (selectedRun.value?.node === clicked.node && selectedRun.value.runIndex === clicked.runIndex) {
4675
- selectedRun.value = void 0;
4731
+ if (__props.selected?.node === clicked.node && __props.selected.runIndex === clicked.runIndex) {
4732
+ emit("select", void 0);
4676
4733
  return;
4677
4734
  }
4678
- selectedRun.value = { node: clicked.node, runIndex: clicked.runIndex };
4735
+ emit("select", { node: clicked.node, runIndex: clicked.runIndex });
4679
4736
  telemetry.track("User selected node in log view", {
4680
4737
  node_type: workflowsStore.nodesByName[clicked.node].type,
4681
4738
  node_id: workflowsStore.nodesByName[clicked.node].id,
@@ -4683,16 +4740,29 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4683
4740
  workflow_id: workflow.value.id
4684
4741
  });
4685
4742
  }
4743
+ function handleSwitchView(value) {
4744
+ emit(
4745
+ "select",
4746
+ value === "overview" || executionTree.value.length === 0 ? void 0 : executionTree.value[0]
4747
+ );
4748
+ }
4686
4749
  function handleToggleExpanded(treeNode) {
4687
4750
  treeNode.expanded = !treeNode.expanded;
4688
4751
  }
4752
+ async function handleOpenNdv(treeNode) {
4753
+ ndvStore.setActiveNodeName(treeNode.node);
4754
+ }
4755
+ async function handleTriggerPartialExecution(treeNode) {
4756
+ await runWorkflow.runWorkflow({ destinationNode: treeNode.node });
4757
+ }
4689
4758
  return (_ctx, _cache) => {
4690
- const _component_LogsOverviewRow = __unplugin_components_0;
4691
4759
  return openBlock(), createElementBlock("div", {
4692
- class: normalizeClass(_ctx.$style.container)
4760
+ class: normalizeClass(_ctx.$style.container),
4761
+ "data-test-id": "logs-overview"
4693
4762
  }, [
4694
4763
  createVNode(PanelHeader, {
4695
4764
  title: unref(locale).baseText("logs.overview.header.title"),
4765
+ "data-test-id": "logs-overview-header",
4696
4766
  onClick: _cache[0] || (_cache[0] = ($event) => emit("clickHeader"))
4697
4767
  }, {
4698
4768
  actions: withCtx(() => [
@@ -4722,14 +4792,16 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4722
4792
  }, 8, ["title"]),
4723
4793
  _ctx.isOpen ? (openBlock(), createElementBlock("div", {
4724
4794
  key: 0,
4725
- class: normalizeClass([_ctx.$style.content, isEmpty2.value ? _ctx.$style.empty : ""])
4795
+ class: normalizeClass([_ctx.$style.content, isEmpty2.value ? _ctx.$style.empty : ""]),
4796
+ "data-test-id": "logs-overview-body"
4726
4797
  }, [
4727
4798
  isEmpty2.value ? (openBlock(), createBlock(unref(N8nText), {
4728
4799
  key: 0,
4729
4800
  tag: "p",
4730
4801
  size: "medium",
4731
4802
  color: "text-base",
4732
- class: normalizeClass(_ctx.$style.emptyText)
4803
+ class: normalizeClass(_ctx.$style.emptyText),
4804
+ "data-test-id": "logs-overview-empty"
4733
4805
  }, {
4734
4806
  default: withCtx(() => [
4735
4807
  createTextVNode(toDisplayString(unref(locale).baseText("logs.overview.body.empty.message")), 1)
@@ -4748,7 +4820,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4748
4820
  }, {
4749
4821
  default: withCtx(() => [
4750
4822
  createBaseVNode("span", null, toDisplayString(executionStatusText.value), 1),
4751
- consumedTokens2.value.totalTokens > 0 ? (openBlock(), createBlock(_sfc_main$4, {
4823
+ consumedTokens2.value.totalTokens > 0 ? (openBlock(), createBlock(_sfc_main$6, {
4752
4824
  key: 0,
4753
4825
  "consumed-tokens": consumedTokens2.value
4754
4826
  }, null, 8, ["consumed-tokens"])) : createCommentVNode("", true)
@@ -4757,6 +4829,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4757
4829
  }, 8, ["class"])) : createCommentVNode("", true),
4758
4830
  executionTree.value.length > 0 ? (openBlock(), createBlock(unref(ElTree), {
4759
4831
  key: 1,
4832
+ "node-key": "id",
4760
4833
  class: normalizeClass(_ctx.$style.tree),
4761
4834
  indent: 0,
4762
4835
  data: executionTree.value,
@@ -4765,21 +4838,25 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4765
4838
  onNodeClick: handleClickNode
4766
4839
  }, {
4767
4840
  default: withCtx(({ node: elTreeNode, data }) => [
4768
- createVNode(_component_LogsOverviewRow, {
4841
+ createVNode(LogsOverviewRow, {
4769
4842
  data,
4770
4843
  node: elTreeNode,
4771
- "is-selected": data.node === selectedRun.value?.node && data.runIndex === selectedRun.value?.runIndex,
4844
+ "is-selected": data.node === _ctx.selected?.node && data.runIndex === _ctx.selected?.runIndex,
4845
+ "is-compact": _ctx.selected !== void 0,
4772
4846
  "should-show-consumed-tokens": consumedTokens2.value.totalTokens > 0,
4773
- onToggleExpanded: handleToggleExpanded
4774
- }, null, 8, ["data", "node", "is-selected", "should-show-consumed-tokens"])
4847
+ onToggleExpanded: handleToggleExpanded,
4848
+ onOpenNdv: handleOpenNdv,
4849
+ onTriggerPartialExecution: handleTriggerPartialExecution
4850
+ }, null, 8, ["data", "node", "is-selected", "is-compact", "should-show-consumed-tokens"])
4775
4851
  ]),
4776
4852
  _: 1
4777
4853
  }, 8, ["class", "data"])) : createCommentVNode("", true),
4778
4854
  createVNode(unref(N8nRadioButtons), {
4779
4855
  size: "medium",
4780
4856
  class: normalizeClass(_ctx.$style.switchViewButtons),
4781
- "model-value": selectedRun.value ? "details" : "overview",
4782
- options: switchViewOptions.value
4857
+ "model-value": _ctx.selected ? "details" : "overview",
4858
+ options: switchViewOptions.value,
4859
+ "onUpdate:modelValue": handleSwitchView
4783
4860
  }, null, 8, ["class", "model-value", "options"])
4784
4861
  ], 2))
4785
4862
  ], 2)) : createCommentVNode("", true)
@@ -4787,17 +4864,17 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4787
4864
  };
4788
4865
  }
4789
4866
  });
4790
- const container$1 = "_container_ok07h_123";
4791
- const content = "_content_ok07h_132";
4792
- const empty = "_empty_ok07h_141";
4793
- const emptyText = "_emptyText_ok07h_146";
4794
- const scrollable = "_scrollable_ok07h_151";
4795
- const summary = "_summary_ok07h_158";
4796
- const tree = "_tree_ok07h_170";
4797
- const switchViewButtons = "_switchViewButtons_ok07h_177";
4798
- const style0$1 = {
4799
- container: container$1,
4800
- content,
4867
+ const container$2 = "_container_1xpvq_123";
4868
+ const content$1 = "_content_1xpvq_133";
4869
+ const empty = "_empty_1xpvq_142";
4870
+ const emptyText = "_emptyText_1xpvq_147";
4871
+ const scrollable = "_scrollable_1xpvq_152";
4872
+ const summary = "_summary_1xpvq_159";
4873
+ const tree = "_tree_1xpvq_171";
4874
+ const switchViewButtons = "_switchViewButtons_1xpvq_178";
4875
+ const style0$2 = {
4876
+ container: container$2,
4877
+ content: content$1,
4801
4878
  empty,
4802
4879
  emptyText,
4803
4880
  scrollable,
@@ -4805,17 +4882,119 @@ const style0$1 = {
4805
4882
  tree,
4806
4883
  switchViewButtons
4807
4884
  };
4885
+ const cssModules$2 = {
4886
+ "$style": style0$2
4887
+ };
4888
+ const LogsOverviewPanel = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__cssModules", cssModules$2]]);
4889
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4890
+ __name: "LogDetailsPanel",
4891
+ props: {
4892
+ isOpen: { type: Boolean }
4893
+ },
4894
+ emits: ["clickHeader"],
4895
+ setup(__props, { emit: __emit }) {
4896
+ const emit = __emit;
4897
+ return (_ctx, _cache) => {
4898
+ return openBlock(), createElementBlock("div", {
4899
+ class: normalizeClass(_ctx.$style.container),
4900
+ "data-test-id": "log-details"
4901
+ }, [
4902
+ createVNode(PanelHeader, {
4903
+ title: "Log details",
4904
+ "data-test-id": "logs-details-header",
4905
+ onClick: _cache[0] || (_cache[0] = ($event) => emit("clickHeader"))
4906
+ }, {
4907
+ actions: withCtx(() => [
4908
+ renderSlot(_ctx.$slots, "actions")
4909
+ ]),
4910
+ _: 3
4911
+ }),
4912
+ _ctx.isOpen ? (openBlock(), createElementBlock("div", {
4913
+ key: 0,
4914
+ class: normalizeClass(_ctx.$style.content),
4915
+ "data-test-id": "logs-details-body"
4916
+ }, null, 2)) : createCommentVNode("", true)
4917
+ ], 2);
4918
+ };
4919
+ }
4920
+ });
4921
+ const container$1 = "_container_q8l5j_123";
4922
+ const content = "_content_q8l5j_133";
4923
+ const style0$1 = {
4924
+ container: container$1,
4925
+ content
4926
+ };
4808
4927
  const cssModules$1 = {
4809
4928
  "$style": style0$1
4810
4929
  };
4811
- const LogsOverviewPanel = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__cssModules", cssModules$1]]);
4930
+ const LogsDetailsPanel = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__cssModules", cssModules$1]]);
4931
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4932
+ __name: "LogsPanelActions",
4933
+ props: {
4934
+ panelState: {},
4935
+ showPopOutButton: { type: Boolean }
4936
+ },
4937
+ emits: ["popOut", "toggleOpen"],
4938
+ setup(__props, { emit: __emit }) {
4939
+ const emit = __emit;
4940
+ const appStyles = useStyles();
4941
+ const locales = useI18n$1();
4942
+ const tooltipZIndex = computed(() => appStyles.APP_Z_INDEXES.ASK_ASSISTANT_FLOATING_BUTTON + 100);
4943
+ const popOutButtonText = computed(() => locales.baseText("runData.panel.actions.popOut"));
4944
+ const toggleButtonText = computed(
4945
+ () => locales.baseText(
4946
+ __props.panelState === LOGS_PANEL_STATE.ATTACHED ? "runData.panel.actions.collapse" : "runData.panel.actions.open"
4947
+ )
4948
+ );
4949
+ return (_ctx, _cache) => {
4950
+ return openBlock(), createElementBlock("div", null, [
4951
+ _ctx.showPopOutButton ? (openBlock(), createBlock(unref(N8nTooltip), {
4952
+ key: 0,
4953
+ "z-index": tooltipZIndex.value,
4954
+ content: popOutButtonText.value
4955
+ }, {
4956
+ default: withCtx(() => [
4957
+ createVNode(unref(_sfc_main$i), {
4958
+ icon: "pop-out",
4959
+ type: "secondary",
4960
+ size: "small",
4961
+ "icon-size": "medium",
4962
+ "aria-label": popOutButtonText.value,
4963
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("popOut"), ["stop"]))
4964
+ }, null, 8, ["aria-label"])
4965
+ ]),
4966
+ _: 1
4967
+ }, 8, ["z-index", "content"])) : createCommentVNode("", true),
4968
+ _ctx.panelState !== unref(LOGS_PANEL_STATE).FLOATING ? (openBlock(), createBlock(unref(N8nTooltip), {
4969
+ key: 1,
4970
+ "z-index": tooltipZIndex.value,
4971
+ content: toggleButtonText.value
4972
+ }, {
4973
+ default: withCtx(() => [
4974
+ createVNode(unref(_sfc_main$i), {
4975
+ type: "secondary",
4976
+ size: "small",
4977
+ "icon-size": "medium",
4978
+ icon: _ctx.panelState === unref(LOGS_PANEL_STATE).ATTACHED ? "chevron-down" : "chevron-up",
4979
+ "aria-label": toggleButtonText.value,
4980
+ style: { "color": "var(--color-text-base)" },
4981
+ onClick: _cache[1] || (_cache[1] = withModifiers(($event) => emit("toggleOpen"), ["stop"]))
4982
+ }, null, 8, ["icon", "aria-label"])
4983
+ ]),
4984
+ _: 1
4985
+ }, 8, ["z-index", "content"])) : createCommentVNode("", true)
4986
+ ]);
4987
+ };
4988
+ }
4989
+ });
4812
4990
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
4813
4991
  __name: "LogsPanel",
4814
4992
  setup(__props) {
4815
4993
  const workflowsStore = useWorkflowsStore();
4816
4994
  const canvasStore = useCanvasStore();
4817
- const panelState = computed(() => workflowsStore.chatPanelState);
4995
+ const panelState = computed(() => workflowsStore.logsPanelState);
4818
4996
  const container2 = ref();
4997
+ const selectedLogEntry = ref(void 0);
4819
4998
  const pipContainer = useTemplateRef("pipContainer");
4820
4999
  const pipContent2 = useTemplateRef("pipContent");
4821
5000
  const previousChatMessages = computed(() => workflowsStore.getPastChatMessages);
@@ -4824,48 +5003,53 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
4824
5003
  (node) => [CHAT_TRIGGER_NODE_TYPE$1, MANUAL_CHAT_TRIGGER_NODE_TYPE].includes(node.type)
4825
5004
  )
4826
5005
  );
4827
- const locales = useI18n$1();
4828
5006
  const telemetry = useTelemetry();
4829
5007
  const { rootStyles, height, chatWidth, onWindowResize, onResizeDebounced, onResizeChatDebounced } = useResize(container2);
4830
5008
  const { currentSessionId, messages: messages2, connectedNode, sendMessage, refreshSession, displayExecution } = useChatState(ref(false), onWindowResize);
4831
- const appStyles = useStyles();
4832
- const tooltipZIndex = computed(() => appStyles.APP_Z_INDEXES.ASK_ASSISTANT_FLOATING_BUTTON + 100);
5009
+ const isLogDetailsOpen = computed(() => selectedLogEntry.value !== void 0);
4833
5010
  const { canPopOut, isPoppedOut, pipWindow } = usePiPWindow({
4834
5011
  initialHeight: 400,
4835
5012
  initialWidth: window.document.body.offsetWidth * 0.8,
4836
5013
  container: pipContainer,
4837
5014
  content: pipContent2,
4838
- shouldPopOut: computed(() => panelState.value === "floating"),
5015
+ shouldPopOut: computed(() => panelState.value === LOGS_PANEL_STATE.FLOATING),
4839
5016
  onRequestClose: () => {
4840
- if (panelState.value === "closed") {
5017
+ if (panelState.value === LOGS_PANEL_STATE.CLOSED) {
4841
5018
  return;
4842
5019
  }
4843
5020
  telemetry.track("User toggled log view", { new_state: "attached" });
4844
- workflowsStore.setPanelState("attached");
5021
+ workflowsStore.setPreferPoppedOutLogsView(false);
4845
5022
  }
4846
5023
  });
4847
- function handleToggleOpen() {
4848
- if (panelState.value === "closed") {
4849
- telemetry.track("User toggled log view", { new_state: "attached" });
4850
- workflowsStore.setPanelState("attached");
4851
- } else {
4852
- telemetry.track("User toggled log view", { new_state: "collapsed" });
4853
- workflowsStore.setPanelState("closed");
4854
- }
5024
+ const logsPanelActionsProps = computed(() => ({
5025
+ panelState: panelState.value,
5026
+ showPopOutButton: canPopOut.value && !isPoppedOut.value,
5027
+ onPopOut,
5028
+ onToggleOpen
5029
+ }));
5030
+ function onToggleOpen() {
5031
+ workflowsStore.toggleLogsPanelOpen();
5032
+ telemetry.track("User toggled log view", {
5033
+ new_state: panelState.value === LOGS_PANEL_STATE.CLOSED ? "attached" : "collapsed"
5034
+ });
4855
5035
  }
4856
5036
  function handleClickHeader() {
4857
- if (panelState.value === "closed") {
5037
+ if (panelState.value === LOGS_PANEL_STATE.CLOSED) {
4858
5038
  telemetry.track("User toggled log view", { new_state: "attached" });
4859
- workflowsStore.setPanelState("attached");
5039
+ workflowsStore.toggleLogsPanelOpen(true);
4860
5040
  }
4861
5041
  }
5042
+ function handleSelectLogEntry(selected2) {
5043
+ selectedLogEntry.value = selected2;
5044
+ }
4862
5045
  function onPopOut() {
4863
5046
  telemetry.track("User toggled log view", { new_state: "floating" });
4864
- workflowsStore.setPanelState("floating");
5047
+ workflowsStore.toggleLogsPanelOpen(true);
5048
+ workflowsStore.setPreferPoppedOutLogsView(true);
4865
5049
  }
4866
5050
  watch([panelState, height], ([state, h]) => {
4867
5051
  canvasStore.setPanelHeight(
4868
- state === "floating" ? 0 : state === "attached" ? h : 32
5052
+ state === LOGS_PANEL_STATE.FLOATING ? 0 : state === LOGS_PANEL_STATE.ATTACHED ? h : 32
4869
5053
  );
4870
5054
  });
4871
5055
  return (_ctx, _cache) => {
@@ -4881,9 +5065,9 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
4881
5065
  createVNode(unref(N8nResizeWrapper), {
4882
5066
  height: unref(height),
4883
5067
  "supported-directions": ["top"],
4884
- "is-resizing-enabled": panelState.value === "attached",
5068
+ "is-resizing-enabled": panelState.value === unref(LOGS_PANEL_STATE).ATTACHED,
4885
5069
  style: normalizeStyle(unref(rootStyles)),
4886
- class: normalizeClass([_ctx.$style.resizeWrapper, panelState.value === "closed" ? "" : _ctx.$style.isOpen]),
5070
+ class: normalizeClass([_ctx.$style.resizeWrapper, panelState.value === unref(LOGS_PANEL_STATE).CLOSED ? "" : _ctx.$style.isOpen]),
4887
5071
  onResize: unref(onResizeDebounced)
4888
5072
  }, {
4889
5073
  default: withCtx(() => [
@@ -4896,7 +5080,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
4896
5080
  hasChat.value ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
4897
5081
  key: 0,
4898
5082
  "supported-directions": ["right"],
4899
- "is-resizing-enabled": panelState.value !== "closed",
5083
+ "is-resizing-enabled": panelState.value !== unref(LOGS_PANEL_STATE).CLOSED,
4900
5084
  width: unref(chatWidth),
4901
5085
  class: normalizeClass(_ctx.$style.chat),
4902
5086
  window: unref(pipWindow),
@@ -4905,13 +5089,13 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
4905
5089
  default: withCtx(() => [
4906
5090
  createVNode(ChatMessagesPanel, {
4907
5091
  "data-test-id": "canvas-chat",
4908
- "is-open": panelState.value !== "closed",
5092
+ "is-open": panelState.value !== unref(LOGS_PANEL_STATE).CLOSED,
4909
5093
  messages: unref(messages2),
4910
5094
  "session-id": unref(currentSessionId),
4911
5095
  "past-chat-messages": previousChatMessages.value,
4912
5096
  "show-close-button": false,
4913
5097
  "is-new-logs-enabled": true,
4914
- onClose: handleToggleOpen,
5098
+ onClose: onToggleOpen,
4915
5099
  onRefreshSession: unref(refreshSession),
4916
5100
  onDisplayExecution: unref(displayExecution),
4917
5101
  onSendMessage: unref(sendMessage),
@@ -4921,49 +5105,29 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
4921
5105
  _: 1
4922
5106
  }, 8, ["is-resizing-enabled", "width", "class", "window", "onResize"])) : createCommentVNode("", true),
4923
5107
  createVNode(LogsOverviewPanel, {
4924
- "is-open": panelState.value !== "closed",
5108
+ class: normalizeClass(_ctx.$style.logsOverview),
5109
+ "is-open": panelState.value !== unref(LOGS_PANEL_STATE).CLOSED,
4925
5110
  node: unref(connectedNode),
5111
+ selected: selectedLogEntry.value,
5112
+ onClickHeader: handleClickHeader,
5113
+ onSelect: handleSelectLogEntry
5114
+ }, {
5115
+ actions: withCtx(() => [
5116
+ !isLogDetailsOpen.value ? (openBlock(), createBlock(_sfc_main$2, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5117
+ ]),
5118
+ _: 1
5119
+ }, 8, ["class", "is-open", "node", "selected"]),
5120
+ selectedLogEntry.value ? (openBlock(), createBlock(LogsDetailsPanel, {
5121
+ key: 1,
5122
+ class: normalizeClass(_ctx.$style.logDetails),
5123
+ "is-open": panelState.value !== unref(LOGS_PANEL_STATE).CLOSED,
4926
5124
  onClickHeader: handleClickHeader
4927
5125
  }, {
4928
5126
  actions: withCtx(() => [
4929
- unref(canPopOut) && !unref(isPoppedOut) ? (openBlock(), createBlock(unref(N8nTooltip), {
4930
- key: 0,
4931
- "z-index": tooltipZIndex.value,
4932
- content: unref(locales).baseText("runData.panel.actions.popOut")
4933
- }, {
4934
- default: withCtx(() => [
4935
- createVNode(unref(_sfc_main$g), {
4936
- icon: "pop-out",
4937
- type: "secondary",
4938
- size: "small",
4939
- "icon-size": "medium",
4940
- onClick: onPopOut
4941
- })
4942
- ]),
4943
- _: 1
4944
- }, 8, ["z-index", "content"])) : createCommentVNode("", true),
4945
- panelState.value !== "floating" ? (openBlock(), createBlock(unref(N8nTooltip), {
4946
- key: 1,
4947
- "z-index": tooltipZIndex.value,
4948
- content: unref(locales).baseText(
4949
- panelState.value === "attached" ? "runData.panel.actions.collapse" : "runData.panel.actions.open"
4950
- )
4951
- }, {
4952
- default: withCtx(() => [
4953
- createVNode(unref(_sfc_main$g), {
4954
- type: "secondary",
4955
- size: "small",
4956
- "icon-size": "medium",
4957
- icon: panelState.value === "attached" ? "chevron-down" : "chevron-up",
4958
- style: { "color": "var(--color-text-base)" },
4959
- onClick: withModifiers(handleToggleOpen, ["stop"])
4960
- }, null, 8, ["icon"])
4961
- ]),
4962
- _: 1
4963
- }, 8, ["z-index", "content"])) : createCommentVNode("", true)
5127
+ isLogDetailsOpen.value ? (openBlock(), createBlock(_sfc_main$2, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
4964
5128
  ]),
4965
5129
  _: 1
4966
- }, 8, ["is-open", "node"])
5130
+ }, 8, ["class", "is-open"])) : createCommentVNode("", true)
4967
5131
  ], 2)
4968
5132
  ]),
4969
5133
  _: 1
@@ -4973,17 +5137,21 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
4973
5137
  };
4974
5138
  }
4975
5139
  });
4976
- const resizeWrapper = "_resizeWrapper_4rmz8_124";
4977
- const pipContent = "_pipContent_4rmz8_129";
4978
- const isOpen = "_isOpen_4rmz8_142";
4979
- const container = "_container_4rmz8_149";
4980
- const chat = "_chat_4rmz8_158";
5140
+ const resizeWrapper = "_resizeWrapper_1zlbj_124";
5141
+ const pipContent = "_pipContent_1zlbj_129";
5142
+ const isOpen = "_isOpen_1zlbj_142";
5143
+ const container = "_container_1zlbj_149";
5144
+ const chat = "_chat_1zlbj_158";
5145
+ const logsOverview = "_logsOverview_1zlbj_164";
5146
+ const logDetails = "_logDetails_1zlbj_171";
4981
5147
  const style0 = {
4982
5148
  resizeWrapper,
4983
5149
  pipContent,
4984
5150
  isOpen,
4985
5151
  container,
4986
- chat
5152
+ chat,
5153
+ logsOverview,
5154
+ logDetails
4987
5155
  };
4988
5156
  const cssModules = {
4989
5157
  "$style": style0
@@ -4994,7 +5162,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
4994
5162
  setup(__props) {
4995
5163
  const { isNewLogsEnabled } = useSettingsStore();
4996
5164
  return (_ctx, _cache) => {
4997
- const _component_CanvasChat = __unplugin_components_0$1;
5165
+ const _component_CanvasChat = __unplugin_components_0;
4998
5166
  return unref(isNewLogsEnabled) ? (openBlock(), createBlock(LogsPanel, { key: 0 })) : (openBlock(), createBlock(_component_CanvasChat, { key: 1 }));
4999
5167
  };
5000
5168
  }