@n8n/ai-utilities 0.23.2 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,367 +1,337 @@
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;
5
- }
6
- else if (typeof define === "function" && define.amd) {
7
- define(["require", "exports", "node:fs", "node:path"], factory);
8
- }
9
- })(function (require, exports) {
10
- "use strict";
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.isValidPathComponent = isValidPathComponent;
13
- exports.validatePathWithinBase = validatePathWithinBase;
14
- exports.toSnakeCase = toSnakeCase;
15
- exports.parseNodeId = parseNodeId;
16
- exports.getNodeTypeDefinition = getNodeTypeDefinition;
17
- exports.getNodeTypes = getNodeTypes;
18
- const node_fs_1 = require("node:fs");
19
- const node_path_1 = require("node:path");
20
- function isValidPathComponent(component) {
21
- if (!component || component.trim() === '') {
22
- return false;
23
- }
24
- if (component.includes('\0')) {
25
- return false;
26
- }
27
- if (component.includes('/') || component.includes('\\')) {
28
- return false;
29
- }
30
- if (component === '..' || component.startsWith('..')) {
31
- return false;
32
- }
33
- return true;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isValidPathComponent = isValidPathComponent;
4
+ exports.validatePathWithinBase = validatePathWithinBase;
5
+ exports.toSnakeCase = toSnakeCase;
6
+ exports.parseNodeId = parseNodeId;
7
+ exports.getNodeTypeDefinition = getNodeTypeDefinition;
8
+ exports.getNodeTypes = getNodeTypes;
9
+ const node_fs_1 = require("node:fs");
10
+ const node_path_1 = require("node:path");
11
+ function isValidPathComponent(component) {
12
+ if (!component || component.trim() === '') {
13
+ return false;
34
14
  }
35
- function validatePathWithinBase(filePath, baseDir) {
36
- const resolvedPath = (0, node_path_1.resolve)(filePath);
37
- const resolvedBase = (0, node_path_1.resolve)(baseDir);
38
- const separator = process.platform === 'win32' ? '\\' : '/';
39
- return resolvedPath.startsWith(resolvedBase + separator) || resolvedPath === resolvedBase;
15
+ if (component.includes('\0')) {
16
+ return false;
40
17
  }
41
- function getGeneratedNodesPaths(nodeDefinitionDirs) {
42
- if (nodeDefinitionDirs && nodeDefinitionDirs.length > 0) {
43
- return nodeDefinitionDirs.map((dir) => (0, node_path_1.join)(dir, 'nodes'));
44
- }
45
- return [];
18
+ if (component.includes('/') || component.includes('\\')) {
19
+ return false;
46
20
  }
47
- function findNodeDir(parsed, nodesPaths) {
48
- const candidates = [parsed.nodeName];
49
- const baseName = parsed.nodeName.replace(/(?:HitlTool|Tool)$/, '');
50
- if (baseName !== parsed.nodeName)
51
- candidates.push(baseName);
52
- for (const candidate of candidates) {
53
- for (const nodesPath of nodesPaths) {
54
- const nodeDir = (0, node_path_1.join)(nodesPath, parsed.packageName, candidate);
55
- if ((0, node_fs_1.existsSync)(nodeDir)) {
56
- return { nodesPath, nodeDir };
57
- }
58
- }
59
- }
60
- return null;
21
+ if (component === '..' || component.startsWith('..')) {
22
+ return false;
61
23
  }
62
- function toSnakeCase(str) {
63
- return str
64
- .replace(/([A-Z])/g, '_$1')
65
- .toLowerCase()
66
- .replace(/^_/, '')
67
- .replace(/[-\s]+/g, '_');
68
- }
69
- function isSplitVersionStructure(nodeDir, versionStr) {
70
- const versionDir = (0, node_path_1.join)(nodeDir, versionStr);
71
- return (0, node_fs_1.existsSync)(versionDir) && (0, node_fs_1.statSync)(versionDir).isDirectory();
72
- }
73
- function getAvailableDiscriminators(nodeDir, versionStr) {
74
- const versionDir = (0, node_path_1.join)(nodeDir, versionStr);
75
- if (!(0, node_fs_1.existsSync)(versionDir)) {
76
- return {};
77
- }
78
- try {
79
- const entries = (0, node_fs_1.readdirSync)(versionDir, { withFileTypes: true });
80
- const resources = [];
81
- const modes = [];
82
- for (const entry of entries) {
83
- if (entry.isDirectory() && entry.name.startsWith('resource_')) {
84
- resources.push(entry.name.replace('resource_', ''));
85
- }
86
- else if (entry.isFile() && entry.name.startsWith('mode_') && entry.name.endsWith('.ts')) {
87
- modes.push(entry.name.replace('mode_', '').replace('.ts', ''));
88
- }
24
+ return true;
25
+ }
26
+ function validatePathWithinBase(filePath, baseDir) {
27
+ const resolvedPath = (0, node_path_1.resolve)(filePath);
28
+ const resolvedBase = (0, node_path_1.resolve)(baseDir);
29
+ const separator = process.platform === 'win32' ? '\\' : '/';
30
+ return resolvedPath.startsWith(resolvedBase + separator) || resolvedPath === resolvedBase;
31
+ }
32
+ function getGeneratedNodesPaths(nodeDefinitionDirs) {
33
+ if (nodeDefinitionDirs && nodeDefinitionDirs.length > 0) {
34
+ return nodeDefinitionDirs.map((dir) => (0, node_path_1.join)(dir, 'nodes'));
35
+ }
36
+ return [];
37
+ }
38
+ function findNodeDir(parsed, nodesPaths) {
39
+ const candidates = [parsed.nodeName];
40
+ const baseName = parsed.nodeName.replace(/(?:HitlTool|Tool)$/, '');
41
+ if (baseName !== parsed.nodeName)
42
+ candidates.push(baseName);
43
+ for (const candidate of candidates) {
44
+ for (const nodesPath of nodesPaths) {
45
+ const nodeDir = (0, node_path_1.join)(nodesPath, parsed.packageName, candidate);
46
+ if ((0, node_fs_1.existsSync)(nodeDir)) {
47
+ return { nodesPath, nodeDir };
89
48
  }
90
- return {
91
- resources: resources.length > 0 ? resources : undefined,
92
- modes: modes.length > 0 ? modes : undefined,
93
- };
94
- }
95
- catch {
96
- return {};
97
49
  }
98
50
  }
99
- function parseNodeId(nodeId) {
100
- if (nodeId.startsWith('@n8n/')) {
101
- const withoutPrefix = nodeId.slice(5);
102
- const dotIndex = withoutPrefix.indexOf('.');
103
- if (dotIndex === -1) {
104
- return null;
51
+ return null;
52
+ }
53
+ function toSnakeCase(str) {
54
+ return str
55
+ .replace(/([A-Z])/g, '_$1')
56
+ .toLowerCase()
57
+ .replace(/^_/, '')
58
+ .replace(/[-\s]+/g, '_');
59
+ }
60
+ function isSplitVersionStructure(nodeDir, versionStr) {
61
+ const versionDir = (0, node_path_1.join)(nodeDir, versionStr);
62
+ return (0, node_fs_1.existsSync)(versionDir) && (0, node_fs_1.statSync)(versionDir).isDirectory();
63
+ }
64
+ function getAvailableDiscriminators(nodeDir, versionStr) {
65
+ const versionDir = (0, node_path_1.join)(nodeDir, versionStr);
66
+ if (!(0, node_fs_1.existsSync)(versionDir)) {
67
+ return {};
68
+ }
69
+ try {
70
+ const entries = (0, node_fs_1.readdirSync)(versionDir, { withFileTypes: true });
71
+ const resources = [];
72
+ const modes = [];
73
+ for (const entry of entries) {
74
+ if (entry.isDirectory() && entry.name.startsWith('resource_')) {
75
+ resources.push(entry.name.replace('resource_', ''));
76
+ }
77
+ else if (entry.isFile() && entry.name.startsWith('mode_') && entry.name.endsWith('.ts')) {
78
+ modes.push(entry.name.replace('mode_', '').replace('.ts', ''));
105
79
  }
106
- return {
107
- packageName: withoutPrefix.slice(0, dotIndex),
108
- nodeName: withoutPrefix.slice(dotIndex + 1),
109
- };
110
80
  }
111
- const dotIndex = nodeId.indexOf('.');
81
+ return {
82
+ resources: resources.length > 0 ? resources : undefined,
83
+ modes: modes.length > 0 ? modes : undefined,
84
+ };
85
+ }
86
+ catch {
87
+ return {};
88
+ }
89
+ }
90
+ function parseNodeId(nodeId) {
91
+ if (nodeId.startsWith('@n8n/')) {
92
+ const withoutPrefix = nodeId.slice(5);
93
+ const dotIndex = withoutPrefix.indexOf('.');
112
94
  if (dotIndex === -1) {
113
95
  return null;
114
96
  }
115
97
  return {
116
- packageName: nodeId.slice(0, dotIndex),
117
- nodeName: nodeId.slice(dotIndex + 1),
98
+ packageName: withoutPrefix.slice(0, dotIndex),
99
+ nodeName: withoutPrefix.slice(dotIndex + 1),
118
100
  };
119
101
  }
120
- function getNodeVersions(nodeId, nodeDefinitionDirs) {
121
- const parsed = parseNodeId(nodeId);
122
- if (!parsed) {
123
- return [];
124
- }
125
- const nodesPaths = getGeneratedNodesPaths(nodeDefinitionDirs);
126
- const found = findNodeDir(parsed, nodesPaths);
127
- if (!found) {
128
- return [];
129
- }
130
- const { nodeDir } = found;
131
- try {
132
- const entries = (0, node_fs_1.readdirSync)(nodeDir, { withFileTypes: true });
133
- const versions = [];
134
- for (const entry of entries) {
135
- if (entry.isFile() &&
136
- entry.name.startsWith('v') &&
137
- entry.name.endsWith('.ts') &&
138
- entry.name !== 'index.ts' &&
139
- !entry.name.endsWith('.schema.js')) {
140
- versions.push(entry.name.replace('.ts', ''));
141
- }
142
- else if (entry.isDirectory() && /^v\d+$/.test(entry.name)) {
143
- versions.push(entry.name);
144
- }
102
+ const dotIndex = nodeId.indexOf('.');
103
+ if (dotIndex === -1) {
104
+ return null;
105
+ }
106
+ return {
107
+ packageName: nodeId.slice(0, dotIndex),
108
+ nodeName: nodeId.slice(dotIndex + 1),
109
+ };
110
+ }
111
+ function getNodeVersions(nodeId, nodeDefinitionDirs) {
112
+ const parsed = parseNodeId(nodeId);
113
+ if (!parsed) {
114
+ return [];
115
+ }
116
+ const nodesPaths = getGeneratedNodesPaths(nodeDefinitionDirs);
117
+ const found = findNodeDir(parsed, nodesPaths);
118
+ if (!found) {
119
+ return [];
120
+ }
121
+ const { nodeDir } = found;
122
+ try {
123
+ const entries = (0, node_fs_1.readdirSync)(nodeDir, { withFileTypes: true });
124
+ const versions = [];
125
+ for (const entry of entries) {
126
+ if (entry.isFile() &&
127
+ entry.name.startsWith('v') &&
128
+ entry.name.endsWith('.ts') &&
129
+ entry.name !== 'index.ts' &&
130
+ !entry.name.endsWith('.schema.js')) {
131
+ versions.push(entry.name.replace('.ts', ''));
132
+ }
133
+ else if (entry.isDirectory() && /^v\d+$/.test(entry.name)) {
134
+ versions.push(entry.name);
145
135
  }
146
- versions.sort((a, b) => {
147
- const aNum = parseInt(a.slice(1), 10);
148
- const bNum = parseInt(b.slice(1), 10);
149
- return bNum - aNum;
150
- });
151
- return versions;
152
- }
153
- catch {
154
- return [];
155
136
  }
137
+ versions.sort((a, b) => {
138
+ const aNum = parseInt(a.slice(1), 10);
139
+ const bNum = parseInt(b.slice(1), 10);
140
+ return bNum - aNum;
141
+ });
142
+ return versions;
156
143
  }
157
- function resolveResourceOperationPath(nodeDir, targetVersion, nodeId, available, discriminators) {
158
- if (!discriminators?.resource || !discriminators?.operation) {
159
- const index = (available.resources ?? [])
160
- .map((resource) => {
161
- try {
162
- const ops = (0, node_fs_1.readdirSync)((0, node_path_1.join)(nodeDir, targetVersion, `resource_${toSnakeCase(resource)}`))
163
- .filter((f) => f.startsWith('operation_') && f.endsWith('.ts'))
164
- .map((f) => f.replace('operation_', '').replace('.ts', ''));
165
- return `${resource} (${ops.join(', ')})`;
166
- }
167
- catch {
168
- return resource;
169
- }
170
- })
171
- .join('; ');
172
- return {
173
- error: `Error: Node '${nodeId}' requires resource and operation discriminators. Available resource (operations): ${index}.`,
174
- requiresDiscriminators: true,
175
- availableDiscriminators: available,
176
- };
177
- }
178
- if (!isValidPathComponent(discriminators.resource)) {
179
- return {
180
- error: `Error: Invalid resource value '${discriminators.resource}' - contains invalid characters`,
181
- };
182
- }
183
- if (!isValidPathComponent(discriminators.operation)) {
184
- return {
185
- error: `Error: Invalid operation value '${discriminators.operation}' - contains invalid characters`,
186
- };
187
- }
188
- const resourcePath = `resource_${toSnakeCase(discriminators.resource)}`;
189
- const resourceDir = (0, node_path_1.join)(nodeDir, targetVersion, resourcePath);
190
- if (!(0, node_fs_1.existsSync)(resourceDir)) {
191
- return {
192
- error: `Error: Invalid resource '${discriminators.resource}' for node '${nodeId}'. Available: ${available.resources?.join(', ')}`,
193
- };
194
- }
195
- const operationFile = `operation_${toSnakeCase(discriminators.operation)}.ts`;
196
- const filePath = (0, node_path_1.join)(resourceDir, operationFile);
197
- if (!validatePathWithinBase(filePath, nodeDir)) {
198
- return {
199
- error: 'Error: Invalid path - path traversal detected',
200
- };
201
- }
202
- if (!(0, node_fs_1.existsSync)(filePath)) {
144
+ catch {
145
+ return [];
146
+ }
147
+ }
148
+ function resolveResourceOperationPath(nodeDir, targetVersion, nodeId, available, discriminators) {
149
+ if (!discriminators?.resource || !discriminators?.operation) {
150
+ const index = (available.resources ?? [])
151
+ .map((resource) => {
203
152
  try {
204
- const ops = (0, node_fs_1.readdirSync)(resourceDir)
153
+ const ops = (0, node_fs_1.readdirSync)((0, node_path_1.join)(nodeDir, targetVersion, `resource_${toSnakeCase(resource)}`))
205
154
  .filter((f) => f.startsWith('operation_') && f.endsWith('.ts'))
206
155
  .map((f) => f.replace('operation_', '').replace('.ts', ''));
207
- return {
208
- error: `Error: Invalid operation '${discriminators.operation}' for resource '${discriminators.resource}'. Available: ${ops.join(', ')}`,
209
- };
156
+ return `${resource} (${ops.join(', ')})`;
210
157
  }
211
158
  catch {
212
- return {
213
- error: `Error: Could not read operations for resource '${discriminators.resource}'`,
214
- };
159
+ return resource;
215
160
  }
216
- }
217
- return { filePath };
218
- }
219
- function resolveModePath(nodeDir, targetVersion, nodeId, available, mode) {
220
- if (!mode) {
221
- const variants = (available.modes ?? [])
222
- .filter((m) => isValidPathComponent(m))
223
- .sort()
224
- .map((m) => ({
225
- mode: m,
226
- filePath: (0, node_path_1.join)(nodeDir, targetVersion, `mode_${toSnakeCase(m)}.ts`),
227
- }))
228
- .filter((variant) => validatePathWithinBase(variant.filePath, nodeDir) && (0, node_fs_1.existsSync)(variant.filePath));
229
- if (variants.length > 0)
230
- return { modeVariants: variants };
231
- return {
232
- error: `Error: Node '${nodeId}' requires mode discriminator. Available modes: ${available.modes?.join(', ')}.`,
233
- requiresDiscriminators: true,
234
- availableDiscriminators: available,
235
- };
236
- }
237
- if (!isValidPathComponent(mode)) {
238
- return {
239
- error: `Error: Invalid mode value '${mode}' - contains invalid characters`,
240
- };
241
- }
242
- const modeFile = `mode_${toSnakeCase(mode)}.ts`;
243
- const filePath = (0, node_path_1.join)(nodeDir, targetVersion, modeFile);
244
- if (!validatePathWithinBase(filePath, nodeDir)) {
245
- return {
246
- error: 'Error: Invalid path - path traversal detected',
247
- };
248
- }
249
- if (!(0, node_fs_1.existsSync)(filePath)) {
250
- return {
251
- error: `Error: Invalid mode '${mode}' for node '${nodeId}'. Available: ${available.modes?.join(', ')}`,
252
- };
253
- }
254
- return { filePath };
161
+ })
162
+ .join('; ');
163
+ return {
164
+ error: `Error: Node '${nodeId}' requires resource and operation discriminators. Available resource (operations): ${index}.`,
165
+ requiresDiscriminators: true,
166
+ availableDiscriminators: available,
167
+ };
255
168
  }
256
- function getNodeFilePath(nodeId, version, nodeDefinitionDirs, discriminators) {
257
- const parsed = parseNodeId(nodeId);
258
- if (!parsed) {
259
- return { error: `Invalid node ID format: '${nodeId}'` };
260
- }
261
- if (!isValidPathComponent(parsed.packageName)) {
262
- return {
263
- error: `Error: Invalid package name in node ID '${nodeId}' - contains invalid characters`,
264
- };
265
- }
266
- if (!isValidPathComponent(parsed.nodeName)) {
267
- return {
268
- error: `Error: Invalid node name in node ID '${nodeId}' - contains invalid characters`,
269
- };
270
- }
271
- const nodesPaths = getGeneratedNodesPaths(nodeDefinitionDirs);
272
- const found = findNodeDir(parsed, nodesPaths);
273
- if (!found) {
274
- return {
275
- error: `Node type '${nodeId}' not found. Use search_node to find the correct node ID.`,
276
- };
277
- }
278
- const { nodesPath, nodeDir } = found;
279
- if (!validatePathWithinBase(nodeDir, nodesPath)) {
280
- return { error: 'Error: Invalid path - path traversal detected' };
281
- }
282
- let targetVersion = version;
283
- if (!targetVersion) {
284
- const versions = getNodeVersions(nodeId, nodeDefinitionDirs);
285
- if (versions.length === 0) {
286
- return { error: `No versions found for node '${nodeId}'` };
287
- }
288
- targetVersion = versions[0];
289
- }
290
- if (!targetVersion.startsWith('v')) {
291
- targetVersion = `v${targetVersion.replace('.', '')}`;
292
- }
293
- else {
294
- targetVersion = `v${targetVersion.slice(1).replace('.', '')}`;
295
- }
296
- if (isSplitVersionStructure(nodeDir, targetVersion)) {
297
- const available = getAvailableDiscriminators(nodeDir, targetVersion);
298
- if (available.resources && available.resources.length > 0) {
299
- return resolveResourceOperationPath(nodeDir, targetVersion, nodeId, available, discriminators);
300
- }
301
- if (available.modes && available.modes.length > 0) {
302
- return resolveModePath(nodeDir, targetVersion, nodeId, available, discriminators?.mode);
303
- }
169
+ if (!isValidPathComponent(discriminators.resource)) {
170
+ return {
171
+ error: `Error: Invalid resource value '${discriminators.resource}' - contains invalid characters`,
172
+ };
173
+ }
174
+ if (!isValidPathComponent(discriminators.operation)) {
175
+ return {
176
+ error: `Error: Invalid operation value '${discriminators.operation}' - contains invalid characters`,
177
+ };
178
+ }
179
+ const resourcePath = `resource_${toSnakeCase(discriminators.resource)}`;
180
+ const resourceDir = (0, node_path_1.join)(nodeDir, targetVersion, resourcePath);
181
+ if (!(0, node_fs_1.existsSync)(resourceDir)) {
182
+ return {
183
+ error: `Error: Invalid resource '${discriminators.resource}' for node '${nodeId}'. Available: ${available.resources?.join(', ')}`,
184
+ };
185
+ }
186
+ const operationFile = `operation_${toSnakeCase(discriminators.operation)}.ts`;
187
+ const filePath = (0, node_path_1.join)(resourceDir, operationFile);
188
+ if (!validatePathWithinBase(filePath, nodeDir)) {
189
+ return {
190
+ error: 'Error: Invalid path - path traversal detected',
191
+ };
192
+ }
193
+ if (!(0, node_fs_1.existsSync)(filePath)) {
194
+ try {
195
+ const ops = (0, node_fs_1.readdirSync)(resourceDir)
196
+ .filter((f) => f.startsWith('operation_') && f.endsWith('.ts'))
197
+ .map((f) => f.replace('operation_', '').replace('.ts', ''));
304
198
  return {
305
- error: `Error: Node '${nodeId}' has split structure but no recognized discriminators found`,
199
+ error: `Error: Invalid operation '${discriminators.operation}' for resource '${discriminators.resource}'. Available: ${ops.join(', ')}`,
306
200
  };
307
201
  }
308
- const filePath = (0, node_path_1.join)(nodeDir, `${targetVersion}.ts`);
309
- if (!(0, node_fs_1.existsSync)(filePath)) {
310
- return { error: `Version '${version}' not found for node '${nodeId}'` };
311
- }
312
- return { filePath };
313
- }
314
- function getNodeTypeDefinition(nodeId, version, nodeDefinitionDirs, discriminators) {
315
- const nodesPaths = getGeneratedNodesPaths(nodeDefinitionDirs);
316
- const anyDirExists = nodesPaths.some((p) => (0, node_fs_1.existsSync)(p));
317
- if (!anyDirExists) {
318
- const errorMsg = nodeDefinitionDirs
319
- ? 'Node types directory not found in any of the configured dirs. Types may not have been generated yet.'
320
- : 'Node types not found. The generated types directory does not exist. Ensure the application has started properly and types have been generated.';
202
+ catch {
321
203
  return {
322
- nodeId,
323
- content: '',
324
- error: errorMsg,
204
+ error: `Error: Could not read operations for resource '${discriminators.resource}'`,
325
205
  };
326
206
  }
327
- const pathResult = getNodeFilePath(nodeId, version, nodeDefinitionDirs, discriminators);
328
- if (pathResult.error) {
329
- const availableVersions = getNodeVersions(nodeId, nodeDefinitionDirs);
330
- return {
331
- nodeId,
332
- version,
333
- content: '',
334
- availableVersions: availableVersions.length > 0 ? availableVersions : undefined,
335
- error: pathResult.error,
336
- };
207
+ }
208
+ return { filePath };
209
+ }
210
+ function resolveModePath(nodeDir, targetVersion, nodeId, available, mode) {
211
+ if (!mode) {
212
+ const variants = (available.modes ?? [])
213
+ .filter((m) => isValidPathComponent(m))
214
+ .sort()
215
+ .map((m) => ({
216
+ mode: m,
217
+ filePath: (0, node_path_1.join)(nodeDir, targetVersion, `mode_${toSnakeCase(m)}.ts`),
218
+ }))
219
+ .filter((variant) => validatePathWithinBase(variant.filePath, nodeDir) && (0, node_fs_1.existsSync)(variant.filePath));
220
+ if (variants.length > 0)
221
+ return { modeVariants: variants };
222
+ return {
223
+ error: `Error: Node '${nodeId}' requires mode discriminator. Available modes: ${available.modes?.join(', ')}.`,
224
+ requiresDiscriminators: true,
225
+ availableDiscriminators: available,
226
+ };
227
+ }
228
+ if (!isValidPathComponent(mode)) {
229
+ return {
230
+ error: `Error: Invalid mode value '${mode}' - contains invalid characters`,
231
+ };
232
+ }
233
+ const modeFile = `mode_${toSnakeCase(mode)}.ts`;
234
+ const filePath = (0, node_path_1.join)(nodeDir, targetVersion, modeFile);
235
+ if (!validatePathWithinBase(filePath, nodeDir)) {
236
+ return {
237
+ error: 'Error: Invalid path - path traversal detected',
238
+ };
239
+ }
240
+ if (!(0, node_fs_1.existsSync)(filePath)) {
241
+ return {
242
+ error: `Error: Invalid mode '${mode}' for node '${nodeId}'. Available: ${available.modes?.join(', ')}`,
243
+ };
244
+ }
245
+ return { filePath };
246
+ }
247
+ function getNodeFilePath(nodeId, version, nodeDefinitionDirs, discriminators) {
248
+ const parsed = parseNodeId(nodeId);
249
+ if (!parsed) {
250
+ return { error: `Invalid node ID format: '${nodeId}'` };
251
+ }
252
+ if (!isValidPathComponent(parsed.packageName)) {
253
+ return {
254
+ error: `Error: Invalid package name in node ID '${nodeId}' - contains invalid characters`,
255
+ };
256
+ }
257
+ if (!isValidPathComponent(parsed.nodeName)) {
258
+ return {
259
+ error: `Error: Invalid node name in node ID '${nodeId}' - contains invalid characters`,
260
+ };
261
+ }
262
+ const nodesPaths = getGeneratedNodesPaths(nodeDefinitionDirs);
263
+ const found = findNodeDir(parsed, nodesPaths);
264
+ if (!found) {
265
+ return {
266
+ error: `Node type '${nodeId}' not found. Use search_node to find the correct node ID.`,
267
+ };
268
+ }
269
+ const { nodesPath, nodeDir } = found;
270
+ if (!validatePathWithinBase(nodeDir, nodesPath)) {
271
+ return { error: 'Error: Invalid path - path traversal detected' };
272
+ }
273
+ let targetVersion = version;
274
+ if (!targetVersion) {
275
+ const versions = getNodeVersions(nodeId, nodeDefinitionDirs);
276
+ if (versions.length === 0) {
277
+ return { error: `No versions found for node '${nodeId}'` };
337
278
  }
338
- if (pathResult.modeVariants) {
339
- try {
340
- const sections = pathResult.modeVariants.map((variant) => `// ── mode: ${variant.mode} ──\n${(0, node_fs_1.readFileSync)(variant.filePath, 'utf-8')}`);
341
- const header = `// No mode discriminator was given — definitions for all ${String(pathResult.modeVariants.length)} modes of '${nodeId}' follow (pass \`mode\` to fetch a single one).`;
342
- const actualVersion = pathResult.modeVariants[0].filePath.match(/\/(v\d+)(?:\/|\.ts)/)?.[1];
343
- return { nodeId, version: actualVersion, content: [header, ...sections].join('\n\n') };
344
- }
345
- catch (error) {
346
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
347
- return {
348
- nodeId,
349
- content: '',
350
- error: `Error reading node definition for '${nodeId}': ${errorMessage}`,
351
- };
352
- }
279
+ targetVersion = versions[0];
280
+ }
281
+ if (!targetVersion.startsWith('v')) {
282
+ targetVersion = `v${targetVersion.replace('.', '')}`;
283
+ }
284
+ else {
285
+ targetVersion = `v${targetVersion.slice(1).replace('.', '')}`;
286
+ }
287
+ if (isSplitVersionStructure(nodeDir, targetVersion)) {
288
+ const available = getAvailableDiscriminators(nodeDir, targetVersion);
289
+ if (available.resources && available.resources.length > 0) {
290
+ return resolveResourceOperationPath(nodeDir, targetVersion, nodeId, available, discriminators);
353
291
  }
354
- if (!pathResult.filePath) {
355
- return {
356
- nodeId,
357
- content: '',
358
- error: `Node type '${nodeId}' not found. Use search_node to find the correct node ID.`,
359
- };
292
+ if (available.modes && available.modes.length > 0) {
293
+ return resolveModePath(nodeDir, targetVersion, nodeId, available, discriminators?.mode);
360
294
  }
295
+ return {
296
+ error: `Error: Node '${nodeId}' has split structure but no recognized discriminators found`,
297
+ };
298
+ }
299
+ const filePath = (0, node_path_1.join)(nodeDir, `${targetVersion}.ts`);
300
+ if (!(0, node_fs_1.existsSync)(filePath)) {
301
+ return { error: `Version '${version}' not found for node '${nodeId}'` };
302
+ }
303
+ return { filePath };
304
+ }
305
+ function getNodeTypeDefinition(nodeId, version, nodeDefinitionDirs, discriminators) {
306
+ const nodesPaths = getGeneratedNodesPaths(nodeDefinitionDirs);
307
+ const anyDirExists = nodesPaths.some((p) => (0, node_fs_1.existsSync)(p));
308
+ if (!anyDirExists) {
309
+ const errorMsg = nodeDefinitionDirs
310
+ ? 'Node types directory not found in any of the configured dirs. Types may not have been generated yet.'
311
+ : 'Node types not found. The generated types directory does not exist. Ensure the application has started properly and types have been generated.';
312
+ return {
313
+ nodeId,
314
+ content: '',
315
+ error: errorMsg,
316
+ };
317
+ }
318
+ const pathResult = getNodeFilePath(nodeId, version, nodeDefinitionDirs, discriminators);
319
+ if (pathResult.error) {
320
+ const availableVersions = getNodeVersions(nodeId, nodeDefinitionDirs);
321
+ return {
322
+ nodeId,
323
+ version,
324
+ content: '',
325
+ availableVersions: availableVersions.length > 0 ? availableVersions : undefined,
326
+ error: pathResult.error,
327
+ };
328
+ }
329
+ if (pathResult.modeVariants) {
361
330
  try {
362
- const content = (0, node_fs_1.readFileSync)(pathResult.filePath, 'utf-8');
363
- const actualVersion = pathResult.filePath.match(/\/(v\d+)(?:\/|\.ts)/)?.[1];
364
- return { nodeId, version: actualVersion, content };
331
+ const sections = pathResult.modeVariants.map((variant) => `// ── mode: ${variant.mode} ──\n${(0, node_fs_1.readFileSync)(variant.filePath, 'utf-8')}`);
332
+ const header = `// No mode discriminator was given — definitions for all ${String(pathResult.modeVariants.length)} modes of '${nodeId}' follow (pass \`mode\` to fetch a single one).`;
333
+ const actualVersion = pathResult.modeVariants[0].filePath.match(/\/(v\d+)(?:\/|\.ts)/)?.[1];
334
+ return { nodeId, version: actualVersion, content: [header, ...sections].join('\n\n') };
365
335
  }
366
336
  catch (error) {
367
337
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
@@ -372,37 +342,57 @@
372
342
  };
373
343
  }
374
344
  }
375
- function getNodeTypes(nodeIds, options = {}) {
376
- const { nodeDefinitionDirs } = options;
377
- const results = [];
378
- const errors = [];
379
- for (const nodeRequest of nodeIds) {
380
- const nodeId = typeof nodeRequest === 'string' ? nodeRequest : nodeRequest.nodeId;
381
- const version = typeof nodeRequest === 'string' ? undefined : nodeRequest.version;
382
- const discriminators = typeof nodeRequest === 'string'
383
- ? undefined
384
- : {
385
- resource: nodeRequest.resource,
386
- operation: nodeRequest.operation,
387
- mode: nodeRequest.mode,
388
- };
389
- const result = getNodeTypeDefinition(nodeId, version, nodeDefinitionDirs, discriminators);
390
- if (result.error) {
391
- errors.push(result.error);
392
- }
393
- else {
394
- const versionLabel = result.version ? ` (${result.version})` : '';
395
- results.push(`## ${nodeId}${versionLabel}\n\n\`\`\`typescript\n${result.content}\n\`\`\``);
396
- }
397
- }
398
- let response = '';
399
- if (results.length > 0) {
400
- response += `# TypeScript Type Definitions\n\n${results.join('\n\n---\n\n')}`;
345
+ if (!pathResult.filePath) {
346
+ return {
347
+ nodeId,
348
+ content: '',
349
+ error: `Node type '${nodeId}' not found. Use search_node to find the correct node ID.`,
350
+ };
351
+ }
352
+ try {
353
+ const content = (0, node_fs_1.readFileSync)(pathResult.filePath, 'utf-8');
354
+ const actualVersion = pathResult.filePath.match(/\/(v\d+)(?:\/|\.ts)/)?.[1];
355
+ return { nodeId, version: actualVersion, content };
356
+ }
357
+ catch (error) {
358
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
359
+ return {
360
+ nodeId,
361
+ content: '',
362
+ error: `Error reading node definition for '${nodeId}': ${errorMessage}`,
363
+ };
364
+ }
365
+ }
366
+ function getNodeTypes(nodeIds, options = {}) {
367
+ const { nodeDefinitionDirs } = options;
368
+ const results = [];
369
+ const errors = [];
370
+ for (const nodeRequest of nodeIds) {
371
+ const nodeId = typeof nodeRequest === 'string' ? nodeRequest : nodeRequest.nodeId;
372
+ const version = typeof nodeRequest === 'string' ? undefined : nodeRequest.version;
373
+ const discriminators = typeof nodeRequest === 'string'
374
+ ? undefined
375
+ : {
376
+ resource: nodeRequest.resource,
377
+ operation: nodeRequest.operation,
378
+ mode: nodeRequest.mode,
379
+ };
380
+ const result = getNodeTypeDefinition(nodeId, version, nodeDefinitionDirs, discriminators);
381
+ if (result.error) {
382
+ errors.push(result.error);
401
383
  }
402
- if (errors.length > 0) {
403
- response += `\n\n# Errors\n\n${errors.join('\n')}`;
384
+ else {
385
+ const versionLabel = result.version ? ` (${result.version})` : '';
386
+ results.push(`## ${nodeId}${versionLabel}\n\n\`\`\`typescript\n${result.content}\n\`\`\``);
404
387
  }
405
- return response;
406
388
  }
407
- });
389
+ let response = '';
390
+ if (results.length > 0) {
391
+ response += `# TypeScript Type Definitions\n\n${results.join('\n\n---\n\n')}`;
392
+ }
393
+ if (errors.length > 0) {
394
+ response += `\n\n# Errors\n\n${errors.join('\n')}`;
395
+ }
396
+ return response;
397
+ }
408
398
  //# sourceMappingURL=get.js.map