mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-03-24 19:33:08 +00:00
Compare commits
1 Commits
v2.32.0
...
fix/memory
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
32f63c64a5 |
@@ -37,11 +37,9 @@ MCP_SERVER_HOST=localhost
|
|||||||
# Server mode: stdio (local) or http (remote)
|
# Server mode: stdio (local) or http (remote)
|
||||||
MCP_MODE=stdio
|
MCP_MODE=stdio
|
||||||
|
|
||||||
# DEPRECATED: USE_FIXED_HTTP is deprecated as of v2.31.8
|
# Use fixed HTTP implementation (recommended for stability)
|
||||||
# The fixed HTTP implementation does not support SSE streaming required by
|
# Set to true to bypass StreamableHTTPServerTransport issues
|
||||||
# clients like OpenAI Codex. Use the default SingleSessionHTTPServer instead.
|
USE_FIXED_HTTP=true
|
||||||
# See: https://github.com/czlonkowski/n8n-mcp/issues/524
|
|
||||||
# USE_FIXED_HTTP=true # DO NOT USE - deprecated
|
|
||||||
|
|
||||||
# HTTP Server Configuration (only used when MCP_MODE=http)
|
# HTTP Server Configuration (only used when MCP_MODE=http)
|
||||||
PORT=3000
|
PORT=3000
|
||||||
|
|||||||
6
.github/workflows/release.yml
vendored
6
.github/workflows/release.yml
vendored
@@ -311,14 +311,14 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
cache: 'npm'
|
cache: 'npm'
|
||||||
registry-url: 'https://registry.npmjs.org'
|
registry-url: 'https://registry.npmjs.org'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
||||||
@@ -396,7 +396,7 @@ jobs:
|
|||||||
npm publish --access public
|
npm publish --access public
|
||||||
env:
|
env:
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|
||||||
- name: Clean up
|
- name: Clean up
|
||||||
if: always()
|
if: always()
|
||||||
run: rm -rf npm-publish-temp
|
run: rm -rf npm-publish-temp
|
||||||
|
|||||||
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@@ -40,7 +40,7 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 15 # Increased from 10 to accommodate larger database with community nodes
|
timeout-minutes: 10 # Add a 10-minute timeout to prevent hanging
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
|||||||
6512
CHANGELOG.md
6512
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@@ -74,8 +74,7 @@ ENV AUTH_TOKEN="REPLACE_THIS_AUTH_TOKEN_32_CHARS_MIN_abcdefgh"
|
|||||||
ENV NODE_ENV=production
|
ENV NODE_ENV=production
|
||||||
ENV IS_DOCKER=true
|
ENV IS_DOCKER=true
|
||||||
ENV MCP_MODE=http
|
ENV MCP_MODE=http
|
||||||
# NOTE: USE_FIXED_HTTP is deprecated. SingleSessionHTTPServer is now the default.
|
ENV USE_FIXED_HTTP=true
|
||||||
# See: https://github.com/czlonkowski/n8n-mcp/issues/524
|
|
||||||
ENV LOG_LEVEL=info
|
ENV LOG_LEVEL=info
|
||||||
ENV TRUST_PROXY=1
|
ENV TRUST_PROXY=1
|
||||||
ENV HOST=0.0.0.0
|
ENV HOST=0.0.0.0
|
||||||
|
|||||||
36
README.md
36
README.md
@@ -5,24 +5,23 @@
|
|||||||
[](https://www.npmjs.com/package/n8n-mcp)
|
[](https://www.npmjs.com/package/n8n-mcp)
|
||||||
[](https://codecov.io/gh/czlonkowski/n8n-mcp)
|
[](https://codecov.io/gh/czlonkowski/n8n-mcp)
|
||||||
[](https://github.com/czlonkowski/n8n-mcp/actions)
|
[](https://github.com/czlonkowski/n8n-mcp/actions)
|
||||||
[](https://github.com/n8n-io/n8n)
|
[](https://github.com/n8n-io/n8n)
|
||||||
[](https://github.com/czlonkowski/n8n-mcp/pkgs/container/n8n-mcp)
|
[](https://github.com/czlonkowski/n8n-mcp/pkgs/container/n8n-mcp)
|
||||||
[](https://railway.com/deploy/n8n-mcp?referralCode=n8n-mcp)
|
[](https://railway.com/deploy/n8n-mcp?referralCode=n8n-mcp)
|
||||||
|
|
||||||
A Model Context Protocol (MCP) server that provides AI assistants with comprehensive access to n8n node documentation, properties, and operations. Deploy in minutes to give Claude and other AI assistants deep knowledge about n8n's 1,084 workflow automation nodes (537 core + 547 community).
|
A Model Context Protocol (MCP) server that provides AI assistants with comprehensive access to n8n node documentation, properties, and operations. Deploy in minutes to give Claude and other AI assistants deep knowledge about n8n's 545 workflow automation nodes.
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
n8n-MCP serves as a bridge between n8n's workflow automation platform and AI models, enabling them to understand and work with n8n nodes effectively. It provides structured access to:
|
n8n-MCP serves as a bridge between n8n's workflow automation platform and AI models, enabling them to understand and work with n8n nodes effectively. It provides structured access to:
|
||||||
|
|
||||||
- 📚 **1,084 n8n nodes** - 537 core nodes + 547 community nodes (301 verified)
|
- 📚 **543 n8n nodes** from both n8n-nodes-base and @n8n/n8n-nodes-langchain
|
||||||
- 🔧 **Node properties** - 99% coverage with detailed schemas
|
- 🔧 **Node properties** - 99% coverage with detailed schemas
|
||||||
- ⚡ **Node operations** - 63.6% coverage of available actions
|
- ⚡ **Node operations** - 63.6% coverage of available actions
|
||||||
- 📄 **Documentation** - 87% coverage from official n8n docs (including AI nodes)
|
- 📄 **Documentation** - 87% coverage from official n8n docs (including AI nodes)
|
||||||
- 🤖 **AI tools** - 265 AI-capable tool variants detected with full documentation
|
- 🤖 **AI tools** - 271 AI-capable nodes detected with full documentation
|
||||||
- 💡 **Real-world examples** - 2,646 pre-extracted configurations from popular templates
|
- 💡 **Real-world examples** - 2,646 pre-extracted configurations from popular templates
|
||||||
- 🎯 **Template library** - 2,709 workflow templates with 100% metadata coverage
|
- 🎯 **Template library** - 2,709 workflow templates with 100% metadata coverage
|
||||||
- 🌐 **Community nodes** - Search verified community integrations with `source` filter (NEW!)
|
|
||||||
|
|
||||||
|
|
||||||
## ⚠️ Important Safety Warning
|
## ⚠️ Important Safety Warning
|
||||||
@@ -941,7 +940,7 @@ Once connected, Claude can use these powerful tools:
|
|||||||
|
|
||||||
### Core Tools (7 tools)
|
### Core Tools (7 tools)
|
||||||
- **`tools_documentation`** - Get documentation for any MCP tool (START HERE!)
|
- **`tools_documentation`** - Get documentation for any MCP tool (START HERE!)
|
||||||
- **`search_nodes`** - Full-text search across all nodes. Use `source: 'community'|'verified'` for community nodes, `includeExamples: true` for configs
|
- **`search_nodes`** - Full-text search across all nodes. Use `includeExamples: true` for real-world configurations
|
||||||
- **`get_node`** - Unified node information tool with multiple modes (v2.26.0):
|
- **`get_node`** - Unified node information tool with multiple modes (v2.26.0):
|
||||||
- **Info mode** (default): `detail: 'minimal'|'standard'|'full'`, `includeExamples: true`
|
- **Info mode** (default): `detail: 'minimal'|'standard'|'full'`, `includeExamples: true`
|
||||||
- **Docs mode**: `mode: 'docs'` - Human-readable markdown documentation
|
- **Docs mode**: `mode: 'docs'` - Human-readable markdown documentation
|
||||||
@@ -1025,18 +1024,6 @@ search_nodes({
|
|||||||
includeExamples: true // Returns top 2 configs per node
|
includeExamples: true // Returns top 2 configs per node
|
||||||
})
|
})
|
||||||
|
|
||||||
// Search community nodes only
|
|
||||||
search_nodes({
|
|
||||||
query: "scraping",
|
|
||||||
source: "community" // Options: all, core, community, verified
|
|
||||||
})
|
|
||||||
|
|
||||||
// Search verified community nodes
|
|
||||||
search_nodes({
|
|
||||||
query: "pdf",
|
|
||||||
source: "verified" // Only verified community integrations
|
|
||||||
})
|
|
||||||
|
|
||||||
// Validate node configuration
|
// Validate node configuration
|
||||||
validate_node({
|
validate_node({
|
||||||
nodeType: "nodes-base.httpRequest",
|
nodeType: "nodes-base.httpRequest",
|
||||||
@@ -1134,18 +1121,17 @@ npm run dev:http # HTTP dev mode
|
|||||||
|
|
||||||
## 📊 Metrics & Coverage
|
## 📊 Metrics & Coverage
|
||||||
|
|
||||||
Current database coverage (n8n v2.2.3):
|
Current database coverage (n8n v1.117.2):
|
||||||
|
|
||||||
- ✅ **1,084 total nodes** - 537 core + 547 community
|
- ✅ **541/541** nodes loaded (100%)
|
||||||
- ✅ **301 verified** community nodes from n8n Strapi API
|
- ✅ **541** nodes with properties (100%)
|
||||||
- ✅ **246 popular** npm community packages indexed
|
- ✅ **470** nodes with documentation (87%)
|
||||||
- ✅ **470** nodes with documentation (87% core coverage)
|
- ✅ **271** AI-capable tools detected
|
||||||
- ✅ **265** AI-capable tool variants detected
|
|
||||||
- ✅ **2,646** pre-extracted template configurations
|
- ✅ **2,646** pre-extracted template configurations
|
||||||
- ✅ **2,709** workflow templates available (100% metadata coverage)
|
- ✅ **2,709** workflow templates available (100% metadata coverage)
|
||||||
- ✅ **AI Agent & LangChain nodes** fully documented
|
- ✅ **AI Agent & LangChain nodes** fully documented
|
||||||
- ⚡ **Average response time**: ~12ms
|
- ⚡ **Average response time**: ~12ms
|
||||||
- 💾 **Database size**: ~70MB (includes templates and community nodes)
|
- 💾 **Database size**: ~68MB (includes templates with metadata)
|
||||||
|
|
||||||
## 🔄 Recent Updates
|
## 🔄 Recent Updates
|
||||||
|
|
||||||
|
|||||||
BIN
data/nodes.db
BIN
data/nodes.db
Binary file not shown.
4
dist/database/node-repository.d.ts
vendored
4
dist/database/node-repository.d.ts
vendored
@@ -15,10 +15,6 @@ export declare class NodeRepository {
|
|||||||
getAllNodes(limit?: number): any[];
|
getAllNodes(limit?: number): any[];
|
||||||
getNodeCount(): number;
|
getNodeCount(): number;
|
||||||
getAIToolNodes(): any[];
|
getAIToolNodes(): any[];
|
||||||
getToolVariant(baseNodeType: string): any | null;
|
|
||||||
getBaseNodeForToolVariant(toolNodeType: string): any | null;
|
|
||||||
getToolVariants(): any[];
|
|
||||||
getToolVariantCount(): number;
|
|
||||||
getNodesByPackage(packageName: string): any[];
|
getNodesByPackage(packageName: string): any[];
|
||||||
searchNodeProperties(nodeType: string, query: string, maxResults?: number): any[];
|
searchNodeProperties(nodeType: string, query: string, maxResults?: number): any[];
|
||||||
private parseNodeRow;
|
private parseNodeRow;
|
||||||
|
|||||||
2
dist/database/node-repository.d.ts.map
vendored
2
dist/database/node-repository.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"node-repository.d.ts","sourceRoot":"","sources":["../../src/database/node-repository.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"node-repository.d.ts","sourceRoot":"","sources":["../../src/database/node-repository.ts"],"names":[],"mappings":"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"}
|
||||||
44
dist/database/node-repository.js
vendored
44
dist/database/node-repository.js
vendored
@@ -16,13 +16,12 @@ class NodeRepository {
|
|||||||
INSERT OR REPLACE INTO nodes (
|
INSERT OR REPLACE INTO nodes (
|
||||||
node_type, package_name, display_name, description,
|
node_type, package_name, display_name, description,
|
||||||
category, development_style, is_ai_tool, is_trigger,
|
category, development_style, is_ai_tool, is_trigger,
|
||||||
is_webhook, is_versioned, is_tool_variant, tool_variant_of,
|
is_webhook, is_versioned, version, documentation,
|
||||||
has_tool_variant, version, documentation,
|
|
||||||
properties_schema, operations, credentials_required,
|
properties_schema, operations, credentials_required,
|
||||||
outputs, output_names
|
outputs, output_names
|
||||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
`);
|
`);
|
||||||
stmt.run(node.nodeType, node.packageName, node.displayName, node.description, node.category, node.style, node.isAITool ? 1 : 0, node.isTrigger ? 1 : 0, node.isWebhook ? 1 : 0, node.isVersioned ? 1 : 0, node.isToolVariant ? 1 : 0, node.toolVariantOf || null, node.hasToolVariant ? 1 : 0, node.version, node.documentation || null, JSON.stringify(node.properties, null, 2), JSON.stringify(node.operations, null, 2), JSON.stringify(node.credentials, null, 2), node.outputs ? JSON.stringify(node.outputs, null, 2) : null, node.outputNames ? JSON.stringify(node.outputNames, null, 2) : null);
|
stmt.run(node.nodeType, node.packageName, node.displayName, node.description, node.category, node.style, node.isAITool ? 1 : 0, node.isTrigger ? 1 : 0, node.isWebhook ? 1 : 0, node.isVersioned ? 1 : 0, node.version, node.documentation || null, JSON.stringify(node.properties, null, 2), JSON.stringify(node.operations, null, 2), JSON.stringify(node.credentials, null, 2), node.outputs ? JSON.stringify(node.outputs, null, 2) : null, node.outputNames ? JSON.stringify(node.outputNames, null, 2) : null);
|
||||||
}
|
}
|
||||||
getNode(nodeType) {
|
getNode(nodeType) {
|
||||||
const normalizedType = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(nodeType);
|
const normalizedType = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(nodeType);
|
||||||
@@ -123,40 +122,6 @@ class NodeRepository {
|
|||||||
getAIToolNodes() {
|
getAIToolNodes() {
|
||||||
return this.getAITools();
|
return this.getAITools();
|
||||||
}
|
}
|
||||||
getToolVariant(baseNodeType) {
|
|
||||||
if (!baseNodeType || typeof baseNodeType !== 'string' || !baseNodeType.includes('.')) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
const toolNodeType = `${baseNodeType}Tool`;
|
|
||||||
return this.getNode(toolNodeType);
|
|
||||||
}
|
|
||||||
getBaseNodeForToolVariant(toolNodeType) {
|
|
||||||
const row = this.db.prepare(`
|
|
||||||
SELECT tool_variant_of FROM nodes WHERE node_type = ?
|
|
||||||
`).get(toolNodeType);
|
|
||||||
if (!row?.tool_variant_of)
|
|
||||||
return null;
|
|
||||||
return this.getNode(row.tool_variant_of);
|
|
||||||
}
|
|
||||||
getToolVariants() {
|
|
||||||
const rows = this.db.prepare(`
|
|
||||||
SELECT node_type, display_name, description, package_name, tool_variant_of
|
|
||||||
FROM nodes
|
|
||||||
WHERE is_tool_variant = 1
|
|
||||||
ORDER BY display_name
|
|
||||||
`).all();
|
|
||||||
return rows.map(row => ({
|
|
||||||
nodeType: row.node_type,
|
|
||||||
displayName: row.display_name,
|
|
||||||
description: row.description,
|
|
||||||
package: row.package_name,
|
|
||||||
toolVariantOf: row.tool_variant_of
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
getToolVariantCount() {
|
|
||||||
const result = this.db.prepare('SELECT COUNT(*) as count FROM nodes WHERE is_tool_variant = 1').get();
|
|
||||||
return result.count;
|
|
||||||
}
|
|
||||||
getNodesByPackage(packageName) {
|
getNodesByPackage(packageName) {
|
||||||
const rows = this.db.prepare(`
|
const rows = this.db.prepare(`
|
||||||
SELECT * FROM nodes WHERE package_name = ?
|
SELECT * FROM nodes WHERE package_name = ?
|
||||||
@@ -205,9 +170,6 @@ class NodeRepository {
|
|||||||
isTrigger: Number(row.is_trigger) === 1,
|
isTrigger: Number(row.is_trigger) === 1,
|
||||||
isWebhook: Number(row.is_webhook) === 1,
|
isWebhook: Number(row.is_webhook) === 1,
|
||||||
isVersioned: Number(row.is_versioned) === 1,
|
isVersioned: Number(row.is_versioned) === 1,
|
||||||
isToolVariant: Number(row.is_tool_variant) === 1,
|
|
||||||
toolVariantOf: row.tool_variant_of || null,
|
|
||||||
hasToolVariant: Number(row.has_tool_variant) === 1,
|
|
||||||
version: row.version,
|
version: row.version,
|
||||||
properties: this.safeJsonParse(row.properties_schema, []),
|
properties: this.safeJsonParse(row.properties_schema, []),
|
||||||
operations: this.safeJsonParse(row.operations, []),
|
operations: this.safeJsonParse(row.operations, []),
|
||||||
|
|||||||
2
dist/database/node-repository.js.map
vendored
2
dist/database/node-repository.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/http-server-single-session.d.ts.map
vendored
2
dist/http-server-single-session.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"http-server-single-session.d.ts","sourceRoot":"","sources":["../src/http-server-single-session.ts"],"names":[],"mappings":";AAMA,OAAO,OAAO,MAAM,SAAS,CAAC;AAoB9B,OAAO,EAAE,eAAe,EAA2B,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAuErD,qBAAa,uBAAuB;IAElC,OAAO,CAAC,UAAU,CAA8D;IAChF,OAAO,CAAC,OAAO,CAA0D;IACzE,OAAO,CAAC,eAAe,CAAsE;IAC7F,OAAO,CAAC,eAAe,CAA4D;IACnF,OAAO,CAAC,kBAAkB,CAAyC;IACnE,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,YAAY,CAA+B;;IAcnD,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,sBAAsB;YAqChB,aAAa;IAuC3B,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,sBAAsB;IAkC9B,OAAO,CAAC,mBAAmB;YASb,oBAAoB;YAwBpB,oBAAoB;IAwBlC,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,mBAAmB;IAoDrB,aAAa,CACjB,GAAG,EAAE,OAAO,CAAC,OAAO,EACpB,GAAG,EAAE,OAAO,CAAC,QAAQ,EACrB,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,IAAI,CAAC;YAmOF,eAAe;IA8C7B,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,gBAAgB;IASlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgnBtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD/B,cAAc,IAAI;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;YAChB,GAAG,EAAE,MAAM,CAAC;YACZ,UAAU,EAAE,MAAM,EAAE,CAAC;SACtB,CAAC;KACH;IAmDM,kBAAkB,IAAI,YAAY,EAAE;IAoEpC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM;CAsG7D"}
|
{"version":3,"file":"http-server-single-session.d.ts","sourceRoot":"","sources":["../src/http-server-single-session.ts"],"names":[],"mappings":";AAMA,OAAO,OAAO,MAAM,SAAS,CAAC;AAoB9B,OAAO,EAAE,eAAe,EAA2B,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAuErD,qBAAa,uBAAuB;IAElC,OAAO,CAAC,UAAU,CAA8D;IAChF,OAAO,CAAC,OAAO,CAA0D;IACzE,OAAO,CAAC,eAAe,CAAsE;IAC7F,OAAO,CAAC,eAAe,CAA4D;IACnF,OAAO,CAAC,kBAAkB,CAAyC;IACnE,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,YAAY,CAA+B;;IAcnD,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,sBAAsB;YAqChB,aAAa;IAkC3B,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,sBAAsB;IAkC9B,OAAO,CAAC,mBAAmB;YASb,oBAAoB;YAwBpB,oBAAoB;IAwBlC,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,aAAa;IA2BrB,OAAO,CAAC,mBAAmB;IAoDrB,aAAa,CACjB,GAAG,EAAE,OAAO,CAAC,OAAO,EACpB,GAAG,EAAE,OAAO,CAAC,QAAQ,EACrB,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,IAAI,CAAC;YAmOF,eAAe;IA8C7B,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,gBAAgB;IASlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgnBtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD/B,cAAc,IAAI;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;YAChB,GAAG,EAAE,MAAM,CAAC;YACZ,UAAU,EAAE,MAAM,EAAE,CAAC;SACtB,CAAC;KACH;IAmDM,kBAAkB,IAAI,YAAY,EAAE;IAoEpC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM;CAsG7D"}
|
||||||
9
dist/http-server-single-session.js
vendored
9
dist/http-server-single-session.js
vendored
@@ -106,13 +106,8 @@ class SingleSessionHTTPServer {
|
|||||||
delete this.servers[sessionId];
|
delete this.servers[sessionId];
|
||||||
delete this.sessionMetadata[sessionId];
|
delete this.sessionMetadata[sessionId];
|
||||||
delete this.sessionContexts[sessionId];
|
delete this.sessionContexts[sessionId];
|
||||||
if (server && typeof server.close === 'function') {
|
if (server) {
|
||||||
try {
|
await server.close();
|
||||||
await server.close();
|
|
||||||
}
|
|
||||||
catch (serverError) {
|
|
||||||
logger_1.logger.warn('Error closing server', { sessionId, error: serverError });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (transport) {
|
if (transport) {
|
||||||
await transport.close();
|
await transport.close();
|
||||||
|
|||||||
2
dist/http-server-single-session.js.map
vendored
2
dist/http-server-single-session.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/mcp/handlers-n8n-manager.d.ts.map
vendored
2
dist/mcp/handlers-n8n-manager.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"handlers-n8n-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/handlers-n8n-manager.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"handlers-n8n-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/handlers-n8n-manager.ts"],"names":[],"mappings":"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"}
|
||||||
57
dist/mcp/handlers-n8n-manager.js
vendored
57
dist/mcp/handlers-n8n-manager.js
vendored
@@ -285,13 +285,8 @@ async function handleCreateWorkflow(args, context) {
|
|||||||
telemetry_1.telemetry.trackWorkflowCreation(workflow, true);
|
telemetry_1.telemetry.trackWorkflowCreation(workflow, true);
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
data: {
|
data: workflow,
|
||||||
id: workflow.id,
|
message: `Workflow "${workflow.name}" created successfully with ID: ${workflow.id}`
|
||||||
name: workflow.name,
|
|
||||||
active: workflow.active,
|
|
||||||
nodeCount: workflow.nodes?.length || 0
|
|
||||||
},
|
|
||||||
message: `Workflow "${workflow.name}" created successfully with ID: ${workflow.id}. Use n8n_get_workflow with mode 'structure' to verify current state.`
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
@@ -542,13 +537,8 @@ async function handleUpdateWorkflow(args, repository, context) {
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
data: {
|
data: workflow,
|
||||||
id: workflow.id,
|
message: `Workflow "${workflow.name}" updated successfully`
|
||||||
name: workflow.name,
|
|
||||||
active: workflow.active,
|
|
||||||
nodeCount: workflow.nodes?.length || 0
|
|
||||||
},
|
|
||||||
message: `Workflow "${workflow.name}" updated successfully. Use n8n_get_workflow with mode 'structure' to verify current state.`
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
@@ -604,12 +594,8 @@ async function handleDeleteWorkflow(args, context) {
|
|||||||
const deleted = await client.deleteWorkflow(id);
|
const deleted = await client.deleteWorkflow(id);
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
data: {
|
data: deleted,
|
||||||
id: deleted?.id || id,
|
message: `Workflow ${id} deleted successfully`
|
||||||
name: deleted?.name,
|
|
||||||
deleted: true
|
|
||||||
},
|
|
||||||
message: `Workflow "${deleted?.name || id}" deleted successfully.`
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
@@ -696,7 +682,7 @@ async function handleValidateWorkflow(args, repository, context) {
|
|||||||
try {
|
try {
|
||||||
const client = ensureApiConfigured(context);
|
const client = ensureApiConfigured(context);
|
||||||
const input = validateWorkflowSchema.parse(args);
|
const input = validateWorkflowSchema.parse(args);
|
||||||
const workflowResponse = await handleGetWorkflow({ id: input.id }, context);
|
const workflowResponse = await handleGetWorkflow({ id: input.id });
|
||||||
if (!workflowResponse.success) {
|
if (!workflowResponse.success) {
|
||||||
return workflowResponse;
|
return workflowResponse;
|
||||||
}
|
}
|
||||||
@@ -1024,18 +1010,14 @@ async function handleGetExecution(args, context) {
|
|||||||
const client = ensureApiConfigured(context);
|
const client = ensureApiConfigured(context);
|
||||||
const schema = zod_1.z.object({
|
const schema = zod_1.z.object({
|
||||||
id: zod_1.z.string(),
|
id: zod_1.z.string(),
|
||||||
mode: zod_1.z.enum(['preview', 'summary', 'filtered', 'full', 'error']).optional(),
|
mode: zod_1.z.enum(['preview', 'summary', 'filtered', 'full']).optional(),
|
||||||
nodeNames: zod_1.z.array(zod_1.z.string()).optional(),
|
nodeNames: zod_1.z.array(zod_1.z.string()).optional(),
|
||||||
itemsLimit: zod_1.z.number().optional(),
|
itemsLimit: zod_1.z.number().optional(),
|
||||||
includeInputData: zod_1.z.boolean().optional(),
|
includeInputData: zod_1.z.boolean().optional(),
|
||||||
includeData: zod_1.z.boolean().optional(),
|
includeData: zod_1.z.boolean().optional()
|
||||||
errorItemsLimit: zod_1.z.number().min(0).max(100).optional(),
|
|
||||||
includeStackTrace: zod_1.z.boolean().optional(),
|
|
||||||
includeExecutionPath: zod_1.z.boolean().optional(),
|
|
||||||
fetchWorkflow: zod_1.z.boolean().optional()
|
|
||||||
});
|
});
|
||||||
const params = schema.parse(args);
|
const params = schema.parse(args);
|
||||||
const { id, mode, nodeNames, itemsLimit, includeInputData, includeData, errorItemsLimit, includeStackTrace, includeExecutionPath, fetchWorkflow } = params;
|
const { id, mode, nodeNames, itemsLimit, includeInputData, includeData } = params;
|
||||||
let effectiveMode = mode;
|
let effectiveMode = mode;
|
||||||
if (!effectiveMode && includeData !== undefined) {
|
if (!effectiveMode && includeData !== undefined) {
|
||||||
effectiveMode = includeData ? 'summary' : undefined;
|
effectiveMode = includeData ? 'summary' : undefined;
|
||||||
@@ -1048,28 +1030,13 @@ async function handleGetExecution(args, context) {
|
|||||||
data: execution
|
data: execution
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
let workflow;
|
|
||||||
if (effectiveMode === 'error' && fetchWorkflow !== false && execution.workflowId) {
|
|
||||||
try {
|
|
||||||
workflow = await client.getWorkflow(execution.workflowId);
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
logger_1.logger.debug('Could not fetch workflow for error analysis', {
|
|
||||||
workflowId: execution.workflowId,
|
|
||||||
error: e instanceof Error ? e.message : 'Unknown error'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const filterOptions = {
|
const filterOptions = {
|
||||||
mode: effectiveMode,
|
mode: effectiveMode,
|
||||||
nodeNames,
|
nodeNames,
|
||||||
itemsLimit,
|
itemsLimit,
|
||||||
includeInputData,
|
includeInputData
|
||||||
errorItemsLimit,
|
|
||||||
includeStackTrace,
|
|
||||||
includeExecutionPath
|
|
||||||
};
|
};
|
||||||
const processedExecution = (0, execution_processor_1.processExecution)(execution, filterOptions, workflow);
|
const processedExecution = (0, execution_processor_1.processExecution)(execution, filterOptions);
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
data: processedExecution
|
data: processedExecution
|
||||||
|
|||||||
2
dist/mcp/handlers-n8n-manager.js.map
vendored
2
dist/mcp/handlers-n8n-manager.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/mcp/handlers-workflow-diff.d.ts.map
vendored
2
dist/mcp/handlers-workflow-diff.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"handlers-workflow-diff.d.ts","sourceRoot":"","sources":["../../src/mcp/handlers-workflow-diff.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAMnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AA0D7D,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,eAAe,CAAC,CA6V1B"}
|
{"version":3,"file":"handlers-workflow-diff.d.ts","sourceRoot":"","sources":["../../src/mcp/handlers-workflow-diff.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAMnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AA0D7D,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,cAAc,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,eAAe,CAAC,CA2V1B"}
|
||||||
14
dist/mcp/handlers-workflow-diff.js
vendored
14
dist/mcp/handlers-workflow-diff.js
vendored
@@ -329,15 +329,13 @@ async function handleUpdatePartialWorkflow(args, repository, context) {
|
|||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
data: {
|
data: finalWorkflow,
|
||||||
id: finalWorkflow.id,
|
message: `Workflow "${finalWorkflow.name}" updated successfully. Applied ${diffResult.operationsApplied} operations.${activationMessage}`,
|
||||||
name: finalWorkflow.name,
|
|
||||||
active: finalWorkflow.active,
|
|
||||||
nodeCount: finalWorkflow.nodes?.length || 0,
|
|
||||||
operationsApplied: diffResult.operationsApplied
|
|
||||||
},
|
|
||||||
message: `Workflow "${finalWorkflow.name}" updated successfully. Applied ${diffResult.operationsApplied} operations.${activationMessage} Use n8n_get_workflow with mode 'structure' to verify current state.`,
|
|
||||||
details: {
|
details: {
|
||||||
|
operationsApplied: diffResult.operationsApplied,
|
||||||
|
workflowId: finalWorkflow.id,
|
||||||
|
workflowName: finalWorkflow.name,
|
||||||
|
active: finalWorkflow.active,
|
||||||
applied: diffResult.applied,
|
applied: diffResult.applied,
|
||||||
failed: diffResult.failed,
|
failed: diffResult.failed,
|
||||||
errors: diffResult.errors,
|
errors: diffResult.errors,
|
||||||
|
|||||||
2
dist/mcp/handlers-workflow-diff.js.map
vendored
2
dist/mcp/handlers-workflow-diff.js.map
vendored
File diff suppressed because one or more lines are too long
1
dist/mcp/server.d.ts
vendored
1
dist/mcp/server.d.ts
vendored
@@ -60,7 +60,6 @@ export declare class N8NDocumentationMCPServer {
|
|||||||
private getNodeAsToolInfo;
|
private getNodeAsToolInfo;
|
||||||
private getOutputDescriptions;
|
private getOutputDescriptions;
|
||||||
private getCommonAIToolUseCases;
|
private getCommonAIToolUseCases;
|
||||||
private buildToolVariantGuidance;
|
|
||||||
private getAIToolExamples;
|
private getAIToolExamples;
|
||||||
private validateNodeMinimal;
|
private validateNodeMinimal;
|
||||||
private getToolsDocumentation;
|
private getToolsDocumentation;
|
||||||
|
|||||||
2
dist/mcp/server.d.ts.map
vendored
2
dist/mcp/server.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAgGnE,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAgC;IAC1C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,kBAAkB,CAA4B;gBAE1C,eAAe,CAAC,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,gBAAgB;IAiGvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA6Bd,kBAAkB;YAwClB,wBAAwB;IA0BtC,OAAO,CAAC,kBAAkB;YA6CZ,iBAAiB;IAa/B,OAAO,CAAC,eAAe,CAAkB;YAE3B,sBAAsB;IAgDpC,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,aAAa;IAoTrB,OAAO,CAAC,wBAAwB;IAoFhC,OAAO,CAAC,kBAAkB;IAqE1B,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,qBAAqB;YAgTf,SAAS;YA2DT,WAAW;YAkFX,WAAW;YAyCX,cAAc;YAyKd,gBAAgB;IAqD9B,OAAO,CAAC,mBAAmB;IAwE3B,OAAO,CAAC,eAAe;YAsBT,eAAe;IAqI7B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,uBAAuB;IA0D/B,OAAO,CAAC,iBAAiB;YAqFX,WAAW;YAgCX,oBAAoB;YA2EpB,qBAAqB;YAwDrB,iBAAiB;YAiKjB,OAAO;YAgDP,cAAc;YAwFd,iBAAiB;IAqC/B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,0BAA0B;IAgClC,OAAO,CAAC,4BAA4B;YAKtB,oBAAoB;IAsDlC,OAAO,CAAC,gBAAgB;YAiBV,SAAS;YA6CT,kBAAkB;YAqElB,uBAAuB;YAsDvB,iBAAiB;IAqE/B,OAAO,CAAC,qBAAqB;IA8C7B,OAAO,CAAC,uBAAuB;IA4D/B,OAAO,CAAC,wBAAwB;IAkChC,OAAO,CAAC,iBAAiB;YAoDX,mBAAmB;YAoEnB,qBAAqB;IAS7B,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAS9B,aAAa;YAcb,iBAAiB;YAoBjB,WAAW;YAwBX,eAAe;YAqBf,mBAAmB;YAwBnB,yBAAyB;IA4CvC,OAAO,CAAC,kBAAkB;YAiBZ,gBAAgB;YA6HhB,2BAA2B;YAiE3B,2BAA2B;IAyEnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BpB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAuBhC"}
|
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAsCA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAkFnE,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAgC;IAC1C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,kBAAkB,CAA4B;gBAE1C,eAAe,CAAC,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,gBAAgB;IA2FvE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAed,kBAAkB;YAwClB,wBAAwB;IA0BtC,OAAO,CAAC,kBAAkB;YA6CZ,iBAAiB;IAa/B,OAAO,CAAC,eAAe,CAAkB;YAE3B,sBAAsB;IAgDpC,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,aAAa;IAoTrB,OAAO,CAAC,wBAAwB;IAoFhC,OAAO,CAAC,kBAAkB;IAqE1B,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,qBAAqB;YAgTf,SAAS;YA2DT,WAAW;YA0EX,WAAW;YAyCX,cAAc;YAyKd,gBAAgB;IAqD9B,OAAO,CAAC,mBAAmB;IAwE3B,OAAO,CAAC,eAAe;YAsBT,eAAe;IAqI7B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,uBAAuB;IA0D/B,OAAO,CAAC,iBAAiB;YAqFX,WAAW;YAgCX,oBAAoB;YA2EpB,qBAAqB;YAwDrB,iBAAiB;YA2JjB,OAAO;YAgDP,cAAc;YAgFd,iBAAiB;IAqC/B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,eAAe;IAwCvB,OAAO,CAAC,kBAAkB;IAiC1B,OAAO,CAAC,aAAa;IAoCrB,OAAO,CAAC,0BAA0B;IAgClC,OAAO,CAAC,4BAA4B;YAKtB,oBAAoB;IAsDlC,OAAO,CAAC,gBAAgB;YAiBV,SAAS;YA6CT,kBAAkB;YA+DlB,uBAAuB;YAsDvB,iBAAiB;IAqE/B,OAAO,CAAC,qBAAqB;IA8C7B,OAAO,CAAC,uBAAuB;IAwD/B,OAAO,CAAC,iBAAiB;YAoDX,mBAAmB;YAkGnB,qBAAqB;IAS7B,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAS9B,aAAa;YAcb,iBAAiB;YAoBjB,WAAW;YAwBX,eAAe;YAqBf,mBAAmB;YAwBnB,yBAAyB;IA4CvC,OAAO,CAAC,kBAAkB;YAiBZ,gBAAgB;YA6HhB,2BAA2B;YAiE3B,2BAA2B;IAyEnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BpB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAuBhC"}
|
||||||
97
dist/mcp/server.js
vendored
97
dist/mcp/server.js
vendored
@@ -51,7 +51,6 @@ const node_repository_1 = require("../database/node-repository");
|
|||||||
const database_adapter_1 = require("../database/database-adapter");
|
const database_adapter_1 = require("../database/database-adapter");
|
||||||
const property_filter_1 = require("../services/property-filter");
|
const property_filter_1 = require("../services/property-filter");
|
||||||
const task_templates_1 = require("../services/task-templates");
|
const task_templates_1 = require("../services/task-templates");
|
||||||
const config_validator_1 = require("../services/config-validator");
|
|
||||||
const enhanced_config_validator_1 = require("../services/enhanced-config-validator");
|
const enhanced_config_validator_1 = require("../services/enhanced-config-validator");
|
||||||
const property_dependencies_1 = require("../services/property-dependencies");
|
const property_dependencies_1 = require("../services/property-dependencies");
|
||||||
const type_structure_service_1 = require("../services/type-structure-service");
|
const type_structure_service_1 = require("../services/type-structure-service");
|
||||||
@@ -151,17 +150,7 @@ class N8NDocumentationMCPServer {
|
|||||||
async close() {
|
async close() {
|
||||||
try {
|
try {
|
||||||
await this.server.close();
|
await this.server.close();
|
||||||
this.cache.destroy();
|
this.cache.clear();
|
||||||
if (this.db) {
|
|
||||||
try {
|
|
||||||
this.db.close();
|
|
||||||
}
|
|
||||||
catch (dbError) {
|
|
||||||
logger_1.logger.warn('Error closing database', {
|
|
||||||
error: dbError instanceof Error ? dbError.message : String(dbError)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.db = null;
|
this.db = null;
|
||||||
this.repository = null;
|
this.repository = null;
|
||||||
this.templateService = null;
|
this.templateService = null;
|
||||||
@@ -1026,17 +1015,12 @@ class N8NDocumentationMCPServer {
|
|||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const result = {
|
return {
|
||||||
...node,
|
...node,
|
||||||
workflowNodeType: (0, node_utils_1.getWorkflowNodeType)(node.package ?? 'n8n-nodes-base', node.nodeType),
|
workflowNodeType: (0, node_utils_1.getWorkflowNodeType)(node.package ?? 'n8n-nodes-base', node.nodeType),
|
||||||
aiToolCapabilities,
|
aiToolCapabilities,
|
||||||
outputs
|
outputs
|
||||||
};
|
};
|
||||||
const toolVariantInfo = this.buildToolVariantGuidance(node);
|
|
||||||
if (toolVariantInfo) {
|
|
||||||
result.toolVariantInfo = toolVariantInfo;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
async searchNodes(query, limit = 20, options) {
|
async searchNodes(query, limit = 20, options) {
|
||||||
await this.ensureInitialized();
|
await this.ensureInitialized();
|
||||||
@@ -1709,10 +1693,6 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|||||||
developmentStyle: node.developmentStyle ?? 'programmatic'
|
developmentStyle: node.developmentStyle ?? 'programmatic'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const toolVariantInfo = this.buildToolVariantGuidance(node);
|
|
||||||
if (toolVariantInfo) {
|
|
||||||
result.toolVariantInfo = toolVariantInfo;
|
|
||||||
}
|
|
||||||
if (includeExamples) {
|
if (includeExamples) {
|
||||||
try {
|
try {
|
||||||
const examples = this.db.prepare(`
|
const examples = this.db.prepare(`
|
||||||
@@ -1794,7 +1774,7 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|||||||
if (!node) {
|
if (!node) {
|
||||||
throw new Error(`Node ${nodeType} not found`);
|
throw new Error(`Node ${nodeType} not found`);
|
||||||
}
|
}
|
||||||
const result = {
|
return {
|
||||||
nodeType: node.nodeType,
|
nodeType: node.nodeType,
|
||||||
workflowNodeType: (0, node_utils_1.getWorkflowNodeType)(node.package ?? 'n8n-nodes-base', node.nodeType),
|
workflowNodeType: (0, node_utils_1.getWorkflowNodeType)(node.package ?? 'n8n-nodes-base', node.nodeType),
|
||||||
displayName: node.displayName,
|
displayName: node.displayName,
|
||||||
@@ -1805,11 +1785,6 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|||||||
isTrigger: node.isTrigger,
|
isTrigger: node.isTrigger,
|
||||||
isWebhook: node.isWebhook
|
isWebhook: node.isWebhook
|
||||||
};
|
};
|
||||||
const toolVariantInfo = this.buildToolVariantGuidance(node);
|
|
||||||
if (toolVariantInfo) {
|
|
||||||
result.toolVariantInfo = toolVariantInfo;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
case 'standard': {
|
case 'standard': {
|
||||||
const essentials = await this.getNodeEssentials(nodeType, includeExamples);
|
const essentials = await this.getNodeEssentials(nodeType, includeExamples);
|
||||||
@@ -2109,11 +2084,7 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|||||||
throw new Error(`Node ${nodeType} not found`);
|
throw new Error(`Node ${nodeType} not found`);
|
||||||
}
|
}
|
||||||
const properties = node.properties || [];
|
const properties = node.properties || [];
|
||||||
const configWithVersion = {
|
const validationResult = enhanced_config_validator_1.EnhancedConfigValidator.validateWithMode(node.nodeType, config, properties, mode, profile);
|
||||||
'@version': node.version || 1,
|
|
||||||
...config
|
|
||||||
};
|
|
||||||
const validationResult = enhanced_config_validator_1.EnhancedConfigValidator.validateWithMode(node.nodeType, configWithVersion, properties, mode, profile);
|
|
||||||
return {
|
return {
|
||||||
nodeType: node.nodeType,
|
nodeType: node.nodeType,
|
||||||
workflowNodeType: (0, node_utils_1.getWorkflowNodeType)(node.package, node.nodeType),
|
workflowNodeType: (0, node_utils_1.getWorkflowNodeType)(node.package, node.nodeType),
|
||||||
@@ -2311,32 +2282,6 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|||||||
'Extend AI agent capabilities'
|
'Extend AI agent capabilities'
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
buildToolVariantGuidance(node) {
|
|
||||||
const isToolVariant = !!node.isToolVariant;
|
|
||||||
const hasToolVariant = !!node.hasToolVariant;
|
|
||||||
const toolVariantOf = node.toolVariantOf;
|
|
||||||
if (!isToolVariant && !hasToolVariant) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
if (isToolVariant) {
|
|
||||||
return {
|
|
||||||
isToolVariant: true,
|
|
||||||
toolVariantOf,
|
|
||||||
hasToolVariant: false,
|
|
||||||
guidance: `This is the Tool variant for AI Agent integration. Use this node type when connecting to AI Agents. The base node is: ${toolVariantOf}`
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if (hasToolVariant && node.nodeType) {
|
|
||||||
const toolVariantNodeType = `${node.nodeType}Tool`;
|
|
||||||
return {
|
|
||||||
isToolVariant: false,
|
|
||||||
hasToolVariant: true,
|
|
||||||
toolVariantNodeType,
|
|
||||||
guidance: `To use this node with AI Agents, use the Tool variant: ${toolVariantNodeType}. The Tool variant has an additional 'toolDescription' property and outputs 'ai_tool' instead of 'main'.`
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
getAIToolExamples(nodeType) {
|
getAIToolExamples(nodeType) {
|
||||||
const exampleMap = {
|
const exampleMap = {
|
||||||
'nodes-base.slack': {
|
'nodes-base.slack': {
|
||||||
@@ -2407,16 +2352,40 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|||||||
throw new Error(`Node ${nodeType} not found`);
|
throw new Error(`Node ${nodeType} not found`);
|
||||||
}
|
}
|
||||||
const properties = node.properties || [];
|
const properties = node.properties || [];
|
||||||
const configWithVersion = {
|
const operationContext = {
|
||||||
'@version': node.version || 1,
|
resource: config?.resource,
|
||||||
...(config || {})
|
operation: config?.operation,
|
||||||
|
action: config?.action,
|
||||||
|
mode: config?.mode
|
||||||
};
|
};
|
||||||
const missingFields = [];
|
const missingFields = [];
|
||||||
for (const prop of properties) {
|
for (const prop of properties) {
|
||||||
if (!prop.required)
|
if (!prop.required)
|
||||||
continue;
|
continue;
|
||||||
if (prop.displayOptions && !config_validator_1.ConfigValidator.isPropertyVisible(prop, configWithVersion)) {
|
if (prop.displayOptions) {
|
||||||
continue;
|
let isVisible = true;
|
||||||
|
if (prop.displayOptions.show) {
|
||||||
|
for (const [key, values] of Object.entries(prop.displayOptions.show)) {
|
||||||
|
const configValue = config?.[key];
|
||||||
|
const expectedValues = Array.isArray(values) ? values : [values];
|
||||||
|
if (!expectedValues.includes(configValue)) {
|
||||||
|
isVisible = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (isVisible && prop.displayOptions.hide) {
|
||||||
|
for (const [key, values] of Object.entries(prop.displayOptions.hide)) {
|
||||||
|
const configValue = config?.[key];
|
||||||
|
const expectedValues = Array.isArray(values) ? values : [values];
|
||||||
|
if (expectedValues.includes(configValue)) {
|
||||||
|
isVisible = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!isVisible)
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (!config || !(prop.name in config)) {
|
if (!config || !(prop.name in config)) {
|
||||||
missingFields.push(prop.displayName || prop.name);
|
missingFields.push(prop.displayName || prop.name);
|
||||||
|
|||||||
2
dist/mcp/server.js.map
vendored
2
dist/mcp/server.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/mcp/tool-docs/templates/get-template.js
vendored
2
dist/mcp/tool-docs/templates/get-template.js
vendored
@@ -43,7 +43,7 @@ exports.getTemplateDoc = {
|
|||||||
- url: Link to template on n8n.io
|
- url: Link to template on n8n.io
|
||||||
- workflow: Complete workflow JSON with structure:
|
- workflow: Complete workflow JSON with structure:
|
||||||
- nodes: Array of node objects (id, name, type, typeVersion, position, parameters)
|
- nodes: Array of node objects (id, name, type, typeVersion, position, parameters)
|
||||||
- connections: Object mapping source node names to targets
|
- connections: Object mapping source nodes to targets
|
||||||
- settings: Workflow configuration (timezone, error handling, etc.)
|
- settings: Workflow configuration (timezone, error handling, etc.)
|
||||||
- usage: Instructions for using the workflow`,
|
- usage: Instructions for using the workflow`,
|
||||||
examples: [
|
examples: [
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ exports.n8nCreateWorkflowDoc = {
|
|||||||
parameters: {
|
parameters: {
|
||||||
name: { type: 'string', required: true, description: 'Workflow name' },
|
name: { type: 'string', required: true, description: 'Workflow name' },
|
||||||
nodes: { type: 'array', required: true, description: 'Array of nodes with id, name, type, typeVersion, position, parameters' },
|
nodes: { type: 'array', required: true, description: 'Array of nodes with id, name, type, typeVersion, position, parameters' },
|
||||||
connections: { type: 'object', required: true, description: 'Node connections. Keys are source node names (not IDs)' },
|
connections: { type: 'object', required: true, description: 'Node connections. Keys are source node IDs' },
|
||||||
settings: { type: 'object', description: 'Optional workflow settings (timezone, error handling, etc.)' }
|
settings: { type: 'object', description: 'Optional workflow settings (timezone, error handling, etc.)' }
|
||||||
},
|
},
|
||||||
returns: 'Minimal summary (id, name, active, nodeCount) for token efficiency. Use n8n_get_workflow with mode "structure" to verify current state if needed.',
|
returns: 'Created workflow object with id, name, nodes, connections, active status',
|
||||||
examples: [
|
examples: [
|
||||||
`// Basic webhook to Slack workflow
|
`// Basic webhook to Slack workflow
|
||||||
n8n_create_workflow({
|
n8n_create_workflow({
|
||||||
@@ -56,8 +56,8 @@ n8n_create_workflow({
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
connections: {
|
connections: {
|
||||||
"Webhook": {
|
"webhook_1": {
|
||||||
"main": [[{node: "Slack", type: "main", index: 0}]]
|
"main": [[{node: "slack_1", type: "main", index: 0}]]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})`,
|
})`,
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"n8n-create-workflow.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-create-workflow.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAsB;IACrD,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE;QACV,WAAW,EAAE,sGAAsG;QACnH,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;QAC/C,OAAO,EAAE,0EAA0E;QACnF,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE;YACJ,2BAA2B;YAC3B,+BAA+B;YAC/B,uCAAuC;YACvC,kFAAkF;SACnF;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,uLAAuL;QACpM,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE;YACtE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uEAAuE,EAAE;YAC9H,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,wDAAwD,EAAE;YACtH,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6DAA6D,EAAE;SACzG;QACD,OAAO,EAAE,mJAAmJ;QAC5J,QAAQ,EAAE;YACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCH;YACG;;;;;;;;;;;GAWH;SACE;QACD,QAAQ,EAAE;YACR,4BAA4B;YAC5B,4BAA4B;YAC5B,2BAA2B;YAC3B,qBAAqB;SACtB;QACD,WAAW,EAAE,oEAAoE;QACjF,aAAa,EAAE;YACb,uCAAuC;YACvC,qBAAqB;YACrB,gCAAgC;YAChC,6BAA6B;SAC9B;QACD,QAAQ,EAAE;YACR,0GAA0G;YAC1G,gEAAgE;YAChE,yCAAyC;YACzC,kDAAkD;YAClD,4EAA4E;YAC5E,yIAAyI;YACzI,uIAAuI;SACxI;QACD,YAAY,EAAE,CAAC,mBAAmB,EAAE,6BAA6B,EAAE,mBAAmB,CAAC;KACxF;CACF,CAAC"}
|
{"version":3,"file":"n8n-create-workflow.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-create-workflow.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAsB;IACrD,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE;QACV,WAAW,EAAE,sGAAsG;QACnH,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC;QAC/C,OAAO,EAAE,0EAA0E;QACnF,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE;YACJ,2BAA2B;YAC3B,+BAA+B;YAC/B,uCAAuC;YACvC,kFAAkF;SACnF;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,uLAAuL;QACpM,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE;YACtE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uEAAuE,EAAE;YAC9H,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE;YAC1G,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6DAA6D,EAAE;SACzG;QACD,OAAO,EAAE,0EAA0E;QACnF,QAAQ,EAAE;YACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCH;YACG;;;;;;;;;;;GAWH;SACE;QACD,QAAQ,EAAE;YACR,4BAA4B;YAC5B,4BAA4B;YAC5B,2BAA2B;YAC3B,qBAAqB;SACtB;QACD,WAAW,EAAE,oEAAoE;QACjF,aAAa,EAAE;YACb,uCAAuC;YACvC,qBAAqB;YACrB,gCAAgC;YAChC,6BAA6B;SAC9B;QACD,QAAQ,EAAE;YACR,0GAA0G;YAC1G,gEAAgE;YAChE,yCAAyC;YACzC,kDAAkD;YAClD,4EAA4E;YAC5E,yIAAyI;YACzI,uIAAuI;SACxI;QACD,YAAY,EAAE,CAAC,mBAAmB,EAAE,6BAA6B,EAAE,mBAAmB,CAAC;KACxF;CACF,CAAC"}
|
||||||
@@ -20,7 +20,7 @@ exports.n8nDeleteWorkflowDoc = {
|
|||||||
parameters: {
|
parameters: {
|
||||||
id: { type: 'string', required: true, description: 'Workflow ID to delete permanently' }
|
id: { type: 'string', required: true, description: 'Workflow ID to delete permanently' }
|
||||||
},
|
},
|
||||||
returns: 'Minimal confirmation (id, name, deleted: true) for token efficiency.',
|
returns: 'Success confirmation or error if workflow not found/cannot be deleted',
|
||||||
examples: [
|
examples: [
|
||||||
'n8n_delete_workflow({id: "abc123"}) - Delete specific workflow',
|
'n8n_delete_workflow({id: "abc123"}) - Delete specific workflow',
|
||||||
'if (confirm) { n8n_delete_workflow({id: wf.id}); } // With confirmation'
|
'if (confirm) { n8n_delete_workflow({id: wf.id}); } // With confirmation'
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"n8n-delete-workflow.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-delete-workflow.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAsB;IACrD,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE;QACV,WAAW,EAAE,8DAA8D;QAC3E,aAAa,EAAE,CAAC,IAAI,CAAC;QACrB,OAAO,EAAE,2CAA2C;QACpD,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE;YACJ,wBAAwB;YACxB,+BAA+B;YAC/B,+DAA+D;SAChE;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,qPAAqP;QAClQ,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE;SACzF;QACD,OAAO,EAAE,sEAAsE;QAC/E,QAAQ,EAAE;YACR,gEAAgE;YAChE,yEAAyE;SAC1E;QACD,QAAQ,EAAE;YACR,2BAA2B;YAC3B,yBAAyB;YACzB,2BAA2B;YAC3B,wBAAwB;YACxB,mBAAmB;SACpB;QACD,WAAW,EAAE,mGAAmG;QAChH,aAAa,EAAE;YACb,gCAAgC;YAChC,+DAA+D;YAC/D,2CAA2C;YAC3C,4CAA4C;SAC7C;QACD,QAAQ,EAAE;YACR,iDAAiD;YACjD,uCAAuC;YACvC,+BAA+B;YAC/B,iCAAiC;YACjC,0BAA0B;SAC3B;QACD,YAAY,EAAE,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,gBAAgB,CAAC;KAC1G;CACF,CAAC"}
|
{"version":3,"file":"n8n-delete-workflow.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-delete-workflow.ts"],"names":[],"mappings":";;;AAEa,QAAA,oBAAoB,GAAsB;IACrD,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE;QACV,WAAW,EAAE,8DAA8D;QAC3E,aAAa,EAAE,CAAC,IAAI,CAAC;QACrB,OAAO,EAAE,2CAA2C;QACpD,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE;YACJ,wBAAwB;YACxB,+BAA+B;YAC/B,+DAA+D;SAChE;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,qPAAqP;QAClQ,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE;SACzF;QACD,OAAO,EAAE,uEAAuE;QAChF,QAAQ,EAAE;YACR,gEAAgE;YAChE,yEAAyE;SAC1E;QACD,QAAQ,EAAE;YACR,2BAA2B;YAC3B,yBAAyB;YACzB,2BAA2B;YAC3B,wBAAwB;YACxB,mBAAmB;SACpB;QACD,WAAW,EAAE,mGAAmG;QAChH,aAAa,EAAE;YACb,gCAAgC;YAChC,+DAA+D;YAC/D,2CAA2C;YAC3C,4CAA4C;SAC7C;QACD,QAAQ,EAAE;YACR,iDAAiD;YACjD,uCAAuC;YACvC,+BAA+B;YAC/B,iCAAiC;YACjC,0BAA0B;SAC3B;QACD,YAAY,EAAE,CAAC,kBAAkB,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,gBAAgB,CAAC;KAC1G;CACF,CAAC"}
|
||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"n8n-executions.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-executions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,gBAAgB,EAAE,iBAwG9B,CAAC"}
|
{"version":3,"file":"n8n-executions.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-executions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,gBAAgB,EAAE,iBA+E9B,CAAC"}
|
||||||
@@ -6,14 +6,13 @@ exports.n8nExecutionsDoc = {
|
|||||||
category: 'workflow_management',
|
category: 'workflow_management',
|
||||||
essentials: {
|
essentials: {
|
||||||
description: 'Manage workflow executions: get details, list, or delete. Unified tool for all execution operations.',
|
description: 'Manage workflow executions: get details, list, or delete. Unified tool for all execution operations.',
|
||||||
keyParameters: ['action', 'id', 'workflowId', 'status', 'mode'],
|
keyParameters: ['action', 'id', 'workflowId', 'status'],
|
||||||
example: 'n8n_executions({action: "get", id: "exec_456", mode: "error"})',
|
example: 'n8n_executions({action: "list", workflowId: "abc123", status: "error"})',
|
||||||
performance: 'Fast (50-200ms)',
|
performance: 'Fast (50-200ms)',
|
||||||
tips: [
|
tips: [
|
||||||
'action="get": Get execution details by ID',
|
'action="get": Get execution details by ID',
|
||||||
'action="list": List executions with filters',
|
'action="list": List executions with filters',
|
||||||
'action="delete": Delete execution record',
|
'action="delete": Delete execution record',
|
||||||
'Use mode="error" for efficient failure debugging (80-90% token savings)',
|
|
||||||
'Use mode parameter for action=get to control detail level'
|
'Use mode parameter for action=get to control detail level'
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -27,26 +26,14 @@ exports.n8nExecutionsDoc = {
|
|||||||
- preview: Structure only, no data
|
- preview: Structure only, no data
|
||||||
- summary: 2 items per node (default)
|
- summary: 2 items per node (default)
|
||||||
- filtered: Custom items limit, optionally filter by node names
|
- filtered: Custom items limit, optionally filter by node names
|
||||||
- full: All execution data (can be very large)
|
- full: All execution data (can be very large)`,
|
||||||
- error: Optimized for debugging failures - extracts error info, upstream context, and AI suggestions
|
|
||||||
|
|
||||||
**Error Mode Features:**
|
|
||||||
- Extracts error message, type, and node configuration
|
|
||||||
- Samples input data from upstream node (configurable limit)
|
|
||||||
- Shows execution path leading to error
|
|
||||||
- Provides AI-friendly fix suggestions based on error patterns
|
|
||||||
- Token-efficient (80-90% smaller than full mode)`,
|
|
||||||
parameters: {
|
parameters: {
|
||||||
action: { type: 'string', required: true, description: 'Operation: "get", "list", or "delete"' },
|
action: { type: 'string', required: true, description: 'Operation: "get", "list", or "delete"' },
|
||||||
id: { type: 'string', required: false, description: 'Execution ID (required for action=get or action=delete)' },
|
id: { type: 'string', required: false, description: 'Execution ID (required for action=get or action=delete)' },
|
||||||
mode: { type: 'string', required: false, description: 'For action=get: "preview", "summary" (default), "filtered", "full", "error"' },
|
mode: { type: 'string', required: false, description: 'For action=get: "preview", "summary" (default), "filtered", "full"' },
|
||||||
nodeNames: { type: 'array', required: false, description: 'For action=get with mode=filtered: Filter to specific nodes by name' },
|
nodeNames: { type: 'array', required: false, description: 'For action=get with mode=filtered: Filter to specific nodes by name' },
|
||||||
itemsLimit: { type: 'number', required: false, description: 'For action=get with mode=filtered: Items per node (0=structure, 2=default, -1=unlimited)' },
|
itemsLimit: { type: 'number', required: false, description: 'For action=get with mode=filtered: Items per node (0=structure, 2=default, -1=unlimited)' },
|
||||||
includeInputData: { type: 'boolean', required: false, description: 'For action=get: Include input data in addition to output (default: false)' },
|
includeInputData: { type: 'boolean', required: false, description: 'For action=get: Include input data in addition to output (default: false)' },
|
||||||
errorItemsLimit: { type: 'number', required: false, description: 'For action=get with mode=error: Sample items from upstream (default: 2, max: 100)' },
|
|
||||||
includeStackTrace: { type: 'boolean', required: false, description: 'For action=get with mode=error: Include full stack trace (default: false, shows truncated)' },
|
|
||||||
includeExecutionPath: { type: 'boolean', required: false, description: 'For action=get with mode=error: Include execution path (default: true)' },
|
|
||||||
fetchWorkflow: { type: 'boolean', required: false, description: 'For action=get with mode=error: Fetch workflow for accurate upstream detection (default: true)' },
|
|
||||||
workflowId: { type: 'string', required: false, description: 'For action=list: Filter by workflow ID' },
|
workflowId: { type: 'string', required: false, description: 'For action=list: Filter by workflow ID' },
|
||||||
status: { type: 'string', required: false, description: 'For action=list: Filter by status ("success", "error", "waiting")' },
|
status: { type: 'string', required: false, description: 'For action=list: Filter by status ("success", "error", "waiting")' },
|
||||||
limit: { type: 'number', required: false, description: 'For action=list: Number of results (1-100, default: 100)' },
|
limit: { type: 'number', required: false, description: 'For action=list: Number of results (1-100, default: 100)' },
|
||||||
@@ -55,15 +42,10 @@ exports.n8nExecutionsDoc = {
|
|||||||
includeData: { type: 'boolean', required: false, description: 'For action=list: Include execution data (default: false)' }
|
includeData: { type: 'boolean', required: false, description: 'For action=list: Include execution data (default: false)' }
|
||||||
},
|
},
|
||||||
returns: `Depends on action:
|
returns: `Depends on action:
|
||||||
- get (error mode): { errorInfo: { primaryError, upstreamContext, executionPath, suggestions }, summary }
|
- get: Execution object with data based on mode
|
||||||
- get (other modes): Execution object with data based on mode
|
|
||||||
- list: { data: [...executions], nextCursor?: string }
|
- list: { data: [...executions], nextCursor?: string }
|
||||||
- delete: { success: boolean, message: string }`,
|
- delete: { success: boolean, message: string }`,
|
||||||
examples: [
|
examples: [
|
||||||
'// Debug a failed execution (recommended for errors)\nn8n_executions({action: "get", id: "exec_456", mode: "error"})',
|
|
||||||
'// Debug with more sample data from upstream\nn8n_executions({action: "get", id: "exec_456", mode: "error", errorItemsLimit: 5})',
|
|
||||||
'// Debug with full stack trace\nn8n_executions({action: "get", id: "exec_456", mode: "error", includeStackTrace: true})',
|
|
||||||
'// Debug without workflow fetch (faster but less accurate)\nn8n_executions({action: "get", id: "exec_456", mode: "error", fetchWorkflow: false})',
|
|
||||||
'// List recent executions for a workflow\nn8n_executions({action: "list", workflowId: "abc123", limit: 10})',
|
'// List recent executions for a workflow\nn8n_executions({action: "list", workflowId: "abc123", limit: 10})',
|
||||||
'// List failed executions\nn8n_executions({action: "list", status: "error"})',
|
'// List failed executions\nn8n_executions({action: "list", status: "error"})',
|
||||||
'// Get execution summary\nn8n_executions({action: "get", id: "exec_456"})',
|
'// Get execution summary\nn8n_executions({action: "get", id: "exec_456"})',
|
||||||
@@ -72,10 +54,7 @@ exports.n8nExecutionsDoc = {
|
|||||||
'// Delete an execution\nn8n_executions({action: "delete", id: "exec_456"})'
|
'// Delete an execution\nn8n_executions({action: "delete", id: "exec_456"})'
|
||||||
],
|
],
|
||||||
useCases: [
|
useCases: [
|
||||||
'Debug workflow failures efficiently (mode=error) - 80-90% token savings',
|
'Debug workflow failures (get with mode=full)',
|
||||||
'Get AI suggestions for fixing common errors',
|
|
||||||
'Analyze input data that caused failure',
|
|
||||||
'Debug workflow failures with full data (mode=full)',
|
|
||||||
'Monitor workflow health (list with status filter)',
|
'Monitor workflow health (list with status filter)',
|
||||||
'Audit execution history',
|
'Audit execution history',
|
||||||
'Clean up old execution records',
|
'Clean up old execution records',
|
||||||
@@ -84,22 +63,18 @@ exports.n8nExecutionsDoc = {
|
|||||||
performance: `Response times:
|
performance: `Response times:
|
||||||
- list: 50-150ms depending on filters
|
- list: 50-150ms depending on filters
|
||||||
- get (preview/summary): 30-100ms
|
- get (preview/summary): 30-100ms
|
||||||
- get (error): 50-200ms (includes optional workflow fetch)
|
|
||||||
- get (full): 100-500ms+ depending on data size
|
- get (full): 100-500ms+ depending on data size
|
||||||
- delete: 30-80ms`,
|
- delete: 30-80ms`,
|
||||||
bestPractices: [
|
bestPractices: [
|
||||||
'Use mode="error" for debugging failed executions - 80-90% token savings vs full',
|
'Use mode="summary" (default) for debugging - shows enough data',
|
||||||
'Use mode="summary" (default) for quick inspection',
|
|
||||||
'Use mode="filtered" with nodeNames for large workflows',
|
'Use mode="filtered" with nodeNames for large workflows',
|
||||||
'Filter by workflowId when listing to reduce results',
|
'Filter by workflowId when listing to reduce results',
|
||||||
'Use cursor for pagination through large result sets',
|
'Use cursor for pagination through large result sets',
|
||||||
'Set fetchWorkflow=false if you already know the workflow structure',
|
|
||||||
'Delete old executions to save storage'
|
'Delete old executions to save storage'
|
||||||
],
|
],
|
||||||
pitfalls: [
|
pitfalls: [
|
||||||
'Requires N8N_API_URL and N8N_API_KEY configured',
|
'Requires N8N_API_URL and N8N_API_KEY configured',
|
||||||
'mode="full" can return very large responses for complex workflows',
|
'mode="full" can return very large responses for complex workflows',
|
||||||
'mode="error" fetches workflow by default (adds ~50-100ms), disable with fetchWorkflow=false',
|
|
||||||
'Execution must exist or returns 404',
|
'Execution must exist or returns 404',
|
||||||
'Delete is permanent - cannot undo'
|
'Delete is permanent - cannot undo'
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"n8n-executions.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-executions.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"n8n-executions.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-executions.ts"],"names":[],"mappings":";;;AAEa,QAAA,gBAAgB,GAAsB;IACjD,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE;QACV,WAAW,EAAE,sGAAsG;QACnH,aAAa,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC;QACvD,OAAO,EAAE,yEAAyE;QAClF,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE;YACJ,2CAA2C;YAC3C,6CAA6C;YAC7C,0CAA0C;YAC1C,2DAA2D;SAC5D;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE;;;;;;;;;+CAS8B;QAC3C,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uCAAuC,EAAE;YAChG,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,yDAAyD,EAAE;YAC/G,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,oEAAoE,EAAE;YAC5H,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,qEAAqE,EAAE;YACjI,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,0FAA0F,EAAE;YACxJ,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,2EAA2E,EAAE;YAChJ,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,wCAAwC,EAAE;YACtG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,mEAAmE,EAAE;YAC7H,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,0DAA0D,EAAE;YACnH,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,2DAA2D,EAAE;YACrH,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,oDAAoD,EAAE;YACjH,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,0DAA0D,EAAE;SAC3H;QACD,OAAO,EAAE;;;gDAGmC;QAC5C,QAAQ,EAAE;YACR,6GAA6G;YAC7G,8EAA8E;YAC9E,2EAA2E;YAC3E,2FAA2F;YAC3F,+IAA+I;YAC/I,4EAA4E;SAC7E;QACD,QAAQ,EAAE;YACR,8CAA8C;YAC9C,mDAAmD;YACnD,yBAAyB;YACzB,gCAAgC;YAChC,+BAA+B;SAChC;QACD,WAAW,EAAE;;;;kBAIC;QACd,aAAa,EAAE;YACb,gEAAgE;YAChE,wDAAwD;YACxD,qDAAqD;YACrD,qDAAqD;YACrD,uCAAuC;SACxC;QACD,QAAQ,EAAE;YACR,iDAAiD;YACjD,mEAAmE;YACnE,qCAAqC;YACrC,mCAAmC;SACpC;QACD,YAAY,EAAE,CAAC,kBAAkB,EAAE,mBAAmB,EAAE,uBAAuB,CAAC;KACjF;CACF,CAAC"}
|
||||||
@@ -26,7 +26,7 @@ exports.n8nUpdateFullWorkflowDoc = {
|
|||||||
settings: { type: 'object', description: 'Workflow settings to update (timezone, error handling, etc.)' },
|
settings: { type: 'object', description: 'Workflow settings to update (timezone, error handling, etc.)' },
|
||||||
intent: { type: 'string', description: 'Intent of the change - helps to return better response. Include in every tool call. Example: "Migrate workflow to new node versions".' }
|
intent: { type: 'string', description: 'Intent of the change - helps to return better response. Include in every tool call. Example: "Migrate workflow to new node versions".' }
|
||||||
},
|
},
|
||||||
returns: 'Minimal summary (id, name, active, nodeCount) for token efficiency. Use n8n_get_workflow with mode "structure" to verify current state if needed.',
|
returns: 'Updated workflow object with all fields including the changes applied',
|
||||||
examples: [
|
examples: [
|
||||||
'n8n_update_full_workflow({id: "abc", intent: "Rename workflow for clarity", name: "New Name"}) - Rename with intent',
|
'n8n_update_full_workflow({id: "abc", intent: "Rename workflow for clarity", name: "New Name"}) - Rename with intent',
|
||||||
'n8n_update_full_workflow({id: "abc", name: "New Name"}) - Rename only',
|
'n8n_update_full_workflow({id: "abc", name: "New Name"}) - Rename only',
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"n8n-update-full-workflow.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-update-full-workflow.ts"],"names":[],"mappings":";;;AAEa,QAAA,wBAAwB,GAAsB;IACzD,IAAI,EAAE,0BAA0B;IAChC,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE;QACV,WAAW,EAAE,qHAAqH;QAClI,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;QAC7C,OAAO,EAAE,4EAA4E;QACrF,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE;YACJ,2EAA2E;YAC3E,gCAAgC;YAChC,sCAAsC;YACtC,0BAA0B;SAC3B;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,4QAA4Q;QACzR,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE;YAC5E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACrE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,oEAAoE,EAAE;YAC3G,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+DAA+D,EAAE;YAC7G,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;YACzG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uIAAuI,EAAE;SACjL;QACD,OAAO,EAAE,mJAAmJ;QAC5J,QAAQ,EAAE;YACR,qHAAqH;YACrH,uEAAuE;YACvE,qIAAqI;YACrI,+IAA+I;SAChJ;QACD,QAAQ,EAAE;YACR,8BAA8B;YAC9B,mBAAmB;YACnB,0BAA0B;YAC1B,+BAA+B;YAC/B,kBAAkB;SACnB;QACD,WAAW,EAAE,wHAAwH;QACrI,aAAa,EAAE;YACb,qEAAqE;YACrE,yCAAyC;YACzC,iDAAiD;YACjD,sCAAsC;YACtC,sCAAsC;SACvC;QACD,QAAQ,EAAE;YACR,iDAAiD;YACjD,oCAAoC;YACpC,+BAA+B;YAC/B,4BAA4B;YAC5B,iDAAiD;SAClD;QACD,YAAY,EAAE,CAAC,kBAAkB,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,qBAAqB,CAAC;KAC9G;CACF,CAAC"}
|
{"version":3,"file":"n8n-update-full-workflow.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-update-full-workflow.ts"],"names":[],"mappings":";;;AAEa,QAAA,wBAAwB,GAAsB;IACzD,IAAI,EAAE,0BAA0B;IAChC,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE;QACV,WAAW,EAAE,qHAAqH;QAClI,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;QAC7C,OAAO,EAAE,4EAA4E;QACrF,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE;YACJ,2EAA2E;YAC3E,gCAAgC;YAChC,sCAAsC;YACtC,0BAA0B;SAC3B;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE,4QAA4Q;QACzR,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE;YAC5E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACrE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,oEAAoE,EAAE;YAC3G,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+DAA+D,EAAE;YAC7G,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8DAA8D,EAAE;YACzG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uIAAuI,EAAE;SACjL;QACD,OAAO,EAAE,uEAAuE;QAChF,QAAQ,EAAE;YACR,qHAAqH;YACrH,uEAAuE;YACvE,qIAAqI;YACrI,+IAA+I;SAChJ;QACD,QAAQ,EAAE;YACR,8BAA8B;YAC9B,mBAAmB;YACnB,0BAA0B;YAC1B,+BAA+B;YAC/B,kBAAkB;SACnB;QACD,WAAW,EAAE,wHAAwH;QACrI,aAAa,EAAE;YACb,qEAAqE;YACrE,yCAAyC;YACzC,iDAAiD;YACjD,sCAAsC;YACtC,sCAAsC;SACvC;QACD,QAAQ,EAAE;YACR,iDAAiD;YACjD,oCAAoC;YACpC,+BAA+B;YAC/B,4BAA4B;YAC5B,iDAAiD;SAClD;QACD,YAAY,EAAE,CAAC,kBAAkB,EAAE,6BAA6B,EAAE,mBAAmB,EAAE,qBAAqB,CAAC;KAC9G;CACF,CAAC"}
|
||||||
@@ -313,7 +313,7 @@ n8n_update_partial_workflow({
|
|||||||
continueOnError: { type: 'boolean', description: 'If true, apply valid operations even if some fail (best-effort mode). Returns applied and failed operation indices. Default: false (atomic)' },
|
continueOnError: { type: 'boolean', description: 'If true, apply valid operations even if some fail (best-effort mode). Returns applied and failed operation indices. Default: false (atomic)' },
|
||||||
intent: { type: 'string', description: 'Intent of the change - helps to return better response. Include in every tool call. Example: "Add error handling for API failures".' }
|
intent: { type: 'string', description: 'Intent of the change - helps to return better response. Include in every tool call. Example: "Add error handling for API failures".' }
|
||||||
},
|
},
|
||||||
returns: 'Minimal summary (id, name, active, nodeCount, operationsApplied) for token efficiency. Use n8n_get_workflow with mode "structure" to verify current state if needed. Returns validation results if validateOnly=true.',
|
returns: 'Updated workflow object or validation results if validateOnly=true',
|
||||||
examples: [
|
examples: [
|
||||||
'// Include intent parameter for better responses\nn8n_update_partial_workflow({id: "abc", intent: "Add error handling for API failures", operations: [{type: "addConnection", source: "HTTP Request", target: "Error Handler"}]})',
|
'// Include intent parameter for better responses\nn8n_update_partial_workflow({id: "abc", intent: "Add error handling for API failures", operations: [{type: "addConnection", source: "HTTP Request", target: "Error Handler"}]})',
|
||||||
'// Add a basic node (minimal configuration)\nn8n_update_partial_workflow({id: "abc", operations: [{type: "addNode", node: {name: "Process Data", type: "n8n-nodes-base.set", position: [400, 300], parameters: {}}}]})',
|
'// Add a basic node (minimal configuration)\nn8n_update_partial_workflow({id: "abc", operations: [{type: "addNode", node: {name: "Process Data", type: "n8n-nodes-base.set", position: [400, 300], parameters: {}}}]})',
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"n8n-update-partial-workflow.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.ts"],"names":[],"mappings":";;;AAEa,QAAA,2BAA2B,GAAsB;IAC5D,IAAI,EAAE,6BAA6B;IACnC,QAAQ,EAAE,qBAAqB;IAC/B,UAAU,EAAE;QACV,WAAW,EAAE,ggBAAggB;QAC7gB,aAAa,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,iBAAiB,CAAC;QACtD,OAAO,EAAE,6IAA6I;QACtJ,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE;YACJ,gJAAgJ;YAChJ,oGAAoG;YACpG,mDAAmD;YACnD,wCAAwC;YACxC,6BAA6B;YAC7B,6DAA6D;YAC7D,uDAAuD;YACvD,0DAA0D;YAC1D,kCAAkC;YAClC,iFAAiF;YACjF,mDAAmD;YACnD,gGAAgG;YAChG,sGAAsG;YACtG,yIAAyI;SAC1I;KACF;IACD,IAAI,EAAE;QACJ,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAkRgB;QAC7B,UAAU,EAAE;YACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uBAAuB,EAAE;YAC5E,UAAU,EAAE;gBACV,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,iIAAiI;aAC/I;YACD,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yDAAyD,EAAE;YACzG,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,6IAA6I,EAAE;YAChM,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qIAAqI,EAAE;SAC/K;QACD,OAAO,EAAE,uNAAuN;QAChO,QAAQ,EAAE;YACR,mOAAmO;YACnO,wNAAwN;YACxN,kTAAkT;YAClT,0VAA0V;YAC1V,gMAAgM;YAChM,mLAAmL;YACnL,mLAAmL;YACnL,6UAA6U;YAC7U,oMAAoM;YACpM,oYAAoY;YACpY,qJAAqJ;YACrJ,+MAA+M;YAC/M,kSAAkS;YAClS,0LAA0L;YAC1L,wJAAwJ;YACxJ,uDAAuD;YACvD,2MAA2M;YAC3M,wLAAwL;YACxL,+LAA+L;YAC/L,gNAAgN;YAChN,4hBAA4hB;YAC5hB,+WAA+W;YAC/W,qWAAqW;YACrW,uVAAuV;YACvV,qPAAqP;YACrP,0eAA0e;YAC1e,6DAA6D;YAC7D,oKAAoK;YACpK,oOAAoO;YACpO,qLAAqL;YACrL,mPAAmP;YACnP,qLAAqL;SACtL;QACD,QAAQ,EAAE;YACR,yCAAyC;YACzC,uDAAuD;YACvD,wDAAwD;YACxD,+CAA+C;YAC/C,+BAA+B;YAC/B,iCAAiC;YACjC,8CAA8C;YAC9C,sBAAsB;YACtB,2BAA2B;YAC3B,yBAAyB;YACzB,iEAAiE;YACjE,+CAA+C;YAC/C,2CAA2C;YAC3C,0CAA0C;YAC1C,+CAA+C;YAC/C,kCAAkC;SACnC;QACD,WAAW,EAAE,8FAA8F;QAC3G,aAAa,EAAE;YACb,kPAAkP;YAClP,iEAAiE;YACjE,+DAA+D;YAC/D,oDAAoD;YACpD,yDAAyD;YACzD,iDAAiD;YACjD,gEAAgE;YAChE,qDAAqD;YACrD,mCAAmC;YACnC,wCAAwC;YACxC,gDAAgD;YAChD,8FAA8F;YAC9F,2EAA2E;YAC3E,6DAA6D;YAC7D,oEAAoE;YACpE,8EAA8E;YAC9E,8EAA8E;YAC9E,8GAA8G;YAC9G,kFAAkF;YAClF,kFAAkF;SACnF;QACD,QAAQ,EAAE;YACR,uGAAuG;YACvG,wEAAwE;YACxE,6DAA6D;YAC7D,sFAAsF;YACtF,4DAA4D;YAC5D,yEAAyE;YACzE,yFAAyF;YACzF,wFAAwF;YACxF,mGAAmG;YACnG,iFAAiF;YACjF,iNAAiN;YACjN,kKAAkK;YAClK,4EAA4E;YAC5E,yFAAyF;YACzF,4LAA4L;YAC5L,oIAAoI;YACpI,wJAAwJ;YACxJ,+JAA+J;YAC/J,uEAAuE;YACvE,iKAAiK;YACjK,2FAA2F;YAC3F,gHAAgH;YAChH,kHAAkH;SACnH;QACD,YAAY,EAAE,CAAC,0BAA0B,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,qBAAqB,CAAC;KAC3G;CACF,CAAC"}
|
{"version":3,"file":"n8n-update-partial-workflow.js","sourceRoot":"","sources":["../../../../src/mcp/tool-docs/workflow_management/n8n-update-partial-workflow.ts"],"names":[],"mappings":"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"}
|
||||||
2
dist/mcp/tools-n8n-manager.d.ts.map
vendored
2
dist/mcp/tools-n8n-manager.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"tools-n8n-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/tools-n8n-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAQ1C,eAAO,MAAM,kBAAkB,EAAE,cAAc,EAqlB9C,CAAC"}
|
{"version":3,"file":"tools-n8n-manager.d.ts","sourceRoot":"","sources":["../../src/mcp/tools-n8n-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAQ1C,eAAO,MAAM,kBAAkB,EAAE,cAAc,EAmf9C,CAAC"}
|
||||||
129
dist/mcp/tools-n8n-manager.js
vendored
129
dist/mcp/tools-n8n-manager.js
vendored
@@ -42,7 +42,7 @@ exports.n8nManagementTools = [
|
|||||||
},
|
},
|
||||||
connections: {
|
connections: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
description: 'Workflow connections object. Keys are source node names (the name field, not id), values define output connections'
|
description: 'Workflow connections object. Keys are source node IDs, values define output connections'
|
||||||
},
|
},
|
||||||
settings: {
|
settings: {
|
||||||
type: 'object',
|
type: 'object',
|
||||||
@@ -60,13 +60,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['name', 'nodes', 'connections']
|
required: ['name', 'nodes', 'connections']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Create Workflow',
|
|
||||||
readOnlyHint: false,
|
|
||||||
destructiveHint: false,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_get_workflow',
|
name: 'n8n_get_workflow',
|
||||||
@@ -86,13 +80,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['id']
|
required: ['id']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Get Workflow',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_update_full_workflow',
|
name: 'n8n_update_full_workflow',
|
||||||
@@ -126,14 +114,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['id']
|
required: ['id']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Update Full Workflow',
|
|
||||||
readOnlyHint: false,
|
|
||||||
destructiveHint: false,
|
|
||||||
idempotentHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_update_partial_workflow',
|
name: 'n8n_update_partial_workflow',
|
||||||
@@ -164,14 +145,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['id', 'operations']
|
required: ['id', 'operations']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Update Partial Workflow',
|
|
||||||
readOnlyHint: false,
|
|
||||||
destructiveHint: false,
|
|
||||||
idempotentHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_delete_workflow',
|
name: 'n8n_delete_workflow',
|
||||||
@@ -185,13 +159,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['id']
|
required: ['id']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Delete Workflow',
|
|
||||||
readOnlyHint: false,
|
|
||||||
destructiveHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_list_workflows',
|
name: 'n8n_list_workflows',
|
||||||
@@ -225,13 +193,7 @@ exports.n8nManagementTools = [
|
|||||||
description: 'Exclude pinned data from response (default: true)'
|
description: 'Exclude pinned data from response (default: true)'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'List Workflows',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_validate_workflow',
|
name: 'n8n_validate_workflow',
|
||||||
@@ -268,13 +230,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['id']
|
required: ['id']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Validate Workflow',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_autofix_workflow',
|
name: 'n8n_autofix_workflow',
|
||||||
@@ -309,14 +265,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['id']
|
required: ['id']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Autofix Workflow',
|
|
||||||
readOnlyHint: false,
|
|
||||||
destructiveHint: false,
|
|
||||||
idempotentHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_test_workflow',
|
name: 'n8n_test_workflow',
|
||||||
@@ -368,13 +317,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['workflowId']
|
required: ['workflowId']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Test Workflow',
|
|
||||||
readOnlyHint: false,
|
|
||||||
destructiveHint: false,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_executions',
|
name: 'n8n_executions',
|
||||||
@@ -393,8 +336,8 @@ exports.n8nManagementTools = [
|
|||||||
},
|
},
|
||||||
mode: {
|
mode: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
enum: ['preview', 'summary', 'filtered', 'full', 'error'],
|
enum: ['preview', 'summary', 'filtered', 'full'],
|
||||||
description: 'For action=get: preview=structure only, summary=2 items (default), filtered=custom, full=all data, error=optimized error debugging'
|
description: 'For action=get: preview=structure only, summary=2 items (default), filtered=custom, full=all data'
|
||||||
},
|
},
|
||||||
nodeNames: {
|
nodeNames: {
|
||||||
type: 'array',
|
type: 'array',
|
||||||
@@ -409,22 +352,6 @@ exports.n8nManagementTools = [
|
|||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
description: 'For action=get: include input data in addition to output (default: false)'
|
description: 'For action=get: include input data in addition to output (default: false)'
|
||||||
},
|
},
|
||||||
errorItemsLimit: {
|
|
||||||
type: 'number',
|
|
||||||
description: 'For action=get with mode=error: sample items from upstream node (default: 2, max: 100)'
|
|
||||||
},
|
|
||||||
includeStackTrace: {
|
|
||||||
type: 'boolean',
|
|
||||||
description: 'For action=get with mode=error: include full stack trace (default: false, shows truncated)'
|
|
||||||
},
|
|
||||||
includeExecutionPath: {
|
|
||||||
type: 'boolean',
|
|
||||||
description: 'For action=get with mode=error: include execution path leading to error (default: true)'
|
|
||||||
},
|
|
||||||
fetchWorkflow: {
|
|
||||||
type: 'boolean',
|
|
||||||
description: 'For action=get with mode=error: fetch workflow for accurate upstream detection (default: true)'
|
|
||||||
},
|
|
||||||
limit: {
|
limit: {
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: 'For action=list: number of executions to return (1-100, default: 100)'
|
description: 'For action=list: number of executions to return (1-100, default: 100)'
|
||||||
@@ -452,13 +379,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['action']
|
required: ['action']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Manage Executions',
|
|
||||||
readOnlyHint: false,
|
|
||||||
destructiveHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_health_check',
|
name: 'n8n_health_check',
|
||||||
@@ -477,13 +398,7 @@ exports.n8nManagementTools = [
|
|||||||
description: 'Include extra details in diagnostic mode (default: false)'
|
description: 'Include extra details in diagnostic mode (default: false)'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Health Check',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_workflow_versions',
|
name: 'n8n_workflow_versions',
|
||||||
@@ -537,13 +452,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['mode']
|
required: ['mode']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Workflow Versions',
|
|
||||||
readOnlyHint: false,
|
|
||||||
destructiveHint: true,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'n8n_deploy_template',
|
name: 'n8n_deploy_template',
|
||||||
@@ -576,13 +485,7 @@ exports.n8nManagementTools = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
required: ['templateId']
|
required: ['templateId']
|
||||||
},
|
}
|
||||||
annotations: {
|
|
||||||
title: 'Deploy Template',
|
|
||||||
readOnlyHint: false,
|
|
||||||
destructiveHint: false,
|
|
||||||
openWorldHint: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
//# sourceMappingURL=tools-n8n-manager.js.map
|
//# sourceMappingURL=tools-n8n-manager.js.map
|
||||||
2
dist/mcp/tools-n8n-manager.js.map
vendored
2
dist/mcp/tools-n8n-manager.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/mcp/tools.d.ts.map
vendored
2
dist/mcp/tools.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAQ1C,eAAO,MAAM,0BAA0B,EAAE,cAAc,EAkatD,CAAC"}
|
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAQ1C,eAAO,MAAM,0BAA0B,EAAE,cAAc,EA+XtD,CAAC"}
|
||||||
35
dist/mcp/tools.js
vendored
35
dist/mcp/tools.js
vendored
@@ -20,11 +20,6 @@ exports.n8nDocumentationToolsFinal = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
annotations: {
|
|
||||||
title: 'Tools Documentation',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'search_nodes',
|
name: 'search_nodes',
|
||||||
@@ -55,11 +50,6 @@ exports.n8nDocumentationToolsFinal = [
|
|||||||
},
|
},
|
||||||
required: ['query'],
|
required: ['query'],
|
||||||
},
|
},
|
||||||
annotations: {
|
|
||||||
title: 'Search Nodes',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'get_node',
|
name: 'get_node',
|
||||||
@@ -113,11 +103,6 @@ exports.n8nDocumentationToolsFinal = [
|
|||||||
},
|
},
|
||||||
required: ['nodeType'],
|
required: ['nodeType'],
|
||||||
},
|
},
|
||||||
annotations: {
|
|
||||||
title: 'Get Node Info',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'validate_node',
|
name: 'validate_node',
|
||||||
@@ -198,11 +183,6 @@ exports.n8nDocumentationToolsFinal = [
|
|||||||
},
|
},
|
||||||
required: ['nodeType', 'displayName', 'valid']
|
required: ['nodeType', 'displayName', 'valid']
|
||||||
},
|
},
|
||||||
annotations: {
|
|
||||||
title: 'Validate Node Config',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'get_template',
|
name: 'get_template',
|
||||||
@@ -223,11 +203,6 @@ exports.n8nDocumentationToolsFinal = [
|
|||||||
},
|
},
|
||||||
required: ['templateId'],
|
required: ['templateId'],
|
||||||
},
|
},
|
||||||
annotations: {
|
|
||||||
title: 'Get Template',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'search_templates',
|
name: 'search_templates',
|
||||||
@@ -318,11 +293,6 @@ exports.n8nDocumentationToolsFinal = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
annotations: {
|
|
||||||
title: 'Search Templates',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'validate_workflow',
|
name: 'validate_workflow',
|
||||||
@@ -408,11 +378,6 @@ exports.n8nDocumentationToolsFinal = [
|
|||||||
},
|
},
|
||||||
required: ['valid', 'summary']
|
required: ['valid', 'summary']
|
||||||
},
|
},
|
||||||
annotations: {
|
|
||||||
title: 'Validate Workflow',
|
|
||||||
readOnlyHint: true,
|
|
||||||
idempotentHint: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
//# sourceMappingURL=tools.js.map
|
//# sourceMappingURL=tools.js.map
|
||||||
2
dist/mcp/tools.js.map
vendored
2
dist/mcp/tools.js.map
vendored
File diff suppressed because one or more lines are too long
3
dist/parsers/node-parser.d.ts
vendored
3
dist/parsers/node-parser.d.ts
vendored
@@ -17,9 +17,6 @@ export interface ParsedNode {
|
|||||||
documentation?: string;
|
documentation?: string;
|
||||||
outputs?: any[];
|
outputs?: any[];
|
||||||
outputNames?: string[];
|
outputNames?: string[];
|
||||||
isToolVariant?: boolean;
|
|
||||||
toolVariantOf?: string;
|
|
||||||
hasToolVariant?: boolean;
|
|
||||||
}
|
}
|
||||||
export declare class NodeParser {
|
export declare class NodeParser {
|
||||||
private propertyExtractor;
|
private propertyExtractor;
|
||||||
|
|||||||
2
dist/parsers/node-parser.d.ts.map
vendored
2
dist/parsers/node-parser.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"node-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/node-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EAEV,MAAM,qBAAqB,CAAC;AAQ7B,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,aAAa,GAAG,cAAc,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,gBAAgB,CAA0B;IAElD,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU;IA0B5D,OAAO,CAAC,kBAAkB;IAoD1B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,cAAc;IA0FtB,OAAO,CAAC,eAAe;IA2CvB,OAAO,CAAC,cAAc;CAsDvB"}
|
{"version":3,"file":"node-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/node-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EAEV,MAAM,qBAAqB,CAAC;AAQ7B,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,aAAa,GAAG,cAAc,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,WAAW,EAAE,GAAG,EAAE,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,iBAAiB,CAA2B;IACpD,OAAO,CAAC,gBAAgB,CAA0B;IAElD,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,UAAU;IA0B5D,OAAO,CAAC,kBAAkB;IAoD1B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,cAAc;IA0FtB,OAAO,CAAC,eAAe;IA2CvB,OAAO,CAAC,cAAc;CAsDvB"}
|
||||||
2
dist/parsers/node-parser.js.map
vendored
2
dist/parsers/node-parser.js.map
vendored
File diff suppressed because one or more lines are too long
26
dist/scripts/rebuild.js
vendored
26
dist/scripts/rebuild.js
vendored
@@ -39,7 +39,6 @@ const node_loader_1 = require("../loaders/node-loader");
|
|||||||
const node_parser_1 = require("../parsers/node-parser");
|
const node_parser_1 = require("../parsers/node-parser");
|
||||||
const docs_mapper_1 = require("../mappers/docs-mapper");
|
const docs_mapper_1 = require("../mappers/docs-mapper");
|
||||||
const node_repository_1 = require("../database/node-repository");
|
const node_repository_1 = require("../database/node-repository");
|
||||||
const tool_variant_generator_1 = require("../services/tool-variant-generator");
|
|
||||||
const template_sanitizer_1 = require("../utils/template-sanitizer");
|
const template_sanitizer_1 = require("../utils/template-sanitizer");
|
||||||
const fs = __importStar(require("fs"));
|
const fs = __importStar(require("fs"));
|
||||||
const path = __importStar(require("path"));
|
const path = __importStar(require("path"));
|
||||||
@@ -51,7 +50,6 @@ async function rebuild() {
|
|||||||
const parser = new node_parser_1.NodeParser();
|
const parser = new node_parser_1.NodeParser();
|
||||||
const mapper = new docs_mapper_1.DocsMapper();
|
const mapper = new docs_mapper_1.DocsMapper();
|
||||||
const repository = new node_repository_1.NodeRepository(db);
|
const repository = new node_repository_1.NodeRepository(db);
|
||||||
const toolVariantGenerator = new tool_variant_generator_1.ToolVariantGenerator();
|
|
||||||
const schema = fs.readFileSync(path.join(__dirname, '../../src/database/schema.sql'), 'utf8');
|
const schema = fs.readFileSync(path.join(__dirname, '../../src/database/schema.sql'), 'utf8');
|
||||||
db.exec(schema);
|
db.exec(schema);
|
||||||
db.exec('DELETE FROM nodes');
|
db.exec('DELETE FROM nodes');
|
||||||
@@ -66,8 +64,7 @@ async function rebuild() {
|
|||||||
webhooks: 0,
|
webhooks: 0,
|
||||||
withProperties: 0,
|
withProperties: 0,
|
||||||
withOperations: 0,
|
withOperations: 0,
|
||||||
withDocs: 0,
|
withDocs: 0
|
||||||
toolVariants: 0
|
|
||||||
};
|
};
|
||||||
console.log('🔄 Processing nodes...');
|
console.log('🔄 Processing nodes...');
|
||||||
const processedNodes = [];
|
const processedNodes = [];
|
||||||
@@ -82,18 +79,6 @@ async function rebuild() {
|
|||||||
}
|
}
|
||||||
const docs = await mapper.fetchDocumentation(parsed.nodeType);
|
const docs = await mapper.fetchDocumentation(parsed.nodeType);
|
||||||
parsed.documentation = docs || undefined;
|
parsed.documentation = docs || undefined;
|
||||||
if (parsed.isAITool && !parsed.isTrigger) {
|
|
||||||
const toolVariant = toolVariantGenerator.generateToolVariant(parsed);
|
|
||||||
if (toolVariant) {
|
|
||||||
parsed.hasToolVariant = true;
|
|
||||||
processedNodes.push({
|
|
||||||
parsed: toolVariant,
|
|
||||||
docs: undefined,
|
|
||||||
nodeName: `${nodeName}Tool`
|
|
||||||
});
|
|
||||||
stats.toolVariants++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
processedNodes.push({ parsed, docs: docs || undefined, nodeName });
|
processedNodes.push({ parsed, docs: docs || undefined, nodeName });
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
@@ -150,7 +135,6 @@ async function rebuild() {
|
|||||||
console.log(` Successful: ${stats.successful}`);
|
console.log(` Successful: ${stats.successful}`);
|
||||||
console.log(` Failed: ${stats.failed}`);
|
console.log(` Failed: ${stats.failed}`);
|
||||||
console.log(` AI Tools: ${stats.aiTools}`);
|
console.log(` AI Tools: ${stats.aiTools}`);
|
||||||
console.log(` Tool Variants: ${stats.toolVariants}`);
|
|
||||||
console.log(` Triggers: ${stats.triggers}`);
|
console.log(` Triggers: ${stats.triggers}`);
|
||||||
console.log(` Webhooks: ${stats.webhooks}`);
|
console.log(` Webhooks: ${stats.webhooks}`);
|
||||||
console.log(` With Properties: ${stats.withProperties}`);
|
console.log(` With Properties: ${stats.withProperties}`);
|
||||||
@@ -181,7 +165,6 @@ async function rebuild() {
|
|||||||
console.log('\n✨ Rebuild complete!');
|
console.log('\n✨ Rebuild complete!');
|
||||||
db.close();
|
db.close();
|
||||||
}
|
}
|
||||||
const MIN_EXPECTED_TOOL_VARIANTS = 200;
|
|
||||||
function validateDatabase(repository) {
|
function validateDatabase(repository) {
|
||||||
const issues = [];
|
const issues = [];
|
||||||
try {
|
try {
|
||||||
@@ -209,13 +192,6 @@ function validateDatabase(repository) {
|
|||||||
if (aiTools.length === 0) {
|
if (aiTools.length === 0) {
|
||||||
issues.push('No AI tools found - check detection logic');
|
issues.push('No AI tools found - check detection logic');
|
||||||
}
|
}
|
||||||
const toolVariantCount = repository.getToolVariantCount();
|
|
||||||
if (toolVariantCount === 0) {
|
|
||||||
issues.push('No Tool variants found - check ToolVariantGenerator');
|
|
||||||
}
|
|
||||||
else if (toolVariantCount < MIN_EXPECTED_TOOL_VARIANTS) {
|
|
||||||
issues.push(`Only ${toolVariantCount} Tool variants found - expected at least ${MIN_EXPECTED_TOOL_VARIANTS}`);
|
|
||||||
}
|
|
||||||
const ftsTableCheck = db.prepare(`
|
const ftsTableCheck = db.prepare(`
|
||||||
SELECT name FROM sqlite_master
|
SELECT name FROM sqlite_master
|
||||||
WHERE type='table' AND name='nodes_fts'
|
WHERE type='table' AND name='nodes_fts'
|
||||||
|
|||||||
2
dist/scripts/rebuild.js.map
vendored
2
dist/scripts/rebuild.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/services/config-validator.d.ts
vendored
4
dist/services/config-validator.d.ts
vendored
@@ -30,9 +30,7 @@ export declare class ConfigValidator {
|
|||||||
}>): ValidationResult[];
|
}>): ValidationResult[];
|
||||||
private static checkRequiredProperties;
|
private static checkRequiredProperties;
|
||||||
private static getPropertyVisibility;
|
private static getPropertyVisibility;
|
||||||
private static evaluateCondition;
|
protected static isPropertyVisible(prop: any, config: Record<string, any>): boolean;
|
||||||
private static valueMatches;
|
|
||||||
static isPropertyVisible(prop: any, config: Record<string, any>): boolean;
|
|
||||||
private static validatePropertyTypes;
|
private static validatePropertyTypes;
|
||||||
private static performNodeSpecificValidation;
|
private static performNodeSpecificValidation;
|
||||||
private static validateHttpRequest;
|
private static validateHttpRequest;
|
||||||
|
|||||||
2
dist/services/config-validator.d.ts.map
vendored
2
dist/services/config-validator.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"config-validator.d.ts","sourceRoot":"","sources":["../../src/services/config-validator.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,kBAAkB,GAAG,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,uBAAuB,GAAG,cAAc,CAAC;IACxH,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,gBAAgB,GAAG,YAAY,GAAG,aAAa,GAAG,UAAU,GAAG,eAAe,GAAG,eAAe,CAAC;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,eAAe;IAI1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAA4C;IAKjF,MAAM,CAAC,QAAQ,CACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,UAAU,EAAE,GAAG,EAAE,EACjB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,gBAAgB;IAsDnB,MAAM,CAAC,aAAa,CAClB,OAAO,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,UAAU,EAAE,GAAG,EAAE,CAAC;KACnB,CAAC,GACD,gBAAgB,EAAE;IASrB,OAAO,CAAC,MAAM,CAAC,uBAAuB;IA0CtC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAsBpC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgDhC,OAAO,CAAC,MAAM,CAAC,YAAY;WAab,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IA2ChF,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAoIpC,OAAO,CAAC,MAAM,CAAC,6BAA6B;IA+B5C,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAoElC,OAAO,CAAC,MAAM,CAAC,eAAe;IAc9B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAoC/B,OAAO,CAAC,MAAM,CAAC,YAAY;IAyC3B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgEhC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAmCpC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA6BvC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA4CvC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAgEnC,OAAO,CAAC,MAAM,CAAC,uBAAuB;CAmOvC"}
|
{"version":3,"file":"config-validator.d.ts","sourceRoot":"","sources":["../../src/services/config-validator.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,kBAAkB,GAAG,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,uBAAuB,GAAG,cAAc,CAAC;IACxH,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,gBAAgB,GAAG,YAAY,GAAG,aAAa,GAAG,UAAU,GAAG,eAAe,GAAG,eAAe,CAAC;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,eAAe;IAI1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAA4C;IAKjF,MAAM,CAAC,QAAQ,CACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,UAAU,EAAE,GAAG,EAAE,EACjB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,gBAAgB;IAsDnB,MAAM,CAAC,aAAa,CAClB,OAAO,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,UAAU,EAAE,GAAG,EAAE,CAAC;KACnB,CAAC,GACD,gBAAgB,EAAE;IASrB,OAAO,CAAC,MAAM,CAAC,uBAAuB;IA0CtC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAqBpC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IAiCnF,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAoIpC,OAAO,CAAC,MAAM,CAAC,6BAA6B;IA+B5C,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAoElC,OAAO,CAAC,MAAM,CAAC,eAAe;IAc9B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAoC/B,OAAO,CAAC,MAAM,CAAC,YAAY;IAyC3B,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgEhC,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAmCpC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA6BvC,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA4CvC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAgEnC,OAAO,CAAC,MAAM,CAAC,uBAAuB;CAmOvC"}
|
||||||
57
dist/services/config-validator.js
vendored
57
dist/services/config-validator.js
vendored
@@ -83,57 +83,6 @@ class ConfigValidator {
|
|||||||
}
|
}
|
||||||
return { visible, hidden };
|
return { visible, hidden };
|
||||||
}
|
}
|
||||||
static evaluateCondition(condition, configValue) {
|
|
||||||
const cnd = condition._cnd;
|
|
||||||
if ('eq' in cnd)
|
|
||||||
return configValue === cnd.eq;
|
|
||||||
if ('not' in cnd)
|
|
||||||
return configValue !== cnd.not;
|
|
||||||
if ('gte' in cnd)
|
|
||||||
return configValue >= cnd.gte;
|
|
||||||
if ('lte' in cnd)
|
|
||||||
return configValue <= cnd.lte;
|
|
||||||
if ('gt' in cnd)
|
|
||||||
return configValue > cnd.gt;
|
|
||||||
if ('lt' in cnd)
|
|
||||||
return configValue < cnd.lt;
|
|
||||||
if ('between' in cnd) {
|
|
||||||
const between = cnd.between;
|
|
||||||
if (!between || typeof between.from === 'undefined' || typeof between.to === 'undefined') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return configValue >= between.from && configValue <= between.to;
|
|
||||||
}
|
|
||||||
if ('startsWith' in cnd) {
|
|
||||||
return typeof configValue === 'string' && configValue.startsWith(cnd.startsWith);
|
|
||||||
}
|
|
||||||
if ('endsWith' in cnd) {
|
|
||||||
return typeof configValue === 'string' && configValue.endsWith(cnd.endsWith);
|
|
||||||
}
|
|
||||||
if ('includes' in cnd) {
|
|
||||||
return typeof configValue === 'string' && configValue.includes(cnd.includes);
|
|
||||||
}
|
|
||||||
if ('regex' in cnd) {
|
|
||||||
if (typeof configValue !== 'string')
|
|
||||||
return false;
|
|
||||||
try {
|
|
||||||
return new RegExp(cnd.regex).test(configValue);
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ('exists' in cnd) {
|
|
||||||
return configValue !== undefined && configValue !== null;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
static valueMatches(expectedValue, configValue) {
|
|
||||||
if (expectedValue && typeof expectedValue === 'object' && '_cnd' in expectedValue) {
|
|
||||||
return this.evaluateCondition(expectedValue, configValue);
|
|
||||||
}
|
|
||||||
return configValue === expectedValue;
|
|
||||||
}
|
|
||||||
static isPropertyVisible(prop, config) {
|
static isPropertyVisible(prop, config) {
|
||||||
if (!prop.displayOptions)
|
if (!prop.displayOptions)
|
||||||
return true;
|
return true;
|
||||||
@@ -141,8 +90,7 @@ class ConfigValidator {
|
|||||||
for (const [key, values] of Object.entries(prop.displayOptions.show)) {
|
for (const [key, values] of Object.entries(prop.displayOptions.show)) {
|
||||||
const configValue = config[key];
|
const configValue = config[key];
|
||||||
const expectedValues = Array.isArray(values) ? values : [values];
|
const expectedValues = Array.isArray(values) ? values : [values];
|
||||||
const anyMatch = expectedValues.some(expected => this.valueMatches(expected, configValue));
|
if (!expectedValues.includes(configValue)) {
|
||||||
if (!anyMatch) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,8 +99,7 @@ class ConfigValidator {
|
|||||||
for (const [key, values] of Object.entries(prop.displayOptions.hide)) {
|
for (const [key, values] of Object.entries(prop.displayOptions.hide)) {
|
||||||
const configValue = config[key];
|
const configValue = config[key];
|
||||||
const expectedValues = Array.isArray(values) ? values : [values];
|
const expectedValues = Array.isArray(values) ? values : [values];
|
||||||
const anyMatch = expectedValues.some(expected => this.valueMatches(expected, configValue));
|
if (expectedValues.includes(configValue)) {
|
||||||
if (anyMatch) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
dist/services/config-validator.js.map
vendored
2
dist/services/config-validator.js.map
vendored
File diff suppressed because one or more lines are too long
6
dist/services/execution-processor.d.ts
vendored
6
dist/services/execution-processor.d.ts
vendored
@@ -1,8 +1,8 @@
|
|||||||
import { Execution, ExecutionPreview, ExecutionRecommendation, ExecutionFilterOptions, FilteredExecutionResponse, Workflow } from '../types/n8n-api';
|
import { Execution, ExecutionPreview, ExecutionRecommendation, ExecutionFilterOptions, FilteredExecutionResponse } from '../types/n8n-api';
|
||||||
export declare function generatePreview(execution: Execution): {
|
export declare function generatePreview(execution: Execution): {
|
||||||
preview: ExecutionPreview;
|
preview: ExecutionPreview;
|
||||||
recommendation: ExecutionRecommendation;
|
recommendation: ExecutionRecommendation;
|
||||||
};
|
};
|
||||||
export declare function filterExecutionData(execution: Execution, options: ExecutionFilterOptions, workflow?: Workflow): FilteredExecutionResponse;
|
export declare function filterExecutionData(execution: Execution, options: ExecutionFilterOptions): FilteredExecutionResponse;
|
||||||
export declare function processExecution(execution: Execution, options?: ExecutionFilterOptions, workflow?: Workflow): FilteredExecutionResponse | Execution;
|
export declare function processExecution(execution: Execution, options?: ExecutionFilterOptions): FilteredExecutionResponse | Execution;
|
||||||
//# sourceMappingURL=execution-processor.d.ts.map
|
//# sourceMappingURL=execution-processor.d.ts.map
|
||||||
2
dist/services/execution-processor.d.ts.map
vendored
2
dist/services/execution-processor.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"execution-processor.d.ts","sourceRoot":"","sources":["../../src/services/execution-processor.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,SAAS,EAET,gBAAgB,EAEhB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EAGzB,QAAQ,EACT,MAAM,kBAAkB,CAAC;AAgH1B,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG;IACrD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,cAAc,EAAE,uBAAuB,CAAC;CACzC,CA2EA;AAoID,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,sBAAsB,EAC/B,QAAQ,CAAC,EAAE,QAAQ,GAClB,yBAAyB,CAsL3B;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,sBAA2B,EACpC,QAAQ,CAAC,EAAE,QAAQ,GAClB,yBAAyB,GAAG,SAAS,CAOvC"}
|
{"version":3,"file":"execution-processor.d.ts","sourceRoot":"","sources":["../../src/services/execution-processor.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,SAAS,EAET,gBAAgB,EAEhB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EAG1B,MAAM,kBAAkB,CAAC;AA+G1B,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG;IACrD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,cAAc,EAAE,uBAAuB,CAAC;CACzC,CA2EA;AAoID,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,sBAAsB,GAC9B,yBAAyB,CA2J3B;AAMD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,sBAA2B,GACnC,yBAAyB,GAAG,SAAS,CAOvC"}
|
||||||
28
dist/services/execution-processor.js
vendored
28
dist/services/execution-processor.js
vendored
@@ -4,7 +4,6 @@ exports.generatePreview = generatePreview;
|
|||||||
exports.filterExecutionData = filterExecutionData;
|
exports.filterExecutionData = filterExecutionData;
|
||||||
exports.processExecution = processExecution;
|
exports.processExecution = processExecution;
|
||||||
const logger_1 = require("../utils/logger");
|
const logger_1 = require("../utils/logger");
|
||||||
const error_execution_processor_1 = require("./error-execution-processor");
|
|
||||||
const THRESHOLDS = {
|
const THRESHOLDS = {
|
||||||
CHAR_SIZE_BYTES: 2,
|
CHAR_SIZE_BYTES: 2,
|
||||||
OVERHEAD_PER_OBJECT: 50,
|
OVERHEAD_PER_OBJECT: 50,
|
||||||
@@ -232,7 +231,7 @@ function truncateItems(items, limit) {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
function filterExecutionData(execution, options, workflow) {
|
function filterExecutionData(execution, options) {
|
||||||
const mode = options.mode || 'summary';
|
const mode = options.mode || 'summary';
|
||||||
let itemsLimit = options.itemsLimit !== undefined ? options.itemsLimit : 2;
|
let itemsLimit = options.itemsLimit !== undefined ? options.itemsLimit : 2;
|
||||||
if (itemsLimit !== -1) {
|
if (itemsLimit !== -1) {
|
||||||
@@ -266,27 +265,6 @@ function filterExecutionData(execution, options, workflow) {
|
|||||||
response.recommendation = recommendation;
|
response.recommendation = recommendation;
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
if (mode === 'error') {
|
|
||||||
const errorAnalysis = (0, error_execution_processor_1.processErrorExecution)(execution, {
|
|
||||||
itemsLimit: options.errorItemsLimit ?? 2,
|
|
||||||
includeStackTrace: options.includeStackTrace ?? false,
|
|
||||||
includeExecutionPath: options.includeExecutionPath !== false,
|
|
||||||
workflow
|
|
||||||
});
|
|
||||||
const runData = execution.data?.resultData?.runData || {};
|
|
||||||
const executedNodes = Object.keys(runData).length;
|
|
||||||
response.errorInfo = errorAnalysis;
|
|
||||||
response.summary = {
|
|
||||||
totalNodes: executedNodes,
|
|
||||||
executedNodes,
|
|
||||||
totalItems: 0,
|
|
||||||
hasMoreData: false
|
|
||||||
};
|
|
||||||
if (execution.data?.resultData?.error) {
|
|
||||||
response.error = execution.data.resultData.error;
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
if (!execution.data?.resultData?.runData) {
|
if (!execution.data?.resultData?.runData) {
|
||||||
response.summary = {
|
response.summary = {
|
||||||
totalNodes: 0,
|
totalNodes: 0,
|
||||||
@@ -372,10 +350,10 @@ function filterExecutionData(execution, options, workflow) {
|
|||||||
}
|
}
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
function processExecution(execution, options = {}, workflow) {
|
function processExecution(execution, options = {}) {
|
||||||
if (!options.mode && !options.nodeNames && options.itemsLimit === undefined) {
|
if (!options.mode && !options.nodeNames && options.itemsLimit === undefined) {
|
||||||
return execution;
|
return execution;
|
||||||
}
|
}
|
||||||
return filterExecutionData(execution, options, workflow);
|
return filterExecutionData(execution, options);
|
||||||
}
|
}
|
||||||
//# sourceMappingURL=execution-processor.js.map
|
//# sourceMappingURL=execution-processor.js.map
|
||||||
2
dist/services/execution-processor.js.map
vendored
2
dist/services/execution-processor.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/services/n8n-validation.d.ts.map
vendored
2
dist/services/n8n-validation.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"n8n-validation.d.ts","sourceRoot":"","sources":["../../src/services/n8n-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM9E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB7B,CAAC;AAkBH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAUpC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWjC,CAAC;AAGH,eAAO,MAAM,uBAAuB;;;;;;CAMnC,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAEhE;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,OAAO,GAAG,kBAAkB,CAEpF;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAElG;AAGD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBrF;AAiBD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoE5E;AAGD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,CA6P/E;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAK7D;AAMD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CA+F5E;AAMD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0D/E;AAGD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAmB/D;AAGD,wBAAgB,2BAA2B,IAAI,MAAM,CA6CpD;AAGD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmBpE"}
|
{"version":3,"file":"n8n-validation.d.ts","sourceRoot":"","sources":["../../src/services/n8n-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM9E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB7B,CAAC;AAkBH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAUpC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWjC,CAAC;AAGH,eAAO,MAAM,uBAAuB;;;;;;CAMnC,CAAC;AAGF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAEhE;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,OAAO,GAAG,kBAAkB,CAEpF;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAElG;AAGD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBrF;AAiBD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoE5E;AAGD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,CAyP/E;AAGD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAK7D;AAMD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CA+F5E;AAMD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA0D/E;AAGD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAmB/D;AAGD,wBAAgB,2BAA2B,IAAI,MAAM,CA6CpD;AAGD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAmBpE"}
|
||||||
37
dist/services/n8n-validation.js
vendored
37
dist/services/n8n-validation.js
vendored
@@ -152,23 +152,17 @@ function validateWorkflowStructure(workflow) {
|
|||||||
}
|
}
|
||||||
else if (connectionCount > 0 || executableNodes.length > 1) {
|
else if (connectionCount > 0 || executableNodes.length > 1) {
|
||||||
const connectedNodes = new Set();
|
const connectedNodes = new Set();
|
||||||
const ALL_CONNECTION_TYPES = ['main', 'error', 'ai_tool', 'ai_languageModel', 'ai_memory', 'ai_embedding', 'ai_vectorStore'];
|
|
||||||
Object.entries(workflow.connections).forEach(([sourceName, connection]) => {
|
Object.entries(workflow.connections).forEach(([sourceName, connection]) => {
|
||||||
connectedNodes.add(sourceName);
|
connectedNodes.add(sourceName);
|
||||||
ALL_CONNECTION_TYPES.forEach(connType => {
|
if (connection.main && Array.isArray(connection.main)) {
|
||||||
const connData = connection[connType];
|
connection.main.forEach((outputs) => {
|
||||||
if (connData && Array.isArray(connData)) {
|
if (Array.isArray(outputs)) {
|
||||||
connData.forEach((outputs) => {
|
outputs.forEach((target) => {
|
||||||
if (Array.isArray(outputs)) {
|
connectedNodes.add(target.node);
|
||||||
outputs.forEach((target) => {
|
});
|
||||||
if (target?.node) {
|
}
|
||||||
connectedNodes.add(target.node);
|
});
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
const disconnectedNodes = workflow.nodes.filter(node => {
|
const disconnectedNodes = workflow.nodes.filter(node => {
|
||||||
if ((0, node_classification_1.isNonExecutableNode)(node.type)) {
|
if ((0, node_classification_1.isNonExecutableNode)(node.type)) {
|
||||||
@@ -177,9 +171,7 @@ function validateWorkflowStructure(workflow) {
|
|||||||
const isConnected = connectedNodes.has(node.name);
|
const isConnected = connectedNodes.has(node.name);
|
||||||
const isNodeTrigger = (0, node_type_utils_1.isTriggerNode)(node.type);
|
const isNodeTrigger = (0, node_type_utils_1.isTriggerNode)(node.type);
|
||||||
if (isNodeTrigger) {
|
if (isNodeTrigger) {
|
||||||
const hasOutgoingConnections = !!workflow.connections?.[node.name];
|
return !workflow.connections?.[node.name];
|
||||||
const hasInboundConnections = isConnected;
|
|
||||||
return !hasOutgoingConnections && !hasInboundConnections;
|
|
||||||
}
|
}
|
||||||
return !isConnected;
|
return !isConnected;
|
||||||
});
|
});
|
||||||
@@ -225,9 +217,12 @@ function validateWorkflowStructure(workflow) {
|
|||||||
}
|
}
|
||||||
if (workflow.active === true && workflow.nodes && workflow.nodes.length > 0) {
|
if (workflow.active === true && workflow.nodes && workflow.nodes.length > 0) {
|
||||||
const activatableTriggers = workflow.nodes.filter(node => !node.disabled && (0, node_type_utils_1.isActivatableTrigger)(node.type));
|
const activatableTriggers = workflow.nodes.filter(node => !node.disabled && (0, node_type_utils_1.isActivatableTrigger)(node.type));
|
||||||
if (activatableTriggers.length === 0) {
|
const executeWorkflowTriggers = workflow.nodes.filter(node => !node.disabled && node.type.toLowerCase().includes('executeworkflow'));
|
||||||
errors.push('Cannot activate workflow: No activatable trigger nodes found. ' +
|
if (activatableTriggers.length === 0 && executeWorkflowTriggers.length > 0) {
|
||||||
'Workflows must have at least one enabled trigger node (webhook, schedule, executeWorkflowTrigger, etc.).');
|
const triggerNames = executeWorkflowTriggers.map(n => n.name).join(', ');
|
||||||
|
errors.push(`Cannot activate workflow with only Execute Workflow Trigger nodes (${triggerNames}). ` +
|
||||||
|
'Execute Workflow Trigger can only be invoked by other workflows, not activated. ' +
|
||||||
|
'Either deactivate the workflow or add a webhook/schedule/polling trigger.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (workflow.nodes && workflow.connections) {
|
if (workflow.nodes && workflow.connections) {
|
||||||
|
|||||||
2
dist/services/n8n-validation.js.map
vendored
2
dist/services/n8n-validation.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"node-similarity-service.d.ts","sourceRoot":"","sources":["../../src/services/node-similarity-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAI7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,qBAAqB;IAEhC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAM;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAK;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAa;gBAErB,UAAU,EAAE,cAAc;IAStC,OAAO,CAAC,wBAAwB;IAkDhC,OAAO,CAAC,yBAAyB;IAuB3B,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAiEzF,OAAO,CAAC,mBAAmB;IA0E3B,OAAO,CAAC,wBAAwB;IAuEhC,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,eAAe;YAgDT,cAAc;IAqCrB,eAAe,IAAI,IAAI;IAUjB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1C,uBAAuB,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IA8BnF,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO;IAQlD,UAAU,IAAI,IAAI;CAGnB"}
|
{"version":3,"file":"node-similarity-service.d.ts","sourceRoot":"","sources":["../../src/services/node-similarity-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,qBAAqB;IAEhC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAM;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAK;IAC/C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,cAAc,CAAsC;IAC5D,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAAa;gBAErB,UAAU,EAAE,cAAc;IAStC,OAAO,CAAC,wBAAwB;IAkDhC,OAAO,CAAC,yBAAyB;IAuB3B,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA8CzF,OAAO,CAAC,mBAAmB;IA0E3B,OAAO,CAAC,wBAAwB;IAuEhC,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,eAAe;YAgDT,cAAc;IAqCrB,eAAe,IAAI,IAAI;IAUjB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ1C,uBAAuB,CAAC,WAAW,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IA8BnF,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO;IAQlD,UAAU,IAAI,IAAI;CAGnB"}
|
||||||
17
dist/services/node-similarity-service.js
vendored
17
dist/services/node-similarity-service.js
vendored
@@ -2,7 +2,6 @@
|
|||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.NodeSimilarityService = void 0;
|
exports.NodeSimilarityService = void 0;
|
||||||
const logger_1 = require("../utils/logger");
|
const logger_1 = require("../utils/logger");
|
||||||
const tool_variant_generator_1 = require("./tool-variant-generator");
|
|
||||||
class NodeSimilarityService {
|
class NodeSimilarityService {
|
||||||
constructor(repository) {
|
constructor(repository) {
|
||||||
this.nodeCache = null;
|
this.nodeCache = null;
|
||||||
@@ -68,22 +67,6 @@ class NodeSimilarityService {
|
|||||||
if (!invalidType || invalidType.trim() === '') {
|
if (!invalidType || invalidType.trim() === '') {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
if (tool_variant_generator_1.ToolVariantGenerator.isToolVariantNodeType(invalidType)) {
|
|
||||||
const baseNodeType = tool_variant_generator_1.ToolVariantGenerator.getBaseNodeType(invalidType);
|
|
||||||
if (baseNodeType) {
|
|
||||||
const baseNode = this.repository.getNode(baseNodeType);
|
|
||||||
if (baseNode) {
|
|
||||||
return [{
|
|
||||||
nodeType: invalidType,
|
|
||||||
displayName: `${baseNode.displayName} Tool`,
|
|
||||||
confidence: 0.98,
|
|
||||||
reason: `Dynamic AI Tool variant of ${baseNode.displayName}`,
|
|
||||||
category: baseNode.category,
|
|
||||||
description: 'Runtime-generated Tool variant for AI Agent integration'
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const suggestions = [];
|
const suggestions = [];
|
||||||
const mistakeSuggestion = this.checkCommonMistakes(invalidType);
|
const mistakeSuggestion = this.checkCommonMistakes(invalidType);
|
||||||
if (mistakeSuggestion) {
|
if (mistakeSuggestion) {
|
||||||
|
|||||||
2
dist/services/node-similarity-service.js.map
vendored
2
dist/services/node-similarity-service.js.map
vendored
File diff suppressed because one or more lines are too long
3
dist/services/workflow-auto-fixer.d.ts
vendored
3
dist/services/workflow-auto-fixer.d.ts
vendored
@@ -5,7 +5,7 @@ import { WorkflowDiffOperation } from '../types/workflow-diff';
|
|||||||
import { Workflow } from '../types/n8n-api';
|
import { Workflow } from '../types/n8n-api';
|
||||||
import { PostUpdateGuidance } from './post-update-validator';
|
import { PostUpdateGuidance } from './post-update-validator';
|
||||||
export type FixConfidenceLevel = 'high' | 'medium' | 'low';
|
export type FixConfidenceLevel = 'high' | 'medium' | 'low';
|
||||||
export type FixType = 'expression-format' | 'typeversion-correction' | 'error-output-config' | 'node-type-correction' | 'webhook-missing-path' | 'typeversion-upgrade' | 'version-migration' | 'tool-variant-correction';
|
export type FixType = 'expression-format' | 'typeversion-correction' | 'error-output-config' | 'node-type-correction' | 'webhook-missing-path' | 'typeversion-upgrade' | 'version-migration';
|
||||||
export interface AutoFixConfig {
|
export interface AutoFixConfig {
|
||||||
applyFixes: boolean;
|
applyFixes: boolean;
|
||||||
fixTypes?: FixType[];
|
fixTypes?: FixType[];
|
||||||
@@ -62,7 +62,6 @@ export declare class WorkflowAutoFixer {
|
|||||||
private processErrorOutputFixes;
|
private processErrorOutputFixes;
|
||||||
private processNodeTypeFixes;
|
private processNodeTypeFixes;
|
||||||
private processWebhookPathFixes;
|
private processWebhookPathFixes;
|
||||||
private processToolVariantFixes;
|
|
||||||
private setNestedValue;
|
private setNestedValue;
|
||||||
private filterByConfidence;
|
private filterByConfidence;
|
||||||
private filterOperationsByFixes;
|
private filterOperationsByFixes;
|
||||||
|
|||||||
2
dist/services/workflow-auto-fixer.d.ts.map
vendored
2
dist/services/workflow-auto-fixer.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"workflow-auto-fixer.d.ts","sourceRoot":"","sources":["../../src/services/workflow-auto-fixer.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"workflow-auto-fixer.d.ts","sourceRoot":"","sources":["../../src/services/workflow-auto-fixer.ts"],"names":[],"mappings":"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"}
|
||||||
44
dist/services/workflow-auto-fixer.js
vendored
44
dist/services/workflow-auto-fixer.js
vendored
@@ -63,9 +63,6 @@ class WorkflowAutoFixer {
|
|||||||
if (!fullConfig.fixTypes || fullConfig.fixTypes.includes('webhook-missing-path')) {
|
if (!fullConfig.fixTypes || fullConfig.fixTypes.includes('webhook-missing-path')) {
|
||||||
this.processWebhookPathFixes(validationResult, nodeMap, operations, fixes);
|
this.processWebhookPathFixes(validationResult, nodeMap, operations, fixes);
|
||||||
}
|
}
|
||||||
if (!fullConfig.fixTypes || fullConfig.fixTypes.includes('tool-variant-correction')) {
|
|
||||||
this.processToolVariantFixes(validationResult, nodeMap, workflow, operations, fixes);
|
|
||||||
}
|
|
||||||
if (!fullConfig.fixTypes || fullConfig.fixTypes.includes('typeversion-upgrade')) {
|
if (!fullConfig.fixTypes || fullConfig.fixTypes.includes('typeversion-upgrade')) {
|
||||||
await this.processVersionUpgradeFixes(workflow, nodeMap, operations, fixes, postUpdateGuidance);
|
await this.processVersionUpgradeFixes(workflow, nodeMap, operations, fixes, postUpdateGuidance);
|
||||||
}
|
}
|
||||||
@@ -270,41 +267,6 @@ class WorkflowAutoFixer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
processToolVariantFixes(validationResult, nodeMap, _workflow, operations, fixes) {
|
|
||||||
for (const error of validationResult.errors) {
|
|
||||||
if (error.code !== 'WRONG_NODE_TYPE_FOR_AI_TOOL' || !error.fix) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const fix = error.fix;
|
|
||||||
if (fix.type !== 'tool-variant-correction') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const nodeName = error.nodeName || error.nodeId;
|
|
||||||
if (!nodeName)
|
|
||||||
continue;
|
|
||||||
const node = nodeMap.get(nodeName);
|
|
||||||
if (!node)
|
|
||||||
continue;
|
|
||||||
fixes.push({
|
|
||||||
node: nodeName,
|
|
||||||
field: 'type',
|
|
||||||
type: 'tool-variant-correction',
|
|
||||||
before: fix.currentType,
|
|
||||||
after: fix.suggestedType,
|
|
||||||
confidence: 'high',
|
|
||||||
description: fix.description || `Replace "${fix.currentType}" with Tool variant "${fix.suggestedType}"`
|
|
||||||
});
|
|
||||||
const operation = {
|
|
||||||
type: 'updateNode',
|
|
||||||
nodeId: nodeName,
|
|
||||||
updates: {
|
|
||||||
type: fix.suggestedType
|
|
||||||
}
|
|
||||||
};
|
|
||||||
operations.push(operation);
|
|
||||||
logger.info(`Generated tool variant correction for ${nodeName}: ${fix.currentType} → ${fix.suggestedType}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setNestedValue(obj, path, value) {
|
setNestedValue(obj, path, value) {
|
||||||
if (!obj || typeof obj !== 'object') {
|
if (!obj || typeof obj !== 'object') {
|
||||||
throw new Error('Cannot set value on non-object');
|
throw new Error('Cannot set value on non-object');
|
||||||
@@ -410,8 +372,7 @@ class WorkflowAutoFixer {
|
|||||||
'node-type-correction': 0,
|
'node-type-correction': 0,
|
||||||
'webhook-missing-path': 0,
|
'webhook-missing-path': 0,
|
||||||
'typeversion-upgrade': 0,
|
'typeversion-upgrade': 0,
|
||||||
'version-migration': 0,
|
'version-migration': 0
|
||||||
'tool-variant-correction': 0
|
|
||||||
},
|
},
|
||||||
byConfidence: {
|
byConfidence: {
|
||||||
'high': 0,
|
'high': 0,
|
||||||
@@ -451,9 +412,6 @@ class WorkflowAutoFixer {
|
|||||||
if (stats.byType['version-migration'] > 0) {
|
if (stats.byType['version-migration'] > 0) {
|
||||||
parts.push(`${stats.byType['version-migration']} version ${stats.byType['version-migration'] === 1 ? 'migration' : 'migrations'}`);
|
parts.push(`${stats.byType['version-migration']} version ${stats.byType['version-migration'] === 1 ? 'migration' : 'migrations'}`);
|
||||||
}
|
}
|
||||||
if (stats.byType['tool-variant-correction'] > 0) {
|
|
||||||
parts.push(`${stats.byType['tool-variant-correction']} tool variant ${stats.byType['tool-variant-correction'] === 1 ? 'correction' : 'corrections'}`);
|
|
||||||
}
|
|
||||||
if (parts.length === 0) {
|
if (parts.length === 0) {
|
||||||
return `Fixed ${stats.total} ${stats.total === 1 ? 'issue' : 'issues'}`;
|
return `Fixed ${stats.total} ${stats.total === 1 ? 'issue' : 'issues'}`;
|
||||||
}
|
}
|
||||||
|
|||||||
2
dist/services/workflow-auto-fixer.js.map
vendored
2
dist/services/workflow-auto-fixer.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/services/workflow-diff-engine.js
vendored
2
dist/services/workflow-diff-engine.js
vendored
@@ -651,7 +651,7 @@ class WorkflowDiffEngine {
|
|||||||
validateActivateWorkflow(workflow, operation) {
|
validateActivateWorkflow(workflow, operation) {
|
||||||
const activatableTriggers = workflow.nodes.filter(node => !node.disabled && (0, node_type_utils_1.isActivatableTrigger)(node.type));
|
const activatableTriggers = workflow.nodes.filter(node => !node.disabled && (0, node_type_utils_1.isActivatableTrigger)(node.type));
|
||||||
if (activatableTriggers.length === 0) {
|
if (activatableTriggers.length === 0) {
|
||||||
return 'Cannot activate workflow: No activatable trigger nodes found. Workflows must have at least one enabled trigger node (webhook, schedule, executeWorkflowTrigger, etc.).';
|
return 'Cannot activate workflow: No activatable trigger nodes found. Workflows must have at least one enabled trigger node (webhook, schedule, email, etc.). Note: executeWorkflowTrigger cannot activate workflows as they can only be invoked by other workflows.';
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
2
dist/services/workflow-diff-engine.js.map
vendored
2
dist/services/workflow-diff-engine.js.map
vendored
File diff suppressed because one or more lines are too long
10
dist/services/workflow-validator.d.ts
vendored
10
dist/services/workflow-validator.d.ts
vendored
@@ -47,19 +47,12 @@ interface WorkflowJson {
|
|||||||
pinData?: any;
|
pinData?: any;
|
||||||
meta?: any;
|
meta?: any;
|
||||||
}
|
}
|
||||||
export interface ValidationIssue {
|
interface ValidationIssue {
|
||||||
type: 'error' | 'warning';
|
type: 'error' | 'warning';
|
||||||
nodeId?: string;
|
nodeId?: string;
|
||||||
nodeName?: string;
|
nodeName?: string;
|
||||||
message: string;
|
message: string;
|
||||||
details?: any;
|
details?: any;
|
||||||
code?: string;
|
|
||||||
fix?: {
|
|
||||||
type: string;
|
|
||||||
currentType?: string;
|
|
||||||
suggestedType?: string;
|
|
||||||
description?: string;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
export interface WorkflowValidationResult {
|
export interface WorkflowValidationResult {
|
||||||
valid: boolean;
|
valid: boolean;
|
||||||
@@ -93,7 +86,6 @@ export declare class WorkflowValidator {
|
|||||||
private validateConnectionOutputs;
|
private validateConnectionOutputs;
|
||||||
private validateErrorOutputConfiguration;
|
private validateErrorOutputConfiguration;
|
||||||
private validateAIToolConnection;
|
private validateAIToolConnection;
|
||||||
private validateAIToolSource;
|
|
||||||
private hasCycle;
|
private hasCycle;
|
||||||
private validateExpressions;
|
private validateExpressions;
|
||||||
private countExpressionsInObject;
|
private countExpressionsInObject;
|
||||||
|
|||||||
2
dist/services/workflow-validator.d.ts.map
vendored
2
dist/services/workflow-validator.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"workflow-validator.d.ts","sourceRoot":"","sources":["../../src/services/workflow-validator.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"workflow-validator.d.ts","sourceRoot":"","sources":["../../src/services/workflow-validator.ts"],"names":[],"mappings":"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"}
|
||||||
83
dist/services/workflow-validator.js
vendored
83
dist/services/workflow-validator.js
vendored
@@ -11,10 +11,8 @@ const node_similarity_service_1 = require("./node-similarity-service");
|
|||||||
const node_type_normalizer_1 = require("../utils/node-type-normalizer");
|
const node_type_normalizer_1 = require("../utils/node-type-normalizer");
|
||||||
const logger_1 = require("../utils/logger");
|
const logger_1 = require("../utils/logger");
|
||||||
const ai_node_validator_1 = require("./ai-node-validator");
|
const ai_node_validator_1 = require("./ai-node-validator");
|
||||||
const ai_tool_validators_1 = require("./ai-tool-validators");
|
|
||||||
const node_type_utils_1 = require("../utils/node-type-utils");
|
const node_type_utils_1 = require("../utils/node-type-utils");
|
||||||
const node_classification_1 = require("../utils/node-classification");
|
const node_classification_1 = require("../utils/node-classification");
|
||||||
const tool_variant_generator_1 = require("./tool-variant-generator");
|
|
||||||
const logger = new logger_1.Logger({ prefix: '[WorkflowValidator]' });
|
const logger = new logger_1.Logger({ prefix: '[WorkflowValidator]' });
|
||||||
class WorkflowValidator {
|
class WorkflowValidator {
|
||||||
constructor(nodeRepository, nodeValidator) {
|
constructor(nodeRepository, nodeValidator) {
|
||||||
@@ -236,31 +234,7 @@ class WorkflowValidator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const normalizedType = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(node.type);
|
const normalizedType = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(node.type);
|
||||||
let nodeInfo = this.nodeRepository.getNode(normalizedType);
|
const nodeInfo = this.nodeRepository.getNode(normalizedType);
|
||||||
if (!nodeInfo && tool_variant_generator_1.ToolVariantGenerator.isToolVariantNodeType(normalizedType)) {
|
|
||||||
const baseNodeType = tool_variant_generator_1.ToolVariantGenerator.getBaseNodeType(normalizedType);
|
|
||||||
if (baseNodeType) {
|
|
||||||
const baseNodeInfo = this.nodeRepository.getNode(baseNodeType);
|
|
||||||
if (baseNodeInfo) {
|
|
||||||
result.warnings.push({
|
|
||||||
type: 'warning',
|
|
||||||
nodeId: node.id,
|
|
||||||
nodeName: node.name,
|
|
||||||
message: `Node type "${node.type}" is inferred as a dynamic AI Tool variant of "${baseNodeType}". ` +
|
|
||||||
`This Tool variant is created by n8n at runtime when connecting "${baseNodeInfo.displayName}" to an AI Agent.`,
|
|
||||||
code: 'INFERRED_TOOL_VARIANT'
|
|
||||||
});
|
|
||||||
nodeInfo = {
|
|
||||||
...baseNodeInfo,
|
|
||||||
nodeType: normalizedType,
|
|
||||||
displayName: `${baseNodeInfo.displayName} Tool`,
|
|
||||||
isToolVariant: true,
|
|
||||||
toolVariantOf: baseNodeType,
|
|
||||||
isInferred: true
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!nodeInfo) {
|
if (!nodeInfo) {
|
||||||
const suggestions = await this.similarityService.findSimilarNodes(node.type, 3);
|
const suggestions = await this.similarityService.findSimilarNodes(node.type, 3);
|
||||||
let message = `Unknown node type: "${node.type}".`;
|
let message = `Unknown node type: "${node.type}".`;
|
||||||
@@ -334,14 +308,7 @@ class WorkflowValidator {
|
|||||||
if (normalizedType.startsWith('nodes-langchain.')) {
|
if (normalizedType.startsWith('nodes-langchain.')) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (nodeInfo.isInferred) {
|
const nodeValidation = this.nodeValidator.validateWithMode(node.type, node.parameters, nodeInfo.properties || [], 'operation', profile);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const paramsWithVersion = {
|
|
||||||
'@version': node.typeVersion || 1,
|
|
||||||
...node.parameters
|
|
||||||
};
|
|
||||||
const nodeValidation = this.nodeValidator.validateWithMode(node.type, paramsWithVersion, nodeInfo.properties || [], 'operation', profile);
|
|
||||||
nodeValidation.errors.forEach((error) => {
|
nodeValidation.errors.forEach((error) => {
|
||||||
result.errors.push({
|
result.errors.push({
|
||||||
type: 'error',
|
type: 'error',
|
||||||
@@ -400,7 +367,6 @@ class WorkflowValidator {
|
|||||||
this.validateConnectionOutputs(sourceName, outputs.error, nodeMap, nodeIdMap, result, 'error');
|
this.validateConnectionOutputs(sourceName, outputs.error, nodeMap, nodeIdMap, result, 'error');
|
||||||
}
|
}
|
||||||
if (outputs.ai_tool) {
|
if (outputs.ai_tool) {
|
||||||
this.validateAIToolSource(sourceNode, result);
|
|
||||||
this.validateConnectionOutputs(sourceName, outputs.ai_tool, nodeMap, nodeIdMap, result, 'ai_tool');
|
this.validateConnectionOutputs(sourceName, outputs.ai_tool, nodeMap, nodeIdMap, result, 'ai_tool');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -589,51 +555,6 @@ class WorkflowValidator {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
validateAIToolSource(sourceNode, result) {
|
|
||||||
const normalizedType = node_type_normalizer_1.NodeTypeNormalizer.normalizeToFullForm(sourceNode.type);
|
|
||||||
if ((0, ai_tool_validators_1.isAIToolSubNode)(normalizedType)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const nodeInfo = this.nodeRepository.getNode(normalizedType);
|
|
||||||
if (tool_variant_generator_1.ToolVariantGenerator.isToolVariantNodeType(normalizedType)) {
|
|
||||||
if (nodeInfo?.isToolVariant) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!nodeInfo) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (nodeInfo.hasToolVariant) {
|
|
||||||
const toolVariantType = tool_variant_generator_1.ToolVariantGenerator.getToolVariantNodeType(normalizedType);
|
|
||||||
const workflowToolVariantType = node_type_normalizer_1.NodeTypeNormalizer.toWorkflowFormat(toolVariantType);
|
|
||||||
result.errors.push({
|
|
||||||
type: 'error',
|
|
||||||
nodeId: sourceNode.id,
|
|
||||||
nodeName: sourceNode.name,
|
|
||||||
message: `Node "${sourceNode.name}" uses "${sourceNode.type}" which cannot output ai_tool connections. ` +
|
|
||||||
`Use the Tool variant "${workflowToolVariantType}" instead for AI Agent integration.`,
|
|
||||||
code: 'WRONG_NODE_TYPE_FOR_AI_TOOL',
|
|
||||||
fix: {
|
|
||||||
type: 'tool-variant-correction',
|
|
||||||
currentType: sourceNode.type,
|
|
||||||
suggestedType: workflowToolVariantType,
|
|
||||||
description: `Change node type from "${sourceNode.type}" to "${workflowToolVariantType}"`
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (nodeInfo.isAITool) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
result.errors.push({
|
|
||||||
type: 'error',
|
|
||||||
nodeId: sourceNode.id,
|
|
||||||
nodeName: sourceNode.name,
|
|
||||||
message: `Node "${sourceNode.name}" of type "${sourceNode.type}" cannot output ai_tool connections. ` +
|
|
||||||
`Only AI tool nodes (e.g., Calculator, HTTP Request Tool) or Tool variants (e.g., *Tool suffix nodes) can be connected to AI Agents as tools.`,
|
|
||||||
code: 'INVALID_AI_TOOL_SOURCE'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
hasCycle(workflow) {
|
hasCycle(workflow) {
|
||||||
const visited = new Set();
|
const visited = new Set();
|
||||||
const recursionStack = new Set();
|
const recursionStack = new Set();
|
||||||
|
|||||||
2
dist/services/workflow-validator.js.map
vendored
2
dist/services/workflow-validator.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/telemetry/batch-processor.d.ts.map
vendored
2
dist/telemetry/batch-processor.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"batch-processor.d.ts","sourceRoot":"","sources":["../../src/telemetry/batch-processor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,EAAoB,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAoClI,qBAAa,uBAAuB;IAoBhC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IApBnB,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,OAAO,CAQb;IACF,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,eAAe,CAAuE;IAC9F,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAO;gBAG/B,QAAQ,EAAE,cAAc,GAAG,IAAI,EAC/B,SAAS,EAAE,MAAM,OAAO;IAQlC,KAAK,IAAI,IAAI;IA+Bb,IAAI,IAAI,IAAI;IAWN,KAAK,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,EAAE,SAAS,CAAC,EAAE,iBAAiB,EAAE,EAAE,SAAS,CAAC,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAgD9G,WAAW;YAmDX,cAAc;YAuDd,cAAc;YAiEd,gBAAgB;IAgD9B,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,oBAAoB;YAmBd,sBAAsB;IAgCpC,OAAO,CAAC,eAAe;IAiBvB,UAAU,IAAI,gBAAgB,GAAG;QAAE,mBAAmB,EAAE,GAAG,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE;IAW1F,YAAY,IAAI,IAAI;CAarB"}
|
{"version":3,"file":"batch-processor.d.ts","sourceRoot":"","sources":["../../src/telemetry/batch-processor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,sBAAsB,EAAoB,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAyBlI,qBAAa,uBAAuB;IAoBhC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IApBnB,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,OAAO,CAQb;IACF,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,eAAe,CAAuE;IAC9F,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAO;gBAG/B,QAAQ,EAAE,cAAc,GAAG,IAAI,EAC/B,SAAS,EAAE,MAAM,OAAO;IAQlC,KAAK,IAAI,IAAI;IA+Bb,IAAI,IAAI,IAAI;IAWN,KAAK,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,EAAE,SAAS,CAAC,EAAE,iBAAiB,EAAE,EAAE,SAAS,CAAC,EAAE,sBAAsB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAgD9G,WAAW;YAmDX,cAAc;YAuDd,cAAc;YAiEd,gBAAgB;IAgD9B,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,oBAAoB;YAmBd,sBAAsB;IAgCpC,OAAO,CAAC,eAAe;IAiBvB,UAAU,IAAI,gBAAgB,GAAG;QAAE,mBAAmB,EAAE,GAAG,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE;IAW1F,YAAY,IAAI,IAAI;CAarB"}
|
||||||
20
dist/telemetry/batch-processor.js
vendored
20
dist/telemetry/batch-processor.js
vendored
@@ -4,13 +4,19 @@ exports.TelemetryBatchProcessor = void 0;
|
|||||||
const telemetry_types_1 = require("./telemetry-types");
|
const telemetry_types_1 = require("./telemetry-types");
|
||||||
const telemetry_error_1 = require("./telemetry-error");
|
const telemetry_error_1 = require("./telemetry-error");
|
||||||
const logger_1 = require("../utils/logger");
|
const logger_1 = require("../utils/logger");
|
||||||
function keyToSnakeCase(key) {
|
function toSnakeCase(obj) {
|
||||||
return key.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
|
if (obj === null || obj === undefined)
|
||||||
}
|
return obj;
|
||||||
function mutationToSupabaseFormat(mutation) {
|
if (Array.isArray(obj))
|
||||||
|
return obj.map(toSnakeCase);
|
||||||
|
if (typeof obj !== 'object')
|
||||||
|
return obj;
|
||||||
const result = {};
|
const result = {};
|
||||||
for (const [key, value] of Object.entries(mutation)) {
|
for (const key in obj) {
|
||||||
result[keyToSnakeCase(key)] = value;
|
if (obj.hasOwnProperty(key)) {
|
||||||
|
const snakeKey = key.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
|
||||||
|
result[snakeKey] = toSnakeCase(obj[key]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -179,7 +185,7 @@ class TelemetryBatchProcessor {
|
|||||||
const batches = this.createBatches(mutations, telemetry_types_1.TELEMETRY_CONFIG.MAX_BATCH_SIZE);
|
const batches = this.createBatches(mutations, telemetry_types_1.TELEMETRY_CONFIG.MAX_BATCH_SIZE);
|
||||||
for (const batch of batches) {
|
for (const batch of batches) {
|
||||||
const result = await this.executeWithRetry(async () => {
|
const result = await this.executeWithRetry(async () => {
|
||||||
const snakeCaseBatch = batch.map(mutation => mutationToSupabaseFormat(mutation));
|
const snakeCaseBatch = batch.map(mutation => toSnakeCase(mutation));
|
||||||
const { error } = await this.supabase
|
const { error } = await this.supabase
|
||||||
.from('workflow_mutations')
|
.from('workflow_mutations')
|
||||||
.insert(snakeCaseBatch);
|
.insert(snakeCaseBatch);
|
||||||
|
|||||||
2
dist/telemetry/batch-processor.js.map
vendored
2
dist/telemetry/batch-processor.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/telemetry/event-validator.d.ts
vendored
4
dist/telemetry/event-validator.d.ts
vendored
@@ -7,13 +7,13 @@ export declare const telemetryEventSchema: z.ZodObject<{
|
|||||||
created_at: z.ZodOptional<z.ZodString>;
|
created_at: z.ZodOptional<z.ZodString>;
|
||||||
}, "strip", z.ZodTypeAny, {
|
}, "strip", z.ZodTypeAny, {
|
||||||
properties: Record<string, any>;
|
properties: Record<string, any>;
|
||||||
event: string;
|
|
||||||
user_id: string;
|
user_id: string;
|
||||||
|
event: string;
|
||||||
created_at?: string | undefined;
|
created_at?: string | undefined;
|
||||||
}, {
|
}, {
|
||||||
properties: Record<string, unknown>;
|
properties: Record<string, unknown>;
|
||||||
event: string;
|
|
||||||
user_id: string;
|
user_id: string;
|
||||||
|
event: string;
|
||||||
created_at?: string | undefined;
|
created_at?: string | undefined;
|
||||||
}>;
|
}>;
|
||||||
export declare const workflowTelemetrySchema: z.ZodObject<{
|
export declare const workflowTelemetrySchema: z.ZodObject<{
|
||||||
|
|||||||
8
dist/types/index.d.ts
vendored
8
dist/types/index.d.ts
vendored
@@ -7,13 +7,6 @@ export interface MCPServerConfig {
|
|||||||
host: string;
|
host: string;
|
||||||
authToken?: string;
|
authToken?: string;
|
||||||
}
|
}
|
||||||
export interface ToolAnnotations {
|
|
||||||
title?: string;
|
|
||||||
readOnlyHint?: boolean;
|
|
||||||
destructiveHint?: boolean;
|
|
||||||
idempotentHint?: boolean;
|
|
||||||
openWorldHint?: boolean;
|
|
||||||
}
|
|
||||||
export interface ToolDefinition {
|
export interface ToolDefinition {
|
||||||
name: string;
|
name: string;
|
||||||
description: string;
|
description: string;
|
||||||
@@ -29,7 +22,6 @@ export interface ToolDefinition {
|
|||||||
required?: string[];
|
required?: string[];
|
||||||
additionalProperties?: boolean | Record<string, any>;
|
additionalProperties?: boolean | Record<string, any>;
|
||||||
};
|
};
|
||||||
annotations?: ToolAnnotations;
|
|
||||||
}
|
}
|
||||||
export interface ResourceDefinition {
|
export interface ResourceDefinition {
|
||||||
uri: string;
|
uri: string;
|
||||||
|
|||||||
2
dist/types/index.d.ts.map
vendored
2
dist/types/index.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,WAAW,eAAe;IAE9B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,oBAAoB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACtD,CAAC;IACF,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,oBAAoB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACtD,CAAC;IAEF,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ"}
|
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,oBAAoB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACtD,CAAC;IACF,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,oBAAoB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACtD,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;CACJ"}
|
||||||
41
dist/types/n8n-api.d.ts
vendored
41
dist/types/n8n-api.d.ts
vendored
@@ -267,7 +267,7 @@ export interface McpToolResponse {
|
|||||||
executionId?: string;
|
executionId?: string;
|
||||||
workflowId?: string;
|
workflowId?: string;
|
||||||
}
|
}
|
||||||
export type ExecutionMode = 'preview' | 'summary' | 'filtered' | 'full' | 'error';
|
export type ExecutionMode = 'preview' | 'summary' | 'filtered' | 'full';
|
||||||
export interface ExecutionPreview {
|
export interface ExecutionPreview {
|
||||||
totalNodes: number;
|
totalNodes: number;
|
||||||
executedNodes: number;
|
executedNodes: number;
|
||||||
@@ -296,9 +296,6 @@ export interface ExecutionFilterOptions {
|
|||||||
itemsLimit?: number;
|
itemsLimit?: number;
|
||||||
includeInputData?: boolean;
|
includeInputData?: boolean;
|
||||||
fieldsToInclude?: string[];
|
fieldsToInclude?: string[];
|
||||||
errorItemsLimit?: number;
|
|
||||||
includeStackTrace?: boolean;
|
|
||||||
includeExecutionPath?: boolean;
|
|
||||||
}
|
}
|
||||||
export interface FilteredExecutionResponse {
|
export interface FilteredExecutionResponse {
|
||||||
id: string;
|
id: string;
|
||||||
@@ -319,7 +316,6 @@ export interface FilteredExecutionResponse {
|
|||||||
};
|
};
|
||||||
nodes?: Record<string, FilteredNodeData>;
|
nodes?: Record<string, FilteredNodeData>;
|
||||||
error?: Record<string, unknown>;
|
error?: Record<string, unknown>;
|
||||||
errorInfo?: ErrorAnalysis;
|
|
||||||
}
|
}
|
||||||
export interface FilteredNodeData {
|
export interface FilteredNodeData {
|
||||||
executionTime?: number;
|
executionTime?: number;
|
||||||
@@ -337,39 +333,4 @@ export interface FilteredNodeData {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
export interface ErrorAnalysis {
|
|
||||||
primaryError: {
|
|
||||||
message: string;
|
|
||||||
errorType: string;
|
|
||||||
nodeName: string;
|
|
||||||
nodeType: string;
|
|
||||||
nodeId?: string;
|
|
||||||
nodeParameters?: Record<string, unknown>;
|
|
||||||
stackTrace?: string;
|
|
||||||
};
|
|
||||||
upstreamContext?: {
|
|
||||||
nodeName: string;
|
|
||||||
nodeType: string;
|
|
||||||
itemCount: number;
|
|
||||||
sampleItems: unknown[];
|
|
||||||
dataStructure: Record<string, unknown>;
|
|
||||||
};
|
|
||||||
executionPath?: Array<{
|
|
||||||
nodeName: string;
|
|
||||||
status: 'success' | 'error' | 'skipped';
|
|
||||||
itemCount: number;
|
|
||||||
executionTime?: number;
|
|
||||||
}>;
|
|
||||||
additionalErrors?: Array<{
|
|
||||||
nodeName: string;
|
|
||||||
message: string;
|
|
||||||
}>;
|
|
||||||
suggestions?: ErrorSuggestion[];
|
|
||||||
}
|
|
||||||
export interface ErrorSuggestion {
|
|
||||||
type: 'fix' | 'investigate' | 'workaround';
|
|
||||||
title: string;
|
|
||||||
description: string;
|
|
||||||
confidence: 'high' | 'medium' | 'low';
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=n8n-api.d.ts.map
|
//# sourceMappingURL=n8n-api.d.ts.map
|
||||||
2
dist/types/n8n-api.d.ts.map
vendored
2
dist/types/n8n-api.d.ts.map
vendored
File diff suppressed because one or more lines are too long
1
dist/utils/node-type-normalizer.d.ts
vendored
1
dist/utils/node-type-normalizer.d.ts
vendored
@@ -12,6 +12,5 @@ export declare class NodeTypeNormalizer {
|
|||||||
static normalizeWorkflowNodeTypes(workflow: any): any;
|
static normalizeWorkflowNodeTypes(workflow: any): any;
|
||||||
static isFullForm(type: string): boolean;
|
static isFullForm(type: string): boolean;
|
||||||
static isShortForm(type: string): boolean;
|
static isShortForm(type: string): boolean;
|
||||||
static toWorkflowFormat(type: string): string;
|
|
||||||
}
|
}
|
||||||
//# sourceMappingURL=node-type-normalizer.d.ts.map
|
//# sourceMappingURL=node-type-normalizer.d.ts.map
|
||||||
2
dist/utils/node-type-normalizer.d.ts.map
vendored
2
dist/utils/node-type-normalizer.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"node-type-normalizer.d.ts","sourceRoot":"","sources":["../../src/utils/node-type-normalizer.ts"],"names":[],"mappings":"AA2CA,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;CACzD;AAED,qBAAa,kBAAkB;IAyB7B,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAuChD,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,2BAA2B;IAkBtE,OAAO,CAAC,MAAM,CAAC,aAAa;IAuB5B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IA8B3D,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG;IAoBrD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAkBxC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAgCzC,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAgB9C"}
|
{"version":3,"file":"node-type-normalizer.d.ts","sourceRoot":"","sources":["../../src/utils/node-type-normalizer.ts"],"names":[],"mappings":"AA2CA,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;CACzD;AAED,qBAAa,kBAAkB;IAyB7B,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAuChD,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,2BAA2B;IAkBtE,OAAO,CAAC,MAAM,CAAC,aAAa;IAuB5B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IA8B3D,MAAM,CAAC,0BAA0B,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG;IAoBrD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAkBxC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAU1C"}
|
||||||
12
dist/utils/node-type-normalizer.js
vendored
12
dist/utils/node-type-normalizer.js
vendored
@@ -70,18 +70,6 @@ class NodeTypeNormalizer {
|
|||||||
return (type.startsWith('nodes-base.') ||
|
return (type.startsWith('nodes-base.') ||
|
||||||
type.startsWith('nodes-langchain.'));
|
type.startsWith('nodes-langchain.'));
|
||||||
}
|
}
|
||||||
static toWorkflowFormat(type) {
|
|
||||||
if (!type || typeof type !== 'string') {
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
if (type.startsWith('nodes-base.')) {
|
|
||||||
return type.replace(/^nodes-base\./, 'n8n-nodes-base.');
|
|
||||||
}
|
|
||||||
if (type.startsWith('nodes-langchain.')) {
|
|
||||||
return type.replace(/^nodes-langchain\./, '@n8n/n8n-nodes-langchain.');
|
|
||||||
}
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
exports.NodeTypeNormalizer = NodeTypeNormalizer;
|
exports.NodeTypeNormalizer = NodeTypeNormalizer;
|
||||||
//# sourceMappingURL=node-type-normalizer.js.map
|
//# sourceMappingURL=node-type-normalizer.js.map
|
||||||
2
dist/utils/node-type-normalizer.js.map
vendored
2
dist/utils/node-type-normalizer.js.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"node-type-normalizer.js","sourceRoot":"","sources":["../../src/utils/node-type-normalizer.ts"],"names":[],"mappings":";;;AAkDA,MAAa,kBAAkB;IAyB7B,MAAM,CAAC,mBAAmB,CAAC,IAAY;QACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,kBAAkB,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,kBAAkB,CAAC,CAAC;QACpE,CAAC;QAGD,OAAO,IAAI,CAAC;IACd,CAAC;IAoBD,MAAM,CAAC,oBAAoB,CAAC,IAAY;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAElD,OAAO;YACL,QAAQ;YACR,UAAU;YACV,aAAa,EAAE,QAAQ,KAAK,UAAU;YACtC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;SACxC,CAAC;IACJ,CAAC;IAQO,MAAM,CAAC,aAAa,CAAC,IAAY;QAEvC,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAAE,OAAO,MAAM,CAAC;QACxF,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;YAAE,OAAO,WAAW,CAAC;QACvJ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,WAAW,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAiBD,MAAM,CAAC,cAAc,CAAC,KAAe;QACnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAwBD,MAAM,CAAC,0BAA0B,CAAC,QAAa;QAC7C,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,OAAO;YACL,GAAG,QAAQ;YACX,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;gBACxC,GAAG,IAAI;gBACP,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;aAC1C,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAQD,MAAM,CAAC,UAAU,CAAC,IAAY;QAC5B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,CACL,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;YAClC,IAAI,CAAC,UAAU,CAAC,2BAA2B,CAAC;YAC5C,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,CACxC,CAAC;IACJ,CAAC;IAQD,MAAM,CAAC,WAAW,CAAC,IAAY;QAC7B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,CACL,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CACpC,CAAC;IACJ,CAAC;IAuBD,MAAM,CAAC,gBAAgB,CAAC,IAAY;QAClC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,2BAA2B,CAAC,CAAC;QACzE,CAAC;QAGD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA7ND,gDA6NC"}
|
{"version":3,"file":"node-type-normalizer.js","sourceRoot":"","sources":["../../src/utils/node-type-normalizer.ts"],"names":[],"mappings":"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"}
|
||||||
2
dist/utils/node-type-utils.d.ts.map
vendored
2
dist/utils/node-type-utils.d.ts.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"node-type-utils.d.ts","sourceRoot":"","sources":["../../src/utils/node-type-utils.ts"],"names":[],"mappings":"AAcA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AASD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAQ3F;AASD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASpD;AASD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS1D;AAKD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGhD;AAKD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAMD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAa3D;AAUD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB5D;AAkBD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAsBvD;AAqBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG9D;AAQD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiClE"}
|
{"version":3,"file":"node-type-utils.d.ts","sourceRoot":"","sources":["../../src/utils/node-type-utils.ts"],"names":[],"mappings":"AAcA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMtD;AASD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAQ3F;AASD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASpD;AASD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS1D;AAKD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGhD;AAKD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAMD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAa3D;AAUD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB5D;AAkBD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAsBvD;AAoBD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAW9D;AAQD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiClE"}
|
||||||
5
dist/utils/node-type-utils.js
vendored
5
dist/utils/node-type-utils.js
vendored
@@ -95,6 +95,11 @@ function isTriggerNode(nodeType) {
|
|||||||
return specificTriggers.includes(normalized);
|
return specificTriggers.includes(normalized);
|
||||||
}
|
}
|
||||||
function isActivatableTrigger(nodeType) {
|
function isActivatableTrigger(nodeType) {
|
||||||
|
const normalized = normalizeNodeType(nodeType);
|
||||||
|
const lowerType = normalized.toLowerCase();
|
||||||
|
if (lowerType.includes('executeworkflow')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return isTriggerNode(nodeType);
|
return isTriggerNode(nodeType);
|
||||||
}
|
}
|
||||||
function getTriggerTypeDescription(nodeType) {
|
function getTriggerTypeDescription(nodeType) {
|
||||||
|
|||||||
2
dist/utils/node-type-utils.js.map
vendored
2
dist/utils/node-type-utils.js.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"node-type-utils.js","sourceRoot":"","sources":["../../src/utils/node-type-utils.ts"],"names":[],"mappings":"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"}
|
{"version":3,"file":"node-type-utils.js","sourceRoot":"","sources":["../../src/utils/node-type-utils.ts"],"names":[],"mappings":"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"}
|
||||||
@@ -12,8 +12,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
# Mode configuration
|
# Mode configuration
|
||||||
MCP_MODE: ${MCP_MODE:-http}
|
MCP_MODE: ${MCP_MODE:-http}
|
||||||
# NOTE: USE_FIXED_HTTP is deprecated. SingleSessionHTTPServer is now the default.
|
USE_FIXED_HTTP: ${USE_FIXED_HTTP:-true} # Use fixed implementation for stability
|
||||||
# See: https://github.com/czlonkowski/n8n-mcp/issues/524
|
|
||||||
AUTH_TOKEN: ${AUTH_TOKEN:?AUTH_TOKEN is required for HTTP mode}
|
AUTH_TOKEN: ${AUTH_TOKEN:?AUTH_TOKEN is required for HTTP mode}
|
||||||
|
|
||||||
# Application settings
|
# Application settings
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ cd n8n-mcp
|
|||||||
# Create .env file with auth token
|
# Create .env file with auth token
|
||||||
cat > .env << EOF
|
cat > .env << EOF
|
||||||
AUTH_TOKEN=$(openssl rand -base64 32)
|
AUTH_TOKEN=$(openssl rand -base64 32)
|
||||||
|
USE_FIXED_HTTP=true
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Start the server
|
# Start the server
|
||||||
@@ -45,6 +46,7 @@ docker pull ghcr.io/czlonkowski/n8n-mcp:latest
|
|||||||
docker run -d \
|
docker run -d \
|
||||||
--name n8n-mcp \
|
--name n8n-mcp \
|
||||||
-e MCP_MODE=http \
|
-e MCP_MODE=http \
|
||||||
|
-e USE_FIXED_HTTP=true \
|
||||||
-e AUTH_TOKEN=your-secure-token \
|
-e AUTH_TOKEN=your-secure-token \
|
||||||
-p 3000:3000 \
|
-p 3000:3000 \
|
||||||
ghcr.io/czlonkowski/n8n-mcp:latest
|
ghcr.io/czlonkowski/n8n-mcp:latest
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ Claude Desktop → mcp-remote → https://your-server.com
|
|||||||
# 1. Create environment file
|
# 1. Create environment file
|
||||||
cat > .env << EOF
|
cat > .env << EOF
|
||||||
AUTH_TOKEN=$(openssl rand -base64 32)
|
AUTH_TOKEN=$(openssl rand -base64 32)
|
||||||
|
USE_FIXED_HTTP=true
|
||||||
MCP_MODE=http
|
MCP_MODE=http
|
||||||
PORT=3000
|
PORT=3000
|
||||||
# Optional: Enable n8n management tools
|
# Optional: Enable n8n management tools
|
||||||
@@ -105,6 +106,7 @@ npm run rebuild
|
|||||||
|
|
||||||
# 2. Configure environment
|
# 2. Configure environment
|
||||||
export MCP_MODE=http
|
export MCP_MODE=http
|
||||||
|
export USE_FIXED_HTTP=true # Important: Use fixed implementation
|
||||||
export AUTH_TOKEN=$(openssl rand -base64 32)
|
export AUTH_TOKEN=$(openssl rand -base64 32)
|
||||||
export PORT=3000
|
export PORT=3000
|
||||||
|
|
||||||
@@ -142,6 +144,7 @@ Skip HTTP entirely and use stdio mode directly:
|
|||||||
| Variable | Description | Example |
|
| Variable | Description | Example |
|
||||||
|----------|-------------|------|
|
|----------|-------------|------|
|
||||||
| `MCP_MODE` | Must be set to `http` | `http` |
|
| `MCP_MODE` | Must be set to `http` | `http` |
|
||||||
|
| `USE_FIXED_HTTP` | **Important**: Set to `true` for stable implementation | `true` |
|
||||||
| `AUTH_TOKEN` or `AUTH_TOKEN_FILE` | Authentication method | See security section |
|
| `AUTH_TOKEN` or `AUTH_TOKEN_FILE` | Authentication method | See security section |
|
||||||
|
|
||||||
### Optional Settings
|
### Optional Settings
|
||||||
@@ -414,6 +417,7 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
# Core configuration
|
# Core configuration
|
||||||
MCP_MODE: http
|
MCP_MODE: http
|
||||||
|
USE_FIXED_HTTP: true
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
|
|
||||||
# Security - Using file-based secret
|
# Security - Using file-based secret
|
||||||
@@ -496,6 +500,7 @@ WorkingDirectory=/opt/n8n-mcp
|
|||||||
# Use file-based secret
|
# Use file-based secret
|
||||||
Environment="AUTH_TOKEN_FILE=/etc/n8n-mcp/auth_token"
|
Environment="AUTH_TOKEN_FILE=/etc/n8n-mcp/auth_token"
|
||||||
Environment="MCP_MODE=http"
|
Environment="MCP_MODE=http"
|
||||||
|
Environment="USE_FIXED_HTTP=true"
|
||||||
Environment="NODE_ENV=production"
|
Environment="NODE_ENV=production"
|
||||||
Environment="TRUST_PROXY=1"
|
Environment="TRUST_PROXY=1"
|
||||||
Environment="BASE_URL=https://n8n-mcp.example.com"
|
Environment="BASE_URL=https://n8n-mcp.example.com"
|
||||||
@@ -767,8 +772,8 @@ sudo ufw status # Linux
|
|||||||
```
|
```
|
||||||
|
|
||||||
**"Stream is not readable":**
|
**"Stream is not readable":**
|
||||||
- This issue was fixed in v2.3.2+ with the SingleSessionHTTPServer
|
- Ensure `USE_FIXED_HTTP=true` is set
|
||||||
- No additional configuration needed
|
- Fixed in v2.3.2+
|
||||||
|
|
||||||
**Bridge script not working:**
|
**Bridge script not working:**
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ The fastest way to get n8n-MCP running:
|
|||||||
# Using Docker (recommended)
|
# Using Docker (recommended)
|
||||||
cat > .env << EOF
|
cat > .env << EOF
|
||||||
AUTH_TOKEN=$(openssl rand -base64 32)
|
AUTH_TOKEN=$(openssl rand -base64 32)
|
||||||
|
USE_FIXED_HTTP=true
|
||||||
EOF
|
EOF
|
||||||
docker compose up -d
|
docker compose up -d
|
||||||
```
|
```
|
||||||
@@ -48,6 +49,7 @@ docker compose up -d
|
|||||||
|
|
||||||
environment:
|
environment:
|
||||||
MCP_MODE: ${MCP_MODE:-http}
|
MCP_MODE: ${MCP_MODE:-http}
|
||||||
|
USE_FIXED_HTTP: ${USE_FIXED_HTTP:-true}
|
||||||
AUTH_TOKEN: ${AUTH_TOKEN:?AUTH_TOKEN is required}
|
AUTH_TOKEN: ${AUTH_TOKEN:?AUTH_TOKEN is required}
|
||||||
NODE_ENV: ${NODE_ENV:-production}
|
NODE_ENV: ${NODE_ENV:-production}
|
||||||
LOG_LEVEL: ${LOG_LEVEL:-info}
|
LOG_LEVEL: ${LOG_LEVEL:-info}
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ These are automatically set by the Railway template:
|
|||||||
|----------|--------------|-------------|
|
|----------|--------------|-------------|
|
||||||
| `AUTH_TOKEN` | `REPLACE_THIS...` | **⚠️ CHANGE IMMEDIATELY** |
|
| `AUTH_TOKEN` | `REPLACE_THIS...` | **⚠️ CHANGE IMMEDIATELY** |
|
||||||
| `MCP_MODE` | `http` | Required for cloud deployment |
|
| `MCP_MODE` | `http` | Required for cloud deployment |
|
||||||
|
| `USE_FIXED_HTTP` | `true` | Stable HTTP implementation |
|
||||||
| `NODE_ENV` | `production` | Production optimizations |
|
| `NODE_ENV` | `production` | Production optimizations |
|
||||||
| `LOG_LEVEL` | `info` | Balanced logging |
|
| `LOG_LEVEL` | `info` | Balanced logging |
|
||||||
| `TRUST_PROXY` | `1` | Railway runs behind proxy |
|
| `TRUST_PROXY` | `1` | Railway runs behind proxy |
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ Key configuration options:
|
|||||||
| Variable | Description | Default |
|
| Variable | Description | Default |
|
||||||
|----------|-------------|---------|
|
|----------|-------------|---------|
|
||||||
| `MCP_MODE` | Server mode: `stdio` or `http` | `stdio` |
|
| `MCP_MODE` | Server mode: `stdio` or `http` | `stdio` |
|
||||||
|
| `USE_FIXED_HTTP` | Use fixed HTTP implementation (v2.3.2+) | `true` |
|
||||||
| `AUTH_TOKEN` | Authentication token for HTTP mode | Required |
|
| `AUTH_TOKEN` | Authentication token for HTTP mode | Required |
|
||||||
| `PORT` | HTTP server port | `3000` |
|
| `PORT` | HTTP server port | `3000` |
|
||||||
| `LOG_LEVEL` | Logging verbosity | `info` |
|
| `LOG_LEVEL` | Logging verbosity | `info` |
|
||||||
|
|||||||
6135
package-lock.json
generated
6135
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
17
package.json
17
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "n8n-mcp",
|
"name": "n8n-mcp",
|
||||||
"version": "2.32.0",
|
"version": "2.28.7",
|
||||||
"description": "Integration between n8n workflow automation and Model Context Protocol (MCP)",
|
"description": "Integration between n8n workflow automation and Model Context Protocol (MCP)",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"types": "dist/index.d.ts",
|
"types": "dist/index.d.ts",
|
||||||
@@ -22,9 +22,9 @@
|
|||||||
"test-nodes": "node dist/scripts/test-nodes.js",
|
"test-nodes": "node dist/scripts/test-nodes.js",
|
||||||
"start": "node dist/mcp/index.js",
|
"start": "node dist/mcp/index.js",
|
||||||
"start:http": "MCP_MODE=http node dist/mcp/index.js",
|
"start:http": "MCP_MODE=http node dist/mcp/index.js",
|
||||||
"start:http:fixed:deprecated": "echo 'DEPRECATED: USE_FIXED_HTTP is deprecated. Use npm run start:http instead.' && MCP_MODE=http USE_FIXED_HTTP=true node dist/mcp/index.js",
|
"start:http:fixed": "MCP_MODE=http USE_FIXED_HTTP=true node dist/mcp/index.js",
|
||||||
"start:n8n": "N8N_MODE=true MCP_MODE=http node dist/mcp/index.js",
|
"start:n8n": "N8N_MODE=true MCP_MODE=http node dist/mcp/index.js",
|
||||||
"http": "npm run build && npm run start:http",
|
"http": "npm run build && npm run start:http:fixed",
|
||||||
"dev": "npm run build && npm run rebuild && npm run validate",
|
"dev": "npm run build && npm run rebuild && npm run validate",
|
||||||
"dev:http": "MCP_MODE=http nodemon --watch src --ext ts --exec 'npm run build && npm run start:http'",
|
"dev:http": "MCP_MODE=http nodemon --watch src --ext ts --exec 'npm run build && npm run start:http'",
|
||||||
"test:single-session": "./scripts/test-single-session.sh",
|
"test:single-session": "./scripts/test-single-session.sh",
|
||||||
@@ -50,9 +50,6 @@
|
|||||||
"fetch:templates:update": "node dist/scripts/fetch-templates.js --update",
|
"fetch:templates:update": "node dist/scripts/fetch-templates.js --update",
|
||||||
"fetch:templates:extract": "node dist/scripts/fetch-templates.js --extract-only",
|
"fetch:templates:extract": "node dist/scripts/fetch-templates.js --extract-only",
|
||||||
"fetch:templates:robust": "node dist/scripts/fetch-templates-robust.js",
|
"fetch:templates:robust": "node dist/scripts/fetch-templates-robust.js",
|
||||||
"fetch:community": "node dist/scripts/fetch-community-nodes.js",
|
|
||||||
"fetch:community:verified": "node dist/scripts/fetch-community-nodes.js --verified-only",
|
|
||||||
"fetch:community:update": "node dist/scripts/fetch-community-nodes.js --update",
|
|
||||||
"prebuild:fts5": "npx tsx scripts/prebuild-fts5.ts",
|
"prebuild:fts5": "npx tsx scripts/prebuild-fts5.ts",
|
||||||
"test:templates": "node dist/scripts/test-templates.js",
|
"test:templates": "node dist/scripts/test-templates.js",
|
||||||
"test:protocol-negotiation": "npx tsx src/scripts/test-protocol-negotiation.ts",
|
"test:protocol-negotiation": "npx tsx src/scripts/test-protocol-negotiation.ts",
|
||||||
@@ -144,16 +141,16 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@modelcontextprotocol/sdk": "1.20.1",
|
"@modelcontextprotocol/sdk": "1.20.1",
|
||||||
"@n8n/n8n-nodes-langchain": "^2.2.2",
|
"@n8n/n8n-nodes-langchain": "^1.121.1",
|
||||||
"@supabase/supabase-js": "^2.57.4",
|
"@supabase/supabase-js": "^2.57.4",
|
||||||
"dotenv": "^16.5.0",
|
"dotenv": "^16.5.0",
|
||||||
"express": "^5.1.0",
|
"express": "^5.1.0",
|
||||||
"express-rate-limit": "^7.1.5",
|
"express-rate-limit": "^7.1.5",
|
||||||
"form-data": "^4.0.5",
|
"form-data": "^4.0.5",
|
||||||
"lru-cache": "^11.2.1",
|
"lru-cache": "^11.2.1",
|
||||||
"n8n": "^2.2.3",
|
"n8n": "^1.122.4",
|
||||||
"n8n-core": "^2.2.2",
|
"n8n-core": "^1.121.1",
|
||||||
"n8n-workflow": "^2.2.2",
|
"n8n-workflow": "^1.119.1",
|
||||||
"openai": "^4.77.0",
|
"openai": "^4.77.0",
|
||||||
"sql.js": "^1.13.0",
|
"sql.js": "^1.13.0",
|
||||||
"tslib": "^2.6.2",
|
"tslib": "^2.6.2",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "n8n-mcp-runtime",
|
"name": "n8n-mcp-runtime",
|
||||||
"version": "2.29.5",
|
"version": "2.28.7",
|
||||||
"description": "n8n MCP Server Runtime Dependencies Only",
|
"description": "n8n MCP Server Runtime Dependencies Only",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -71,12 +71,10 @@ const testCases: TestCase[] = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// DEPRECATED: This test case tests the deprecated fixed HTTP implementation
|
name: 'Fixed HTTP implementation',
|
||||||
// See: https://github.com/czlonkowski/n8n-mcp/issues/524
|
|
||||||
name: 'Fixed HTTP implementation (DEPRECATED)',
|
|
||||||
env: {
|
env: {
|
||||||
MCP_MODE: 'http',
|
MCP_MODE: 'http',
|
||||||
USE_FIXED_HTTP: 'true', // DEPRECATED: Will be removed in future version
|
USE_FIXED_HTTP: 'true',
|
||||||
AUTH_TOKEN: 'test-token-for-testing-only',
|
AUTH_TOKEN: 'test-token-for-testing-only',
|
||||||
PORT: '3005',
|
PORT: '3005',
|
||||||
BASE_URL: 'https://fixed.example.com'
|
BASE_URL: 'https://fixed.example.com'
|
||||||
|
|||||||
@@ -1,422 +0,0 @@
|
|||||||
import axios, { AxiosError } from 'axios';
|
|
||||||
import { logger } from '../utils/logger';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configuration constants for community node fetching
|
|
||||||
*/
|
|
||||||
const FETCH_CONFIG = {
|
|
||||||
/** Default timeout for Strapi API requests (ms) */
|
|
||||||
STRAPI_TIMEOUT: 30000,
|
|
||||||
/** Default timeout for npm registry requests (ms) */
|
|
||||||
NPM_REGISTRY_TIMEOUT: 15000,
|
|
||||||
/** Default timeout for npm downloads API (ms) */
|
|
||||||
NPM_DOWNLOADS_TIMEOUT: 10000,
|
|
||||||
/** Base delay between retries (ms) */
|
|
||||||
RETRY_DELAY: 1000,
|
|
||||||
/** Maximum number of retry attempts */
|
|
||||||
MAX_RETRIES: 3,
|
|
||||||
/** Default delay between requests for rate limiting (ms) */
|
|
||||||
RATE_LIMIT_DELAY: 300,
|
|
||||||
/** Default delay after hitting 429 (ms) */
|
|
||||||
RATE_LIMIT_429_DELAY: 60000,
|
|
||||||
} as const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Strapi API response types for verified community nodes
|
|
||||||
*/
|
|
||||||
export interface StrapiCommunityNodeAttributes {
|
|
||||||
name: string;
|
|
||||||
displayName: string;
|
|
||||||
description: string;
|
|
||||||
packageName: string;
|
|
||||||
authorName: string;
|
|
||||||
authorGithubUrl?: string;
|
|
||||||
npmVersion: string;
|
|
||||||
numberOfDownloads: number;
|
|
||||||
numberOfStars: number;
|
|
||||||
isOfficialNode: boolean;
|
|
||||||
isPublished: boolean;
|
|
||||||
nodeDescription: any; // Complete n8n node schema
|
|
||||||
nodeVersions?: any[];
|
|
||||||
checksum?: string;
|
|
||||||
createdAt: string;
|
|
||||||
updatedAt: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StrapiCommunityNode {
|
|
||||||
id: number;
|
|
||||||
attributes: StrapiCommunityNodeAttributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StrapiPaginatedResponse<T> {
|
|
||||||
data: Array<{ id: number; attributes: T }>;
|
|
||||||
meta: {
|
|
||||||
pagination: {
|
|
||||||
page: number;
|
|
||||||
pageSize: number;
|
|
||||||
pageCount: number;
|
|
||||||
total: number;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* npm registry search response types
|
|
||||||
*/
|
|
||||||
export interface NpmPackageInfo {
|
|
||||||
name: string;
|
|
||||||
version: string;
|
|
||||||
description: string;
|
|
||||||
keywords: string[];
|
|
||||||
date: string;
|
|
||||||
links: {
|
|
||||||
npm: string;
|
|
||||||
homepage?: string;
|
|
||||||
repository?: string;
|
|
||||||
};
|
|
||||||
author?: {
|
|
||||||
name?: string;
|
|
||||||
email?: string;
|
|
||||||
username?: string;
|
|
||||||
};
|
|
||||||
publisher?: {
|
|
||||||
username: string;
|
|
||||||
email: string;
|
|
||||||
};
|
|
||||||
maintainers: Array<{ username: string; email: string }>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface NpmSearchResult {
|
|
||||||
package: NpmPackageInfo;
|
|
||||||
score: {
|
|
||||||
final: number;
|
|
||||||
detail: {
|
|
||||||
quality: number;
|
|
||||||
popularity: number;
|
|
||||||
maintenance: number;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
searchScore: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface NpmSearchResponse {
|
|
||||||
objects: NpmSearchResult[];
|
|
||||||
total: number;
|
|
||||||
time: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetches community nodes from n8n Strapi API and npm registry.
|
|
||||||
* Follows the pattern from template-fetcher.ts.
|
|
||||||
*/
|
|
||||||
export class CommunityNodeFetcher {
|
|
||||||
private readonly strapiBaseUrl: string;
|
|
||||||
private readonly npmSearchUrl = 'https://registry.npmjs.org/-/v1/search';
|
|
||||||
private readonly npmRegistryUrl = 'https://registry.npmjs.org';
|
|
||||||
private readonly maxRetries = FETCH_CONFIG.MAX_RETRIES;
|
|
||||||
private readonly retryDelay = FETCH_CONFIG.RETRY_DELAY;
|
|
||||||
private readonly strapiPageSize = 25;
|
|
||||||
private readonly npmPageSize = 250; // npm API max
|
|
||||||
|
|
||||||
/** Regex for validating npm package names per npm naming rules */
|
|
||||||
private readonly npmPackageNameRegex = /^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/;
|
|
||||||
|
|
||||||
constructor(environment: 'production' | 'staging' = 'production') {
|
|
||||||
this.strapiBaseUrl =
|
|
||||||
environment === 'production'
|
|
||||||
? 'https://api.n8n.io/api/community-nodes'
|
|
||||||
: 'https://api-staging.n8n.io/api/community-nodes';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates npm package name to prevent path traversal and injection attacks.
|
|
||||||
* @see https://github.com/npm/validate-npm-package-name
|
|
||||||
*/
|
|
||||||
private validatePackageName(packageName: string): boolean {
|
|
||||||
if (!packageName || typeof packageName !== 'string') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Max length per npm spec
|
|
||||||
if (packageName.length > 214) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Must match npm naming pattern
|
|
||||||
if (!this.npmPackageNameRegex.test(packageName)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Block path traversal attempts
|
|
||||||
if (packageName.includes('..') || packageName.includes('//')) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if an error is a rate limit (429) response
|
|
||||||
*/
|
|
||||||
private isRateLimitError(error: unknown): boolean {
|
|
||||||
return axios.isAxiosError(error) && error.response?.status === 429;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retry helper for API calls (same pattern as TemplateFetcher)
|
|
||||||
* Handles 429 rate limit responses with extended delay
|
|
||||||
*/
|
|
||||||
private async retryWithBackoff<T>(
|
|
||||||
fn: () => Promise<T>,
|
|
||||||
context: string,
|
|
||||||
maxRetries: number = this.maxRetries
|
|
||||||
): Promise<T | null> {
|
|
||||||
let lastError: unknown;
|
|
||||||
|
|
||||||
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
||||||
try {
|
|
||||||
return await fn();
|
|
||||||
} catch (error: unknown) {
|
|
||||||
lastError = error;
|
|
||||||
|
|
||||||
if (attempt < maxRetries) {
|
|
||||||
// Handle 429 rate limit with longer delay
|
|
||||||
if (this.isRateLimitError(error)) {
|
|
||||||
const delay = FETCH_CONFIG.RATE_LIMIT_429_DELAY;
|
|
||||||
logger.warn(
|
|
||||||
`${context} - Rate limited (429), waiting ${delay / 1000}s before retry...`
|
|
||||||
);
|
|
||||||
await this.sleep(delay);
|
|
||||||
} else {
|
|
||||||
const delay = this.retryDelay * attempt; // Exponential backoff
|
|
||||||
logger.warn(
|
|
||||||
`${context} - Attempt ${attempt}/${maxRetries} failed, retrying in ${delay}ms...`
|
|
||||||
);
|
|
||||||
await this.sleep(delay);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.error(`${context} - All ${maxRetries} attempts failed, skipping`, lastError);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch all verified community nodes from n8n Strapi API.
|
|
||||||
* These nodes include full nodeDescription schemas - no parsing needed!
|
|
||||||
*/
|
|
||||||
async fetchVerifiedNodes(
|
|
||||||
progressCallback?: (message: string, current: number, total: number) => void
|
|
||||||
): Promise<StrapiCommunityNode[]> {
|
|
||||||
const allNodes: StrapiCommunityNode[] = [];
|
|
||||||
let page = 1;
|
|
||||||
let hasMore = true;
|
|
||||||
let total = 0;
|
|
||||||
|
|
||||||
logger.info('Fetching verified community nodes from n8n Strapi API...');
|
|
||||||
|
|
||||||
while (hasMore) {
|
|
||||||
const result = await this.retryWithBackoff(
|
|
||||||
async () => {
|
|
||||||
const response = await axios.get<StrapiPaginatedResponse<StrapiCommunityNodeAttributes>>(
|
|
||||||
this.strapiBaseUrl,
|
|
||||||
{
|
|
||||||
params: {
|
|
||||||
'pagination[page]': page,
|
|
||||||
'pagination[pageSize]': this.strapiPageSize,
|
|
||||||
},
|
|
||||||
timeout: FETCH_CONFIG.STRAPI_TIMEOUT,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
return response.data;
|
|
||||||
},
|
|
||||||
`Fetching verified nodes page ${page}`
|
|
||||||
);
|
|
||||||
|
|
||||||
if (result === null) {
|
|
||||||
logger.warn(`Skipping page ${page} after failed attempts`);
|
|
||||||
page++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const nodes = result.data.map((item) => ({
|
|
||||||
id: item.id,
|
|
||||||
attributes: item.attributes,
|
|
||||||
}));
|
|
||||||
|
|
||||||
allNodes.push(...nodes);
|
|
||||||
total = result.meta.pagination.total;
|
|
||||||
|
|
||||||
if (progressCallback) {
|
|
||||||
progressCallback(`Fetching verified nodes`, allNodes.length, total);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.debug(
|
|
||||||
`Fetched page ${page}/${result.meta.pagination.pageCount}: ${nodes.length} nodes (total: ${allNodes.length}/${total})`
|
|
||||||
);
|
|
||||||
|
|
||||||
// Check if there are more pages
|
|
||||||
if (page >= result.meta.pagination.pageCount) {
|
|
||||||
hasMore = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
page++;
|
|
||||||
|
|
||||||
// Rate limiting
|
|
||||||
if (hasMore) {
|
|
||||||
await this.sleep(FETCH_CONFIG.RATE_LIMIT_DELAY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(`Fetched ${allNodes.length} verified community nodes from Strapi API`);
|
|
||||||
return allNodes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch popular community node packages from npm registry.
|
|
||||||
* Sorted by popularity (downloads). Returns package metadata only.
|
|
||||||
* To get node schemas, packages need to be downloaded and parsed.
|
|
||||||
*
|
|
||||||
* @param limit Maximum number of packages to fetch (default: 100)
|
|
||||||
*/
|
|
||||||
async fetchNpmPackages(
|
|
||||||
limit: number = 100,
|
|
||||||
progressCallback?: (message: string, current: number, total: number) => void
|
|
||||||
): Promise<NpmSearchResult[]> {
|
|
||||||
const allPackages: NpmSearchResult[] = [];
|
|
||||||
let offset = 0;
|
|
||||||
const targetLimit = Math.min(limit, 1000); // npm API practical limit
|
|
||||||
|
|
||||||
logger.info(`Fetching top ${targetLimit} community node packages from npm registry...`);
|
|
||||||
|
|
||||||
while (allPackages.length < targetLimit) {
|
|
||||||
const remaining = targetLimit - allPackages.length;
|
|
||||||
const size = Math.min(this.npmPageSize, remaining);
|
|
||||||
|
|
||||||
const result = await this.retryWithBackoff(
|
|
||||||
async () => {
|
|
||||||
const response = await axios.get<NpmSearchResponse>(this.npmSearchUrl, {
|
|
||||||
params: {
|
|
||||||
text: 'keywords:n8n-community-node-package',
|
|
||||||
size,
|
|
||||||
from: offset,
|
|
||||||
// Sort by popularity (downloads)
|
|
||||||
quality: 0,
|
|
||||||
popularity: 1,
|
|
||||||
maintenance: 0,
|
|
||||||
},
|
|
||||||
timeout: FETCH_CONFIG.STRAPI_TIMEOUT,
|
|
||||||
});
|
|
||||||
return response.data;
|
|
||||||
},
|
|
||||||
`Fetching npm packages (offset ${offset})`
|
|
||||||
);
|
|
||||||
|
|
||||||
if (result === null) {
|
|
||||||
logger.warn(`Skipping npm fetch at offset ${offset} after failed attempts`);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.objects.length === 0) {
|
|
||||||
break; // No more packages
|
|
||||||
}
|
|
||||||
|
|
||||||
allPackages.push(...result.objects);
|
|
||||||
|
|
||||||
if (progressCallback) {
|
|
||||||
progressCallback(`Fetching npm packages`, allPackages.length, Math.min(result.total, targetLimit));
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.debug(
|
|
||||||
`Fetched ${result.objects.length} packages (total: ${allPackages.length}/${Math.min(result.total, targetLimit)})`
|
|
||||||
);
|
|
||||||
|
|
||||||
offset += size;
|
|
||||||
|
|
||||||
// Rate limiting
|
|
||||||
await this.sleep(FETCH_CONFIG.RATE_LIMIT_DELAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort by popularity score (highest first)
|
|
||||||
allPackages.sort((a, b) => b.score.detail.popularity - a.score.detail.popularity);
|
|
||||||
|
|
||||||
logger.info(`Fetched ${allPackages.length} community node packages from npm`);
|
|
||||||
return allPackages.slice(0, limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch package.json for a specific npm package to get the n8n node configuration.
|
|
||||||
* Validates package name to prevent path traversal attacks.
|
|
||||||
*/
|
|
||||||
async fetchPackageJson(packageName: string, version?: string): Promise<any | null> {
|
|
||||||
// Validate package name to prevent path traversal
|
|
||||||
if (!this.validatePackageName(packageName)) {
|
|
||||||
logger.warn(`Invalid package name rejected: ${packageName}`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = version
|
|
||||||
? `${this.npmRegistryUrl}/${encodeURIComponent(packageName)}/${encodeURIComponent(version)}`
|
|
||||||
: `${this.npmRegistryUrl}/${encodeURIComponent(packageName)}/latest`;
|
|
||||||
|
|
||||||
return this.retryWithBackoff(
|
|
||||||
async () => {
|
|
||||||
const response = await axios.get(url, { timeout: FETCH_CONFIG.NPM_REGISTRY_TIMEOUT });
|
|
||||||
return response.data;
|
|
||||||
},
|
|
||||||
`Fetching package.json for ${packageName}${version ? `@${version}` : ''}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Download package tarball URL for a specific package version.
|
|
||||||
* Returns the tarball URL that can be used to download and extract the package.
|
|
||||||
*/
|
|
||||||
async getPackageTarballUrl(packageName: string, version?: string): Promise<string | null> {
|
|
||||||
const packageJson = await this.fetchPackageJson(packageName, version);
|
|
||||||
|
|
||||||
if (!packageJson) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For specific version fetch, dist.tarball is directly available
|
|
||||||
if (packageJson.dist?.tarball) {
|
|
||||||
return packageJson.dist.tarball;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For full package fetch, get the latest version's tarball
|
|
||||||
const latestVersion = packageJson['dist-tags']?.latest;
|
|
||||||
if (latestVersion && packageJson.versions?.[latestVersion]?.dist?.tarball) {
|
|
||||||
return packageJson.versions[latestVersion].dist.tarball;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get download statistics for a package from npm.
|
|
||||||
* Validates package name to prevent path traversal attacks.
|
|
||||||
*/
|
|
||||||
async getPackageDownloads(
|
|
||||||
packageName: string,
|
|
||||||
period: 'last-week' | 'last-month' = 'last-week'
|
|
||||||
): Promise<number | null> {
|
|
||||||
// Validate package name to prevent path traversal
|
|
||||||
if (!this.validatePackageName(packageName)) {
|
|
||||||
logger.warn(`Invalid package name rejected for downloads: ${packageName}`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.retryWithBackoff(
|
|
||||||
async () => {
|
|
||||||
const response = await axios.get(
|
|
||||||
`https://api.npmjs.org/downloads/point/${period}/${encodeURIComponent(packageName)}`,
|
|
||||||
{ timeout: FETCH_CONFIG.NPM_DOWNLOADS_TIMEOUT }
|
|
||||||
);
|
|
||||||
return response.data.downloads;
|
|
||||||
},
|
|
||||||
`Fetching downloads for ${packageName}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private sleep(ms: number): Promise<void> {
|
|
||||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,389 +0,0 @@
|
|||||||
import { logger } from '../utils/logger';
|
|
||||||
import { NodeRepository, CommunityNodeFields } from '../database/node-repository';
|
|
||||||
import { ParsedNode } from '../parsers/node-parser';
|
|
||||||
import {
|
|
||||||
CommunityNodeFetcher,
|
|
||||||
StrapiCommunityNode,
|
|
||||||
NpmSearchResult,
|
|
||||||
} from './community-node-fetcher';
|
|
||||||
|
|
||||||
export interface CommunityStats {
|
|
||||||
total: number;
|
|
||||||
verified: number;
|
|
||||||
unverified: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SyncResult {
|
|
||||||
verified: {
|
|
||||||
fetched: number;
|
|
||||||
saved: number;
|
|
||||||
skipped: number;
|
|
||||||
errors: string[];
|
|
||||||
};
|
|
||||||
npm: {
|
|
||||||
fetched: number;
|
|
||||||
saved: number;
|
|
||||||
skipped: number;
|
|
||||||
errors: string[];
|
|
||||||
};
|
|
||||||
duration: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SyncOptions {
|
|
||||||
/** Only sync verified nodes from Strapi API (fast) */
|
|
||||||
verifiedOnly?: boolean;
|
|
||||||
/** Maximum number of npm packages to sync (default: 100) */
|
|
||||||
npmLimit?: number;
|
|
||||||
/** Skip nodes already in database */
|
|
||||||
skipExisting?: boolean;
|
|
||||||
/** Environment for Strapi API */
|
|
||||||
environment?: 'production' | 'staging';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Service for syncing community nodes from n8n Strapi API and npm registry.
|
|
||||||
*
|
|
||||||
* Key insight: Verified nodes from Strapi include full `nodeDescription` schemas,
|
|
||||||
* so we can store them directly without downloading/parsing npm packages.
|
|
||||||
*/
|
|
||||||
export class CommunityNodeService {
|
|
||||||
private fetcher: CommunityNodeFetcher;
|
|
||||||
private repository: NodeRepository;
|
|
||||||
|
|
||||||
constructor(repository: NodeRepository, environment: 'production' | 'staging' = 'production') {
|
|
||||||
this.repository = repository;
|
|
||||||
this.fetcher = new CommunityNodeFetcher(environment);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sync community nodes from both Strapi API and npm registry.
|
|
||||||
*/
|
|
||||||
async syncCommunityNodes(
|
|
||||||
options: SyncOptions = {},
|
|
||||||
progressCallback?: (message: string, current: number, total: number) => void
|
|
||||||
): Promise<SyncResult> {
|
|
||||||
const startTime = Date.now();
|
|
||||||
const result: SyncResult = {
|
|
||||||
verified: { fetched: 0, saved: 0, skipped: 0, errors: [] },
|
|
||||||
npm: { fetched: 0, saved: 0, skipped: 0, errors: [] },
|
|
||||||
duration: 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Step 1: Sync verified nodes from Strapi API
|
|
||||||
logger.info('Syncing verified community nodes from Strapi API...');
|
|
||||||
try {
|
|
||||||
result.verified = await this.syncVerifiedNodes(progressCallback, options.skipExisting);
|
|
||||||
} catch (error: any) {
|
|
||||||
logger.error('Failed to sync verified nodes:', error);
|
|
||||||
result.verified.errors.push(`Strapi sync failed: ${error.message}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step 2: Sync popular npm packages (unless verifiedOnly)
|
|
||||||
if (!options.verifiedOnly) {
|
|
||||||
const npmLimit = options.npmLimit ?? 100;
|
|
||||||
logger.info(`Syncing top ${npmLimit} npm community packages...`);
|
|
||||||
try {
|
|
||||||
result.npm = await this.syncNpmNodes(npmLimit, progressCallback, options.skipExisting);
|
|
||||||
} catch (error: any) {
|
|
||||||
logger.error('Failed to sync npm nodes:', error);
|
|
||||||
result.npm.errors.push(`npm sync failed: ${error.message}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result.duration = Date.now() - startTime;
|
|
||||||
logger.info(
|
|
||||||
`Community node sync complete in ${(result.duration / 1000).toFixed(1)}s: ` +
|
|
||||||
`${result.verified.saved} verified, ${result.npm.saved} npm`
|
|
||||||
);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sync verified nodes from n8n Strapi API.
|
|
||||||
* These nodes include full nodeDescription - no parsing needed!
|
|
||||||
*/
|
|
||||||
async syncVerifiedNodes(
|
|
||||||
progressCallback?: (message: string, current: number, total: number) => void,
|
|
||||||
skipExisting?: boolean
|
|
||||||
): Promise<SyncResult['verified']> {
|
|
||||||
const result = { fetched: 0, saved: 0, skipped: 0, errors: [] as string[] };
|
|
||||||
|
|
||||||
// Fetch verified nodes from Strapi API
|
|
||||||
const strapiNodes = await this.fetcher.fetchVerifiedNodes(progressCallback);
|
|
||||||
result.fetched = strapiNodes.length;
|
|
||||||
|
|
||||||
if (strapiNodes.length === 0) {
|
|
||||||
logger.warn('No verified nodes returned from Strapi API');
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(`Processing ${strapiNodes.length} verified community nodes...`);
|
|
||||||
|
|
||||||
for (const strapiNode of strapiNodes) {
|
|
||||||
try {
|
|
||||||
const { attributes } = strapiNode;
|
|
||||||
|
|
||||||
// Skip if node already exists and skipExisting is true
|
|
||||||
if (skipExisting && this.repository.hasNodeByNpmPackage(attributes.packageName)) {
|
|
||||||
result.skipped++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert Strapi node to ParsedNode format
|
|
||||||
const parsedNode = this.strapiNodeToParsedNode(strapiNode);
|
|
||||||
if (!parsedNode) {
|
|
||||||
result.errors.push(`Failed to parse: ${attributes.packageName}`);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save to database
|
|
||||||
this.repository.saveNode(parsedNode);
|
|
||||||
result.saved++;
|
|
||||||
|
|
||||||
if (progressCallback) {
|
|
||||||
progressCallback(
|
|
||||||
`Saving verified nodes`,
|
|
||||||
result.saved + result.skipped,
|
|
||||||
strapiNodes.length
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} catch (error: any) {
|
|
||||||
result.errors.push(`Error saving ${strapiNode.attributes.packageName}: ${error.message}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(`Verified nodes: ${result.saved} saved, ${result.skipped} skipped`);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sync popular npm packages.
|
|
||||||
* NOTE: This only stores metadata - full schema extraction requires tarball download.
|
|
||||||
* For now, we store basic metadata and mark them for future parsing.
|
|
||||||
*/
|
|
||||||
async syncNpmNodes(
|
|
||||||
limit: number = 100,
|
|
||||||
progressCallback?: (message: string, current: number, total: number) => void,
|
|
||||||
skipExisting?: boolean
|
|
||||||
): Promise<SyncResult['npm']> {
|
|
||||||
const result = { fetched: 0, saved: 0, skipped: 0, errors: [] as string[] };
|
|
||||||
|
|
||||||
// Fetch npm packages
|
|
||||||
const npmPackages = await this.fetcher.fetchNpmPackages(limit, progressCallback);
|
|
||||||
result.fetched = npmPackages.length;
|
|
||||||
|
|
||||||
if (npmPackages.length === 0) {
|
|
||||||
logger.warn('No npm packages returned from registry');
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get list of verified package names to skip (already synced from Strapi)
|
|
||||||
const verifiedPackages = new Set(
|
|
||||||
this.repository
|
|
||||||
.getCommunityNodes({ verified: true })
|
|
||||||
.map((n) => n.npmPackageName)
|
|
||||||
.filter(Boolean)
|
|
||||||
);
|
|
||||||
|
|
||||||
logger.info(
|
|
||||||
`Processing ${npmPackages.length} npm packages (skipping ${verifiedPackages.size} verified)...`
|
|
||||||
);
|
|
||||||
|
|
||||||
for (const pkg of npmPackages) {
|
|
||||||
try {
|
|
||||||
const packageName = pkg.package.name;
|
|
||||||
|
|
||||||
// Skip if already verified from Strapi
|
|
||||||
if (verifiedPackages.has(packageName)) {
|
|
||||||
result.skipped++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Skip if already exists and skipExisting is true
|
|
||||||
if (skipExisting && this.repository.hasNodeByNpmPackage(packageName)) {
|
|
||||||
result.skipped++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For npm packages, we create a basic node entry with metadata
|
|
||||||
// Full schema extraction would require downloading and parsing the tarball
|
|
||||||
const parsedNode = this.npmPackageToParsedNode(pkg);
|
|
||||||
|
|
||||||
// Save to database
|
|
||||||
this.repository.saveNode(parsedNode);
|
|
||||||
result.saved++;
|
|
||||||
|
|
||||||
if (progressCallback) {
|
|
||||||
progressCallback(`Saving npm packages`, result.saved + result.skipped, npmPackages.length);
|
|
||||||
}
|
|
||||||
} catch (error: any) {
|
|
||||||
result.errors.push(`Error saving ${pkg.package.name}: ${error.message}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(`npm packages: ${result.saved} saved, ${result.skipped} skipped`);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert Strapi community node to ParsedNode format.
|
|
||||||
* Strapi nodes include full nodeDescription - no parsing needed!
|
|
||||||
*/
|
|
||||||
private strapiNodeToParsedNode(
|
|
||||||
strapiNode: StrapiCommunityNode
|
|
||||||
): (ParsedNode & CommunityNodeFields) | null {
|
|
||||||
const { attributes } = strapiNode;
|
|
||||||
|
|
||||||
// Strapi includes the full nodeDescription (n8n node schema)
|
|
||||||
const nodeDesc = attributes.nodeDescription;
|
|
||||||
|
|
||||||
if (!nodeDesc) {
|
|
||||||
logger.warn(`No nodeDescription for ${attributes.packageName}`);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extract node type from the description
|
|
||||||
// Strapi uses "preview" format (e.g., n8n-nodes-preview-brightdata.brightData)
|
|
||||||
// but actual installed nodes use the npm package name (e.g., n8n-nodes-brightdata.brightData)
|
|
||||||
// We need to transform preview names to actual names
|
|
||||||
let nodeType = nodeDesc.name || `${attributes.packageName}.${attributes.name}`;
|
|
||||||
|
|
||||||
// Transform preview node type to actual node type
|
|
||||||
// Pattern: n8n-nodes-preview-{name} -> n8n-nodes-{name}
|
|
||||||
// Also handles scoped packages: @scope/n8n-nodes-preview-{name} -> @scope/n8n-nodes-{name}
|
|
||||||
if (nodeType.includes('n8n-nodes-preview-')) {
|
|
||||||
nodeType = nodeType.replace('n8n-nodes-preview-', 'n8n-nodes-');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Determine if it's an AI tool
|
|
||||||
const isAITool =
|
|
||||||
nodeDesc.usableAsTool === true ||
|
|
||||||
nodeDesc.codex?.categories?.includes('AI') ||
|
|
||||||
attributes.name?.toLowerCase().includes('ai');
|
|
||||||
|
|
||||||
return {
|
|
||||||
// Core ParsedNode fields
|
|
||||||
nodeType,
|
|
||||||
packageName: attributes.packageName,
|
|
||||||
displayName: nodeDesc.displayName || attributes.displayName,
|
|
||||||
description: nodeDesc.description || attributes.description,
|
|
||||||
category: nodeDesc.codex?.categories?.[0] || 'Community',
|
|
||||||
style: 'declarative', // Most community nodes are declarative
|
|
||||||
properties: nodeDesc.properties || [],
|
|
||||||
credentials: nodeDesc.credentials || [],
|
|
||||||
operations: this.extractOperations(nodeDesc),
|
|
||||||
isAITool,
|
|
||||||
isTrigger: nodeDesc.group?.includes('trigger') || false,
|
|
||||||
isWebhook:
|
|
||||||
nodeDesc.name?.toLowerCase().includes('webhook') ||
|
|
||||||
nodeDesc.group?.includes('webhook') ||
|
|
||||||
false,
|
|
||||||
isVersioned: (attributes.nodeVersions?.length || 0) > 1,
|
|
||||||
version: nodeDesc.version?.toString() || attributes.npmVersion || '1',
|
|
||||||
outputs: nodeDesc.outputs,
|
|
||||||
outputNames: nodeDesc.outputNames,
|
|
||||||
|
|
||||||
// Community-specific fields
|
|
||||||
isCommunity: true,
|
|
||||||
isVerified: true, // Strapi nodes are verified
|
|
||||||
authorName: attributes.authorName,
|
|
||||||
authorGithubUrl: attributes.authorGithubUrl,
|
|
||||||
npmPackageName: attributes.packageName,
|
|
||||||
npmVersion: attributes.npmVersion,
|
|
||||||
npmDownloads: attributes.numberOfDownloads || 0,
|
|
||||||
communityFetchedAt: new Date().toISOString(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert npm package info to basic ParsedNode.
|
|
||||||
* Note: This is a minimal entry - full schema requires tarball parsing.
|
|
||||||
*/
|
|
||||||
private npmPackageToParsedNode(pkg: NpmSearchResult): ParsedNode & CommunityNodeFields {
|
|
||||||
const { package: pkgInfo, score } = pkg;
|
|
||||||
|
|
||||||
// Extract node name from package name (e.g., n8n-nodes-globals -> GlobalConstants)
|
|
||||||
const nodeName = this.extractNodeNameFromPackage(pkgInfo.name);
|
|
||||||
const nodeType = `${pkgInfo.name}.${nodeName}`;
|
|
||||||
|
|
||||||
return {
|
|
||||||
// Core ParsedNode fields (minimal - no schema available)
|
|
||||||
nodeType,
|
|
||||||
packageName: pkgInfo.name,
|
|
||||||
displayName: nodeName,
|
|
||||||
description: pkgInfo.description || `Community node from ${pkgInfo.name}`,
|
|
||||||
category: 'Community',
|
|
||||||
style: 'declarative',
|
|
||||||
properties: [], // Would need tarball parsing
|
|
||||||
credentials: [],
|
|
||||||
operations: [],
|
|
||||||
isAITool: false,
|
|
||||||
isTrigger: pkgInfo.name.includes('trigger'),
|
|
||||||
isWebhook: pkgInfo.name.includes('webhook'),
|
|
||||||
isVersioned: false,
|
|
||||||
version: pkgInfo.version,
|
|
||||||
|
|
||||||
// Community-specific fields
|
|
||||||
isCommunity: true,
|
|
||||||
isVerified: false, // npm nodes are not verified
|
|
||||||
authorName: pkgInfo.author?.name || pkgInfo.publisher?.username,
|
|
||||||
authorGithubUrl: pkgInfo.links?.repository,
|
|
||||||
npmPackageName: pkgInfo.name,
|
|
||||||
npmVersion: pkgInfo.version,
|
|
||||||
npmDownloads: Math.round(score.detail.popularity * 10000), // Approximate
|
|
||||||
communityFetchedAt: new Date().toISOString(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extract operations from node description.
|
|
||||||
*/
|
|
||||||
private extractOperations(nodeDesc: any): any[] {
|
|
||||||
const operations: any[] = [];
|
|
||||||
|
|
||||||
// Check properties for resource/operation pattern
|
|
||||||
if (nodeDesc.properties) {
|
|
||||||
for (const prop of nodeDesc.properties) {
|
|
||||||
if (prop.name === 'operation' && prop.options) {
|
|
||||||
operations.push(...prop.options);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return operations;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extract a readable node name from npm package name.
|
|
||||||
* e.g., "n8n-nodes-globals" -> "Globals"
|
|
||||||
* e.g., "@company/n8n-nodes-mynode" -> "Mynode"
|
|
||||||
*/
|
|
||||||
private extractNodeNameFromPackage(packageName: string): string {
|
|
||||||
// Remove scope if present
|
|
||||||
let name = packageName.replace(/^@[^/]+\//, '');
|
|
||||||
|
|
||||||
// Remove n8n-nodes- prefix
|
|
||||||
name = name.replace(/^n8n-nodes-/, '');
|
|
||||||
|
|
||||||
// Capitalize first letter of each word
|
|
||||||
return name
|
|
||||||
.split('-')
|
|
||||||
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
||||||
.join('');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get community node statistics.
|
|
||||||
*/
|
|
||||||
getCommunityStats(): CommunityStats {
|
|
||||||
return this.repository.getCommunityStats();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete all community nodes (for rebuild).
|
|
||||||
*/
|
|
||||||
deleteCommunityNodes(): number {
|
|
||||||
return this.repository.deleteCommunityNodes();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
export {
|
|
||||||
CommunityNodeFetcher,
|
|
||||||
StrapiCommunityNode,
|
|
||||||
StrapiCommunityNodeAttributes,
|
|
||||||
StrapiPaginatedResponse,
|
|
||||||
NpmPackageInfo,
|
|
||||||
NpmSearchResult,
|
|
||||||
NpmSearchResponse,
|
|
||||||
} from './community-node-fetcher';
|
|
||||||
|
|
||||||
export {
|
|
||||||
CommunityNodeService,
|
|
||||||
CommunityStats,
|
|
||||||
SyncResult,
|
|
||||||
SyncOptions,
|
|
||||||
} from './community-node-service';
|
|
||||||
@@ -3,20 +3,6 @@ import { ParsedNode } from '../parsers/node-parser';
|
|||||||
import { SQLiteStorageService } from '../services/sqlite-storage-service';
|
import { SQLiteStorageService } from '../services/sqlite-storage-service';
|
||||||
import { NodeTypeNormalizer } from '../utils/node-type-normalizer';
|
import { NodeTypeNormalizer } from '../utils/node-type-normalizer';
|
||||||
|
|
||||||
/**
|
|
||||||
* Community node extension fields
|
|
||||||
*/
|
|
||||||
export interface CommunityNodeFields {
|
|
||||||
isCommunity: boolean;
|
|
||||||
isVerified: boolean;
|
|
||||||
authorName?: string;
|
|
||||||
authorGithubUrl?: string;
|
|
||||||
npmPackageName?: string;
|
|
||||||
npmVersion?: string;
|
|
||||||
npmDownloads?: number;
|
|
||||||
communityFetchedAt?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class NodeRepository {
|
export class NodeRepository {
|
||||||
private db: DatabaseAdapter;
|
private db: DatabaseAdapter;
|
||||||
|
|
||||||
@@ -31,22 +17,18 @@ export class NodeRepository {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Save node with proper JSON serialization
|
* Save node with proper JSON serialization
|
||||||
* Supports both core and community nodes via optional community fields
|
|
||||||
*/
|
*/
|
||||||
saveNode(node: ParsedNode & Partial<CommunityNodeFields>): void {
|
saveNode(node: ParsedNode): void {
|
||||||
const stmt = this.db.prepare(`
|
const stmt = this.db.prepare(`
|
||||||
INSERT OR REPLACE INTO nodes (
|
INSERT OR REPLACE INTO nodes (
|
||||||
node_type, package_name, display_name, description,
|
node_type, package_name, display_name, description,
|
||||||
category, development_style, is_ai_tool, is_trigger,
|
category, development_style, is_ai_tool, is_trigger,
|
||||||
is_webhook, is_versioned, is_tool_variant, tool_variant_of,
|
is_webhook, is_versioned, version, documentation,
|
||||||
has_tool_variant, version, documentation,
|
|
||||||
properties_schema, operations, credentials_required,
|
properties_schema, operations, credentials_required,
|
||||||
outputs, output_names,
|
outputs, output_names
|
||||||
is_community, is_verified, author_name, author_github_url,
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
npm_package_name, npm_version, npm_downloads, community_fetched_at
|
|
||||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
||||||
`);
|
`);
|
||||||
|
|
||||||
stmt.run(
|
stmt.run(
|
||||||
node.nodeType,
|
node.nodeType,
|
||||||
node.packageName,
|
node.packageName,
|
||||||
@@ -58,25 +40,13 @@ export class NodeRepository {
|
|||||||
node.isTrigger ? 1 : 0,
|
node.isTrigger ? 1 : 0,
|
||||||
node.isWebhook ? 1 : 0,
|
node.isWebhook ? 1 : 0,
|
||||||
node.isVersioned ? 1 : 0,
|
node.isVersioned ? 1 : 0,
|
||||||
node.isToolVariant ? 1 : 0,
|
|
||||||
node.toolVariantOf || null,
|
|
||||||
node.hasToolVariant ? 1 : 0,
|
|
||||||
node.version,
|
node.version,
|
||||||
node.documentation || null,
|
node.documentation || null,
|
||||||
JSON.stringify(node.properties, null, 2),
|
JSON.stringify(node.properties, null, 2),
|
||||||
JSON.stringify(node.operations, null, 2),
|
JSON.stringify(node.operations, null, 2),
|
||||||
JSON.stringify(node.credentials, null, 2),
|
JSON.stringify(node.credentials, null, 2),
|
||||||
node.outputs ? JSON.stringify(node.outputs, null, 2) : null,
|
node.outputs ? JSON.stringify(node.outputs, null, 2) : null,
|
||||||
node.outputNames ? JSON.stringify(node.outputNames, null, 2) : null,
|
node.outputNames ? JSON.stringify(node.outputNames, null, 2) : null
|
||||||
// Community node fields
|
|
||||||
node.isCommunity ? 1 : 0,
|
|
||||||
node.isVerified ? 1 : 0,
|
|
||||||
node.authorName || null,
|
|
||||||
node.authorGithubUrl || null,
|
|
||||||
node.npmPackageName || null,
|
|
||||||
node.npmVersion || null,
|
|
||||||
node.npmDownloads || 0,
|
|
||||||
node.communityFetchedAt || null
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,58 +194,6 @@ export class NodeRepository {
|
|||||||
return this.getAITools();
|
return this.getAITools();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the Tool variant for a base node
|
|
||||||
*/
|
|
||||||
getToolVariant(baseNodeType: string): any | null {
|
|
||||||
// Validate node type format (must be package.nodeName pattern)
|
|
||||||
if (!baseNodeType || typeof baseNodeType !== 'string' || !baseNodeType.includes('.')) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
const toolNodeType = `${baseNodeType}Tool`;
|
|
||||||
return this.getNode(toolNodeType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the base node for a Tool variant
|
|
||||||
*/
|
|
||||||
getBaseNodeForToolVariant(toolNodeType: string): any | null {
|
|
||||||
const row = this.db.prepare(`
|
|
||||||
SELECT tool_variant_of FROM nodes WHERE node_type = ?
|
|
||||||
`).get(toolNodeType) as any;
|
|
||||||
|
|
||||||
if (!row?.tool_variant_of) return null;
|
|
||||||
return this.getNode(row.tool_variant_of);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all Tool variants
|
|
||||||
*/
|
|
||||||
getToolVariants(): any[] {
|
|
||||||
const rows = this.db.prepare(`
|
|
||||||
SELECT node_type, display_name, description, package_name, tool_variant_of
|
|
||||||
FROM nodes
|
|
||||||
WHERE is_tool_variant = 1
|
|
||||||
ORDER BY display_name
|
|
||||||
`).all() as any[];
|
|
||||||
|
|
||||||
return rows.map(row => ({
|
|
||||||
nodeType: row.node_type,
|
|
||||||
displayName: row.display_name,
|
|
||||||
description: row.description,
|
|
||||||
package: row.package_name,
|
|
||||||
toolVariantOf: row.tool_variant_of
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get count of Tool variants
|
|
||||||
*/
|
|
||||||
getToolVariantCount(): number {
|
|
||||||
const result = this.db.prepare('SELECT COUNT(*) as count FROM nodes WHERE is_tool_variant = 1').get() as any;
|
|
||||||
return result.count;
|
|
||||||
}
|
|
||||||
|
|
||||||
getNodesByPackage(packageName: string): any[] {
|
getNodesByPackage(packageName: string): any[] {
|
||||||
const rows = this.db.prepare(`
|
const rows = this.db.prepare(`
|
||||||
SELECT * FROM nodes WHERE package_name = ?
|
SELECT * FROM nodes WHERE package_name = ?
|
||||||
@@ -332,25 +250,13 @@ export class NodeRepository {
|
|||||||
isTrigger: Number(row.is_trigger) === 1,
|
isTrigger: Number(row.is_trigger) === 1,
|
||||||
isWebhook: Number(row.is_webhook) === 1,
|
isWebhook: Number(row.is_webhook) === 1,
|
||||||
isVersioned: Number(row.is_versioned) === 1,
|
isVersioned: Number(row.is_versioned) === 1,
|
||||||
isToolVariant: Number(row.is_tool_variant) === 1,
|
|
||||||
toolVariantOf: row.tool_variant_of || null,
|
|
||||||
hasToolVariant: Number(row.has_tool_variant) === 1,
|
|
||||||
version: row.version,
|
version: row.version,
|
||||||
properties: this.safeJsonParse(row.properties_schema, []),
|
properties: this.safeJsonParse(row.properties_schema, []),
|
||||||
operations: this.safeJsonParse(row.operations, []),
|
operations: this.safeJsonParse(row.operations, []),
|
||||||
credentials: this.safeJsonParse(row.credentials_required, []),
|
credentials: this.safeJsonParse(row.credentials_required, []),
|
||||||
hasDocumentation: !!row.documentation,
|
hasDocumentation: !!row.documentation,
|
||||||
outputs: row.outputs ? this.safeJsonParse(row.outputs, null) : null,
|
outputs: row.outputs ? this.safeJsonParse(row.outputs, null) : null,
|
||||||
outputNames: row.output_names ? this.safeJsonParse(row.output_names, null) : null,
|
outputNames: row.output_names ? this.safeJsonParse(row.output_names, null) : null
|
||||||
// Community node fields
|
|
||||||
isCommunity: Number(row.is_community) === 1,
|
|
||||||
isVerified: Number(row.is_verified) === 1,
|
|
||||||
authorName: row.author_name || null,
|
|
||||||
authorGithubUrl: row.author_github_url || null,
|
|
||||||
npmPackageName: row.npm_package_name || null,
|
|
||||||
npmVersion: row.npm_version || null,
|
|
||||||
npmDownloads: row.npm_downloads || 0,
|
|
||||||
communityFetchedAt: row.community_fetched_at || null
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,99 +463,6 @@ export class NodeRepository {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========================================
|
|
||||||
// Community Node Methods
|
|
||||||
// ========================================
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get community nodes with optional filters
|
|
||||||
*/
|
|
||||||
getCommunityNodes(options?: {
|
|
||||||
verified?: boolean;
|
|
||||||
limit?: number;
|
|
||||||
orderBy?: 'downloads' | 'name' | 'updated';
|
|
||||||
}): any[] {
|
|
||||||
let sql = 'SELECT * FROM nodes WHERE is_community = 1';
|
|
||||||
const params: any[] = [];
|
|
||||||
|
|
||||||
if (options?.verified !== undefined) {
|
|
||||||
sql += ' AND is_verified = ?';
|
|
||||||
params.push(options.verified ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Order by
|
|
||||||
switch (options?.orderBy) {
|
|
||||||
case 'downloads':
|
|
||||||
sql += ' ORDER BY npm_downloads DESC';
|
|
||||||
break;
|
|
||||||
case 'updated':
|
|
||||||
sql += ' ORDER BY community_fetched_at DESC';
|
|
||||||
break;
|
|
||||||
case 'name':
|
|
||||||
default:
|
|
||||||
sql += ' ORDER BY display_name';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options?.limit) {
|
|
||||||
sql += ' LIMIT ?';
|
|
||||||
params.push(options.limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
const rows = this.db.prepare(sql).all(...params) as any[];
|
|
||||||
return rows.map(row => this.parseNodeRow(row));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get community node statistics
|
|
||||||
*/
|
|
||||||
getCommunityStats(): { total: number; verified: number; unverified: number } {
|
|
||||||
const totalResult = this.db.prepare(
|
|
||||||
'SELECT COUNT(*) as count FROM nodes WHERE is_community = 1'
|
|
||||||
).get() as any;
|
|
||||||
|
|
||||||
const verifiedResult = this.db.prepare(
|
|
||||||
'SELECT COUNT(*) as count FROM nodes WHERE is_community = 1 AND is_verified = 1'
|
|
||||||
).get() as any;
|
|
||||||
|
|
||||||
return {
|
|
||||||
total: totalResult.count,
|
|
||||||
verified: verifiedResult.count,
|
|
||||||
unverified: totalResult.count - verifiedResult.count
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a node exists by npm package name
|
|
||||||
*/
|
|
||||||
hasNodeByNpmPackage(npmPackageName: string): boolean {
|
|
||||||
const result = this.db.prepare(
|
|
||||||
'SELECT 1 FROM nodes WHERE npm_package_name = ? LIMIT 1'
|
|
||||||
).get(npmPackageName) as any;
|
|
||||||
return !!result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get node by npm package name
|
|
||||||
*/
|
|
||||||
getNodeByNpmPackage(npmPackageName: string): any | null {
|
|
||||||
const row = this.db.prepare(
|
|
||||||
'SELECT * FROM nodes WHERE npm_package_name = ?'
|
|
||||||
).get(npmPackageName) as any;
|
|
||||||
|
|
||||||
if (!row) return null;
|
|
||||||
return this.parseNodeRow(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete all community nodes (for rebuild)
|
|
||||||
*/
|
|
||||||
deleteCommunityNodes(): number {
|
|
||||||
const result = this.db.prepare(
|
|
||||||
'DELETE FROM nodes WHERE is_community = 1'
|
|
||||||
).run();
|
|
||||||
return result.changes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* VERSION MANAGEMENT METHODS
|
* VERSION MANAGEMENT METHODS
|
||||||
* Methods for working with node_versions and version_property_changes tables
|
* Methods for working with node_versions and version_property_changes tables
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user