@n8n/ai-utilities 0.23.3 → 0.24.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 (282) hide show
  1. package/dist/cjs/adapters/langchain-chat-model.js +174 -184
  2. package/dist/cjs/adapters/langchain-chat-model.js.map +1 -1
  3. package/dist/cjs/adapters/langchain-history.js +23 -33
  4. package/dist/cjs/adapters/langchain-history.js.map +1 -1
  5. package/dist/cjs/adapters/langchain-memory.js +32 -42
  6. package/dist/cjs/adapters/langchain-memory.js.map +1 -1
  7. package/dist/cjs/agent-config/config-normalization.d.ts +11 -0
  8. package/dist/cjs/agent-config/config-normalization.js +134 -0
  9. package/dist/cjs/agent-config/config-normalization.js.map +1 -0
  10. package/dist/cjs/agent-config/from-ai-node-parameters.d.ts +7 -0
  11. package/dist/cjs/agent-config/from-ai-node-parameters.js +43 -0
  12. package/dist/cjs/agent-config/from-ai-node-parameters.js.map +1 -0
  13. package/dist/cjs/agent-config/index.d.ts +3 -0
  14. package/dist/cjs/agent-config/index.js +17 -0
  15. package/dist/cjs/agent-config/index.js.map +1 -0
  16. package/dist/cjs/agent-config/model-id.d.ts +5 -0
  17. package/dist/cjs/agent-config/model-id.js +16 -0
  18. package/dist/cjs/agent-config/model-id.js.map +1 -0
  19. package/dist/cjs/agent-config/native-web-search-provider-tools.d.ts +7 -0
  20. package/dist/cjs/agent-config/native-web-search-provider-tools.js +55 -0
  21. package/dist/cjs/agent-config/native-web-search-provider-tools.js.map +1 -0
  22. package/dist/cjs/ai-node-sdk-version.js +4 -14
  23. package/dist/cjs/ai-node-sdk-version.js.map +1 -1
  24. package/dist/cjs/chat-model/base.js +21 -31
  25. package/dist/cjs/chat-model/base.js.map +1 -1
  26. package/dist/cjs/converters/message.js +308 -318
  27. package/dist/cjs/converters/message.js.map +1 -1
  28. package/dist/cjs/converters/tool.js +50 -60
  29. package/dist/cjs/converters/tool.js.map +1 -1
  30. package/dist/cjs/guards.js +26 -36
  31. package/dist/cjs/guards.js.map +1 -1
  32. package/dist/cjs/index.js +99 -108
  33. package/dist/cjs/index.js.map +1 -1
  34. package/dist/cjs/memory/base-chat-history.js +9 -19
  35. package/dist/cjs/memory/base-chat-history.js.map +1 -1
  36. package/dist/cjs/memory/base-chat-memory.js +6 -16
  37. package/dist/cjs/memory/base-chat-memory.js.map +1 -1
  38. package/dist/cjs/memory/windowed-chat-memory.js +33 -43
  39. package/dist/cjs/memory/windowed-chat-memory.js.map +1 -1
  40. package/dist/cjs/model-discovery/index.js +61 -71
  41. package/dist/cjs/model-discovery/index.js.map +1 -1
  42. package/dist/cjs/model-discovery/providers/anthropic.js +12 -22
  43. package/dist/cjs/model-discovery/providers/anthropic.js.map +1 -1
  44. package/dist/cjs/model-discovery/providers/cohere.js +12 -22
  45. package/dist/cjs/model-discovery/providers/cohere.js.map +1 -1
  46. package/dist/cjs/model-discovery/providers/deepseek.js +5 -15
  47. package/dist/cjs/model-discovery/providers/deepseek.js.map +1 -1
  48. package/dist/cjs/model-discovery/providers/google.js +15 -25
  49. package/dist/cjs/model-discovery/providers/google.js.map +1 -1
  50. package/dist/cjs/model-discovery/providers/groq.js +9 -19
  51. package/dist/cjs/model-discovery/providers/groq.js.map +1 -1
  52. package/dist/cjs/model-discovery/providers/mistral.js +11 -21
  53. package/dist/cjs/model-discovery/providers/mistral.js.map +1 -1
  54. package/dist/cjs/model-discovery/providers/nvidia.js +21 -31
  55. package/dist/cjs/model-discovery/providers/nvidia.js.map +1 -1
  56. package/dist/cjs/model-discovery/providers/openai.js +31 -41
  57. package/dist/cjs/model-discovery/providers/openai.js.map +1 -1
  58. package/dist/cjs/model-discovery/providers/openrouter.js +5 -15
  59. package/dist/cjs/model-discovery/providers/openrouter.js.map +1 -1
  60. package/dist/cjs/model-discovery/providers/vercel.js +5 -15
  61. package/dist/cjs/model-discovery/providers/vercel.js.map +1 -1
  62. package/dist/cjs/model-discovery/providers/xai.js +5 -15
  63. package/dist/cjs/model-discovery/providers/xai.js.map +1 -1
  64. package/dist/cjs/model-discovery/request.js +40 -50
  65. package/dist/cjs/model-discovery/request.js.map +1 -1
  66. package/dist/cjs/model-discovery/types.js +2 -12
  67. package/dist/cjs/node-catalog/discriminator-utils.js +75 -85
  68. package/dist/cjs/node-catalog/discriminator-utils.js.map +1 -1
  69. package/dist/cjs/node-catalog/dynamic-node-parameters.js +169 -179
  70. package/dist/cjs/node-catalog/dynamic-node-parameters.js.map +1 -1
  71. package/dist/cjs/node-catalog/get.js +349 -359
  72. package/dist/cjs/node-catalog/get.js.map +1 -1
  73. package/dist/cjs/node-catalog/index.js +42 -52
  74. package/dist/cjs/node-catalog/index.js.map +1 -1
  75. package/dist/cjs/node-catalog/lean-node-type.js +46 -56
  76. package/dist/cjs/node-catalog/lean-node-type.js.map +1 -1
  77. package/dist/cjs/node-catalog/node-type-parser.js +61 -71
  78. package/dist/cjs/node-catalog/node-type-parser.js.map +1 -1
  79. package/dist/cjs/node-catalog/resource-operation-extractor.js +133 -143
  80. package/dist/cjs/node-catalog/resource-operation-extractor.js.map +1 -1
  81. package/dist/cjs/node-catalog/search-engine.js +285 -295
  82. package/dist/cjs/node-catalog/search-engine.js.map +1 -1
  83. package/dist/cjs/node-catalog/search.js +280 -290
  84. package/dist/cjs/node-catalog/search.js.map +1 -1
  85. package/dist/cjs/node-catalog/suggested-nodes-data.js +235 -245
  86. package/dist/cjs/node-catalog/suggested-nodes-data.js.map +1 -1
  87. package/dist/cjs/node-catalog/suggested.js +63 -73
  88. package/dist/cjs/node-catalog/suggested.js.map +1 -1
  89. package/dist/cjs/node-catalog/types.js +2 -12
  90. package/dist/cjs/suppliers/supplyMemory.js +13 -23
  91. package/dist/cjs/suppliers/supplyMemory.js.map +1 -1
  92. package/dist/cjs/suppliers/supplyModel.js +72 -82
  93. package/dist/cjs/suppliers/supplyModel.js.map +1 -1
  94. package/dist/cjs/typecheck.tsbuildinfo +1 -1
  95. package/dist/cjs/types/chat-model.js +2 -12
  96. package/dist/cjs/types/json.js +2 -12
  97. package/dist/cjs/types/memory.js +2 -12
  98. package/dist/cjs/types/message.js +2 -12
  99. package/dist/cjs/types/openai.js +2 -12
  100. package/dist/cjs/types/output.js +2 -12
  101. package/dist/cjs/types/tool.js +2 -12
  102. package/dist/cjs/utils/embeddings-input-validation.js +24 -34
  103. package/dist/cjs/utils/embeddings-input-validation.js.map +1 -1
  104. package/dist/cjs/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js +27 -37
  105. package/dist/cjs/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js.map +1 -1
  106. package/dist/cjs/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.d.ts +1 -1
  107. package/dist/cjs/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js +23 -33
  108. package/dist/cjs/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js.map +1 -1
  109. package/dist/cjs/utils/follow-redirects.js +38 -48
  110. package/dist/cjs/utils/follow-redirects.js.map +1 -1
  111. package/dist/cjs/utils/fromai-helpers.js +21 -31
  112. package/dist/cjs/utils/fromai-helpers.js.map +1 -1
  113. package/dist/cjs/utils/fromai-tool-factory.js +18 -28
  114. package/dist/cjs/utils/fromai-tool-factory.js.map +1 -1
  115. package/dist/cjs/utils/helpers.js +44 -54
  116. package/dist/cjs/utils/helpers.js.map +1 -1
  117. package/dist/cjs/utils/http-proxy-agent.js +38 -48
  118. package/dist/cjs/utils/http-proxy-agent.js.map +1 -1
  119. package/dist/cjs/utils/lazy-import.d.ts +1 -0
  120. package/dist/cjs/utils/lazy-import.js +7 -0
  121. package/dist/cjs/utils/lazy-import.js.map +1 -0
  122. package/dist/cjs/utils/loaders/n8n-pdf-loader.js +50 -94
  123. package/dist/cjs/utils/loaders/n8n-pdf-loader.js.map +1 -1
  124. package/dist/cjs/utils/log-ai-event.js +10 -20
  125. package/dist/cjs/utils/log-ai-event.js.map +1 -1
  126. package/dist/cjs/utils/log-wrapper.d.ts +1 -1
  127. package/dist/cjs/utils/log-wrapper.js +313 -323
  128. package/dist/cjs/utils/log-wrapper.js.map +1 -1
  129. package/dist/cjs/utils/n8n-binary-loader.js +143 -153
  130. package/dist/cjs/utils/n8n-binary-loader.js.map +1 -1
  131. package/dist/cjs/utils/n8n-json-loader.js +57 -67
  132. package/dist/cjs/utils/n8n-json-loader.js.map +1 -1
  133. package/dist/cjs/utils/n8n-llm-tracing.js +164 -174
  134. package/dist/cjs/utils/n8n-llm-tracing.js.map +1 -1
  135. package/dist/cjs/utils/redact-headers.js +42 -52
  136. package/dist/cjs/utils/redact-headers.js.map +1 -1
  137. package/dist/cjs/utils/shared-fields.js +137 -147
  138. package/dist/cjs/utils/shared-fields.js.map +1 -1
  139. package/dist/cjs/utils/sse.js +83 -93
  140. package/dist/cjs/utils/sse.js.map +1 -1
  141. package/dist/cjs/utils/text-editor.js +274 -284
  142. package/dist/cjs/utils/text-editor.js.map +1 -1
  143. package/dist/cjs/utils/tokenizer/tiktoken.js +38 -48
  144. package/dist/cjs/utils/tokenizer/tiktoken.js.map +1 -1
  145. package/dist/cjs/utils/tokenizer/token-estimator.js +86 -96
  146. package/dist/cjs/utils/tokenizer/token-estimator.js.map +1 -1
  147. package/dist/cjs/utils/vector-store/MemoryManager/MemoryCalculator.js +43 -53
  148. package/dist/cjs/utils/vector-store/MemoryManager/MemoryCalculator.js.map +1 -1
  149. package/dist/cjs/utils/vector-store/MemoryManager/MemoryVectorStoreManager.js +154 -164
  150. package/dist/cjs/utils/vector-store/MemoryManager/MemoryVectorStoreManager.js.map +1 -1
  151. package/dist/cjs/utils/vector-store/MemoryManager/StoreCleanupService.js +82 -92
  152. package/dist/cjs/utils/vector-store/MemoryManager/StoreCleanupService.js.map +1 -1
  153. package/dist/cjs/utils/vector-store/MemoryManager/config.js +34 -44
  154. package/dist/cjs/utils/vector-store/MemoryManager/config.js.map +1 -1
  155. package/dist/cjs/utils/vector-store/MemoryManager/types.js +2 -12
  156. package/dist/cjs/utils/vector-store/createVectorStoreNode/constants.js +44 -54
  157. package/dist/cjs/utils/vector-store/createVectorStoreNode/constants.js.map +1 -1
  158. package/dist/cjs/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js +229 -229
  159. package/dist/cjs/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js.map +1 -1
  160. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/index.js +8 -18
  161. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/index.js.map +1 -1
  162. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/insertOperation.js +33 -43
  163. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/insertOperation.js.map +1 -1
  164. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/loadOperation.js +41 -51
  165. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/loadOperation.js.map +1 -1
  166. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.js +59 -69
  167. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.js.map +1 -1
  168. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.js +58 -68
  169. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.js.map +1 -1
  170. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.js +26 -36
  171. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.js.map +1 -1
  172. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/updateOperation.js +34 -44
  173. package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/updateOperation.js.map +1 -1
  174. package/dist/cjs/utils/vector-store/createVectorStoreNode/types.js +2 -12
  175. package/dist/cjs/utils/vector-store/createVectorStoreNode/utils.d.ts +2 -1
  176. package/dist/cjs/utils/vector-store/createVectorStoreNode/utils.js +34 -29
  177. package/dist/cjs/utils/vector-store/createVectorStoreNode/utils.js.map +1 -1
  178. package/dist/cjs/utils/vector-store/processDocuments.js +37 -47
  179. package/dist/cjs/utils/vector-store/processDocuments.js.map +1 -1
  180. package/dist/cjs/utils/workflow-text-editor.js +50 -60
  181. package/dist/cjs/utils/workflow-text-editor.js.map +1 -1
  182. package/dist/cjs/web-search/brave-search.js +38 -48
  183. package/dist/cjs/web-search/brave-search.js.map +1 -1
  184. package/dist/cjs/web-search/index.js +7 -17
  185. package/dist/cjs/web-search/index.js.map +1 -1
  186. package/dist/cjs/web-search/searxng-search.js +35 -45
  187. package/dist/cjs/web-search/searxng-search.js.map +1 -1
  188. package/dist/cjs/web-search/types.js +2 -12
  189. package/dist/esm/adapters/langchain-chat-model.js.map +1 -1
  190. package/dist/esm/adapters/langchain-history.js.map +1 -1
  191. package/dist/esm/adapters/langchain-memory.js.map +1 -1
  192. package/dist/esm/agent-config/config-normalization.d.ts +11 -0
  193. package/dist/esm/agent-config/config-normalization.js +134 -0
  194. package/dist/esm/agent-config/config-normalization.js.map +1 -0
  195. package/dist/esm/agent-config/from-ai-node-parameters.d.ts +7 -0
  196. package/dist/esm/agent-config/from-ai-node-parameters.js +43 -0
  197. package/dist/esm/agent-config/from-ai-node-parameters.js.map +1 -0
  198. package/dist/esm/agent-config/index.d.ts +3 -0
  199. package/dist/esm/agent-config/index.js +17 -0
  200. package/dist/esm/agent-config/index.js.map +1 -0
  201. package/dist/esm/agent-config/model-id.d.ts +5 -0
  202. package/dist/esm/agent-config/model-id.js +16 -0
  203. package/dist/esm/agent-config/model-id.js.map +1 -0
  204. package/dist/esm/agent-config/native-web-search-provider-tools.d.ts +7 -0
  205. package/dist/esm/agent-config/native-web-search-provider-tools.js +55 -0
  206. package/dist/esm/agent-config/native-web-search-provider-tools.js.map +1 -0
  207. package/dist/esm/chat-model/base.js.map +1 -1
  208. package/dist/esm/converters/message.js.map +1 -1
  209. package/dist/esm/converters/tool.js.map +1 -1
  210. package/dist/esm/guards.js.map +1 -1
  211. package/dist/esm/index.js.map +1 -1
  212. package/dist/esm/memory/base-chat-history.js.map +1 -1
  213. package/dist/esm/memory/base-chat-memory.js.map +1 -1
  214. package/dist/esm/memory/windowed-chat-memory.js.map +1 -1
  215. package/dist/esm/model-discovery/index.js.map +1 -1
  216. package/dist/esm/model-discovery/providers/anthropic.js.map +1 -1
  217. package/dist/esm/model-discovery/providers/cohere.js.map +1 -1
  218. package/dist/esm/model-discovery/providers/google.js.map +1 -1
  219. package/dist/esm/model-discovery/providers/groq.js.map +1 -1
  220. package/dist/esm/model-discovery/providers/mistral.js.map +1 -1
  221. package/dist/esm/model-discovery/providers/nvidia.js.map +1 -1
  222. package/dist/esm/model-discovery/providers/openai.js.map +1 -1
  223. package/dist/esm/model-discovery/request.js.map +1 -1
  224. package/dist/esm/node-catalog/discriminator-utils.js.map +1 -1
  225. package/dist/esm/node-catalog/dynamic-node-parameters.js.map +1 -1
  226. package/dist/esm/node-catalog/get.js.map +1 -1
  227. package/dist/esm/node-catalog/lean-node-type.js.map +1 -1
  228. package/dist/esm/node-catalog/node-type-parser.js.map +1 -1
  229. package/dist/esm/node-catalog/resource-operation-extractor.js.map +1 -1
  230. package/dist/esm/node-catalog/search-engine.js.map +1 -1
  231. package/dist/esm/node-catalog/search.js.map +1 -1
  232. package/dist/esm/node-catalog/suggested-nodes-data.js.map +1 -1
  233. package/dist/esm/node-catalog/suggested.js.map +1 -1
  234. package/dist/esm/suppliers/supplyMemory.js.map +1 -1
  235. package/dist/esm/suppliers/supplyModel.js.map +1 -1
  236. package/dist/esm/typecheck.tsbuildinfo +1 -1
  237. package/dist/esm/utils/embeddings-input-validation.js.map +1 -1
  238. package/dist/esm/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js.map +1 -1
  239. package/dist/esm/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.d.ts +1 -1
  240. package/dist/esm/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js.map +1 -1
  241. package/dist/esm/utils/follow-redirects.js.map +1 -1
  242. package/dist/esm/utils/fromai-helpers.js.map +1 -1
  243. package/dist/esm/utils/fromai-tool-factory.js.map +1 -1
  244. package/dist/esm/utils/helpers.js.map +1 -1
  245. package/dist/esm/utils/http-proxy-agent.js.map +1 -1
  246. package/dist/esm/utils/lazy-import.d.ts +1 -0
  247. package/dist/esm/utils/lazy-import.js +7 -0
  248. package/dist/esm/utils/lazy-import.js.map +1 -0
  249. package/dist/esm/utils/loaders/n8n-pdf-loader.js +2 -35
  250. package/dist/esm/utils/loaders/n8n-pdf-loader.js.map +1 -1
  251. package/dist/esm/utils/log-ai-event.js.map +1 -1
  252. package/dist/esm/utils/log-wrapper.d.ts +1 -1
  253. package/dist/esm/utils/log-wrapper.js.map +1 -1
  254. package/dist/esm/utils/n8n-binary-loader.js.map +1 -1
  255. package/dist/esm/utils/n8n-json-loader.js.map +1 -1
  256. package/dist/esm/utils/n8n-llm-tracing.js.map +1 -1
  257. package/dist/esm/utils/redact-headers.js.map +1 -1
  258. package/dist/esm/utils/shared-fields.js.map +1 -1
  259. package/dist/esm/utils/sse.js.map +1 -1
  260. package/dist/esm/utils/text-editor.js.map +1 -1
  261. package/dist/esm/utils/tokenizer/tiktoken.js.map +1 -1
  262. package/dist/esm/utils/tokenizer/token-estimator.js.map +1 -1
  263. package/dist/esm/utils/vector-store/MemoryManager/MemoryCalculator.js.map +1 -1
  264. package/dist/esm/utils/vector-store/MemoryManager/MemoryVectorStoreManager.js.map +1 -1
  265. package/dist/esm/utils/vector-store/MemoryManager/StoreCleanupService.js.map +1 -1
  266. package/dist/esm/utils/vector-store/MemoryManager/config.js.map +1 -1
  267. package/dist/esm/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js +43 -33
  268. package/dist/esm/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js.map +1 -1
  269. package/dist/esm/utils/vector-store/createVectorStoreNode/operations/insertOperation.js.map +1 -1
  270. package/dist/esm/utils/vector-store/createVectorStoreNode/operations/loadOperation.js.map +1 -1
  271. package/dist/esm/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.js.map +1 -1
  272. package/dist/esm/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.js.map +1 -1
  273. package/dist/esm/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.js.map +1 -1
  274. package/dist/esm/utils/vector-store/createVectorStoreNode/operations/updateOperation.js.map +1 -1
  275. package/dist/esm/utils/vector-store/createVectorStoreNode/utils.d.ts +2 -1
  276. package/dist/esm/utils/vector-store/createVectorStoreNode/utils.js +15 -0
  277. package/dist/esm/utils/vector-store/createVectorStoreNode/utils.js.map +1 -1
  278. package/dist/esm/utils/vector-store/processDocuments.js.map +1 -1
  279. package/dist/esm/utils/workflow-text-editor.js.map +1 -1
  280. package/dist/esm/web-search/brave-search.js.map +1 -1
  281. package/dist/esm/web-search/searxng-search.js.map +1 -1
  282. package/package.json +22 -7
@@ -1,323 +1,313 @@
1
- (function (factory) {
2
- if (typeof module === "object" && typeof module.exports === "object") {
3
- var v = factory(require, exports);
4
- if (v !== undefined) module.exports = v;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodeBuilderNodeSearchEngine = exports.SCORE_WEIGHTS = void 0;
4
+ const sublime_search_1 = require("@n8n/utils/search/sublime-search");
5
+ const n8n_workflow_1 = require("n8n-workflow");
6
+ const lean_node_type_1 = require("./lean-node-type");
7
+ function isLeanNodeType(node) {
8
+ return 'discriminatorsByVersion' in node;
9
+ }
10
+ function isNodeConnectionType(value) {
11
+ return Object.values(n8n_workflow_1.NodeConnectionTypes).includes(value);
12
+ }
13
+ const DEFAULT_SUBNODES = {
14
+ ai_languageModel: ['@n8n/n8n-nodes-langchain.lmChatOpenAi'],
15
+ ai_memory: ['@n8n/n8n-nodes-langchain.memoryBufferWindow'],
16
+ ai_embedding: ['@n8n/n8n-nodes-langchain.embeddingsOpenAi'],
17
+ ai_vectorStore: ['@n8n/n8n-nodes-langchain.vectorStoreInMemory'],
18
+ };
19
+ const NODE_SEARCH_KEYS = [
20
+ { key: 'displayName', weight: 1.5 },
21
+ { key: 'name', weight: 1.3 },
22
+ { key: 'codex.alias', weight: 1.0 },
23
+ ];
24
+ function getTypeName(nodeName) {
25
+ if (!nodeName)
26
+ return '';
27
+ const lastDotIndex = nodeName.lastIndexOf('.');
28
+ return lastDotIndex >= 0 ? nodeName.substring(lastDotIndex + 1) : nodeName;
29
+ }
30
+ function descriptionMatchScore(description, queryLower, queryTerms) {
31
+ if (!description)
32
+ return 0;
33
+ const descriptionLower = description.toLowerCase();
34
+ if (queryTerms.length === 0)
35
+ return descriptionLower.includes(queryLower) ? 1 : 0;
36
+ let matches = 0;
37
+ for (const term of queryTerms) {
38
+ if (descriptionLower.includes(term))
39
+ matches += 1;
5
40
  }
6
- else if (typeof define === "function" && define.amd) {
7
- define(["require", "exports", "@n8n/utils/search/sublime-search", "n8n-workflow", "./lean-node-type"], factory);
8
- }
9
- })(function (require, exports) {
10
- "use strict";
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.CodeBuilderNodeSearchEngine = exports.SCORE_WEIGHTS = void 0;
13
- const sublime_search_1 = require("@n8n/utils/search/sublime-search");
14
- const n8n_workflow_1 = require("n8n-workflow");
15
- const lean_node_type_1 = require("./lean-node-type");
16
- function isLeanNodeType(node) {
17
- return 'discriminatorsByVersion' in node;
18
- }
19
- function isNodeConnectionType(value) {
20
- return Object.values(n8n_workflow_1.NodeConnectionTypes).includes(value);
21
- }
22
- const DEFAULT_SUBNODES = {
23
- ai_languageModel: ['@n8n/n8n-nodes-langchain.lmChatOpenAi'],
24
- ai_memory: ['@n8n/n8n-nodes-langchain.memoryBufferWindow'],
25
- ai_embedding: ['@n8n/n8n-nodes-langchain.embeddingsOpenAi'],
26
- ai_vectorStore: ['@n8n/n8n-nodes-langchain.vectorStoreInMemory'],
27
- };
28
- const NODE_SEARCH_KEYS = [
29
- { key: 'displayName', weight: 1.5 },
30
- { key: 'name', weight: 1.3 },
31
- { key: 'codex.alias', weight: 1.0 },
32
- ];
33
- function getTypeName(nodeName) {
34
- if (!nodeName)
35
- return '';
36
- const lastDotIndex = nodeName.lastIndexOf('.');
37
- return lastDotIndex >= 0 ? nodeName.substring(lastDotIndex + 1) : nodeName;
38
- }
39
- function descriptionMatchScore(description, queryLower, queryTerms) {
40
- if (!description)
41
- return 0;
42
- const descriptionLower = description.toLowerCase();
43
- if (queryTerms.length === 0)
44
- return descriptionLower.includes(queryLower) ? 1 : 0;
45
- let matches = 0;
46
- for (const term of queryTerms) {
47
- if (descriptionLower.includes(term))
48
- matches += 1;
41
+ return matches;
42
+ }
43
+ exports.SCORE_WEIGHTS = {
44
+ CONNECTION_EXACT: 100,
45
+ CONNECTION_IN_EXPRESSION: 50,
46
+ };
47
+ function getLatestVersion(version) {
48
+ return Array.isArray(version) ? Math.max(...version) : version;
49
+ }
50
+ function extractSubnodeRequirements(inputs) {
51
+ if (!inputs)
52
+ return [];
53
+ return Object.entries(inputs)
54
+ .filter((entry) => entry[1] !== null && entry[1] !== undefined)
55
+ .map(([connectionType, config]) => ({
56
+ connectionType,
57
+ required: config.required,
58
+ ...(config.displayOptions && { displayOptions: config.displayOptions }),
59
+ }));
60
+ }
61
+ function dedupeNodes(nodes) {
62
+ const dedupeCache = {};
63
+ nodes.forEach((node) => {
64
+ const cachedNodeType = dedupeCache[node.name];
65
+ if (!cachedNodeType) {
66
+ dedupeCache[node.name] = node;
67
+ return;
49
68
  }
50
- return matches;
51
- }
52
- exports.SCORE_WEIGHTS = {
53
- CONNECTION_EXACT: 100,
54
- CONNECTION_IN_EXPRESSION: 50,
55
- };
56
- function getLatestVersion(version) {
57
- return Array.isArray(version) ? Math.max(...version) : version;
58
- }
59
- function extractSubnodeRequirements(inputs) {
60
- if (!inputs)
61
- return [];
62
- return Object.entries(inputs)
63
- .filter((entry) => entry[1] !== null && entry[1] !== undefined)
64
- .map(([connectionType, config]) => ({
65
- connectionType,
66
- required: config.required,
67
- ...(config.displayOptions && { displayOptions: config.displayOptions }),
68
- }));
69
- }
70
- function dedupeNodes(nodes) {
71
- const dedupeCache = {};
72
- nodes.forEach((node) => {
73
- const cachedNodeType = dedupeCache[node.name];
74
- if (!cachedNodeType) {
75
- dedupeCache[node.name] = node;
76
- return;
77
- }
78
- const cachedVersion = getLatestVersion(cachedNodeType.version);
79
- const nextVersion = getLatestVersion(node.version);
80
- if (nextVersion > cachedVersion) {
81
- dedupeCache[node.name] = node;
82
- }
83
- });
84
- return Object.values(dedupeCache);
85
- }
86
- class CodeBuilderNodeSearchEngine {
87
- constructor(nodeTypes) {
88
- const lean = nodeTypes.map((n) => (isLeanNodeType(n) ? n : (0, lean_node_type_1.toLeanNodeType)(n)));
89
- this.nodeTypes = dedupeNodes(lean);
69
+ const cachedVersion = getLatestVersion(cachedNodeType.version);
70
+ const nextVersion = getLatestVersion(node.version);
71
+ if (nextVersion > cachedVersion) {
72
+ dedupeCache[node.name] = node;
90
73
  }
91
- fuzzySearchNodes(query, candidates, limit) {
92
- const queryLower = query.toLowerCase().trim();
93
- const queryTerms = queryLower.split(/\s+/).filter((t) => t.length > 1);
94
- const isMultiWord = queryTerms.length > 1;
95
- let searchResults;
96
- if (isMultiWord) {
97
- const scoreMap = new Map();
98
- for (const term of queryTerms) {
99
- const termResults = (0, sublime_search_1.sublimeSearch)(term, candidates, NODE_SEARCH_KEYS).slice(0, limit);
100
- for (const r of termResults) {
101
- const existing = scoreMap.get(r.item.name);
102
- if (!existing || r.score > existing.score) {
103
- scoreMap.set(r.item.name, { item: r.item, score: r.score });
104
- }
74
+ });
75
+ return Object.values(dedupeCache);
76
+ }
77
+ class CodeBuilderNodeSearchEngine {
78
+ constructor(nodeTypes) {
79
+ const lean = nodeTypes.map((n) => (isLeanNodeType(n) ? n : (0, lean_node_type_1.toLeanNodeType)(n)));
80
+ this.nodeTypes = dedupeNodes(lean);
81
+ }
82
+ fuzzySearchNodes(query, candidates, limit) {
83
+ const queryLower = query.toLowerCase().trim();
84
+ const queryTerms = queryLower.split(/\s+/).filter((t) => t.length > 1);
85
+ const isMultiWord = queryTerms.length > 1;
86
+ let searchResults;
87
+ if (isMultiWord) {
88
+ const scoreMap = new Map();
89
+ for (const term of queryTerms) {
90
+ const termResults = (0, sublime_search_1.sublimeSearch)(term, candidates, NODE_SEARCH_KEYS).slice(0, limit);
91
+ for (const r of termResults) {
92
+ const existing = scoreMap.get(r.item.name);
93
+ if (!existing || r.score > existing.score) {
94
+ scoreMap.set(r.item.name, { item: r.item, score: r.score });
105
95
  }
106
96
  }
107
- searchResults = [...scoreMap.values()];
108
- }
109
- else {
110
- searchResults = (0, sublime_search_1.sublimeSearch)(query, candidates, NODE_SEARCH_KEYS);
111
97
  }
112
- const fuzzyResultNames = new Set(searchResults.map((r) => r.item.name));
113
- const remainingDescriptionMatches = limit === undefined ? Number.POSITIVE_INFINITY : Math.max(0, limit - searchResults.length);
114
- if (remainingDescriptionMatches > 0) {
115
- const descriptionResults = [];
116
- for (const item of candidates) {
117
- if (fuzzyResultNames.has(item.name))
118
- continue;
119
- const score = descriptionMatchScore(item.description, queryLower, queryTerms);
120
- if (score === 0)
121
- continue;
122
- descriptionResults.push({ item, score });
123
- fuzzyResultNames.add(item.name);
124
- if (descriptionResults.length >= remainingDescriptionMatches)
125
- break;
126
- }
127
- searchResults = [...searchResults, ...descriptionResults];
128
- }
129
- const typeNameMatches = candidates
130
- .filter((node) => {
131
- if (fuzzyResultNames.has(node.name))
132
- return false;
133
- const typeName = getTypeName(node.name).toLowerCase();
134
- const displayName = (node.displayName ?? '').toLowerCase();
135
- if (typeName === queryLower || displayName === queryLower)
136
- return true;
137
- return queryTerms.some((term) => typeName === term ||
138
- typeName.includes(term) ||
139
- displayName === term ||
140
- displayName.includes(term));
141
- })
142
- .map((item) => ({ item, score: 0 }));
143
- const allResults = [...searchResults, ...typeNameMatches];
144
- allResults.sort((a, b) => {
145
- const typeNameA = getTypeName(a.item.name).toLowerCase();
146
- const displayNameA = (a.item.displayName ?? '').toLowerCase();
147
- const typeNameB = getTypeName(b.item.name).toLowerCase();
148
- const displayNameB = (b.item.displayName ?? '').toLowerCase();
149
- const exactA = typeNameA === queryLower ||
150
- displayNameA === queryLower ||
151
- queryTerms.some((t) => typeNameA === t || displayNameA === t);
152
- const exactB = typeNameB === queryLower ||
153
- displayNameB === queryLower ||
154
- queryTerms.some((t) => typeNameB === t || displayNameB === t);
155
- if (exactA && !exactB)
156
- return -1;
157
- if (!exactA && exactB)
158
- return 1;
159
- return b.score - a.score;
160
- });
161
- return allResults;
98
+ searchResults = [...scoreMap.values()];
162
99
  }
163
- searchByName(query, limit = 20, nodeFilter) {
164
- const nodeTypes = nodeFilter
165
- ? this.nodeTypes.filter((node) => nodeFilter(node.name))
166
- : this.nodeTypes;
167
- return this.fuzzySearchNodes(query, nodeTypes, limit)
168
- .slice(0, limit)
169
- .map(({ item, score, }) => {
170
- const subnodeRequirements = extractSubnodeRequirements(item.builderHint?.inputs);
171
- return {
172
- name: item.name,
173
- displayName: item.displayName,
174
- description: item.description ?? 'No description available',
175
- version: getLatestVersion(item.version),
176
- inputs: item.inputs,
177
- outputs: item.outputs,
178
- score,
179
- ...(item.builderHint?.searchHint && {
180
- builderHintMessage: item.builderHint.searchHint,
181
- }),
182
- ...(subnodeRequirements.length > 0 && { subnodeRequirements }),
183
- };
184
- });
100
+ else {
101
+ searchResults = (0, sublime_search_1.sublimeSearch)(query, candidates, NODE_SEARCH_KEYS);
185
102
  }
186
- searchByConnectionType(connectionType, limit = 20, nameFilter) {
187
- const nodesWithConnectionType = this.nodeTypes
188
- .map((nodeType) => {
189
- const connectionScore = this.getConnectionScore(nodeType, connectionType);
190
- return connectionScore > 0 ? { nodeType, connectionScore } : null;
191
- })
192
- .filter((result) => Boolean(result));
193
- if (!nameFilter) {
194
- return nodesWithConnectionType
195
- .sort((a, b) => b.connectionScore - a.connectionScore)
196
- .slice(0, limit)
197
- .map(({ nodeType, connectionScore }) => {
198
- const subnodeRequirements = extractSubnodeRequirements(nodeType.builderHint?.inputs);
199
- return {
200
- name: nodeType.name,
201
- displayName: nodeType.displayName,
202
- version: getLatestVersion(nodeType.version),
203
- description: nodeType.description ?? 'No description available',
204
- inputs: nodeType.inputs,
205
- outputs: nodeType.outputs,
206
- score: connectionScore,
207
- ...(nodeType.builderHint?.searchHint && {
208
- builderHintMessage: nodeType.builderHint.searchHint,
209
- }),
210
- ...(subnodeRequirements.length > 0 && { subnodeRequirements }),
211
- };
212
- });
103
+ const fuzzyResultNames = new Set(searchResults.map((r) => r.item.name));
104
+ const remainingDescriptionMatches = limit === undefined ? Number.POSITIVE_INFINITY : Math.max(0, limit - searchResults.length);
105
+ if (remainingDescriptionMatches > 0) {
106
+ const descriptionResults = [];
107
+ for (const item of candidates) {
108
+ if (fuzzyResultNames.has(item.name))
109
+ continue;
110
+ const score = descriptionMatchScore(item.description, queryLower, queryTerms);
111
+ if (score === 0)
112
+ continue;
113
+ descriptionResults.push({ item, score });
114
+ fuzzyResultNames.add(item.name);
115
+ if (descriptionResults.length >= remainingDescriptionMatches)
116
+ break;
213
117
  }
214
- const nodeTypesOnly = nodesWithConnectionType.map((result) => result.nodeType);
215
- const nameFilteredResults = this.fuzzySearchNodes(nameFilter, nodeTypesOnly, limit);
216
- return nameFilteredResults
118
+ searchResults = [...searchResults, ...descriptionResults];
119
+ }
120
+ const typeNameMatches = candidates
121
+ .filter((node) => {
122
+ if (fuzzyResultNames.has(node.name))
123
+ return false;
124
+ const typeName = getTypeName(node.name).toLowerCase();
125
+ const displayName = (node.displayName ?? '').toLowerCase();
126
+ if (typeName === queryLower || displayName === queryLower)
127
+ return true;
128
+ return queryTerms.some((term) => typeName === term ||
129
+ typeName.includes(term) ||
130
+ displayName === term ||
131
+ displayName.includes(term));
132
+ })
133
+ .map((item) => ({ item, score: 0 }));
134
+ const allResults = [...searchResults, ...typeNameMatches];
135
+ allResults.sort((a, b) => {
136
+ const typeNameA = getTypeName(a.item.name).toLowerCase();
137
+ const displayNameA = (a.item.displayName ?? '').toLowerCase();
138
+ const typeNameB = getTypeName(b.item.name).toLowerCase();
139
+ const displayNameB = (b.item.displayName ?? '').toLowerCase();
140
+ const exactA = typeNameA === queryLower ||
141
+ displayNameA === queryLower ||
142
+ queryTerms.some((t) => typeNameA === t || displayNameA === t);
143
+ const exactB = typeNameB === queryLower ||
144
+ displayNameB === queryLower ||
145
+ queryTerms.some((t) => typeNameB === t || displayNameB === t);
146
+ if (exactA && !exactB)
147
+ return -1;
148
+ if (!exactA && exactB)
149
+ return 1;
150
+ return b.score - a.score;
151
+ });
152
+ return allResults;
153
+ }
154
+ searchByName(query, limit = 20, nodeFilter) {
155
+ const nodeTypes = nodeFilter
156
+ ? this.nodeTypes.filter((node) => nodeFilter(node.name))
157
+ : this.nodeTypes;
158
+ return this.fuzzySearchNodes(query, nodeTypes, limit)
159
+ .slice(0, limit)
160
+ .map(({ item, score, }) => {
161
+ const subnodeRequirements = extractSubnodeRequirements(item.builderHint?.inputs);
162
+ return {
163
+ name: item.name,
164
+ displayName: item.displayName,
165
+ description: item.description ?? 'No description available',
166
+ version: getLatestVersion(item.version),
167
+ inputs: item.inputs,
168
+ outputs: item.outputs,
169
+ score,
170
+ ...(item.builderHint?.searchHint && {
171
+ builderHintMessage: item.builderHint.searchHint,
172
+ }),
173
+ ...(subnodeRequirements.length > 0 && { subnodeRequirements }),
174
+ };
175
+ });
176
+ }
177
+ searchByConnectionType(connectionType, limit = 20, nameFilter) {
178
+ const nodesWithConnectionType = this.nodeTypes
179
+ .map((nodeType) => {
180
+ const connectionScore = this.getConnectionScore(nodeType, connectionType);
181
+ return connectionScore > 0 ? { nodeType, connectionScore } : null;
182
+ })
183
+ .filter((result) => Boolean(result));
184
+ if (!nameFilter) {
185
+ return nodesWithConnectionType
186
+ .sort((a, b) => b.connectionScore - a.connectionScore)
217
187
  .slice(0, limit)
218
- .map(({ item, score: nameScore }) => {
219
- const connectionResult = nodesWithConnectionType.find((result) => result.nodeType.name === item.name);
220
- const connectionScore = connectionResult?.connectionScore ?? 0;
221
- const subnodeRequirements = extractSubnodeRequirements(item.builderHint?.inputs);
188
+ .map(({ nodeType, connectionScore }) => {
189
+ const subnodeRequirements = extractSubnodeRequirements(nodeType.builderHint?.inputs);
222
190
  return {
223
- name: item.name,
224
- version: getLatestVersion(item.version),
225
- displayName: item.displayName,
226
- description: item.description ?? 'No description available',
227
- inputs: item.inputs,
228
- outputs: item.outputs,
229
- score: connectionScore + nameScore,
230
- ...(item.builderHint?.searchHint && {
231
- builderHintMessage: item.builderHint.searchHint,
191
+ name: nodeType.name,
192
+ displayName: nodeType.displayName,
193
+ version: getLatestVersion(nodeType.version),
194
+ description: nodeType.description ?? 'No description available',
195
+ inputs: nodeType.inputs,
196
+ outputs: nodeType.outputs,
197
+ score: connectionScore,
198
+ ...(nodeType.builderHint?.searchHint && {
199
+ builderHintMessage: nodeType.builderHint.searchHint,
232
200
  }),
233
201
  ...(subnodeRequirements.length > 0 && { subnodeRequirements }),
234
202
  };
235
203
  });
236
204
  }
237
- formatResult(result) {
238
- const parts = [
239
- ' <node>',
240
- ` <node_name>${result.name}</node_name>`,
241
- ` <node_version>${result.version}</node_version>`,
242
- ` <node_description>${result.description}</node_description>`,
243
- ` <node_inputs>${typeof result.inputs === 'object' ? JSON.stringify(result.inputs) : result.inputs}</node_inputs>`,
244
- ` <node_outputs>${typeof result.outputs === 'object' ? JSON.stringify(result.outputs) : result.outputs}</node_outputs>`,
245
- ];
246
- if (result.builderHintMessage) {
247
- parts.push(` <builder_hint>${result.builderHintMessage}</builder_hint>`);
248
- }
249
- if (result.subnodeRequirements && result.subnodeRequirements.length > 0) {
250
- parts.push(' <subnode_requirements>');
251
- for (const req of result.subnodeRequirements) {
252
- const requiredStr = req.required ? 'required' : 'optional';
253
- if (req.displayOptions) {
254
- parts.push(` <requirement type="${req.connectionType}" status="${requiredStr}"><display_options>${JSON.stringify(req.displayOptions)}</display_options></requirement>`);
255
- }
256
- else {
257
- parts.push(' <requirement type="' +
258
- req.connectionType +
259
- '" status="' +
260
- requiredStr +
261
- '" />');
262
- }
263
- }
264
- parts.push(' </subnode_requirements>');
265
- }
266
- parts.push(' </node>');
267
- return '\n' + parts.join('\n');
268
- }
269
- getSubnodesForConnectionType(connectionType) {
270
- return DEFAULT_SUBNODES[connectionType] ?? [];
205
+ const nodeTypesOnly = nodesWithConnectionType.map((result) => result.nodeType);
206
+ const nameFilteredResults = this.fuzzySearchNodes(nameFilter, nodeTypesOnly, limit);
207
+ return nameFilteredResults
208
+ .slice(0, limit)
209
+ .map(({ item, score: nameScore }) => {
210
+ const connectionResult = nodesWithConnectionType.find((result) => result.nodeType.name === item.name);
211
+ const connectionScore = connectionResult?.connectionScore ?? 0;
212
+ const subnodeRequirements = extractSubnodeRequirements(item.builderHint?.inputs);
213
+ return {
214
+ name: item.name,
215
+ version: getLatestVersion(item.version),
216
+ displayName: item.displayName,
217
+ description: item.description ?? 'No description available',
218
+ inputs: item.inputs,
219
+ outputs: item.outputs,
220
+ score: connectionScore + nameScore,
221
+ ...(item.builderHint?.searchHint && {
222
+ builderHintMessage: item.builderHint.searchHint,
223
+ }),
224
+ ...(subnodeRequirements.length > 0 && { subnodeRequirements }),
225
+ };
226
+ });
227
+ }
228
+ formatResult(result) {
229
+ const parts = [
230
+ ' <node>',
231
+ ` <node_name>${result.name}</node_name>`,
232
+ ` <node_version>${result.version}</node_version>`,
233
+ ` <node_description>${result.description}</node_description>`,
234
+ ` <node_inputs>${typeof result.inputs === 'object' ? JSON.stringify(result.inputs) : result.inputs}</node_inputs>`,
235
+ ` <node_outputs>${typeof result.outputs === 'object' ? JSON.stringify(result.outputs) : result.outputs}</node_outputs>`,
236
+ ];
237
+ if (result.builderHintMessage) {
238
+ parts.push(` <builder_hint>${result.builderHintMessage}</builder_hint>`);
271
239
  }
272
- getRelatedSubnodeIds(nodeIds, excludeNodeIds) {
273
- const allRelated = new Set();
274
- const visited = new Set(excludeNodeIds);
275
- for (const nodeId of nodeIds) {
276
- visited.add(nodeId);
277
- }
278
- const queue = [...nodeIds];
279
- while (queue.length > 0) {
280
- const currentNodeId = queue.shift();
281
- const nodeType = this.nodeTypes.find((n) => n.name === currentNodeId);
282
- if (!nodeType?.builderHint?.inputs)
283
- continue;
284
- for (const connectionType of Object.keys(nodeType.builderHint.inputs)) {
285
- const subnodeIds = this.getSubnodesForConnectionType(connectionType);
286
- for (const subnodeId of subnodeIds) {
287
- if (visited.has(subnodeId))
288
- continue;
289
- visited.add(subnodeId);
290
- allRelated.add(subnodeId);
291
- queue.push(subnodeId);
292
- }
240
+ if (result.subnodeRequirements && result.subnodeRequirements.length > 0) {
241
+ parts.push(' <subnode_requirements>');
242
+ for (const req of result.subnodeRequirements) {
243
+ const requiredStr = req.required ? 'required' : 'optional';
244
+ if (req.displayOptions) {
245
+ parts.push(` <requirement type="${req.connectionType}" status="${requiredStr}"><display_options>${JSON.stringify(req.displayOptions)}</display_options></requirement>`);
246
+ }
247
+ else {
248
+ parts.push(' <requirement type="' +
249
+ req.connectionType +
250
+ '" status="' +
251
+ requiredStr +
252
+ '" />');
293
253
  }
294
254
  }
295
- return allRelated;
255
+ parts.push(' </subnode_requirements>');
296
256
  }
297
- getNodeType(nodeId) {
298
- return this.nodeTypes.find((n) => n.name === nodeId);
257
+ parts.push(' </node>');
258
+ return '\n' + parts.join('\n');
259
+ }
260
+ getSubnodesForConnectionType(connectionType) {
261
+ return DEFAULT_SUBNODES[connectionType] ?? [];
262
+ }
263
+ getRelatedSubnodeIds(nodeIds, excludeNodeIds) {
264
+ const allRelated = new Set();
265
+ const visited = new Set(excludeNodeIds);
266
+ for (const nodeId of nodeIds) {
267
+ visited.add(nodeId);
299
268
  }
300
- getConnectionScore(nodeType, connectionType) {
301
- const outputs = nodeType.outputs;
302
- if (Array.isArray(outputs)) {
303
- if (outputs.includes(connectionType)) {
304
- return exports.SCORE_WEIGHTS.CONNECTION_EXACT;
305
- }
306
- }
307
- else if (typeof outputs === 'string') {
308
- if (outputs.includes(connectionType)) {
309
- return exports.SCORE_WEIGHTS.CONNECTION_IN_EXPRESSION;
269
+ const queue = [...nodeIds];
270
+ while (queue.length > 0) {
271
+ const currentNodeId = queue.shift();
272
+ const nodeType = this.nodeTypes.find((n) => n.name === currentNodeId);
273
+ if (!nodeType?.builderHint?.inputs)
274
+ continue;
275
+ for (const connectionType of Object.keys(nodeType.builderHint.inputs)) {
276
+ const subnodeIds = this.getSubnodesForConnectionType(connectionType);
277
+ for (const subnodeId of subnodeIds) {
278
+ if (visited.has(subnodeId))
279
+ continue;
280
+ visited.add(subnodeId);
281
+ allRelated.add(subnodeId);
282
+ queue.push(subnodeId);
310
283
  }
311
284
  }
312
- return 0;
313
285
  }
314
- static isAiConnectionType(connectionType) {
315
- return connectionType.startsWith('ai_');
286
+ return allRelated;
287
+ }
288
+ getNodeType(nodeId) {
289
+ return this.nodeTypes.find((n) => n.name === nodeId);
290
+ }
291
+ getConnectionScore(nodeType, connectionType) {
292
+ const outputs = nodeType.outputs;
293
+ if (Array.isArray(outputs)) {
294
+ if (outputs.includes(connectionType)) {
295
+ return exports.SCORE_WEIGHTS.CONNECTION_EXACT;
296
+ }
316
297
  }
317
- static getAiConnectionTypes() {
318
- return Object.values(n8n_workflow_1.NodeConnectionTypes).filter((type) => isNodeConnectionType(type) && CodeBuilderNodeSearchEngine.isAiConnectionType(type));
298
+ else if (typeof outputs === 'string') {
299
+ if (outputs.includes(connectionType)) {
300
+ return exports.SCORE_WEIGHTS.CONNECTION_IN_EXPRESSION;
301
+ }
319
302
  }
303
+ return 0;
304
+ }
305
+ static isAiConnectionType(connectionType) {
306
+ return connectionType.startsWith('ai_');
307
+ }
308
+ static getAiConnectionTypes() {
309
+ return Object.values(n8n_workflow_1.NodeConnectionTypes).filter((type) => isNodeConnectionType(type) && CodeBuilderNodeSearchEngine.isAiConnectionType(type));
320
310
  }
321
- exports.CodeBuilderNodeSearchEngine = CodeBuilderNodeSearchEngine;
322
- });
311
+ }
312
+ exports.CodeBuilderNodeSearchEngine = CodeBuilderNodeSearchEngine;
323
313
  //# sourceMappingURL=search-engine.js.map