Skip to content
This repository was archived by the owner on Jan 14, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
a70f138
delete condition for building only amd64
dmitrii-podlipaev-intento Dec 1, 2025
d044bd9
change all blacksmith runners to github default runners
dmitrii-podlipaev-intento Dec 1, 2025
b28fbe6
change timeout up to 30 minutes because we have less powerfull free i…
dmitrii-podlipaev-intento Dec 1, 2025
d985f87
Merge pull request #3 from intento/feat/fix_push_docker_ci
dmitrii-podlipaev-intento Dec 1, 2025
79b704b
disable login to docker hub
dmitrii-podlipaev-intento Dec 4, 2025
0dd8c95
Merge pull request #4 from intento/fix/docker_build_push_ci
dmitrii-podlipaev-intento Dec 4, 2025
83be2f8
RND-112: Update dependencies and fix test issues
apl-intento Dec 9, 2025
74308b4
RND-112: added pnpm script for dev start
apl-intento Dec 9, 2025
a118ed6
RND-112 - modified start:dev script
apl-intento Dec 9, 2025
dc468b7
RND-112: Mock Translation Agent was added
apl-intento Dec 9, 2025
3d1ad1f
RND-112 Split intento nodes into separate packages
apl-intento Dec 10, 2025
9b8f56b
RND-112 Default Google Translate, DeepL, LingvaNex nodes were removed
apl-intento Dec 10, 2025
f5a8751
RND-112: Add Translation, Automatic Post Editing, and Language Qualit…
apl-intento Dec 10, 2025
b141e87
RND-112: Reorder categories
apl-intento Dec 10, 2025
1ff41b1
RND-112: Add Primitives category
apl-intento Dec 11, 2025
df29fbb
RND-112: fix eslint to watch correct tsconfig file
apl-intento Dec 11, 2025
27968c1
RND-112: Change subcategory from "Helpers" to "Primitives" for core n…
apl-intento Dec 11, 2025
f2b4601
RND-112 moved rest core nodes to primitives subcategory
apl-intento Dec 11, 2025
ea0adb5
RND-112 Add code node to node creator development section
apl-intento Dec 11, 2025
ffe1f16
RND-112: Move HITl, Data Transformation and Flow nodes to Primitives …
apl-intento Dec 11, 2025
791bbea
RND-112: Primitives subcategory was structured
apl-intento Dec 11, 2025
4035bca
RND-112: Fix unit tests setup for Intento packages
apl-intento Dec 12, 2025
eb51df1
RND-112: Fix n8n-core tests by adding missing dev dependency
apl-intento Dec 12, 2025
d1065da
RND-112: fix: correct test to check for 7 items in Item Iterator node
apl-intento Dec 12, 2025
37e9c14
RND-112: fix UI tests
apl-intento Dec 12, 2025
1689f65
RND-112: Sample Translation Agent Node
apl-intento Dec 12, 2025
c95cb62
RND-112: Sample DryRunProvider node added to Intento Translation package
apl-intento Dec 13, 2025
792f14b
RND-97 Remove Intento NMT references
apl-intento Dec 13, 2025
b7c912f
RND-112 DryRun Provider - implement retry logic with configurable max…
apl-intento Dec 16, 2025
240fb13
RND-112: unit tests for translation package
apl-intento Dec 16, 2025
dfb40fa
RND-112: Remove redundant tests and improve timing test reliability
apl-intento Dec 16, 2025
4fffa77
RND-112 fix retries
apl-intento Dec 18, 2025
0643993
RND-112: remove intento packages
apl-intento Dec 29, 2025
a2f100f
RND-112: clean repo from intento
apl-intento Dec 29, 2025
7edae37
RND-112 Refactoring
apl-intento Dec 30, 2025
2f69cd1
RND-112 logs to .gitignore
apl-intento Jan 2, 2026
fad4da2
RND-97: add tests for translation package components
apl-intento Jan 5, 2026
8aefe38
RND-97: error handling improvements and linting fixes
apl-intento Jan 5, 2026
f181095
RND-97: refactor: move DryRunProvider to tools and add DeeplTool
apl-intento Jan 6, 2026
fe6a37d
RND-97: Implement 'replace' mode in Dry Run Supplier for text replace…
apl-intento Jan 6, 2026
68504db
RND-97 split RetriableSupplierBase from SupplierBase
apl-intento Jan 8, 2026
dc63166
RND-97: fix exports
apl-intento Jan 8, 2026
a431204
RND-97: Add attempt number to supply logs in SupplierBase instead of …
apl-intento Jan 8, 2026
b0fc1b1
BOH-8 Added EchoGarden segment generation supplier and agent integration
apl-intento Jan 9, 2026
97bfbf5
BOH-9: Language validation support for translation suppliers
apl-intento Jan 9, 2026
356357e
BOH-10: use header auth for Deepl API key
apl-intento Jan 9, 2026
e017c3e
BOH-8: Moved segmentation logic to a separate package
apl-intento Jan 10, 2026
31477f3
BOH-8: Cover core and segmentation changes with tests
apl-intento Jan 12, 2026
26a9b80
BOH-8: no need for segments at response
apl-intento Jan 12, 2026
5fc23c6
BOH-9: Fix tests and frame agent set-up
apl-intento Jan 13, 2026
f9eda1e
BOH-9: fix batch processing and context validation
apl-intento Jan 13, 2026
33e2bdd
Merge branch 'master' of https://github.com/intento/n8n into RND-97-n…
Xapgkop4uk Jan 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/ci-postgres-mysql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ jobs:
mariadb:
name: MariaDB
needs: build
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
timeout-minutes: 30
if: false
env:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci-pull-requests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ jobs:
typecheck:
name: Typecheck
if: needs.install-and-build.outputs.non_python_changed == 'true'
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
needs: install-and-build
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
Expand Down
22 changes: 7 additions & 15 deletions .github/workflows/docker-build-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ jobs:
needs: determine-build-context
runs-on: ${{ matrix.runner }}
timeout-minutes: 30
timeout-minutes: 30
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate timeout-minutes YAML key in workflow

Medium Severity

The build-and-push-docker job has timeout-minutes: 30 specified twice on consecutive lines (86 and 87). Duplicate YAML keys are invalid and may cause parsing issues or unpredictable behavior depending on the YAML parser used.

Fix in CursorΒ Fix in Web

strategy:
matrix: ${{ fromJSON(needs.determine-build-context.outputs.build_matrix) }}
outputs:
Expand Down Expand Up @@ -224,6 +225,12 @@ jobs:
# with:
# username: ${{ secrets.DOCKER_USERNAME }}
# password: ${{ secrets.DOCKER_PASSWORD }}
# - name: Login to Docker Hub
# if: needs.determine-build-context.outputs.push_to_docker == 'true'
# uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
# with:
# username: ${{ secrets.DOCKER_USERNAME }}
# password: ${{ secrets.DOCKER_PASSWORD }}

- name: Create ECR multi-arch manifests
run: |
Expand Down Expand Up @@ -252,21 +259,6 @@ jobs:
"${MANIFEST_TAG}-amd64" \
"${MANIFEST_TAG}-arm64"
fi

# Also create 'latest' tag for stable releases
if [[ "$RELEASE_TYPE" == "stable" ]]; then
echo "Creating 'latest' tag for ${IMAGE_NAME}"
if [[ "$RELEASE_TYPE" == "branch" ]]; then
docker buildx imagetools create \
--tag "${ECR_BASE}/${IMAGE_NAME}:latest" \
"${MANIFEST_TAG}-amd64"
else
docker buildx imagetools create \
--tag "${ECR_BASE}/${IMAGE_NAME}:latest" \
"${MANIFEST_TAG}-amd64" \
"${MANIFEST_TAG}-arm64"
fi
fi
}

# Create manifests for all images
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/linting-reusable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ env:
jobs:
lint:
name: Lint
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
Expand Down
15 changes: 10 additions & 5 deletions .github/workflows/playwright-test-reusable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,43 @@ on:
workflow_call:
inputs:
branch:
description: "GitHub branch to test."
description: "GitHub branch to test."
required: false
type: string
test-mode:
description: "Test mode: local (pnpm start from local), docker-build, or docker-pull"
description: "Test mode: local (pnpm start from local), docker-build, or docker-pull"
required: false
default: "local"
default: "local"
type: string
test-command:
description: "Test command to run"
description: "Test command to run"
required: false
default: "pnpm --filter=n8n-playwright test:local"
default: "pnpm --filter=n8n-playwright test:local"
type: string
shards:
description: "Shards for parallel execution"
description: "Shards for parallel execution"
required: false
default: "[1, 2, 3, 4, 5, 6, 7, 8]"
default: "[1, 2, 3, 4, 5, 6, 7, 8]"
type: string
docker-image:
description: "Docker image to use (for docker-pull mode)"
description: "Docker image to use (for docker-pull mode)"
required: false
default: "n8nio/n8n:nightly"
default: "n8nio/n8n:nightly"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate YAML keys break workflow input definitions

High Severity

Multiple workflow input fields have duplicate YAML keys for description and default values. For example, branch, test-mode, test-command, shards, and docker-image inputs each have their description and default lines appearing twice. Additionally, runs-on: ubuntu-latest appears twice at lines 70-71. YAML parsers may fail or silently use only the last value, causing unexpected behavior in CI.

Additional Locations (1)

Fix in CursorΒ Fix in Web

type: string
workers:
description: "Number of parallel workers"
required: false
default: ""
type: string
runner:
description: 'GitHub runner to use'
required: false
default: 'blacksmith-2vcpu-ubuntu-2204'
type: string

secrets:
CURRENTS_RECORD_KEY:
Expand All @@ -63,6 +67,7 @@ env:

jobs:
test:
runs-on: ubuntu-latest
runs-on: ubuntu-latest
strategy:
fail-fast: false
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ on:

jobs:
build-arm64:
runs-on: ubuntu-22.04-arm
runs-on: ubuntu-latest
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ARM64 build job runs on x86_64 runner

High Severity

The build-arm64 job's runner was changed from ubuntu-22.04-arm to ubuntu-latest. The job is explicitly named "build-arm64" with a step called "Setup and Build ARM64", but ubuntu-latest is an x86_64 runner, not ARM64. This means the job will not produce ARM64 artifacts as intended. The publish-to-docker-hub job depends on this build completing successfully, so release builds expecting ARM64 binaries will either fail or receive x86_64 binaries incorrectly.

Fix in CursorΒ Fix in Web

if: github.event.pull_request.merged == true
env:
NODE_OPTIONS: --max-old-space-size=6144
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/units-tests-reusable.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ env:
jobs:
unit-test-backend:
name: Backend Unit Tests
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
env:
COVERAGE_ENABLED: ${{ inputs.collectCoverage }} # Coverage collected when true
steps:
Expand Down Expand Up @@ -61,7 +61,7 @@ jobs:

integration-test-backend:
name: Backend Integration Tests
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
env:
COVERAGE_ENABLED: ${{ inputs.collectCoverage }} # Coverage collected when true
steps:
Expand Down Expand Up @@ -94,7 +94,7 @@ jobs:

unit-test-nodes:
name: Nodes Unit Tests
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
env:
COVERAGE_ENABLED: ${{ inputs.collectCoverage }} # Coverage collected when true
steps:
Expand Down Expand Up @@ -127,7 +127,7 @@ jobs:

unit-test-frontend:
name: Frontend (${{ matrix.shard }}/2)
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,6 @@ __pycache__
packages/cli/THIRD_PARTY_LICENSES.md
.coverage
.nyc_output
packages/cli/src/commands/export/outputs
packages/cli/src/commands/export/outputs
logs/*
logs/n8n.log
2 changes: 1 addition & 1 deletion .prettierrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,5 @@ module.exports = {
/**
* https://prettier.io/docs/en/options.html#print-width
*/
printWidth: 100,
printWidth: 140,
};
4 changes: 3 additions & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,12 @@
{
"name": "Launch n8n with debug",
"program": "${workspaceFolder}/packages/cli/bin/n8n",
"cwd": "${workspaceFolder}/packages/cli/bin",
"cwd": "${workspaceFolder}/packages/cli",
"args": ["start"],
"request": "launch",
"skipFiles": ["<node_internals>/**"],
"type": "node",
"envFile": "${workspaceFolder}/.env",
"outputCapture": "std",
"killBehavior": "forceful"
},
Expand Down
2 changes: 1 addition & 1 deletion biome.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"indentStyle": "tab",
"indentWidth": 2,
"lineEnding": "lf",
"lineWidth": 100,
"lineWidth": 140,
"attributePosition": "auto",
"ignore": [
// Handled by prettier
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"generate:third-party-licenses": "node scripts/generate-third-party-licenses.mjs",
"setup-backend-module": "node scripts/ensure-zx.mjs && zx scripts/backend-module/setup.mjs",
"start": "run-script-os",
"start:dev": "set -a && source .env && set +a && pnpm start",
"start:default": "cd packages/cli/bin && ./n8n",
"start:tunnel": "./packages/cli/bin/n8n start --tunnel",
"start:windows": "cd packages/cli/bin && n8n",
Expand Down
17 changes: 17 additions & 0 deletions packages/@intento/agents/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { defineConfig, globalIgnores } from 'eslint/config';
import { nodeConfig } from '@n8n/eslint-config/node';

export default defineConfig(
nodeConfig,
globalIgnores(['bin/*.js', 'nodes-testing/*.ts', 'coverage/*']),
{
rules: {
complexity: ['error', 15],
'unicorn/filename-case': ['error', { case: 'kebabCase' }],
},
},
{
files: ['**/*.test.ts', '**/test/**/*.ts', '**/__test__/**/*.ts', '**/__tests__/**/*.ts'],
rules: {},
},
);
24 changes: 24 additions & 0 deletions packages/@intento/agents/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/** @type {import('jest').Config} */
module.exports = {
...require('../../../jest.config'),
globalSetup: '<rootDir>/test/setup.ts',
setupFilesAfterEnv: ['<rootDir>/test/setup-mocks.ts'],
// Include in coverage
collectCoverageFrom: [
'src/**/*.ts',
'!src/**/\\*\\.ts',
'!src/**/*.d.ts',
'!src/**/index.ts', // Exclude barrel files
'!src/**/__tests__/**', // Exclude test files
],

// Set minimum thresholds
coverageThreshold: {
global: {
branches: 95,
functions: 95,
lines: 95,
statements: 95,
},
},
};
41 changes: 41 additions & 0 deletions packages/@intento/agents/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"name": "intento-agents",
"version": "1.0.0",
"description": "Agents functionality of intento extension for n8n",
"main": "dist/index",
"types": "dist/index.d.ts",

"scripts": {
"clean": "rimraf dist .turbo",
"typecheck": "tsc --noEmit",
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
"dev": "pnpm watch",
"format": "biome format --write .",
"format:check": "biome ci .",
"lint": "eslint . --quiet",
"lint:fix": "eslint . --fix",
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\"",
"test": "jest --coverage",
"test:unit": "jest --coverage",
"test:dev": "jest --watch"
},
"files": [
"dist",
"bin"
],
"devDependencies": {
"@n8n/typescript-config": "workspace:^",
"n8n-workflow": "workspace:^",
"intento-core": "workspace:^",
"intento-segmentation": "workspace:^",
"intento-translation": "workspace:^"
},
"dependencies": {
"@echogarden/icu-segmentation-wasm": "^0.2.2",
"@echogarden/text-segmentation": "^0.4.1",
"n8n-workflow": "workspace:^",
"intento-core": "workspace:^",
"intento-segmentation": "workspace:^",
"intento-translation": "workspace:^"
}
}
2 changes: 2 additions & 0 deletions packages/@intento/agents/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// intento-agents/translation
export * from 'translation/*';
2 changes: 2 additions & 0 deletions packages/@intento/agents/src/translation/*.ts
Comment thread
apl-intento marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './translation-agent';
export * from './translation-agent-descriptor';
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { IDescriptor } from 'intento-core';

export const TranslationAgentDescriptor: IDescriptor = {
name: 'ai.text.translation.agent',
symbol: 'πŸ€– [Translation Agent]',
tool: 'intentoTranslationAgentTool',
node: 'intentoTranslationAgentNode',
displayName: 'Translation Agent',
description: 'AI-powered translation agent for intelligent text translation workflows',
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { AgentRequestBase } from 'intento-core';
import type { TranslationContext } from 'intento-translation';
import type { IDataObject, LogMetadata } from 'n8n-workflow';

export class TranslationAgentRequest extends AgentRequestBase {
readonly text: string[];
readonly to: string;
readonly from?: string;

constructor(context: TranslationContext) {
super();

this.text = context.text;
this.to = context.to;
this.from = context.from;

Object.freeze(this);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not think that is neccesarry

}

throwIfInvalid(): void {
if (!this.to || this.to.trim() === '') throw new Error('"to" is required');
if (this.text.length === 0) throw new Error('"text" must contain at least one string to translate.');
const wrongText = this.text.filter((t) => t === null || t === undefined);
if (wrongText.length > 0) throw new Error('"text" contains invalid string (null or undefined).');
super.throwIfInvalid();
}

asLogMetadata(): LogMetadata {
return {
...super.asLogMetadata(),
from: this.from,
to: this.to,
textCount: this.text.length,
};
}

asDataObject(): IDataObject {
return {
from: this.from,
to: this.to,
text: this.text,
};
}
}
Loading