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
@@ -0,0 +1,750 @@
1
+ import { d as _sfc_main$3, H as HighlightJS, e as getConsumedTokens, V as ViewSubExecution, f as formatTokenUsageCount, _ as _sfc_main$5, h as createAiData, i as getTreeNodeData, j as getReferencedData } from "./RunData-Ds-U68nr.js";
2
+ import { bl as NodeConnectionTypes, ec as isObjectEmpty, d as defineComponent, be as useClipboard, a as useToast, r as ref, o as onMounted, h as resolveComponent, i as createElementBlock, g as openBlock, n as normalizeClass, k as createBaseVNode, e as createBlock, f as createCommentVNode, j as createVNode, t as toDisplayString, m as unref, F as Fragment, D as renderList, b8 as VueMarkdown, c as useI18n, _ as _export_sfc, by as useNodeTypesStore, U as useWorkflowsStore, q as computed, bB as _sfc_main$4, w as withCtx, l as createTextVNode, I as watch, bE as ElTree, B as normalizeStyle } from "./index-BpdkKRP4.js";
3
+ import { d as capitalize } from "./useCanvasOperations-D6VFiC3b.js";
4
+ const fallbackParser = (execData) => ({
5
+ type: "json",
6
+ data: execData,
7
+ parsed: false
8
+ });
9
+ const outputTypeParsers = {
10
+ [NodeConnectionTypes.AiLanguageModel](execData) {
11
+ const response = execData.response ?? execData;
12
+ if (!response) throw new Error("No response from Language Model");
13
+ if (Array.isArray(response?.messages) && response?.messages.length === 1 && typeof response?.messages[0] === "string") {
14
+ return {
15
+ type: "text",
16
+ data: response.messages[0],
17
+ parsed: true
18
+ };
19
+ }
20
+ if (response.messages && Array.isArray(response.messages)) {
21
+ return outputTypeParsers[NodeConnectionTypes.AiMemory](execData);
22
+ }
23
+ if (response.generations) {
24
+ const generations = response.generations;
25
+ const content = generations.map((generation) => {
26
+ if (generation?.text) return generation.text;
27
+ if (Array.isArray(generation)) {
28
+ return generation.map((item) => item.text ?? item).join("\n\n").trim();
29
+ }
30
+ return generation;
31
+ });
32
+ return {
33
+ type: "json",
34
+ data: content,
35
+ parsed: true
36
+ };
37
+ }
38
+ return {
39
+ type: "json",
40
+ data: response,
41
+ parsed: true
42
+ };
43
+ },
44
+ [NodeConnectionTypes.AiTool]: fallbackParser,
45
+ [NodeConnectionTypes.AiAgent]: fallbackParser,
46
+ [NodeConnectionTypes.AiMemory](execData) {
47
+ const chatHistory = execData.chatHistory ?? execData.messages ?? execData?.response?.chat_history;
48
+ if (Array.isArray(chatHistory)) {
49
+ const responseText = chatHistory.map((content) => {
50
+ if (content.type === "constructor" && content.id?.includes("messages") && content.kwargs) {
51
+ let message = content.kwargs.content;
52
+ if (Array.isArray(message)) {
53
+ message = message.map((item) => {
54
+ const { type, image_url } = item;
55
+ if (type === "image_url" && typeof image_url === "object" && typeof image_url.url === "string") {
56
+ return `![Input image](${image_url.url})`;
57
+ } else if (typeof image_url === "string") {
58
+ return `![Input image](${image_url})`;
59
+ }
60
+ return item.text;
61
+ }).join("\n");
62
+ }
63
+ if (Object.keys(content.kwargs.additional_kwargs).length) {
64
+ message += ` (${JSON.stringify(content.kwargs.additional_kwargs)})`;
65
+ }
66
+ if (content.id.includes("HumanMessage")) {
67
+ message = `**Human:** ${String(message).trim()}`;
68
+ } else if (content.id.includes("AIMessage")) {
69
+ message = `**AI:** ${message}`;
70
+ } else if (content.id.includes("SystemMessage")) {
71
+ message = `**System Message:** ${message}`;
72
+ }
73
+ return message;
74
+ }
75
+ return "";
76
+ }).join("\n\n");
77
+ if (responseText.length === 0) {
78
+ return fallbackParser(execData);
79
+ }
80
+ return {
81
+ type: "markdown",
82
+ data: responseText,
83
+ parsed: true
84
+ };
85
+ }
86
+ return fallbackParser(execData);
87
+ },
88
+ [NodeConnectionTypes.AiOutputParser]: fallbackParser,
89
+ [NodeConnectionTypes.AiRetriever]: fallbackParser,
90
+ [NodeConnectionTypes.AiVectorStore](execData) {
91
+ if (execData.documents) {
92
+ return {
93
+ type: "json",
94
+ data: execData.documents,
95
+ parsed: true
96
+ };
97
+ }
98
+ return fallbackParser(execData);
99
+ },
100
+ [NodeConnectionTypes.AiEmbedding](execData) {
101
+ if (execData.documents) {
102
+ return {
103
+ type: "json",
104
+ data: execData.documents,
105
+ parsed: true
106
+ };
107
+ }
108
+ return fallbackParser(execData);
109
+ },
110
+ [NodeConnectionTypes.AiDocument](execData) {
111
+ if (execData.documents) {
112
+ return {
113
+ type: "json",
114
+ data: execData.documents,
115
+ parsed: true
116
+ };
117
+ }
118
+ return fallbackParser(execData);
119
+ },
120
+ [NodeConnectionTypes.AiTextSplitter](execData) {
121
+ const arrayData = Array.isArray(execData.response) ? execData.response : [execData.textSplitter];
122
+ return {
123
+ type: "text",
124
+ data: arrayData.join("\n\n"),
125
+ parsed: true
126
+ };
127
+ }
128
+ };
129
+ const useAiContentParsers = () => {
130
+ const parseAiRunData = (executionData, endpointType) => {
131
+ if ([NodeConnectionTypes.AiChain, NodeConnectionTypes.Main].includes(
132
+ endpointType
133
+ )) {
134
+ return executionData.map((data) => ({ raw: data.json, parsedContent: null }));
135
+ }
136
+ const contentJson = executionData.map((node) => {
137
+ const hasBinaryData = !isObjectEmpty(node.binary);
138
+ return hasBinaryData ? node.binary : node.json;
139
+ });
140
+ const parser = outputTypeParsers[endpointType];
141
+ if (!parser)
142
+ return [
143
+ {
144
+ raw: contentJson.filter((item) => item !== void 0),
145
+ parsedContent: null
146
+ }
147
+ ];
148
+ const parsedOutput = contentJson.filter((c) => c !== void 0).map((c) => ({ raw: c, parsedContent: parser(c) }));
149
+ return parsedOutput;
150
+ };
151
+ return {
152
+ parseAiRunData
153
+ };
154
+ };
155
+ const _hoisted_1$2 = ["data-content-type"];
156
+ const _hoisted_2$2 = ["textContent"];
157
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
158
+ __name: "AiRunContentBlock",
159
+ props: {
160
+ runData: {},
161
+ error: {}
162
+ },
163
+ setup(__props) {
164
+ const props = __props;
165
+ const i18n = useI18n();
166
+ const clipboard = useClipboard();
167
+ const { showMessage } = useToast();
168
+ const contentParsers = useAiContentParsers();
169
+ const isExpanded = ref(getInitialExpandedState());
170
+ const renderType = ref("rendered");
171
+ const contentParsed = ref(false);
172
+ const parsedRun = ref(void 0);
173
+ function getInitialExpandedState() {
174
+ const collapsedTypes = {
175
+ input: [
176
+ NodeConnectionTypes.AiDocument,
177
+ NodeConnectionTypes.AiTextSplitter
178
+ ],
179
+ output: [
180
+ NodeConnectionTypes.AiDocument,
181
+ NodeConnectionTypes.AiEmbedding,
182
+ NodeConnectionTypes.AiTextSplitter,
183
+ NodeConnectionTypes.AiVectorStore
184
+ ]
185
+ };
186
+ return !collapsedTypes[props.runData.inOut].includes(props.runData.type);
187
+ }
188
+ function isJsonString(text) {
189
+ try {
190
+ JSON.parse(text);
191
+ return true;
192
+ } catch (e) {
193
+ return false;
194
+ }
195
+ }
196
+ const markdownOptions = {
197
+ highlight(str, lang) {
198
+ if (lang && HighlightJS.getLanguage(lang)) {
199
+ try {
200
+ return HighlightJS.highlight(str, { language: lang }).value;
201
+ } catch {
202
+ }
203
+ }
204
+ return "";
205
+ }
206
+ };
207
+ function parseAiRunData(run) {
208
+ if (!run.data) {
209
+ return;
210
+ }
211
+ const parsedData = contentParsers.parseAiRunData(run.data, run.type);
212
+ return parsedData;
213
+ }
214
+ function isMarkdown(content) {
215
+ if (typeof content !== "string") return false;
216
+ const markdownPatterns = [
217
+ /^# .+/gm,
218
+ // headers
219
+ /\*{1,2}.+\*{1,2}/g,
220
+ // emphasis and strong
221
+ /\[.+\]\(.+\)/g,
222
+ // links
223
+ /```[\s\S]+```/g
224
+ // code blocks
225
+ ];
226
+ return markdownPatterns.some((pattern) => pattern.test(content));
227
+ }
228
+ function formatToJsonMarkdown(data) {
229
+ return "```json\n" + data + "\n```";
230
+ }
231
+ function jsonToMarkdown(data) {
232
+ if (isMarkdown(data)) return data;
233
+ if (Array.isArray(data) && data.length && typeof data[0] !== "number") {
234
+ const markdownArray = data.map((item) => jsonToMarkdown(item));
235
+ return markdownArray.join("\n\n").trim();
236
+ }
237
+ if (typeof data === "string") {
238
+ if (isJsonString(data)) {
239
+ return formatToJsonMarkdown(data);
240
+ }
241
+ return data;
242
+ }
243
+ return formatToJsonMarkdown(JSON.stringify(data, null, 2));
244
+ }
245
+ function setContentParsed(content) {
246
+ contentParsed.value = !!content.find((item) => {
247
+ if (item.parsedContent?.parsed === true) {
248
+ return true;
249
+ }
250
+ return false;
251
+ });
252
+ }
253
+ function onBlockHeaderClick() {
254
+ isExpanded.value = !isExpanded.value;
255
+ }
256
+ function onCopyToClipboard(content) {
257
+ try {
258
+ void clipboard.copy(JSON.stringify(content, void 0, 2));
259
+ showMessage({
260
+ title: i18n.baseText("generic.copiedToClipboard"),
261
+ type: "success"
262
+ });
263
+ } catch (err) {
264
+ }
265
+ }
266
+ function onRenderTypeChange(value) {
267
+ renderType.value = value;
268
+ }
269
+ onMounted(() => {
270
+ parsedRun.value = parseAiRunData(props.runData);
271
+ if (parsedRun.value) {
272
+ setContentParsed(parsedRun.value);
273
+ }
274
+ });
275
+ return (_ctx, _cache) => {
276
+ const _component_font_awesome_icon = resolveComponent("font-awesome-icon");
277
+ const _component_n8n_radio_buttons = resolveComponent("n8n-radio-buttons");
278
+ const _component_NodeErrorView = _sfc_main$3;
279
+ const _component_n8n_icon_button = resolveComponent("n8n-icon-button");
280
+ return openBlock(), createElementBlock("div", {
281
+ class: normalizeClass(_ctx.$style.block)
282
+ }, [
283
+ createBaseVNode("header", {
284
+ class: normalizeClass(_ctx.$style.blockHeader),
285
+ onClick: onBlockHeaderClick
286
+ }, [
287
+ createBaseVNode("button", {
288
+ class: normalizeClass(_ctx.$style.blockToggle)
289
+ }, [
290
+ createVNode(_component_font_awesome_icon, {
291
+ icon: isExpanded.value ? "angle-down" : "angle-right",
292
+ size: "lg"
293
+ }, null, 8, ["icon"])
294
+ ], 2),
295
+ createBaseVNode("p", {
296
+ class: normalizeClass(_ctx.$style.blockTitle)
297
+ }, toDisplayString(unref(capitalize)(_ctx.runData.inOut)), 3),
298
+ contentParsed.value && !_ctx.error && isExpanded.value ? (openBlock(), createBlock(_component_n8n_radio_buttons, {
299
+ key: 0,
300
+ size: "small",
301
+ "model-value": renderType.value,
302
+ class: normalizeClass(_ctx.$style.rawSwitch),
303
+ options: [
304
+ { label: "Rendered", value: "rendered" },
305
+ { label: "JSON", value: "json" }
306
+ ],
307
+ "onUpdate:modelValue": onRenderTypeChange
308
+ }, null, 8, ["model-value", "class"])) : createCommentVNode("", true)
309
+ ], 2),
310
+ createBaseVNode("main", {
311
+ class: normalizeClass({
312
+ [_ctx.$style.blockContent]: true,
313
+ [_ctx.$style.blockContentExpanded]: isExpanded.value
314
+ })
315
+ }, [
316
+ _ctx.error ? (openBlock(), createBlock(_component_NodeErrorView, {
317
+ key: 0,
318
+ error: _ctx.error,
319
+ class: normalizeClass(_ctx.$style.error)
320
+ }, null, 8, ["error", "class"])) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(parsedRun.value, ({ parsedContent, raw }, index) => {
321
+ return openBlock(), createElementBlock("div", {
322
+ key: index,
323
+ class: normalizeClass(_ctx.$style.contentText),
324
+ "data-content-type": parsedContent?.type
325
+ }, [
326
+ parsedContent && renderType.value === "rendered" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
327
+ parsedContent.type === "json" ? (openBlock(), createBlock(unref(VueMarkdown), {
328
+ key: 0,
329
+ source: jsonToMarkdown(parsedContent.data),
330
+ class: normalizeClass(_ctx.$style.markdown),
331
+ options: markdownOptions
332
+ }, null, 8, ["source", "class"])) : createCommentVNode("", true),
333
+ parsedContent.type === "markdown" ? (openBlock(), createBlock(unref(VueMarkdown), {
334
+ key: 1,
335
+ source: parsedContent.data,
336
+ class: normalizeClass(_ctx.$style.markdown),
337
+ options: markdownOptions
338
+ }, null, 8, ["source", "class"])) : createCommentVNode("", true),
339
+ parsedContent.type === "text" ? (openBlock(), createElementBlock("p", {
340
+ key: 2,
341
+ class: normalizeClass(_ctx.$style.runText),
342
+ textContent: toDisplayString(parsedContent.data)
343
+ }, null, 10, _hoisted_2$2)) : createCommentVNode("", true)
344
+ ], 64)) : (openBlock(), createElementBlock("div", {
345
+ key: 1,
346
+ class: normalizeClass(_ctx.$style.rawContent)
347
+ }, [
348
+ createVNode(_component_n8n_icon_button, {
349
+ size: "small",
350
+ class: normalizeClass(_ctx.$style.copyToClipboard),
351
+ type: "secondary",
352
+ title: unref(i18n).baseText("nodeErrorView.copyToClipboard"),
353
+ icon: "copy",
354
+ onClick: ($event) => onCopyToClipboard(raw)
355
+ }, null, 8, ["class", "title", "onClick"]),
356
+ createVNode(unref(VueMarkdown), {
357
+ source: jsonToMarkdown(raw),
358
+ class: normalizeClass(_ctx.$style.markdown)
359
+ }, null, 8, ["source", "class"])
360
+ ], 2))
361
+ ], 10, _hoisted_1$2);
362
+ }), 128))
363
+ ], 2)
364
+ ], 2);
365
+ };
366
+ }
367
+ });
368
+ const copyToClipboard = "_copyToClipboard_kaw5r_123";
369
+ const rawContent = "_rawContent_kaw5r_129";
370
+ const markdown = "_markdown_kaw5r_133";
371
+ const contentText = "_contentText_kaw5r_157";
372
+ const block = "_block_kaw5r_164";
373
+ const blockContent = "_blockContent_kaw5r_171";
374
+ const blockContentExpanded = "_blockContentExpanded_kaw5r_175";
375
+ const runText = "_runText_kaw5r_179";
376
+ const rawSwitch = "_rawSwitch_kaw5r_184";
377
+ const blockHeader = "_blockHeader_kaw5r_194";
378
+ const blockTitle = "_blockTitle_kaw5r_207";
379
+ const blockToggle = "_blockToggle_kaw5r_214";
380
+ const error = "_error_kaw5r_222";
381
+ const style0$2 = {
382
+ copyToClipboard,
383
+ rawContent,
384
+ markdown,
385
+ contentText,
386
+ block,
387
+ blockContent,
388
+ blockContentExpanded,
389
+ runText,
390
+ rawSwitch,
391
+ blockHeader,
392
+ blockTitle,
393
+ blockToggle,
394
+ error
395
+ };
396
+ const cssModules$2 = {
397
+ "$style": style0$2
398
+ };
399
+ const AiRunContentBlock = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__cssModules", cssModules$2]]);
400
+ const _hoisted_1$1 = { key: 0 };
401
+ const _hoisted_2$1 = { key: 1 };
402
+ const _hoisted_3$1 = { key: 2 };
403
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
404
+ __name: "RunDataAiContent",
405
+ props: {
406
+ inputData: {},
407
+ contentIndex: {}
408
+ },
409
+ setup(__props) {
410
+ const props = __props;
411
+ const nodeTypesStore = useNodeTypesStore();
412
+ const workflowsStore = useWorkflowsStore();
413
+ const i18n = useI18n();
414
+ const consumedTokensSum = computed(() => {
415
+ return getConsumedTokens(outputRun.value);
416
+ });
417
+ function extractRunMeta(run) {
418
+ const uiNode = workflowsStore.getNodeByName(props.inputData.node);
419
+ const nodeType = nodeTypesStore.getNodeType(uiNode?.type ?? "");
420
+ const runMeta2 = {
421
+ startTimeMs: run.metadata.startTime,
422
+ executionTimeMs: run.metadata.executionTime,
423
+ node: nodeType,
424
+ type: run.inOut,
425
+ connectionType: run.type,
426
+ subExecution: run.metadata?.subExecution
427
+ };
428
+ return runMeta2;
429
+ }
430
+ const outputRun = computed(() => {
431
+ return props.inputData.data.find((r) => r.inOut === "output");
432
+ });
433
+ const runMeta = computed(() => {
434
+ if (outputRun.value === void 0) {
435
+ return;
436
+ }
437
+ return extractRunMeta(outputRun.value);
438
+ });
439
+ const executionRunData = computed(() => {
440
+ return workflowsStore.getWorkflowExecution?.data?.resultData?.runData;
441
+ });
442
+ const outputError = computed(() => {
443
+ return executionRunData.value?.[props.inputData.node]?.[props.inputData.runIndex]?.error;
444
+ });
445
+ return (_ctx, _cache) => {
446
+ const _component_n8n_tooltip = resolveComponent("n8n-tooltip");
447
+ const _component_n8n_info_tip = resolveComponent("n8n-info-tip");
448
+ return openBlock(), createElementBlock("div", {
449
+ class: normalizeClass(_ctx.$style.container)
450
+ }, [
451
+ createBaseVNode("header", {
452
+ class: normalizeClass(_ctx.$style.header)
453
+ }, [
454
+ runMeta.value?.node ? (openBlock(), createBlock(_sfc_main$4, {
455
+ key: 0,
456
+ class: normalizeClass(_ctx.$style.nodeIcon),
457
+ "node-type": runMeta.value.node,
458
+ size: 20
459
+ }, null, 8, ["class", "node-type"])) : createCommentVNode("", true),
460
+ createBaseVNode("div", {
461
+ class: normalizeClass(_ctx.$style.headerWrap)
462
+ }, [
463
+ createBaseVNode("p", {
464
+ class: normalizeClass(_ctx.$style.title)
465
+ }, toDisplayString(_ctx.inputData.node), 3),
466
+ createBaseVNode("ul", {
467
+ class: normalizeClass(_ctx.$style.meta)
468
+ }, [
469
+ runMeta.value?.startTimeMs ? (openBlock(), createElementBlock("li", _hoisted_1$1, toDisplayString(runMeta.value?.executionTimeMs) + "ms", 1)) : createCommentVNode("", true),
470
+ runMeta.value?.startTimeMs ? (openBlock(), createElementBlock("li", _hoisted_2$1, [
471
+ createVNode(_component_n8n_tooltip, null, {
472
+ content: withCtx(() => [
473
+ createTextVNode(toDisplayString(new Date(runMeta.value?.startTimeMs).toLocaleString()), 1)
474
+ ]),
475
+ default: withCtx(() => [
476
+ createTextVNode(" " + toDisplayString(unref(i18n).baseText("runData.aiContentBlock.startedAt", {
477
+ interpolate: {
478
+ startTime: new Date(runMeta.value?.startTimeMs).toLocaleTimeString()
479
+ }
480
+ })), 1)
481
+ ]),
482
+ _: 1
483
+ })
484
+ ])) : createCommentVNode("", true),
485
+ runMeta.value ? (openBlock(), createElementBlock("li", _hoisted_3$1, [
486
+ createVNode(ViewSubExecution, {
487
+ "task-metadata": runMeta.value,
488
+ "display-mode": "ai",
489
+ inline: true
490
+ }, null, 8, ["task-metadata"])
491
+ ])) : createCommentVNode("", true),
492
+ (consumedTokensSum.value?.totalTokens ?? 0) > 0 ? (openBlock(), createElementBlock("li", {
493
+ key: 3,
494
+ class: normalizeClass(_ctx.$style.tokensUsage)
495
+ }, [
496
+ createTextVNode(toDisplayString(unref(i18n).baseText("runData.aiContentBlock.tokens", {
497
+ interpolate: {
498
+ count: unref(formatTokenUsageCount)(consumedTokensSum.value, "total")
499
+ }
500
+ })) + " ", 1),
501
+ createVNode(_component_n8n_info_tip, {
502
+ type: "tooltip",
503
+ theme: "info-light",
504
+ "tooltip-placement": "right"
505
+ }, {
506
+ default: withCtx(() => [
507
+ createVNode(_sfc_main$5, { "consumed-tokens": consumedTokensSum.value }, null, 8, ["consumed-tokens"])
508
+ ]),
509
+ _: 1
510
+ })
511
+ ], 2)) : createCommentVNode("", true)
512
+ ], 2)
513
+ ], 2)
514
+ ], 2),
515
+ (openBlock(true), createElementBlock(Fragment, null, renderList(props.inputData.data, (run, index) => {
516
+ return openBlock(), createElementBlock("main", {
517
+ key: index,
518
+ class: normalizeClass(_ctx.$style.content)
519
+ }, [
520
+ createVNode(AiRunContentBlock, {
521
+ "run-data": run,
522
+ error: run.inOut === "output" ? outputError.value : void 0
523
+ }, null, 8, ["run-data", "error"])
524
+ ], 2);
525
+ }), 128))
526
+ ], 2);
527
+ };
528
+ }
529
+ });
530
+ const container$1 = "_container_dypaw_2";
531
+ const nodeIcon$1 = "_nodeIcon_dypaw_5";
532
+ const header = "_header_dypaw_8";
533
+ const headerWrap = "_headerWrap_dypaw_14";
534
+ const title$1 = "_title_dypaw_18";
535
+ const meta = "_meta_dypaw_25";
536
+ const tokensUsage = "_tokensUsage_dypaw_41";
537
+ const style0$1 = {
538
+ container: container$1,
539
+ nodeIcon: nodeIcon$1,
540
+ header,
541
+ headerWrap,
542
+ title: title$1,
543
+ meta,
544
+ tokensUsage
545
+ };
546
+ const cssModules$1 = {
547
+ "$style": style0$1
548
+ };
549
+ const RunDataAiContent = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1]]);
550
+ const _hoisted_1 = ["data-tree-depth"];
551
+ const _hoisted_2 = ["onClick"];
552
+ const _hoisted_3 = ["textContent"];
553
+ const _sfc_main = /* @__PURE__ */ defineComponent({
554
+ __name: "RunDataAi",
555
+ props: {
556
+ node: {},
557
+ runIndex: { default: 0 },
558
+ slim: { type: Boolean },
559
+ workflow: {}
560
+ },
561
+ setup(__props) {
562
+ const props = __props;
563
+ const workflowsStore = useWorkflowsStore();
564
+ const nodeTypesStore = useNodeTypesStore();
565
+ const selectedRun = ref([]);
566
+ const i18n = useI18n();
567
+ function isTreeNodeSelected(node) {
568
+ return selectedRun.value.some((run) => run.node === node.node && run.runIndex === node.runIndex);
569
+ }
570
+ function toggleTreeItem(node) {
571
+ node.expanded = !node.expanded;
572
+ }
573
+ function onItemClick(data) {
574
+ const matchingRun = aiData.value?.find(
575
+ (run) => run.node === data.node && run.runIndex === data.runIndex
576
+ );
577
+ if (!matchingRun) {
578
+ selectedRun.value = [];
579
+ return;
580
+ }
581
+ const selectedNodeRun = workflowsStore.getWorkflowResultDataByNodeName(data.node)?.[data.runIndex];
582
+ if (!selectedNodeRun) {
583
+ return;
584
+ }
585
+ selectedRun.value = [
586
+ {
587
+ node: data.node,
588
+ runIndex: data.runIndex,
589
+ data: getReferencedData(selectedNodeRun, true)
590
+ }
591
+ ];
592
+ }
593
+ function getNodeType(nodeName) {
594
+ const node = workflowsStore.getNodeByName(nodeName);
595
+ if (!node) {
596
+ return null;
597
+ }
598
+ const nodeType = nodeTypesStore.getNodeType(node?.type);
599
+ return nodeType;
600
+ }
601
+ function selectFirst() {
602
+ if (executionTree.value.length && executionTree.value[0].children.length) {
603
+ onItemClick(executionTree.value[0].children[0]);
604
+ }
605
+ }
606
+ const aiData = computed(
607
+ () => createAiData(props.node.name, props.workflow, workflowsStore.getWorkflowResultDataByNodeName)
608
+ );
609
+ const executionTree = computed(
610
+ () => getTreeNodeData(props.node.name, props.workflow, aiData.value)
611
+ );
612
+ watch(() => props.runIndex, selectFirst, { immediate: true });
613
+ return (_ctx, _cache) => {
614
+ const _component_font_awesome_icon = resolveComponent("font-awesome-icon");
615
+ const _component_n8n_tooltip = resolveComponent("n8n-tooltip");
616
+ const _component_n8n_text = resolveComponent("n8n-text");
617
+ return openBlock(), createElementBlock("div", {
618
+ class: normalizeClass(_ctx.$style.container)
619
+ }, [
620
+ aiData.value.length > 0 ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
621
+ createBaseVNode("div", {
622
+ class: normalizeClass({ [_ctx.$style.tree]: true, [_ctx.$style.slim]: _ctx.slim })
623
+ }, [
624
+ createVNode(unref(ElTree), {
625
+ data: executionTree.value,
626
+ props: { label: "node" },
627
+ "default-expand-all": "",
628
+ indent: 12,
629
+ "expand-on-click-node": false,
630
+ "data-test-id": "lm-chat-logs-tree",
631
+ onNodeClick: onItemClick
632
+ }, {
633
+ default: withCtx(({ node, data }) => [
634
+ createBaseVNode("div", {
635
+ class: normalizeClass({
636
+ [_ctx.$style.treeNode]: true,
637
+ [_ctx.$style.isSelected]: isTreeNodeSelected(data)
638
+ }),
639
+ "data-tree-depth": data.depth,
640
+ style: normalizeStyle({ "--item-depth": data.depth })
641
+ }, [
642
+ data.children.length ? (openBlock(), createElementBlock("button", {
643
+ key: 0,
644
+ class: normalizeClass(_ctx.$style.treeToggle),
645
+ onClick: ($event) => toggleTreeItem(node)
646
+ }, [
647
+ createVNode(_component_font_awesome_icon, {
648
+ icon: node.expanded ? "angle-down" : "angle-right"
649
+ }, null, 8, ["icon"])
650
+ ], 10, _hoisted_2)) : createCommentVNode("", true),
651
+ createVNode(_component_n8n_tooltip, {
652
+ disabled: !_ctx.slim,
653
+ placement: "right"
654
+ }, {
655
+ content: withCtx(() => [
656
+ createTextVNode(toDisplayString(node.label), 1)
657
+ ]),
658
+ default: withCtx(() => [
659
+ createBaseVNode("span", {
660
+ class: normalizeClass(_ctx.$style.leafLabel)
661
+ }, [
662
+ createVNode(_sfc_main$4, {
663
+ "node-type": getNodeType(data.node),
664
+ size: 17,
665
+ class: normalizeClass(_ctx.$style.nodeIcon)
666
+ }, null, 8, ["node-type", "class"]),
667
+ !_ctx.slim ? (openBlock(), createElementBlock("span", {
668
+ key: 0,
669
+ textContent: toDisplayString(node.label)
670
+ }, null, 8, _hoisted_3)) : createCommentVNode("", true)
671
+ ], 2)
672
+ ]),
673
+ _: 2
674
+ }, 1032, ["disabled"])
675
+ ], 14, _hoisted_1)
676
+ ]),
677
+ _: 1
678
+ }, 8, ["data"])
679
+ ], 2),
680
+ createBaseVNode("div", {
681
+ class: normalizeClass(_ctx.$style.runData)
682
+ }, [
683
+ selectedRun.value.length === 0 ? (openBlock(), createElementBlock("div", {
684
+ key: 0,
685
+ class: normalizeClass(_ctx.$style.empty)
686
+ }, [
687
+ createVNode(_component_n8n_text, { size: "large" }, {
688
+ default: withCtx(() => [
689
+ createTextVNode(toDisplayString(unref(i18n).baseText("ndv.output.ai.empty", {
690
+ interpolate: {
691
+ node: props.node.name
692
+ }
693
+ })), 1)
694
+ ]),
695
+ _: 1
696
+ })
697
+ ], 2)) : createCommentVNode("", true),
698
+ (openBlock(true), createElementBlock(Fragment, null, renderList(selectedRun.value, (data, index) => {
699
+ return openBlock(), createElementBlock("div", {
700
+ key: `${data.node}__${data.runIndex}__index`,
701
+ "data-test-id": "lm-chat-logs-entry"
702
+ }, [
703
+ createVNode(RunDataAiContent, {
704
+ "input-data": data,
705
+ "content-index": index
706
+ }, null, 8, ["input-data", "content-index"])
707
+ ]);
708
+ }), 128))
709
+ ], 2)
710
+ ], 64)) : (openBlock(), createElementBlock("div", {
711
+ key: 1,
712
+ class: normalizeClass(_ctx.$style.noData)
713
+ }, toDisplayString(unref(i18n).baseText("ndv.output.ai.waiting")), 3))
714
+ ], 2);
715
+ };
716
+ }
717
+ });
718
+ const treeToggle = "_treeToggle_1qaq4_123";
719
+ const leafLabel = "_leafLabel_1qaq4_131";
720
+ const noData = "_noData_1qaq4_137";
721
+ const empty = "_empty_1qaq4_145";
722
+ const title = "_title_1qaq4_149";
723
+ const tree = "_tree_1qaq4_123";
724
+ const slim = "_slim_1qaq4_161";
725
+ const runData = "_runData_1qaq4_165";
726
+ const container = "_container_1qaq4_171";
727
+ const nodeIcon = "_nodeIcon_1qaq4_198";
728
+ const isSelected = "_isSelected_1qaq4_204";
729
+ const treeNode = "_treeNode_1qaq4_208";
730
+ const style0 = {
731
+ treeToggle,
732
+ leafLabel,
733
+ noData,
734
+ empty,
735
+ title,
736
+ tree,
737
+ slim,
738
+ runData,
739
+ container,
740
+ nodeIcon,
741
+ isSelected,
742
+ treeNode
743
+ };
744
+ const cssModules = {
745
+ "$style": style0
746
+ };
747
+ const RunDataAi = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules]]);
748
+ export {
749
+ RunDataAi as R
750
+ };