n8n-editor-ui 1.89.1 → 1.90.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 (117) hide show
  1. package/dist/assets/{AnimatedSpinner-BpxWKaCw.js → AnimatedSpinner-ChThynSJ.js} +1 -1
  2. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-C2T62K8N.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-WGp2Kuen.js} +1 -1
  3. package/dist/assets/{AuthView-ChkPGgg-.js → AuthView-Dlhn_SQ-.js} +2 -2
  4. package/dist/assets/CanvasChatSwitch-BuBg7TJP.js +265 -0
  5. package/dist/assets/CanvasChatSwitch-CaiSjHFG.css +345 -0
  6. package/dist/assets/{ChangePasswordView-B38Kck9y.js → ChangePasswordView-BKYXOoDf.js} +3 -3
  7. package/dist/assets/CollectionParameter-CQXiWluX.js +4 -0
  8. package/dist/assets/{CredentialsView-DwxRSqpp.js → CredentialsView-BNWIgrLb.js} +6 -6
  9. package/dist/assets/DemoFooter-DR6r_2qR.js +25 -0
  10. package/dist/assets/{ErrorView-CbG0Uo6R.js → ErrorView-Bu8Mt5FH.js} +1 -1
  11. package/dist/assets/{ExecutionsTime-DZHUIJjP.css → ExecutionsTime-BuE0lHT6.css} +24 -15
  12. package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-TkWqVC7U.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-DvtOOOhh.js} +20 -15
  13. package/dist/assets/{ExecutionsView-Cm0glOsn.js → ExecutionsView-C0WZAIi0.js} +8 -8
  14. package/dist/assets/{FileSaver.min-DbOfV2ME.js → FileSaver.min-Cm0u4qyc.js} +1 -1
  15. package/dist/assets/{FixedCollectionParameter-DESxP1XH.js → FixedCollectionParameter-KmRZtBiP.js} +1 -1
  16. package/dist/assets/{ForgotMyPasswordView-Bhgql4BX.js → ForgotMyPasswordView-GH7SqEFu.js} +3 -3
  17. package/dist/assets/{InsightsChartAverageRuntime-B_W8xSC9.js → InsightsChartAverageRuntime-SeBUN06R.js} +4 -4
  18. package/dist/assets/{InsightsChartFailed-Buf2QmpB.js → InsightsChartFailed-TYjH8LwV.js} +4 -4
  19. package/dist/assets/{InsightsChartFailureRate-DHs26Nrr.js → InsightsChartFailureRate-D41Jv-6v.js} +4 -4
  20. package/dist/assets/{InsightsChartTimeSaved-Bjicuurm.js → InsightsChartTimeSaved-TLPDAmPx.js} +4 -4
  21. package/dist/assets/{InsightsChartTotal-BodC7Sun.js → InsightsChartTotal-CaKTe2mv.js} +4 -4
  22. package/dist/assets/{InsightsDashboard-CkipcaZC.js → InsightsDashboard-o3JS9fjz.js} +10 -10
  23. package/dist/assets/{InsightsPaywall-BoFT-Ik-.js → InsightsPaywall-Z4Y0nO-i.js} +1 -1
  24. package/dist/assets/{InsightsSummary-C-_stVav.js → InsightsSummary-DzYli0Pu.js} +1 -1
  25. package/dist/assets/{InsightsTableWorkflows-DvkAMkT2.js → InsightsTableWorkflows-CUHAG57c.js} +2 -2
  26. package/dist/assets/{Logo-DjpNa7ha.js → Logo-Dxp4M9dy.js} +1 -1
  27. package/dist/assets/{CanvasChatSwitch-BDVIAjN6.css → LogsPanel-DmPMCt9w.css} +425 -324
  28. package/dist/assets/{CanvasChatSwitch-B5IdrA6Q.js → LogsPanel-zIrTNE6j.js} +985 -641
  29. package/dist/assets/{MainHeader-BIrklbRX.js → MainHeader-D4cIIoUA.js} +9 -9
  30. package/dist/assets/{MainSidebar-QVA1U4KK.js → MainSidebar-BtW-9UPT.js} +2 -2
  31. package/dist/assets/{NodeCreation-BR_PsZYm.js → NodeCreation-thD32mA1.js} +4 -4
  32. package/dist/assets/{NodeCreator-BAsdokTf.js → NodeCreator-B4mHaU45.js} +3 -3
  33. package/dist/assets/{NodeDetailsView-B2kdGJ7R.css → NodeDetailsView-CGgV4Pn_.css} +27 -1185
  34. package/dist/assets/{NodeDetailsView-Ao8qCvow.js → NodeDetailsView-cO3Ci9jH.js} +169 -2683
  35. package/dist/assets/{NodeView-CY5L1Bmm.js → NodeView-E5b1ClVD.js} +12 -12
  36. package/dist/assets/{ProjectCardBadge-BiJ9Jmbm.js → ProjectCardBadge-LnLKqSK-.js} +5 -9
  37. package/dist/assets/{ProjectHeader-D42fsSzg.js → ProjectHeader-DC02ZuZ0.js} +1 -1
  38. package/dist/assets/{ProjectSettings-IPFHN7l5.js → ProjectSettings-Zr1UOp7s.js} +2 -2
  39. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-DOXKnjAX.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-CM7WIpD3.js} +1 -1
  40. package/dist/assets/{ResourcesListLayout-b44J07nq.css → ResourcesListLayout-CglK2dXR.css} +8 -8
  41. package/dist/assets/{ResourcesListLayout-B_Otf91D.js → ResourcesListLayout-DTsuHdYx.js} +2 -10
  42. package/dist/assets/RunData-DepHcD2K.css +1833 -0
  43. package/dist/assets/RunData-Ds-U68nr.js +5104 -0
  44. package/dist/assets/{RunDataAi-CUUDqZRP.css → RunDataAi-BF2gZZGr.css} +0 -408
  45. package/dist/assets/RunDataAi-DdK11EHU.js +750 -0
  46. package/dist/assets/{RunDataJson-BRO48N-i.js → RunDataJson-B2WU5od1.js} +7 -11
  47. package/dist/assets/{RunDataJsonActions-C4DFiOh8.js → RunDataJsonActions-DqZ2X1yJ.js} +1 -1
  48. package/dist/assets/{RunDataSearch-CNfhlvrK.js → RunDataSearch-CQsyZvGK.js} +1 -1
  49. package/dist/assets/{RunDataTable-DEgXQifj.js → RunDataTable-BO0R4JT_.js} +36 -30
  50. package/dist/assets/{RunDataTable-CX7gToH4.css → RunDataTable-DyUvXWfl.css} +47 -41
  51. package/dist/assets/{SamlOnboarding-D903XflA.js → SamlOnboarding-CmwMX5y2.js} +3 -3
  52. package/dist/assets/{SettingsApiView-DCMVAa53.js → SettingsApiView-D6uBbi9-.js} +5 -5
  53. package/dist/assets/{SettingsCommunityNodesView-BBuil15J.js → SettingsCommunityNodesView-CJODtx_K.js} +4 -4
  54. package/dist/assets/{SettingsExternalSecrets-CXRYGUXv.js → SettingsExternalSecrets-CVk14P_P.js} +1 -1
  55. package/dist/assets/{SettingsLdapView-DhoxhX3J.js → SettingsLdapView-pg71FErj.js} +1 -1
  56. package/dist/assets/{SettingsLogStreamingView-CxZag4Od.js → SettingsLogStreamingView-DUOI3Xb9.js} +1 -1
  57. package/dist/assets/{SettingsPersonalView-wcvMUVmj.js → SettingsPersonalView-BFnOmBPC.js} +1 -1
  58. package/dist/assets/{SettingsSourceControl-1-N8xA9J.js → SettingsSourceControl-BUNmxcvB.js} +1 -1
  59. package/dist/assets/{SettingsSso-BwySnCiN.js → SettingsSso-Dx8Qw_2Z.js} +1 -1
  60. package/dist/assets/{SettingsUsageAndPlan-CDI4k6UQ.js → SettingsUsageAndPlan-DTk86tXU.js} +1 -1
  61. package/dist/assets/{SettingsUsersView-tEm96Fhw.js → SettingsUsersView-BviXcl30.js} +1 -1
  62. package/dist/assets/{SettingsView-AhipcaOB.js → SettingsView-fzPdUijx.js} +1 -1
  63. package/dist/assets/{SetupView-BnsG-7jD.js → SetupView-DUTx1JXK.js} +3 -3
  64. package/dist/assets/{SetupWorkflowCredentialsButton-BNGDx7Fp.js → SetupWorkflowCredentialsButton-fApxCGHh.js} +1 -1
  65. package/dist/assets/{SetupWorkflowFromTemplateView-BuoOdqHT.js → SetupWorkflowFromTemplateView-C5t9fEKF.js} +3 -3
  66. package/dist/assets/{SigninView-UJnLl-xs.js → SigninView-BRVoXQRW.js} +3 -3
  67. package/dist/assets/{SignoutView-e5mZU_R6.js → SignoutView-Duh6wb4Y.js} +1 -1
  68. package/dist/assets/{SignupView-cdwgpaEM.js → SignupView-DMkpTtjs.js} +3 -3
  69. package/dist/assets/{TemplateDetails-DcoAjVlw.js → TemplateDetails-Df9_jph6.js} +1 -1
  70. package/dist/assets/{TemplateList-B6SXDRtt.js → TemplateList-qSnJvw0K.js} +1 -1
  71. package/dist/assets/{TemplatesCollectionView-BZmufr5v.js → TemplatesCollectionView--ccYXaCo.js} +5 -5
  72. package/dist/assets/{TemplatesSearchView-BJhZMdAl.js → TemplatesSearchView-D1YgHKld.js} +3 -3
  73. package/dist/assets/{TemplatesView-CSnT6pfC.js → TemplatesView-B9CwObHN.js} +1 -1
  74. package/dist/assets/{TemplatesWorkflowView-4ejYFisG.js → TemplatesWorkflowView-DtLpUF59.js} +5 -5
  75. package/dist/assets/{TestDefinitionEditView-BLJQ7-fz.js → TestDefinitionEditView-DFcBlKnN.js} +7 -7
  76. package/dist/assets/{TestDefinitionListView-uZmtRG_H.js → TestDefinitionListView-C_mbolTO.js} +1 -1
  77. package/dist/assets/{TestDefinitionNewView-Dfav_UeD.js → TestDefinitionNewView-CvyM6TLE.js} +2 -2
  78. package/dist/assets/{TestDefinitionRootView-CbVp9ZuX.js → TestDefinitionRootView-BXzJY0cY.js} +1 -1
  79. package/dist/assets/{VariablesView-CTSEc1xT.js → VariablesView-BHFJj5IU.js} +3 -3
  80. package/dist/assets/{WorkerView-s6aBeHSb.js → WorkerView-CgIksFjP.js} +6 -6
  81. package/dist/assets/{WorkflowActivator-BeUvx9Ri.js → WorkflowActivator-O6i5XAk2.js} +2 -2
  82. package/dist/assets/{WorkflowExecutionsInfoAccordion-BBtwnPZQ.css → WorkflowExecutionsInfoAccordion-53bC-IXN.css} +10 -8
  83. package/dist/assets/{WorkflowExecutionsInfoAccordion-D9wF-tSd.js → WorkflowExecutionsInfoAccordion-BcBLZ_Ul.js} +3 -3
  84. package/dist/assets/{WorkflowExecutionsLandingPage-CROT9lXB.js → WorkflowExecutionsLandingPage-B9ByHnbR.js} +2 -2
  85. package/dist/assets/{WorkflowExecutionsPreview-DyVQaOZ3.js → WorkflowExecutionsPreview-DCE7TYLh.js} +6 -6
  86. package/dist/assets/{WorkflowExecutionsView-T9-QI3Ve.js → WorkflowExecutionsView-DFoBpdS7.js} +7 -7
  87. package/dist/assets/{WorkflowHistory-271ecFaP.js → WorkflowHistory-DolmPUM2.js} +3 -3
  88. package/dist/assets/{WorkflowOnboardingView-C10O8PHR.js → WorkflowOnboardingView-DQW48M8_.js} +1 -1
  89. package/dist/assets/{WorkflowPreview-B58e-sbx.js → WorkflowPreview-BFR6V9SO.js} +1 -1
  90. package/dist/assets/{WorkflowsView-tVTdlhV1.js → WorkflowsView-B-feKuLZ.js} +348 -60
  91. package/dist/assets/{WorkflowsView-DV1tjQwB.css → WorkflowsView-CsM69PSv.css} +41 -16
  92. package/dist/assets/{chartjs.utils-B5AYF7KA.js → chartjs.utils-BcXTJ2Te.js} +2 -2
  93. package/dist/assets/{dateFormatter-DP26ifk_.js → dateFormatter-CZI1kGYK.js} +1 -1
  94. package/dist/assets/{easyAiWorkflowUtils-BC_3x-4F.js → easyAiWorkflowUtils-ChToD_Yl.js} +1 -1
  95. package/dist/assets/{global-link-actions-BxV1MUKt.js → global-link-actions-OGaZVwsw.js} +1 -1
  96. package/dist/assets/{import-curl-DVtpAPDa.js → import-curl-CAszzwx1.js} +1 -1
  97. package/dist/assets/{index-DpLYcjet.js → index-7WdERzqm.js} +1 -1
  98. package/dist/assets/{index-CN4JmOoA.js → index-BpdkKRP4.js} +2544 -2121
  99. package/dist/assets/{index-DwKuVkBg.css → index-C5OXOcIJ.css} +176 -111
  100. package/dist/assets/{pickBy-BAPZ2mk0.js → pickBy-mYqFOFbh.js} +1 -1
  101. package/dist/assets/{templateActions-Hi9EBouz.js → templateActions-BX9arLbc.js} +1 -1
  102. package/dist/assets/{typescript.worker-Bt3bByTc.js → typescript.worker-BsxN2afA.js} +1 -1
  103. package/dist/assets/{useBeforeUnload-CQDQ2xRD.js → useBeforeUnload-K7nQ15Rk.js} +1 -1
  104. package/dist/assets/{useCanvasMapping-BkGr1HdJ.css → useCanvasMapping-C--wac6H.css} +8 -9
  105. package/dist/assets/{useCanvasMapping-BrMdYioA.js → useCanvasMapping-D_UPCxYX.js} +37 -30
  106. package/dist/assets/{useCanvasOperations-BW3qnkOc.js → useCanvasOperations-D6VFiC3b.js} +17 -71
  107. package/dist/assets/{useClearExecutionButtonVisible-CRcafrkD.js → useClearExecutionButtonVisible-D_0O6f0X.js} +2 -2
  108. package/dist/assets/{useExecutionDebugging-Dy0Nq0u2.js → useExecutionDebugging-BNMaKOh7.js} +1 -1
  109. package/dist/assets/{useExecutionHelpers-Bet0YWvb.js → useExecutionHelpers-DN5HqPqY.js} +2 -2
  110. package/dist/assets/{useImportCurlCommand-CJX2AaLN.js → useImportCurlCommand-BSL596XF.js} +2 -2
  111. package/dist/assets/{usePushConnection-RVgJVlWm.js → usePushConnection-BdV7ILvK.js} +3 -3
  112. package/dist/assets/{useTestDefinitionForm-DjJ6ywy3.js → useTestDefinitionForm-CIhrxyve.js} +1 -1
  113. package/dist/assets/{useWorkflowActivate-BZzKuzDM.js → useWorkflowActivate-pZ62ib_C.js} +1 -1
  114. package/dist/index.html +2 -2
  115. package/package.json +1 -1
  116. package/dist/assets/CollectionParameter-DJtdOCSL.js +0 -4
  117. package/dist/assets/RunDataAi-DsidSvp-.js +0 -3166
@@ -1,9 +1,8 @@
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-CN4JmOoA.js";
2
- import { H as HighlightJS, R as RunDataAi, f as formatTokenUsageCount, _ as _sfc_main$j, g as getSubtreeTotalConsumedTokens, c as createLogEntries, a as getTotalConsumedTokens } from "./RunDataAi-DsidSvp-.js";
3
- import { u as useClearExecutionButtonVisible } from "./useClearExecutionButtonVisible-CRcafrkD.js";
4
- import { t as toTime, a as toDayMonth } from "./dateFormatter-DP26ifk_.js";
5
- import { u as upperFirst } from "./useCanvasOperations-BW3qnkOc.js";
6
- import "./useExecutionHelpers-Bet0YWvb.js";
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";
7
6
  function bash(hljs) {
8
7
  const regex = hljs.regex;
9
8
  const VAR = {};
@@ -2519,13 +2518,13 @@ function useI18n() {
2519
2518
  }
2520
2519
  return { t, te };
2521
2520
  }
2522
- const _hoisted_1$d = {
2521
+ const _hoisted_1$c = {
2523
2522
  viewBox: "0 0 24 24",
2524
2523
  width: "1.2em",
2525
2524
  height: "1.2em"
2526
2525
  };
2527
2526
  function render$7(_ctx, _cache) {
2528
- return openBlock(), createElementBlock("svg", _hoisted_1$d, _cache[0] || (_cache[0] = [
2527
+ return openBlock(), createElementBlock("svg", _hoisted_1$c, _cache[0] || (_cache[0] = [
2529
2528
  createBaseVNode("path", {
2530
2529
  fill: "currentColor",
2531
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"
@@ -2533,13 +2532,13 @@ function render$7(_ctx, _cache) {
2533
2532
  ]));
2534
2533
  }
2535
2534
  const IconDelete = { name: "mdi-closeThick", render: render$7 };
2536
- const _hoisted_1$c = {
2535
+ const _hoisted_1$b = {
2537
2536
  viewBox: "0 0 24 24",
2538
2537
  width: "1.2em",
2539
2538
  height: "1.2em"
2540
2539
  };
2541
2540
  function render$6(_ctx, _cache) {
2542
- return openBlock(), createElementBlock("svg", _hoisted_1$c, _cache[0] || (_cache[0] = [
2541
+ return openBlock(), createElementBlock("svg", _hoisted_1$b, _cache[0] || (_cache[0] = [
2543
2542
  createBaseVNode("path", {
2544
2543
  fill: "currentColor",
2545
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"
@@ -2547,13 +2546,13 @@ function render$6(_ctx, _cache) {
2547
2546
  ]));
2548
2547
  }
2549
2548
  const IconFileImage = { name: "mdi-fileImage", render: render$6 };
2550
- const _hoisted_1$b = {
2549
+ const _hoisted_1$a = {
2551
2550
  viewBox: "0 0 24 24",
2552
2551
  width: "1.2em",
2553
2552
  height: "1.2em"
2554
2553
  };
2555
2554
  function render$5(_ctx, _cache) {
2556
- return openBlock(), createElementBlock("svg", _hoisted_1$b, _cache[0] || (_cache[0] = [
2555
+ return openBlock(), createElementBlock("svg", _hoisted_1$a, _cache[0] || (_cache[0] = [
2557
2556
  createBaseVNode("path", {
2558
2557
  fill: "currentColor",
2559
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"
@@ -2561,13 +2560,13 @@ function render$5(_ctx, _cache) {
2561
2560
  ]));
2562
2561
  }
2563
2562
  const IconFileMusic = { name: "mdi-fileMusic", render: render$5 };
2564
- const _hoisted_1$a = {
2563
+ const _hoisted_1$9 = {
2565
2564
  viewBox: "0 0 24 24",
2566
2565
  width: "1.2em",
2567
2566
  height: "1.2em"
2568
2567
  };
2569
2568
  function render$4(_ctx, _cache) {
2570
- return openBlock(), createElementBlock("svg", _hoisted_1$a, _cache[0] || (_cache[0] = [
2569
+ return openBlock(), createElementBlock("svg", _hoisted_1$9, _cache[0] || (_cache[0] = [
2571
2570
  createBaseVNode("path", {
2572
2571
  fill: "currentColor",
2573
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"
@@ -2575,13 +2574,13 @@ function render$4(_ctx, _cache) {
2575
2574
  ]));
2576
2575
  }
2577
2576
  const IconFileText = { name: "mdi-fileText", render: render$4 };
2578
- const _hoisted_1$9 = {
2577
+ const _hoisted_1$8 = {
2579
2578
  viewBox: "0 0 24 24",
2580
2579
  width: "1.2em",
2581
2580
  height: "1.2em"
2582
2581
  };
2583
2582
  function render$3(_ctx, _cache) {
2584
- return openBlock(), createElementBlock("svg", _hoisted_1$9, _cache[0] || (_cache[0] = [
2583
+ return openBlock(), createElementBlock("svg", _hoisted_1$8, _cache[0] || (_cache[0] = [
2585
2584
  createBaseVNode("path", {
2586
2585
  fill: "currentColor",
2587
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"
@@ -2589,13 +2588,13 @@ function render$3(_ctx, _cache) {
2589
2588
  ]));
2590
2589
  }
2591
2590
  const IconFileVideo = { name: "mdi-fileVideo", render: render$3 };
2592
- const _hoisted_1$8 = {
2591
+ const _hoisted_1$7 = {
2593
2592
  viewBox: "0 0 24 24",
2594
2593
  width: "1.2em",
2595
2594
  height: "1.2em"
2596
2595
  };
2597
2596
  function render$2(_ctx, _cache) {
2598
- return openBlock(), createElementBlock("svg", _hoisted_1$8, _cache[0] || (_cache[0] = [
2597
+ return openBlock(), createElementBlock("svg", _hoisted_1$7, _cache[0] || (_cache[0] = [
2599
2598
  createBaseVNode("path", {
2600
2599
  fill: "currentColor",
2601
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"
@@ -2603,8 +2602,8 @@ function render$2(_ctx, _cache) {
2603
2602
  ]));
2604
2603
  }
2605
2604
  const IconPreview = { name: "mdi-openInNew", render: render$2 };
2606
- const _hoisted_1$7 = { class: "chat-file-name" };
2607
- const _sfc_main$h = /* @__PURE__ */ defineComponent({
2605
+ const _hoisted_1$6 = { class: "chat-file-name" };
2606
+ const _sfc_main$g = /* @__PURE__ */ defineComponent({
2608
2607
  __name: "ChatFile",
2609
2608
  props: {
2610
2609
  file: {},
@@ -2639,7 +2638,7 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
2639
2638
  onClick
2640
2639
  }, [
2641
2640
  createVNode(unref(TypeIcon)),
2642
- createBaseVNode("p", _hoisted_1$7, toDisplayString(_ctx.file.name), 1),
2641
+ createBaseVNode("p", _hoisted_1$6, toDisplayString(_ctx.file.name), 1),
2643
2642
  _ctx.isRemovable ? (openBlock(), createElementBlock("span", {
2644
2643
  key: 0,
2645
2644
  class: "chat-file-delete",
@@ -2654,16 +2653,16 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
2654
2653
  };
2655
2654
  }
2656
2655
  });
2657
- const ChatFile = /* @__PURE__ */ _export_sfc(_sfc_main$h, [["__scopeId", "data-v-70b9370d"]]);
2658
- const _hoisted_1$6 = {
2656
+ const ChatFile = /* @__PURE__ */ _export_sfc(_sfc_main$g, [["__scopeId", "data-v-70b9370d"]]);
2657
+ const _hoisted_1$5 = {
2659
2658
  key: 0,
2660
2659
  class: "chat-message-actions"
2661
2660
  };
2662
- const _hoisted_2$3 = {
2661
+ const _hoisted_2$2 = {
2663
2662
  key: 2,
2664
2663
  class: "chat-message-files"
2665
2664
  };
2666
- const _sfc_main$g = /* @__PURE__ */ defineComponent({
2665
+ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2667
2666
  __name: "Message",
2668
2667
  props: {
2669
2668
  message: {}
@@ -2741,7 +2740,7 @@ const _sfc_main$g = /* @__PURE__ */ defineComponent({
2741
2740
  ref: messageContainer,
2742
2741
  class: normalizeClass(["chat-message", classes.value])
2743
2742
  }, [
2744
- _ctx.$slots.beforeMessage ? (openBlock(), createElementBlock("div", _hoisted_1$6, [
2743
+ _ctx.$slots.beforeMessage ? (openBlock(), createElementBlock("div", _hoisted_1$5, [
2745
2744
  renderSlot(_ctx.$slots, "beforeMessage", normalizeProps(guardReactiveProps({ message: unref(message) })))
2746
2745
  ])) : createCommentVNode("", true),
2747
2746
  renderSlot(_ctx.$slots, "default", {}, () => [
@@ -2752,7 +2751,7 @@ const _sfc_main$g = /* @__PURE__ */ defineComponent({
2752
2751
  options: markdownOptions,
2753
2752
  plugins: [linksNewTabPlugin]
2754
2753
  }, null, 8, ["source", "plugins"])),
2755
- (unref(message).files ?? []).length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$3, [
2754
+ (unref(message).files ?? []).length > 0 ? (openBlock(), createElementBlock("div", _hoisted_2$2, [
2756
2755
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(message).files ?? [], (file) => {
2757
2756
  return openBlock(), createElementBlock("div", {
2758
2757
  key: file.name,
@@ -2771,13 +2770,13 @@ const _sfc_main$g = /* @__PURE__ */ defineComponent({
2771
2770
  };
2772
2771
  }
2773
2772
  });
2774
- const _hoisted_1$5 = {
2773
+ const _hoisted_1$4 = {
2775
2774
  viewBox: "0 0 24 24",
2776
2775
  width: "1.2em",
2777
2776
  height: "1.2em"
2778
2777
  };
2779
2778
  function render$1(_ctx, _cache) {
2780
- return openBlock(), createElementBlock("svg", _hoisted_1$5, _cache[0] || (_cache[0] = [
2779
+ return openBlock(), createElementBlock("svg", _hoisted_1$4, _cache[0] || (_cache[0] = [
2781
2780
  createBaseVNode("path", {
2782
2781
  fill: "currentColor",
2783
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"
@@ -2785,13 +2784,13 @@ function render$1(_ctx, _cache) {
2785
2784
  ]));
2786
2785
  }
2787
2786
  const IconPaperclip = { name: "mdi-paperclip", render: render$1 };
2788
- const _hoisted_1$4 = {
2787
+ const _hoisted_1$3 = {
2789
2788
  viewBox: "0 0 24 24",
2790
2789
  width: "1.2em",
2791
2790
  height: "1.2em"
2792
2791
  };
2793
2792
  function render(_ctx, _cache) {
2794
- return openBlock(), createElementBlock("svg", _hoisted_1$4, _cache[0] || (_cache[0] = [
2793
+ return openBlock(), createElementBlock("svg", _hoisted_1$3, _cache[0] || (_cache[0] = [
2795
2794
  createBaseVNode("path", {
2796
2795
  fill: "currentColor",
2797
2796
  d: "m2 21l21-9L2 3v7l15 2l-15 2z"
@@ -2832,8 +2831,8 @@ function createEventBus() {
2832
2831
  };
2833
2832
  }
2834
2833
  const chatEventBus = createEventBus();
2835
- const _hoisted_1$3 = { class: "chat-inputs" };
2836
- const _hoisted_2$2 = {
2834
+ const _hoisted_1$2 = { class: "chat-inputs" };
2835
+ const _hoisted_2$1 = {
2837
2836
  key: 0,
2838
2837
  class: "chat-input-left-panel"
2839
2838
  };
@@ -2845,7 +2844,7 @@ const _hoisted_7 = {
2845
2844
  key: 0,
2846
2845
  class: "chat-files"
2847
2846
  };
2848
- const _sfc_main$f = /* @__PURE__ */ defineComponent({
2847
+ const _sfc_main$e = /* @__PURE__ */ defineComponent({
2849
2848
  __name: "Input",
2850
2849
  props: {
2851
2850
  placeholder: { default: "inputPlaceholder" }
@@ -2907,7 +2906,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2907
2906
  resizeObserver.value = new ResizeObserver((entries) => {
2908
2907
  for (const entry of entries) {
2909
2908
  if (entry.target === chatTextArea.value) {
2910
- adjustHeight({ target: chatTextArea.value });
2909
+ adjustTextAreaHeight();
2911
2910
  }
2912
2911
  }
2913
2912
  });
@@ -2955,7 +2954,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2955
2954
  return;
2956
2955
  }
2957
2956
  await onSubmit(event);
2958
- adjustHeight({ target: chatTextArea.value });
2957
+ adjustTextAreaHeight();
2959
2958
  }
2960
2959
  function onFileRemove(file) {
2961
2960
  if (!files.value) return;
@@ -2980,8 +2979,9 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2980
2979
  if (isFileUploadDisabled.value) return;
2981
2980
  openFileDialog({ accept: unref(allowedFileTypes) });
2982
2981
  }
2983
- function adjustHeight(event) {
2984
- const textarea = event.target;
2982
+ function adjustTextAreaHeight() {
2983
+ const textarea = chatTextArea.value;
2984
+ if (!textarea) return;
2985
2985
  textarea.style.height = "var(--chat--textarea--height)";
2986
2986
  const newHeight = Math.min(textarea.scrollHeight, 480);
2987
2987
  textarea.style.height = `${newHeight}px`;
@@ -2992,8 +2992,8 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2992
2992
  style: normalizeStyle(styleVars.value),
2993
2993
  onKeydown: withModifiers(onKeyDown, ["stop"])
2994
2994
  }, [
2995
- createBaseVNode("div", _hoisted_1$3, [
2996
- _ctx.$slots.leftPanel ? (openBlock(), createElementBlock("div", _hoisted_2$2, [
2995
+ createBaseVNode("div", _hoisted_1$2, [
2996
+ _ctx.$slots.leftPanel ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
2997
2997
  renderSlot(_ctx.$slots, "leftPanel", {}, void 0, true)
2998
2998
  ])) : createCommentVNode("", true),
2999
2999
  withDirectives(createBaseVNode("textarea", {
@@ -3004,9 +3004,9 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
3004
3004
  disabled: isInputDisabled.value,
3005
3005
  placeholder: unref(t)(props.placeholder),
3006
3006
  onKeydown: withKeys(onSubmitKeydown, ["enter"]),
3007
- onInput: adjustHeight,
3008
- onMousedown: adjustHeight,
3009
- onFocus: adjustHeight
3007
+ onInput: adjustTextAreaHeight,
3008
+ onMousedown: adjustTextAreaHeight,
3009
+ onFocus: adjustTextAreaHeight
3010
3010
  }, null, 40, _hoisted_3$1), [
3011
3011
  [vModelText, input.value]
3012
3012
  ]),
@@ -3050,8 +3050,8 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
3050
3050
  };
3051
3051
  }
3052
3052
  });
3053
- const ChatInput = /* @__PURE__ */ _export_sfc(_sfc_main$f, [["__scopeId", "data-v-9f775274"]]);
3054
- const _sfc_main$e = /* @__PURE__ */ defineComponent({
3053
+ const ChatInput = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["__scopeId", "data-v-f0e5731e"]]);
3054
+ const _sfc_main$d = /* @__PURE__ */ defineComponent({
3055
3055
  __name: "MessageTyping",
3056
3056
  props: {
3057
3057
  animation: { default: "bouncing" }
@@ -3061,8 +3061,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
3061
3061
  const message = {
3062
3062
  id: "typing",
3063
3063
  text: "",
3064
- sender: "bot",
3065
- createdAt: ""
3064
+ sender: "bot"
3066
3065
  };
3067
3066
  const messageContainer = ref();
3068
3067
  const classes = computed(() => {
@@ -3076,7 +3075,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
3076
3075
  messageContainer.value?.scrollToView();
3077
3076
  });
3078
3077
  return (_ctx, _cache) => {
3079
- return openBlock(), createBlock(unref(_sfc_main$g), {
3078
+ return openBlock(), createBlock(unref(_sfc_main$f), {
3080
3079
  ref_key: "messageContainer",
3081
3080
  ref: messageContainer,
3082
3081
  class: normalizeClass(classes.value),
@@ -3095,11 +3094,11 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
3095
3094
  };
3096
3095
  }
3097
3096
  });
3098
- const _hoisted_1$2 = {
3097
+ const _hoisted_1$1 = {
3099
3098
  key: 0,
3100
3099
  class: "empty-container"
3101
3100
  };
3102
- const _hoisted_2$1 = {
3101
+ const _hoisted_2 = {
3103
3102
  class: "empty",
3104
3103
  "data-test-id": "chat-messages-empty"
3105
3104
  };
@@ -3107,7 +3106,7 @@ const _hoisted_3 = {
3107
3106
  key: 1,
3108
3107
  class: "chat-messages-list"
3109
3108
  };
3110
- const _sfc_main$d = /* @__PURE__ */ defineComponent({
3109
+ const _sfc_main$c = /* @__PURE__ */ defineComponent({
3111
3110
  __name: "MessagesList",
3112
3111
  props: {
3113
3112
  messages: {},
@@ -3129,8 +3128,8 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
3129
3128
  return (_ctx, _cache) => {
3130
3129
  const _component_N8nIcon = resolveComponent("N8nIcon");
3131
3130
  const _component_N8nText = resolveComponent("N8nText");
3132
- return _ctx.emptyText && unref(initialMessages).length === 0 && _ctx.messages.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_1$2, [
3133
- createBaseVNode("div", _hoisted_2$1, [
3131
+ return _ctx.emptyText && unref(initialMessages).length === 0 && _ctx.messages.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_1$1, [
3132
+ createBaseVNode("div", _hoisted_2, [
3134
3133
  createVNode(_component_N8nIcon, {
3135
3134
  icon: "comment",
3136
3135
  size: "large",
@@ -3149,13 +3148,13 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
3149
3148
  ])
3150
3149
  ])) : (openBlock(), createElementBlock("div", _hoisted_3, [
3151
3150
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(initialMessages), (initialMessage) => {
3152
- return openBlock(), createBlock(_sfc_main$g, {
3151
+ return openBlock(), createBlock(_sfc_main$f, {
3153
3152
  key: initialMessage.id,
3154
3153
  message: initialMessage
3155
3154
  }, null, 8, ["message"]);
3156
3155
  }), 128)),
3157
3156
  (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.messages, (message) => {
3158
- return openBlock(), createBlock(_sfc_main$g, {
3157
+ return openBlock(), createBlock(_sfc_main$f, {
3159
3158
  key: message.id,
3160
3159
  ref_for: true,
3161
3160
  ref_key: "messageComponents",
@@ -3168,12 +3167,12 @@ const _sfc_main$d = /* @__PURE__ */ defineComponent({
3168
3167
  _: 2
3169
3168
  }, 1032, ["message"]);
3170
3169
  }), 128)),
3171
- unref(waitingForResponse) ? (openBlock(), createBlock(_sfc_main$e, { key: 0 })) : createCommentVNode("", true)
3170
+ unref(waitingForResponse) ? (openBlock(), createBlock(_sfc_main$d, { key: 0 })) : createCommentVNode("", true)
3172
3171
  ]));
3173
3172
  };
3174
3173
  }
3175
3174
  });
3176
- const _sfc_main$c = /* @__PURE__ */ defineComponent({
3175
+ const _sfc_main$b = /* @__PURE__ */ defineComponent({
3177
3176
  __name: "MessageOptionTooltip",
3178
3177
  props: {
3179
3178
  placement: {
@@ -3208,17 +3207,17 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
3208
3207
  };
3209
3208
  }
3210
3209
  });
3211
- const container$7 = "_container_pqtqf_123";
3212
- const icon$2 = "_icon_pqtqf_129";
3213
- const style0$9 = {
3214
- container: container$7,
3215
- icon: icon$2
3210
+ const container$8 = "_container_pqtqf_123";
3211
+ const icon$3 = "_icon_pqtqf_129";
3212
+ const style0$a = {
3213
+ container: container$8,
3214
+ icon: icon$3
3216
3215
  };
3217
- const cssModules$9 = {
3218
- "$style": style0$9
3216
+ const cssModules$a = {
3217
+ "$style": style0$a
3219
3218
  };
3220
- const MessageOptionTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__cssModules", cssModules$9]]);
3221
- const _sfc_main$b = /* @__PURE__ */ defineComponent({
3219
+ const MessageOptionTooltip = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__cssModules", cssModules$a]]);
3220
+ const _sfc_main$a = /* @__PURE__ */ defineComponent({
3222
3221
  __name: "MessageOptionAction",
3223
3222
  props: {
3224
3223
  label: {
@@ -3259,17 +3258,17 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
3259
3258
  };
3260
3259
  }
3261
3260
  });
3262
- const container$6 = "_container_u1r1u_123";
3263
- const icon$1 = "_icon_u1r1u_129";
3264
- const style0$8 = {
3265
- container: container$6,
3266
- icon: icon$1
3261
+ const container$7 = "_container_u1r1u_123";
3262
+ const icon$2 = "_icon_u1r1u_129";
3263
+ const style0$9 = {
3264
+ container: container$7,
3265
+ icon: icon$2
3267
3266
  };
3268
- const cssModules$8 = {
3269
- "$style": style0$8
3267
+ const cssModules$9 = {
3268
+ "$style": style0$9
3270
3269
  };
3271
- const MessageOptionAction = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["__cssModules", cssModules$8]]);
3272
- const _sfc_main$a = /* @__PURE__ */ defineComponent({
3270
+ const MessageOptionAction = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__cssModules", cssModules$9]]);
3271
+ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3273
3272
  __name: "PanelHeader",
3274
3273
  props: {
3275
3274
  title: {}
@@ -3288,9 +3287,11 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
3288
3287
  size: "small"
3289
3288
  }, {
3290
3289
  default: withCtx(() => [
3291
- createTextVNode(toDisplayString(_ctx.title), 1)
3290
+ renderSlot(_ctx.$slots, "title", {}, () => [
3291
+ createTextVNode(toDisplayString(_ctx.title), 1)
3292
+ ])
3292
3293
  ]),
3293
- _: 1
3294
+ _: 3
3294
3295
  }, 8, ["class"]),
3295
3296
  createBaseVNode("div", {
3296
3297
  class: normalizeClass(_ctx.$style.actions)
@@ -3301,20 +3302,20 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
3301
3302
  };
3302
3303
  }
3303
3304
  });
3304
- const container$5 = "_container_u9nuz_123";
3305
- const title = "_title_u9nuz_144";
3306
- const actions$1 = "_actions_u9nuz_149";
3307
- const style0$7 = {
3308
- container: container$5,
3309
- title,
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 = {
3309
+ container: container$6,
3310
+ title: title$2,
3310
3311
  actions: actions$1
3311
3312
  };
3312
- const cssModules$7 = {
3313
- "$style": style0$7
3313
+ const cssModules$8 = {
3314
+ "$style": style0$8
3314
3315
  };
3315
- const PanelHeader = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__cssModules", cssModules$7]]);
3316
- const _hoisted_1$1 = ["onClick"];
3317
- const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3316
+ const PanelHeader = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__cssModules", cssModules$8]]);
3317
+ const _hoisted_1 = ["onClick"];
3318
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3318
3319
  __name: "ChatMessagesPanel",
3319
3320
  props: {
3320
3321
  pastChatMessages: {},
@@ -3322,6 +3323,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3322
3323
  sessionId: {},
3323
3324
  showCloseButton: { type: Boolean },
3324
3325
  isOpen: { type: Boolean, default: true },
3326
+ isReadOnly: { type: Boolean, default: false },
3325
3327
  isNewLogsEnabled: { type: Boolean, default: false }
3326
3328
  },
3327
3329
  emits: ["displayExecution", "sendMessage", "refreshSession", "close", "clickHeader"],
@@ -3406,7 +3408,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3406
3408
  onClick: _cache[0] || (_cache[0] = ($event) => emit("clickHeader"))
3407
3409
  }, {
3408
3410
  actions: withCtx(() => [
3409
- unref(clipboard).isSupported.value ? (openBlock(), createBlock(unref(N8nTooltip), { key: 0 }, {
3411
+ unref(clipboard).isSupported.value && !_ctx.isReadOnly ? (openBlock(), createBlock(unref(N8nTooltip), { key: 0 }, {
3410
3412
  content: withCtx(() => [
3411
3413
  createTextVNode(toDisplayString(_ctx.sessionId) + " ", 1),
3412
3414
  _cache[5] || (_cache[5] = createBaseVNode("br", null, null, -1)),
@@ -3417,23 +3419,24 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3417
3419
  "data-test-id": "chat-session-id",
3418
3420
  type: "secondary",
3419
3421
  size: "mini",
3422
+ class: normalizeClass(_ctx.$style.newHeaderButton),
3420
3423
  onClick: withModifiers(copySessionId, ["stop"])
3421
3424
  }, {
3422
3425
  default: withCtx(() => [
3423
3426
  createTextVNode(toDisplayString(sessionIdText.value), 1)
3424
3427
  ]),
3425
3428
  _: 1
3426
- })
3429
+ }, 8, ["class"])
3427
3430
  ]),
3428
3431
  _: 1
3429
3432
  })) : createCommentVNode("", true),
3430
- _ctx.messages.length > 0 ? (openBlock(), createBlock(unref(N8nTooltip), {
3433
+ _ctx.messages.length > 0 && !_ctx.isReadOnly ? (openBlock(), createBlock(unref(N8nTooltip), {
3431
3434
  key: 1,
3432
3435
  content: unref(locale).baseText("chat.window.session.resetSession")
3433
3436
  }, {
3434
3437
  default: withCtx(() => [
3435
- createVNode(unref(_sfc_main$i), {
3436
- class: normalizeClass(_ctx.$style.headerButton),
3438
+ createVNode(unref(_sfc_main$h), {
3439
+ class: normalizeClass(_ctx.$style.newHeaderButton),
3437
3440
  "data-test-id": "refresh-session-button",
3438
3441
  outline: "",
3439
3442
  type: "secondary",
@@ -3472,7 +3475,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3472
3475
  ]),
3473
3476
  _: 1
3474
3477
  }),
3475
- createVNode(unref(_sfc_main$i), {
3478
+ createVNode(unref(_sfc_main$h), {
3476
3479
  class: normalizeClass(_ctx.$style.headerButton),
3477
3480
  "data-test-id": "refresh-session-button",
3478
3481
  outline: "",
@@ -3482,7 +3485,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3482
3485
  title: unref(locale).baseText("chat.window.session.reset"),
3483
3486
  onClick: onRefreshSession
3484
3487
  }, null, 8, ["class", "title"]),
3485
- _ctx.showCloseButton ? (openBlock(), createBlock(unref(_sfc_main$i), {
3488
+ _ctx.showCloseButton ? (openBlock(), createBlock(unref(_sfc_main$h), {
3486
3489
  key: 0,
3487
3490
  class: normalizeClass(_ctx.$style.headerButton),
3488
3491
  outline: "",
@@ -3497,13 +3500,13 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3497
3500
  key: 2,
3498
3501
  class: normalizeClass(_ctx.$style.chatBody)
3499
3502
  }, [
3500
- createVNode(_sfc_main$d, {
3503
+ createVNode(_sfc_main$c, {
3501
3504
  messages: _ctx.messages,
3502
3505
  class: normalizeClass(_ctx.$style.messages),
3503
3506
  "empty-text": _ctx.isNewLogsEnabled ? unref(locale).baseText("chat.window.chat.emptyChatMessage.v2") : void 0
3504
3507
  }, {
3505
3508
  beforeMessage: withCtx(({ message }) => [
3506
- message.sender === "bot" && !message.id.includes("preload") ? (openBlock(), createBlock(MessageOptionTooltip, {
3509
+ !_ctx.isReadOnly && message.sender === "bot" && !message.id.includes("preload") ? (openBlock(), createBlock(MessageOptionTooltip, {
3507
3510
  key: 0,
3508
3511
  placement: "right",
3509
3512
  "data-test-id": "execution-id-tooltip"
@@ -3513,11 +3516,11 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3513
3516
  createBaseVNode("a", {
3514
3517
  href: "#",
3515
3518
  onClick: ($event) => emit("displayExecution", message.id)
3516
- }, toDisplayString(message.id), 9, _hoisted_1$1)
3519
+ }, toDisplayString(message.id), 9, _hoisted_1)
3517
3520
  ]),
3518
3521
  _: 2
3519
3522
  }, 1024)) : createCommentVNode("", true),
3520
- isTextMessage(message) && message.sender === "user" ? (openBlock(), createBlock(MessageOptionAction, {
3523
+ !_ctx.isReadOnly && isTextMessage(message) && message.sender === "user" ? (openBlock(), createBlock(MessageOptionAction, {
3521
3524
  key: 1,
3522
3525
  "data-test-id": "repost-message-button",
3523
3526
  icon: "redo",
@@ -3525,7 +3528,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3525
3528
  placement: "left",
3526
3529
  onClickOnce: ($event) => repostMessage(message)
3527
3530
  }, null, 8, ["label", "onClickOnce"])) : createCommentVNode("", true),
3528
- isTextMessage(message) && message.sender === "user" ? (openBlock(), createBlock(MessageOptionAction, {
3531
+ !_ctx.isReadOnly && isTextMessage(message) && message.sender === "user" ? (openBlock(), createBlock(MessageOptionAction, {
3529
3532
  key: 2,
3530
3533
  "data-test-id": "reuse-message-button",
3531
3534
  icon: "copy",
@@ -3578,94 +3581,37 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
3578
3581
  };
3579
3582
  }
3580
3583
  });
3581
- const chat$2 = "_chat_14fd2_123";
3582
- const chatHeader = "_chatHeader_14fd2_148";
3583
- const chatTitle = "_chatTitle_14fd2_161";
3584
- const session = "_session_14fd2_165";
3585
- const sessionId = "_sessionId_14fd2_173";
3586
- const copyable = "_copyable_14fd2_179";
3587
- const headerButton = "_headerButton_14fd2_183";
3588
- const chatBody = "_chatBody_14fd2_188";
3589
- const messages = "_messages_14fd2_197";
3590
- const messagesInput = "_messagesInput_14fd2_208";
3591
- const style0$6 = {
3592
- chat: chat$2,
3584
+ const chat$1 = "_chat_1r0jy_123";
3585
+ const chatHeader = "_chatHeader_1r0jy_148";
3586
+ const chatTitle = "_chatTitle_1r0jy_161";
3587
+ const session = "_session_1r0jy_165";
3588
+ const sessionId = "_sessionId_1r0jy_173";
3589
+ const copyable = "_copyable_1r0jy_179";
3590
+ const headerButton = "_headerButton_1r0jy_183";
3591
+ const newHeaderButton = "_newHeaderButton_1r0jy_188";
3592
+ const chatBody = "_chatBody_1r0jy_193";
3593
+ const messages = "_messages_1r0jy_202";
3594
+ const messagesInput = "_messagesInput_1r0jy_213";
3595
+ const style0$7 = {
3596
+ chat: chat$1,
3593
3597
  chatHeader,
3594
3598
  chatTitle,
3595
3599
  session,
3596
3600
  sessionId,
3597
3601
  copyable,
3598
3602
  headerButton,
3603
+ newHeaderButton,
3599
3604
  chatBody,
3600
3605
  messages,
3601
3606
  messagesInput
3602
3607
  };
3603
- const cssModules$6 = {
3604
- "$style": style0$6
3605
- };
3606
- const ChatMessagesPanel = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__cssModules", cssModules$6]]);
3607
- const _hoisted_1 = { class: "meta" };
3608
- const _hoisted_2 = { key: 0 };
3609
- const _sfc_main$8 = /* @__PURE__ */ defineComponent({
3610
- __name: "ChatLogsPanel",
3611
- props: {
3612
- node: {},
3613
- slim: { type: Boolean },
3614
- workflow: {}
3615
- },
3616
- setup(__props) {
3617
- const locale = useI18n$1();
3618
- return (_ctx, _cache) => {
3619
- return openBlock(), createElementBlock("div", {
3620
- class: normalizeClass(_ctx.$style.logsWrapper),
3621
- "data-test-id": "lm-chat-logs"
3622
- }, [
3623
- createBaseVNode("header", {
3624
- class: normalizeClass(_ctx.$style.logsHeader)
3625
- }, [
3626
- createBaseVNode("div", _hoisted_1, [
3627
- createTextVNode(toDisplayString(unref(locale).baseText("chat.window.logs")) + " ", 1),
3628
- _ctx.node ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(unref(locale).baseText("chat.window.logsFromNode", { interpolate: { nodeName: _ctx.node.name } })), 1)) : createCommentVNode("", true)
3629
- ]),
3630
- createBaseVNode("div", {
3631
- class: normalizeClass(_ctx.$style.actions)
3632
- }, [
3633
- renderSlot(_ctx.$slots, "actions")
3634
- ], 2)
3635
- ], 2),
3636
- createBaseVNode("div", {
3637
- class: normalizeClass(_ctx.$style.logs)
3638
- }, [
3639
- _ctx.node ? (openBlock(), createBlock(RunDataAi, {
3640
- key: 0,
3641
- class: normalizeClass(_ctx.$style.runData),
3642
- node: _ctx.node,
3643
- workflow: _ctx.workflow,
3644
- slim: _ctx.slim
3645
- }, null, 8, ["class", "node", "workflow", "slim"])) : createCommentVNode("", true)
3646
- ], 2)
3647
- ], 2);
3648
- };
3649
- }
3650
- });
3651
- const logsHeader = "_logsHeader_1n9n2_123";
3652
- const logsWrapper = "_logsWrapper_1n9n2_140";
3653
- const logsTitle = "_logsTitle_1n9n2_149";
3654
- const logs$1 = "_logs_1n9n2_123";
3655
- const actions = "_actions_1n9n2_159";
3656
- const style0$5 = {
3657
- logsHeader,
3658
- logsWrapper,
3659
- logsTitle,
3660
- logs: logs$1,
3661
- actions
3662
- };
3663
- const cssModules$5 = {
3664
- "$style": style0$5
3608
+ const cssModules$7 = {
3609
+ "$style": style0$7
3665
3610
  };
3666
- const ChatLogsPanel = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__cssModules", cssModules$5]]);
3611
+ const ChatMessagesPanel = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["__cssModules", cssModules$7]]);
3667
3612
  const LOCAL_STORAGE_PANEL_HEIGHT = "N8N_CANVAS_CHAT_HEIGHT";
3668
3613
  const LOCAL_STORAGE_PANEL_WIDTH = "N8N_CANVAS_CHAT_WIDTH";
3614
+ const LOCAL_STORAGE_OVERVIEW_PANEL_WIDTH = "N8N_LOGS_OVERVIEW_PANEL_WIDTH";
3669
3615
  const MAX_WIDTH_PERCENTAGE = 0.8;
3670
3616
  const MIN_WIDTH_PERCENTAGE = 0.3;
3671
3617
  const MIN_HEIGHT_PERCENTAGE = 0.3;
@@ -3767,7 +3713,9 @@ function usePiPWindow({
3767
3713
  }) {
3768
3714
  const pipWindow = ref();
3769
3715
  const isUnmounting = ref(false);
3770
- const canPopOut = computed(() => !!window.documentPictureInPicture);
3716
+ const canPopOut = computed(
3717
+ () => !!window.documentPictureInPicture && window.parent === window
3718
+ );
3771
3719
  const isPoppedOut = computed(() => !!pipWindow.value);
3772
3720
  const tooltipContainer = computed(
3773
3721
  () => isPoppedOut.value ? content2.value ?? void 0 : void 0
@@ -3817,6 +3765,85 @@ function usePiPWindow({
3817
3765
  });
3818
3766
  return { canPopOut, isPoppedOut, pipWindow };
3819
3767
  }
3768
+ function isChatNode(node) {
3769
+ return [CHAT_TRIGGER_NODE_TYPE, MANUAL_CHAT_TRIGGER_NODE_TYPE].includes(node.type);
3770
+ }
3771
+ function getInputKey(node) {
3772
+ if (node.type === MANUAL_CHAT_TRIGGER_NODE_TYPE && node.typeVersion < 1.1) {
3773
+ return "input";
3774
+ }
3775
+ if (node.type === CHAT_TRIGGER_NODE_TYPE) {
3776
+ return "chatInput";
3777
+ }
3778
+ return "chatInput";
3779
+ }
3780
+ function extractChatInput(workflow, resultData) {
3781
+ const chatTrigger = workflow.nodes.find(isChatNode);
3782
+ if (chatTrigger === void 0) {
3783
+ return void 0;
3784
+ }
3785
+ const inputKey = getInputKey(chatTrigger);
3786
+ const runData = (resultData.runData[chatTrigger.name] ?? [])[0];
3787
+ const message = runData?.data?.[NodeConnectionTypes.Main]?.[0]?.[0]?.json?.[inputKey];
3788
+ if (runData === void 0 || typeof message !== "string") {
3789
+ return void 0;
3790
+ }
3791
+ return {
3792
+ text: message,
3793
+ sender: "user",
3794
+ id: v4()
3795
+ };
3796
+ }
3797
+ function extractBotResponse(resultData, executionId, emptyText2) {
3798
+ const lastNodeExecuted = resultData.lastNodeExecuted;
3799
+ if (!lastNodeExecuted) return void 0;
3800
+ const nodeResponseDataArray = get(resultData.runData, lastNodeExecuted) ?? [];
3801
+ const nodeResponseData = nodeResponseDataArray[nodeResponseDataArray.length - 1];
3802
+ let responseMessage;
3803
+ if (get(nodeResponseData, "error")) {
3804
+ responseMessage = "[ERROR: " + get(nodeResponseData, "error.message") + "]";
3805
+ } else {
3806
+ const responseData = get(nodeResponseData, "data.main[0][0].json");
3807
+ const text = extractResponseText(responseData) ?? emptyText2;
3808
+ if (!text) {
3809
+ return void 0;
3810
+ }
3811
+ responseMessage = text;
3812
+ }
3813
+ return {
3814
+ text: responseMessage,
3815
+ sender: "bot",
3816
+ id: executionId ?? v4()
3817
+ };
3818
+ }
3819
+ function extractResponseText(responseData) {
3820
+ if (!responseData || isEmpty(responseData)) {
3821
+ return void 0;
3822
+ }
3823
+ const paths = ["output", "text", "response.text"];
3824
+ const matchedPath = paths.find((path) => get(responseData, path));
3825
+ if (!matchedPath) return JSON.stringify(responseData, null, 2);
3826
+ const matchedOutput = get(responseData, matchedPath);
3827
+ if (typeof matchedOutput === "object") {
3828
+ return "```json\n" + JSON.stringify(matchedOutput, null, 2) + "\n```";
3829
+ }
3830
+ return matchedOutput?.toString() ?? "";
3831
+ }
3832
+ function restoreChatHistory(workflowExecutionData, emptyText2) {
3833
+ if (!workflowExecutionData?.data) {
3834
+ return [];
3835
+ }
3836
+ const userMessage = extractChatInput(
3837
+ workflowExecutionData.workflowData,
3838
+ workflowExecutionData.data.resultData
3839
+ );
3840
+ const botMessage = extractBotResponse(
3841
+ workflowExecutionData.data.resultData,
3842
+ workflowExecutionData.id,
3843
+ emptyText2
3844
+ );
3845
+ return [...userMessage ? [userMessage] : [], ...botMessage ? [botMessage] : []];
3846
+ }
3820
3847
  function useChatMessaging({
3821
3848
  chatTrigger,
3822
3849
  messages: messages2,
@@ -3874,13 +3901,7 @@ function useChatMessaging({
3874
3901
  showError(new Error("Chat Trigger Node could not be found!"), "Trigger Node not found");
3875
3902
  return;
3876
3903
  }
3877
- let inputKey = "chatInput";
3878
- if (triggerNode.type === MANUAL_CHAT_TRIGGER_NODE_TYPE && triggerNode.typeVersion < 1.1) {
3879
- inputKey = "input";
3880
- }
3881
- if (triggerNode.type === CHAT_TRIGGER_NODE_TYPE) {
3882
- inputKey = "chatInput";
3883
- }
3904
+ const inputKey = getInputKey(triggerNode);
3884
3905
  const inputPayload = {
3885
3906
  json: {
3886
3907
  sessionId: sessionId2.value,
@@ -3915,40 +3936,14 @@ function useChatMessaging({
3915
3936
  if (!response?.executionId) {
3916
3937
  return;
3917
3938
  }
3918
- processExecutionResultData(response.executionId);
3919
- }
3920
- function processExecutionResultData(executionId) {
3921
- const lastNodeExecuted = executionResultData.value?.lastNodeExecuted;
3922
- if (!lastNodeExecuted) return;
3923
- const nodeResponseDataArray = get(executionResultData.value.runData, lastNodeExecuted) ?? [];
3924
- const nodeResponseData = nodeResponseDataArray[nodeResponseDataArray.length - 1];
3925
- let responseMessage;
3926
- if (get(nodeResponseData, "error")) {
3927
- responseMessage = "[ERROR: " + get(nodeResponseData, "error.message") + "]";
3928
- } else {
3929
- const responseData = get(nodeResponseData, "data.main[0][0].json");
3930
- responseMessage = extractResponseMessage(responseData);
3931
- }
3932
- isLoading.value = false;
3933
- messages2.value.push({
3934
- text: responseMessage,
3935
- sender: "bot",
3936
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
3937
- id: executionId ?? v4()
3938
- });
3939
- }
3940
- function extractResponseMessage(responseData) {
3941
- if (!responseData || isEmpty(responseData)) {
3942
- return locale.baseText("chat.window.chat.response.empty");
3943
- }
3944
- const paths = ["output", "text", "response.text"];
3945
- const matchedPath = paths.find((path) => get(responseData, path));
3946
- if (!matchedPath) return JSON.stringify(responseData, null, 2);
3947
- const matchedOutput = get(responseData, matchedPath);
3948
- if (typeof matchedOutput === "object") {
3949
- return "```json\n" + JSON.stringify(matchedOutput, null, 2) + "\n```";
3939
+ const chatMessage = executionResultData.value ? extractBotResponse(
3940
+ executionResultData.value,
3941
+ response.executionId,
3942
+ locale.baseText("chat.window.chat.response.empty")
3943
+ ) : void 0;
3944
+ if (chatMessage !== void 0) {
3945
+ messages2.value.push(chatMessage);
3950
3946
  }
3951
- return matchedOutput?.toString() ?? "";
3952
3947
  }
3953
3948
  async function sendMessage(message, files) {
3954
3949
  previousMessageIndex.value = 0;
@@ -3975,7 +3970,6 @@ function useChatMessaging({
3975
3970
  const newMessage = {
3976
3971
  text: message,
3977
3972
  sender: "user",
3978
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
3979
3973
  sessionId: sessionId2.value,
3980
3974
  id: v4(),
3981
3975
  files
@@ -3986,8 +3980,7 @@ function useChatMessaging({
3986
3980
  return {
3987
3981
  previousMessageIndex,
3988
3982
  isLoading: computed(() => isLoading.value),
3989
- sendMessage,
3990
- extractResponseMessage
3983
+ sendMessage
3991
3984
  };
3992
3985
  }
3993
3986
  function useChatTrigger({
@@ -4008,9 +4001,7 @@ function useChatTrigger({
4008
4001
  return chatTriggerNode.value?.parameters?.options?.allowedFilesMimeTypes?.toString() ?? "";
4009
4002
  });
4010
4003
  function setChatTriggerNode() {
4011
- const triggerNode = unref(canvasNodes).find(
4012
- (node) => [CHAT_TRIGGER_NODE_TYPE$1, MANUAL_CHAT_TRIGGER_NODE_TYPE].includes(node.type)
4013
- );
4004
+ const triggerNode = unref(canvasNodes).find(isChatNode);
4014
4005
  if (!triggerNode) {
4015
4006
  return;
4016
4007
  }
@@ -4057,7 +4048,8 @@ function useChatTrigger({
4057
4048
  setConnectedNode
4058
4049
  };
4059
4050
  }
4060
- function useChatState(isDisabled, onWindowResize) {
4051
+ function useChatState(isReadOnly, onWindowResize) {
4052
+ const locale = useI18n$1();
4061
4053
  const workflowsStore = useWorkflowsStore();
4062
4054
  const nodeTypesStore = useNodeTypesStore();
4063
4055
  const canvasStore = useCanvasStore();
@@ -4123,10 +4115,16 @@ function useChatState(isDisabled, onWindowResize) {
4123
4115
  sendMessage,
4124
4116
  currentSessionId,
4125
4117
  isLoading,
4126
- isDisabled,
4118
+ isDisabled: computed(() => isReadOnly),
4127
4119
  allowFileUploads,
4128
- locale: useI18n$1()
4120
+ locale
4129
4121
  });
4122
+ const restoredChatMessages = computed(
4123
+ () => restoreChatHistory(
4124
+ workflowsStore.workflowExecutionData,
4125
+ locale.baseText("chat.window.chat.response.empty")
4126
+ )
4127
+ );
4130
4128
  provide(ChatSymbol, chatConfig);
4131
4129
  provide(ChatOptionsSymbol, chatOptions);
4132
4130
  watch(
@@ -4136,7 +4134,7 @@ function useChatState(isDisabled, onWindowResize) {
4136
4134
  setChatTriggerNode();
4137
4135
  setConnectedNode();
4138
4136
  setTimeout(() => {
4139
- onWindowResize();
4137
+ onWindowResize?.();
4140
4138
  chatEventBus.emit("focusInput");
4141
4139
  }, 0);
4142
4140
  }
@@ -4201,7 +4199,7 @@ function useChatState(isDisabled, onWindowResize) {
4201
4199
  }
4202
4200
  return {
4203
4201
  currentSessionId,
4204
- messages: messages2,
4202
+ messages: computed(() => isReadOnly ? restoredChatMessages.value : messages2.value),
4205
4203
  chatTriggerNode,
4206
4204
  connectedNode,
4207
4205
  sendMessage,
@@ -4210,191 +4208,6 @@ function useChatState(isDisabled, onWindowResize) {
4210
4208
  };
4211
4209
  }
4212
4210
  const _sfc_main$7 = /* @__PURE__ */ defineComponent({
4213
- __name: "CanvasChat",
4214
- setup(__props, { expose: __expose }) {
4215
- const workflowsStore = useWorkflowsStore();
4216
- const canvasStore = useCanvasStore();
4217
- const isDisabled = ref(false);
4218
- const container2 = ref();
4219
- const pipContainer = useTemplateRef("pipContainer");
4220
- const pipContent2 = useTemplateRef("pipContent");
4221
- const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4222
- const chatPanelState = computed(() => workflowsStore.logsPanelState);
4223
- const previousChatMessages = computed(() => workflowsStore.getPastChatMessages);
4224
- const resultData = computed(() => workflowsStore.getWorkflowRunData);
4225
- const telemetry = useTelemetry();
4226
- const {
4227
- height,
4228
- chatWidth,
4229
- rootStyles,
4230
- logsWidth,
4231
- onResizeDebounced,
4232
- onResizeChatDebounced,
4233
- onWindowResize
4234
- } = useResize(container2);
4235
- const { canPopOut, isPoppedOut, pipWindow } = usePiPWindow({
4236
- initialHeight: 400,
4237
- initialWidth: window.document.body.offsetWidth * 0.8,
4238
- container: pipContainer,
4239
- content: pipContent2,
4240
- shouldPopOut: computed(() => chatPanelState.value === LOGS_PANEL_STATE.FLOATING),
4241
- onRequestClose: () => {
4242
- if (chatPanelState.value === LOGS_PANEL_STATE.CLOSED) {
4243
- return;
4244
- }
4245
- telemetry.track("User toggled log view", { new_state: "attached" });
4246
- workflowsStore.setPreferPoppedOutLogsView(false);
4247
- }
4248
- });
4249
- const {
4250
- currentSessionId,
4251
- messages: messages2,
4252
- chatTriggerNode,
4253
- connectedNode,
4254
- sendMessage,
4255
- refreshSession,
4256
- displayExecution
4257
- } = useChatState(isDisabled, onWindowResize);
4258
- __expose({
4259
- messages: messages2,
4260
- currentSessionId,
4261
- isDisabled,
4262
- workflow
4263
- });
4264
- const closePanel = () => {
4265
- workflowsStore.toggleLogsPanelOpen(false);
4266
- };
4267
- function onPopOut() {
4268
- telemetry.track("User toggled log view", { new_state: "floating" });
4269
- workflowsStore.toggleLogsPanelOpen(true);
4270
- workflowsStore.setPreferPoppedOutLogsView(true);
4271
- }
4272
- watchEffect(() => {
4273
- canvasStore.setPanelHeight(chatPanelState.value === LOGS_PANEL_STATE.ATTACHED ? height.value : 0);
4274
- });
4275
- return (_ctx, _cache) => {
4276
- const _component_n8n_icon_button = resolveComponent("n8n-icon-button");
4277
- return openBlock(), createElementBlock("div", {
4278
- ref_key: "pipContainer",
4279
- ref: pipContainer
4280
- }, [
4281
- createBaseVNode("div", {
4282
- ref_key: "pipContent",
4283
- ref: pipContent2,
4284
- class: normalizeClass(_ctx.$style.pipContent)
4285
- }, [
4286
- unref(chatTriggerNode) ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
4287
- key: 0,
4288
- "is-resizing-enabled": !unref(isPoppedOut) && chatPanelState.value === unref(LOGS_PANEL_STATE).ATTACHED,
4289
- "supported-directions": ["top"],
4290
- class: normalizeClass([_ctx.$style.resizeWrapper, chatPanelState.value === unref(LOGS_PANEL_STATE).CLOSED && _ctx.$style.empty]),
4291
- height: unref(height),
4292
- style: normalizeStyle(unref(rootStyles)),
4293
- onResize: unref(onResizeDebounced)
4294
- }, {
4295
- default: withCtx(() => [
4296
- createBaseVNode("div", {
4297
- ref_key: "container",
4298
- ref: container2,
4299
- class: normalizeClass([_ctx.$style.container, "ignore-key-press-canvas"]),
4300
- tabindex: "0"
4301
- }, [
4302
- chatPanelState.value !== unref(LOGS_PANEL_STATE).CLOSED ? (openBlock(), createElementBlock("div", {
4303
- key: 0,
4304
- class: normalizeClass(_ctx.$style.chatResizer)
4305
- }, [
4306
- createVNode(unref(N8nResizeWrapper), {
4307
- "supported-directions": ["right"],
4308
- width: unref(chatWidth),
4309
- class: normalizeClass(_ctx.$style.chat),
4310
- window: unref(pipWindow),
4311
- onResize: unref(onResizeChatDebounced)
4312
- }, {
4313
- default: withCtx(() => [
4314
- createBaseVNode("div", {
4315
- class: normalizeClass(_ctx.$style.inner)
4316
- }, [
4317
- createVNode(ChatMessagesPanel, {
4318
- "data-test-id": "canvas-chat",
4319
- messages: unref(messages2),
4320
- "session-id": unref(currentSessionId),
4321
- "past-chat-messages": previousChatMessages.value,
4322
- "show-close-button": !unref(isPoppedOut) && !unref(connectedNode),
4323
- onClose: closePanel,
4324
- onRefreshSession: unref(refreshSession),
4325
- onDisplayExecution: unref(displayExecution),
4326
- onSendMessage: unref(sendMessage)
4327
- }, null, 8, ["messages", "session-id", "past-chat-messages", "show-close-button", "onRefreshSession", "onDisplayExecution", "onSendMessage"])
4328
- ], 2)
4329
- ]),
4330
- _: 1
4331
- }, 8, ["width", "class", "window", "onResize"]),
4332
- unref(connectedNode) ? (openBlock(), createElementBlock("div", {
4333
- key: 0,
4334
- class: normalizeClass(_ctx.$style.logs)
4335
- }, [
4336
- (openBlock(), createBlock(ChatLogsPanel, {
4337
- key: `${resultData.value?.length ?? unref(messages2)?.length}`,
4338
- workflow: workflow.value,
4339
- "data-test-id": "canvas-chat-logs",
4340
- node: unref(connectedNode),
4341
- slim: unref(logsWidth) < 700
4342
- }, {
4343
- actions: withCtx(() => [
4344
- unref(canPopOut) && !unref(isPoppedOut) ? (openBlock(), createBlock(_component_n8n_icon_button, {
4345
- key: 0,
4346
- icon: "pop-out",
4347
- type: "secondary",
4348
- size: "medium",
4349
- onClick: onPopOut
4350
- })) : createCommentVNode("", true),
4351
- !unref(isPoppedOut) ? (openBlock(), createBlock(_component_n8n_icon_button, {
4352
- key: 1,
4353
- outline: "",
4354
- icon: "times",
4355
- type: "secondary",
4356
- size: "medium",
4357
- onClick: closePanel
4358
- })) : createCommentVNode("", true)
4359
- ]),
4360
- _: 1
4361
- }, 8, ["workflow", "node", "slim"]))
4362
- ], 2)) : createCommentVNode("", true)
4363
- ], 2)) : createCommentVNode("", true)
4364
- ], 2)
4365
- ]),
4366
- _: 1
4367
- }, 8, ["is-resizing-enabled", "class", "height", "style", "onResize"])) : createCommentVNode("", true)
4368
- ], 2)
4369
- ], 512);
4370
- };
4371
- }
4372
- });
4373
- const resizeWrapper$1 = "_resizeWrapper_1aajp_124";
4374
- const pipContent$1 = "_pipContent_1aajp_129";
4375
- const empty$1 = "_empty_1aajp_140";
4376
- const container$4 = "_container_1aajp_146";
4377
- const chatResizer = "_chatResizer_1aajp_154";
4378
- const footer = "_footer_1aajp_161";
4379
- const chat$1 = "_chat_1aajp_154";
4380
- const inner = "_inner_1aajp_180";
4381
- const logs = "_logs_1aajp_188";
4382
- const style0$4 = {
4383
- resizeWrapper: resizeWrapper$1,
4384
- pipContent: pipContent$1,
4385
- empty: empty$1,
4386
- container: container$4,
4387
- chatResizer,
4388
- footer,
4389
- chat: chat$1,
4390
- inner,
4391
- logs
4392
- };
4393
- const cssModules$4 = {
4394
- "$style": style0$4
4395
- };
4396
- const __unplugin_components_0 = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__cssModules", cssModules$4]]);
4397
- const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4398
4211
  __name: "ConsumedTokenCountText",
4399
4212
  props: {
4400
4213
  consumedTokens: {}
@@ -4402,7 +4215,7 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4402
4215
  setup(__props) {
4403
4216
  const locale = useI18n$1();
4404
4217
  return (_ctx, _cache) => {
4405
- const _component_ConsumedTokensDetails = _sfc_main$j;
4218
+ const _component_ConsumedTokensDetails = _sfc_main$i;
4406
4219
  return _ctx.consumedTokens !== void 0 ? (openBlock(), createBlock(unref(N8nTooltip), {
4407
4220
  key: 0,
4408
4221
  enterable: false
@@ -4422,12 +4235,13 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4422
4235
  };
4423
4236
  }
4424
4237
  });
4425
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4238
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
4426
4239
  __name: "LogsOverviewRow",
4427
4240
  props: {
4428
4241
  data: {},
4429
4242
  node: {},
4430
4243
  isSelected: { type: Boolean },
4244
+ isReadOnly: { type: Boolean },
4431
4245
  shouldShowConsumedTokens: { type: Boolean },
4432
4246
  isCompact: { type: Boolean }
4433
4247
  },
@@ -4436,6 +4250,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4436
4250
  const props = __props;
4437
4251
  const emit = __emit;
4438
4252
  const locale = useI18n$1();
4253
+ const containerRef = useTemplateRef("containerRef");
4439
4254
  const workflowsStore = useWorkflowsStore();
4440
4255
  const nodeTypeStore = useNodeTypesStore();
4441
4256
  const node = computed(() => workflowsStore.nodesByName[props.data.node]);
@@ -4470,10 +4285,21 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4470
4285
  const lastSibling = siblings[siblings.length - 1];
4471
4286
  return data === void 0 && lastSibling === void 0 || data?.node === lastSibling?.node && data?.runIndex === lastSibling?.runIndex;
4472
4287
  }
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
+ );
4473
4297
  return (_ctx, _cache) => {
4474
- const _component_NodeIcon = _sfc_main$k;
4298
+ const _component_NodeIcon = _sfc_main$j;
4475
4299
  return node.value !== void 0 ? (openBlock(), createElementBlock("div", {
4476
4300
  key: 0,
4301
+ ref_key: "containerRef",
4302
+ ref: containerRef,
4477
4303
  class: normalizeClass({
4478
4304
  [_ctx.$style.container]: true,
4479
4305
  [_ctx.$style.compact]: props.isCompact,
@@ -4571,7 +4397,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4571
4397
  class: normalizeClass(_ctx.$style.consumedTokens)
4572
4398
  }, {
4573
4399
  default: withCtx(() => [
4574
- subtreeConsumedTokens.value.totalTokens > 0 && (props.data.children.length === 0 || !props.node.expanded) ? (openBlock(), createBlock(_sfc_main$6, {
4400
+ subtreeConsumedTokens.value.totalTokens > 0 && (props.data.children.length === 0 || !props.node.expanded) ? (openBlock(), createBlock(_sfc_main$7, {
4575
4401
  key: 0,
4576
4402
  "consumed-tokens": subtreeConsumedTokens.value
4577
4403
  }, null, 8, ["consumed-tokens"])) : createCommentVNode("", true)
@@ -4585,7 +4411,8 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4585
4411
  icon: "exclamation-triangle",
4586
4412
  class: normalizeClass(_ctx.$style.compactErrorIcon)
4587
4413
  }, null, 8, ["class"])) : createCommentVNode("", true),
4588
- createVNode(unref(_sfc_main$i), {
4414
+ !props.isReadOnly ? (openBlock(), createBlock(unref(_sfc_main$h), {
4415
+ key: 2,
4589
4416
  type: "secondary",
4590
4417
  size: "small",
4591
4418
  icon: "play",
@@ -4593,8 +4420,8 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4593
4420
  "aria-label": unref(locale).baseText("logs.overview.body.run"),
4594
4421
  class: normalizeClass([_ctx.$style.partialExecutionButton, depth.value > 0 ? _ctx.$style.unavailable : ""]),
4595
4422
  onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("triggerPartialExecution", props.data), ["stop"]))
4596
- }, null, 8, ["aria-label", "class"]),
4597
- createVNode(unref(_sfc_main$i), {
4423
+ }, null, 8, ["aria-label", "class"])) : createCommentVNode("", true),
4424
+ createVNode(unref(_sfc_main$h), {
4598
4425
  type: "secondary",
4599
4426
  size: "small",
4600
4427
  icon: "external-link-alt",
@@ -4604,7 +4431,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4604
4431
  onClick: _cache[1] || (_cache[1] = withModifiers(($event) => emit("openNdv", props.data), ["stop"]))
4605
4432
  }, null, 8, ["class", "aria-label"]),
4606
4433
  !_ctx.isCompact || props.data.children.length > 0 ? (openBlock(), createBlock(unref(N8nButton), {
4607
- key: 2,
4434
+ key: 3,
4608
4435
  type: "secondary",
4609
4436
  size: "small",
4610
4437
  square: true,
@@ -4629,35 +4456,35 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4629
4456
  };
4630
4457
  }
4631
4458
  });
4632
- const container$3 = "_container_1jepl_123";
4633
- const background = "_background_1jepl_140";
4634
- const selected = "_selected_1jepl_149";
4635
- const error = "_error_1jepl_152";
4636
- const indent = "_indent_1jepl_156";
4637
- const connectorCurved = "_connectorCurved_1jepl_165";
4638
- const connectorStraight = "_connectorStraight_1jepl_175";
4639
- const icon = "_icon_1jepl_184";
4640
- const name = "_name_1jepl_190";
4641
- const timeTook = "_timeTook_1jepl_195";
4642
- const errorIcon = "_errorIcon_1jepl_200";
4643
- const compact = "_compact_1jepl_204";
4644
- const startedAt = "_startedAt_1jepl_211";
4645
- const consumedTokens = "_consumedTokens_1jepl_220";
4646
- const compactErrorIcon = "_compactErrorIcon_1jepl_233";
4647
- const partialExecutionButton = "_partialExecutionButton_1jepl_241";
4648
- const openNdvButton = "_openNdvButton_1jepl_242";
4649
- const unavailable = "_unavailable_1jepl_252";
4650
- const toggleButton = "_toggleButton_1jepl_260";
4651
- const style0$3 = {
4652
- container: container$3,
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";
4478
+ const style0$6 = {
4479
+ container: container$5,
4653
4480
  background,
4654
4481
  selected,
4655
4482
  error,
4656
4483
  indent,
4657
4484
  connectorCurved,
4658
4485
  connectorStraight,
4659
- icon,
4660
- name,
4486
+ icon: icon$1,
4487
+ name: name$1,
4661
4488
  timeTook,
4662
4489
  errorIcon,
4663
4490
  compact,
@@ -4669,15 +4496,62 @@ const style0$3 = {
4669
4496
  unavailable,
4670
4497
  toggleButton
4671
4498
  };
4672
- const cssModules$3 = {
4673
- "$style": style0$3
4499
+ const cssModules$6 = {
4500
+ "$style": style0$6
4674
4501
  };
4675
- const LogsOverviewRow = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__cssModules", cssModules$3]]);
4502
+ const LogsOverviewRow = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__cssModules", cssModules$6]]);
4503
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
4504
+ __name: "ExecutionSummary",
4505
+ props: {
4506
+ status: {},
4507
+ consumedTokens: {},
4508
+ timeTook: {}
4509
+ },
4510
+ setup(__props) {
4511
+ const locale = useI18n$1();
4512
+ const executionStatusText = computed(
4513
+ () => __props.timeTook === void 0 ? upperFirst(__props.status) : locale.baseText("logs.overview.body.summaryText", {
4514
+ interpolate: {
4515
+ status: upperFirst(__props.status),
4516
+ time: locale.displayTimer(__props.timeTook, true)
4517
+ }
4518
+ })
4519
+ );
4520
+ return (_ctx, _cache) => {
4521
+ return openBlock(), createBlock(unref(N8nText), {
4522
+ tag: "div",
4523
+ color: "text-light",
4524
+ size: "small",
4525
+ class: normalizeClass(_ctx.$style.container)
4526
+ }, {
4527
+ default: withCtx(() => [
4528
+ createBaseVNode("span", null, toDisplayString(executionStatusText.value), 1),
4529
+ _ctx.consumedTokens.totalTokens > 0 ? (openBlock(), createBlock(_sfc_main$7, {
4530
+ key: 0,
4531
+ "consumed-tokens": _ctx.consumedTokens
4532
+ }, null, 8, ["consumed-tokens"])) : createCommentVNode("", true)
4533
+ ]),
4534
+ _: 1
4535
+ }, 8, ["class"]);
4536
+ };
4537
+ }
4538
+ });
4539
+ const container$4 = "_container_pt5hk_123";
4540
+ const style0$5 = {
4541
+ container: container$4
4542
+ };
4543
+ const cssModules$5 = {
4544
+ "$style": style0$5
4545
+ };
4546
+ const ExecutionSummary = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__cssModules", cssModules$5]]);
4676
4547
  const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4677
4548
  __name: "LogsOverviewPanel",
4678
4549
  props: {
4679
4550
  isOpen: { type: Boolean },
4680
- selected: {}
4551
+ selected: {},
4552
+ isReadOnly: { type: Boolean },
4553
+ isCompact: { type: Boolean },
4554
+ executionTree: {}
4681
4555
  },
4682
4556
  emits: ["clickHeader", "select"],
4683
4557
  setup(__props, { emit: __emit }) {
@@ -4691,48 +4565,25 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4691
4565
  const nodeHelpers = useNodeHelpers();
4692
4566
  const isClearExecutionButtonVisible = useClearExecutionButtonVisible();
4693
4567
  const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4694
- const executionTree = computed(
4695
- () => createLogEntries(
4696
- workflow.value,
4697
- workflowsStore.workflowExecutionData?.data?.resultData.runData ?? {}
4698
- )
4699
- );
4700
4568
  const isEmpty2 = computed(() => workflowsStore.workflowExecutionData === null);
4701
4569
  const switchViewOptions = computed(() => [
4702
4570
  { label: locale.baseText("logs.overview.header.switch.details"), value: "details" },
4703
4571
  { label: locale.baseText("logs.overview.header.switch.overview"), value: "overview" }
4704
4572
  ]);
4705
- const executionStatusText = computed(() => {
4706
- const execution = workflowsStore.workflowExecutionData;
4707
- if (!execution) {
4708
- return void 0;
4709
- }
4710
- if (execution.startedAt && execution.stoppedAt) {
4711
- return locale.baseText("logs.overview.body.summaryText", {
4712
- interpolate: {
4713
- status: upperFirst(execution.status),
4714
- time: locale.displayTimer(
4715
- +new Date(execution.stoppedAt) - +new Date(execution.startedAt),
4716
- true
4717
- )
4718
- }
4719
- });
4720
- }
4721
- return upperFirst(execution.status);
4722
- });
4573
+ const execution = computed(() => workflowsStore.workflowExecutionData);
4723
4574
  const consumedTokens2 = computed(
4724
- () => getTotalConsumedTokens(...executionTree.value.map(getSubtreeTotalConsumedTokens))
4575
+ () => getTotalConsumedTokens(...__props.executionTree.map(getSubtreeTotalConsumedTokens))
4725
4576
  );
4726
4577
  function onClearExecutionData() {
4727
4578
  workflowsStore.setWorkflowExecutionData(null);
4728
4579
  nodeHelpers.updateNodesExecutionIssues();
4729
4580
  }
4730
4581
  function handleClickNode(clicked) {
4731
- if (__props.selected?.node === clicked.node && __props.selected.runIndex === clicked.runIndex) {
4582
+ if (__props.selected?.node === clicked.node && __props.selected?.runIndex === clicked.runIndex) {
4732
4583
  emit("select", void 0);
4733
4584
  return;
4734
4585
  }
4735
- emit("select", { node: clicked.node, runIndex: clicked.runIndex });
4586
+ emit("select", clicked);
4736
4587
  telemetry.track("User selected node in log view", {
4737
4588
  node_type: workflowsStore.nodesByName[clicked.node].type,
4738
4589
  node_id: workflowsStore.nodesByName[clicked.node].id,
@@ -4741,10 +4592,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4741
4592
  });
4742
4593
  }
4743
4594
  function handleSwitchView(value) {
4744
- emit(
4745
- "select",
4746
- value === "overview" || executionTree.value.length === 0 ? void 0 : executionTree.value[0]
4747
- );
4595
+ emit("select", value === "overview" || __props.executionTree.length === 0 ? void 0 : __props.executionTree[0]);
4748
4596
  }
4749
4597
  function handleToggleExpanded(treeNode) {
4750
4598
  treeNode.expanded = !treeNode.expanded;
@@ -4776,13 +4624,14 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4776
4624
  type: "secondary",
4777
4625
  icon: "trash",
4778
4626
  "icon-size": "medium",
4627
+ class: normalizeClass(_ctx.$style.clearButton),
4779
4628
  onClick: withModifiers(onClearExecutionData, ["stop"])
4780
4629
  }, {
4781
4630
  default: withCtx(() => [
4782
4631
  createTextVNode(toDisplayString(unref(locale).baseText("logs.overview.header.actions.clearExecution")), 1)
4783
4632
  ]),
4784
4633
  _: 1
4785
- })
4634
+ }, 8, ["class"])
4786
4635
  ]),
4787
4636
  _: 1
4788
4637
  }, 8, ["content"])) : createCommentVNode("", true),
@@ -4811,28 +4660,19 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4811
4660
  key: 1,
4812
4661
  class: normalizeClass(_ctx.$style.scrollable)
4813
4662
  }, [
4814
- executionStatusText.value !== void 0 ? (openBlock(), createBlock(unref(N8nText), {
4663
+ execution.value ? (openBlock(), createBlock(ExecutionSummary, {
4815
4664
  key: 0,
4816
- tag: "div",
4817
- color: "text-light",
4818
- size: "small",
4819
- class: normalizeClass(_ctx.$style.summary)
4820
- }, {
4821
- default: withCtx(() => [
4822
- createBaseVNode("span", null, toDisplayString(executionStatusText.value), 1),
4823
- consumedTokens2.value.totalTokens > 0 ? (openBlock(), createBlock(_sfc_main$6, {
4824
- key: 0,
4825
- "consumed-tokens": consumedTokens2.value
4826
- }, null, 8, ["consumed-tokens"])) : createCommentVNode("", true)
4827
- ]),
4828
- _: 1
4829
- }, 8, ["class"])) : createCommentVNode("", true),
4830
- executionTree.value.length > 0 ? (openBlock(), createBlock(unref(ElTree), {
4665
+ class: normalizeClass(_ctx.$style.summary),
4666
+ status: execution.value.status,
4667
+ "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
4669
+ }, null, 8, ["class", "status", "consumed-tokens", "time-took"])) : createCommentVNode("", true),
4670
+ _ctx.executionTree.length > 0 ? (openBlock(), createBlock(unref(ElTree), {
4831
4671
  key: 1,
4832
4672
  "node-key": "id",
4833
4673
  class: normalizeClass(_ctx.$style.tree),
4834
4674
  indent: 0,
4835
- data: executionTree.value,
4675
+ data: _ctx.executionTree,
4836
4676
  "expand-on-click-node": false,
4837
4677
  "default-expand-all": true,
4838
4678
  onNodeClick: handleClickNode
@@ -4841,13 +4681,14 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4841
4681
  createVNode(LogsOverviewRow, {
4842
4682
  data,
4843
4683
  node: elTreeNode,
4684
+ "is-read-only": _ctx.isReadOnly,
4844
4685
  "is-selected": data.node === _ctx.selected?.node && data.runIndex === _ctx.selected?.runIndex,
4845
- "is-compact": _ctx.selected !== void 0,
4686
+ "is-compact": _ctx.isCompact,
4846
4687
  "should-show-consumed-tokens": consumedTokens2.value.totalTokens > 0,
4847
4688
  onToggleExpanded: handleToggleExpanded,
4848
4689
  onOpenNdv: handleOpenNdv,
4849
4690
  onTriggerPartialExecution: handleTriggerPartialExecution
4850
- }, null, 8, ["data", "node", "is-selected", "is-compact", "should-show-consumed-tokens"])
4691
+ }, null, 8, ["data", "node", "is-read-only", "is-selected", "is-compact", "should-show-consumed-tokens"])
4851
4692
  ]),
4852
4693
  _: 1
4853
4694
  }, 8, ["class", "data"])) : createCommentVNode("", true),
@@ -4864,16 +4705,18 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
4864
4705
  };
4865
4706
  }
4866
4707
  });
4867
- const container$2 = "_container_1xh09_123";
4868
- const content$1 = "_content_1xh09_133";
4869
- const empty = "_empty_1xh09_142";
4870
- const emptyText = "_emptyText_1xh09_147";
4871
- const scrollable = "_scrollable_1xh09_152";
4872
- const summary = "_summary_1xh09_159";
4873
- const tree = "_tree_1xh09_171";
4874
- const switchViewButtons = "_switchViewButtons_1xh09_178";
4875
- const style0$2 = {
4876
- container: container$2,
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";
4717
+ const style0$4 = {
4718
+ container: container$3,
4719
+ clearButton,
4877
4720
  content: content$1,
4878
4721
  empty,
4879
4722
  emptyText,
@@ -4882,29 +4725,340 @@ const style0$2 = {
4882
4725
  tree,
4883
4726
  switchViewButtons
4884
4727
  };
4885
- const cssModules$2 = {
4886
- "$style": style0$2
4728
+ const cssModules$4 = {
4729
+ "$style": style0$4
4887
4730
  };
4888
- const LogsOverviewPanel = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__cssModules", cssModules$2]]);
4731
+ const LogsOverviewPanel = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__cssModules", cssModules$4]]);
4889
4732
  const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4733
+ __name: "RunDataView",
4734
+ props: {
4735
+ title: {},
4736
+ paneType: {},
4737
+ logEntry: {}
4738
+ },
4739
+ setup(__props) {
4740
+ const locale = useI18n$1();
4741
+ const workflowsStore = useWorkflowsStore();
4742
+ const ndvStore = useNDVStore();
4743
+ const workflow = computed(() => workflowsStore.getCurrentWorkflow());
4744
+ const node = computed(() => {
4745
+ if (__props.logEntry.depth > 0 || __props.paneType === "output") {
4746
+ return workflowsStore.nodesByName[__props.logEntry.node];
4747
+ }
4748
+ const parent = workflow.value.getParentNodesByDepth(__props.logEntry.node)[0];
4749
+ if (!parent) {
4750
+ return void 0;
4751
+ }
4752
+ return workflowsStore.nodesByName[parent.name];
4753
+ });
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
+ function handleClickOpenNdv() {
4761
+ ndvStore.setActiveNodeName(__props.logEntry.node);
4762
+ }
4763
+ 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,
4769
+ "too-much-data-title": unref(locale).baseText("ndv.output.tooMuchData.title"),
4770
+ "no-data-in-branch-message": unref(locale).baseText("ndv.output.noOutputDataInBranch"),
4771
+ "executing-message": unref(locale).baseText("ndv.output.executing"),
4772
+ "pane-type": _ctx.paneType,
4773
+ "disable-run-index-selection": true,
4774
+ compact: true,
4775
+ "disable-pin": true,
4776
+ "disable-edit": true,
4777
+ "table-header-bg-color": "light"
4778
+ }, createSlots({
4779
+ header: withCtx(() => [
4780
+ createVNode(unref(N8nText), {
4781
+ class: normalizeClass(_ctx.$style.title),
4782
+ bold: true,
4783
+ color: "text-light",
4784
+ size: "small"
4785
+ }, {
4786
+ default: withCtx(() => [
4787
+ createTextVNode(toDisplayString(_ctx.title), 1)
4788
+ ]),
4789
+ _: 1
4790
+ }, 8, ["class"])
4791
+ ]),
4792
+ "no-output-data": withCtx(() => [
4793
+ createVNode(unref(N8nText), {
4794
+ bold: true,
4795
+ color: "text-dark",
4796
+ size: "large"
4797
+ }, {
4798
+ default: withCtx(() => [
4799
+ createTextVNode(toDisplayString(unref(locale).baseText("ndv.output.noOutputData.title")), 1)
4800
+ ]),
4801
+ _: 1
4802
+ })
4803
+ ]),
4804
+ _: 2
4805
+ }, [
4806
+ isMultipleInput.value ? {
4807
+ name: "content",
4808
+ fn: withCtx(() => []),
4809
+ key: "0"
4810
+ } : void 0,
4811
+ isMultipleInput.value ? {
4812
+ name: "callout-message",
4813
+ fn: withCtx(() => [
4814
+ createVNode(unref(I18nT), { keypath: "logs.details.body.multipleInputs" }, {
4815
+ button: withCtx(() => [
4816
+ createVNode(unref(N8nLink), {
4817
+ size: "small",
4818
+ onClick: handleClickOpenNdv
4819
+ }, {
4820
+ default: withCtx(() => [
4821
+ createTextVNode(toDisplayString(unref(locale).baseText("logs.details.body.multipleInputs.openingTheNode")), 1)
4822
+ ]),
4823
+ _: 1
4824
+ })
4825
+ ]),
4826
+ _: 1
4827
+ })
4828
+ ]),
4829
+ key: "1"
4830
+ } : void 0
4831
+ ]), 1032, ["node", "workflow", "run-index", "too-much-data-title", "no-data-in-branch-message", "executing-message", "pane-type"])) : createCommentVNode("", true);
4832
+ };
4833
+ }
4834
+ });
4835
+ const title$1 = "_title_1ur7r_123";
4836
+ const style0$3 = {
4837
+ title: title$1
4838
+ };
4839
+ const cssModules$3 = {
4840
+ "$style": style0$3
4841
+ };
4842
+ const RunDataView = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__cssModules", cssModules$3]]);
4843
+ function useResizablePanel(localStorageKey, {
4844
+ container: container2,
4845
+ defaultSize,
4846
+ snap = true,
4847
+ minSize = 0,
4848
+ maxSize = (size) => size,
4849
+ position = "left",
4850
+ allowCollapse,
4851
+ allowFullSize
4852
+ }) {
4853
+ const containerSize = ref(0);
4854
+ const size = useLocalStorage(localStorageKey, -1, { writeDefaults: false });
4855
+ const isResizing = ref(false);
4856
+ const constrainedSize = computed(() => {
4857
+ if (isResizing.value && allowCollapse && size.value < 30) {
4858
+ return 0;
4859
+ }
4860
+ if (isResizing.value && allowFullSize && size.value > containerSize.value - 30) {
4861
+ return containerSize.value;
4862
+ }
4863
+ const defaultSizeValue = resolveSize(defaultSize, containerSize.value);
4864
+ if (Number.isNaN(size.value) || size.value < 0) {
4865
+ return defaultSizeValue;
4866
+ }
4867
+ const minSizeValue = resolveSize(minSize, containerSize.value);
4868
+ const maxSizeValue = resolveSize(maxSize, containerSize.value);
4869
+ return Math.max(
4870
+ minSizeValue,
4871
+ Math.min(
4872
+ snap && Math.abs(defaultSizeValue - size.value) < 30 ? defaultSizeValue : size.value,
4873
+ maxSizeValue
4874
+ )
4875
+ );
4876
+ });
4877
+ function getSize(el) {
4878
+ return position === "bottom" ? el.height : el.width;
4879
+ }
4880
+ function getOffsetSize(el) {
4881
+ return position === "bottom" ? el.offsetHeight : el.offsetWidth;
4882
+ }
4883
+ function getValue(data) {
4884
+ return position === "bottom" ? data.y : data.x;
4885
+ }
4886
+ function resolveSize(getter, containerSizeValue) {
4887
+ return typeof getter === "number" ? getter : getter(containerSizeValue);
4888
+ }
4889
+ function onResize(data) {
4890
+ const containerRect = unref(container2)?.getBoundingClientRect();
4891
+ isResizing.value = true;
4892
+ size.value = Math.max(
4893
+ 0,
4894
+ position === "bottom" ? (containerRect ? getSize(containerRect) : 0) - getValue(data) : getValue(data) - (containerRect ? getValue(containerRect) : 0)
4895
+ );
4896
+ }
4897
+ function onResizeEnd() {
4898
+ isResizing.value = false;
4899
+ }
4900
+ watch(
4901
+ () => unref(container2),
4902
+ (el, _, onCleanUp) => {
4903
+ if (!el) {
4904
+ return;
4905
+ }
4906
+ const observer = new ResizeObserver(() => {
4907
+ containerSize.value = getOffsetSize(el);
4908
+ });
4909
+ observer.observe(el);
4910
+ containerSize.value = getOffsetSize(el);
4911
+ onCleanUp(() => observer.disconnect());
4912
+ },
4913
+ { immediate: true }
4914
+ );
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
+ return {
4922
+ isResizing: computed(() => isResizing.value),
4923
+ isCollapsed: computed(() => isResizing.value && constrainedSize.value <= 0),
4924
+ isFullSize: computed(() => isResizing.value && constrainedSize.value >= containerSize.value),
4925
+ size: constrainedSize,
4926
+ onResize,
4927
+ onResizeEnd
4928
+ };
4929
+ }
4930
+ const MIN_IO_PANEL_WIDTH = 200;
4931
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4890
4932
  __name: "LogDetailsPanel",
4891
4933
  props: {
4892
- isOpen: { type: Boolean }
4934
+ isOpen: { type: Boolean },
4935
+ logEntry: {},
4936
+ window: {}
4893
4937
  },
4894
4938
  emits: ["clickHeader"],
4895
4939
  setup(__props, { emit: __emit }) {
4896
4940
  const emit = __emit;
4941
+ const locale = useI18n$1();
4942
+ const telemetry = useTelemetry();
4943
+ const workflowsStore = useWorkflowsStore();
4944
+ 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]
4950
+ );
4951
+ const consumedTokens2 = computed(() => getSubtreeTotalConsumedTokens(__props.logEntry));
4952
+ const isTriggerNode = computed(() => type.value?.group.includes("trigger"));
4953
+ const container2 = useTemplateRef("container");
4954
+ const resizer = useResizablePanel("N8N_LOGS_INPUT_PANEL_WIDTH", {
4955
+ container: container2,
4956
+ defaultSize: (size) => size / 2,
4957
+ minSize: MIN_IO_PANEL_WIDTH,
4958
+ maxSize: (size) => size - MIN_IO_PANEL_WIDTH,
4959
+ allowCollapse: true,
4960
+ allowFullSize: true
4961
+ });
4962
+ const shouldResize = computed(() => content2.value === LOG_DETAILS_CONTENT.BOTH);
4963
+ function handleToggleInput(open) {
4964
+ const wasOpen = [LOG_DETAILS_CONTENT.INPUT, LOG_DETAILS_CONTENT.BOTH].includes(content2.value);
4965
+ if (open === wasOpen) {
4966
+ return;
4967
+ }
4968
+ content2.value = wasOpen ? LOG_DETAILS_CONTENT.OUTPUT : LOG_DETAILS_CONTENT.BOTH;
4969
+ telemetry.track("User toggled log view sub pane", {
4970
+ pane: "input",
4971
+ newState: wasOpen ? "hidden" : "visible"
4972
+ });
4973
+ }
4974
+ function handleToggleOutput(open) {
4975
+ const wasOpen = [LOG_DETAILS_CONTENT.OUTPUT, LOG_DETAILS_CONTENT.BOTH].includes(content2.value);
4976
+ if (open === wasOpen) {
4977
+ return;
4978
+ }
4979
+ content2.value = wasOpen ? LOG_DETAILS_CONTENT.INPUT : LOG_DETAILS_CONTENT.BOTH;
4980
+ telemetry.track("User toggled log view sub pane", {
4981
+ pane: "output",
4982
+ newState: wasOpen ? "hidden" : "visible"
4983
+ });
4984
+ }
4985
+ function handleResizeEnd() {
4986
+ if (resizer.isCollapsed.value) {
4987
+ handleToggleInput(false);
4988
+ }
4989
+ if (resizer.isFullSize.value) {
4990
+ handleToggleOutput(false);
4991
+ }
4992
+ resizer.onResizeEnd();
4993
+ }
4897
4994
  return (_ctx, _cache) => {
4898
4995
  return openBlock(), createElementBlock("div", {
4996
+ ref_key: "container",
4997
+ ref: container2,
4899
4998
  class: normalizeClass(_ctx.$style.container),
4900
4999
  "data-test-id": "log-details"
4901
5000
  }, [
4902
5001
  createVNode(PanelHeader, {
4903
- title: "Log details",
4904
- "data-test-id": "logs-details-header",
5002
+ "data-test-id": "log-details-header",
4905
5003
  onClick: _cache[0] || (_cache[0] = ($event) => emit("clickHeader"))
4906
5004
  }, {
5005
+ title: withCtx(() => [
5006
+ createBaseVNode("div", {
5007
+ class: normalizeClass(_ctx.$style.title)
5008
+ }, [
5009
+ createVNode(_sfc_main$j, {
5010
+ "node-type": type.value,
5011
+ size: 16,
5012
+ class: normalizeClass(_ctx.$style.icon)
5013
+ }, 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"]),
5025
+ _ctx.isOpen ? (openBlock(), createBlock(ExecutionSummary, {
5026
+ key: 0,
5027
+ class: normalizeClass(_ctx.$style.executionSummary),
5028
+ status: runData.value?.executionStatus ?? "unknown",
5029
+ "consumed-tokens": consumedTokens2.value,
5030
+ "time-took": runData.value?.executionTime
5031
+ }, null, 8, ["class", "status", "consumed-tokens", "time-took"])) : createCommentVNode("", true)
5032
+ ], 2)
5033
+ ]),
4907
5034
  actions: withCtx(() => [
5035
+ _ctx.isOpen && !isTriggerNode.value ? (openBlock(), createElementBlock("div", {
5036
+ key: 0,
5037
+ class: normalizeClass(_ctx.$style.actions)
5038
+ }, [
5039
+ createVNode(unref(N8nButton), {
5040
+ size: "mini",
5041
+ type: "secondary",
5042
+ class: normalizeClass(content2.value === unref(LOG_DETAILS_CONTENT).OUTPUT ? "" : _ctx.$style.pressed),
5043
+ onClick: withModifiers(handleToggleInput, ["stop"])
5044
+ }, {
5045
+ default: withCtx(() => [
5046
+ createTextVNode(toDisplayString(unref(locale).baseText("logs.details.header.actions.input")), 1)
5047
+ ]),
5048
+ _: 1
5049
+ }, 8, ["class"]),
5050
+ createVNode(unref(N8nButton), {
5051
+ size: "mini",
5052
+ type: "secondary",
5053
+ class: normalizeClass(content2.value === unref(LOG_DETAILS_CONTENT).INPUT ? "" : _ctx.$style.pressed),
5054
+ onClick: withModifiers(handleToggleOutput, ["stop"])
5055
+ }, {
5056
+ default: withCtx(() => [
5057
+ createTextVNode(toDisplayString(unref(locale).baseText("logs.details.header.actions.output")), 1)
5058
+ ]),
5059
+ _: 1
5060
+ }, 8, ["class"])
5061
+ ], 2)) : createCommentVNode("", true),
4908
5062
  renderSlot(_ctx.$slots, "actions")
4909
5063
  ]),
4910
5064
  _: 3
@@ -4913,25 +5067,80 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
4913
5067
  key: 0,
4914
5068
  class: normalizeClass(_ctx.$style.content),
4915
5069
  "data-test-id": "logs-details-body"
4916
- }, null, 2)) : createCommentVNode("", true)
5070
+ }, [
5071
+ !isTriggerNode.value && content2.value !== unref(LOG_DETAILS_CONTENT).OUTPUT ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5072
+ key: 0,
5073
+ class: normalizeClass({
5074
+ [_ctx.$style.inputResizer]: true,
5075
+ [_ctx.$style.collapsed]: unref(resizer).isCollapsed.value,
5076
+ [_ctx.$style.full]: unref(resizer).isFullSize.value
5077
+ }),
5078
+ width: unref(resizer).size.value,
5079
+ style: normalizeStyle(shouldResize.value ? { width: `${unref(resizer).size.value ?? 0}px` } : void 0),
5080
+ "supported-directions": ["right"],
5081
+ "is-resizing-enabled": shouldResize.value,
5082
+ window: _ctx.window,
5083
+ onResize: unref(resizer).onResize,
5084
+ onResizeend: handleResizeEnd
5085
+ }, {
5086
+ default: withCtx(() => [
5087
+ createVNode(RunDataView, {
5088
+ "data-test-id": "log-details-input",
5089
+ "pane-type": "input",
5090
+ title: unref(locale).baseText("logs.details.header.actions.input"),
5091
+ "log-entry": _ctx.logEntry
5092
+ }, null, 8, ["title", "log-entry"])
5093
+ ]),
5094
+ _: 1
5095
+ }, 8, ["class", "width", "style", "is-resizing-enabled", "window", "onResize"])) : createCommentVNode("", true),
5096
+ isTriggerNode.value || content2.value !== unref(LOG_DETAILS_CONTENT).INPUT ? (openBlock(), createBlock(RunDataView, {
5097
+ key: 1,
5098
+ "data-test-id": "log-details-output",
5099
+ "pane-type": "output",
5100
+ class: normalizeClass(_ctx.$style.outputPanel),
5101
+ title: unref(locale).baseText("logs.details.header.actions.output"),
5102
+ "log-entry": _ctx.logEntry
5103
+ }, null, 8, ["class", "title", "log-entry"])) : createCommentVNode("", true)
5104
+ ], 2)) : createCommentVNode("", true)
4917
5105
  ], 2);
4918
5106
  };
4919
5107
  }
4920
5108
  });
4921
- const container$1 = "_container_q8l5j_123";
4922
- const content = "_content_q8l5j_133";
4923
- const style0$1 = {
4924
- container: container$1,
4925
- content
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";
5121
+ const style0$2 = {
5122
+ container: container$2,
5123
+ actions,
5124
+ pressed,
5125
+ title,
5126
+ icon,
5127
+ name,
5128
+ executionSummary,
5129
+ content,
5130
+ outputPanel,
5131
+ inputResizer,
5132
+ collapsed,
5133
+ full
4926
5134
  };
4927
- const cssModules$1 = {
4928
- "$style": style0$1
5135
+ const cssModules$2 = {
5136
+ "$style": style0$2
4929
5137
  };
4930
- const LogsDetailsPanel = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__cssModules", cssModules$1]]);
4931
- const _sfc_main$2 = /* @__PURE__ */ defineComponent({
5138
+ const LogsDetailsPanel = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__cssModules", cssModules$2]]);
5139
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
4932
5140
  __name: "LogsPanelActions",
4933
5141
  props: {
4934
- panelState: {},
5142
+ isOpen: { type: Boolean },
5143
+ showToggleButton: { type: Boolean },
4935
5144
  showPopOutButton: { type: Boolean }
4936
5145
  },
4937
5146
  emits: ["popOut", "toggleOpen"],
@@ -4942,19 +5151,19 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4942
5151
  const tooltipZIndex = computed(() => appStyles.APP_Z_INDEXES.ASK_ASSISTANT_FLOATING_BUTTON + 100);
4943
5152
  const popOutButtonText = computed(() => locales.baseText("runData.panel.actions.popOut"));
4944
5153
  const toggleButtonText = computed(
4945
- () => locales.baseText(
4946
- __props.panelState === LOGS_PANEL_STATE.ATTACHED ? "runData.panel.actions.collapse" : "runData.panel.actions.open"
4947
- )
5154
+ () => locales.baseText(__props.isOpen ? "runData.panel.actions.collapse" : "runData.panel.actions.open")
4948
5155
  );
4949
5156
  return (_ctx, _cache) => {
4950
- return openBlock(), createElementBlock("div", null, [
5157
+ return openBlock(), createElementBlock("div", {
5158
+ class: normalizeClass(_ctx.$style.container)
5159
+ }, [
4951
5160
  _ctx.showPopOutButton ? (openBlock(), createBlock(unref(N8nTooltip), {
4952
5161
  key: 0,
4953
5162
  "z-index": tooltipZIndex.value,
4954
5163
  content: popOutButtonText.value
4955
5164
  }, {
4956
5165
  default: withCtx(() => [
4957
- createVNode(unref(_sfc_main$i), {
5166
+ createVNode(unref(_sfc_main$h), {
4958
5167
  icon: "pop-out",
4959
5168
  type: "secondary",
4960
5169
  size: "small",
@@ -4965,17 +5174,17 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4965
5174
  ]),
4966
5175
  _: 1
4967
5176
  }, 8, ["z-index", "content"])) : createCommentVNode("", true),
4968
- _ctx.panelState !== unref(LOGS_PANEL_STATE).FLOATING ? (openBlock(), createBlock(unref(N8nTooltip), {
5177
+ _ctx.showToggleButton ? (openBlock(), createBlock(unref(N8nTooltip), {
4969
5178
  key: 1,
4970
5179
  "z-index": tooltipZIndex.value,
4971
5180
  content: toggleButtonText.value
4972
5181
  }, {
4973
5182
  default: withCtx(() => [
4974
- createVNode(unref(_sfc_main$i), {
5183
+ createVNode(unref(_sfc_main$h), {
4975
5184
  type: "secondary",
4976
5185
  size: "small",
4977
5186
  "icon-size": "medium",
4978
- icon: _ctx.panelState === unref(LOGS_PANEL_STATE).ATTACHED ? "chevron-down" : "chevron-up",
5187
+ icon: _ctx.isOpen ? "chevron-down" : "chevron-up",
4979
5188
  "aria-label": toggleButtonText.value,
4980
5189
  style: { "color": "var(--color-text-base)" },
4981
5190
  onClick: _cache[1] || (_cache[1] = withModifiers(($event) => emit("toggleOpen"), ["stop"]))
@@ -4983,78 +5192,188 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
4983
5192
  ]),
4984
5193
  _: 1
4985
5194
  }, 8, ["z-index", "content"])) : createCommentVNode("", true)
4986
- ]);
5195
+ ], 2);
4987
5196
  };
4988
5197
  }
4989
5198
  });
4990
- const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5199
+ const container$1 = "_container_1qwjg_123";
5200
+ const style0$1 = {
5201
+ container: container$1
5202
+ };
5203
+ const cssModules$1 = {
5204
+ "$style": style0$1
5205
+ };
5206
+ const LogsPanelActions = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1]]);
5207
+ function useLayout(pipContainer, pipContent2, container2, logsContainer2) {
5208
+ const canvasStore = useCanvasStore();
5209
+ const telemetry = useTelemetry();
5210
+ const workflowsStore = useWorkflowsStore();
5211
+ const panelState = computed(() => workflowsStore.logsPanelState);
5212
+ const resizer = useResizablePanel(LOCAL_STORAGE_PANEL_HEIGHT, {
5213
+ container: document.body,
5214
+ position: "bottom",
5215
+ snap: false,
5216
+ defaultSize: (size) => size * 0.3,
5217
+ minSize: 160,
5218
+ maxSize: (size) => size * 0.75,
5219
+ allowCollapse: true
5220
+ });
5221
+ const chatPanelResizer = useResizablePanel(LOCAL_STORAGE_PANEL_WIDTH, {
5222
+ container: container2,
5223
+ defaultSize: (size) => size * 0.3,
5224
+ minSize: 300,
5225
+ maxSize: (size) => size * 0.8
5226
+ });
5227
+ const overviewPanelResizer = useResizablePanel(LOCAL_STORAGE_OVERVIEW_PANEL_WIDTH, {
5228
+ container: logsContainer2,
5229
+ defaultSize: (size) => size * 0.3,
5230
+ minSize: 80,
5231
+ maxSize: 500,
5232
+ allowFullSize: true
5233
+ });
5234
+ const isOpen = computed(
5235
+ () => panelState.value === LOGS_PANEL_STATE.CLOSED ? resizer.isResizing.value && resizer.size.value > 0 : !resizer.isCollapsed.value
5236
+ );
5237
+ const isCollapsingDetailsPanel = computed(() => overviewPanelResizer.isFullSize.value);
5238
+ const { canPopOut, isPoppedOut, pipWindow } = usePiPWindow({
5239
+ initialHeight: 400,
5240
+ initialWidth: window.document.body.offsetWidth * 0.8,
5241
+ container: pipContainer,
5242
+ content: pipContent2,
5243
+ shouldPopOut: computed(() => panelState.value === LOGS_PANEL_STATE.FLOATING),
5244
+ onRequestClose: () => {
5245
+ if (!isOpen.value) {
5246
+ return;
5247
+ }
5248
+ telemetry.track("User toggled log view", { new_state: "attached" });
5249
+ workflowsStore.setPreferPoppedOutLogsView(false);
5250
+ }
5251
+ });
5252
+ function handleToggleOpen(open) {
5253
+ const wasOpen = panelState.value !== LOGS_PANEL_STATE.CLOSED;
5254
+ if (open === wasOpen) {
5255
+ return;
5256
+ }
5257
+ workflowsStore.toggleLogsPanelOpen(open);
5258
+ telemetry.track("User toggled log view", {
5259
+ new_state: wasOpen ? "collapsed" : "attached"
5260
+ });
5261
+ }
5262
+ function handlePopOut() {
5263
+ telemetry.track("User toggled log view", { new_state: "floating" });
5264
+ workflowsStore.toggleLogsPanelOpen(true);
5265
+ workflowsStore.setPreferPoppedOutLogsView(true);
5266
+ }
5267
+ function handleResizeEnd() {
5268
+ if (panelState.value === LOGS_PANEL_STATE.CLOSED && !resizer.isCollapsed.value) {
5269
+ handleToggleOpen(true);
5270
+ }
5271
+ if (resizer.isCollapsed.value) {
5272
+ handleToggleOpen(false);
5273
+ }
5274
+ resizer.onResizeEnd();
5275
+ }
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
+ });
5281
+ return {
5282
+ height: resizer.size,
5283
+ chatPanelWidth: chatPanelResizer.size,
5284
+ overviewPanelWidth: overviewPanelResizer.size,
5285
+ canPopOut,
5286
+ isOpen,
5287
+ isCollapsingDetailsPanel,
5288
+ isPoppedOut,
5289
+ isOverviewPanelFullWidth: overviewPanelResizer.isFullSize,
5290
+ pipWindow,
5291
+ onToggleOpen: handleToggleOpen,
5292
+ onPopOut: handlePopOut,
5293
+ onResize: resizer.onResize,
5294
+ onResizeEnd: handleResizeEnd,
5295
+ onChatPanelResize: chatPanelResizer.onResize,
5296
+ onChatPanelResizeEnd: chatPanelResizer.onResizeEnd,
5297
+ onOverviewPanelResize: overviewPanelResizer.onResize,
5298
+ onOverviewPanelResizeEnd: overviewPanelResizer.onResizeEnd
5299
+ };
5300
+ }
5301
+ const _sfc_main = /* @__PURE__ */ defineComponent({
4991
5302
  __name: "LogsPanel",
5303
+ props: {
5304
+ isReadOnly: { type: Boolean, default: false }
5305
+ },
4992
5306
  setup(__props) {
5307
+ const props = __props;
4993
5308
  const workflowsStore = useWorkflowsStore();
4994
- const canvasStore = useCanvasStore();
4995
- const panelState = computed(() => workflowsStore.logsPanelState);
4996
- const container2 = ref();
4997
- const selectedLogEntry = ref(void 0);
5309
+ const container2 = useTemplateRef("container");
5310
+ const logsContainer2 = useTemplateRef("logsContainer");
4998
5311
  const pipContainer = useTemplateRef("pipContainer");
4999
5312
  const pipContent2 = useTemplateRef("pipContent");
5000
5313
  const previousChatMessages = computed(() => workflowsStore.getPastChatMessages);
5314
+ const {
5315
+ height,
5316
+ chatPanelWidth,
5317
+ overviewPanelWidth,
5318
+ canPopOut,
5319
+ isOpen,
5320
+ isPoppedOut,
5321
+ isCollapsingDetailsPanel,
5322
+ isOverviewPanelFullWidth,
5323
+ pipWindow,
5324
+ onResize,
5325
+ onResizeEnd,
5326
+ onToggleOpen,
5327
+ onPopOut,
5328
+ onChatPanelResize,
5329
+ onChatPanelResizeEnd,
5330
+ onOverviewPanelResize,
5331
+ onOverviewPanelResizeEnd
5332
+ } = useLayout(pipContainer, pipContent2, container2, logsContainer2);
5333
+ const { currentSessionId, messages: messages2, sendMessage, refreshSession, displayExecution } = useChatState(
5334
+ props.isReadOnly
5335
+ );
5001
5336
  const hasChat = computed(
5002
- () => workflowsStore.workflowTriggerNodes.some(
5003
- (node) => [CHAT_TRIGGER_NODE_TYPE$1, MANUAL_CHAT_TRIGGER_NODE_TYPE].includes(node.type)
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 ?? {}
5004
5344
  )
5005
5345
  );
5006
- const telemetry = useTelemetry();
5007
- const { rootStyles, height, chatWidth, onWindowResize, onResizeDebounced, onResizeChatDebounced } = useResize(container2);
5008
- const { currentSessionId, messages: messages2, sendMessage, refreshSession, displayExecution } = useChatState(
5009
- ref(false),
5010
- onWindowResize
5346
+ const manualLogEntrySelection = ref({ type: "initial" });
5347
+ const autoSelectedLogEntry = computed(
5348
+ () => findLogEntryToAutoSelect(
5349
+ executionTree.value,
5350
+ workflowsStore.nodesByName,
5351
+ workflowsStore.workflowExecutionData?.data?.resultData.runData ?? {}
5352
+ )
5011
5353
  );
5012
- const isLogDetailsOpen = computed(() => selectedLogEntry.value !== void 0);
5013
- const { canPopOut, isPoppedOut, pipWindow } = usePiPWindow({
5014
- initialHeight: 400,
5015
- initialWidth: window.document.body.offsetWidth * 0.8,
5016
- container: pipContainer,
5017
- content: pipContent2,
5018
- shouldPopOut: computed(() => panelState.value === LOGS_PANEL_STATE.FLOATING),
5019
- onRequestClose: () => {
5020
- if (panelState.value === LOGS_PANEL_STATE.CLOSED) {
5021
- return;
5022
- }
5023
- telemetry.track("User toggled log view", { new_state: "attached" });
5024
- workflowsStore.setPreferPoppedOutLogsView(false);
5025
- }
5026
- });
5354
+ 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
5356
+ );
5357
+ const isLogDetailsOpen = computed(
5358
+ () => selectedLogEntry.value !== void 0 && !isCollapsingDetailsPanel.value
5359
+ );
5360
+ const isLogDetailsOpenOrCollapsing = computed(() => selectedLogEntry.value !== void 0);
5027
5361
  const logsPanelActionsProps = computed(() => ({
5028
- panelState: panelState.value,
5362
+ isOpen: isOpen.value,
5363
+ showToggleButton: !isPoppedOut.value,
5029
5364
  showPopOutButton: canPopOut.value && !isPoppedOut.value,
5030
5365
  onPopOut,
5031
5366
  onToggleOpen
5032
5367
  }));
5033
- function onToggleOpen() {
5034
- workflowsStore.toggleLogsPanelOpen();
5035
- telemetry.track("User toggled log view", {
5036
- new_state: panelState.value === LOGS_PANEL_STATE.CLOSED ? "attached" : "collapsed"
5037
- });
5038
- }
5039
- function handleClickHeader() {
5040
- if (panelState.value === LOGS_PANEL_STATE.CLOSED) {
5041
- telemetry.track("User toggled log view", { new_state: "attached" });
5042
- workflowsStore.toggleLogsPanelOpen(true);
5043
- }
5044
- }
5045
5368
  function handleSelectLogEntry(selected2) {
5046
- selectedLogEntry.value = selected2;
5369
+ manualLogEntrySelection.value = selected2 === void 0 ? { type: "none", workflowId: workflowsStore.workflow.id } : { type: "selected", workflowId: workflowsStore.workflow.id, data: selected2 };
5047
5370
  }
5048
- function onPopOut() {
5049
- telemetry.track("User toggled log view", { new_state: "floating" });
5050
- workflowsStore.toggleLogsPanelOpen(true);
5051
- workflowsStore.setPreferPoppedOutLogsView(true);
5371
+ function handleResizeOverviewPanelEnd() {
5372
+ if (isOverviewPanelFullWidth.value) {
5373
+ handleSelectLogEntry(void 0);
5374
+ }
5375
+ onOverviewPanelResizeEnd();
5052
5376
  }
5053
- watch([panelState, height], ([state, h]) => {
5054
- canvasStore.setPanelHeight(
5055
- state === LOGS_PANEL_STATE.FLOATING ? 0 : state === LOGS_PANEL_STATE.ATTACHED ? h : 32
5056
- );
5057
- });
5058
5377
  return (_ctx, _cache) => {
5059
5378
  return openBlock(), createElementBlock("div", {
5060
5379
  ref_key: "pipContainer",
@@ -5068,10 +5387,11 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5068
5387
  createVNode(unref(N8nResizeWrapper), {
5069
5388
  height: unref(height),
5070
5389
  "supported-directions": ["top"],
5071
- "is-resizing-enabled": panelState.value === unref(LOGS_PANEL_STATE).ATTACHED,
5072
- style: normalizeStyle(unref(rootStyles)),
5073
- class: normalizeClass([_ctx.$style.resizeWrapper, panelState.value === unref(LOGS_PANEL_STATE).CLOSED ? "" : _ctx.$style.isOpen]),
5074
- onResize: unref(onResizeDebounced)
5390
+ "is-resizing-enabled": !unref(isPoppedOut),
5391
+ class: normalizeClass(_ctx.$style.resizeWrapper),
5392
+ style: normalizeStyle({ height: unref(isOpen) ? `${unref(height)}px` : "auto" }),
5393
+ onResize: unref(onResize),
5394
+ onResizeend: unref(onResizeEnd)
5075
5395
  }, {
5076
5396
  default: withCtx(() => [
5077
5397
  createBaseVNode("div", {
@@ -5083,92 +5403,116 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
5083
5403
  hasChat.value ? (openBlock(), createBlock(unref(N8nResizeWrapper), {
5084
5404
  key: 0,
5085
5405
  "supported-directions": ["right"],
5086
- "is-resizing-enabled": panelState.value !== unref(LOGS_PANEL_STATE).CLOSED,
5087
- width: unref(chatWidth),
5406
+ "is-resizing-enabled": unref(isOpen),
5407
+ width: unref(chatPanelWidth),
5408
+ style: normalizeStyle({ width: `${unref(chatPanelWidth)}px` }),
5088
5409
  class: normalizeClass(_ctx.$style.chat),
5089
5410
  window: unref(pipWindow),
5090
- onResize: unref(onResizeChatDebounced)
5411
+ onResize: unref(onChatPanelResize),
5412
+ onResizeend: unref(onChatPanelResizeEnd)
5091
5413
  }, {
5092
5414
  default: withCtx(() => [
5093
5415
  createVNode(ChatMessagesPanel, {
5094
5416
  "data-test-id": "canvas-chat",
5095
- "is-open": panelState.value !== unref(LOGS_PANEL_STATE).CLOSED,
5417
+ "is-open": unref(isOpen),
5418
+ "is-read-only": _ctx.isReadOnly,
5096
5419
  messages: unref(messages2),
5097
5420
  "session-id": unref(currentSessionId),
5098
5421
  "past-chat-messages": previousChatMessages.value,
5099
5422
  "show-close-button": false,
5100
5423
  "is-new-logs-enabled": true,
5101
- onClose: onToggleOpen,
5424
+ onClose: unref(onToggleOpen),
5102
5425
  onRefreshSession: unref(refreshSession),
5103
5426
  onDisplayExecution: unref(displayExecution),
5104
5427
  onSendMessage: unref(sendMessage),
5105
- onClickHeader: handleClickHeader
5106
- }, null, 8, ["is-open", "messages", "session-id", "past-chat-messages", "onRefreshSession", "onDisplayExecution", "onSendMessage"])
5107
- ]),
5108
- _: 1
5109
- }, 8, ["is-resizing-enabled", "width", "class", "window", "onResize"])) : createCommentVNode("", true),
5110
- createVNode(LogsOverviewPanel, {
5111
- class: normalizeClass(_ctx.$style.logsOverview),
5112
- "is-open": panelState.value !== unref(LOGS_PANEL_STATE).CLOSED,
5113
- selected: selectedLogEntry.value,
5114
- onClickHeader: handleClickHeader,
5115
- onSelect: handleSelectLogEntry
5116
- }, {
5117
- actions: withCtx(() => [
5118
- !isLogDetailsOpen.value ? (openBlock(), createBlock(_sfc_main$2, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5119
- ]),
5120
- _: 1
5121
- }, 8, ["class", "is-open", "selected"]),
5122
- selectedLogEntry.value ? (openBlock(), createBlock(LogsDetailsPanel, {
5123
- key: 1,
5124
- class: normalizeClass(_ctx.$style.logDetails),
5125
- "is-open": panelState.value !== unref(LOGS_PANEL_STATE).CLOSED,
5126
- onClickHeader: handleClickHeader
5127
- }, {
5128
- actions: withCtx(() => [
5129
- isLogDetailsOpen.value ? (openBlock(), createBlock(_sfc_main$2, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5428
+ onClickHeader: _cache[0] || (_cache[0] = ($event) => unref(onToggleOpen)(true))
5429
+ }, null, 8, ["is-open", "is-read-only", "messages", "session-id", "past-chat-messages", "onClose", "onRefreshSession", "onDisplayExecution", "onSendMessage"])
5130
5430
  ]),
5131
5431
  _: 1
5132
- }, 8, ["class", "is-open"])) : createCommentVNode("", true)
5432
+ }, 8, ["is-resizing-enabled", "width", "style", "class", "window", "onResize", "onResizeend"])) : createCommentVNode("", true),
5433
+ createBaseVNode("div", {
5434
+ ref_key: "logsContainer",
5435
+ ref: logsContainer2,
5436
+ class: normalizeClass(_ctx.$style.logsContainer)
5437
+ }, [
5438
+ createVNode(unref(N8nResizeWrapper), {
5439
+ class: normalizeClass(_ctx.$style.overviewResizer),
5440
+ width: unref(overviewPanelWidth),
5441
+ style: normalizeStyle({ width: isLogDetailsOpen.value ? `${unref(overviewPanelWidth)}px` : "" }),
5442
+ "supported-directions": ["right"],
5443
+ "is-resizing-enabled": isLogDetailsOpenOrCollapsing.value,
5444
+ window: unref(pipWindow),
5445
+ onResize: unref(onOverviewPanelResize),
5446
+ onResizeend: handleResizeOverviewPanelEnd
5447
+ }, {
5448
+ default: withCtx(() => [
5449
+ createVNode(LogsOverviewPanel, {
5450
+ class: normalizeClass(_ctx.$style.logsOverview),
5451
+ "is-open": unref(isOpen),
5452
+ "is-read-only": _ctx.isReadOnly,
5453
+ "is-compact": isLogDetailsOpen.value,
5454
+ selected: selectedLogEntry.value,
5455
+ "execution-tree": executionTree.value,
5456
+ onClickHeader: _cache[1] || (_cache[1] = ($event) => unref(onToggleOpen)(true)),
5457
+ onSelect: handleSelectLogEntry
5458
+ }, {
5459
+ actions: withCtx(() => [
5460
+ !isLogDetailsOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5461
+ ]),
5462
+ _: 1
5463
+ }, 8, ["class", "is-open", "is-read-only", "is-compact", "selected", "execution-tree"])
5464
+ ]),
5465
+ _: 1
5466
+ }, 8, ["class", "width", "style", "is-resizing-enabled", "window", "onResize"]),
5467
+ isLogDetailsOpenOrCollapsing.value && selectedLogEntry.value ? (openBlock(), createBlock(LogsDetailsPanel, {
5468
+ key: 0,
5469
+ class: normalizeClass(_ctx.$style.logDetails),
5470
+ "is-open": unref(isOpen),
5471
+ "log-entry": selectedLogEntry.value,
5472
+ window: unref(pipWindow),
5473
+ onClickHeader: _cache[2] || (_cache[2] = ($event) => unref(onToggleOpen)(true))
5474
+ }, {
5475
+ actions: withCtx(() => [
5476
+ isLogDetailsOpen.value ? (openBlock(), createBlock(LogsPanelActions, normalizeProps(mergeProps({ key: 0 }, logsPanelActionsProps.value)), null, 16)) : createCommentVNode("", true)
5477
+ ]),
5478
+ _: 1
5479
+ }, 8, ["class", "is-open", "log-entry", "window"])) : createCommentVNode("", true)
5480
+ ], 2)
5133
5481
  ], 2)
5134
5482
  ]),
5135
5483
  _: 1
5136
- }, 8, ["height", "is-resizing-enabled", "style", "class", "onResize"])
5484
+ }, 8, ["height", "is-resizing-enabled", "class", "style", "onResize", "onResizeend"])
5137
5485
  ], 2)
5138
5486
  ], 512);
5139
5487
  };
5140
5488
  }
5141
5489
  });
5142
- const resizeWrapper = "_resizeWrapper_1zlbj_124";
5143
- const pipContent = "_pipContent_1zlbj_129";
5144
- const isOpen = "_isOpen_1zlbj_142";
5145
- const container = "_container_1zlbj_149";
5146
- const chat = "_chat_1zlbj_158";
5147
- const logsOverview = "_logsOverview_1zlbj_164";
5148
- const logDetails = "_logDetails_1zlbj_171";
5490
+ const resizeWrapper = "_resizeWrapper_19m2p_124";
5491
+ const pipContent = "_pipContent_19m2p_129";
5492
+ const container = "_container_19m2p_143";
5493
+ const chat = "_chat_19m2p_152";
5494
+ const logsContainer = "_logsContainer_19m2p_156";
5495
+ const overviewResizer = "_overviewResizer_19m2p_166";
5496
+ const logsOverview = "_logsOverview_19m2p_174";
5497
+ const logsDetails = "_logsDetails_19m2p_178";
5149
5498
  const style0 = {
5150
5499
  resizeWrapper,
5151
5500
  pipContent,
5152
- isOpen,
5153
5501
  container,
5154
5502
  chat,
5503
+ logsContainer,
5504
+ overviewResizer,
5155
5505
  logsOverview,
5156
- logDetails
5506
+ logsDetails
5157
5507
  };
5158
5508
  const cssModules = {
5159
5509
  "$style": style0
5160
5510
  };
5161
- const LogsPanel = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules]]);
5162
- const _sfc_main = /* @__PURE__ */ defineComponent({
5163
- __name: "CanvasChatSwitch",
5164
- setup(__props) {
5165
- const { isNewLogsEnabled } = useSettingsStore();
5166
- return (_ctx, _cache) => {
5167
- const _component_CanvasChat = __unplugin_components_0;
5168
- return unref(isNewLogsEnabled) ? (openBlock(), createBlock(LogsPanel, { key: 0 })) : (openBlock(), createBlock(_component_CanvasChat, { key: 1 }));
5169
- };
5170
- }
5171
- });
5511
+ const LogsPanel = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
5172
5512
  export {
5173
- _sfc_main as default
5513
+ ChatMessagesPanel as C,
5514
+ LogsPanel as L,
5515
+ usePiPWindow as a,
5516
+ useChatState as b,
5517
+ useResize as u
5174
5518
  };