@n8n/ai-utilities 0.23.3 → 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.
- package/dist/cjs/adapters/langchain-chat-model.js +174 -184
- package/dist/cjs/adapters/langchain-chat-model.js.map +1 -1
- package/dist/cjs/adapters/langchain-history.js +23 -33
- package/dist/cjs/adapters/langchain-history.js.map +1 -1
- package/dist/cjs/adapters/langchain-memory.js +32 -42
- package/dist/cjs/adapters/langchain-memory.js.map +1 -1
- package/dist/cjs/agent-config/config-normalization.d.ts +11 -0
- package/dist/cjs/agent-config/config-normalization.js +134 -0
- package/dist/cjs/agent-config/config-normalization.js.map +1 -0
- package/dist/cjs/agent-config/from-ai-node-parameters.d.ts +7 -0
- package/dist/cjs/agent-config/from-ai-node-parameters.js +43 -0
- package/dist/cjs/agent-config/from-ai-node-parameters.js.map +1 -0
- package/dist/cjs/agent-config/index.d.ts +3 -0
- package/dist/cjs/agent-config/index.js +17 -0
- package/dist/cjs/agent-config/index.js.map +1 -0
- package/dist/cjs/agent-config/model-id.d.ts +5 -0
- package/dist/cjs/agent-config/model-id.js +16 -0
- package/dist/cjs/agent-config/model-id.js.map +1 -0
- package/dist/cjs/agent-config/native-web-search-provider-tools.d.ts +7 -0
- package/dist/cjs/agent-config/native-web-search-provider-tools.js +55 -0
- package/dist/cjs/agent-config/native-web-search-provider-tools.js.map +1 -0
- package/dist/cjs/ai-node-sdk-version.js +4 -14
- package/dist/cjs/ai-node-sdk-version.js.map +1 -1
- package/dist/cjs/chat-model/base.js +21 -31
- package/dist/cjs/chat-model/base.js.map +1 -1
- package/dist/cjs/converters/message.js +308 -318
- package/dist/cjs/converters/message.js.map +1 -1
- package/dist/cjs/converters/tool.js +50 -60
- package/dist/cjs/converters/tool.js.map +1 -1
- package/dist/cjs/guards.js +26 -36
- package/dist/cjs/guards.js.map +1 -1
- package/dist/cjs/index.js +99 -108
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/memory/base-chat-history.js +9 -19
- package/dist/cjs/memory/base-chat-history.js.map +1 -1
- package/dist/cjs/memory/base-chat-memory.js +6 -16
- package/dist/cjs/memory/base-chat-memory.js.map +1 -1
- package/dist/cjs/memory/windowed-chat-memory.js +33 -43
- package/dist/cjs/memory/windowed-chat-memory.js.map +1 -1
- package/dist/cjs/model-discovery/index.js +61 -71
- package/dist/cjs/model-discovery/index.js.map +1 -1
- package/dist/cjs/model-discovery/providers/anthropic.js +12 -22
- package/dist/cjs/model-discovery/providers/anthropic.js.map +1 -1
- package/dist/cjs/model-discovery/providers/cohere.js +12 -22
- package/dist/cjs/model-discovery/providers/cohere.js.map +1 -1
- package/dist/cjs/model-discovery/providers/deepseek.js +5 -15
- package/dist/cjs/model-discovery/providers/deepseek.js.map +1 -1
- package/dist/cjs/model-discovery/providers/google.js +15 -25
- package/dist/cjs/model-discovery/providers/google.js.map +1 -1
- package/dist/cjs/model-discovery/providers/groq.js +9 -19
- package/dist/cjs/model-discovery/providers/groq.js.map +1 -1
- package/dist/cjs/model-discovery/providers/mistral.js +11 -21
- package/dist/cjs/model-discovery/providers/mistral.js.map +1 -1
- package/dist/cjs/model-discovery/providers/nvidia.js +21 -31
- package/dist/cjs/model-discovery/providers/nvidia.js.map +1 -1
- package/dist/cjs/model-discovery/providers/openai.js +31 -41
- package/dist/cjs/model-discovery/providers/openai.js.map +1 -1
- package/dist/cjs/model-discovery/providers/openrouter.js +5 -15
- package/dist/cjs/model-discovery/providers/openrouter.js.map +1 -1
- package/dist/cjs/model-discovery/providers/vercel.js +5 -15
- package/dist/cjs/model-discovery/providers/vercel.js.map +1 -1
- package/dist/cjs/model-discovery/providers/xai.js +5 -15
- package/dist/cjs/model-discovery/providers/xai.js.map +1 -1
- package/dist/cjs/model-discovery/request.js +40 -50
- package/dist/cjs/model-discovery/request.js.map +1 -1
- package/dist/cjs/model-discovery/types.js +2 -12
- package/dist/cjs/node-catalog/discriminator-utils.js +75 -85
- package/dist/cjs/node-catalog/discriminator-utils.js.map +1 -1
- package/dist/cjs/node-catalog/dynamic-node-parameters.js +169 -179
- package/dist/cjs/node-catalog/dynamic-node-parameters.js.map +1 -1
- package/dist/cjs/node-catalog/get.js +349 -359
- package/dist/cjs/node-catalog/get.js.map +1 -1
- package/dist/cjs/node-catalog/index.js +42 -52
- package/dist/cjs/node-catalog/index.js.map +1 -1
- package/dist/cjs/node-catalog/lean-node-type.js +46 -56
- package/dist/cjs/node-catalog/lean-node-type.js.map +1 -1
- package/dist/cjs/node-catalog/node-type-parser.js +61 -71
- package/dist/cjs/node-catalog/node-type-parser.js.map +1 -1
- package/dist/cjs/node-catalog/resource-operation-extractor.js +133 -143
- package/dist/cjs/node-catalog/resource-operation-extractor.js.map +1 -1
- package/dist/cjs/node-catalog/search-engine.js +285 -295
- package/dist/cjs/node-catalog/search-engine.js.map +1 -1
- package/dist/cjs/node-catalog/search.js +280 -290
- package/dist/cjs/node-catalog/search.js.map +1 -1
- package/dist/cjs/node-catalog/suggested-nodes-data.js +235 -245
- package/dist/cjs/node-catalog/suggested-nodes-data.js.map +1 -1
- package/dist/cjs/node-catalog/suggested.js +63 -73
- package/dist/cjs/node-catalog/suggested.js.map +1 -1
- package/dist/cjs/node-catalog/types.js +2 -12
- package/dist/cjs/suppliers/supplyMemory.js +13 -23
- package/dist/cjs/suppliers/supplyMemory.js.map +1 -1
- package/dist/cjs/suppliers/supplyModel.js +72 -82
- package/dist/cjs/suppliers/supplyModel.js.map +1 -1
- package/dist/cjs/typecheck.tsbuildinfo +1 -1
- package/dist/cjs/types/chat-model.js +2 -12
- package/dist/cjs/types/json.js +2 -12
- package/dist/cjs/types/memory.js +2 -12
- package/dist/cjs/types/message.js +2 -12
- package/dist/cjs/types/openai.js +2 -12
- package/dist/cjs/types/output.js +2 -12
- package/dist/cjs/types/tool.js +2 -12
- package/dist/cjs/utils/embeddings-input-validation.js +24 -34
- package/dist/cjs/utils/embeddings-input-validation.js.map +1 -1
- package/dist/cjs/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js +27 -37
- package/dist/cjs/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js.map +1 -1
- package/dist/cjs/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.d.ts +1 -1
- package/dist/cjs/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js +23 -33
- package/dist/cjs/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js.map +1 -1
- package/dist/cjs/utils/follow-redirects.js +38 -48
- package/dist/cjs/utils/follow-redirects.js.map +1 -1
- package/dist/cjs/utils/fromai-helpers.js +21 -31
- package/dist/cjs/utils/fromai-helpers.js.map +1 -1
- package/dist/cjs/utils/fromai-tool-factory.js +18 -28
- package/dist/cjs/utils/fromai-tool-factory.js.map +1 -1
- package/dist/cjs/utils/helpers.js +44 -54
- package/dist/cjs/utils/helpers.js.map +1 -1
- package/dist/cjs/utils/http-proxy-agent.js +38 -48
- package/dist/cjs/utils/http-proxy-agent.js.map +1 -1
- package/dist/cjs/utils/lazy-import.d.ts +1 -0
- package/dist/cjs/utils/lazy-import.js +7 -0
- package/dist/cjs/utils/lazy-import.js.map +1 -0
- package/dist/cjs/utils/loaders/n8n-pdf-loader.js +50 -94
- package/dist/cjs/utils/loaders/n8n-pdf-loader.js.map +1 -1
- package/dist/cjs/utils/log-ai-event.js +10 -20
- package/dist/cjs/utils/log-ai-event.js.map +1 -1
- package/dist/cjs/utils/log-wrapper.d.ts +1 -1
- package/dist/cjs/utils/log-wrapper.js +313 -323
- package/dist/cjs/utils/log-wrapper.js.map +1 -1
- package/dist/cjs/utils/n8n-binary-loader.js +143 -153
- package/dist/cjs/utils/n8n-binary-loader.js.map +1 -1
- package/dist/cjs/utils/n8n-json-loader.js +57 -67
- package/dist/cjs/utils/n8n-json-loader.js.map +1 -1
- package/dist/cjs/utils/n8n-llm-tracing.js +164 -174
- package/dist/cjs/utils/n8n-llm-tracing.js.map +1 -1
- package/dist/cjs/utils/redact-headers.js +42 -52
- package/dist/cjs/utils/redact-headers.js.map +1 -1
- package/dist/cjs/utils/shared-fields.js +137 -147
- package/dist/cjs/utils/shared-fields.js.map +1 -1
- package/dist/cjs/utils/sse.js +83 -93
- package/dist/cjs/utils/sse.js.map +1 -1
- package/dist/cjs/utils/text-editor.js +274 -284
- package/dist/cjs/utils/text-editor.js.map +1 -1
- package/dist/cjs/utils/tokenizer/tiktoken.js +38 -48
- package/dist/cjs/utils/tokenizer/tiktoken.js.map +1 -1
- package/dist/cjs/utils/tokenizer/token-estimator.js +86 -96
- package/dist/cjs/utils/tokenizer/token-estimator.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/MemoryCalculator.js +43 -53
- package/dist/cjs/utils/vector-store/MemoryManager/MemoryCalculator.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/MemoryVectorStoreManager.js +154 -164
- package/dist/cjs/utils/vector-store/MemoryManager/MemoryVectorStoreManager.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/StoreCleanupService.js +82 -92
- package/dist/cjs/utils/vector-store/MemoryManager/StoreCleanupService.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/config.js +34 -44
- package/dist/cjs/utils/vector-store/MemoryManager/config.js.map +1 -1
- package/dist/cjs/utils/vector-store/MemoryManager/types.js +2 -12
- package/dist/cjs/utils/vector-store/createVectorStoreNode/constants.js +44 -54
- package/dist/cjs/utils/vector-store/createVectorStoreNode/constants.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js +229 -229
- package/dist/cjs/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/index.js +8 -18
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/index.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/insertOperation.js +33 -43
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/insertOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/loadOperation.js +41 -51
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/loadOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.js +59 -69
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.js +58 -68
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.js +26 -36
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/updateOperation.js +34 -44
- package/dist/cjs/utils/vector-store/createVectorStoreNode/operations/updateOperation.js.map +1 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/types.js +2 -12
- package/dist/cjs/utils/vector-store/createVectorStoreNode/utils.d.ts +2 -1
- package/dist/cjs/utils/vector-store/createVectorStoreNode/utils.js +34 -29
- package/dist/cjs/utils/vector-store/createVectorStoreNode/utils.js.map +1 -1
- package/dist/cjs/utils/vector-store/processDocuments.js +37 -47
- package/dist/cjs/utils/vector-store/processDocuments.js.map +1 -1
- package/dist/cjs/utils/workflow-text-editor.js +50 -60
- package/dist/cjs/utils/workflow-text-editor.js.map +1 -1
- package/dist/cjs/web-search/brave-search.js +38 -48
- package/dist/cjs/web-search/brave-search.js.map +1 -1
- package/dist/cjs/web-search/index.js +7 -17
- package/dist/cjs/web-search/index.js.map +1 -1
- package/dist/cjs/web-search/searxng-search.js +35 -45
- package/dist/cjs/web-search/searxng-search.js.map +1 -1
- package/dist/cjs/web-search/types.js +2 -12
- package/dist/esm/adapters/langchain-chat-model.js.map +1 -1
- package/dist/esm/adapters/langchain-history.js.map +1 -1
- package/dist/esm/adapters/langchain-memory.js.map +1 -1
- package/dist/esm/agent-config/config-normalization.d.ts +11 -0
- package/dist/esm/agent-config/config-normalization.js +134 -0
- package/dist/esm/agent-config/config-normalization.js.map +1 -0
- package/dist/esm/agent-config/from-ai-node-parameters.d.ts +7 -0
- package/dist/esm/agent-config/from-ai-node-parameters.js +43 -0
- package/dist/esm/agent-config/from-ai-node-parameters.js.map +1 -0
- package/dist/esm/agent-config/index.d.ts +3 -0
- package/dist/esm/agent-config/index.js +17 -0
- package/dist/esm/agent-config/index.js.map +1 -0
- package/dist/esm/agent-config/model-id.d.ts +5 -0
- package/dist/esm/agent-config/model-id.js +16 -0
- package/dist/esm/agent-config/model-id.js.map +1 -0
- package/dist/esm/agent-config/native-web-search-provider-tools.d.ts +7 -0
- package/dist/esm/agent-config/native-web-search-provider-tools.js +55 -0
- package/dist/esm/agent-config/native-web-search-provider-tools.js.map +1 -0
- package/dist/esm/chat-model/base.js.map +1 -1
- package/dist/esm/converters/message.js.map +1 -1
- package/dist/esm/converters/tool.js.map +1 -1
- package/dist/esm/guards.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/memory/base-chat-history.js.map +1 -1
- package/dist/esm/memory/base-chat-memory.js.map +1 -1
- package/dist/esm/memory/windowed-chat-memory.js.map +1 -1
- package/dist/esm/model-discovery/index.js.map +1 -1
- package/dist/esm/model-discovery/providers/anthropic.js.map +1 -1
- package/dist/esm/model-discovery/providers/cohere.js.map +1 -1
- package/dist/esm/model-discovery/providers/google.js.map +1 -1
- package/dist/esm/model-discovery/providers/groq.js.map +1 -1
- package/dist/esm/model-discovery/providers/mistral.js.map +1 -1
- package/dist/esm/model-discovery/providers/nvidia.js.map +1 -1
- package/dist/esm/model-discovery/providers/openai.js.map +1 -1
- package/dist/esm/model-discovery/request.js.map +1 -1
- package/dist/esm/node-catalog/discriminator-utils.js.map +1 -1
- package/dist/esm/node-catalog/dynamic-node-parameters.js.map +1 -1
- package/dist/esm/node-catalog/get.js.map +1 -1
- package/dist/esm/node-catalog/lean-node-type.js.map +1 -1
- package/dist/esm/node-catalog/node-type-parser.js.map +1 -1
- package/dist/esm/node-catalog/resource-operation-extractor.js.map +1 -1
- package/dist/esm/node-catalog/search-engine.js.map +1 -1
- package/dist/esm/node-catalog/search.js.map +1 -1
- package/dist/esm/node-catalog/suggested-nodes-data.js.map +1 -1
- package/dist/esm/node-catalog/suggested.js.map +1 -1
- package/dist/esm/suppliers/supplyMemory.js.map +1 -1
- package/dist/esm/suppliers/supplyModel.js.map +1 -1
- package/dist/esm/typecheck.tsbuildinfo +1 -1
- package/dist/esm/utils/embeddings-input-validation.js.map +1 -1
- package/dist/esm/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.js.map +1 -1
- package/dist/esm/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.d.ts +1 -1
- package/dist/esm/utils/failed-attempt-handler/n8nLlmFailedAttemptHandler.js.map +1 -1
- package/dist/esm/utils/follow-redirects.js.map +1 -1
- package/dist/esm/utils/fromai-helpers.js.map +1 -1
- package/dist/esm/utils/fromai-tool-factory.js.map +1 -1
- package/dist/esm/utils/helpers.js.map +1 -1
- package/dist/esm/utils/http-proxy-agent.js.map +1 -1
- package/dist/esm/utils/lazy-import.d.ts +1 -0
- package/dist/esm/utils/lazy-import.js +7 -0
- package/dist/esm/utils/lazy-import.js.map +1 -0
- package/dist/esm/utils/loaders/n8n-pdf-loader.js +2 -35
- package/dist/esm/utils/loaders/n8n-pdf-loader.js.map +1 -1
- package/dist/esm/utils/log-ai-event.js.map +1 -1
- package/dist/esm/utils/log-wrapper.d.ts +1 -1
- package/dist/esm/utils/log-wrapper.js.map +1 -1
- package/dist/esm/utils/n8n-binary-loader.js.map +1 -1
- package/dist/esm/utils/n8n-json-loader.js.map +1 -1
- package/dist/esm/utils/n8n-llm-tracing.js.map +1 -1
- package/dist/esm/utils/redact-headers.js.map +1 -1
- package/dist/esm/utils/shared-fields.js.map +1 -1
- package/dist/esm/utils/sse.js.map +1 -1
- package/dist/esm/utils/text-editor.js.map +1 -1
- package/dist/esm/utils/tokenizer/tiktoken.js.map +1 -1
- package/dist/esm/utils/tokenizer/token-estimator.js.map +1 -1
- package/dist/esm/utils/vector-store/MemoryManager/MemoryCalculator.js.map +1 -1
- package/dist/esm/utils/vector-store/MemoryManager/MemoryVectorStoreManager.js.map +1 -1
- package/dist/esm/utils/vector-store/MemoryManager/StoreCleanupService.js.map +1 -1
- package/dist/esm/utils/vector-store/MemoryManager/config.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js +43 -33
- package/dist/esm/utils/vector-store/createVectorStoreNode/createVectorStoreNode.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/insertOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/loadOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/operations/updateOperation.js.map +1 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/utils.d.ts +2 -1
- package/dist/esm/utils/vector-store/createVectorStoreNode/utils.js +15 -0
- package/dist/esm/utils/vector-store/createVectorStoreNode/utils.js.map +1 -1
- package/dist/esm/utils/vector-store/processDocuments.js.map +1 -1
- package/dist/esm/utils/workflow-text-editor.js.map +1 -1
- package/dist/esm/web-search/brave-search.js.map +1 -1
- package/dist/esm/web-search/searxng-search.js.map +1 -1
- package/package.json +24 -9
|
@@ -1,367 +1,337 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
36
|
-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
48
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
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:
|
|
117
|
-
nodeName:
|
|
98
|
+
packageName: withoutPrefix.slice(0, dotIndex),
|
|
99
|
+
nodeName: withoutPrefix.slice(dotIndex + 1),
|
|
118
100
|
};
|
|
119
101
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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)(
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
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:
|
|
199
|
+
error: `Error: Invalid operation '${discriminators.operation}' for resource '${discriminators.resource}'. Available: ${ops.join(', ')}`,
|
|
306
200
|
};
|
|
307
201
|
}
|
|
308
|
-
|
|
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
|
-
|
|
323
|
-
content: '',
|
|
324
|
-
error: errorMsg,
|
|
204
|
+
error: `Error: Could not read operations for resource '${discriminators.resource}'`,
|
|
325
205
|
};
|
|
326
206
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
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
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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 (
|
|
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
|
|
363
|
-
const
|
|
364
|
-
|
|
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
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
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
|
-
|
|
403
|
-
|
|
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
|