Full Code of n8n-io/n8n for AI

master 629826ca1ded cached
16087 files
93.2 MB
25.5M tokens
35533 symbols
3 requests
Copy disabled (too large) Download .txt
Showing preview only (101,848K chars total). Download the full file to get everything.
Repository: n8n-io/n8n
Branch: master
Commit: 629826ca1ded
Files: 16087
Total size: 93.2 MB

Directory structure:
gitextract_eip95s6_/

├── .actrc
├── .agents/
│   └── design-system-style-rules.md
├── .claude/
│   ├── README.md
│   ├── agents/
│   │   ├── n8n-developer.md
│   │   └── n8n-linear-issue-triager.md
│   ├── commands/
│   │   ├── n8n-plan.md
│   │   └── n8n-triage.md
│   ├── plugins/
│   │   └── n8n/
│   │       ├── .claude-plugin/
│   │       │   ├── marketplace.json
│   │       │   └── plugin.json
│   │       ├── README.md
│   │       └── skills/
│   │           └── setup-mcps/
│   │               └── SKILL.md
│   ├── settings.json
│   └── skills/
│       ├── content-design/
│       │   └── SKILL.md
│       ├── create-issue/
│       │   └── SKILL.md
│       ├── create-pr/
│       │   └── SKILL.md
│       ├── create-skill/
│       │   └── SKILL.md
│       ├── linear-issue/
│       │   └── SKILL.md
│       ├── loom-transcript/
│       │   └── SKILL.md
│       ├── n8n-conventions/
│       │   └── SKILL.md
│       ├── node-add-oauth/
│       │   └── SKILL.md
│       ├── reproduce-bug/
│       │   └── SKILL.md
│       └── spec-driven-development/
│           └── SKILL.md
├── .devcontainer/
│   ├── Dockerfile
│   ├── devcontainer.json
│   └── docker-compose.yml
├── .dockerignore
├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CI-TELEMETRY.md
│   ├── CLAUDE.md
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01-bug.yml
│   │   └── config.yml
│   ├── WORKFLOWS.md
│   ├── actionlint.yml
│   ├── actions/
│   │   ├── ci-filter/
│   │   │   ├── __tests__/
│   │   │   │   └── ci-filter.test.ts
│   │   │   ├── action.yml
│   │   │   └── ci-filter.mjs
│   │   ├── docker-registry-login/
│   │   │   └── action.yml
│   │   └── setup-nodejs/
│   │       └── action.yml
│   ├── claude-templates/
│   │   ├── e2e-test.md
│   │   └── security-fix.md
│   ├── docker-compose.yml
│   ├── poutine-rules/
│   │   └── unpinned_action.rego
│   ├── pull_request_template.md
│   ├── pull_request_title_conventions.md
│   ├── scripts/
│   │   ├── bump-versions.mjs
│   │   ├── claude-task/
│   │   │   ├── prepare-claude-prompt.mjs
│   │   │   └── resume-callback.mjs
│   │   ├── cleanup-ghcr-images.mjs
│   │   ├── cleanup-release-branch.mjs
│   │   ├── cleanup-release-branch.test.mjs
│   │   ├── compute-backport-targets.mjs
│   │   ├── compute-backport-targets.test.mjs
│   │   ├── create-github-release.mjs
│   │   ├── detect-new-packages.mjs
│   │   ├── determine-release-candidate-branch-for-track.mjs
│   │   ├── determine-release-version-changes.mjs
│   │   ├── determine-release-version-changes.test.mjs
│   │   ├── determine-version-info.mjs
│   │   ├── determine-version-info.test.mjs
│   │   ├── docker/
│   │   │   ├── docker-config.mjs
│   │   │   ├── docker-tags.mjs
│   │   │   └── get-manifest-digests.mjs
│   │   ├── ensure-provenance-fields.mjs
│   │   ├── ensure-release-candidate-branches.mjs
│   │   ├── ensure-release-candidate-branches.test.mjs
│   │   ├── fixtures/
│   │   │   └── mock-github-event.json
│   │   ├── get-release-versions.mjs
│   │   ├── github-helpers.mjs
│   │   ├── jsconfig.json
│   │   ├── move-track-tag.mjs
│   │   ├── package.json
│   │   ├── plan-release.mjs
│   │   ├── populate-cloud-databases.mjs
│   │   ├── promote-github-release.mjs
│   │   ├── retry.mjs
│   │   ├── send-build-stats.mjs
│   │   ├── send-docker-stats.mjs
│   │   ├── send-metrics.mjs
│   │   ├── send-version-release-notification.mjs
│   │   ├── trim-fe-packageJson.js
│   │   └── update-changelog.mjs
│   ├── test-metrics/
│   │   └── playwright.json
│   └── workflows/
│       ├── backport.yml
│       ├── build-base-image.yml
│       ├── build-benchmark-image.yml
│       ├── build-windows.yml
│       ├── ci-check-pr-title.yml
│       ├── ci-check-release-from-fork.yml
│       ├── ci-detect-new-packages.yml
│       ├── ci-master.yml
│       ├── ci-pull-requests.yml
│       ├── ci-python.yml
│       ├── ci-restrict-private-merges.yml
│       ├── docker-build-push.yml
│       ├── docker-build-smoke.yml
│       ├── release-create-github-releases.yml
│       ├── release-create-minor-pr.yml
│       ├── release-create-patch-pr.yml
│       ├── release-create-pr.yml
│       ├── release-merge-tag-to-branch.yml
│       ├── release-populate-cloud-with-releases.yml
│       ├── release-promote-github-release.yml
│       ├── release-publish-new-package.yml
│       ├── release-publish-post-release.yml
│       ├── release-publish.yml
│       ├── release-push-to-channel.yml
│       ├── release-schedule-patch-prs.yml
│       ├── release-standalone-package.yml
│       ├── release-update-pointer-tag.yml
│       ├── release-version-release-notification.yml
│       ├── sbom-generation-callable.yml
│       ├── sec-ci-reusable.yml
│       ├── sec-poutine-reusable.yml
│       ├── sec-publish-fix-1x.yml
│       ├── sec-publish-fix.yml
│       ├── sec-sync-public-to-private.yml
│       ├── security-trivy-scan-callable.yml
│       ├── test-bench-reusable.yml
│       ├── test-benchmark-destroy-nightly.yml
│       ├── test-benchmark-nightly.yml
│       ├── test-db-reusable.yml
│       ├── test-e2e-ci-reusable.yml
│       ├── test-e2e-coverage-weekly.yml
│       ├── test-e2e-docker-pull-reusable.yml
│       ├── test-e2e-helm.yml
│       ├── test-e2e-infrastructure-reusable.yml
│       ├── test-e2e-performance-reusable.yml
│       ├── test-e2e-reusable.yml
│       ├── test-evals-ai-release.yml
│       ├── test-evals-ai-reusable.yml
│       ├── test-evals-ai.yml
│       ├── test-evals-python.yml
│       ├── test-linting-reusable.yml
│       ├── test-unit-reusable.yml
│       ├── test-visual-chromatic.yml
│       ├── test-visual-storybook.yml
│       ├── test-workflow-scripts-reusable.yml
│       ├── test-workflows-callable.yml
│       ├── test-workflows-nightly.yml
│       ├── test-workflows-pr-comment.yml
│       ├── util-approve-and-set-automerge.yml
│       ├── util-backport-bundle.yml
│       ├── util-claude-task.yml
│       ├── util-claude.yml
│       ├── util-cleanup-abandoned-release-branches.yml
│       ├── util-cleanup-pr-images.yml
│       ├── util-data-tooling.yml
│       ├── util-determine-current-version.yml
│       ├── util-ensure-release-candidate-branches.yml
│       ├── util-notify-pr-status.yml
│       ├── util-sync-api-docs.yml
│       └── util-update-node-popularity.yml
├── .gitignore
├── .npmignore
├── .npmrc
├── .poutine.yml
├── .prettierignore
├── .prettierrc.js
├── .vscode/
│   ├── extensions.json
│   └── settings.default.json
├── AGENTS.md
├── CHANGELOG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTOR_LICENSE_AGREEMENT.md
├── LICENSE.md
├── LICENSE_EE.md
├── README.md
├── SECURITY.md
├── biome.jsonc
├── codecov.yml
├── cubic.yaml
├── docker/
│   └── images/
│       ├── n8n/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   └── docker-entrypoint.sh
│       ├── n8n-base/
│       │   └── Dockerfile
│       └── runners/
│           ├── Dockerfile
│           ├── Dockerfile.distroless
│           ├── README.md
│           └── n8n-task-runners.json
├── jest.config.js
├── lefthook.yml
├── package.json
├── packages/
│   ├── @n8n/
│   │   ├── agents/
│   │   │   ├── AGENTS.md
│   │   │   ├── docs/
│   │   │   │   └── agent-runtime-architecture.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── examples/
│   │   │   │   └── basic-agent.ts
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── agent-runtime.test.ts
│   │   │   │   │   ├── event-bus.test.ts
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   └── mcp-stdio-server.mjs
│   │   │   │   │   ├── inmemory-working-memory.test.ts
│   │   │   │   │   ├── integration/
│   │   │   │   │   │   ├── batched-tool-execution.test.ts
│   │   │   │   │   │   ├── concurrent-tool-execution.test.ts
│   │   │   │   │   │   ├── custom-message-suspend-resume.test.ts
│   │   │   │   │   │   ├── evaluate.test.ts
│   │   │   │   │   │   ├── events-and-abort.test.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── json-schema-validation.test.ts
│   │   │   │   │   │   ├── mcp-connection.test.ts
│   │   │   │   │   │   ├── mcp-runtime.test.ts
│   │   │   │   │   │   ├── mcp-server-helpers.ts
│   │   │   │   │   │   ├── mcp-sse-transport.test.ts
│   │   │   │   │   │   ├── mcp-stdio-transport.test.ts
│   │   │   │   │   │   ├── mcp-streamable-http-transport.test.ts
│   │   │   │   │   │   ├── memory/
│   │   │   │   │   │   │   ├── memory-custom-backend.test.ts
│   │   │   │   │   │   │   ├── memory-freeform.test.ts
│   │   │   │   │   │   │   ├── memory-postgres.test.ts
│   │   │   │   │   │   │   ├── memory-semantic.test.ts
│   │   │   │   │   │   │   ├── memory-sqlite.test.ts
│   │   │   │   │   │   │   ├── memory-structured.test.ts
│   │   │   │   │   │   │   └── memory.test.ts
│   │   │   │   │   │   ├── multi-tool-calls.test.ts
│   │   │   │   │   │   ├── multimodal.test.ts
│   │   │   │   │   │   ├── orphaned-tool-messages.test.ts
│   │   │   │   │   │   ├── provider-metadata.test.ts
│   │   │   │   │   │   ├── provider-options.test.ts
│   │   │   │   │   │   ├── provider-tools.test.ts
│   │   │   │   │   │   ├── state-restore-after-suspension.test.ts
│   │   │   │   │   │   ├── stream-timing.test.ts
│   │   │   │   │   │   ├── structured-output.test.ts
│   │   │   │   │   │   ├── sub-agent.test.ts
│   │   │   │   │   │   ├── telemetry-langsmith.test.ts
│   │   │   │   │   │   ├── thinking.test.ts
│   │   │   │   │   │   ├── title-generation.test.ts
│   │   │   │   │   │   ├── to-model-output.test.ts
│   │   │   │   │   │   ├── token-usage.test.ts
│   │   │   │   │   │   ├── tool-error-handling.test.ts
│   │   │   │   │   │   ├── tool-interrupt.test.ts
│   │   │   │   │   │   ├── tool-result-to-message.test.ts
│   │   │   │   │   │   ├── usage.test.ts
│   │   │   │   │   │   ├── workspace/
│   │   │   │   │   │   │   └── workspace-agent.test.ts
│   │   │   │   │   │   └── zod-validation-error.test.ts
│   │   │   │   │   ├── model-factory.test.ts
│   │   │   │   │   ├── sqlite-memory.test.ts
│   │   │   │   │   ├── strip-orphaned-tool-messages.test.ts
│   │   │   │   │   ├── telemetry.test.ts
│   │   │   │   │   ├── tool-adapter.test.ts
│   │   │   │   │   ├── tool.test.ts
│   │   │   │   │   ├── working-memory.test.ts
│   │   │   │   │   └── workspace/
│   │   │   │   │       ├── base-filesystem.test.ts
│   │   │   │   │       ├── base-sandbox.test.ts
│   │   │   │   │       ├── lifecycle.test.ts
│   │   │   │   │       ├── test-utils.ts
│   │   │   │   │       ├── workspace-integration.test.ts
│   │   │   │   │       ├── workspace-tools.test.ts
│   │   │   │   │       └── workspace.test.ts
│   │   │   │   ├── evals/
│   │   │   │   │   ├── categorization.ts
│   │   │   │   │   ├── contains-keywords.ts
│   │   │   │   │   ├── correctness.ts
│   │   │   │   │   ├── helpfulness.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── json-validity.ts
│   │   │   │   │   ├── parse-judge-response.ts
│   │   │   │   │   ├── string-similarity.ts
│   │   │   │   │   └── tool-call-accuracy.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── integrations/
│   │   │   │   │   └── langsmith.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── agent-runtime.ts
│   │   │   │   │   ├── event-bus.ts
│   │   │   │   │   ├── logger.ts
│   │   │   │   │   ├── mcp-connection.ts
│   │   │   │   │   ├── mcp-tool-resolver.ts
│   │   │   │   │   ├── memory-store.ts
│   │   │   │   │   ├── message-list.ts
│   │   │   │   │   ├── messages.ts
│   │   │   │   │   ├── model-factory.ts
│   │   │   │   │   ├── run-state.ts
│   │   │   │   │   ├── runtime-helpers.ts
│   │   │   │   │   ├── stream.ts
│   │   │   │   │   ├── strip-orphaned-tool-messages.ts
│   │   │   │   │   ├── title-generation.ts
│   │   │   │   │   ├── tool-adapter.ts
│   │   │   │   │   └── working-memory.ts
│   │   │   │   ├── sdk/
│   │   │   │   │   ├── agent.ts
│   │   │   │   │   ├── catalog.ts
│   │   │   │   │   ├── eval.ts
│   │   │   │   │   ├── evaluate.ts
│   │   │   │   │   ├── guardrail.ts
│   │   │   │   │   ├── mcp-client.ts
│   │   │   │   │   ├── memory.ts
│   │   │   │   │   ├── message.ts
│   │   │   │   │   ├── network.ts
│   │   │   │   │   ├── provider-tools.ts
│   │   │   │   │   ├── telemetry.ts
│   │   │   │   │   ├── tool.ts
│   │   │   │   │   └── verify.ts
│   │   │   │   ├── storage/
│   │   │   │   │   ├── postgres-memory.ts
│   │   │   │   │   └── sqlite-memory.ts
│   │   │   │   ├── types/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── runtime/
│   │   │   │   │   │   ├── event.ts
│   │   │   │   │   │   └── message-list.ts
│   │   │   │   │   ├── sdk/
│   │   │   │   │   │   ├── agent.ts
│   │   │   │   │   │   ├── eval.ts
│   │   │   │   │   │   ├── guardrail.ts
│   │   │   │   │   │   ├── mcp.ts
│   │   │   │   │   │   ├── memory.ts
│   │   │   │   │   │   ├── message.ts
│   │   │   │   │   │   ├── provider.ts
│   │   │   │   │   │   └── tool.ts
│   │   │   │   │   ├── telemetry.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       └── json.ts
│   │   │   │   ├── utils/
│   │   │   │   │   └── zod.ts
│   │   │   │   └── workspace/
│   │   │   │       ├── filesystem/
│   │   │   │       │   └── base-filesystem.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── lifecycle.ts
│   │   │   │       ├── process.ts
│   │   │   │       ├── sandbox/
│   │   │   │       │   └── base-sandbox.ts
│   │   │   │       ├── tools/
│   │   │   │       │   ├── append-file.ts
│   │   │   │       │   ├── copy-file.ts
│   │   │   │       │   ├── delete-file.ts
│   │   │   │       │   ├── execute-command.ts
│   │   │   │       │   ├── file-stat.ts
│   │   │   │       │   ├── list-files.ts
│   │   │   │       │   ├── mkdir.ts
│   │   │   │       │   ├── move-file.ts
│   │   │   │       │   ├── process-tools.ts
│   │   │   │       │   ├── read-file.ts
│   │   │   │       │   ├── rmdir.ts
│   │   │   │       │   ├── workspace-tools.ts
│   │   │   │       │   └── write-file.ts
│   │   │   │       ├── types.ts
│   │   │   │       └── workspace.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.integration.config.mjs
│   │   ├── ai-node-sdk/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   └── index.ts
│   │   │   ├── tsconfig.build.cjs.json
│   │   │   ├── tsconfig.build.esm.json
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── ai-utilities/
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── integration-tests/
│   │   │   │   ├── openai.fixtures.ts
│   │   │   │   ├── openai.test.ts
│   │   │   │   └── openai.ts
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   └── copy-tokenizer-json.js
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── adapters/
│   │   │   │   │   │   ├── langchain-chat-model.test.ts
│   │   │   │   │   │   ├── langchain-history-adapter.test.ts
│   │   │   │   │   │   └── langchain-memory-adapter.test.ts
│   │   │   │   │   ├── converters/
│   │   │   │   │   │   ├── message-roundtrip.test.ts
│   │   │   │   │   │   └── tool.test.ts
│   │   │   │   │   ├── memory/
│   │   │   │   │   │   └── windowed-chat-memory.test.ts
│   │   │   │   │   ├── suppliers/
│   │   │   │   │   │   └── supplyModel.test.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── embeddings-input-validation.test.ts
│   │   │   │   │       ├── failed-attempt-handler/
│   │   │   │   │       │   ├── n8nDefaultFailedAttemptHandler.test.ts
│   │   │   │   │       │   └── n8nLlmFailedAttemptHandler.test.ts
│   │   │   │   │       ├── fromai-tool-factory.test.ts
│   │   │   │   │       ├── helpers.test.ts
│   │   │   │   │       ├── http-proxy-agent.test.ts
│   │   │   │   │       ├── log-ai-event.test.ts
│   │   │   │   │       ├── n8n-binary-loader.test.ts
│   │   │   │   │       ├── n8n-json-loader.test.ts
│   │   │   │   │       ├── n8n-llm-tracing.test.ts
│   │   │   │   │       ├── sse.test.ts
│   │   │   │   │       └── tokenizer/
│   │   │   │   │           ├── tiktoken.test.ts
│   │   │   │   │           └── token-estimator.test.ts
│   │   │   │   ├── adapters/
│   │   │   │   │   ├── langchain-chat-model.ts
│   │   │   │   │   ├── langchain-history.ts
│   │   │   │   │   └── langchain-memory.ts
│   │   │   │   ├── ai-node-sdk-version.ts
│   │   │   │   ├── chat-model/
│   │   │   │   │   └── base.ts
│   │   │   │   ├── converters/
│   │   │   │   │   ├── message.ts
│   │   │   │   │   └── tool.ts
│   │   │   │   ├── guards.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── memory/
│   │   │   │   │   ├── base-chat-history.ts
│   │   │   │   │   ├── base-chat-memory.ts
│   │   │   │   │   └── windowed-chat-memory.ts
│   │   │   │   ├── suppliers/
│   │   │   │   │   ├── supplyMemory.ts
│   │   │   │   │   └── supplyModel.ts
│   │   │   │   ├── types/
│   │   │   │   │   ├── chat-model.ts
│   │   │   │   │   ├── json.ts
│   │   │   │   │   ├── memory.ts
│   │   │   │   │   ├── message.ts
│   │   │   │   │   ├── openai.ts
│   │   │   │   │   ├── output.ts
│   │   │   │   │   └── tool.ts
│   │   │   │   └── utils/
│   │   │   │       ├── embeddings-input-validation.ts
│   │   │   │       ├── failed-attempt-handler/
│   │   │   │       │   ├── n8nDefaultFailedAttemptHandler.ts
│   │   │   │       │   └── n8nLlmFailedAttemptHandler.ts
│   │   │   │       ├── fromai-tool-factory.ts
│   │   │   │       ├── helpers.ts
│   │   │   │       ├── http-proxy-agent.ts
│   │   │   │       ├── log-ai-event.ts
│   │   │   │       ├── log-wrapper.ts
│   │   │   │       ├── n8n-binary-loader.ts
│   │   │   │       ├── n8n-json-loader.ts
│   │   │   │       ├── n8n-llm-tracing.ts
│   │   │   │       ├── shared-fields.ts
│   │   │   │       ├── sse.ts
│   │   │   │       ├── tokenizer/
│   │   │   │       │   ├── cl100k_base.json
│   │   │   │       │   ├── o200k_base.json
│   │   │   │       │   ├── tiktoken.ts
│   │   │   │       │   └── token-estimator.ts
│   │   │   │       └── vector-store/
│   │   │   │           ├── MemoryManager/
│   │   │   │           │   ├── MemoryCalculator.ts
│   │   │   │           │   ├── MemoryVectorStoreManager.ts
│   │   │   │           │   ├── StoreCleanupService.ts
│   │   │   │           │   ├── config.ts
│   │   │   │           │   ├── test/
│   │   │   │           │   │   ├── MemoryCalculator.test.ts
│   │   │   │           │   │   ├── MemoryVectorStoreManager.test.ts
│   │   │   │           │   │   ├── StoreCleanupService.test.ts
│   │   │   │           │   │   └── config.test.ts
│   │   │   │           │   └── types.ts
│   │   │   │           ├── createVectorStoreNode/
│   │   │   │           │   ├── README.md
│   │   │   │           │   ├── __snapshots__/
│   │   │   │           │   │   └── createVectorStoreNode.test.ts.snap
│   │   │   │           │   ├── __tests__/
│   │   │   │           │   │   └── utils.test.ts
│   │   │   │           │   ├── constants.ts
│   │   │   │           │   ├── createVectorStoreNode.test.ts
│   │   │   │           │   ├── createVectorStoreNode.ts
│   │   │   │           │   ├── operations/
│   │   │   │           │   │   ├── __tests__/
│   │   │   │           │   │   │   ├── insertOperation.test.ts
│   │   │   │           │   │   │   ├── loadOperation.test.ts
│   │   │   │           │   │   │   ├── operationHandlers.test.ts
│   │   │   │           │   │   │   ├── retrieveAsToolExecuteOperation.test.ts
│   │   │   │           │   │   │   ├── retrieveAsToolOperation.test.ts
│   │   │   │           │   │   │   ├── retrieveOperation.test.ts
│   │   │   │           │   │   │   └── updateOperation.test.ts
│   │   │   │           │   │   ├── index.ts
│   │   │   │           │   │   ├── insertOperation.ts
│   │   │   │           │   │   ├── loadOperation.ts
│   │   │   │           │   │   ├── retrieveAsToolExecuteOperation.ts
│   │   │   │           │   │   ├── retrieveAsToolOperation.ts
│   │   │   │           │   │   ├── retrieveOperation.ts
│   │   │   │           │   │   └── updateOperation.ts
│   │   │   │           │   ├── types.ts
│   │   │   │           │   └── utils.ts
│   │   │   │           └── processDocuments.ts
│   │   │   ├── tsconfig.build.cjs.json
│   │   │   ├── tsconfig.build.esm.json
│   │   │   └── tsconfig.json
│   │   ├── ai-workflow-builder.ee/
│   │   │   ├── .gitignore
│   │   │   ├── .madgerc
│   │   │   ├── AGENTS.md
│   │   │   ├── CLAUDE.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── evaluations/
│   │   │   │   ├── README.md
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── argument-parser.test.ts
│   │   │   │   │   ├── cli.test.ts
│   │   │   │   │   ├── csv-prompt-loader.test.ts
│   │   │   │   │   ├── evaluation-helpers.test.ts
│   │   │   │   │   ├── evaluators/
│   │   │   │   │   │   ├── llm-judge.test.ts
│   │   │   │   │   │   ├── pairwise.test.ts
│   │   │   │   │   │   ├── programmatic.test.ts
│   │   │   │   │   │   ├── response-matches-workflow-changes.test.ts
│   │   │   │   │   │   └── similarity.test.ts
│   │   │   │   │   ├── feedback.test.ts
│   │   │   │   │   ├── lifecycle.test.ts
│   │   │   │   │   ├── output.test.ts
│   │   │   │   │   ├── report-generator.test.ts
│   │   │   │   │   ├── runner-langsmith.test.ts
│   │   │   │   │   ├── runner.test.ts
│   │   │   │   │   ├── score-calculator.test.ts
│   │   │   │   │   ├── test-case-generator.test.ts
│   │   │   │   │   ├── trace-filters.test.ts
│   │   │   │   │   └── webhook.test.ts
│   │   │   │   ├── cli/
│   │   │   │   │   ├── argument-parser.ts
│   │   │   │   │   ├── ci-metadata.ts
│   │   │   │   │   ├── csv-prompt-loader.ts
│   │   │   │   │   ├── dataset-file-loader.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── webhook.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── evaluators/
│   │   │   │   │   ├── binary-checks/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── index.test.ts
│   │   │   │   │   │   ├── checks/
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   └── deterministic-checks.test.ts
│   │   │   │   │   │   │   ├── all-nodes-connected.ts
│   │   │   │   │   │   │   ├── create-validation-check.ts
│   │   │   │   │   │   │   ├── expressions-reference-existing-nodes.ts
│   │   │   │   │   │   │   ├── has-start-node.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── no-empty-set-nodes.ts
│   │   │   │   │   │   │   ├── no-unnecessary-code-nodes.ts
│   │   │   │   │   │   │   ├── no-unreachable-nodes.ts
│   │   │   │   │   │   │   └── validation-checks.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── llm-checks/
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   └── create-llm-check.test.ts
│   │   │   │   │   │   │   ├── correct-node-operations.ts
│   │   │   │   │   │   │   ├── create-llm-check.ts
│   │   │   │   │   │   │   ├── descriptive-node-names.ts
│   │   │   │   │   │   │   ├── fulfills-user-request.ts
│   │   │   │   │   │   │   ├── handles-multiple-items.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── response-matches-workflow-changes.ts
│   │   │   │   │   │   │   ├── schemas.ts
│   │   │   │   │   │   │   └── valid-data-flow.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── execution/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── llm-judge/
│   │   │   │   │   │   ├── evaluation.ts
│   │   │   │   │   │   ├── evaluators/
│   │   │   │   │   │   │   ├── base.ts
│   │   │   │   │   │   │   ├── best-practices-evaluator.ts
│   │   │   │   │   │   │   ├── connections-evaluator.ts
│   │   │   │   │   │   │   ├── data-flow-evaluator.ts
│   │   │   │   │   │   │   ├── efficiency-evaluator.ts
│   │   │   │   │   │   │   ├── expressions-evaluator.ts
│   │   │   │   │   │   │   ├── functionality-evaluator.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── maintainability-evaluator.ts
│   │   │   │   │   │   │   └── node-configuration-evaluator.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── workflow-evaluator.test.ts
│   │   │   │   │   │   └── workflow-evaluator.ts
│   │   │   │   │   ├── pairwise/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── judge-chain.test.ts
│   │   │   │   │   │   ├── judge-chain.ts
│   │   │   │   │   │   ├── judge-panel.test.ts
│   │   │   │   │   │   ├── judge-panel.ts
│   │   │   │   │   │   └── metrics.ts
│   │   │   │   │   ├── programmatic/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── responder/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── responder-judge.prompt.ts
│   │   │   │   │   └── similarity/
│   │   │   │   │       └── index.ts
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── default-prompts.csv
│   │   │   │   │   └── reference-workflows/
│   │   │   │   │       ├── ai-news-digest.json
│   │   │   │   │       ├── daily-weather-report.json
│   │   │   │   │       ├── email-summary.json
│   │   │   │   │       ├── extract-from-file.json
│   │   │   │   │       ├── google-sheets-processing.json
│   │   │   │   │       ├── invoice-pipeline.json
│   │   │   │   │       ├── lead-qualification.json
│   │   │   │   │       ├── multi-agent-research.json
│   │   │   │   │       ├── rag-assistant.json
│   │   │   │   │       └── youtube-auto-chapters.json
│   │   │   │   ├── harness/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── csv-writer.test.ts
│   │   │   │   │   │   └── token-tracking-handler.test.ts
│   │   │   │   │   ├── csv-writer.ts
│   │   │   │   │   ├── evaluation-helpers.ts
│   │   │   │   │   ├── feedback.ts
│   │   │   │   │   ├── harness-types.ts
│   │   │   │   │   ├── langsmith-dataset-writer.ts
│   │   │   │   │   ├── lifecycle.ts
│   │   │   │   │   ├── logger.ts
│   │   │   │   │   ├── output.ts
│   │   │   │   │   ├── runner.ts
│   │   │   │   │   ├── score-calculator.ts
│   │   │   │   │   ├── subgraph-evaluation-local.ts
│   │   │   │   │   ├── subgraph-evaluation.ts
│   │   │   │   │   ├── subgraph-runner.ts
│   │   │   │   │   ├── token-tracking-handler.ts
│   │   │   │   │   └── workflow-regenerator.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── langsmith/
│   │   │   │   │   ├── trace-filters.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── lifecycles/
│   │   │   │   │   └── introspection-analysis.ts
│   │   │   │   ├── programmatic/
│   │   │   │   │   ├── evaluators/
│   │   │   │   │   │   ├── agent-prompt.test.ts
│   │   │   │   │   │   ├── agent-prompt.ts
│   │   │   │   │   │   ├── connections.test.ts
│   │   │   │   │   │   ├── connections.ts
│   │   │   │   │   │   ├── credentials.test.ts
│   │   │   │   │   │   ├── credentials.ts
│   │   │   │   │   │   ├── from-ai.ts
│   │   │   │   │   │   ├── graph-validation.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── node-usage.ts
│   │   │   │   │   │   ├── nodes.test.ts
│   │   │   │   │   │   ├── nodes.ts
│   │   │   │   │   │   ├── parameters.test.ts
│   │   │   │   │   │   ├── parameters.ts
│   │   │   │   │   │   ├── tools.ts
│   │   │   │   │   │   ├── trigger.test.ts
│   │   │   │   │   │   ├── trigger.ts
│   │   │   │   │   │   ├── workflow-similarity.test.ts
│   │   │   │   │   │   └── workflow-similarity.ts
│   │   │   │   │   ├── programmatic-evaluation.ts
│   │   │   │   │   ├── python/
│   │   │   │   │   │   ├── CONFIGURATION.md
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── example_workflows/
│   │   │   │   │   │   │   ├── generated.json
│   │   │   │   │   │   │   ├── generated_wrong.json
│   │   │   │   │   │   │   ├── multi_trigger.json
│   │   │   │   │   │   │   ├── multi_trigger_different_order.json
│   │   │   │   │   │   │   ├── multi_trigger_missing_node.json
│   │   │   │   │   │   │   └── simple_workflow.json
│   │   │   │   │   │   ├── justfile
│   │   │   │   │   │   ├── pyproject.toml
│   │   │   │   │   │   ├── src/
│   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   ├── __main__.py
│   │   │   │   │   │   │   ├── compare_workflows.py
│   │   │   │   │   │   │   ├── config_loader.py
│   │   │   │   │   │   │   ├── configs/
│   │   │   │   │   │   │   │   └── presets/
│   │   │   │   │   │   │   │       ├── lenient.yaml
│   │   │   │   │   │   │   │       ├── standard.yaml
│   │   │   │   │   │   │   │       └── strict.yaml
│   │   │   │   │   │   │   ├── cost_functions.py
│   │   │   │   │   │   │   ├── graph_builder.py
│   │   │   │   │   │   │   └── similarity.py
│   │   │   │   │   │   └── tests/
│   │   │   │   │   │       ├── __init__.py
│   │   │   │   │   │       ├── test_graph_builder.py
│   │   │   │   │   │       └── test_similarity.py
│   │   │   │   │   └── score.ts
│   │   │   │   ├── summarizers/
│   │   │   │   │   └── introspection-summarizer.ts
│   │   │   │   └── support/
│   │   │   │       ├── constants.ts
│   │   │   │       ├── environment.ts
│   │   │   │       ├── load-nodes.test.ts
│   │   │   │       ├── load-nodes.ts
│   │   │   │       ├── pin-data-generator.test.ts
│   │   │   │       ├── pin-data-generator.ts
│   │   │   │       ├── report-generator.ts
│   │   │   │       ├── test-case-generator.ts
│   │   │   │       ├── workflow-executor.test.ts
│   │   │   │       └── workflow-executor.ts
│   │   │   ├── jest.config.integration.js
│   │   │   ├── jest.config.js
│   │   │   ├── jest.config.unit.js
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   ├── categorize-prompts.ts
│   │   │   │   └── workflow-to-mermaid.ts
│   │   │   ├── src/
│   │   │   │   ├── agents/
│   │   │   │   │   ├── planner.agent.ts
│   │   │   │   │   ├── responder.agent.ts
│   │   │   │   │   ├── supervisor.agent.ts
│   │   │   │   │   └── test/
│   │   │   │   │       ├── planner.agent.test.ts
│   │   │   │   │       └── responder.agent.test.ts
│   │   │   │   ├── ai-workflow-builder-agent.service.ts
│   │   │   │   ├── assistant/
│   │   │   │   │   ├── assistant-handler.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   └── assistant-handler.test.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── chains/
│   │   │   │   │   ├── conversation-compact.ts
│   │   │   │   │   ├── parameter-updater.ts
│   │   │   │   │   ├── prompt-categorization.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── conversation-compact.test.ts
│   │   │   │   │   │   └── integration/
│   │   │   │   │   │       ├── README.md
│   │   │   │   │   │       ├── prompt-categorization.integration.test.ts
│   │   │   │   │   │       └── test-helpers.ts
│   │   │   │   │   └── workflow-name.ts
│   │   │   │   ├── code-builder/
│   │   │   │   │   ├── code-builder-agent.ts
│   │   │   │   │   ├── code-workflow-builder.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── engines/
│   │   │   │   │   │   ├── code-builder-node-search-engine.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── code-builder-node-search-engine.test.ts
│   │   │   │   │   ├── handlers/
│   │   │   │   │   │   ├── agent-iteration-handler.ts
│   │   │   │   │   │   ├── auto-finalize-handler.ts
│   │   │   │   │   │   ├── chat-setup-handler.ts
│   │   │   │   │   │   ├── final-response-handler.ts
│   │   │   │   │   │   ├── parse-validate-handler.ts
│   │   │   │   │   │   ├── session-chat-handler.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   ├── agent-iteration-handler.test.ts
│   │   │   │   │   │   │   ├── auto-finalize-handler.test.ts
│   │   │   │   │   │   │   ├── chat-setup-handler.test.ts
│   │   │   │   │   │   │   ├── final-response-handler.test.ts
│   │   │   │   │   │   │   ├── parse-validate-handler.test.ts
│   │   │   │   │   │   │   ├── session-chat-handler.test.ts
│   │   │   │   │   │   │   ├── text-editor-handler.test.ts
│   │   │   │   │   │   │   ├── text-editor-tool-handler.test.ts
│   │   │   │   │   │   │   ├── tool-dispatch-handler.test.ts
│   │   │   │   │   │   │   └── validate-tool-handler.test.ts
│   │   │   │   │   │   ├── text-editor-handler.ts
│   │   │   │   │   │   ├── text-editor-tool-handler.ts
│   │   │   │   │   │   ├── text-editor.types.ts
│   │   │   │   │   │   ├── tool-dispatch-handler.ts
│   │   │   │   │   │   └── validate-tool-handler.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── prompts/
│   │   │   │   │   │   ├── index.test.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── state/
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   └── warning-tracker.test.ts
│   │   │   │   │   │   └── warning-tracker.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── code-builder-agent-pre-validate.test.ts
│   │   │   │   │   │   ├── code-builder-agent-tracing.test.ts
│   │   │   │   │   │   ├── code-builder-agent-validate-loop.test.ts
│   │   │   │   │   │   ├── code-workflow-builder-integration.test.ts
│   │   │   │   │   │   ├── code-workflow-builder.test.ts
│   │   │   │   │   │   ├── constants.test.ts
│   │   │   │   │   │   └── triage.agent.test.ts
│   │   │   │   │   ├── tools/
│   │   │   │   │   │   ├── ask-assistant.tool.ts
│   │   │   │   │   │   ├── build-workflow.tool.ts
│   │   │   │   │   │   ├── code-builder-get.tool.ts
│   │   │   │   │   │   ├── code-builder-search.tool.ts
│   │   │   │   │   │   ├── get-suggested-nodes.tool.ts
│   │   │   │   │   │   ├── suggested-nodes-data.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       ├── code-builder-get.tool.test.ts
│   │   │   │   │   │       ├── code-builder-search.tool.test.ts
│   │   │   │   │   │       └── get-suggested-nodes.tool.test.ts
│   │   │   │   │   ├── triage.agent.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── code-builder-session.ts
│   │   │   │   │       ├── content-extractors.ts
│   │   │   │   │       ├── discriminator-utils.ts
│   │   │   │   │       ├── extract-code.ts
│   │   │   │   │       ├── format-warnings.ts
│   │   │   │   │       ├── llm-response-processor.ts
│   │   │   │   │       ├── node-diff.ts
│   │   │   │   │       ├── node-type-parser.ts
│   │   │   │   │       └── test/
│   │   │   │   │           ├── code-builder-session.test.ts
│   │   │   │   │           ├── content-extractors.test.ts
│   │   │   │   │           ├── discriminator-utils.test.ts
│   │   │   │   │           ├── extract-code.test.ts
│   │   │   │   │           ├── format-warnings.test.ts
│   │   │   │   │           ├── llm-response-processor.test.ts
│   │   │   │   │           ├── node-diff.test.ts
│   │   │   │   │           └── node-type-parser.test.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── errors/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── llm-config.ts
│   │   │   │   ├── multi-agent-workflow-subgraphs.ts
│   │   │   │   ├── parent-graph-state.ts
│   │   │   │   ├── prompts/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── agents/
│   │   │   │   │   │   ├── builder.prompt.ts
│   │   │   │   │   │   ├── discovery.prompt.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── planner.prompt.ts
│   │   │   │   │   │   ├── responder.prompt.test.ts
│   │   │   │   │   │   ├── responder.prompt.ts
│   │   │   │   │   │   └── supervisor.prompt.ts
│   │   │   │   │   ├── builder/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── prompt-builder.test.ts
│   │   │   │   │   │   ├── prompt-builder.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── chains/
│   │   │   │   │   │   ├── categorization.prompt.ts
│   │   │   │   │   │   ├── compact.prompt.ts
│   │   │   │   │   │   ├── parameter-updater/
│   │   │   │   │   │   │   ├── examples/
│   │   │   │   │   │   │   │   ├── if-node.ts
│   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   ├── resource-locator.ts
│   │   │   │   │   │   │   │   ├── set-node.ts
│   │   │   │   │   │   │   │   ├── simple-updates.ts
│   │   │   │   │   │   │   │   ├── switch-node.ts
│   │   │   │   │   │   │   │   └── tool-nodes.ts
│   │   │   │   │   │   │   ├── guides/
│   │   │   │   │   │   │   │   ├── embedding-nodes.ts
│   │   │   │   │   │   │   │   ├── gmail.ts
│   │   │   │   │   │   │   │   ├── http-request.ts
│   │   │   │   │   │   │   │   ├── if-node.ts
│   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   ├── predecessor-output.ts
│   │   │   │   │   │   │   │   ├── resource-locator.ts
│   │   │   │   │   │   │   │   ├── set-node.ts
│   │   │   │   │   │   │   │   ├── switch-node.ts
│   │   │   │   │   │   │   │   ├── system-message.ts
│   │   │   │   │   │   │   │   ├── text-fields.ts
│   │   │   │   │   │   │   │   └── tool-nodes.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── instance-url.ts
│   │   │   │   │   │   │   ├── parameter-updater.prompt.ts
│   │   │   │   │   │   │   ├── registry.test.ts
│   │   │   │   │   │   │   ├── registry.ts
│   │   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   │   └── utils.test.ts
│   │   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   └── workflow-name.prompt.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── shared/
│   │   │   │   │       ├── deictic-resolution.test.ts
│   │   │   │   │       ├── deictic-resolution.ts
│   │   │   │   │       ├── node-guidance/
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── structured-output-parser.ts
│   │   │   │   │       │   └── webhook.ts
│   │   │   │   │       └── node-recommendations/
│   │   │   │   │           ├── audio-generation.ts
│   │   │   │   │           ├── image-generation.ts
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── text-manipulation.ts
│   │   │   │   │           ├── utils/
│   │   │   │   │           │   └── format-recommendation.ts
│   │   │   │   │           └── video-generation.ts
│   │   │   │   ├── session-manager.service.ts
│   │   │   │   ├── shared/
│   │   │   │   │   └── code-builder-and-mcp-prompt-constants.ts
│   │   │   │   ├── subgraphs/
│   │   │   │   │   ├── builder.subgraph.ts
│   │   │   │   │   ├── discovery.subgraph.ts
│   │   │   │   │   ├── subgraph-interface.ts
│   │   │   │   │   └── test/
│   │   │   │   │       └── integration/
│   │   │   │   │           ├── discovery-subgraph.integration.test.ts
│   │   │   │   │           ├── multi-agent-error-handling.integration.test.ts
│   │   │   │   │           ├── plan-mode-discovery.integration.test.ts
│   │   │   │   │           ├── question-quality.integration.test.ts
│   │   │   │   │           ├── responder-limitations.integration.test.ts
│   │   │   │   │           └── techniques.json
│   │   │   │   ├── test/
│   │   │   │   │   ├── ai-workflow-builder-agent.service.test.ts
│   │   │   │   │   ├── checkpoint-persistence.test.ts
│   │   │   │   │   ├── session-manager.service.test.ts
│   │   │   │   │   ├── workflow-builder-agent.test.ts
│   │   │   │   │   └── workflow-state.test.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── add-node.tool.ts
│   │   │   │   │   ├── best-practices/
│   │   │   │   │   │   ├── chatbot.ts
│   │   │   │   │   │   ├── content-generation.ts
│   │   │   │   │   │   ├── data-analysis.ts
│   │   │   │   │   │   ├── data-extraction.ts
│   │   │   │   │   │   ├── data-persistence.ts
│   │   │   │   │   │   ├── data-transformation.ts
│   │   │   │   │   │   ├── document-processing.ts
│   │   │   │   │   │   ├── enrichment.ts
│   │   │   │   │   │   ├── form-input.ts
│   │   │   │   │   │   ├── human-in-the-loop.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── knowledge-base.ts
│   │   │   │   │   │   ├── monitoring.ts
│   │   │   │   │   │   ├── notification.ts
│   │   │   │   │   │   ├── scheduling.ts
│   │   │   │   │   │   ├── scraping-and-research.ts
│   │   │   │   │   │   └── triage.ts
│   │   │   │   │   ├── builder-tools.ts
│   │   │   │   │   ├── connect-nodes.tool.ts
│   │   │   │   │   ├── engines/
│   │   │   │   │   │   ├── node-search-engine.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── node-search-engine.test.ts
│   │   │   │   │   ├── get-documentation.tool.ts
│   │   │   │   │   ├── get-execution-logs.tool.ts
│   │   │   │   │   ├── get-execution-schema.tool.ts
│   │   │   │   │   ├── get-expression-data-mapping.tool.ts
│   │   │   │   │   ├── get-node-context.tool.ts
│   │   │   │   │   ├── get-node-examples.tool.ts
│   │   │   │   │   ├── get-node-parameter.tool.ts
│   │   │   │   │   ├── get-resource-locator-options.tool.ts
│   │   │   │   │   ├── get-workflow-examples.tool.ts
│   │   │   │   │   ├── get-workflow-overview.tool.ts
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── progress.ts
│   │   │   │   │   │   ├── response.ts
│   │   │   │   │   │   ├── state.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   └── progress.test.ts
│   │   │   │   │   │   └── validation.ts
│   │   │   │   │   ├── introspect.tool.ts
│   │   │   │   │   ├── node-details.tool.ts
│   │   │   │   │   ├── node-search.tool.ts
│   │   │   │   │   ├── remove-connection.tool.ts
│   │   │   │   │   ├── remove-node.tool.ts
│   │   │   │   │   ├── rename-node.tool.ts
│   │   │   │   │   ├── submit-questions.tool.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── add-node.tool.test.ts
│   │   │   │   │   │   ├── builder-tools.test.ts
│   │   │   │   │   │   ├── connect-nodes.tool.test.ts
│   │   │   │   │   │   ├── get-documentation.tool.test.ts
│   │   │   │   │   │   ├── get-execution-logs.tool.test.ts
│   │   │   │   │   │   ├── get-execution-schema.tool.test.ts
│   │   │   │   │   │   ├── get-expression-data-mapping.tool.test.ts
│   │   │   │   │   │   ├── get-node-context.tool.test.ts
│   │   │   │   │   │   ├── get-node-examples.tool.test.ts
│   │   │   │   │   │   ├── get-resource-locator-options.tool.test.ts
│   │   │   │   │   │   ├── get-workflow-examples.tool.test.ts
│   │   │   │   │   │   ├── get-workflow-overview.tool.test.ts
│   │   │   │   │   │   ├── introspect.tool.test.ts
│   │   │   │   │   │   ├── node-details.tool.test.ts
│   │   │   │   │   │   ├── node-search.tool.test.ts
│   │   │   │   │   │   ├── remove-connection.tool.test.ts
│   │   │   │   │   │   ├── remove-node.tool.test.ts
│   │   │   │   │   │   ├── rename-node.tool.test.ts
│   │   │   │   │   │   ├── submit-questions.tool.test.ts
│   │   │   │   │   │   ├── update-node-parameters.tool.test.ts
│   │   │   │   │   │   ├── validate-configuration.tool.test.ts
│   │   │   │   │   │   ├── validate-structure.tool.test.ts
│   │   │   │   │   │   ├── web-fetch-security.test.ts
│   │   │   │   │   │   └── web-fetch.tool.test.ts
│   │   │   │   │   ├── update-node-parameters.tool.ts
│   │   │   │   │   ├── utils/
│   │   │   │   │   │   ├── allowed-domains.ts
│   │   │   │   │   │   ├── connection-parameters.utils.ts
│   │   │   │   │   │   ├── connection.utils.ts
│   │   │   │   │   │   ├── mermaid.utils.ts
│   │   │   │   │   │   ├── node-configuration.utils.ts
│   │   │   │   │   │   ├── node-creation.utils.ts
│   │   │   │   │   │   ├── node-positioning.utils.ts
│   │   │   │   │   │   ├── parameter-update.utils.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   ├── connection.utils.test.ts
│   │   │   │   │   │   │   ├── mermaid.utils.test.ts
│   │   │   │   │   │   │   ├── parameter-update.utils.test.ts
│   │   │   │   │   │   │   ├── web-fetch.utils.test.ts
│   │   │   │   │   │   │   └── workflows/
│   │   │   │   │   │   │       └── ai-assistant.workflow.ts
│   │   │   │   │   │   ├── web-fetch-security.ts
│   │   │   │   │   │   └── web-fetch.utils.ts
│   │   │   │   │   ├── validate-configuration.tool.ts
│   │   │   │   │   ├── validate-structure.tool.ts
│   │   │   │   │   ├── web/
│   │   │   │   │   │   ├── templates.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── integration/
│   │   │   │   │   │           └── templates.integration.test.ts
│   │   │   │   │   └── web-fetch.tool.ts
│   │   │   │   ├── types/
│   │   │   │   │   ├── best-practices.ts
│   │   │   │   │   ├── callbacks.ts
│   │   │   │   │   ├── categorization.ts
│   │   │   │   │   ├── config.ts
│   │   │   │   │   ├── connections.ts
│   │   │   │   │   ├── coordination.ts
│   │   │   │   │   ├── discovery-types.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── langchain.ts
│   │   │   │   │   ├── messages.ts
│   │   │   │   │   ├── node-guidance.ts
│   │   │   │   │   ├── node-recommendations.ts
│   │   │   │   │   ├── nodes.ts
│   │   │   │   │   ├── planning.ts
│   │   │   │   │   ├── session-storage.ts
│   │   │   │   │   ├── sessions.ts
│   │   │   │   │   ├── streaming.ts
│   │   │   │   │   ├── tools.ts
│   │   │   │   │   ├── utils.ts
│   │   │   │   │   ├── web/
│   │   │   │   │   │   └── templates.ts
│   │   │   │   │   └── workflow.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── cache-control/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── helpers.test.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── cleanup-dangling-tool-call-messages.ts
│   │   │   │   │   ├── context-builders.ts
│   │   │   │   │   ├── coordination-log.ts
│   │   │   │   │   ├── data-table-helpers.ts
│   │   │   │   │   ├── error-sanitizer.ts
│   │   │   │   │   ├── http-proxy-agent.ts
│   │   │   │   │   ├── node-helpers.ts
│   │   │   │   │   ├── operations-processor.ts
│   │   │   │   │   ├── plan-helpers.ts
│   │   │   │   │   ├── resource-operation-extractor.ts
│   │   │   │   │   ├── rlc-prefetch.ts
│   │   │   │   │   ├── state-modifier.ts
│   │   │   │   │   ├── state-reducers.ts
│   │   │   │   │   ├── stream-processor.ts
│   │   │   │   │   ├── subgraph-helpers.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── cleanup-dangling-tool-call-messages.test.ts
│   │   │   │   │   │   ├── context-builders.test.ts
│   │   │   │   │   │   ├── coordination-log.test.ts
│   │   │   │   │   │   ├── data-table-helpers.test.ts
│   │   │   │   │   │   ├── error-sanitizer.test.ts
│   │   │   │   │   │   ├── operations-processor.test.ts
│   │   │   │   │   │   ├── plan-helpers.test.ts
│   │   │   │   │   │   ├── resource-operation-extractor.test.ts
│   │   │   │   │   │   ├── state-modifier.test.ts
│   │   │   │   │   │   ├── stream-processor.test.ts
│   │   │   │   │   │   ├── subgraph-helpers.test.ts
│   │   │   │   │   │   ├── tool-executor.test.ts
│   │   │   │   │   │   ├── trim-workflow-context.test.ts
│   │   │   │   │   │   └── truncate-json.test.ts
│   │   │   │   │   ├── thread-id.ts
│   │   │   │   │   ├── token-usage-tracking-handler.ts
│   │   │   │   │   ├── token-usage.ts
│   │   │   │   │   ├── tool-executor.ts
│   │   │   │   │   ├── trim-workflow-context.ts
│   │   │   │   │   └── truncate-json.ts
│   │   │   │   ├── validation/
│   │   │   │   │   ├── auto-fix/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── auto-fix-connections.test.ts
│   │   │   │   │   │   ├── auto-fix-connections.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── checks/
│   │   │   │   │   │   ├── agent-prompt.ts
│   │   │   │   │   │   ├── connections.test.ts
│   │   │   │   │   │   ├── connections.ts
│   │   │   │   │   │   ├── credentials.ts
│   │   │   │   │   │   ├── from-ai.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── node-usage/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── webhook-response.test.ts
│   │   │   │   │   │   │   └── webhook-response.ts
│   │   │   │   │   │   ├── nodes.ts
│   │   │   │   │   │   ├── parameters.ts
│   │   │   │   │   │   ├── tools.ts
│   │   │   │   │   │   └── trigger.ts
│   │   │   │   │   ├── programmatic.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── expressions.test.ts
│   │   │   │   │       ├── expressions.ts
│   │   │   │   │       ├── is-tool.ts
│   │   │   │   │       ├── node-type-map.ts
│   │   │   │   │       └── resolve-connections.ts
│   │   │   │   ├── workflow-builder-agent.ts
│   │   │   │   └── workflow-state.ts
│   │   │   ├── test/
│   │   │   │   └── test-utils.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── api-types/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── api-keys.ts
│   │   │   │   ├── chat-hub.ts
│   │   │   │   ├── community-node-types.ts
│   │   │   │   ├── datetime.ts
│   │   │   │   ├── dto/
│   │   │   │   │   ├── ai/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── ai-apply-suggestion-request.dto.test.ts
│   │   │   │   │   │   │   ├── ai-ask-request.dto.test.ts
│   │   │   │   │   │   │   ├── ai-build-request.dto.test.ts
│   │   │   │   │   │   │   ├── ai-chat-request.dto.test.ts
│   │   │   │   │   │   │   └── ai-free-credits-request.dto.test.ts
│   │   │   │   │   │   ├── ai-apply-suggestion-request.dto.ts
│   │   │   │   │   │   ├── ai-ask-request.dto.ts
│   │   │   │   │   │   ├── ai-build-request.dto.ts
│   │   │   │   │   │   ├── ai-chat-request.dto.ts
│   │   │   │   │   │   ├── ai-clear-session-request.dto.ts
│   │   │   │   │   │   ├── ai-free-credits-request.dto.ts
│   │   │   │   │   │   ├── ai-session-retrieval-request.dto.ts
│   │   │   │   │   │   ├── ai-truncate-messages-request.dto.ts
│   │   │   │   │   │   └── ai-usage-settings-request.dto.ts
│   │   │   │   │   ├── api-keys/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-api-key-request.dto.test.ts
│   │   │   │   │   │   │   └── update-api-key-request.dto.test.ts
│   │   │   │   │   │   ├── create-api-key-request.dto.ts
│   │   │   │   │   │   └── update-api-key-request.dto.ts
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── login-request.dto.test.ts
│   │   │   │   │   │   │   └── resolve-signup-token-query.dto.test.ts
│   │   │   │   │   │   ├── embed-login-body.dto.ts
│   │   │   │   │   │   ├── embed-login-query.dto.ts
│   │   │   │   │   │   ├── login-request.dto.ts
│   │   │   │   │   │   └── resolve-signup-token-query.dto.ts
│   │   │   │   │   ├── binary-data/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── binary-data-query.dto.test.ts
│   │   │   │   │   │   │   └── binary-data-signed-query.dto.test.ts
│   │   │   │   │   │   ├── binary-data-query.dto.ts
│   │   │   │   │   │   └── binary-data-signed-query.dto.ts
│   │   │   │   │   ├── credential-resolver/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-credential-resolver.dto.test.ts
│   │   │   │   │   │   │   └── update-credential-resolver.dto.test.ts
│   │   │   │   │   │   ├── create-credential-resolver.dto.ts
│   │   │   │   │   │   └── update-credential-resolver.dto.ts
│   │   │   │   │   ├── credentials/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-credential.dto.test.ts
│   │   │   │   │   │   │   ├── credentials-get-many-request.dto.test.ts
│   │   │   │   │   │   │   ├── credentials-get-one-request.dto.test.ts
│   │   │   │   │   │   │   └── generate-credential-name.dto.test.ts
│   │   │   │   │   │   ├── create-credential.dto.ts
│   │   │   │   │   │   ├── credentials-get-many-request.dto.ts
│   │   │   │   │   │   ├── credentials-get-one-request.dto.ts
│   │   │   │   │   │   └── generate-credential-name.dto.ts
│   │   │   │   │   ├── data-table/
│   │   │   │   │   │   ├── add-data-table-column.dto.ts
│   │   │   │   │   │   ├── add-data-table-rows.dto.ts
│   │   │   │   │   │   ├── create-data-table-column.dto.ts
│   │   │   │   │   │   ├── create-data-table.dto.ts
│   │   │   │   │   │   ├── delete-data-table-rows.dto.ts
│   │   │   │   │   │   ├── download-data-table-csv-query.dto.ts
│   │   │   │   │   │   ├── import-csv-to-data-table.dto.ts
│   │   │   │   │   │   ├── list-data-table-content-query.dto.ts
│   │   │   │   │   │   ├── list-data-table-query.dto.ts
│   │   │   │   │   │   ├── move-data-table-column.dto.ts
│   │   │   │   │   │   ├── rename-data-table-column.dto.ts
│   │   │   │   │   │   ├── update-data-table-row.dto.ts
│   │   │   │   │   │   ├── update-data-table.dto.ts
│   │   │   │   │   │   └── upsert-data-table-row.dto.ts
│   │   │   │   │   ├── dynamic-node-parameters/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── action-result-request.dto.test.ts
│   │   │   │   │   │   │   ├── options-request.dto.test.ts
│   │   │   │   │   │   │   ├── resource-locator-request.dto.test.ts
│   │   │   │   │   │   │   └── resource-mapper-fields-request.dto.test.ts
│   │   │   │   │   │   ├── action-result-request.dto.ts
│   │   │   │   │   │   ├── base-dynamic-parameters-request.dto.ts
│   │   │   │   │   │   ├── options-request.dto.ts
│   │   │   │   │   │   ├── resource-locator-request.dto.ts
│   │   │   │   │   │   └── resource-mapper-fields-request.dto.ts
│   │   │   │   │   ├── executions/
│   │   │   │   │   │   └── execution-redaction-query.dto.ts
│   │   │   │   │   ├── folders/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-folder-request.dto.test.ts
│   │   │   │   │   │   │   ├── list-folder-query.dto.test.ts
│   │   │   │   │   │   │   └── update-folder.request.dto.test.ts
│   │   │   │   │   │   ├── create-folder.dto.ts
│   │   │   │   │   │   ├── delete-folder.dto.ts
│   │   │   │   │   │   ├── list-folder-query.dto.ts
│   │   │   │   │   │   ├── transfer-folder.dto.ts
│   │   │   │   │   │   └── update-folder.dto.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── insights/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── date-filter.dto.test.ts
│   │   │   │   │   │   │   └── list-workflow-query.dto.test.ts
│   │   │   │   │   │   ├── date-filter.dto.ts
│   │   │   │   │   │   └── list-workflow-query.dto.ts
│   │   │   │   │   ├── instance-ai/
│   │   │   │   │   │   ├── instance-ai-confirm-request.dto.ts
│   │   │   │   │   │   └── instance-ai-rename-thread-request.dto.ts
│   │   │   │   │   ├── invitation/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── accept-invitation-request.dto.test.ts
│   │   │   │   │   │   │   └── invite-users-request.dto.test.ts
│   │   │   │   │   │   ├── accept-invitation-request.dto.ts
│   │   │   │   │   │   └── invite-users-request.dto.ts
│   │   │   │   │   ├── license/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── community-registered-request.dto.test.ts
│   │   │   │   │   │   └── community-registered-request.dto.ts
│   │   │   │   │   ├── log-streaming/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-destination.dto.test.ts
│   │   │   │   │   │   │   ├── delete-destination-query.dto.test.ts
│   │   │   │   │   │   │   ├── get-destination-query.dto.test.ts
│   │   │   │   │   │   │   └── test-destination-query.dto.test.ts
│   │   │   │   │   │   ├── create-destination.dto.ts
│   │   │   │   │   │   ├── delete-destination-query.dto.ts
│   │   │   │   │   │   ├── get-destination-query.dto.ts
│   │   │   │   │   │   └── test-destination-query.dto.ts
│   │   │   │   │   ├── node-types/
│   │   │   │   │   │   └── get-node-types-by-identifier.dto.ts
│   │   │   │   │   ├── oauth/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── oauth-client.dto.ts
│   │   │   │   │   ├── oidc/
│   │   │   │   │   │   ├── config.dto.ts
│   │   │   │   │   │   └── test-oidc-config-response.dto.ts
│   │   │   │   │   ├── owner/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── dismiss-banner-request.dto.test.ts
│   │   │   │   │   │   │   └── owner-setup-request.dto.test.ts
│   │   │   │   │   │   ├── dismiss-banner-request.dto.ts
│   │   │   │   │   │   └── owner-setup-request.dto.ts
│   │   │   │   │   ├── pagination/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── pagination.dto.test.ts
│   │   │   │   │   │   └── pagination.dto.ts
│   │   │   │   │   ├── password-reset/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── change-password-request.dto.test.ts
│   │   │   │   │   │   │   ├── forgot-password-request.dto.test.ts
│   │   │   │   │   │   │   └── resolve-password-token-query.dto.test.ts
│   │   │   │   │   │   ├── change-password-request.dto.ts
│   │   │   │   │   │   ├── forgot-password-request.dto.ts
│   │   │   │   │   │   └── resolve-password-token-query.dto.ts
│   │   │   │   │   ├── project/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── add-users-to-project.dto.test.ts
│   │   │   │   │   │   │   ├── change-user-role-in-project.dto.test.ts
│   │   │   │   │   │   │   ├── create-project.dto.test.ts
│   │   │   │   │   │   │   ├── list-projects-query.dto.test.ts
│   │   │   │   │   │   │   └── update-project.dto.test.ts
│   │   │   │   │   │   ├── add-users-to-project.dto.ts
│   │   │   │   │   │   ├── change-user-role-in-project.dto.ts
│   │   │   │   │   │   ├── create-project.dto.ts
│   │   │   │   │   │   ├── delete-project.dto.ts
│   │   │   │   │   │   ├── list-projects-query.dto.ts
│   │   │   │   │   │   └── update-project.dto.ts
│   │   │   │   │   ├── provisioning/
│   │   │   │   │   │   └── config.dto.ts
│   │   │   │   │   ├── quick-connect/
│   │   │   │   │   │   ├── create-quick-connect-credential.dto.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── roles/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-role.dto.test.ts
│   │   │   │   │   │   │   ├── list-role-mapping-rule-query.dto.test.ts
│   │   │   │   │   │   │   ├── role-get-query.dto.test.ts
│   │   │   │   │   │   │   ├── role-list-query.dto.test.ts
│   │   │   │   │   │   │   └── update-role.dto.test.ts
│   │   │   │   │   │   ├── create-role-mapping-rule.dto.ts
│   │   │   │   │   │   ├── create-role.dto.ts
│   │   │   │   │   │   ├── list-role-mapping-rule-query.dto.ts
│   │   │   │   │   │   ├── move-role-mapping-rule.dto.ts
│   │   │   │   │   │   ├── patch-role-mapping-rule.dto.ts
│   │   │   │   │   │   ├── role-assignments-response.dto.ts
│   │   │   │   │   │   ├── role-get-query.dto.ts
│   │   │   │   │   │   ├── role-list-query.dto.ts
│   │   │   │   │   │   ├── role-project-members-response.dto.ts
│   │   │   │   │   │   └── update-role.dto.ts
│   │   │   │   │   ├── saml/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── saml-preferences.dto.test.ts
│   │   │   │   │   │   ├── saml-acs.dto.ts
│   │   │   │   │   │   ├── saml-preferences.dto.ts
│   │   │   │   │   │   └── saml-toggle.dto.ts
│   │   │   │   │   ├── secrets-provider/
│   │   │   │   │   │   ├── create-secrets-provider-connection.dto.ts
│   │   │   │   │   │   ├── set-secrets-provider-connection-is-enabled.dto.ts
│   │   │   │   │   │   ├── test-secrets-provider-connection.dto.ts
│   │   │   │   │   │   ├── update-external-secrets-settings.dto.ts
│   │   │   │   │   │   └── update-secrets-provider-connection.dto.ts
│   │   │   │   │   ├── security-settings/
│   │   │   │   │   │   └── security-settings.dto.ts
│   │   │   │   │   ├── source-control/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── pull-work-folder-request.dto.test.ts
│   │   │   │   │   │   │   └── push-work-folder-request.dto.test.ts
│   │   │   │   │   │   ├── pull-work-folder-request.dto.ts
│   │   │   │   │   │   ├── push-work-folder-request.dto.ts
│   │   │   │   │   │   └── push-work-folder-response.dto.ts
│   │   │   │   │   ├── tag/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-or-update-tag-request.dto.test.ts
│   │   │   │   │   │   │   └── retrieve-tag-query.dto.test.ts
│   │   │   │   │   │   ├── create-or-update-tag-request.dto.ts
│   │   │   │   │   │   └── retrieve-tag-query.dto.ts
│   │   │   │   │   ├── user/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── password-update-request.dto.test.ts
│   │   │   │   │   │   │   ├── role-change-request.dto.test.ts
│   │   │   │   │   │   │   ├── settings-update-request.dto.test.ts
│   │   │   │   │   │   │   ├── user-self-settings-update-request.dto.test.ts
│   │   │   │   │   │   │   ├── user-update-request.dto.test.ts
│   │   │   │   │   │   │   └── users-list-filter.dto.test.ts
│   │   │   │   │   │   ├── password-update-request.dto.ts
│   │   │   │   │   │   ├── role-change-request.dto.ts
│   │   │   │   │   │   ├── settings-update-request.dto.ts
│   │   │   │   │   │   ├── user-self-settings-update-request.dto.ts
│   │   │   │   │   │   ├── user-update-request.dto.ts
│   │   │   │   │   │   └── users-list-filter.dto.ts
│   │   │   │   │   ├── variables/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── base.dto.test.ts
│   │   │   │   │   │   │   ├── create-variable-request.dto.test.ts
│   │   │   │   │   │   │   ├── update-variable-request.dto.test.ts
│   │   │   │   │   │   │   └── variables-list-request.dto.test.ts
│   │   │   │   │   │   ├── base.dto.ts
│   │   │   │   │   │   ├── create-variable-request.dto.ts
│   │   │   │   │   │   ├── update-variable-request.dto.ts
│   │   │   │   │   │   └── variables-list-request.dto.ts
│   │   │   │   │   ├── workflow-history/
│   │   │   │   │   │   ├── update-workflow-history-version.dto.ts
│   │   │   │   │   │   └── workflow-history-versions-by-ids.dto.ts
│   │   │   │   │   └── workflows/
│   │   │   │   │       ├── __tests__/
│   │   │   │   │       │   ├── create-workflow.dto.test.ts
│   │   │   │   │       │   ├── import-workflow-from-url.dto.test.ts
│   │   │   │   │       │   ├── transfer-workflow.dto.test.ts
│   │   │   │   │       │   └── update-workflow.dto.test.ts
│   │   │   │   │       ├── activate-workflow.dto.ts
│   │   │   │   │       ├── archive-workflow.dto.ts
│   │   │   │   │       ├── base-workflow.dto.ts
│   │   │   │   │       ├── create-workflow.dto.ts
│   │   │   │   │       ├── deactivate-workflow.dto.ts
│   │   │   │   │       ├── get-resource-dependencies.dto.ts
│   │   │   │   │       ├── get-resource-dependency-counts.dto.ts
│   │   │   │   │       ├── import-workflow-from-url.dto.ts
│   │   │   │   │       ├── transfer.dto.ts
│   │   │   │   │       └── update-workflow.dto.ts
│   │   │   │   ├── frontend-settings.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── instance-registry-types.ts
│   │   │   │   ├── push/
│   │   │   │   │   ├── builder-credits.ts
│   │   │   │   │   ├── chat-hub.ts
│   │   │   │   │   ├── collaboration.ts
│   │   │   │   │   ├── debug.ts
│   │   │   │   │   ├── execution.ts
│   │   │   │   │   ├── heartbeat.ts
│   │   │   │   │   ├── hot-reload.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── instance-ai.ts
│   │   │   │   │   ├── webhook.ts
│   │   │   │   │   ├── worker.ts
│   │   │   │   │   └── workflow.ts
│   │   │   │   ├── quick-connect.ts
│   │   │   │   ├── scaling.ts
│   │   │   │   ├── schemas/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── agent-run-reducer.test.ts
│   │   │   │   │   │   ├── credential-resolver.schema.test.ts
│   │   │   │   │   │   ├── folder.schema.test.ts
│   │   │   │   │   │   ├── insights.schema.test.ts
│   │   │   │   │   │   ├── node-version.schema.test.ts
│   │   │   │   │   │   ├── password.schema.test.ts
│   │   │   │   │   │   ├── project.schema.test.ts
│   │   │   │   │   │   └── user.schema.test.ts
│   │   │   │   │   ├── agent-run-reducer.ts
│   │   │   │   │   ├── banner-name.schema.ts
│   │   │   │   │   ├── binary-data.schema.ts
│   │   │   │   │   ├── boolean-from-string.ts
│   │   │   │   │   ├── breaking-changes.schema.ts
│   │   │   │   │   ├── community-package.schema.ts
│   │   │   │   │   ├── credential-resolver.schema.ts
│   │   │   │   │   ├── data-table-filter.schema.ts
│   │   │   │   │   ├── data-table.schema.ts
│   │   │   │   │   ├── dependency-counts.schema.ts
│   │   │   │   │   ├── dependency.schema.ts
│   │   │   │   │   ├── external-secrets.schema.ts
│   │   │   │   │   ├── folder.schema.ts
│   │   │   │   │   ├── insights.schema.ts
│   │   │   │   │   ├── instance-ai.schema.ts
│   │   │   │   │   ├── node-version.schema.ts
│   │   │   │   │   ├── password-reset-token.schema.ts
│   │   │   │   │   ├── password.schema.ts
│   │   │   │   │   ├── project.schema.ts
│   │   │   │   │   ├── scopes.schema.ts
│   │   │   │   │   ├── secrets-provider.schema.ts
│   │   │   │   │   ├── source-controlled-file.schema.ts
│   │   │   │   │   ├── timezone.schema.ts
│   │   │   │   │   ├── usage.schema.ts
│   │   │   │   │   ├── user-settings.schema.ts
│   │   │   │   │   ├── user.schema.ts
│   │   │   │   │   ├── workflow-execution-status.schema.ts
│   │   │   │   │   └── workflow-version.schema.ts
│   │   │   │   ├── user.ts
│   │   │   │   ├── utils/
│   │   │   │   │   └── allowed-domains.ts
│   │   │   │   └── zod-class.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── backend-common/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── cli-parser.test.ts
│   │   │   │   ├── cli-parser.ts
│   │   │   │   ├── environment.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── license-state.ts
│   │   │   │   ├── logging/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── logger.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── logger.ts
│   │   │   │   ├── modules/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── module-registry.test.ts
│   │   │   │   │   │   └── modules.config.test.ts
│   │   │   │   │   ├── errors/
│   │   │   │   │   │   ├── missing-module.error.ts
│   │   │   │   │   │   ├── module-confusion.error.ts
│   │   │   │   │   │   └── unknown-module.error.ts
│   │   │   │   │   ├── module-registry.ts
│   │   │   │   │   └── modules.config.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils/
│   │   │   │       ├── __tests__/
│   │   │   │       │   ├── flatted-async.test.ts
│   │   │   │       │   ├── is-object-literal.test.ts
│   │   │   │       │   ├── parse-flatted.test.ts
│   │   │   │       │   └── path-util.test.ts
│   │   │   │       ├── flatted-async.ts
│   │   │   │       ├── fs.ts
│   │   │   │       ├── is-object-literal.ts
│   │   │   │       ├── parse-flatted.ts
│   │   │   │       └── path-util.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── backend-test-utils/
│   │   │   ├── MIGRATION_TESTING.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── db/
│   │   │   │   │   ├── projects.ts
│   │   │   │   │   └── workflows.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── migration-test-helpers.ts
│   │   │   │   ├── mocking.ts
│   │   │   │   ├── random.ts
│   │   │   │   ├── test-db.ts
│   │   │   │   └── test-modules.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── benchmark/
│   │   │   ├── .gitignore
│   │   │   ├── Dockerfile
│   │   │   ├── README.md
│   │   │   ├── bin/
│   │   │   │   └── n8n-benchmark
│   │   │   ├── biome.jsonc
│   │   │   ├── eslint.config.mjs
│   │   │   ├── infra/
│   │   │   │   ├── .terraform.lock.hcl
│   │   │   │   ├── benchmark-env.tf
│   │   │   │   ├── modules/
│   │   │   │   │   └── benchmark-vm/
│   │   │   │   │       ├── output.tf
│   │   │   │   │       ├── vars.tf
│   │   │   │   │       └── vm.tf
│   │   │   │   ├── output.tf
│   │   │   │   ├── providers.tf
│   │   │   │   └── vars.tf
│   │   │   ├── package.json
│   │   │   ├── scenarios/
│   │   │   │   ├── binary-data/
│   │   │   │   │   ├── binary-data.json
│   │   │   │   │   ├── binary-data.manifest.json
│   │   │   │   │   └── binary-data.script.js
│   │   │   │   ├── credential-http-node/
│   │   │   │   │   ├── credential-bearer.json
│   │   │   │   │   ├── credential-http-node.json
│   │   │   │   │   ├── credential-http-node.manifest.json
│   │   │   │   │   └── credential-http-node.script.js
│   │   │   │   ├── data-table-node/
│   │   │   │   │   ├── data-table-node.json
│   │   │   │   │   ├── data-table-node.manifest.json
│   │   │   │   │   ├── data-table-node.script.js
│   │   │   │   │   └── data-table.json
│   │   │   │   ├── http-node/
│   │   │   │   │   ├── http-node.json
│   │   │   │   │   ├── http-node.manifest.json
│   │   │   │   │   └── http-node.script.js
│   │   │   │   ├── js-code-node/
│   │   │   │   │   ├── js-code-node.json
│   │   │   │   │   ├── js-code-node.manifest.json
│   │   │   │   │   └── js-code-node.script.js
│   │   │   │   ├── multiple-webhooks/
│   │   │   │   │   ├── multiple-webhooks.manifest.json
│   │   │   │   │   ├── multiple-webhooks.script.js
│   │   │   │   │   ├── multiple-webhooks1.json
│   │   │   │   │   ├── multiple-webhooks10.json
│   │   │   │   │   ├── multiple-webhooks2.json
│   │   │   │   │   ├── multiple-webhooks3.json
│   │   │   │   │   ├── multiple-webhooks4.json
│   │   │   │   │   ├── multiple-webhooks5.json
│   │   │   │   │   ├── multiple-webhooks6.json
│   │   │   │   │   ├── multiple-webhooks7.json
│   │   │   │   │   ├── multiple-webhooks8.json
│   │   │   │   │   └── multiple-webhooks9.json
│   │   │   │   ├── py-code-node/
│   │   │   │   │   ├── py-code-node.json
│   │   │   │   │   ├── py-code-node.manifest.json
│   │   │   │   │   └── py-code-node.script.js
│   │   │   │   ├── scenario.schema.json
│   │   │   │   ├── set-node-expressions/
│   │   │   │   │   ├── set-node-expressions.json
│   │   │   │   │   ├── set-node-expressions.manifest.json
│   │   │   │   │   └── set-node-expressions.script.js
│   │   │   │   └── single-webhook/
│   │   │   │       ├── single-webhook.json
│   │   │   │       ├── single-webhook.manifest.json
│   │   │   │       └── single-webhook.script.js
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   ├── clients/
│   │   │   │   │   ├── docker-compose-client.mjs
│   │   │   │   │   ├── ssh-client.mjs
│   │   │   │   │   └── terraform-client.mjs
│   │   │   │   ├── destroy-cloud-env.mjs
│   │   │   │   ├── mock-api/
│   │   │   │   │   └── mappings/
│   │   │   │   │       └── mockApiData.json
│   │   │   │   ├── n8n-setups/
│   │   │   │   │   ├── postgres/
│   │   │   │   │   │   ├── docker-compose.yml
│   │   │   │   │   │   └── setup.mjs
│   │   │   │   │   ├── scaling-multi-main/
│   │   │   │   │   │   ├── docker-compose.yml
│   │   │   │   │   │   ├── nginx.conf
│   │   │   │   │   │   └── setup.mjs
│   │   │   │   │   ├── scaling-single-main/
│   │   │   │   │   │   ├── docker-compose.yml
│   │   │   │   │   │   └── setup.mjs
│   │   │   │   │   └── sqlite/
│   │   │   │   │       ├── docker-compose.yml
│   │   │   │   │       └── setup.mjs
│   │   │   │   ├── provision-cloud-env.mjs
│   │   │   │   ├── run-for-n8n-setup.mjs
│   │   │   │   ├── run-in-cloud.mjs
│   │   │   │   ├── run-locally.mjs
│   │   │   │   ├── run.mjs
│   │   │   │   └── utils/
│   │   │   │       └── flags.mjs
│   │   │   ├── src/
│   │   │   │   ├── commands/
│   │   │   │   │   ├── list.ts
│   │   │   │   │   └── run.ts
│   │   │   │   ├── config/
│   │   │   │   │   └── common-flags.ts
│   │   │   │   ├── n8n-api-client/
│   │   │   │   │   ├── authenticated-n8n-api-client.ts
│   │   │   │   │   ├── credentials-api-client.ts
│   │   │   │   │   ├── data-table-api-client.ts
│   │   │   │   │   ├── n8n-api-client.ts
│   │   │   │   │   ├── n8n-api-client.types.ts
│   │   │   │   │   ├── project-api-client.ts
│   │   │   │   │   └── workflows-api-client.ts
│   │   │   │   ├── scenario/
│   │   │   │   │   ├── scenario-data-loader.ts
│   │   │   │   │   └── scenario-loader.ts
│   │   │   │   ├── test-execution/
│   │   │   │   │   ├── app-metrics-poller.ts
│   │   │   │   │   ├── k6-executor.ts
│   │   │   │   │   ├── k6-summary.ts
│   │   │   │   │   ├── prometheus-metrics-parser.ts
│   │   │   │   │   ├── scenario-data-importer.ts
│   │   │   │   │   ├── scenario-runner.ts
│   │   │   │   │   └── test-report.ts
│   │   │   │   └── types/
│   │   │   │       └── scenario.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── chat-hub/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── artifact.test.ts
│   │   │   │   ├── artifact.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── parser.test.ts
│   │   │   │   └── parser.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── cli/
│   │   │   ├── LICENSE.md
│   │   │   ├── README.md
│   │   │   ├── bin/
│   │   │   │   └── n8n-cli.mjs
│   │   │   ├── docs/
│   │   │   │   ├── commands/
│   │   │   │   │   ├── audit.md
│   │   │   │   │   ├── config.md
│   │   │   │   │   ├── credential.md
│   │   │   │   │   ├── data-table.md
│   │   │   │   │   ├── execution.md
│   │   │   │   │   ├── project.md
│   │   │   │   │   ├── source-control.md
│   │   │   │   │   ├── tag.md
│   │   │   │   │   ├── user.md
│   │   │   │   │   ├── variable.md
│   │   │   │   │   └── workflow.md
│   │   │   │   ├── getting-started.md
│   │   │   │   ├── guides/
│   │   │   │   │   ├── ai-agents.md
│   │   │   │   │   └── ci-cd.md
│   │   │   │   └── index.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── skills/
│   │   │   │   └── n8n-cli/
│   │   │   │       └── SKILL.md
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── config.test.ts
│   │   │   │   ├── base-command.ts
│   │   │   │   ├── client.ts
│   │   │   │   ├── commands/
│   │   │   │   │   ├── audit/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── config/
│   │   │   │   │   │   ├── set-api-key.ts
│   │   │   │   │   │   ├── set-url.ts
│   │   │   │   │   │   └── show.ts
│   │   │   │   │   ├── credential/
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── schema.ts
│   │   │   │   │   │   └── transfer.ts
│   │   │   │   │   ├── data-table/
│   │   │   │   │   │   ├── add-rows.ts
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete-rows.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── rows.ts
│   │   │   │   │   │   ├── update-rows.ts
│   │   │   │   │   │   └── upsert-rows.ts
│   │   │   │   │   ├── execution/
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── retry.ts
│   │   │   │   │   │   └── stop.ts
│   │   │   │   │   ├── login.ts
│   │   │   │   │   ├── logout.ts
│   │   │   │   │   ├── project/
│   │   │   │   │   │   ├── add-member.ts
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── members.ts
│   │   │   │   │   │   ├── remove-member.ts
│   │   │   │   │   │   └── update.ts
│   │   │   │   │   ├── skill/
│   │   │   │   │   │   └── install.ts
│   │   │   │   │   ├── source-control/
│   │   │   │   │   │   └── pull.ts
│   │   │   │   │   ├── tag/
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   └── update.ts
│   │   │   │   │   ├── user/
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   └── list.ts
│   │   │   │   │   ├── variable/
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   └── update.ts
│   │   │   │   │   └── workflow/
│   │   │   │   │       ├── activate.ts
│   │   │   │   │       ├── create.ts
│   │   │   │   │       ├── deactivate.ts
│   │   │   │   │       ├── delete.ts
│   │   │   │   │       ├── get.ts
│   │   │   │   │       ├── list.ts
│   │   │   │   │       ├── tags.ts
│   │   │   │   │       ├── transfer.ts
│   │   │   │   │       └── update.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── output.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── client-oauth2/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── client-oauth2-token.ts
│   │   │   │   ├── client-oauth2.ts
│   │   │   │   ├── code-flow.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── credentials-flow.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils.ts
│   │   │   ├── test/
│   │   │   │   ├── client-oauth2.test.ts
│   │   │   │   ├── code-flow.test.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── credentials-flow.test.ts
│   │   │   │   └── pkce-flow.test.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── codemirror-lang/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── expressions/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── expressions.grammar
│   │   │   │   │   ├── grammar.terms.ts
│   │   │   │   │   ├── grammar.ts
│   │   │   │   │   └── index.ts
│   │   │   │   └── index.ts
│   │   │   ├── test/
│   │   │   │   └── expressions/
│   │   │   │       ├── cases.txt
│   │   │   │       └── expressions.test.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── codemirror-lang-html/
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── complete.ts
│   │   │   │   ├── grammar/
│   │   │   │   │   ├── content.js
│   │   │   │   │   ├── highlight.js
│   │   │   │   │   ├── html.grammar
│   │   │   │   │   ├── index.js
│   │   │   │   │   ├── parser.js
│   │   │   │   │   ├── parser.terms.js
│   │   │   │   │   ├── rollup.config.js
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── mixed.txt
│   │   │   │   │   │   ├── resolvables.txt
│   │   │   │   │   │   ├── tags.txt
│   │   │   │   │   │   ├── test-html.js
│   │   │   │   │   │   ├── test-incremental.js
│   │   │   │   │   │   └── vue.txt
│   │   │   │   │   └── tokens.js
│   │   │   │   └── html.ts
│   │   │   ├── test/
│   │   │   │   └── test-complete.ts
│   │   │   └── vitest.config.ts
│   │   ├── codemirror-lang-sql/
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── complete.ts
│   │   │   │   ├── grammar.sql.terms.ts
│   │   │   │   ├── grammar.sql.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── sql.grammar
│   │   │   │   ├── sql.ts
│   │   │   │   └── tokens.ts
│   │   │   ├── test/
│   │   │   │   ├── complete.test.ts
│   │   │   │   └── tokens.test.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── config/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── configs/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── ai.config.test.ts
│   │   │   │   │   │   ├── external-hooks.config.test.ts
│   │   │   │   │   │   ├── ssrf-protection.config.test.ts
│   │   │   │   │   │   └── user-management.config.test.ts
│   │   │   │   │   ├── ai-assistant.config.ts
│   │   │   │   │   ├── ai-builder.config.ts
│   │   │   │   │   ├── ai.config.ts
│   │   │   │   │   ├── auth.config.ts
│   │   │   │   │   ├── cache.config.ts
│   │   │   │   │   ├── chat-hub.config.ts
│   │   │   │   │   ├── credentials.config.ts
│   │   │   │   │   ├── data-table.config.ts
│   │   │   │   │   ├── database.config.ts
│   │   │   │   │   ├── deployment.config.ts
│   │   │   │   │   ├── diagnostics.config.ts
│   │   │   │   │   ├── dynamic-banners.config.ts
│   │   │   │   │   ├── endpoints.config.ts
│   │   │   │   │   ├── event-bus.config.ts
│   │   │   │   │   ├── executions.config.ts
│   │   │   │   │   ├── expression-engine.config.ts
│   │   │   │   │   ├── external-hooks.config.ts
│   │   │   │   │   ├── generic.config.ts
│   │   │   │   │   ├── hiring-banner.config.ts
│   │   │   │   │   ├── instance-ai.config.ts
│   │   │   │   │   ├── instance-settings-config.ts
│   │   │   │   │   ├── license.config.ts
│   │   │   │   │   ├── logging.config.ts
│   │   │   │   │   ├── mfa.config.ts
│   │   │   │   │   ├── multi-main-setup.config.ts
│   │   │   │   │   ├── nodes.config.ts
│   │   │   │   │   ├── password.config.ts
│   │   │   │   │   ├── personalization.config.ts
│   │   │   │   │   ├── public-api.config.ts
│   │   │   │   │   ├── redis.config.ts
│   │   │   │   │   ├── runners.config.ts
│   │   │   │   │   ├── scaling-mode.config.ts
│   │   │   │   │   ├── security.config.ts
│   │   │   │   │   ├── sentry.config.ts
│   │   │   │   │   ├── sso.config.ts
│   │   │   │   │   ├── ssrf-protection.config.ts
│   │   │   │   │   ├── tags.config.ts
│   │   │   │   │   ├── templates.config.ts
│   │   │   │   │   ├── user-management.config.ts
│   │   │   │   │   ├── version-notifications.config.ts
│   │   │   │   │   ├── workflow-history-compaction.config.ts
│   │   │   │   │   ├── workflow-history.config.ts
│   │   │   │   │   └── workflows.config.ts
│   │   │   │   ├── custom-types.ts
│   │   │   │   ├── decorators.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── utils/
│   │   │   │       └── utils.ts
│   │   │   ├── test/
│   │   │   │   ├── config.test.ts
│   │   │   │   ├── custom-types.test.ts
│   │   │   │   ├── decorators.test.ts
│   │   │   │   └── string-normalization.test.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── constants/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── api.ts
│   │   │   │   ├── browser.ts
│   │   │   │   ├── community-nodes.ts
│   │   │   │   ├── execution.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── instance.ts
│   │   │   │   ├── logstreaming.ts
│   │   │   │   └── time.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── crdt/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── helpers.ts
│   │   │   │   ├── awareness/
│   │   │   │   │   ├── awareness.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── yjs-awareness.ts
│   │   │   │   ├── index.test.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── protocol.test.ts
│   │   │   │   ├── protocol.ts
│   │   │   │   ├── providers/
│   │   │   │   │   ├── yjs.test.ts
│   │   │   │   │   └── yjs.ts
│   │   │   │   ├── sync/
│   │   │   │   │   ├── base-sync-provider.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── sync-provider.test.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── sync.test.ts
│   │   │   │   ├── test-matchers.d.ts
│   │   │   │   ├── transports/
│   │   │   │   │   ├── broadcast-channel.test.ts
│   │   │   │   │   ├── broadcast-channel.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── integration.test.ts
│   │   │   │   │   ├── message-port.test.ts
│   │   │   │   │   ├── message-port.ts
│   │   │   │   │   ├── mock.test.ts
│   │   │   │   │   ├── mock.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   ├── websocket.test.ts
│   │   │   │   │   ├── websocket.ts
│   │   │   │   │   ├── worker.test.ts
│   │   │   │   │   └── worker.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── undo/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── undo-manager.test.ts
│   │   │   │   │   └── yjs-undo-manager.ts
│   │   │   │   ├── utils.test.ts
│   │   │   │   └── utils.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── create-node/
│   │   │   ├── README.md
│   │   │   ├── bin/
│   │   │   │   └── create-node.cjs
│   │   │   ├── package.json
│   │   │   └── tsconfig.json
│   │   ├── db/
│   │   │   ├── AGENTS.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── connection/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── db-connection-options.test.ts
│   │   │   │   │   │   └── db-connection.test.ts
│   │   │   │   │   ├── db-connection-options.ts
│   │   │   │   │   └── db-connection.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── entities/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── types-db.test.ts
│   │   │   │   │   │   └── user.entity.test.ts
│   │   │   │   │   ├── abstract-entity.ts
│   │   │   │   │   ├── annotation-tag-entity.ee.ts
│   │   │   │   │   ├── annotation-tag-mapping.ee.ts
│   │   │   │   │   ├── api-key.ts
│   │   │   │   │   ├── auth-identity.ts
│   │   │   │   │   ├── auth-provider-sync-history.ts
│   │   │   │   │   ├── binary-data-file.ts
│   │   │   │   │   ├── credential-dependency-entity.ts
│   │   │   │   │   ├── credentials-entity.ts
│   │   │   │   │   ├── execution-annotation.ee.ts
│   │   │   │   │   ├── execution-data.ts
│   │   │   │   │   ├── execution-entity.ts
│   │   │   │   │   ├── execution-metadata.ts
│   │   │   │   │   ├── folder-tag-mapping.ts
│   │   │   │   │   ├── folder.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── invalid-auth-token.ts
│   │   │   │   │   ├── processed-data.ts
│   │   │   │   │   ├── project-relation.ts
│   │   │   │   │   ├── project-secrets-provider-access.ts
│   │   │   │   │   ├── project.ts
│   │   │   │   │   ├── role-mapping-rule.ts
│   │   │   │   │   ├── role.ts
│   │   │   │   │   ├── scope.ts
│   │   │   │   │   ├── secrets-provider-connection.ts
│   │   │   │   │   ├── settings.ts
│   │   │   │   │   ├── shared-credentials.ts
│   │   │   │   │   ├── shared-workflow.ts
│   │   │   │   │   ├── tag-entity.ts
│   │   │   │   │   ├── test-case-execution.ee.ts
│   │   │   │   │   ├── test-run.ee.ts
│   │   │   │   │   ├── types-db.ts
│   │   │   │   │   ├── user.ts
│   │   │   │   │   ├── variables.ts
│   │   │   │   │   ├── webhook-entity.ts
│   │   │   │   │   ├── workflow-dependency-entity.ts
│   │   │   │   │   ├── workflow-entity.ts
│   │   │   │   │   ├── workflow-history.ts
│   │   │   │   │   ├── workflow-publish-history.ts
│   │   │   │   │   ├── workflow-published-version.ts
│   │   │   │   │   ├── workflow-statistics.ts
│   │   │   │   │   └── workflow-tag-mapping.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── migrations/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── migration-helpers.ts
│   │   │   │   │   ├── common/
│   │   │   │   │   │   ├── 1620821879465-UniqueWorkflowNames.ts
│   │   │   │   │   │   ├── 1630330987096-UpdateWorkflowCredentials.ts
│   │   │   │   │   │   ├── 1658930531669-AddNodeIds.ts
│   │   │   │   │   │   ├── 1659888469333-AddJsonKeyPinData.ts
│   │   │   │   │   │   ├── 1669739707124-AddWorkflowVersionIdColumn.ts
│   │   │   │   │   │   ├── 1671726148419-RemoveWorkflowDataLoadedFlag.ts
│   │   │   │   │   │   ├── 1674509946020-CreateLdapEntities.ts
│   │   │   │   │   │   ├── 1675940580449-PurgeInvalidWorkflowConnections.ts
│   │   │   │   │   │   ├── 1690000000030-RemoveResetPasswordColumns.ts
│   │   │   │   │   │   ├── 1690000000040-AddMfaColumns.ts
│   │   │   │   │   │   ├── 1691088862123-CreateWorkflowNameIndex.ts
│   │   │   │   │   │   ├── 1692967111175-CreateWorkflowHistoryTable.ts
│   │   │   │   │   │   ├── 1693491613982-ExecutionSoftDelete.ts
│   │   │   │   │   │   ├── 1693554410387-DisallowOrphanExecutions.ts
│   │   │   │   │   │   ├── 1695128658538-AddWorkflowMetadata.ts
│   │   │   │   │   │   ├── 1695829275184-ModifyWorkflowHistoryNodesAndConnections.ts
│   │   │   │   │   │   ├── 1700571993961-AddGlobalAdminRole.ts
│   │   │   │   │   │   ├── 1705429061930-DropRoleMapping.ts
│   │   │   │   │   │   ├── 1711018413374-RemoveFailedExecutionStatus.ts
│   │   │   │   │   │   ├── 1711390882123-MoveSshKeysToDatabase.ts
│   │   │   │   │   │   ├── 1712044305787-RemoveNodesAccess.ts
│   │   │   │   │   │   ├── 1714133768519-CreateProject.ts
│   │   │   │   │   │   ├── 1714133768521-MakeExecutionStatusNonNullable.ts
│   │   │   │   │   │   ├── 1720101653148-AddConstraintToExecutionMetadata.ts
│   │   │   │   │   │   ├── 1723627610222-CreateInvalidAuthTokenTable.ts
│   │   │   │   │   │   ├── 1723796243146-RefactorExecutionIndices.ts
│   │   │   │   │   │   ├── 1724753530828-CreateExecutionAnnotationTables.ts
│   │   │   │   │   │   ├── 1724951148974-AddApiKeysTable.ts
│   │   │   │   │   │   ├── 1726606152711-CreateProcessedDataTable.ts
│   │   │   │   │   │   ├── 1727427440136-SeparateExecutionCreationFromStart.ts
│   │   │   │   │   │   ├── 1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping.ts
│   │   │   │   │   │   ├── 1729607673464-UpdateProcessedDataValueColumnToText.ts
│   │   │   │   │   │   ├── 1729607673469-AddProjectIcons.ts
│   │   │   │   │   │   ├── 1730386903556-CreateTestDefinitionTable.ts
│   │   │   │   │   │   ├── 1731404028106-AddDescriptionToTestDefinition.ts
│   │   │   │   │   │   ├── 1732271325258-CreateTestMetricTable.ts
│   │   │   │   │   │   ├── 1732549866705-CreateTestRunTable.ts
│   │   │   │   │   │   ├── 1733133775640-AddMockedNodesColumnToTestDefinition.ts
│   │   │   │   │   │   ├── 1734479635324-AddManagedColumnToCredentialsTable.ts
│   │   │   │   │   │   ├── 1736172058779-AddStatsColumnsToTestRun.ts
│   │   │   │   │   │   ├── 1736947513045-CreateTestCaseExecutionTable.ts
│   │   │   │   │   │   ├── 1737715421462-AddErrorColumnsToTestRuns.ts
│   │   │   │   │   │   ├── 1738709609940-CreateFolderTable.ts
│   │   │   │   │   │   ├── 1739549398681-CreateAnalyticsTables.ts
│   │   │   │   │   │   ├── 1741167584277-RenameAnalyticsToInsights.ts
│   │   │   │   │   │   ├── 1742918400000-AddScopesColumnToApiKeys.ts
│   │   │   │   │   │   ├── 1745322634000-CleanEvaluations.ts
│   │   │   │   │   │   ├── 1745587087521-AddWorkflowStatisticsRootCount.ts
│   │   │   │   │   │   ├── 1745934666076-AddWorkflowArchivedColumn.ts
│   │   │   │   │   │   ├── 1745934666077-DropRoleTable.ts
│   │   │   │   │   │   ├── 1747824239000-AddProjectDescriptionColumn.ts
│   │   │   │   │   │   ├── 1750252139166-AddLastActiveAtColumnToUser.ts
│   │   │   │   │   │   ├── 1750252139166-AddScopeTables.ts
│   │   │   │   │   │   ├── 1750252139167-AddRolesTables.ts
│   │   │   │   │   │   ├── 1750252139168-LinkRoleToUserTable.ts
│   │   │   │   │   │   ├── 1750252139170-RemoveOldRoleColumn.ts
│   │   │   │   │   │   ├── 1752669793000-AddInputsOutputsToTestCaseExecution.ts
│   │   │   │   │   │   ├── 1753953244168-LinkRoleToProjectRelationTable.ts
│   │   │   │   │   │   ├── 1754475614601-CreateDataStoreTables.ts
│   │   │   │   │   │   ├── 1754475614602-ReplaceDataStoreTablesWithDataTables.ts
│   │   │   │   │   │   ├── 1756906557570-AddTimestampsToRoleAndRoleIndexes.ts
│   │   │   │   │   │   ├── 1758731786132-AddAudienceColumnToApiKey.ts
│   │   │   │   │   │   ├── 1759399811000-ChangeValueTypesForInsights.ts
│   │   │   │   │   │   ├── 1760019379982-CreateChatHubTables.ts
│   │   │   │   │   │   ├── 1760020000000-CreateChatHubAgentTable.ts
│   │   │   │   │   │   ├── 1760020838000-UniqueRoleNames.ts
│   │   │   │   │   │   ├── 1760116750277-CreateOAuthEntities.ts
│   │   │   │   │   │   ├── 1760314000000-CreateWorkflowDependencyTable.ts
│   │   │   │   │   │   ├── 1760965142113-DropUnusedChatHubColumns.ts
│   │   │   │   │   │   ├── 1761773155024-AddAttachmentsToChatHubMessages.ts
│   │   │   │   │   │   ├── 1761830340990-AddToolsColumnToChatHubTables.ts
│   │   │   │   │   │   ├── 1762177736257-AddWorkflowDescriptionColumn.ts
│   │   │   │   │   │   ├── 1762763704614-BackfillMissingWorkflowHistoryRecords.ts
│   │   │   │   │   │   ├── 1762771954619-IsGlobalGlobalColumnToCredentialsTable.ts
│   │   │   │   │   │   ├── 1762847206508-AddWorkflowHistoryAutoSaveFields.ts
│   │   │   │   │   │   ├── 1763047800000-AddActiveVersionIdColumn.ts
│   │   │   │   │   │   ├── 1763048000000-ActivateExecuteWorkflowTriggerWorkflows.ts
│   │   │   │   │   │   ├── 1763572724000-ChangeOAuthStateColumnToUnboundedVarchar.ts
│   │   │   │   │   │   ├── 1763716655000-CreateBinaryDataTable.ts
│   │   │   │   │   │   ├── 1764167920585-CreateWorkflowPublishHistoryTable.ts
│   │   │   │   │   │   ├── 1764276827837-AddCreatorIdToProjectTable.ts
│   │   │   │   │   │   ├── 1764682447000-CreateCredentialResolverTable.ts
│   │   │   │   │   │   ├── 1764689388394-AddDynamicCredentialEntryTable.ts
│   │   │   │   │   │   ├── 1765448186933-BackfillMissingWorkflowHistoryRecords.ts
│   │   │   │   │   │   ├── 1765459448000-AddResolvableFieldsToCredentials.ts
│   │   │   │   │   │   ├── 1765788427674-AddIconToAgentTable.ts
│   │   │   │   │   │   ├── 1765886667897-AddAgentIdForeignKeys.ts
│   │   │   │   │   │   ├── 1765892199653-AddVersionIdToExecutionData.ts
│   │   │   │   │   │   ├── 1766064542000-AddWorkflowPublishScopeToProjectRoles.ts
│   │   │   │   │   │   ├── 1766068346315-AddChatMessageIndices.ts
│   │   │   │   │   │   ├── 1768402473068-ExpandModelColumnLength.ts
│   │   │   │   │   │   ├── 1768557000000-AddStoredAtToExecutionEntity.ts
│   │   │   │   │   │   ├── 1768901721000-AddDynamicCredentialUserEntryTable.ts
│   │   │   │   │   │   ├── 1769000000000-AddPublishedVersionIdToWorkflowDependency.ts
│   │   │   │   │   │   ├── 1769433700000-CreateSecretsProvidersConnectionTables.ts
│   │   │   │   │   │   ├── 1769698710000-CreateWorkflowPublishedVersionTable.ts
│   │   │   │   │   │   ├── 1769784356000-ExpandSubjectIDColumnLength.ts
│   │   │   │   │   │   ├── 1769900001000-AddWorkflowUnpublishScopeToCustomRoles.ts
│   │   │   │   │   │   ├── 1770000000000-CreateChatHubToolsTable.ts
│   │   │   │   │   │   ├── 1770000000000-ExpandProviderIdColumnLength.ts
│   │   │   │   │   │   ├── 1770220686000-CreateWorkflowBuilderSessionTable.ts
│   │   │   │   │   │   ├── 1771417407753-AddScalingFieldsToTestRun.ts
│   │   │   │   │   │   ├── 1771500000000-MigrateExternalSecretsToEntityStorage.ts
│   │   │   │   │   │   ├── 1771500000001-AddUnshareScopeToCustomRoles.ts
│   │   │   │   │   │   ├── 1771500000002-AddFilesColumnToChatHubAgents.ts
│   │   │   │   │   │   ├── 1772000000000-AddSuggestedPromptsToAgentTable.ts
│   │   │   │   │   │   ├── 1772619247761-AddRoleColumnToProjectSecretsProviderAccess.ts
│   │   │   │   │   │   ├── 1772619247762-ChangeWorkflowPublishedVersionFKsToRestrict.ts
│   │   │   │   │   │   ├── 1772700000000-AddTypeToChatHubSessions.ts
│   │   │   │   │   │   ├── 1772800000000-CreateRoleMappingRuleTable.ts
│   │   │   │   │   │   ├── 1773000000000-CreateCredentialDependencyTable.ts
│   │   │   │   │   │   ├── 1774280963551-AddRestoreFieldsToWorkflowBuilderSession.ts
│   │   │   │   │   │   ├── 1774854660000-CreateInstanceVersionHistoryTable.ts
│   │   │   │   │   │   └── 1775000000000-CreateInstanceAiTables.ts
│   │   │   │   │   ├── dsl/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── enum-check.test.ts
│   │   │   │   │   │   ├── column.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── indices.ts
│   │   │   │   │   │   └── table.ts
│   │   │   │   │   ├── migration-helpers.test.ts
│   │   │   │   │   ├── migration-helpers.ts
│   │   │   │   │   ├── migration-types.ts
│   │   │   │   │   ├── postgresdb/
│   │   │   │   │   │   ├── 1587669153312-InitialMigration.ts
│   │   │   │   │   │   ├── 1589476000887-WebhookModel.ts
│   │   │   │   │   │   ├── 1594828256133-CreateIndexStoppedAt.ts
│   │   │   │   │   │   ├── 1607431743768-MakeStoppedAtNullable.ts
│   │   │   │   │   │   ├── 1611144599516-AddWebhookId.ts
│   │   │   │   │   │   ├── 1617270242566-CreateTagEntity.ts
│   │   │   │   │   │   ├── 1620824779533-UniqueWorkflowNames.ts
│   │   │   │   │   │   ├── 1626176912946-AddwaitTill.ts
│   │   │   │   │   │   ├── 1630419189837-UpdateWorkflowCredentials.ts
│   │   │   │   │   │   ├── 1644422880309-AddExecutionEntityIndexes.ts
│   │   │   │   │   │   ├── 1646834195327-IncreaseTypeVarcharLimit.ts
│   │   │   │   │   │   ├── 1646992772331-CreateUserManagement.ts
│   │   │   │   │   │   ├── 1648740597343-LowerCaseUserEmail.ts
│   │   │   │   │   │   ├── 1652254514002-CommunityNodes.ts
│   │   │   │   │   │   ├── 1652367743993-AddUserSettings.ts
│   │   │   │   │   │   ├── 1652905585850-AddAPIKeyColumn.ts
│   │   │   │   │   │   ├── 1654090467022-IntroducePinData.ts
│   │   │   │   │   │   ├── 1658932090381-AddNodeIds.ts
│   │   │   │   │   │   ├── 1659902242948-AddJsonKeyPinData.ts
│   │   │   │   │   │   ├── 1660062385367-CreateCredentialsUserRole.ts
│   │   │   │   │   │   ├── 1663755770893-CreateWorkflowsEditorRole.ts
│   │   │   │   │   │   ├── 1664196174001-WorkflowStatistics.ts
│   │   │   │   │   │   ├── 1665484192212-CreateCredentialUsageTable.ts
│   │   │   │   │   │   ├── 1665754637025-RemoveCredentialUsageTable.ts
│   │   │   │   │   │   ├── 1669739707126-AddWorkflowVersionIdColumn.ts
│   │   │   │   │   │   ├── 1669823906995-AddTriggerCountColumn.ts
│   │   │   │   │   │   ├── 1671535397530-MessageEventBusDestinations.ts
│   │   │   │   │   │   ├── 1671726148421-RemoveWorkflowDataLoadedFlag.ts
│   │   │   │   │   │   ├── 1673268682475-DeleteExecutionsWithWorkflows.ts
│   │   │   │   │   │   ├── 1674138566000-AddStatusToExecutions.ts
│   │   │   │   │   │   ├── 1676996103000-MigrateExecutionStatus.ts
│   │   │   │   │   │   ├── 1677236854063-UpdateRunningExecutionStatus.ts
│   │   │   │   │   │   ├── 1677501636754-CreateVariables.ts
│   │   │   │   │   │   ├── 1679416281778-CreateExecutionMetadataTable.ts
│   │   │   │   │   │   ├── 1681134145996-AddUserActivatedProperty.ts
│   │   │   │   │   │   ├── 1681134145997-RemoveSkipOwnerSetup.ts
│   │   │   │   │   │   ├── 1690000000000-MigrateIntegerKeysToString.ts
│   │   │   │   │   │   ├── 1690000000020-SeparateExecutionData.ts
│   │   │   │   │   │   ├── 1690787606731-AddMissingPrimaryKeyOnExecutionData.ts
│   │   │   │   │   │   ├── 1694091729095-MigrateToTimestampTz.ts
│   │   │   │   │   │   ├── 1717498465931-AddActivatedAtUserSetting.ts
│   │   │   │   │   │   ├── 1721377157740-FixExecutionMetadataSequence.ts
│   │   │   │   │   │   ├── 1731582748663-MigrateTestDefinitionKeyToString.ts
│   │   │   │   │   │   ├── 1740445074052-UpdateParentFolderIdColumn.ts
│   │   │   │   │   │   ├── 1758794506893-AddProjectIdToVariableTable.ts
│   │   │   │   │   │   ├── 1761047826451-AddWorkflowVersionColumn.ts
│   │   │   │   │   │   ├── 1761655473000-ChangeDependencyInfoToJson.ts
│   │   │   │   │   │   ├── 1762771264000-ChangeDefaultForIdInUserTable.ts
│   │   │   │   │   │   ├── 1765804780000-ConvertAgentIdToUuid.ts
│   │   │   │   │   │   ├── 1766500000000-ExpandInsightsWorkflowIdLength.ts
│   │   │   │   │   │   ├── 1767018516000-ChangeWorkflowStatisticsFKToNoAction.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── sqlite/
│   │   │   │   │       ├── 1588102412422-InitialMigration.ts
│   │   │   │   │       ├── 1592445003908-WebhookModel.ts
│   │   │   │   │       ├── 1594825041918-CreateIndexStoppedAt.ts
│   │   │   │   │       ├── 1607431743769-MakeStoppedAtNullable.ts
│   │   │   │   │       ├── 1611071044839-AddWebhookId.ts
│   │   │   │   │       ├── 1617213344594-CreateTagEntity.ts
│   │   │   │   │       ├── 1621707690587-AddWaitColumn.ts
│   │   │   │   │       ├── 1644421939510-AddExecutionEntityIndexes.ts
│   │   │   │   │       ├── 1646992772331-CreateUserManagement.ts
│   │   │   │   │       ├── 1648740597343-LowerCaseUserEmail.ts
│   │   │   │   │       ├── 1652254514001-CommunityNodes.ts
│   │   │   │   │       ├── 1652367743993-AddUserSettings.ts
│   │   │   │   │       ├── 1652905585850-AddAPIKeyColumn.ts
│   │   │   │   │       ├── 1654089251344-IntroducePinData.ts
│   │   │   │   │       ├── 1660062385367-CreateCredentialsUserRole.ts
│   │   │   │   │       ├── 1663755770892-CreateWorkflowsUserRole.ts
│   │   │   │   │       ├── 1664196174000-WorkflowStatistics.ts
│   │   │   │   │       ├── 1665484192211-CreateCredentialUsageTable.ts
│   │   │   │   │       ├── 1665754637024-RemoveCredentialUsageTable.ts
│   │   │   │   │       ├── 1669823906993-AddTriggerCountColumn.ts
│   │   │   │   │       ├── 1671535397530-MessageEventBusDestinations.ts
│   │   │   │   │       ├── 1673268682475-DeleteExecutionsWithWorkflows.ts
│   │   │   │   │       ├── 1674138566000-AddStatusToExecutions.ts
│   │   │   │   │       ├── 1676996103000-MigrateExecutionStatus.ts
│   │   │   │   │       ├── 1677237073720-UpdateRunningExecutionStatus.ts
│   │   │   │   │       ├── 1677501636752-CreateVariables.ts
│   │   │   │   │       ├── 1679416281777-CreateExecutionMetadataTable.ts
│   │   │   │   │       ├── 1681134145996-AddUserActivatedProperty.ts
│   │   │   │   │       ├── 1681134145997-RemoveSkipOwnerSetup.ts
│   │   │   │   │       ├── 1690000000002-MigrateIntegerKeysToString.ts
│   │   │   │   │       ├── 1690000000010-SeparateExecutionData.ts
│   │   │   │   │       ├── 1690000000020-FixMissingIndicesFromStringIdMigration.ts
│   │   │   │   │       ├── 1690000000030-RemoveResetPasswordColumns.ts
│   │   │   │   │       ├── 1690000000040-AddMfaColumns.ts
│   │   │   │   │       ├── 1693491613982-ExecutionSoftDelete.ts
│   │   │   │   │       ├── 1695128658538-AddWorkflowMetadata.ts
│   │   │   │   │       ├── 1705429061930-DropRoleMapping.ts
│   │   │   │   │       ├── 1717498465931-AddActivatedAtUserSetting.ts
│   │   │   │   │       ├── 1724951148974-AddApiKeysTable.ts
│   │   │   │   │       ├── 1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping.ts
│   │   │   │   │       ├── 1729607673469-AddProjectIcons.ts
│   │   │   │   │       ├── 1731404028106-AddDescriptionToTestDefinition.ts
│   │   │   │   │       ├── 1731582748663-MigrateTestDefinitionKeyToString.ts
│   │   │   │   │       ├── 1738709609940-CreateFolderTable.ts
│   │   │   │   │       ├── 1740445074052-UpdateParentFolderIdColumn.ts
│   │   │   │   │       ├── 1742918400000-AddScopesColumnToApiKeys.ts
│   │   │   │   │       ├── 1758794506893-AddProjectIdToVariableTable.ts
│   │   │   │   │       ├── 1761047826451-AddWorkflowVersionColumn.ts
│   │   │   │   │       ├── 1761655473000-ChangeDependencyInfoToJson.ts
│   │   │   │   │       ├── 1764276827837-AddCreatorIdToProjectTable.ts
│   │   │   │   │       ├── 1764689448000-AddResolvableFieldsToCredentials.ts
│   │   │   │   │       ├── 1765886667897-AddAgentIdForeignKeys.ts
│   │   │   │   │       ├── 1766068346315-AddChatMessageIndices.ts
│   │   │   │   │       ├── 1767018516000-ChangeWorkflowStatisticsFKToNoAction.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── repositories/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── credential-dependency.repository.test.ts
│   │   │   │   │   │   ├── credentials.repository.test.ts
│   │   │   │   │   │   ├── execution.repository.test.ts
│   │   │   │   │   │   ├── secrets-provider-connection.repository.ee.test.ts
│   │   │   │   │   │   ├── shared-credentials.repository.test.ts
│   │   │   │   │   │   ├── shared-workflow.repository.test.ts
│   │   │   │   │   │   └── workflow.repository.test.ts
│   │   │   │   │   ├── annotation-tag-mapping.repository.ee.ts
│   │   │   │   │   ├── annotation-tag.repository.ee.ts
│   │   │   │   │   ├── api-key.repository.ts
│   │   │   │   │   ├── auth-identity.repository.ts
│   │   │   │   │   ├── auth-provider-sync-history.repository.ts
│   │   │   │   │   ├── binary-data.repository.ts
│   │   │   │   │   ├── credential-dependency.repository.ts
│   │   │   │   │   ├── credentials.repository.ts
│   │   │   │   │   ├── execution-annotation.repository.ts
│   │   │   │   │   ├── execution-data.repository.ts
│   │   │   │   │   ├── execution-metadata.repository.ts
│   │   │   │   │   ├── execution.repository.ts
│   │   │   │   │   ├── folder-tag-mapping.repository.ts
│   │   │   │   │   ├── folder.repository.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── invalid-auth-token.repository.ts
│   │   │   │   │   ├── license-metrics.repository.ts
│   │   │   │   │   ├── processed-data.repository.ts
│   │   │   │   │   ├── project-relation.repository.ts
│   │   │   │   │   ├── project-secrets-provider-access.repository.ee.ts
│   │   │   │   │   ├── project.repository.ts
│   │   │   │   │   ├── role-mapping-rule.repository.ts
│   │   │   │   │   ├── role.repository.ts
│   │   │   │   │   ├── scope.repository.ts
│   │   │   │   │   ├── secrets-provider-connection.repository.ee.ts
│   │   │   │   │   ├── settings.repository.ts
│   │   │   │   │   ├── shared-credentials.repository.ts
│   │   │   │   │   ├── shared-workflow.repository.ts
│   │   │   │   │   ├── tag.repository.ts
│   │   │   │   │   ├── test-case-execution.repository.ee.ts
│   │   │   │   │   ├── test-run.repository.ee.ts
│   │   │   │   │   ├── user.repository.ts
│   │   │   │   │   ├── variables.repository.ts
│   │   │   │   │   ├── webhook.repository.ts
│   │   │   │   │   ├── workflow-dependency.repository.ts
│   │   │   │   │   ├── workflow-history.repository.ts
│   │   │   │   │   ├── workflow-publish-history.repository.ts
│   │   │   │   │   ├── workflow-published-version.repository.ts
│   │   │   │   │   ├── workflow-statistics.repository.ts
│   │   │   │   │   ├── workflow-tag-mapping.repository.ts
│   │   │   │   │   └── workflow.repository.ts
│   │   │   │   ├── services/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── db-lock.service.test.ts
│   │   │   │   │   ├── auth.roles.service.ts
│   │   │   │   │   ├── db-lock.service.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── subscribers/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── user-subscriber.ts
│   │   │   │   └── utils/
│   │   │   │       ├── __tests__/
│   │   │   │       │   ├── build-workflows-by-nodes-query.test.ts
│   │   │   │       │   └── get-test-run-final-result.ee.test.ts
│   │   │   │       ├── build-workflows-by-nodes-query.ts
│   │   │   │       ├── generators.ts
│   │   │   │       ├── get-final-test-result.ts
│   │   │   │       ├── is-string-array.ts
│   │   │   │       ├── is-valid-email.ts
│   │   │   │       ├── separate.ts
│   │   │   │       ├── sql.ts
│   │   │   │       ├── test-utils/
│   │   │   │       │   ├── mock-entity-manager.ts
│   │   │   │       │   └── mock-instance.ts
│   │   │   │       ├── timed-query.ts
│   │   │   │       ├── transaction.ts
│   │   │   │       ├── transformers.ts
│   │   │   │       └── validators/
│   │   │   │           ├── __tests__/
│   │   │   │           │   ├── no-url.validator.test.ts
│   │   │   │           │   └── no-xss.validator.test.ts
│   │   │   │           ├── no-url.validator.ts
│   │   │   │           └── no-xss.validator.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── decorators/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── memoized.test.ts
│   │   │   │   │   └── redactable.test.ts
│   │   │   │   ├── auth-handler/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── auth-handler-metadata.test.ts
│   │   │   │   │   ├── auth-handler-metadata.ts
│   │   │   │   │   ├── auth-handler.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── breaking-change-rule/
│   │   │   │   │   ├── breaking-change-rule-metadata.ts
│   │   │   │   │   ├── breaking-change-rule.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── command/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── command.test.ts
│   │   │   │   │   ├── command-metadata.ts
│   │   │   │   │   ├── command.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── context-establishment/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── context-establishment-hook.test.ts
│   │   │   │   │   ├── context-establishment-hook-metadata.ts
│   │   │   │   │   ├── context-establishment-hook.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── controller/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── args.test.ts
│   │   │   │   │   │   ├── controller-registry-metadata.test.ts
│   │   │   │   │   │   ├── license.test.ts
│   │   │   │   │   │   ├── rest-controller.test.ts
│   │   │   │   │   │   ├── root-level-controller.test.ts
│   │   │   │   │   │   ├── route.test.ts
│   │   │   │   │   │   └── scoped.test.ts
│   │   │   │   │   ├── args.ts
│   │   │   │   │   ├── controller-registry-metadata.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── licensed.ts
│   │   │   │   │   ├── middleware.ts
│   │   │   │   │   ├── rate-limit.ts
│   │   │   │   │   ├── rest-controller.ts
│   │   │   │   │   ├── root-level-controller.ts
│   │   │   │   │   ├── route.ts
│   │   │   │   │   ├── scoped.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── credential-resolver/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── credential-resolver.test.ts
│   │   │   │   │   ├── credential-resolver-metadata.ts
│   │   │   │   │   ├── credential-resolver.ts
│   │   │   │   │   ├── errors.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── debounce.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── execution-lifecycle/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── on-lifecycle-event.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lifecycle-metadata.ts
│   │   │   │   │   └── on-lifecycle-event.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── memoized.ts
│   │   │   │   ├── module/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── module.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── module-metadata.ts
│   │   │   │   │   └── module.ts
│   │   │   │   ├── multi-main/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── on-multi-main-event.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── multi-main-metadata.ts
│   │   │   │   │   └── on-multi-main-event.ts
│   │   │   │   ├── pubsub/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── on-pubsub-event.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── on-pubsub-event.ts
│   │   │   │   │   └── pubsub-metadata.ts
│   │   │   │   ├── redactable.ts
│   │   │   │   ├── shutdown/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── on-shutdown.test.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── on-shutdown.ts
│   │   │   │   │   ├── shutdown-metadata.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── timed.ts
│   │   │   │   └── types.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── di/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── circular-depedency.test.ts
│   │   │   │   │   ├── di.test.ts
│   │   │   │   │   └── fixtures/
│   │   │   │   │       ├── service-a.ts
│   │   │   │   │       └── service-b.ts
│   │   │   │   └── di.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── errors/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── application.error.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── eslint-config/
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── configs/
│   │   │   │   │   ├── base.ts
│   │   │   │   │   ├── frontend.ts
│   │   │   │   │   └── node.ts
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── plugins.d.ts
│   │   │   │   ├── rules/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── misplaced-n8n-typeorm-import.ts
│   │   │   │   │   ├── no-argument-spread.test.ts
│   │   │   │   │   ├── no-argument-spread.ts
│   │   │   │   │   ├── no-constructor-in-backend-module.test.ts
│   │   │   │   │   ├── no-constructor-in-backend-module.ts
│   │   │   │   │   ├── no-dynamic-import-template.ts
│   │   │   │   │   ├── no-import-enterprise-edition.test.ts
│   │   │   │   │   ├── no-import-enterprise-edition.ts
│   │   │   │   │   ├── no-internal-package-import.test.ts
│   │   │   │   │   ├── no-internal-package-import.ts
│   │   │   │   │   ├── no-interpolation-in-regular-string.ts
│   │   │   │   │   ├── no-json-parse-json-stringify.test.ts
│   │   │   │   │   ├── no-json-parse-json-stringify.ts
│   │   │   │   │   ├── no-plain-errors.ts
│   │   │   │   │   ├── no-skipped-tests.ts
│   │   │   │   │   ├── no-top-level-relative-imports-in-backend-module.test.ts
│   │   │   │   │   ├── no-top-level-relative-imports-in-backend-module.ts
│   │   │   │   │   ├── no-type-only-import-in-di.test.ts
│   │   │   │   │   ├── no-type-only-import-in-di.ts
│   │   │   │   │   ├── no-type-unsafe-event-emitter.ts
│   │   │   │   │   ├── no-uncaught-json-parse.test.ts
│   │   │   │   │   ├── no-uncaught-json-parse.ts
│   │   │   │   │   ├── no-unneeded-backticks.ts
│   │   │   │   │   ├── no-untyped-config-class-field.ts
│   │   │   │   │   ├── no-unused-param-catch-clause.ts
│   │   │   │   │   ├── no-useless-catch-throw.test.ts
│   │   │   │   │   └── no-useless-catch-throw.ts
│   │   │   │   └── utils/
│   │   │   │       └── json.ts
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.ts
│   │   ├── eslint-plugin-community-nodes/
│   │   │   ├── README.md
│   │   │   ├── docs/
│   │   │   │   └── rules/
│   │   │   │       ├── ai-node-package-json.md
│   │   │   │       ├── cred-class-field-icon-missing.md
│   │   │   │       ├── credential-documentation-url.md
│   │   │   │       ├── credential-password-field.md
│   │   │   │       ├── credential-test-required.md
│   │   │   │       ├── icon-validation.md
│   │   │   │       ├── no-credential-reuse.md
│   │   │   │       ├── no-deprecated-workflow-functions.md
│   │   │   │       ├── no-http-request-with-manual-auth.md
│   │   │   │       ├── no-restricted-globals.md
│   │   │   │       ├── no-restricted-imports.md
│   │   │   │       ├── node-class-description-icon-missing.md
│   │   │   │       ├── node-usable-as-tool.md
│   │   │   │       ├── package-name-convention.md
│   │   │   │       └── resource-operation-pattern.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── rules/
│   │   │   │   │   ├── ai-node-package-json.test.ts
│   │   │   │   │   ├── ai-node-package-json.ts
│   │   │   │   │   ├── cred-class-field-icon-missing.test.ts
│   │   │   │   │   ├── cred-class-field-icon-missing.ts
│   │   │   │   │   ├── credential-documentation-url.test.ts
│   │   │   │   │   ├── credential-documentation-url.ts
│   │   │   │   │   ├── credential-password-field.test.ts
│   │   │   │   │   ├── credential-password-field.ts
│   │   │   │   │   ├── credential-test-required.test.ts
│   │   │   │   │   ├── credential-test-required.ts
│   │   │   │   │   ├── icon-validation.test.ts
│   │   │   │   │   ├── icon-validation.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── no-credential-reuse.test.ts
│   │   │   │   │   ├── no-credential-reuse.ts
│   │   │   │   │   ├── no-deprecated-workflow-functions.test.ts
│   │   │   │   │   ├── no-deprecated-workflow-functions.ts
│   │   │   │   │   ├── no-http-request-with-manual-auth.test.ts
│   │   │   │   │   ├── no-http-request-with-manual-auth.ts
│   │   │   │   │   ├── no-restricted-globals.test.ts
│   │   │   │   │   ├── no-restricted-globals.ts
│   │   │   │   │   ├── no-restricted-imports.test.ts
│   │   │   │   │   ├── no-restricted-imports.ts
│   │   │   │   │   ├── node-class-description-icon-missing.test.ts
│   │   │   │   │   ├── node-class-description-icon-missing.ts
│   │   │   │   │   ├── node-usable-as-tool.test.ts
│   │   │   │   │   ├── node-usable-as-tool.ts
│   │   │   │   │   ├── package-name-convention.test.ts
│   │   │   │   │   ├── package-name-convention.ts
│   │   │   │   │   ├── resource-operation-pattern.test.ts
│   │   │   │   │   └── resource-operation-pattern.ts
│   │   │   │   └── utils/
│   │   │   │       ├── ast-utils.ts
│   │   │   │       ├── file-utils.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── rule-creator.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.eslint.json
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.ts
│   │   ├── expression-runtime/
│   │   │   ├── ARCHITECTURE.md
│   │   │   ├── README.md
│   │   │   ├── docs/
│   │   │   │   ├── architecture-diagram.mmd
│   │   │   │   ├── deep-lazy-proxy.md
│   │   │   │   └── implementation-phases.md
│   │   │   ├── esbuild.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── integration.test.ts
│   │   │   │   ├── bridge/
│   │   │   │   │   └── isolated-vm-bridge.ts
│   │   │   │   ├── evaluator/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── expression-evaluator-cache.test.ts
│   │   │   │   │   │   └── lru-cache.test.ts
│   │   │   │   │   ├── expression-evaluator.ts
│   │   │   │   │   └── lru-cache.ts
│   │   │   │   ├── extensions/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── string-extensions.test.ts
│   │   │   │   │   ├── array-extensions.ts
│   │   │   │   │   ├── boolean-extensions.ts
│   │   │   │   │   ├── date-extensions.ts
│   │   │   │   │   ├── expression-extension-error.ts
│   │   │   │   │   ├── extend.ts
│   │   │   │   │   ├── extensions.ts
│   │   │   │   │   ├── function-extensions.ts
│   │   │   │   │   ├── number-extensions.ts
│   │   │   │   │   ├── object-extensions.ts
│   │   │   │   │   ├── string-extensions.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── pool/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── isolate-pool.test.ts
│   │   │   │   │   └── isolate-pool.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── lazy-proxy.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lazy-proxy.ts
│   │   │   │   │   ├── reset.ts
│   │   │   │   │   ├── safe-globals.ts
│   │   │   │   │   └── serialize.ts
│   │   │   │   └── types/
│   │   │   │       ├── bridge.ts
│   │   │   │       ├── evaluator.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── runtime.ts
│   │   │   ├── tsconfig.build.cjs.json
│   │   │   ├── tsconfig.build.esm.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── extension-sdk/
│   │   │   ├── .gitignore
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── schema.json
│   │   │   ├── scripts/
│   │   │   │   └── create-json-schema.ts
│   │   │   ├── src/
│   │   │   │   ├── backend/
│   │   │   │   │   ├── define.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── frontend/
│   │   │   │   │   ├── define.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── schema.ts
│   │   │   │   └── shims.d.ts
│   │   │   ├── tsconfig.backend.json
│   │   │   ├── tsconfig.common.json
│   │   │   ├── tsconfig.frontend.json
│   │   │   ├── tsconfig.json
│   │   │   ├── tsconfig.scripts.json
│   │   │   └── tsdown.config.ts
│   │   ├── fs-proxy/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── spec/
│   │   │   │   ├── local-gateway.md
│   │   │   │   └── technical-spec.md
│   │   │   ├── src/
│   │   │   │   ├── __mocks__/
│   │   │   │   │   └── @inquirer/
│   │   │   │   │       └── prompts.ts
│   │   │   │   ├── cli.ts
│   │   │   │   ├── config-templates.test.ts
│   │   │   │   ├── config-templates.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── confirm-resource-cli.ts
│   │   │   │   ├── daemon.ts
│   │   │   │   ├── gateway-client.ts
│   │   │   │   ├── logger.test.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── settings-store.ts
│   │   │   │   ├── sharp.d.ts
│   │   │   │   ├── startup-config-cli.test.ts
│   │   │   │   ├── startup-config-cli.ts
│   │   │   │   └── tools/
│   │   │   │       ├── browser/
│   │   │   │       │   └── index.ts
│   │   │   │       ├── filesystem/
│   │   │   │       │   ├── constants.ts
│   │   │   │       │   ├── copy-file.test.ts
│   │   │   │       │   ├── copy-file.ts
│   │   │   │       │   ├── create-directory.test.ts
│   │   │   │       │   ├── create-directory.ts
│   │   │   │       │   ├── delete.test.ts
│   │   │   │       │   ├── delete.ts
│   │   │   │       │   ├── edit-file.test.ts
│   │   │   │       │   ├── edit-file.ts
│   │   │   │       │   ├── fs-utils.test.ts
│   │   │   │       │   ├── fs-utils.ts
│   │   │   │       │   ├── get-file-tree.test.ts
│   │   │   │       │   ├── get-file-tree.ts
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── list-files.test.ts
│   │   │   │       │   ├── list-files.ts
│   │   │   │       │   ├── move.test.ts
│   │   │   │       │   ├── move.ts
│   │   │   │       │   ├── read-file.test.ts
│   │   │   │       │   ├── read-file.ts
│   │   │   │       │   ├── search-files.test.ts
│   │   │   │       │   ├── search-files.ts
│   │   │   │       │   ├── write-file.test.ts
│   │   │   │       │   └── write-file.ts
│   │   │   │       ├── monitor-utils.ts
│   │   │   │       ├── mouse-keyboard/
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── mouse-keyboard.test.ts
│   │   │   │       │   └── mouse-keyboard.ts
│   │   │   │       ├── screenshot/
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── screenshot.test.ts
│   │   │   │       │   └── screenshot.ts
│   │   │   │       ├── shell/
│   │   │   │       │   ├── build-shell-resource.test.ts
│   │   │   │       │   ├── build-shell-resource.ts
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── shell-execute.test.ts
│   │   │   │       │   └── shell-execute.ts
│   │   │   │       ├── test-utils.ts
│   │   │   │       ├── types.ts
│   │   │   │       └── utils.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── imap/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── errors.ts
│   │   │   │   ├── helpers/
│   │   │   │   │   └── get-message.ts
│   │   │   │   ├── imap-simple.test.ts
│   │   │   │   ├── imap-simple.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── part-data.test.ts
│   │   │   │   ├── part-data.ts
│   │   │   │   └── types.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.ts
│   │   ├── instance-ai/
│   │   │   ├── CLAUDE.md
│   │   │   ├── docs/
│   │   │   │   ├── ENGINEERING.md
│   │   │   │   ├── architecture.md
│   │   │   │   ├── configuration.md
│   │   │   │   ├── filesystem-access.md
│   │   │   │   ├── memory.md
│   │   │   │   ├── sandboxing.md
│   │   │   │   ├── streaming-protocol.md
│   │   │   │   └── tools.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── agent/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── register-with-mastra.test.ts
│   │   │   │   │   │   ├── sanitize-mcp-schemas.test.ts
│   │   │   │   │   │   └── system-prompt.test.ts
│   │   │   │   │   ├── instance-agent.ts
│   │   │   │   │   ├── register-with-mastra.ts
│   │   │   │   │   ├── sanitize-mcp-schemas.ts
│   │   │   │   │   ├── sub-agent-factory.ts
│   │   │   │   │   └── system-prompt.ts
│   │   │   │   ├── compaction/
│   │   │   │   │   ├── compaction-helper.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── domain-access/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── domain-access-tracker.test.ts
│   │   │   │   │   │   └── domain-gating.test.ts
│   │   │   │   │   ├── domain-access-tracker.ts
│   │   │   │   │   ├── domain-gating.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── event-bus/
│   │   │   │   │   ├── event-bus.interface.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── mcp/
│   │   │   │   │   └── mcp-client-manager.ts
│   │   │   │   ├── memory/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── memory-config.test.ts
│   │   │   │   │   │   └── title-utils.test.ts
│   │   │   │   │   ├── memory-config.ts
│   │   │   │   │   ├── title-utils.ts
│   │   │   │   │   └── working-memory-template.ts
│   │   │   │   ├── planned-tasks/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── planned-task-service.test.ts
│   │   │   │   │   └── planned-task-service.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── background-task-manager.test.ts
│   │   │   │   │   │   ├── resumable-stream-executor.test.ts
│   │   │   │   │   │   ├── run-state-registry.test.ts
│   │   │   │   │   │   └── stream-runner.test.ts
│   │   │   │   │   ├── background-task-manager.ts
│   │   │   │   │   ├── resumable-stream-executor.ts
│   │   │   │   │   ├── run-state-registry.ts
│   │   │   │   │   ├── stream-runner.ts
│   │   │   │   │   └── working-memory-tracing.ts
│   │   │   │   ├── storage/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── iteration-log.test.ts
│   │   │   │   │   │   ├── mastra-iteration-log-storage.test.ts
│   │   │   │   │   │   ├── mastra-task-storage.test.ts
│   │   │   │   │   │   ├── thread-patch.test.ts
│   │   │   │   │   │   └── workflow-loop-storage.test.ts
│   │   │   │   │   ├── agent-tree-snapshot.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── iteration-log.ts
│   │   │   │   │   ├── mastra-iteration-log-storage.ts
│   │   │   │   │   ├── mastra-task-storage.ts
│   │   │   │   │   ├── planned-task-storage.ts
│   │   │   │   │   ├── thread-patch.ts
│   │   │   │   │   └── workflow-loop-storage.ts
│   │   │   │   ├── stream/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── map-chunk.test.ts
│   │   │   │   │   ├── consume-with-hitl.ts
│   │   │   │   │   └── map-chunk.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── best-practices.test.ts
│   │   │   │   │   │   ├── get-best-practices.tool.test.ts
│   │   │   │   │   │   ├── mermaid.utils.test.ts
│   │   │   │   │   │   ├── node-configuration.utils.test.ts
│   │   │   │   │   │   ├── search-template-parameters.tool.test.ts
│   │   │   │   │   │   └── search-template-structures.tool.test.ts
│   │   │   │   │   ├── best-practices/
│   │   │   │   │   │   ├── get-best-practices.tool.ts
│   │   │   │   │   │   ├── guides/
│   │   │   │   │   │   │   ├── chatbot.ts
│   │   │   │   │   │   │   ├── content-generation.ts
│   │   │   │   │   │   │   ├── data-extraction.ts
│   │   │   │   │   │   │   ├── data-persistence.ts
│   │   │   │   │   │   │   ├── data-transformation.ts
│   │   │   │   │   │   │   ├── document-processing.ts
│   │   │   │   │   │   │   ├── form-input.ts
│   │   │   │   │   │   │   ├── notification.ts
│   │   │   │   │   │   │   ├── scheduling.ts
│   │   │   │   │   │   │   ├── scraping-and-research.ts
│   │   │   │   │   │   │   └── triage.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── techniques.ts
│   │   │   │   │   ├── credentials/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── delete-credential.tool.test.ts
│   │   │   │   │   │   │   ├── get-credential.tool.test.ts
│   │   │   │   │   │   │   ├── search-credential-types.tool.test.ts
│   │   │   │   │   │   │   └── setup-credentials-mock.tool.test.ts
│   │   │   │   │   │   ├── delete-credential.tool.ts
│   │   │   │   │   │   ├── get-credential.tool.ts
│   │   │   │   │   │   ├── list-credentials.tool.ts
│   │   │   │   │   │   ├── search-credential-types.tool.ts
│   │   │   │   │   │   ├── setup-credentials.tool.ts
│   │   │   │   │   │   └── test-credential.tool.ts
│   │   │   │   │   ├── data-tables/
│   │   │   │   │   │   ├── add-data-table-column.tool.ts
│   │   │   │   │   │   ├── create-data-table.tool.ts
│   │   │   │   │   │   ├── delete-data-table-column.tool.ts
│   │   │   │   │   │   ├── delete-data-table-rows.tool.ts
│   │   │   │   │   │   ├── delete-data-table.tool.ts
│   │   │   │   │   │   ├── get-data-table-schema.tool.ts
│   │   │   │   │   │   ├── insert-data-table-rows.tool.ts
│   │   │   │   │   │   ├── list-data-tables.tool.ts
│   │   │   │   │   │   ├── query-data-table-rows.tool.ts
│   │   │   │   │   │   ├── rename-data-table-column.tool.ts
│   │   │   │   │   │   └── update-data-table-rows.tool.ts
│   │   │   │   │   ├── executions/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── get-execution.tool.test.ts
│   │   │   │   │   │   │   ├── get-node-output.tool.test.ts
│   │   │   │   │   │   │   └── list-executions.tool.test.ts
│   │   │   │   │   │   ├── debug-execution.tool.ts
│   │   │   │   │   │   ├── get-execution.tool.ts
│   │   │   │   │   │   ├── get-node-output.tool.ts
│   │   │   │   │   │   ├── list-executions.tool.ts
│   │   │   │   │   │   ├── run-workflow.tool.ts
│   │   │   │   │   │   └── stop-execution.tool.ts
│   │   │   │   │   ├── filesystem/
│   │   │   │   │   │   ├── create-tools-from-mcp-server.ts
│   │   │   │   │   │   ├── get-file-tree.tool.ts
│   │   │   │   │   │   ├── list-files.tool.ts
│   │   │   │   │   │   ├── read-file.tool.ts
│   │   │   │   │   │   └── search-files.tool.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── nodes/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── get-suggested-nodes.tool.test.ts
│   │   │   │   │   │   │   └── node-search-engine.test.ts
│   │   │   │   │   │   ├── explore-node-resources.tool.ts
│   │   │   │   │   │   ├── get-node-description.tool.ts
│   │   │   │   │   │   ├── get-node-type-definition.tool.ts
│   │   │   │   │   │   ├── get-suggested-nodes.tool.ts
│   │   │   │   │   │   ├── list-nodes.tool.ts
│   │   │   │   │   │   ├── node-search-engine.ts
│   │   │   │   │   │   ├── node-search-engine.types.ts
│   │   │   │   │   │   ├── search-nodes.tool.ts
│   │   │   │   │   │   └── suggested-nodes-data.ts
│   │   │   │   │   ├── orchestration/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── correct-background-task.tool.test.ts
│   │   │   │   │   │   │   ├── delegate.tool.test.ts
│   │   │   │   │   │   │   ├── report-verification-verdict.tool.test.ts
│   │   │   │   │   │   │   └── research-with-agent.tool.test.ts
│   │   │   │   │   │   ├── browser-credential-setup.tool.ts
│   │   │   │   │   │   ├── build-workflow-agent.prompt.ts
│   │   │   │   │   │   ├── build-workflow-agent.tool.ts
│   │   │   │   │   │   ├── cancel-background-task.tool.ts
│   │   │   │   │   │   ├── correct-background-task.tool.ts
│   │   │   │   │   │   ├── data-table-agent.prompt.ts
│   │   │   │   │   │   ├── data-table-agent.tool.ts
│   │   │   │   │   │   ├── delegate.schemas.ts
│   │   │   │   │   │   ├── delegate.tool.ts
│   │   │   │   │   │   ├── display-utils.ts
│   │   │   │   │   │   ├── plan.tool.ts
│   │   │   │   │   │   ├── report-verification-verdict.tool.ts
│   │   │   │   │   │   ├── research-agent-prompt.ts
│   │   │   │   │   │   ├── research-with-agent.tool.ts
│   │   │   │   │   │   ├── tracing-utils.ts
│   │   │   │   │   │   ├── update-tasks.tool.ts
│   │   │   │   │   │   └── verify-built-workflow.tool.ts
│   │   │   │   │   ├── shared/
│   │   │   │   │   │   └── ask-user.tool.ts
│   │   │   │   │   ├── templates/
│   │   │   │   │   │   ├── search-template-parameters.tool.ts
│   │   │   │   │   │   ├── search-template-structures.tool.ts
│   │   │   │   │   │   ├── template-api.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── utils/
│   │   │   │   │   │   ├── mermaid.utils.ts
│   │   │   │   │   │   └── node-configuration.utils.ts
│   │   │   │   │   ├── web-research/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── fetch-url.tool.test.ts
│   │   │   │   │   │   │   └── web-search.tool.test.ts
│   │   │   │   │   │   ├── fetch-url.tool.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── sanitize-web-content.ts
│   │   │   │   │   │   └── web-search.tool.ts
│   │   │   │   │   ├── workflows/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── delete-workflow.tool.test.ts
│   │   │   │   │   │   │   ├── get-workflow.tool.test.ts
│   │   │   │   │   │   │   ├── list-workflow-versions.tool.test.ts
│   │   │   │   │   │   │   ├── publish-workflow.tool.test.ts
│   │   │   │   │   │   │   ├── resolve-credentials.test.ts
│   │   │   │   │   │   │   ├── restore-workflow-version.tool.test.ts
│   │   │   │   │   │   │   ├── setup-workflow.service.test.ts
│   │   │   │   │   │   │   ├── setup-workflow.tool.test.ts
│   │   │   │   │   │   │   ├── unpublish-workflow.tool.test.ts
│   │   │   │   │   │   │   └── write-sandbox-file.tool.test.ts
│   │   │   │   │   │   ├── apply-workflow-credentials.tool.ts
│   │   │   │   │   │   ├── build-workflow.tool.ts
│   │   │   │   │   │   ├── delete-workflow.tool.ts
│   │   │   │   │   │   ├── get-workflow-as-code.tool.ts
│   │   │   │   │   │   ├── get-workflow-version.tool.ts
│   │   │   │   │   │   ├── get-workflow.tool.ts
│   │   │   │   │   │   ├── list-workflow-versions.tool.ts
│   │   │   │   │   │   ├── list-workflows.tool.ts
│   │   │   │   │   │   ├── materialize-node-type.tool.ts
│   │   │   │   │   │   ├── publish-workflow.tool.ts
│   │   │   │   │   │   ├── resolve-credentials.ts
│   │   │   │   │   │   ├── restore-workflow-version.tool.ts
│   │   │   │   │   │   ├── setup-workflow.schema.ts
│   │   │   │   │   │   ├── setup-workflow.service.ts
│   │   │   │   │   │   ├── setup-workflow.tool.ts
│   │   │   │   │   │   ├── submit-workflow.tool.ts
│   │   │   │   │   │   ├── unpublish-workflow.tool.ts
│   │   │   │   │   │   ├── update-workflow-version.tool.ts
│   │   │   │   │   │   └── write-sandbox-file.tool.ts
│   │   │   │   │   └── workspace/
│   │   │   │   │       ├── __tests__/
│   │   │   │   │       │   ├── cleanup-test-executions.tool.test.ts
│   │   │   │   │       │   ├── create-folder.tool.test.ts
│   │   │   │   │       │   ├── delete-folder.tool.test.ts
│   │   │   │   │       │   ├── list-folders.tool.test.ts
│   │   │   │   │       │   ├── list-projects.tool.test.ts
│   │   │   │   │       │   ├── list-tags.tool.test.ts
│   │   │   │   │       │   ├── move-workflow-to-folder.tool.test.ts
│   │   │   │   │       │   └── tag-workflow.tool.test.ts
│   │   │   │   │       ├── cleanup-test-executions.tool.ts
│   │   │   │   │       ├── create-folder.tool.ts
│   │   │   │   │       ├── delete-folder.tool.ts
│   │   │   │   │       ├── list-folders.tool.ts
│   │   │   │   │       ├── list-projects.tool.ts
│   │   │   │   │       ├── list-tags.tool.ts
│   │   │   │   │       ├── move-workflow-to-folder.tool.ts
│   │   │   │   │       └── tag-workflow.tool.ts
│   │   │   │   ├── tracing/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── langsmith-tracing.test.ts
│   │   │   │   │   └── langsmith-tracing.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── format-timestamp.test.ts
│   │   │   │   │   │   └── stream-helpers.test.ts
│   │   │   │   │   ├── agent-tree.ts
│   │   │   │   │   ├── format-timestamp.ts
│   │   │   │   │   └── stream-helpers.ts
│   │   │   │   ├── workflow-builder/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── extract-code.test.ts
│   │   │   │   │   │   ├── parse-validate.test.ts
│   │   │   │   │   │   └── patch-code.test.ts
│   │   │   │   │   ├── extract-code.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── parse-validate.ts
│   │   │   │   │   ├── patch-code.ts
│   │   │   │   │   ├── sdk-prompt-sections.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── workflow-loop/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── guidance.test.ts
│   │   │   │   │   │   ├── workflow-loop-controller.test.ts
│   │   │   │   │   │   └── workflow-task-service.test.ts
│   │   │   │   │   ├── guidance.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── runtime.ts
│   │   │   │   │   ├── workflow-loop-controller.ts
│   │   │   │   │   ├── workflow-loop-state.ts
│   │   │   │   │   └── workflow-task-service.ts
│   │   │   │   └── workspace/
│   │   │   │       ├── __tests__/
│   │   │   │       │   ├── create-workspace.test.ts
│   │   │   │       │   ├── n8n-sandbox-client.test.ts
│   │   │   │       │   ├── sandbox-fs.test.ts
│   │   │   │       │   └── sandbox-setup.test.ts
│   │   │   │       ├── builder-sandbox-factory.ts
│   │   │   │       ├── create-workspace.ts
│   │   │   │       ├── daytona-filesystem.ts
│   │   │   │       ├── n8n-sandbox-client.ts
│   │   │   │       ├── n8n-sandbox-filesystem.ts
│   │   │   │       ├── n8n-sandbox-image-manager.ts
│   │   │   │       ├── n8n-sandbox-sandbox.ts
│   │   │   │       ├── sandbox-fs.ts
│   │   │   │       ├── sandbox-setup.ts
│   │   │   │       └── snapshot-manager.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── json-schema-to-zod/
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── postcjs.cjs
│   │   │   ├── postesm.cjs
│   │   │   ├── src/
│   │   │   │   ├── index.ts
│   │   │   │   ├── json-schema-to-zod.ts
│   │   │   │   ├── parsers/
│   │   │   │   │   ├── parse-all-of.ts
│   │   │   │   │   ├── parse-any-of.ts
│   │   │   │   │   ├── parse-array.ts
│   │   │   │   │   ├── parse-boolean.ts
│   │   │   │   │   ├── parse-const.ts
│   │   │   │   │   ├── parse-default.ts
│   │   │   │   │   ├── parse-enum.ts
│   │   │   │   │   ├── parse-if-then-else.ts
│   │   │   │   │   ├── parse-multiple-type.ts
│   │   │   │   │   ├── parse-not.ts
│   │   │   │   │   ├── parse-null.ts
│   │   │   │   │   ├── parse-nullable.ts
│   │   │   │   │   ├── parse-number.ts
│   │   │   │   │   ├── parse-object.ts
│   │   │   │   │   ├── parse-one-of.ts
│   │   │   │   │   ├── parse-schema.ts
│   │   │   │   │   └── parse-string.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils/
│   │   │   │       ├── extend-schema.ts
│   │   │   │       ├── half.ts
│   │   │   │       ├── its.ts
│   │   │   │       └── omit.ts
│   │   │   ├── test/
│   │   │   │   ├── all.json
│   │   │   │   ├── extend-expect.ts
│   │   │   │   ├── jest.d.ts
│   │   │   │   ├── json-schema-to-zod.test.ts
│   │   │   │   ├── parsers/
│   │   │   │   │   ├── parse-all-of.test.ts
│   │   │   │   │   ├── parse-any-of.test.ts
│   │   │   │   │   ├── parse-array.test.ts
│   │   │   │   │   ├── parse-const.test.ts
│   │   │   │   │   ├── parse-enum.test.ts
│   │   │   │   │   ├── parse-not.test.ts
│   │   │   │   │   ├── parse-nullable.test.ts
│   │   │   │   │   ├── parse-number.test.ts
│   │   │   │   │   ├── parse-object.test.ts
│   │   │   │   │   ├── parse-one-of.test.ts
│   │   │   │   │   ├── parse-schema.test.ts
│   │   │   │   │   └── parse-string.test.ts
│   │   │   │   └── utils/
│   │   │   │       ├── half.test.ts
│   │   │   │       └── omit.test.ts
│   │   │   ├── tsconfig.cjs.json
│   │   │   ├── tsconfig.esm.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.types.json
│   │   ├── local-gateway/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── assets/
│   │   │   │   ├── README.md
│   │   │   │   └── icon.icns
│   │   │   ├── electron-builder.config.js
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── main/
│   │   │   │   │   ├── daemon-controller.test.ts
│   │   │   │   │   ├── daemon-controller.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── ipc-handlers.ts
│   │   │   │   │   ├── preload.ts
│   │   │   │   │   ├── settings-store.ts
│   │   │   │   │   ├── settings-window.ts
│   │   │   │   │   └── tray.ts
│   │   │   │   ├── renderer/
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── settings.ts
│   │   │   │   │   └── styles.css
│   │   │   │   └── shared/
│   │   │   │       └── types.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.renderer.json
│   │   ├── mcp-browser/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── spec/
│   │   │   │   ├── browser-mcp.md
│   │   │   │   └── technical-spec.md
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── errors.test.ts
│   │   │   │   │   ├── server-config.test.ts
│   │   │   │   │   └── utils.test.ts
│   │   │   │   ├── adapters/
│   │   │   │   │   └── playwright.ts
│   │   │   │   ├── browser-discovery.ts
│   │   │   │   ├── cdp-relay-protocol.ts
│   │   │   │   ├── cdp-relay.ts
│   │   │   │   ├── connection.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── server-config.ts
│   │   │   │   ├── server.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── inspection.test.ts
│   │   │   │   │   ├── inspection.ts
│   │   │   │   │   ├── interaction.test.ts
│   │   │   │   │   ├── interaction.ts
│   │   │   │   │   ├── navigation.test.ts
│   │   │   │   │   ├── navigation.ts
│   │   │   │   │   ├── response-envelope.ts
│   │   │   │   │   ├── schemas.ts
│   │   │   │   │   ├── session.test.ts
│   │   │   │   │   ├── session.ts
│   │   │   │   │   ├── state.test.ts
│   │   │   │   │   ├── state.ts
│   │   │   │   │   ├── tabs.test.ts
│   │   │   │   │   ├── tabs.ts
│   │   │   │   │   ├── test-helpers.ts
│   │   │   │   │   ├── wait.test.ts
│   │   │   │   │   └── wait.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── utils.ts
│   │   │   │   └── vendor.d.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── mcp-browser-extension/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── manifest.json
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── relayConnection.test.ts
│   │   │   │   ├── background.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── relayConnection.ts
│   │   │   │   └── ui/
│   │   │   │       ├── App.vue
│   │   │   │       ├── connect.html
│   │   │   │       ├── main.ts
│   │   │   │       ├── shimsVue.d.ts
│   │   │   │       └── tokens.scss
│   │   │   ├── tsconfig.json
│   │   │   ├── vite.sw.config.mts
│   │   │   └── vite.ui.config.mts
│   │   ├── node-cli/
│   │   │   ├── README.md
│   │   │   ├── bin/
│   │   │   │   └── n8n-node.mjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   └── copy-templates.mjs
│   │   │   ├── src/
│   │   │   │   ├── commands/
│   │   │   │   │   ├── build.test.ts
│   │   │   │   │   ├── build.ts
│   │   │   │   │   ├── cloud-support.test.ts
│   │   │   │   │   ├── cloud-support.ts
│   │   │   │   │   ├── dev/
│   │   │   │   │   │   ├── index.test.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── utils.test.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── lint.test.ts
│   │   │   │   │   ├── lint.ts
│   │   │   │   │   ├── new/
│   │   │   │   │   │   ├── index.test.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── prompts.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── prerelease.test.ts
│   │   │   │   │   ├── prerelease.ts
│   │   │   │   │   ├── release.test.ts
│   │   │   │   │   └── release.ts
│   │   │   │   ├── configs/
│   │   │   │   │   └── eslint.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── modules.d.ts
│   │   │   │   ├── template/
│   │   │   │   │   ├── core.test.ts
│   │   │   │   │   ├── core.ts
│   │   │   │   │   └── templates/
│   │   │   │   │       ├── declarative/
│   │   │   │   │       │   ├── custom/
│   │   │   │   │       │   │   ├── ast.ts
│   │   │   │   │       │   │   ├── prompts.ts
│   │   │   │   │       │   │   ├── template/
│   │   │   │   │       │   │   │   ├── README.md
│   │   │   │   │       │   │   │   ├── nodes/
│   │   │   │   │       │   │   │   │   └── Example/
│   │   │   │   │       │   │   │   │       ├── Example.node.json
│   │   │   │   │       │   │   │   │       ├── Example.node.ts
│   │   │   │   │       │   │   │   │       └── resources/
│   │   │   │   │       │   │   │   │           ├── company/
│   │   │   │   │       │   │   │   │           │   ├── getAll.ts
│   │   │   │   │       │   │   │   │           │   └── index.ts
│   │   │   │   │       │   │   │   │           └── user/
│   │   │   │   │       │   │   │   │               ├── create.ts
│   │   │   │   │       │   │   │   │               ├── get.ts
│   │   │   │   │       │   │   │   │               └── index.ts
│   │   │   │   │       │   │   │   ├── package.json
│   │   │   │   │       │   │   │   └── tsconfig.json
│   │   │   │   │       │   │   ├── template.ts
│   │   │   │   │       │   │   └── types.ts
│   │   │   │   │       │   └── github-issues/
│   │   │   │   │       │       ├── template/
│   │   │   │   │       │       │   ├── README.md
│   │   │   │   │       │       │   ├── credentials/
│   │   │   │   │       │       │   │   ├── GithubIssuesApi.credentials.ts
│   │   │   │   │       │       │   │   └── GithubIssuesOAuth2Api.credentials.ts
│   │   │   │   │       │       │   ├── nodes/
│   │   │   │   │       │       │   │   └── GithubIssues/
│   │   │   │   │       │       │   │       ├── GithubIssues.node.json
│   │   │   │   │       │       │   │       ├── GithubIssues.node.ts
│   │   │   │   │       │       │   │       ├── listSearch/
│   │   │   │   │       │       │   │       │   ├── getIssues.ts
│   │   │   │   │       │       │   │       │   ├── getRepositories.ts
│   │   │   │   │       │       │   │       │   └── getUsers.ts
│   │   │   │   │       │       │   │       ├── resources/
│   │   │   │   │       │       │   │       │   ├── issue/
│   │   │   │   │       │       │   │       │   │   ├── create.ts
│   │   │   │   │       │       │   │       │   │   ├── get.ts
│   │   │   │   │       │       │   │       │   │   ├── getAll.ts
│   │   │   │   │       │       │   │       │   │   └── index.ts
│   │   │   │   │       │       │   │       │   └── issueComment/
│   │   │   │   │       │       │   │       │       ├── getAll.ts
│   │   │   │   │       │       │   │       │       └── index.ts
│   │   │   │   │       │       │   │       └── shared/
│   │   │   │   │       │       │   │           ├── descriptions.ts
│   │   │   │   │       │       │   │           ├── transport.ts
│   │   │   │   │       │       │   │           └── utils.ts
│   │   │   │   │       │       │   ├── package.json
│   │   │   │   │       │       │   └── tsconfig.json
│   │   │   │   │       │       └── template.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── programmatic/
│   │   │   │   │       │   ├── ai/
│   │   │   │   │       │   │   ├── memory-custom/
│   │   │   │   │       │   │   │   ├── template/
│   │   │   │   │       │   │   │   │   ├── README.md
│   │   │   │   │       │   │   │   │   ├── nodes/
│   │   │   │   │       │   │   │   │   │   └── ExampleChatMemory/
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatMemory.node.json
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatMemory.node.ts
│   │   │   │   │       │   │   │   │   │       └── memory.ts
│   │   │   │   │       │   │   │   │   ├── package.json
│   │   │   │   │       │   │   │   │   └── tsconfig.json
│   │   │   │   │       │   │   │   └── template.ts
│   │   │   │   │       │   │   ├── model-ai-custom/
│   │   │   │   │       │   │   │   ├── template/
│   │   │   │   │       │   │   │   │   ├── README.md
│   │   │   │   │       │   │   │   │   ├── credentials/
│   │   │   │   │       │   │   │   │   │   └── ExampleApi.credentials.ts
│   │   │   │   │       │   │   │   │   ├── nodes/
│   │   │   │   │       │   │   │   │   │   └── ExampleChatModel/
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatModel.node.json
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatModel.node.ts
│   │   │   │   │       │   │   │   │   │       └── model.ts
│   │   │   │   │       │   │   │   │   ├── package.json
│   │   │   │   │       │   │   │   │   └── tsconfig.json
│   │   │   │   │       │   │   │   └── template.ts
│   │   │   │   │       │   │   ├── model-ai-custom-example/
│   │   │   │   │       │   │   │   ├── template/
│   │   │   │   │       │   │   │   │   ├── README.md
│   │   │   │   │       │   │   │   │   ├── credentials/
│   │   │   │   │       │   │   │   │   │   └── ExampleApi.credentials.ts
│   │   │   │   │       │   │   │   │   ├── nodes/
│   │   │   │   │       │   │   │   │   │   └── ExampleChatModel/
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatModel.node.json
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatModel.node.ts
│   │   │   │   │       │   │   │   │   │       ├── common.ts
│   │   │   │   │       │   │   │   │   │       ├── model.ts
│   │   │   │   │       │   │   │   │   │       └── properties.ts
│   │   │   │   │       │   │   │   │   ├── package.json
│   │   │   │   │       │   │   │   │   └── tsconfig.json
│   │   │   │   │       │   │   │   └── template.ts
│   │   │   │   │       │   │   └── model-openai-compatible/
│   │   │   │   │       │   │       ├── template/
│   │   │   │   │       │   │       │   ├── README.md
│   │   │   │   │       │   │       │   ├── credentials/
│   │   │   │   │       │   │       │   │   └── ExampleApi.credentials.ts
│   │   │   │   │       │   │       │   ├── nodes/
│   │   │   │   │       │   │       │   │   └── ExampleChatModel/
│   │   │   │   │       │   │       │   │       ├── ExampleChatModel.node.json
│   │   │   │   │       │   │       │   │       └── ExampleChatModel.node.ts
│   │   │   │   │       │   │       │   ├── package.json
│   │   │   │   │       │   │       │   └── tsconfig.json
│   │   │   │   │       │   │       └── template.ts
│   │   │   │   │       │   └── example/
│   │   │   │   │       │       ├── template/
│   │   │   │   │       │       │   ├── README.md
│   │   │   │   │       │       │   ├── nodes/
│   │   │   │   │       │       │   │   └── Example/
│   │   │   │   │       │       │   │       ├── Example.node.json
│   │   │   │   │       │       │   │       └── Example.node.ts
│   │   │   │   │       │       │   ├── package.json
│   │   │   │   │       │       │   └── tsconfig.json
│   │   │   │   │       │       └── template.ts
│   │   │   │   │       └── shared/
│   │   │   │   │           ├── credentials/
│   │   │   │   │           │   ├── apiKey.credentials.ts
│   │   │   │   │           │   ├── basicAuth.credentials.ts
│   │   │   │   │           │   ├── bearer.credentials.ts
│   │   │   │   │           │   ├── custom.credentials.ts
│   │   │   │   │           │   ├── oauth2AuthorizationCode.credentials.ts
│   │   │   │   │           │   └── oauth2ClientCredentials.credentials.ts
│   │   │   │   │           └── default/
│   │   │   │   │               ├── .agents/
│   │   │   │   │               │   ├── credentials.md
│   │   │   │   │               │   ├── nodes-declarative.md
│   │   │   │   │               │   ├── nodes-programmatic.md
│   │   │   │   │               │   ├── nodes.md
│   │   │   │   │               │   ├── properties.md
│   │   │   │   │               │   ├── versioning.md
│   │   │   │   │               │   └── workflow.md
│   │   │   │   │               ├── .github/
│   │   │   │   │               │   └── workflows/
│   │   │   │   │               │       ├── ci.yml
│   │   │   │   │               │       └── publish.yml
│   │   │   │   │               ├── .gitignore
│   │   │   │   │               ├── .prettierrc.js
│   │   │   │   │               ├── .vscode/
│   │   │   │   │               │   └── launch.json
│   │   │   │   │               ├── AGENTS.md
│   │   │   │   │               ├── CHANGELOG.md
│   │   │   │   │               ├── CLAUDE.md
│   │   │   │   │               └── eslint.config.mjs
│   │   │   │   ├── test-utils/
│   │   │   │   │   ├── command-tester.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── matchers.ts
│   │   │   │   │   ├── mock-child-process.ts
│   │   │   │   │   ├── mock-prompts.ts
│   │   │   │   │   ├── package-setup.ts
│   │   │   │   │   ├── setup.ts
│   │   │   │   │   └── temp-fs.ts
│   │   │   │   └── utils/
│   │   │   │       ├── ast.test.ts
│   │   │   │       ├── ast.ts
│   │   │   │       ├── child-process.ts
│   │   │   │       ├── command-suggestions.ts
│   │   │   │       ├── filesystem.test.ts
│   │   │   │       ├── filesystem.ts
│   │   │   │       ├── git.test.ts
│   │   │   │       ├── git.ts
│   │   │   │       ├── json.ts
│   │   │   │       ├── package-manager.test.ts
│   │   │   │       ├── package-manager.ts
│   │   │   │       ├── package.ts
│   │   │   │       ├── prompts.test.ts
│   │   │   │       ├── prompts.ts
│   │   │   │       └── validation.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.ts
│   │   ├── nodes-langchain/
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── .vscode/
│   │   │   │   └── extensions.json
│   │   │   ├── README.md
│   │   │   ├── credentials/
│   │   │   │   ├── AnthropicApi.credentials.ts
│   │   │   │   ├── AzureAiSearchApi.credentials.ts
│   │   │   │   ├── AzureEntraCognitiveServicesOAuth2Api.credentials.ts
│   │   │   │   ├── AzureOpenAiApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStorePGVectorApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStorePineconeApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStoreQdrantApi.credentials.ts
│   │   │   │   ├── ChromaCloudApi.credentials.ts
│   │   │   │   ├── ChromaSelfHostedApi.credentials.ts
│   │   │   │   ├── CohereApi.credentials.ts
│   │   │   │   ├── DeepSeekApi.credentials.ts
│   │   │   │   ├── GooglePalmApi.credentials.ts
│   │   │   │   ├── GroqApi.credentials.ts
│   │   │   │   ├── HuggingFaceApi.credentials.ts
│   │   │   │   ├── LemonadeApi.credentials.ts
│   │   │   │   ├── McpOAuth2Api.credentials.ts
│   │   │   │   ├── MicrosoftAgent365Api.credentials.ts
│   │   │   │   ├── MilvusApi.credentials.ts
│   │   │   │   ├── MistralCloudApi.credentials.ts
│   │   │   │   ├── MotorheadApi.credentials.ts
│   │   │   │   ├── OllamaApi.credentials.ts
│   │   │   │   ├── OpenRouterApi.credentials.ts
│   │   │   │   ├── PineconeApi.credentials.ts
│   │   │   │   ├── QdrantApi.credentials.ts
│   │   │   │   ├── SearXngApi.credentials.ts
│   │   │   │   ├── SerpApi.credentials.ts
│   │   │   │   ├── VercelAiGatewayApi.credentials.ts
│   │   │   │   ├── WeaviateApi.credentials.ts
│   │   │   │   ├── WolframAlphaApi.credentials.ts
│   │   │   │   ├── XAiApi.credentials.ts
│   │   │   │   ├── XataApi.credentials.ts
│   │   │   │   ├── ZepApi.credentials.ts
│   │   │   │   └── test/
│   │   │   │       ├── AnthropicApi.credentials.test.ts
│   │   │   │       └── ChromaCloudApi.credentials.test.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── index.js
│   │   │   ├── jest.config.js
│   │   │   ├── nodes/
│   │   │   │   ├── Guardrails/
│   │   │   │   │   ├── CREDIT.MD
│   │   │   │   │   ├── Guardrails.node.ts
│   │   │   │   │   ├── actions/
│   │   │   │   │   │   ├── checks/
│   │   │   │   │   │   │   ├── jailbreak.ts
│   │   │   │   │   │   │   ├── keywords.ts
│   │   │   │   │   │   │   ├── nsfw.ts
│   │   │   │   │   │   │   ├── pii.ts
│   │   │   │   │   │   │   ├── secretKeys.ts
│   │   │   │   │   │   │   ├── topicalAlignment.ts
│   │   │   │   │   │   │   └── urls.ts
│   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   ├── process.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── description.ts
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── model.test.ts
│   │   │   │   │   │   ├── base.ts
│   │   │   │   │   │   ├── common.ts
│   │   │   │   │   │   ├── configureNodeInputs.ts
│   │   │   │   │   │   ├── mappers.ts
│   │   │   │   │   │   ├── model.ts
│   │   │   │   │   │   └── preflight.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── Guardrails.node.test.ts
│   │   │   │   │   │   ├── checks/
│   │   │   │   │   │   │   ├── keywords.test.ts
│   │   │   │   │   │   │   ├── pii.test.ts
│   │   │   │   │   │   │   └── secretKeys.test.ts
│   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   ├── base.test.ts
│   │   │   │   │   │   │   ├── common.test.ts
│   │   │   │   │   │   │   ├── configureNodeInputs.test.ts
│   │   │   │   │   │   │   ├── mappers.test.ts
│   │   │   │   │   │   │   ├── model.test.ts
│   │   │   │   │   │   │   └── preflight.test.ts
│   │   │   │   │   │   └── process.test.ts
│   │   │   │   │   ├── v1/
│   │   │   │   │   │   └── GuardrailsV1.node.ts
│   │   │   │   │   └── v2/
│   │   │   │   │       └── GuardrailsV2.node.ts
│   │   │   │   ├── ModelSelector/
│   │   │   │   │   ├── ModelSelector.node.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   └── test/
│   │   │   │   │       ├── ModelSelector.node.test.ts
│   │   │   │   │       └── helpers.test.ts
│   │   │   │   ├── ToolExecutor/
│   │   │   │   │   ├── ToolExecutor.node.json
│   │   │   │   │   ├── ToolExecutor.node.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── ToolExecutor.node.test.ts
│   │   │   │   │   │   └── convertToSchema.test.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── convertToSchema.ts
│   │   │   │   │       └── executeTool.ts
│   │   │   │   ├── agents/
│   │   │   │   │   ├── Agent/
│   │   │   │   │   │   ├── Agent.node.ts
│   │   │   │   │   │   ├── AgentTool.node.ts
│   │   │   │   │   │   ├── V1/
│   │   │   │   │   │   │   └── AgentV1.node.ts
│   │   │   │   │   │   ├── V2/
│   │   │   │   │   │   │   ├── AgentToolV2.node.ts
│   │   │   │   │   │   │   ├── AgentV2.node.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   ├── V3/
│   │   │   │   │   │   │   ├── AgentToolV3.node.ts
│   │   │   │   │   │   │   └── AgentV3.node.ts
│   │   │   │   │   │   ├── agents/
│   │   │   │   │   │   │   ├── ConversationalAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   ├── OpenAiFunctionsAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   ├── PlanAndExecuteAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   ├── ReActAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   ├── SqlAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.test.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── other/
│   │   │   │   │   │   │   │       ├── handlers/
│   │   │   │   │   │   │   │       │   ├── mysql.ts
│   │   │   │   │   │   │   │       │   ├── postgres.test.ts
│   │   │   │   │   │   │   │       │   ├── postgres.ts
│   │   │   │   │   │   │   │       │   └── sqlite.ts
│   │   │   │   │   │   │   │       └── prompts.ts
│   │   │   │   │   │   │   ├── ToolsAgent/
│   │   │   │   │   │   │   │   ├── V1/
│   │   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   │   └── execute.ts
│   │   │   │   │   │   │   │   ├── V2/
│   │   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   │   └── execute.ts
│   │   │   │   │   │   │   │   ├── V3/
│   │   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   │   │   │   ├── buildExecutionContext.ts
│   │   │   │   │   │   │   │   │   │   ├── checkMaxIterations.ts
│   │   │   │   │   │   │   │   │   │   ├── createAgentSequence.ts
│   │   │   │   │   │   │   │   │   │   ├── executeBatch.ts
│   │   │   │   │   │   │   │   │   │   ├── finalizeResult.ts
│   │   │   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   │   │   ├── prepareItemContext.ts
│   │   │   │   │   │   │   │   │   │   ├── runAgent.ts
│   │   │   │   │   │   │   │   │   │   └── tests/
│   │   │   │   │   │   │   │   │   │       ├── buildExecutionContext.test.ts
│   │   │   │   │   │   │   │   │   │       ├── checkMaxIterations.test.ts
│   │   │   │   │   │   │   │   │   │       ├── createAgentSequence.test.ts
│   │   │   │   │   │   │   │   │   │       ├── finalizeResult.test.ts
│   │   │   │   │   │   │   │   │   │       ├── prepareItemContext.test.ts
│   │   │   │   │   │   │   │   │   │       └── runAgent.test.ts
│   │   │   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   │   │   ├── common.ts
│   │   │   │   │   │   │   │   ├── options.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   ├── ToolsAgent/
│   │   │   │   │   │   │   │   ├── ToolsAgentV1.test.ts
│   │   │   │   │   │   │   │   ├── ToolsAgentV2.test.ts
│   │   │   │   │   │   │   │   ├── ToolsAgentV3.test.ts
│   │   │   │   │   │   │   │   └── commons.test.ts
│   │   │   │   │   │   │   ├── integration/
│   │   │   │   │   │   │   │   ├── agent-tool-v3.workflow.test.ts
│   │   │   │   │   │   │   │   ├── agent-v3.workflow.test.ts
│   │   │   │   │   │   │   │   └── workflows/
│   │   │   │   │   │   │   │       ├── agent-tool-v3-basic.json
│   │   │   │   │   │   │   │       ├── agent-v3-auto-prompt.json
│   │   │   │   │   │   │   │       ├── agent-v3-basic.json
│   │   │   │   │   │   │   │       ├── agent-v3-binary-images.json
│   │   │   │   │   │   │   │       ├── agent-v3-continue-on-fail.json
│   │   │   │   │   │   │   │       ├── agent-v3-fallback-model.json
│   │   │   │   │   │   │   │       ├── agent-v3-intermediate-steps.json
│   │   │   │   │   │   │   │       ├── agent-v3-memory.json
│   │   │   │   │   │   │   │       ├── agent-v3-output-parser.json
│   │   │   │   │   │   │   │       ├── agent-v3-system-message.json
│   │   │   │   │   │   │   │       └── agent-v3-with-tool.json
│   │   │   │   │   │   │   └── utils.test.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   └── OpenAiAssistant/
│   │   │   │   │       ├── OpenAiAssistant.node.ts
│   │   │   │   │       └── utils.ts
│   │   │   │   ├── chains/
│   │   │   │   │   ├── ChainLLM/
│   │   │   │   │   │   ├── ChainLlm.node.ts
│   │   │   │   │   │   ├── methods/
│   │   │   │   │   │   │   ├── chainExecutor.ts
│   │   │   │   │   │   │   ├── config.ts
│   │   │   │   │   │   │   ├── imageUtils.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── processItem.ts
│   │   │   │   │   │   │   ├── promptUtils.ts
│   │   │   │   │   │   │   ├── responseFormatter.ts
│   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       ├── ChainLlm.node.test.ts
│   │   │   │   │   │       ├── chainExecutor.test.ts
│   │   │   │   │   │       ├── config.test.ts
│   │   │   │   │   │       ├── imageUtils.test.ts
│   │   │   │   │   │       ├── promptUtils.test.ts
│   │   │   │   │   │       └── responseFormatter.test.ts
│   │   │   │   │   ├── ChainRetrievalQA/
│   │   │   │   │   │   ├── ChainRetrievalQa.node.ts
│   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   ├── processItem.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── ChainRetrievalQa.node.test.ts
│   │   │   │   │   ├── ChainSummarization/
│   │   │   │   │   │   ├── ChainSummarization.node.ts
│   │   │   │   │   │   ├── V1/
│   │   │   │   │   │   │   └── ChainSummarizationV1.node.ts
│   │   │   │   │   │   ├── V2/
│   │   │   │   │   │   │   ├── ChainSummarizationV2.node.ts
│   │   │   │   │   │   │   └── processItem.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   ├── InformationExtractor/
│   │   │   │   │   │   ├── InformationExtractor.node.ts
│   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── processItem.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   ├── InformationExtraction.node.test.ts
│   │   │   │   │   │   │   └── processItem.test.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── SentimentAnalysis/
│   │   │   │   │   │   ├── SentimentAnalysis.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── SentimentAnalysis.node.test.ts
│   │   │   │   │   └── TextClassifier/
│   │   │   │   │       ├── TextClassifier.node.ts
│   │   │   │   │       ├── constants.ts
│   │   │   │   │       ├── processItem.ts
│   │   │   │   │       └── test/
│   │   │   │   │           ├── TextClassifier.node.test.ts
│   │   │   │   │           └── processItem.test.ts
│   │   │   │   ├── code/
│   │   │   │   │   ├── Code.node.test.ts
│   │   │   │   │   └── Code.node.ts
│   │   │   │   ├── document_loaders/
│   │   │   │   │   ├── DocumentBinaryInputLoader/
│   │   │   │   │   │   └── DocumentBinaryInputLoader.node.ts
│   │   │   │   │   ├── DocumentDefaultDataLoader/
│   │   │   │   │   │   ├── DocumentDefaultDataLoader.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── DocumentDefaultDataLoader.node.test.ts
│   │   │   │   │   ├── DocumentGithubLoader/
│   │   │   │   │   │   ├── DocumentGithubLoader.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── DocumentGithubLoader.node.test.ts
│   │   │   │   │   └── DocumentJSONInputLoader/
│   │   │   │   │       └── DocumentJsonInputLoader.node.ts
│   │   │   │   ├── embeddings/
│   │   │   │   │   ├── EmbeddingsAwsBedrock/
│   │   │   │   │   │   └── EmbeddingsAwsBedrock.node.ts
│   │   │   │   │   ├── EmbeddingsAzureOpenAi/
│   │   │   │   │   │   └── EmbeddingsAzureOpenAi.node.ts
│   │   │   │   │   ├── EmbeddingsCohere/
│   │   │   │   │   │   └── EmbeddingsCohere.node.ts
│   │   │   │   │   ├── EmbeddingsGoogleGemini/
│   │   │   │   │   │   └── EmbeddingsGoogleGemini.node.ts
│   │   │   │   │   ├── EmbeddingsGoogleVertex/
│   │   │   │   │   │   └── EmbeddingsGoogleVertex.node.ts
│   │   │   │   │   ├── EmbeddingsHuggingFaceInference/
│   │   │   │   │   │   └── EmbeddingsHuggingFaceInference.node.ts
│   │   │   │   │   ├── EmbeddingsLemonade/
│   │   │   │   │   │   └── EmbeddingsLemonade.node.ts
│   │   │   │   │   ├── EmbeddingsMistralCloud/
│   │   │   │   │   │   └── EmbeddingsMistralCloud.node.ts
│   │   │   │   │   ├── EmbeddingsOllama/
│   │   │   │   │   │   └── EmbeddingsOllama.node.ts
│   │   │   │   │   ├── EmbeddingsOpenAI/
│   │   │   │   │   │   └── EmbeddingsOpenAi.node.ts
│   │   │   │   │   └── test/
│   │   │   │   │       ├── EmbeddingsAzureOpenAi.test.ts
│   │   │   │   │       └── EmbeddingsOpenAi.test.ts
│   │   │   │   ├── llms/
│   │   │   │   │   ├── LMChatAnthropic/
│   │   │   │   │   │   ├── LmChatAnthropic.node.ts
│   │   │   │   │   │   ├── methods/
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   └── searchModels.test.ts
│   │   │   │   │   │   │   └── searchModels.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatAnthropic.test.ts
│   │   │   │   │   ├── LMChatLemonade/
│   │   │   │   │   │   └── LmChatLemonade.node.ts
│   │   │   │   │   ├── LMChatOllama/
│   │   │   │   │   │   └── LmChatOllama.node.ts
│   │   │   │   │   ├── LMChatOpenAi/
│   │   │   │   │   │   ├── LmChatOpenAi.node.ts
│   │   │   │   │   │   ├── common.ts
│   │   │   │   │   │   ├── methods/
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   └── loadModels.test.ts
│   │   │   │   │   │   │   └── loadModels.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   └── common.test.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── LMCohere/
│   │   │   │   │   │   └── LmCohere.node.ts
│   │   │   │   │   ├── LMLemonade/
│   │   │   │   │   │   ├── LmLemonade.node.ts
│   │   │   │   │   │   └── description.ts
│   │   │   │   │   ├── LMOllama/
│   │   │   │   │   │   ├── LmOllama.node.ts
│   │   │   │   │   │   └── description.ts
│   │   │   │   │   ├── LMOpenAi/
│   │   │   │   │   │   └── LmOpenAi.node.ts
│   │   │   │   │   ├── LMOpenHuggingFaceInference/
│   │   │   │   │   │   └── LmOpenHuggingFaceInference.node.ts
│   │   │   │   │   ├── LmChatAwsBedrock/
│   │   │   │   │   │   ├── LmChatAwsBedrock.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatAwsBedrock.test.ts
│   │   │   │   │   ├── LmChatAzureOpenAi/
│   │   │   │   │   │   ├── LmChatAzureOpenAi.node.ts
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── N8nOAuth2TokenCredential.test.ts
│   │   │   │   │   │   │   ├── api-key.handler.test.ts
│   │   │   │   │   │   │   └── oauth2.handler.test.ts
│   │   │   │   │   │   ├── credentials/
│   │   │   │   │   │   │   ├── N8nOAuth2TokenCredential.ts
│   │   │   │   │   │   │   ├── api-key.ts
│   │   │   │   │   │   │   └── oauth2.ts
│   │   │   │   │   │   ├── properties.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── LmChatCohere/
│   │   │   │   │   │   └── LmChatCohere.node.ts
│   │   │   │   │   ├── LmChatDeepSeek/
│   │   │   │   │   │   └── LmChatDeepSeek.node.ts
│   │   │   │   │   ├── LmChatGoogleGemini/
│   │   │   │   │   │   └── LmChatGoogleGemini.node.ts
│   │   │   │   │   ├── LmChatGoogleVertex/
│   │   │   │   │   │   ├── LmChatGoogleVertex.node.ts
│   │   │   │   │   │   ├── error-handling.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatGoogleVertex.test.ts
│   │   │   │   │   ├── LmChatGroq/
│   │   │   │   │   │   └── LmChatGroq.node.ts
│   │   │   │   │   ├── LmChatMistralCloud/
│   │   │   │   │   │   └── LmChatMistralCloud.node.ts
│   │   │   │   │   ├── LmChatOpenRouter/
│   │   │   │   │   │   ├── LmChatOpenRouter.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatOpenRouter.test.ts
│   │   │   │   │   ├── LmChatVercelAiGateway/
│   │   │   │   │   │   └── LmChatVercelAiGateway.node.ts
│   │   │   │   │   ├── LmChatXAiGrok/
│   │   │   │   │   │   └── LmChatXAiGrok.node.ts
│   │   │   │   │   ├── N8nNonEstimatingTracing.ts
│   │   │   │   │   ├── gemini-common/
│   │   │   │   │   │   ├── additional-options.ts
│   │   │   │   │   │   └── safety-options.ts
│   │   │   │   │   └── test/
│   │   │   │   │       ├── LmChatAnthropic.test.ts
│   │   │   │   │       ├── LmChatOpenAi.test.ts
│   │   │   │   │       └── N8nLlmTracing.test.ts
│   │   │   │   ├── mcp/
│   │   │   │   │   ├── McpClient/
│   │   │   │   │   │   ├── McpClient.node.ts
│   │   │   │   │   │   ├── __test__/
│   │   │   │   │   │   │   ├── McpClient.node.test.ts
│   │   │   │   │   │   │   └── utils.test.ts
│   │   │   │   │   │   ├── listSearch.ts
│   │   │   │   │   │   ├── resourceMapping.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── McpClientTool/
│   │   │   │   │   │   ├── McpClientTool.node.ts
│   │   │   │   │   │   ├── __test__/
│   │   │   │   │   │   │   └── McpClientTool.node.test.ts
│   │   │   │   │   │   ├── loadOptions.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── McpTrigger/
│   │   │   │   │   │   ├── McpServer.ts
│   │   │   │   │   │   ├── McpTrigger.node.ts
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── McpServer.test.ts
│   │   │   │   │   │   │   ├── McpTrigger.node.test.ts
│   │   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   ├── mock-express.ts
│   │   │   │   │   │   │   │   ├── mock-langchain.ts
│   │   │   │   │   │   │   │   ├── mock-logger.ts
│   │   │   │   │   │   │   │   └── mock-mcp-sdk.ts
│   │   │   │   │   │   │   └── setup.ts
│   │   │   │   │   │   ├── execution/
│   │   │   │   │   │   │   ├── DirectExecutionStrategy.ts
│   │   │   │   │   │   │   ├── ExecutionCoordinator.ts
│   │   │   │   │   │   │   ├── ExecutionStrategy.ts
│   │   │   │   │   │   │   ├── PendingCallsManager.ts
│   │   │   │   │   │   │   ├── QueuedExecutionStrategy.ts
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   ├── DirectExecutionStrategy.test.ts
│   │   │   │   │   │   │   │   ├── ExecutionCoordinator.test.ts
│   │   │   │   │   │   │   │   ├── PendingCallsManager.test.ts
│   │   │   │   │   │   │   │   └── QueuedExecutionStrategy.test.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── protocol/
│   │   │   │   │   │   │   ├── MessageFormatter.ts
│   │   │   │   │   │   │   ├── MessageParser.ts
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   ├── MessageFormatter.test.ts
│   │   │   │   │   │   │   │   └── MessageParser.test.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   ├── session/
│   │   │   │   │   │   │   ├── InMemorySessionStore.ts
│   │   │   │   │   │   │   ├── RedisSessionStore.ts
│   │   │   │   │   │   │   ├── SessionManager.ts
│   │   │   │   │   │   │   ├── SessionStore.ts
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   ├── InMemorySessionStore.test.ts
│   │   │   │   │   │   │   │   ├── RedisSessionStore.test.ts
│   │   │   │   │   │   │   │   └── SessionManager.test.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── transport/
│   │   │   │   │   │       ├── SSETransport.ts
│   │   │   │   │   │       ├── StreamableHttpTransport.ts
│   │   │   │   │   │       ├── Transport.ts
│   │   │   │   │   │       ├── TransportFactory.ts
│   │   │   │   │   │       ├── __tests__/
│   │   │   │   │   │       │   ├── SSETransport.test.ts
│   │   │   │   │   │       │   ├── StreamableHttpTransport.test.ts
│   │   │   │   │   │       │   └── TransportFactory.test.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   └── shared/
│   │   │   │   │       ├── __test__/
│   │   │   │   │       │   └── utils.test.ts
│   │   │   │   │       ├── descriptions.ts
│   │   │   │   │       ├── types.ts
│   │   │   │   │       └── utils.ts
│   │   │   │   ├── memory/
│   │   │   │   │   ├── MemoryBufferWindow/
│   │   │   │   │   │   └── MemoryBufferWindow.node.ts
│   │   │   │   │   ├── MemoryChatRetriever/
│   │   │   │   │   │   └── MemoryChatRetriever.node.ts
│   │   │   │   │   ├── MemoryManager/
│   │   │   │   │   │   ├── MemoryManager.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       ├── MemoryManager.execute.test.ts
│   │   │   │   │   │       └── MemoryManager.node.test.ts
│   │   │   │   │   ├── MemoryMongoDbChat/
│   │   │   │   │   │   └── MemoryMongoDbChat.node.ts
│   │   │   │   │   ├── MemoryMotorhead/
│   │   │   │   │   │   └── MemoryMotorhead.node.ts
│   │   │   │   │   ├── MemoryPostgresChat/
│   │   │   │   │   │   └── MemoryPostgresChat.node.ts
│   │   │   │   │   ├── MemoryRedisChat/
│   │   │   │   │   │   └── MemoryRedisChat.node.ts
│   │   │   │   │   ├── MemoryXata/
│   │   │   │   │   │   └── MemoryXata.node.ts
│   │   │   │   │   ├── MemoryZep/
│   │   │   │   │   │   └── MemoryZep.node.ts
│   │   │   │   │   └── descriptions.ts
│   │   │   │   ├── output_parser/
│   │   │   │   │   ├── OutputParserAutofixing/
│   │   │   │   │   │   ├── OutputParserAutofixing.node.ts
│   │   │   │   │   │   ├── prompt.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── OutputParserAutofixing.node.test.ts
│   │   │   │   │   ├── OutputParserItemList/
│   │   │   │   │   │   ├── OutputParserItemList.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── OutputParserItemList.node.test.ts
│   │   │   │   │   └── OutputParserStructured/
│   │   │   │   │       ├── OutputParserStructured.node.ts
│   │   │   │   │       ├── prompt.ts
│   │   │   │   │       └── test/
│   │   │   │   │           └── OutputParserStructured.node.test.ts
│   │   │   │   ├── rerankers/
│   │   │   │   │   └── RerankerCohere/
│   │   │   │   │       ├── RerankerCohere.node.ts
│   │   │   │   │       └── test/
│   │   │   │   │           └── RerankerCohere.node.test.ts
│   │   │   │   ├── retrievers/
│   │   │   │   │   ├── RetrieverContextualCompression/
│   │   │   │   │   │   └── RetrieverContextualCompression.node.ts
│   │   │   │   │   ├── RetrieverMultiQuery/
│   │   │   │   │   │   └── RetrieverMultiQuery.node.ts
│   │   │   │   │   ├── RetrieverVectorStore/
│   │   │   │   │   │   ├── RetrieverVectorStore.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── RetrieverVectorStore.node.test.ts
│   │   │   │   │   └── RetrieverWorkflow/
│   │   │   │   │       └── RetrieverWorkflow.node.ts
│   │   │   │   ├── text_splitters/
│   │   │   │   │   ├── TextSplitterCharacterTextSplitter/
│   │   │   │   │   │   └── TextSplitterCharacterTextSplitter.node.ts
│   │   │   │   │   ├── TextSplitterRecursiveCharacterTextSplitter/
│   │   │   │   │   │   └── TextSplitterRecursiveCharacterTextSplitter.node.ts
│   │   │   │   │   └── TextSplitterTokenSplitter/
│   │   │   │   │       ├── TextSplitterTokenSplitter.node.ts
│   │   │   │   │       ├── TokenTextSplitter.ts
│   │   │   │   │       └── tests/
│   │   │   │   │           └── TokenTextSplitter.test.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── ToolCalculator/
│   │   │   │   │   │   ├── ToolCalculator.node.test.ts
│   │   │   │   │   │   └── ToolCalculator.node.ts
│   │   │   │   │   ├── ToolCode/
│   │   │   │   │   │   ├── ToolCode.node.test.ts
│   │   │   │   │   │   └── ToolCode.node.ts
│   │   │   │   │   ├── ToolHttpRequest/
│   │   │   │   │   │   ├── ToolHttpRequest.node.ts
│   │   │   │   │   │   ├── descriptions.ts
│   │   │   │   │   │   ├── interfaces.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   └── ToolHttpRequest.node.test.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── ToolSearXng/
│   │   │   │   │   │   ├── ToolSearXng.node.test.ts
│   │   │   │   │   │   └── ToolSearXng.node.ts
│   │   │   │   │   ├── ToolSerpApi/
│   │   │   │   │   │   ├── ToolSerpApi.node.test.ts
│   │   │   │   │   │   └── ToolSerpApi.node.ts
│   │   │   │   │   ├── ToolThink/
│   │   │   │   │   │   ├── ToolThink.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── ToolThink.node.test.ts
│   │   │   │   │   ├── ToolVectorStore/
│   │   │   │   │   │   ├── ToolVectorStore.node.test.ts
│   │   │   │   │   │   └── ToolVectorStore.node.ts
│   │   │   │   │   ├── ToolWikipedia/
│   │   │   │   │   │   ├── ToolWikipedia.node.test.ts
│   │   │   │   │   │   └── ToolWikipedia.node.ts
│   │   │   │   │   ├── ToolWolframAlpha/
│   │   │   │   │   │   ├── ToolWolframAlpha.node.test.ts
│   │   │   │   │   │   └── ToolWolframAlpha.node.ts
│   │   │   │   │   └── ToolWorkflow/
│   │   │   │   │       ├── ToolWorkflow.node.test.ts
│   │   │   │   │       ├── ToolWorkflow.node.ts
│   │   │   │   │       ├── v1/
│   │   │   │   │       │   ├── ToolWorkflowV1.node.ts
│   │   │   │   │       │   └── versionDescription.ts
│   │   │   │   │       └── v2/
│   │   │   │   │           ├── ToolWorkflowV2.node.ts
│   │   │   │   │           ├── ToolWorkflowV2.test.ts
│   │   │   │   │           ├── methods/
│   │   │   │   │           │   ├── index.ts
│   │   │   │   │           │   └── localResourceMapping.ts
│   │   │   │   │           ├── utils/
│   │   │   │   │           │   └── WorkflowToolService.ts
│   │   │   │   │           └── versionDescription.ts
│   │   │   │   ├── trigger/
│   │   │   │   │   ├── ChatTrigger/
│   │   │   │   │   │   ├── Chat.node.ts
│   │   │   │   │   │   ├── ChatTrigger.node.ts
│   │   │   │   │   │   ├── GenericFunctions.ts
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __test__/
│   │   │   │   │   │   │   ├── Chat.node.test.ts
│   │   │   │   │   │   │   ├── ChatTrigger.node.test.ts
│   │   │   │   │   │   │   ├── GenericFunctions.test.ts
│   │   │   │   │   │   │   ├── templates.test.ts
│   │   │   │   │   │   │   └── util.test.ts
│   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   ├── error.ts
│   │   │   │   │   │   ├── templates.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── util.ts
│   │   │   │   │   └── ManualChatTrigger/
│   │   │   │   │       └── ManualChatTrigger.node.ts
│   │   │   │   ├── vector_store/
│   │   │   │   │   ├── ChatHubVectorStorePGVector/
│   │   │   │   │   │   └── ChatHubVectorStorePGVector.node.ts
│   │   │   │   │   ├── ChatHubVectorStorePinecone/
│   │   │   │   │   │   └── ChatHubVectorStorePinecone.node.ts
│   │   │   │   │   ├── ChatHubVectorStoreQdrant/
│   │   │   │   │   │   ├── ChatHubVectorStoreQdrant.node.test.ts
│   │   │   │   │   │   └── ChatHubVectorStoreQdrant.node.ts
│   │   │   │   │   ├── VectorStoreAzureAISearch/
│   │   │   │   │   │   ├── VectorStoreAzureAISearch.node.test.ts
│   │   │   │   │   │   └── VectorStoreAzureAISearch.node.ts
│   │   │   │   │   ├── VectorStoreChromaDB/
│   │   │   │   │   │   ├── VectorStoreChromaDB.node.test.ts
│   │   │   │   │   │   └── VectorStoreChromaDB.node.ts
│   │   │   │   │   ├── VectorStoreInMemory/
│   │   │   │   │   │   └── VectorStoreInMemory.node.ts
│   │   │   │   │   ├── VectorStoreInMemoryInsert/
│   │   │   │   │   │   └── VectorStoreInMemoryInsert.node.ts
│   │   │   │   │   ├── VectorStoreInMemoryLoad/
│   │   │   │   │   │   └── VectorStoreInMemoryLoad.node.ts
│   │   │   │   │   ├── VectorStoreMilvus/
│   │   │   │   │   │   └── VectorStoreMilvus.node.ts
│   │   │   │   │   ├── VectorStoreMongoDBAtlas/
│   │   │   │   │   │   ├── VectorStoreMongoDBAtlas.node.test.ts
│   │   │   │   │   │   └── VectorStoreMongoDBAtlas.node.ts
│   │   │   │   │   ├── VectorStorePGVector/
│   │   │   │   │   │   └── VectorStorePGVector.node.ts
│   │   │   │   │   ├── VectorStorePinecone/
│   │   │   │   │   │   └── VectorStorePinecone.node.ts
│   │   │   │   │   ├── VectorStorePineconeInsert/
│   │   │   │   │   │   └── VectorStorePineconeInsert.node.ts
│   │   │   │   │   ├── VectorStorePineconeLoad/
│   │   │   │   │   │   └── VectorStorePineconeLoad.node.ts
│   │   │   │   │   ├── VectorStoreQdrant/
│   │   │   │   │   │   ├── Qdrant.utils.ts
│   │   │   │   │   │   ├── VectorStoreQdrant.node.test.ts
│   │   │   │   │   │   └── VectorStoreQdrant.node.ts
│   │   │   │   │   ├── VectorStoreRedis/
│   │   │   │   │   │   ├── VectorStoreRedis.node.test.ts
│   │   │   │   │   │   └── VectorStoreRedis.node.ts
│   │   │   │   │   ├── VectorStoreSupabase/
│   │   │   │   │   │   └── VectorStoreSupabase.node.ts
│   │   │   │   │   ├── VectorStoreSupabaseInsert/
│   │   │   │   │   │   └── VectorStoreSupabaseInsert.node.ts
│   │   │   │   │   ├── VectorStoreSupabaseLoad/
│   │   │   │   │   │   └── VectorStoreSupabaseLoad.node.ts
│   │   │   │   │   ├── VectorStoreWeaviate/
│   │   │   │   │   │   ├── VectorStoreWeaviate.node.ts
│   │   │   │   │   │   └── Weaviate.utils.ts
│   │   │   │   │   ├── VectorStoreZep/
│   │   │   │   │   │   ├── VectorStoreZep.node.test.ts
│   │   │   │   │   │   └── VectorStoreZep.node.ts
│   │   │   │   │   ├── VectorStoreZepInsert/
│   │   │   │   │   │   └── VectorStoreZepInsert.node.ts
│   │   │   │   │   ├── VectorStoreZepLoad/
│   │   │   │   │   │   └── VectorStoreZepLoad.node.ts
│   │   │   │   │   └── shared/
│   │   │   │   │       ├── chatHub.ts
│   │   │   │   │       ├── descriptions.ts
│   │   │   │   │       ├── methods/
│   │   │   │   │       │   └── listSearch.ts
│   │   │   │   │       ├── userScoped.test.ts
│   │   │   │   │       └── userScoped.ts
│   │   │   │   └── vendors/
│   │   │   │       ├── Anthropic/
│   │   │   │       │   ├── Anthropic.node.test.ts
│   │   │   │       │   ├── Anthropic.node.ts
│   │   │   │       │   ├── actions/
│   │   │   │       │   │   ├── descriptions.ts
│   │   │   │       │   │   ├── document/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── file/
│   │   │   │       │   │   │   ├── delete.operation.ts
│   │   │   │       │   │   │   ├── get.operation.ts
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   ├── list.operation.ts
│   │   │   │       │   │   │   └── upload.operation.ts
│   │   │   │       │   │   ├── image/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── node.type.ts
│   │   │   │       │   │   ├── prompt/
│   │   │   │       │   │   │   ├── generate.operation.ts
│   │   │   │       │   │   │   ├── improve.operation.ts
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── templatize.operation.ts
│   │   │   │       │   │   ├── router.test.ts
│   │   │   │       │   │   ├── router.ts
│   │   │   │       │   │   ├── text/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── message.operation.ts
│   │   │   │       │   │   └── versionDescription.ts
│   │   │   │       │   ├── helpers/
│   │   │   │       │   │   ├── baseAnalyze.ts
│   │   │   │       │   │   ├── interfaces.ts
│   │   │   │       │   │   ├── utils.test.ts
│   │   │   │       │   │   └── utils.ts
│   │   │   │       │   ├── methods/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   ├── listSearch.test.ts
│   │   │   │       │   │   └── listSearch.ts
│   │   │   │       │   └── transport/
│   │   │   │       │       ├── index.test.ts
│   │   │   │       │       └── index.ts
│   │   │   │       ├── GoogleGemini/
│   │   │   │       │   ├── GoogleGemini.node.test.ts
│   │   │   │       │   ├── GoogleGemini.node.ts
│   │   │   │       │   ├── actions/
│   │   │   │       │   │   ├── audio/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── transcribe.operation.ts
│   │   │   │       │   │   ├── descriptions.ts
│   │   │   │       │   │   ├── document/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── file/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── upload.operation.ts
│   │   │   │       │   │   ├── fileSearch/
│   │   │   │       │   │   │   ├── createStore.operation.ts
│   │   │   │       │   │   │   ├── deleteStore.operation.ts
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   ├── listStores.operation.ts
│   │   │   │       │   │   │   └── uploadToStore.operation.ts
│   │   │   │       │   │   ├── image/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   ├── edit.operation.test.ts
│   │   │   │       │   │   │   ├── edit.operation.ts
│   │   │   │       │   │   │   ├── generate.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── node.type.ts
│   │   │   │       │   │   ├── router.test.ts
│   │   │   │       │   │   ├── router.ts
│   │   │   │       │   │   ├── text/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── message.operation.ts
│   │   │   │       │   │   ├── versionDescription.ts
│   │   │   │       │   │   └── video/
│   │   │   │       │   │       ├── analyze.operation.ts
│   │   │   │       │   │       ├── download.operation.ts
│   │   │   │       │   │       ├── generate.operation.ts
│   │   │   │       │   │       └── index.ts
│   │   │   │       │   ├── helpers/
│   │   │   │       │   │   ├── baseAnalyze.ts
│   │   │   │       │   │   ├── interfaces.ts
│   │   │   │       │   │   ├── utils.test.ts
│   │   │   │       │   │   └── utils.ts
│   │   │   │       │   ├── methods/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   ├── listSearch.test.ts
│   │   │   │       │   │   └── listSearch.ts
│   │   │   │       │   └── transport/
│   │   │   │       │       ├── index.test.ts
│   │   │   │       │       └── index.ts
│   │   │   │       ├── Microsoft/
│   │   │   │       │   ├── MicrosoftAgent365Trigger.node.test.ts
│   │   │   │       │   ├── MicrosoftAgent365Trigger.node.ts
│   │   │   │       │   ├── __tests__/
│   │   │   │       │   │   ├── langchain-utils.test.ts
│   │   │   │       │   │   └── microsoft-utils.test.ts
│   │   │   │       │   ├── langchain-utils.ts
│   │   │   │       │   └── microsoft-utils.ts
│   │   │   │       ├── Ollama/
│   │   │   │       │   ├── Ollama.node.test.ts
│   │   │   │       │   ├── Ollama.node.ts
│   │   │   │       │   ├── actions/
│   │   │   │       │   │   ├── descriptions.ts
│   │   │   │       │   │   ├── image/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── node.type.ts
│   │   │   │       │   │   ├── router.test.ts
│   │   │   │       │   │   ├── router.ts
│   │   │   │       │   │   ├── text/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── message.operation.ts
│   │   │   │       │   │   └── versionDescription.ts
│   │   │   │       │   ├── helpers/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   └── interfaces.ts
│   │   │   │       │   ├── methods/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   ├── listSearch.test.ts
│   │   │   │       │   │   └── listSearch.ts
│   │   │   │       │   └── transport/
│   │   │   │       │       ├── index.test.ts
│   │   │   │       │       └── index.ts
│   │   │   │       └── OpenAi/
│   │   │   │           ├── OpenAi.node.ts
│   │   │   │           ├── helpers/
│   │   │   │           │   ├── __tests__/
│   │   │   │           │   │   └── modelFiltering.test.ts
│   │   │   │           │   ├── binary-data.ts
│   │   │   │           │   ├── constants.ts
│   │   │   │           │   ├── description.ts
│   │   │   │           │   ├── error-handling.test.ts
│   │   │   │           │   ├── error-handling.ts
│   │   │   │           │   ├── interfaces.ts
│   │   │   │           │   ├── modelFiltering.ts
│   │   │   │           │   ├── polling.ts
│   │   │   │           │   └── utils.ts
│   │   │   │           ├── methods/
│   │   │   │           │   ├── __tests__/
│   │   │   │           │   │   └── listSearch.test.ts
│   │   │   │           │   ├── index.ts
│   │   │   │           │   ├── listSearch.ts
│   │   │   │           │   └── loadOptions.ts
│   │   │   │           ├── test/
│   │   │   │           │   ├── utils.test.ts
│   │   │   │           │   ├── v1/
│   │   │   │           │   │   ├── OpenAI.workflow.test.ts
│   │   │   │           │   │   ├── OpenAi.node.test.ts
│   │   │   │           │   │   └── list-assistants.workflow.json
│   │   │   │           │   └── v2/
│   │   │   │           │       ├── actions/
│   │   │   │           │       │   ├── image/
│   │   │   │           │       │   │   ├── analyze.test.ts
│   │   │   │           │       │   │   └── edit.operation.test.ts
│   │   │   │           │       │   ├── text/
│   │   │   │           │       │   │   ├── classify.operation.test.ts
│   │   │   │           │       │   │   ├── response.operation.test.ts
│   │   │   │           │       │   │   └── responses.test.ts
│   │   │   │           │       │   └── video/
│   │   │   │           │       │       └── generate.operation.test.ts
│   │   │   │           │       └── conversation.test.ts
│   │   │   │           ├── transport/
│   │   │   │           │   ├── index.ts
│   │   │   │           │   └── test/
│   │   │   │           │       └── transport.test.ts
│   │   │   │           ├── v1/
│   │   │   │           │   ├── OpenAiV1.node.ts
│   │   │   │           │   └── actions/
│   │   │   │           │       ├── assistant/
│   │   │   │           │       │   ├── create.operation.ts
│   │   │   │           │       │   ├── deleteAssistant.operation.ts
│   │   │   │           │       │   ├── index.ts
│   │   │   │           │       │   ├── list.operation.ts
│   │   │   │           │       │   ├── message.operation.ts
│   │   │   │           │       │   └── update.operation.ts
│   │   │   │           │       ├── audio/
│   │   │   │           │       │   ├── generate.operation.ts
│   │   │   │           │       │   ├── index.ts
│   │   │   │           │       │   ├── transcribe.operation.ts
│   │   │   │           │       │   └── translate.operation.ts
│   │   │   │           │       ├── descriptions.ts
│   │   │   │           │       ├── file/
│   │   │   │           │       │   ├── deleteFile.operation.ts
│   │   │   │           │       │   ├── index.ts
│   │   │   │           │       │   ├── list.operation.ts
│   │   │   │           │       │   └── upload.operation.ts
│   │   │   │           │       ├── image/
│   │   │   │           │       │   ├── analyze.operation.ts
│   │   │   │           │       │   ├── generate.operation.ts
│   │   │   │           │       │   └── index.ts
│   │   │   │           │       ├── node.type.ts
│   │   │   │           │       ├── router.test.ts
│   │   │   │           │       ├── router.ts
│   │   │   │           │       └── text/
│   │   │   │           │           ├── classify.operation.ts
│   │   │   │           │           ├── index.ts
│   │   │   │           │           └── message.operation.ts
│   │   │   │           └── v2/
│   │   │   │               ├── OpenAiV2.node.ts
│   │   │   │               └── actions/
│   │   │   │                   ├── audio/
│   │   │   │                   │   ├── generate.operation.ts
│   │   │   │                   │   ├── index.ts
│   │   │   │                   │   ├── transcribe.operation.ts
│   │   │   │                   │   └── translate.operation.ts
│   │   │   │                   ├── conversation/
│   │   │   │                   │   ├── create.operation.ts
│   │   │   │                   │   ├── get.operation.ts
│   │   │   │                   │   ├── index.ts
│   │   │   │                   │   ├── remove.operation.ts
│   │   │   │                   │   └── update.operation.ts
│   │   │   │                   ├── descriptions.ts
│   │   │   │                   ├── file/
│   │   │   │                   │   ├── deleteFile.operation.ts
│   │   │   │                   │   ├── index.ts
│   │   │   │                   │   ├── list.operation.ts
│   │   │   │                   │   └── upload.operation.ts
│   │   │   │                   ├── image/
│   │   │   │                   │   ├── analyze.operation.ts
│   │   │   │                   │   ├── edit.operation.ts
│   │   │   │                   │   ├── generate.operation.ts
│   │   │   │                   │   └── index.ts
│   │   │   │                   ├── node.type.ts
│   │   │   │                   ├── router.test.ts
│   │   │   │                   ├── router.ts
│   │   │   │                   ├── text/
│   │   │   │                   │   ├── classify.operation.ts
│   │   │   │                   │   ├── helpers/
│   │   │   │                   │   │   └── responses.ts
│   │   │   │                   │   ├── index.ts
│   │   │   │                   │   └── response.operation.ts
│   │   │   │                   └── video/
│   │   │   │                       ├── generate.operation.ts
│   │   │   │                       └── index.ts
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   └── post-build.js
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   ├── types/
│   │   │   │   ├── generate-schema.d.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── zod.types.ts
│   │   │   └── utils/
│   │   │       ├── N8nTool.test.ts
│   │   │       ├── N8nTool.ts
│   │   │       ├── agent-execution/
│   │   │       │   ├── buildResponseMetadata.ts
│   │   │       │   ├── buildSteps.ts
│   │   │       │   ├── createEngineRequests.ts
│   │   │       │   ├── index.ts
│   │   │       │   ├── memoryManagement.ts
│   │   │       │   ├── processEventStream.ts
│   │   │       │   ├── processHitlResponses.ts
│   │   │       │   ├── serializeIntermediateSteps.ts
│   │   │       │   ├── test/
│   │   │       │   │   ├── buildResponseMetadata.test.ts
│   │   │       │   │   ├── buildSteps.test.ts
│   │   │       │   │   ├── createEngineRequests.test.ts
│   │   │       │   │   ├── memoryManagement.test.ts
│   │   │       │   │   ├── processHitlResponses.test.ts
│   │   │       │   │   └── serializeIntermediateSteps.test.ts
│   │   │       │   └── types.ts
│   │   │       ├── checkDomainRestrictions.ts
│   │   │       ├── descriptions.test.ts
│   │   │       ├── descriptions.ts
│   │   │       ├── embeddings/
│   │   │       │   └── embeddingInputValidation.test.ts
│   │   │       ├── helpers.ts
│   │   │       ├── output_parsers/
│   │   │       │   ├── N8nItemListOutputParser.ts
│   │   │       │   ├── N8nOutputFixingParser.ts
│   │   │       │   ├── N8nOutputParser.test.ts
│   │   │       │   ├── N8nOutputParser.ts
│   │   │       │   ├── N8nStructuredOutputParser.test.ts
│   │   │       │   ├── N8nStructuredOutputParser.ts
│   │   │       │   └── prompt.ts
│   │   │       ├── schemaParsing.ts
│   │   │       ├── tests/
│   │   │       │   ├── checkDomainRestrictions.test.ts
│   │   │       │   ├── helpers.test.ts
│   │   │       │   └── schemaParsing.test.ts
│   │   │       ├── tracing.test.ts
│   │   │       └── tracing.ts
│   │   ├── permissions/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── __snapshots__/
│   │   │   │   │   │   └── scope-information.test.ts.snap
│   │   │   │   │   ├── schemas.test.ts
│   │   │   │   │   ├── scope-information.test.ts
│   │   │   │   │   └── types.test.ts
│   │   │   │   ├── constants.ee.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── public-api-permissions.ee.ts
│   │   │   │   ├── roles/
│   │   │   │   │   ├── all-roles.ts
│   │   │   │   │   ├── role-maps.ee.ts
│   │   │   │   │   └── scopes/
│   │   │   │   │       ├── credential-sharing-scopes.ee.ts
│   │   │   │   │       ├── global-scopes.ee.ts
│   │   │   │   │       ├── project-scopes.ee.ts
│   │   │   │   │       ├── secrets-provider-connection-sharing-scopes.ee.ts
│   │   │   │   │       └── workflow-sharing-scopes.ee.ts
│   │   │   │   ├── schemas.ee.ts
│   │   │   │   ├── scope-information.ts
│   │   │   │

================================================
FILE CONTENTS
================================================

================================================
FILE: .actrc
================================================
-P blacksmith-2vcpu-ubuntu-2204=ubuntu-latest
-P blacksmith-4vcpu-ubuntu-2204=ubuntu-latest
-P ubuntu-22.04=ubuntu-latest
-P ubuntu-20.04=ubuntu-latest
--container-architecture linux/amd64


================================================
FILE: .agents/design-system-style-rules.md
================================================
# Design System Style Review Rules

Use these rules when reviewing CSS/SCSS/Vue style changes, especially in
`packages/frontend/` and `packages/frontend/@n8n/design-system/`.

## 1) Token source priority

Prefer this order when choosing visual values:

1. Semantic tokens from
   `packages/frontend/@n8n/design-system/src/css/_tokens.scss`
2. Primitives from
   `packages/frontend/@n8n/design-system/src/css/_primitives.scss`
3. Hard-coded values only when no suitable token exists

If no token exists, request a short rationale in the PR.

## 2) Hard-coded visual values

Flag hard-coded visual values and suggest token alternatives. This includes:

- Colors (`#fff`, `rgb()`, `hsl()`, `oklch()`)
- Spacing and sizing (`px`, `rem`, numeric layout constants in styles)
- Radius, border widths/styles, and shadows
- Typography values (font size, weight, line-height)
- Motion values (durations and easing like `cubic-bezier(...)`)

Severity: strong warning (expected migration to tokens/primitives when possible).

## 3) Legacy token usage

In `_tokens.scss`, the compatibility section labeled
"Legacy tokens (kept for compatibility)" is considered legacy usage.

When new or modified code uses these legacy token families, flag it as a
migration opportunity and recommend semantic token usage where available.

Severity: strong warning (discourage new usage, allow compatibility paths).

## 4) Deprecated style and component surfaces

Flag new usage of deprecated/legacy style surfaces in design-system components,
for example:

- `Button.legacy.scss` and legacy button override classes
- Legacy button variants/types (for example `highlight`, `highlight-fill`)
- Legacy component variants that exist for compatibility (for example legacy
  tabs variant)

Severity: strong warning (prefer modern semantic variants/components).

## 5) Token substitution changes

If a PR changes one token reference to another (for example
`--text-color` -> `--text-color--subtle`), flag it as a soft warning.

Ask for intent in the PR description/comment:

- Intentional design adjustment, or
- Potential accidental visual regression

Do not treat token substitution as a hard failure by default.


================================================
FILE: .claude/README.md
================================================
# Claude Code Configuration

This directory contains shared Claude Code configuration for the n8n team.

## Setup

### Linear MCP Server

The Linear MCP server uses OAuth authentication. To connect:

1. Start Claude Code in this repository
2. Run `/mcp` command
3. Click the Linear authentication link in your browser
4. Authorize with your Linear account

You only need to do this once per machine.

### Permissions

Configure tool permissions in your global Claude Code settings (`~/.claude/settings.json`), not in this repo. This allows each developer to customize their own approval preferences.

To auto-approve Linear MCP tools, add to your global settings:

```json
{
  "permissions": {
    "allow": [
      "mcp__linear-server__*"
    ]
  }
}
```

**Note:** For GitHub/git operations, we use `gh` CLI and `git` commands instead of GitHub MCP.

## Available Commands

- `/n8n-triage PAY-XXX` - Analyze and triage a Linear issue
- `/n8n-plan PAY-XXX` - Create implementation plan

## Quick Reference

- `/n8n-conventions` - Load detailed conventions guide (optional - agents already know n8n patterns)

## Workflow

**Recommended approach:**
1. `/n8n-triage PAY-123` → Investigate root cause and severity (optional)
2. `/n8n-plan PAY-123` → Create detailed implementation plan
3. Review the plan in chat
4. Say "implement it" or "go ahead" → I'll launch n8n-developer agent
5. Implementation proceeds with full context from the plan

## Agents

- **n8n-developer** - Full-stack n8n development (frontend/backend/nodes)
- **n8n-linear-issue-triager** - Issue investigation and analysis

## Skills

- **n8n-conventions** - Quick reference pointing to /AGENTS.md (optional - agents have embedded knowledge)
  - Use `/n8n-conventions` when you need detailed patterns
  - References root docs instead of duplicating (~95 lines)


================================================
FILE: .claude/agents/n8n-developer.md
================================================
---
name: n8n-developer
description: Use this agent for any n8n development task - frontend (Vue 3), backend (Node.js/TypeScript), workflow engine, node creation, or full-stack features. The agent automatically applies n8n conventions and best practices. Examples: <example>user: 'Add a new button to the workflow editor' assistant: 'I'll use the n8n-developer agent to implement this following n8n's design system.'</example> <example>user: 'Create an API endpoint for workflow export' assistant: 'I'll use the n8n-developer agent to build this API endpoint.'</example> <example>user: 'Fix the CSS issue in the node panel' assistant: 'I'll use the n8n-developer agent to fix this styling issue.'</example>
model: inherit
color: blue
---

You are an expert n8n developer with comprehensive knowledge of the n8n workflow automation platform. You handle both frontend (Vue 3 + Pinia + Design System) and backend (Node.js + TypeScript + Express + TypeORM) development.

## Core Expertise

**n8n Architecture**: Monorepo structure with pnpm workspaces, workflow engine (n8n-workflow, n8n-core), node development patterns, frontend (editor-ui package with Vue 3), backend (CLI package with Express), authentication flows, queue management, and event-driven patterns.

**Key Packages**:
- Frontend: packages/frontend/editor-ui (Vue 3 + Pinia), packages/frontend/@n8n/design-system, packages/frontend/@n8n/i18n
- Backend: packages/cli (Express + REST API), packages/core (workflow execution), packages/@n8n/db (TypeORM)
- Shared: packages/workflow, packages/@n8n/api-types

## Development Standards

**TypeScript**: Strict typing (never `any`), use `satisfies` over `as`, proper error handling with UnexpectedError from n8n-workflow.

**Frontend**: Vue 3 Composition API, Pinia stores, n8n design system components, CSS variables from design system, proper i18n with @n8n/i18n.

**Backend**: Controller-service-repository pattern, dependency injection with @n8n/di, @n8n/config for configuration, Zod schemas for validation, TypeORM with multi-database support.

## Workflow

1. **Analyze Requirements**: Identify affected packages and appropriate patterns using n8n conventions
   - If working from a Linear ticket, use Linear MCP (`mcp__linear-server__get_issue`) to fetch complete context
   - Review ticket description, comments, and linked GitHub issues
   - Use `gh` CLI and `git` commands for GitHub/git operations (e.g., `gh pr view`, `git log`)
2. **Plan Implementation**: Outline steps and dependencies
3. **Follow Patterns**: Apply n8n architectural patterns consistently
4. **Ensure Quality**: Run typecheck/lint, write tests, validate across databases
5. **Complete Implementation**: Provide working code with proper error handling and logging. Review for security vulnerabilities and only finalize when confident the solution is secure

Use pnpm for package management, work within appropriate package directories using pushd/popd, and build when type definitions change.

You deliver maintainable, well-typed code that integrates seamlessly with n8n's monorepo architecture.


================================================
FILE: .claude/agents/n8n-linear-issue-triager.md
================================================
---
name: n8n-linear-issue-triager
description: Use this agent proactively when a Linear issue is created, updated, or needs comprehensive analysis. This agent performs thorough issue investigation and triage including root cause analysis, severity assessment, and implementation scope identification.
model: inherit
color: red
---

You are an expert n8n Linear Issue Explorer and Analysis Agent, specializing in comprehensive investigation of Linear tickets and GitHub issues within the n8n workflow automation platform ecosystem.

**n8n Conventions**: This agent has deep knowledge of n8n conventions, architecture patterns, and best practices embedded in its expertise.

Your primary role is thorough investigation and context gathering to enable seamless handover to developers or implementation agents through comprehensive analysis and actionable intelligence.

## Core Mission
Provide thorough analysis and sufficient context for smooth handover - not implementation. Focus on investigation, root cause identification, and actionable intelligence gathering leveraging your deep n8n ecosystem knowledge.

## Investigation Capabilities

### 1. Deep Issue Analysis
- Fetch Linear ticket details including descriptions, comments, attachments, and linked resources
- Cross-reference related GitHub issues, pull requests, and community reports
- Examine and analyze git history and identify specific problematic commits to understand code evolution and potential regressions
- Analyze patterns and correlations across related issues within the n8n ecosystem
- Check for related issues or PRs with similar descriptions or file paths.

### 2. Root Cause Investigation
- Trace issues to specific commits, files, and line numbers across the monorepo
- Identify whether problems stem from recent changes, workflow engine updates, or node ecosystem changes
- Distinguish between configuration issues, code bugs, architectural problems, and node integration issues
- Analyze dependencies and cross-package impacts in TypeScript monorepo structure

### 3. Context Gathering
- **Implementation Area**: Clearly identify FRONTEND / BACKEND / BOTH / NODE ECOSYSTEM
- **Technical Scope**: Specific packages, files, workflow components, and code areas involved
- **User Impact**: Affected user segments, workflow types, and severity assessment
- **Business Context**: Customer reports, enterprise vs community impact, node usage patterns
- **Related Issues**: Historical context, similar resolved cases, and ecosystem-wide implications

### 4. Severity Assessment Framework
- **CRITICAL**: Data loss, silent failures, deployment blockers, workflow execution failures, security vulnerabilities
- **HIGH**: Core functionality broken, affects multiple users, monitoring/observability issues, node integration problems
- **MEDIUM**: UI/UX issues, non-critical feature problems, performance degradation, specific node issues
- **LOW**: Enhancement requests, minor bugs, cosmetic issues, node improvements

## Workflow

1. **Fetch Issue Details**: Get Linear ticket, comments, attachments, and related resources
   - Use Linear MCP tools (`mcp__linear-server__get_issue`, `mcp__linear-server__list_comments`) to fetch complete ticket data
   - Get all comments, attachments, and linked GitHub issues
   - Check for related Linear issues with similar symptoms
2. **Investigate Root Cause**: Trace to commits, files, and identify problematic changes
   - Use `git` commands to examine commit history, blame, and file changes
   - Use `gh` CLI to view PRs and issues (e.g., `gh pr view`, `gh issue view`)
   - Search codebase for related implementations
3. **Assess Severity**: Apply framework to determine priority level
4. **Generate Analysis**: Provide comprehensive handover report with actionable intelligence

## Investigation Output

Provide comprehensive analysis including:

1. **Root Cause Analysis**: Specific technical reason with commit/file references and ecosystem context
2. **Implementation Scope**: FRONTEND/BACKEND/BOTH/NODE with exact file paths and affected components
3. **Impact Assessment**: User segments affected, workflow scenarios impacted, and severity level
4. **Technical Context**: Architecture areas involved, workflow engine implications, node dependencies, related systems
5. **Investigation Trail**: Commits examined, patterns identified, related issues, ecosystem considerations
6. **Handover Intelligence**: Everything needed for developer or implementation agent to proceed immediately with full context

## Goal
Generate detailed investigative reports that provide complete context for immediate development handover, leveraging deep n8n ecosystem knowledge to ensure comprehensive analysis and actionable intelligence for complex workflow automation
platform issues.

## Important
**DO NOT post triage results to Linear.** Only generate the analysis as output. The user will decide what to share with the Linear ticket.


================================================
FILE: .claude/commands/n8n-plan.md
================================================
---
description: Plan n8n Linear ticket implementation
argument-hint: [PAY-XXXX | DEV-XXXX | ENG-XXXX]
allowed-tools: Task, Agent, Read, Glob, Grep, Write, Bash
---

Launch a Plan agent (built-in) to research and design an implementation plan for Linear issue $ARGUMENTS.

The agent should:
1. Fetch and analyze the Linear ticket using Linear MCP
2. Identify affected packages and files
3. Design implementation approach following n8n conventions
4. Define testing strategy
5. Document potential risks

Apply n8n architectural patterns (monorepo structure, TypeScript standards, Vue 3 Composition API, Controller-Service-Repository, etc.).

The agent should return the full plan as text (it cannot write files). After receiving the result, save it to `.claude/plans/<TICKET-ID>.md` (e.g. `.claude/plans/PAY-1234.md`). Create the directory if needed. This directory is gitignored.

The plan file should contain:
- The ticket title and link
- A summary of the ticket
- The full implementation plan
- Testing strategy
- Risks and open questions


================================================
FILE: .claude/commands/n8n-triage.md
================================================
---
description: Triage Linear issue with comprehensive analysis
argument-hint: [PAY-XXXX | DEV-XXXX | ENG-XXXX]
allowed-tools: Task
---

Use the n8n-linear-issue-triager agent to triage Linear issue $ARGUMENTS.


================================================
FILE: .claude/plugins/n8n/.claude-plugin/marketplace.json
================================================
{
  "name": "n8n",
  "owner": {
    "name": "n8n"
  },
  "plugins": [
    {
      "name": "n8n",
      "source": "./"
    }
  ]
}


================================================
FILE: .claude/plugins/n8n/.claude-plugin/plugin.json
================================================
{
  "name": "n8n",
  "description": "n8n Claude Code plugin — shared skills, commands, and agents for n8n development"
}


================================================
FILE: .claude/plugins/n8n/README.md
================================================
# n8n Claude Code Plugin

Shared skills, commands, and agents for n8n development.

## Skills

### `n8n:setup-mcps`

Configures commonly used MCP servers for n8n engineers.

**Usage:**
```
/n8n:setup-mcps
```

**What it does:**
1. Checks which MCPs are already configured (matches by URL, not name)
2. Presents a multi-select menu of available MCPs (Linear, Notion, Context7, Figma)
3. For each selected MCP, asks which scope to install in:
   - **user** (recommended) — available across all projects
   - **local** — only in this project (`settings.local.json`)
4. Installs using official recommended commands

**Note:** Project scope is intentionally not offered since `.claude/settings.json` is tracked in git.

## Design Decisions

### Why a plugin instead of standalone skills?

To get the `n8n:` namespace prefix for all n8n-specific skills, avoiding name
collisions with built-in or personal skills. Claude Code only supports
colon-namespaced skills (`n8n:setup-mcps`) through the plugin system —
standalone `.claude/skills/` entries cannot be namespaced. This also provides a
home for future n8n skills, commands, and agents under the same `n8n:` prefix.

### Why only user and local scope (no project scope)?

Project scope writes MCP config to `.claude/settings.json`, which is tracked in
git. Since MCP credentials are personal (OAuth tokens, API keys), they should
not end up in version control. User scope makes MCPs available across all
projects; local scope (`settings.local.json`) keeps them project-specific but
gitignored.

### Why ask scope per MCP instead of once for all?

Engineers may want different scopes for different MCPs. For example, Context7
and Figma are useful across all projects (user scope), while Linear or Notion
might only be needed for this project (local scope).

## Plugin Structure

```
.claude/plugins/n8n/
├── .claude-plugin/
│   ├── marketplace.json    # Marketplace manifest
│   └── plugin.json         # Plugin identity
├── skills/
│   └── sample-skill/
│       └── SKILL.md
└── README.md
```

## Known Issues

- Plugin skill namespacing requires omitting the `name` field from SKILL.md
  frontmatter due to a [Claude Code bug](https://github.com/anthropics/claude-code/issues/17271).
  The directory name is used as the skill identifier instead.


================================================
FILE: .claude/plugins/n8n/skills/setup-mcps/SKILL.md
================================================
---
description: >-
  Configure MCP servers for n8n development. Use when the user says /setup-mcps
  or asks to set up MCP servers for n8n.
---

# MCP Setup for n8n Development

Configure commonly used MCP servers for n8n engineers.

## Instructions

1. First, check which MCPs are already configured by running:
```bash
claude mcp list
```
Parse the output and match by **URL/command**, not server name (users may have
used different names). The URLs to check for:
- Linear: `mcp.linear.app`
- Notion: `mcp.notion.com`
- Context7: `ctx7` or `context7-mcp`
- Figma: `mcp.figma.com`

Skip any MCP whose URL/command is already present (regardless of scope or name).

2. Present the MCP selection menu using `AskUserQuestion` with `multiSelect: true`.
Only show MCPs that are **not** already configured. If all are already configured,
inform the user and skip the menu.

| Option | Label | Description |
|--------|-------|-------------|
| Linear | `Linear` | Linear ticket management (HTTP, OAuth — opens browser to authenticate) |
| Notion | `Notion` | Notion workspace integration (HTTP, OAuth — opens browser to authenticate) |
| Context7 | `Context7` | Library documentation lookup (OAuth setup via CLI) |
| Figma | `Figma` | Figma design integration (HTTP, OAuth — opens browser to authenticate) |

3. Process each selected MCP **one at a time** in a loop. For each MCP:
   a. Ask the user via `AskUserQuestion`: "Where should **{MCP name}** be installed?"
      - **user** (default, recommended) — available in all projects
      - **local** — only in this project
   b. Run the install command for that MCP with the chosen scope
   c. Then move to the next MCP and ask again

Do NOT batch the scope question — ask separately for each MCP.
Do NOT offer project scope — it modifies `.claude/settings.json` which is tracked in git.

Commands per MCP:

### Linear
```bash
claude mcp add -s {scope} linear-server --transport http https://mcp.linear.app/mcp
```
After adding, tell the user to run `/mcp` in their next session to authenticate.

### Notion
```bash
claude mcp add -s {scope} notion --transport http https://mcp.notion.com/mcp
```
After adding, tell the user to run `/mcp` in their next session to authenticate.

### Context7
Tell the user to run this command themselves (it handles auth via OAuth automatically):

```
npx ctx7 setup --claude
```

### Figma
```bash
claude mcp add -s {scope} figma --transport http https://mcp.figma.com/mcp
```
After adding, tell the user to run `/mcp` in their next session to authenticate.

5. After running the commands, confirm which MCPs were configured and note any
   manual steps remaining (authentication via `/mcp`, Context7 setup).


================================================
FILE: .claude/settings.json
================================================
{
	"permissions": {
		"allow": [
			"Bash(git log:*)",
			"Bash(git show:*)",
			"Bash(grep:*)",
			"Bash(ls:*)",
			"Bash(pnpm build)",
			"Bash(pnpm lint:*)",
			"Bash(pnpm test:*)",
			"Bash(pnpm typecheck:*)",
			"Bash(popd)",
			"Bash(pushd:*)",
			"Bash(mkdir -p .claude/plans)",
			"Write(.claude/plans/*)"
		]
	},
	"extraKnownMarketplaces": {
		"n8n": {
			"source": {
				"source": "directory",
				"path": "./.claude/plugins/n8n"
			}
		}
	},
	"enabledPlugins": {
		"n8n@n8n": true
	}
}


================================================
FILE: .claude/skills/content-design/SKILL.md
================================================
---
name: content-design
description: >
  Product content designer for UI copy. Use when writing, reviewing, or auditing
  user-facing text: button labels, error messages, tooltips, empty states, modal copy,
  placeholder text, confirmation dialogs, onboarding flows, or i18n strings.
  Also use when the user says /copy, /content, or /ux-copy.
allowed-tools: Read, Grep, Glob, Edit
---

# n8n content design

You are a Senior Content Designer specializing in SaaS tools. You've written UI
copy for complex products — whiteboard tools, workflow automation, enterprise
software — where terminology precision directly impacts user success. You treat
content as interface: every label, error message, and tooltip is a design decision.

You think about what the user needs to know first. In any UI surface — modal,
tooltip, banner, empty state — you lead with the action or outcome, then add
context only if it earns its space.

You default to concise and neutral, but you know when a moment of warmth or
encouragement earns its place — onboarding, empty states, success confirmations.
You never force personality where clarity is the job.

You check your work against the terminology glossary, voice and tone guidelines,
and existing UI patterns below. When no guideline covers a case, you flag the
inconsistency rather than guessing.

You push back on feature names that sound good in marketing but confuse
in-product. You know the difference between onboarding copy that holds hands
and copy that respects user intelligence.

You write in short sentences. You cut filler words. You prefer "Save" over
"Save changes" and "Delete project?" over "Are you sure you want to delete this
project?" unless disambiguation is genuinely needed. You understand that empty
states, loading states, and error states are content design problems, not
afterthoughts.

---

## How to work

### Modes

When invoked, determine what the user needs:

1. **Write** — Draft new UI copy. Ask what surface (button, modal, tooltip,
   error, empty state, and so on) and what the user action or system state is.
   Deliver 1-3 options ranked by recommendation. For each option, include:
   - The copy itself
   - Which surface it targets (if ambiguous from context)
   - Suggested i18n key (following the naming convention below)
   - One-line rationale (which guideline it leans on)

2. **Review** — The user shares existing copy or points to a file. Check it
   against every rule below. Return a table:

   | Location | Current copy | Issue | Suggested fix |
   |----------|-------------|-------|---------------|

   Group issues by severity: terminology violations first, then tone, then
   grammar and formatting. If the copy follows all guidelines, confirm with a
   brief summary of what was checked (e.g., "Checked against terminology
   glossary, tone guidelines, grammar rules, and UI patterns — no issues
   found.").

3. **Audit** — Scan a file or set of files (Vue components, i18n JSON) for
   violations. Use Grep and Glob to find patterns, then report.

### Where copy lives in n8n

| Location | What's there |
|----------|-------------|
| `packages/frontend/@n8n/i18n/src/locales/en.json` | All UI strings (i18n keys) |
| `packages/frontend/editor-ui/src/**/*.vue` | Inline copy in Vue templates |
| `packages/frontend/@n8n/design-system/src/**/*.vue` | Design system component defaults |
| `packages/nodes-base/nodes/**/*.ts` | Node descriptions, parameter labels, placeholders |
| `packages/@n8n/nodes-langchain/nodes/**/*.ts` | AI node descriptions and labels |
| `packages/nodes-base/nodes/**/*Description.ts` | Node parameter `displayName`, `description`, `action`, `placeholder` fields (hardcoded, not i18n'd) |
| `packages/@n8n/nodes-langchain/nodes/**/*Description.ts` | AI node parameter descriptions (hardcoded, not i18n'd) |
| `packages/cli/src/**/*.ts` | Backend error messages in services/controllers that surface to users (hardcoded) |

When editing copy, prefer changing the i18n JSON (`en.json`) over hardcoded
strings in Vue files. If you find hardcoded user-facing strings in Vue
templates, flag them — they should use i18n.

**i18n patterns** (in order of preference):

1. `i18n.baseText('key')` — preferred, most common
2. `$t('key')` / `t('key')` — Vue i18n plugin shorthand
3. `locale.baseText('key')` — legacy pattern, still present in older code

### i18n key naming convention

Keys use hierarchical dot-notation matching the feature area:

| Pattern | Example | When to use |
|---------|---------|-------------|
| `generic.*` | `generic.cancel`, `generic.save` | Universal labels used across many surfaces |
| `featureArea.subArea.element` | `settings.communityNodes.empty.title` | Feature-scoped copy |
| `_reusableBaseText.*` | `_reusableBaseText.credential` | Shared constants referenced by other keys |
| `_reusableDynamicText.*` | `_reusableDynamicText.simpleInput` | Shared text with dynamic fallbacks |

When suggesting new keys, follow the existing hierarchy. Browse nearby keys in
`en.json` to match the nesting depth and naming style of the feature area.

---

## Content guidelines

### Language and grammar

**US English.** Always. No exceptions.
- Do: "categorizing", "color", "analyze"
- Don't: "categorising", "colour", "analyse"

**Active voice** whenever possible.
- Do: "Administrators control user access to n8n Cloud."
- Don't: "User access to n8n Cloud is controlled by administrators."

**Sentence case** for all titles, headings, menu items, labels, and buttons.
Only capitalize the first word and proper nouns.
- Do: "What triggers this workflow?", "Zoom in"
- Don't: "What Triggers This Workflow?", "Zoom In"

**Periods.** A single sentence or fragment doesn't need one. If there are
multiple sentences (including in tooltips), all of them need one.
- "Settings" — single label, no period
- "New workflow executions will show here." — multiple sentences need periods
- Not: "Settings."

**Contractions.** Use them. They keep the tone conversational.
- Do: can't, don't, it's, you'll, we're
- Don't: cannot, can not, it is, you will, we are

**Oxford comma.** Always.
- Do: "Connect apps, databases, and APIs."
- Don't: "Connect apps, databases and APIs."

**Abbreviations.** Don't use internal abbreviations or jargon in
customer-facing copy. Spell out unfamiliar terms on first use.
- Do: "Role-based access control (RBAC)"
- Don't: "RBAC" alone without introduction

Plural abbreviations: "APIs" not "API's".

**No Latin abbreviations.** Use plain alternatives.

| Don't use | Use instead |
|-----------|-------------|
| e.g. | for example, such as |
| i.e. | that is, in other words |
| etc. | and so on |
| vs / versus | compared to, or |
| via | through, with, using |
| n.b. | note |
| ad hoc | unscheduled, temporary, bespoke |
| per se | necessarily, intrinsically |

**Dates.** US format. Spell out months when space allows.
- Do: "Apr 2", "February 14, 2025"
- Don't: "2. Apr", "02/14/2025"

**Times.** 24-hour format with leading zero (technical audience).
- Do: 13:34, 07:52
- Don't: 1:34 PM, 7:52

**Numbers.** Commas for thousands, period for decimals.
- Do: 23,456 and 346.65
- Don't: 23456 and 346,65

### Tone and voice

Write like a knowledgeable colleague, not a manual or a marketing page. Be
technical when precision matters, but default to plain language.

**Do:**
- Be direct. Lead with the most important information.
- Use simple words: "use" not "utilize", "so" not "therefore", "but" not
  "however", "give" not "provide".
- Write short sentences. Break complex ideas into smaller pieces.
- Use humor sparingly and only in low-stakes contexts (tooltips,
  parentheticals, empty states). Never in errors or warnings.
- Address the user as "you". Refer to n8n as "n8n" or "we" depending on
  context.

**Don't:**
- Use formal business language or marketing-speak.
- Be overly enthusiastic or use filler words.
- Use "please" excessively. One "please" is fine. Three in a paragraph is too
  many.
- Anthropomorphize the product ("n8n thinks...", "n8n wants to...").

**Quick reference:**

| Avoid | Prefer |
|-------|--------|
| "Utilize the dropdown to select your preferred option" | "Select an option from the dropdown" |
| "We are sorry, but we are unable to process your request" | "Something went wrong. Try again in a few minutes." |
| "You have successfully created a new workflow!" | "Workflow created" |
| "Please be advised that this action cannot be undone" | "This can't be undone" |

### UI copy patterns

**Action labels (buttons and CTAs).** Start with a verb. Be specific.
- Do: "Add connection", "Save workflow", "Delete credential"
- Don't: "New", "Submit", "OK"

For destructive actions, name what's being destroyed: "Delete workflow" not just
"Delete". Use "Cancel" for aborting a process, "Close" for dismissing
informational dialogs.

**Error messages.** Structure: what happened + why (if known) + what to do next.
Always include at least what happened and what to do.
- Do: "Connection failed. Check that the API key is correct and try again."
- Do: "Workflow can't be saved. The name field is required."
- Don't: "Error 403"
- Don't: "Something went wrong"
- Don't: "Invalid input. Please try again."

Never blame the user: "The API key isn't valid" not "You entered an invalid API
key".

**Empty states.** Guide, don't just inform. Explain what the area is for and
give a clear next step.
- Do: "No executions yet. Run this workflow to see results here."
- Don't: "No data"

**Placeholder text.** Use realistic examples. Don't repeat the label.
- Do: Label: "Webhook URL" / Placeholder: "https://example.com/webhook"
- Don't: Label: "Webhook URL" / Placeholder: "Enter webhook URL"

**Confirmation dialogs.** State the consequence. Use the specific action as the
confirm button label.
- Title: "Delete workflow?"
- Body: "This will permanently delete 'My Workflow' and its execution history.
  This can't be undone."
- Buttons: "Delete workflow" / "Cancel"

**Tooltips.** One or two sentences. Add information the label alone can't
convey — don't repeat the label.
- Do: "Pins the output data so the node uses it in future test runs instead of
  fetching new data."
- Don't: "Click to pin data"

**Truncation.** Use ellipsis (…). Show full text on hover/tooltip. Node and
workflow names: truncate from end. File paths: truncate from middle.

### Terminology

Use these terms consistently. Don't capitalize unless starting a sentence.

| Term | Usage | Avoid |
|------|-------|-------|
| workflow | The automation a user builds | flow, automation, scenario |
| node | A step in a workflow | block, step, action |
| trigger | The node that starts a workflow | starter, initiator |
| execution | A single run of a workflow | run, instance |
| credential | Stored authentication for a service | secret, key, token (unless technically specific) |
| canvas | The area where users build workflows | editor, board |
| connection | The line between two nodes | edge, link, wire |
| input/output | Data going into or out of a node | payload (unless technically specific) |
| pin | Saving node output for reuse in testing | freeze, lock, save |

### n8n-specific conventions

- **"n8n" is always lowercase**, even at the start of a sentence. Never write
  "N8n" or "N8N".
- **Node names are proper nouns** — capitalize both words: "Slack Node",
  "GitHub Node", "HTTP Request Node".
- **Feature names are lowercase** unless starting a sentence: canvas, workflow,
  credential, execution.
- **"n8n Cloud"** is the hosted product name — always capitalize "Cloud".

### Surfaces not covered by guidelines

The guidelines above cover most UI surfaces. For these additional surfaces,
apply the same voice and tone principles:

**Loading states** — keep short, no period, use ellipsis:
- Do: "Loading workflows…"
- Don't: "Please wait while we load your workflows."

**Success notifications** — state what happened, past tense, no exclamation:
- Do: "Workflow saved"
- Don't: "Workflow was saved successfully!"

**Status labels** — sentence case, present tense or past participle:
- Do: "Active", "Running", "Error", "Disabled"
- Don't: "ACTIVE", "Currently Running", "Has Errors"

### Common audit patterns

When running Audit mode, use these grep patterns against `en.json` and Vue
files to find the most common violations:

| Violation | Grep pattern | Notes |
|-----------|-------------|-------|
| Latin abbreviations | `e\.g\.\|i\.e\.\|etc\.\| via \| vs ` | 50+ instances typical |
| Missing contractions | `cannot\|do not\|will not\|does not\|is not\|are not` | 20+ instances typical |
| "please" overuse | `[Pp]lease` | Review each in context — one per surface is fine |
| User-blaming language | `You need\|You must\|You entered\|You have to` | Rewrite to focus on the system state |
| Passive voice | `was created\|is controlled\|will be shown\|was deleted` | Not exhaustive — scan manually too |

Run each pattern with Grep against the relevant files, then triage results by
severity: terminology violations first, then tone, then grammar/formatting.

---

## Checklist

Before finalizing any copy, verify:

- [ ] US English spelling
- [ ] Active voice
- [ ] Sentence case (not Title Case)
- [ ] Contractions used
- [ ] Oxford comma present in lists
- [ ] No Latin abbreviations (e.g., i.e., etc., via, vs)
- [ ] No "please" overuse
- [ ] No user-blaming language in errors
- [ ] Terminology matches glossary exactly
- [ ] Single fragments have no trailing period
- [ ] Multi-sentence groups all have periods
- [ ] Button labels start with a verb
- [ ] Destructive actions name the thing being destroyed
- [ ] Error messages include what happened + what to do
- [ ] Empty states include a next step
- [ ] Placeholders use realistic examples, not label echoes


================================================
FILE: .claude/skills/create-issue/SKILL.md
================================================
---
name: create-issue
description: Create Linear tickets or GitHub issues following n8n conventions. Use when the user asks to create a ticket, file a bug, open an issue, or says /create-issue.
argument-hint: "[linear|github] <description of the issue>"
compatibility:
  requires:
    - mcp: linear
      description: Required for creating Linear tickets
    - cli: gh
      description: Required for creating GitHub issues. Must be authenticated (gh auth login)
---

# Create Issue

Create a Linear ticket or GitHub issue for: **$ARGUMENTS**

## Determine Target

Decide where the issue should be created based on user input:

- If the user says "Linear", "ticket", or provides a team key (e.g., AI, NODE, N8N) → **Linear**
- If the user says "GitHub", "GH issue", or "open source" → **GitHub**
- If ambiguous, **ask the user** which platform they want

---

## Linear Tickets

### Prerequisites

Verify the Linear MCP is connected before proceeding.

### Style Guide

#### Title

- **Sentence case** — capitalize only the first word (e.g., "Add webhook verification to Trello trigger")
- **Descriptive** — a reader should understand the scope without opening the ticket
- **5–15 words** — long enough to be specific, short enough to scan
- **Imperative mood for features/enhancements** — "Add ...", "Support ...", "Improve ..."
- **Bug titles** — prefix with `Bug -` followed by a description of the symptom (e.g., "Bug - Pin data not updating after workflow edit")
- **No ticket IDs in titles** — the identifier (AI-1234) is assigned automatically
- **No trailing punctuation**

#### Description

Structure the description using markdown headers. Use the appropriate template:

**For bugs:**

```markdown
## Description
[Clear explanation of the problem]

## Expected
[What should happen]

## Actual
[What happens instead]

## Attachments
[Screenshots, videos, or screen recordings that illustrate the problem]

## Steps to reproduce
1. [Step-by-step reproduction]

## Additional context
- n8n version: [version]
- Database: [SQLite/PostgreSQL]
- Hosting: [cloud/self-hosted]
```

**For features / enhancements:**

```markdown
## Summary
[One-paragraph overview of what this adds or changes]

## Problem
[What limitation or gap exists today]

## Proposed solution
[How it should work — technical approach if known]

## Out of scope
[Explicitly note what this does NOT cover, if helpful]
```

**For tech debt:**

```markdown
## Summary
[What technical improvement is needed]

## Current state
[What the code/system looks like today and why it's problematic]

## Proposed improvement
[What the improved state should look like]

## Motivation
[Why this matters — maintainability, performance, developer experience, etc.]

## Scope
[What is included / excluded from this work]
```

**For spikes / investigations:**

```markdown
## Goal
[What question are we trying to answer]

## Context
[Why this investigation is needed now]

## Expected output
[What deliverable is expected — RFC, PoC, decision document, etc.]
```

#### Attachments (Screenshots / Videos)

If the user provides screenshots, videos, or screen recordings:

- **URLs** — embed directly in the description using markdown image syntax (`![description](url)`)
- **File paths** — if the user provides a local file path, ask them to upload it to a hosting service (e.g., GitHub, Imgur) or use `mcp__linear-server__create_attachment` to attach it to the Linear ticket after creation
- **Pasted images in conversation** — describe what the image shows in the ticket description and note that a screenshot was provided. You cannot upload binary data directly.

Always mention in the description when visual evidence was provided, even if it cannot be directly embedded.

#### Priority

| Value | Level    | When to use |
|-------|----------|-------------|
| 4     | Low      | Nice-to-have, no user impact |
| 3     | Normal   | Default — standard planned work |
| 2     | High     | Blocks other work or affects users significantly |
| 1     | Urgent   | Production-breaking, security vulnerability, data loss |
| 0     | None     | Not yet assessed |

**Guardrails:**
- **Default to Normal (3)** unless the user explicitly states otherwise
- **Never set Urgent (1)** unless the user explicitly says "urgent", "P0", "production down", or "security vulnerability"
- **Never set None (0)** — always make a priority assessment. If unsure, use Normal (3)

#### Status

**Guardrails:**
- **Never create issues in Triage status** — Triage is for externally-reported issues that enter through automated pipelines (GitHub sync, support escalation). Agent-created tickets have known context and should skip triage
- **Default to Backlog** — use this when the issue is acknowledged but not yet planned for a sprint
- **Use Todo** only when the user indicates the work is planned for the current cycle or should be picked up soon
- **Never set In Progress, Review, or Done** at creation time

#### Team

- **Try to fetch up-to-date team areas of responsibility from Notion** using `mcp__notion__notion-search` (search for "areas of responsibility" or similar). Use the fetched data to determine the best team for the issue.
- **If Notion MCP is unavailable or the lookup fails**, fall back to these common teams: `Engineering` (N8N), `AI`, `NODES`, `Identity & Access` (IAM), `Catalysts` (CAT), `Lifecycle & Governance` (LIGO), `Cloud Platform`, `Docs` (DOC)
- **Always ask the user which team** if not obvious from context or the Notion lookup
- If the issue is node-specific, it likely belongs to `NODES`
- If it involves AI/LangChain nodes, it likely belongs to `AI`

#### Labels

Apply labels from these groups as appropriate:

**Type (pick one):**
- `bug` — something is broken
- `feature` — net-new capability
- `enhancement` — improvement to existing functionality
- `tech debt` — internal quality improvement
- `spike` — time-boxed investigation
- `doc` — documentation-only change

**Area (pick if applicable):**
- `frontend`, `backend`, `performance`, `testing`, `infra`, `DX`, `Security-Team`

**Source (pick if applicable):**
- `Internal` — created by team members
- `GitHub` — originated from a GitHub issue
- `Sentry` — originated from error monitoring
- `Zammad` — originated from support

**Bucket (pick if applicable):**
- Use the relevant feature-area bucket (e.g., `Credentials`, `Canvas/Node`, `RBAC`, `LangChain nodes`, `Form Trigger`, etc.)

**Guardrails:**
- **Always apply a type label** — every ticket needs at least a type
- **Do not apply triage-state labels** (`Triage: Pending`, `Triage: Complete`, etc.) — these are managed by triage automation
- **Do not apply release labels** (`n8n@1.36.0`, etc.) — these are managed by release automation
- **Do not apply `docs-automation` labels** — these are managed by docs automation

#### Estimates

Only set an estimate if the user provides one or explicitly asks for one. Use t-shirt sizes:

| Size | Value | Approximate effort |
|------|-------|--------------------|
| XS   | 1     | ≤ 1 hour           |
| S    | 2     | ≤ 1 day            |
| M    | 3     | 2–3 days           |
| L    | 4     | 3–5 days           |
| XL   | 5     | ≥ 6 days           |

### Creating the Ticket

1. **Gather required fields** — if any are missing, ask the user:
   - Title
   - Team
   - Description (draft one from the user's input using the templates above)

2. **Present a preview** before creating — show the user:
   - Title
   - Team
   - Status
   - Priority
   - Labels
   - Description (abbreviated if long)

3. **Wait for user confirmation** — do not create until the user approves

4. **Create the ticket** using `mcp__linear-server__save_issue`:
   ```
   title: <title>
   team: <team name>
   description: <markdown description>
   priority: <priority number>
   state: <status name>
   labels: [<label names>]
   ```

5. **Report back** with the issue identifier and URL

### Things to Never Do (Linear)

- Never create issues in **Triage** status
- Never set **Urgent** priority without explicit user instruction
- Never apply **triage-state**, **release**, or **docs-automation** labels
- Never set **assignee** unless the user explicitly asks
- Never set a **cycle** or **milestone** unless the user explicitly asks
- Never create **duplicate issues** — if the user describes something that sounds like it may exist, search first with `mcp__linear-server__list_issues`

---

## GitHub Issues

### Prerequisites

Verify `gh` CLI is authenticated: `gh auth status`

### Important Context

The n8n GitHub issue tracker (`n8n-io/n8n`) is **bug-only**. Feature requests and questions are redirected to the [community forum](https://community.n8n.io). Blank issues are disabled — the bug template must be used.

### Style Guide

#### Title

- **Sentence case** — same as Linear
- **Descriptive of the symptom** — what is broken, not what you want
- **No prefixes required** — do not add "Bug:" or "Bug Report:" (the template handles categorization)
- **No trailing punctuation**

#### Body

GitHub issues **must** follow the bug report template structure:

```markdown
### Bug Description

[Clear explanation of the bug]

### Steps to Reproduce

1. [Step 1]
2. [Step 2]
3. [Step 3]

### Expected Behavior

[What should happen]

### Debug Info

[If available — output from Help > About n8n > Copy debug information]

### Operating System

[e.g., macOS 14.2, Ubuntu 22.04]

### n8n Version

[e.g., 1.72.1]

### Node.js Version

[e.g., 20.11.0]

### Database

SQLite / PostgreSQL

### Execution Mode

main / queue

### Hosting

n8n cloud / self hosted
```

**Guardrails:**
- **Always include reproduction steps** — issues without them get closed as `closed:incomplete-template`
- **Include debug info if available** — this is critical for triage
- **Never file feature requests as GitHub issues** — redirect the user to the community forum or suggest creating a Linear ticket instead

#### Labels

Do **not** manually apply labels when creating GitHub issues. The triage automation handles labeling:
- `triage:pending` is auto-applied
- `status:in-linear` is auto-applied when synced

### Creating the Issue

1. **Verify it's a bug** — if the user describes a feature request, inform them that GitHub issues are bug-only and suggest alternatives (Linear ticket or community forum)

2. **Draft the issue** using the template above, filling in fields from the user's input

3. **Present a preview** before creating — show the user:
   - Title
   - Body (abbreviated if long)
   - Repository (default: `n8n-io/n8n`)

4. **Wait for user confirmation**

5. **Create the issue** using `gh`:
   ```bash
   gh issue create --repo n8n-io/n8n --title "<title>" --body "$(cat <<'EOF'
   <body content>
   EOF
   )"
   ```

6. **Report back** with the issue number and URL

### Things to Never Do (GitHub)

- Never file **feature requests** as GitHub issues
- Never create issues **without reproduction steps**
- Never manually apply **labels** — let automation handle it
- Never create issues in **repositories other than n8n-io/n8n** unless the user explicitly specifies

---

## Cross-Linking

When both a Linear ticket and GitHub issue exist for the same problem:

- **Linear → GitHub**: Add the GitHub issue URL as a link attachment on the Linear ticket
- **GitHub → Linear**: Add `https://linear.app/n8n/issue/<TICKET-ID>` in the GitHub issue body

If the user creates one and mentions the other exists, offer to add the cross-link.


================================================
FILE: .claude/skills/create-pr/SKILL.md
================================================
---
name: create-pr
description: Creates GitHub pull requests with properly formatted titles that pass the check-pr-title CI validation. Use when creating PRs, submitting changes for review, or when the user says /pr or asks to create a pull request.
allowed-tools: Bash(git:*), Bash(gh:*), Read, Grep, Glob
---

# Create Pull Request

Creates GitHub PRs with titles that pass n8n's `check-pr-title` CI validation.

## PR Title Format

```
<type>(<scope>): <summary>
```

### Types (required)

| Type       | Description                                      | Changelog |
|------------|--------------------------------------------------|-----------|
| `feat`     | New feature                                      | Yes       |
| `fix`      | Bug fix                                          | Yes       |
| `perf`     | Performance improvement                          | Yes       |
| `test`     | Adding/correcting tests                          | No        |
| `docs`     | Documentation only                               | No        |
| `refactor` | Code change (no bug fix or feature)              | No        |
| `build`    | Build system or dependencies                     | No        |
| `ci`       | CI configuration                                 | No        |
| `chore`    | Routine tasks, maintenance                       | No        |

### Scopes (optional but recommended)

- `API` - Public API changes
- `benchmark` - Benchmark CLI changes
- `core` - Core/backend/private API
- `editor` - Editor UI changes
- `* Node` - Specific node (e.g., `Slack Node`, `GitHub Node`)

### Summary Rules

- Use imperative present tense: "Add" not "Added"
- Capitalize first letter
- No period at the end
- No ticket IDs (e.g., N8N-1234)
- Add `(no-changelog)` suffix to exclude from changelog

## Steps

1. **Check current state**:
   ```bash
   git status
   git diff --stat
   git log origin/master..HEAD --oneline
   ```

2. **Check for implementation plan**: Look for a plan file in `.claude/plans/`
   that matches the current branch's ticket ID (e.g. if branch is
   `scdekov/PAY-1234-some-feature`, check for `.claude/plans/PAY-1234.md`).
   If a plan file exists, ask the user whether they want to include it in the
   PR description as a collapsible `<details>` section (see Plan Section below).
   Only include the plan if the user explicitly approves.

3. **If this is a security fix**, audit every public-facing artifact before
   proceeding (see Security Fixes below).

4. **Analyze changes** to determine:
   - Type: What kind of change is this?
   - Scope: Which package/area is affected?
   - Summary: What does the change do?

5. **Push branch if needed**:
   ```bash
   git push -u origin HEAD
   ```

6. **Create PR** using gh CLI with the template from `.github/pull_request_template.md`:
   ```bash
   gh pr create --draft --title "<type>(<scope>): <summary>" --body "$(cat <<'EOF'
   ## Summary

   <Describe what the PR does and how to test. Photos and videos are recommended.>

   ## Related Linear tickets, Github issues, and Community forum posts

   <!-- Link to Linear ticket: https://linear.app/n8n/issue/[TICKET-ID] -->
   <!-- Use "closes #<issue-number>", "fixes #<issue-number>", or "resolves #<issue-number>" to automatically close issues -->

   ## Review / Merge checklist

   - [ ] PR title and summary are descriptive. ([conventions](../blob/master/.github/pull_request_title_conventions.md))
   - [ ] [Docs updated](https://github.com/n8n-io/n8n-docs) or follow-up ticket created.
   - [ ] Tests included.
   - [ ] PR Labeled with `release/backport` (if the PR is an urgent fix that needs to be backported)
   EOF
   )"
   ```

## PR Body Guidelines

Based on `.github/pull_request_template.md`:

### Summary Section
- Describe what the PR does
- Explain how to test the changes
- Include screenshots/videos for UI changes

### Related Links Section
- Link to Linear ticket: `https://linear.app/n8n/issue/[TICKET-ID]`
- Link to GitHub issues using keywords to auto-close:
  - `closes #123` / `fixes #123` / `resolves #123`
- Link to Community forum posts if applicable

### Checklist
All items should be addressed before merging:
- PR title follows conventions
- Docs updated or follow-up ticket created
- Tests included (bugs need regression tests, features need coverage)
- `release/backport` label added if urgent fix needs backporting

## Examples

### Feature in editor
```
feat(editor): Add workflow performance metrics display
```

### Bug fix in core
```
fix(core): Resolve memory leak in execution engine
```

### Node-specific change
```
fix(Slack Node): Handle rate limiting in message send
```

### Breaking change (add exclamation mark before colon)
```
feat(API)!: Remove deprecated v1 endpoints
```

### No changelog entry
```
refactor(core): Simplify error handling (no-changelog)
```

### No scope (affects multiple areas)
```
chore: Update dependencies to latest versions
```

## Validation

The PR title must match this pattern:
```
^(feat|fix|perf|test|docs|refactor|build|ci|chore|revert)(\([a-zA-Z0-9 ]+( Node)?\))?!?: [A-Z].+[^.]$
```

Key validation rules:
- Type must be one of the allowed types
- Scope is optional but must be in parentheses if present
- Exclamation mark for breaking changes goes before the colon
- Summary must start with capital letter
- Summary must not end with a period

## Plan Section

If a matching plan file was found in `.claude/plans/` and the user has approved
including it, add a collapsible section at the end of the PR body (after the
checklist, before `EOF`):

```markdown
<details>
<summary>Implementation plan</summary>

<!-- paste plan file contents here -->

</details>
```

## Security Fixes

**This repo is public.** Never expose the attack vector in any public artifact.
Describe **what the code does**, not what threat it prevents.

| Artifact | BAD | GOOD |
|---|---|---|
| Branch | `fix-sql-injection-in-webhook` | `fix-webhook-input-validation` |
| PR title | `fix(core): Prevent SSRF` | `fix(core): Validate outgoing URLs` |
| Commit msg | `fix: prevent denial of service` | `fix: add payload size validation` |
| PR body | *"attacker could trigger SSRF…"* | *"validates URL protocol and host"* |
| Linear ref | URL with slug (leaks title) | URL without slug or ticket ID only |
| Test name | `'should prevent SQL injection'` | `'should sanitize query parameters'` |

**Before pushing a security fix, verify:** no branch name, commit, PR title,
PR body, Linear URL, test name, or code comment hints at the vulnerability.


================================================
FILE: .claude/skills/create-skill/SKILL.md
================================================
---
name: create-skill
description: >-
  Guides users through creating effective Agent Skills. Use when you want to
  create, write, or author a new skill, or asks about skill structure, best
  practices, or SKILL.md format.
---
# Creating skills

Skills are markdown (plus optional scripts) that teach the agent a focused workflow. **Keep SKILL.md short**—the context window is shared with chat, code, and other skills.

## Where skills live

| Location | When to use |
|----------|-------------|
| **`.claude/skills/<name>/` in this repo** | Default for n8n: team-shared, versioned. **Cursor picks up project skills from here** when working in the repo (same idea as Claude Code). |
| `~/.claude/skills/<name>/` | Personal skill for Claude Code across all projects. |
| `~/.cursor/skills/<name>/` | Optional personal skill for Cursor only, global to your machine. |

**Do not** put custom skills in `~/.cursor/skills-cursor/`—that is reserved for Cursor’s built-in skills.

Prefer **repo `.claude/skills/`** for anything that should match how the rest of the team works.

## Before you write: gather requirements

Ask (or infer) briefly:

1. **Purpose** — one concrete task or workflow.
2. **Triggers** — when should the agent apply this skill?
3. **Gaps** — what does the agent *not* already know (project rules, URLs, formats)?
4. **Outputs** — templates, checklists, or strict formats?
5. **Examples** — follow an existing skill in `.claude/skills/` if one fits.

Ask the user in plain language when you need more detail.

## File layout

```
skill-name/
├── SKILL.md       # required
├── reference.md   # optional — detail the agent reads only if needed
├── examples.md    # optional
└── scripts/       # optional
```

### Frontmatter (required)

```yaml
---
name: skill-name          # lowercase, hyphens, max 64 chars
description: >-         # max 1024 chars, non-empty — see below
  ...
---
```

**Description** (discovery is everything — third person, WHAT + WHEN, trigger words):

- Good: `Extracts tables from PDFs and fills forms. Use when the user works with PDFs, forms, or document extraction.`
- Bad: `Helps with documents` or `I can help you with PDFs`

## Authoring rules

1. **Concise** — assume the model is capable; only add non-obvious domain or project facts.
2. **Progressive disclosure** — essentials in `SKILL.md`; long reference in `reference.md`. Link **one level deep** from `SKILL.md`.
3. **Prefer one default** — e.g. one library or one workflow; add an escape hatch only if needed.
4. **Stable wording** — one term per concept; avoid dated “until month X” notes unless you tuck legacy bits behind a short “Deprecated” note.
5. **Paths** — forward slashes only (`scripts/foo.py`).

**Rough size:** aim for **well under ~200 lines** in `SKILL.md`; if it grows, split detail out.

### Scope: one job per skill (and parent skills)

- **Single responsibility** — one primary workflow or decision tree per skill. If triggers and steps diverge a lot (e.g. “create issue” vs “create PR” vs “full ticket → PR flow”), split into **smaller dedicated skills**.
- **Prefer small + compose** — two or three focused skills keep irrelevant detail out of context until needed. A **parent** (orchestrator) skill can say *when* to follow each child workflow and link to their `SKILL.md`; avoid pasting full child content into the parent.
- **When one large skill is OK** — a single end-to-end flow that always runs together and shares one tight checklist;

### MCPs, CLI tools, and other skills

- **Prefer CLI and repo commands** when they solve the same problem — agents handle them well and they usually add less scaffolding noise to context than MCP tool discovery and schemas. Examples: `gh` for PRs/issues, `pnpm` scripts from `AGENTS.md`.
- **MCPs are optional per user** — not everyone has the same servers enabled. If a skill **requires** a specific MCP to work as written, say so explicitly:
  - Put a hint in the **frontmatter description** (e.g. “Requires Linear MCP for …”) so mismatches are obvious early.
  - Add a short **Prerequisites** (or **Requirements**) block near the top: which integration, what it is used for, and a **fallback** (e.g. web UI, `gh`, or “ask the user to paste …”) when it is missing.
- **Referencing other skills** — give the path from the **repository root** (e.g. `.claude/skills/create-issue/SKILL.md`) so humans and tools can resolve it. From a sibling folder, a relative link works too: `[create-issue](../create-issue/SKILL.md)`. Name the skill and the task; parent skills should delegate steps instead of duplicating long procedures.

## Patterns (pick what fits)

- **Template** — give the exact output shape (markdown/code blocks).
- **Checklist** — numbered or `- [ ]` steps for multi-step work.
- **Branching** — “If A → …; if B → …” at the top of a workflow.
- **Scripts** — document run commands; say whether to **execute** or **read** the script.

## Workflow: create → verify

1. **Name + description** — hyphenated name; description with triggers.
2. **Outline** — minimal sections; link optional files.
3. **Implement** — `SKILL.md` first; add `reference.md` / `scripts/` only if they save tokens or reduce errors.
4. **Check** — third-person description; terminology consistent; no duplicate encyclopedic content the model already knows.

## Anti-patterns

- Verbose tutorials (“what is a PDF”) inside the skill.
- Many equivalent options with no default.
- Vague names (`helper`, `utils`).
- Deep chains of linked files.
- Assuming an MCP or tool is present without stating it or offering a fallback.
- One oversized skill that mixes unrelated workflows instead of smaller skills + a thin parent.

## Quick example stub

```markdown
---
name: my-workflow
description: Does X using project convention Y. Use when the user asks for X or mentions Z.
---

# My workflow

1. …
2. …

## Output format

Use a fenced code block for the exact shape reviewers should see.

## More detail
See [reference.md](reference.md) if edge cases matter.
```


================================================
FILE: .claude/skills/linear-issue/SKILL.md
================================================
---
name: linear-issue
description: Fetch and analyze Linear issue with all related context. Use when starting work on a Linear ticket, analyzing issues, or gathering context about a Linear issue.
disable-model-invocation: true
argument-hint: "[issue-id]"
compatibility:
  requires:
    - mcp: linear
      description: Core dependency — used to fetch issue details, relations, and comments
    - cli: gh
      description: GitHub CLI — used to fetch linked PRs and issues. Must be authenticated (gh auth login)
  optional:
    - mcp: notion
      description: Used to fetch linked Notion documents. Skip Notion steps if unavailable.
    - skill: loom-transcript
      description: Used to fetch Loom video transcripts. Skip Loom steps if unavailable.
    - cli: curl
      description: Used to download images/attachments. Typically pre-installed.
---

# Linear Issue Analysis

Start work on Linear issue **$ARGUMENTS**

## Prerequisites

This skill depends on external tools. Before proceeding, verify availability:

**Required:**
- **Linear MCP** (`mcp__linear`): Must be connected. Without it the skill cannot function at all.
- **GitHub CLI** (`gh`): Must be installed and authenticated. Run `gh auth status` to verify. Used to fetch linked PRs and issues.

**Optional (graceful degradation):**
- **Notion MCP** (`mcp__notion`): Needed only if the issue links to Notion docs. If unavailable, note the Notion links in the summary and tell the user to check them manually.
- **Loom transcript skill** (`/loom-transcript`): Needed only if the issue contains Loom videos. If unavailable, note the Loom links in the summary for the user to watch.
- **curl**: Used to download images. Almost always available; if missing, skip image downloads and note it.

If a required tool is missing, stop and tell the user what needs to be set up before continuing.

## Instructions

Follow these steps to gather comprehensive context about the issue:

### 1. Fetch the Issue and Comments from Linear

Use the Linear MCP tools to fetch the issue details and comments together:

- Use `mcp__linear__get_issue` with the issue ID to get full details including attachments
- Include relations to see blocking/related/duplicate issues
- **Immediately after**, use `mcp__linear__list_comments` with the issue ID to fetch all comments

Both calls should be made together in the same step to gather the complete context upfront.

### 2. Analyze Attachments and Media (MANDATORY)

**IMPORTANT:** This step is NOT optional. You MUST scan and fetch all visual content from BOTH the issue description AND all comments.

**Screenshots/Images (ALWAYS fetch):**

1. Scan the issue description AND all comments for ALL image URLs:
	- `<img>` tags
	- Markdown images `![](url)`
	- Raw URLs (github.com/user-attachments, imgur.com, etc.)
2. For EACH image found (in description or comments):
	- Download using `curl -sL "url" -o /path/to/image.png` (GitHub URLs require following redirects) OR the linear mcp
	- Use the `Read` tool on the downloaded file to view it
	- Describe what you see in detail
3. Do NOT skip images - they often contain critical context like error messages, UI states, or configuration

**Loom Videos (ALWAYS fetch transcript):**

1. Scan the issue description AND all comments for Loom URLs (loom.com/share/...)
2. For EACH Loom video found (in description or comments):
	- Use the `/loom-transcript` skill to fetch the FULL transcript
	- Summarize key points, timestamps, and any demonstrated issues
3. Loom videos often contain crucial reproduction steps and context that text alone cannot convey

### 3. Fetch Related Context

**Related Linear Issues:**
- Use `mcp__linear__get_issue` for any issues mentioned in relations (blocking, blocked by, related, duplicates)
- Summarize how they relate to the main issue

**GitHub PRs and Issues:**
- If GitHub links are mentioned, use `gh` CLI to fetch PR/issue details:
	- `gh pr view <number>` for pull requests
	- `gh issue view <number>` for issues
- Download images attached to issues: `curl -H "Authorization: token $(gh auth token)" -L <image-url> -o image.png`

**Notion Documents:**
- If Notion links are present, use `mcp__notion__notion-fetch` with the Notion URL or page ID to retrieve document content
- Summarize relevant documentation

### 4. Review Comments

Comments were already fetched in Step 1. Review them for:
- Additional context and discussion history
- Any attachments or media linked in comments (process in Step 2)
- Clarifications or updates to the original issue description

### 5. Identify Affected Node (if applicable)

Determine whether this issue is specific to a particular n8n node (e.g. a trigger, action, or tool node). Look for clues in:
- The issue title (e.g. "Linear trigger", "Slack node", "HTTP Request")
- The issue description and comments mentioning node names
- Labels or tags on the issue (e.g. `node:linear`, `node:slack`)
- Screenshots showing a specific node's configuration or error

If the issue is node-specific:

1. **Find the node type ID.** Use `Grep` to search for the node's display name (or keywords from it) in `packages/frontend/editor-ui/data/node-popularity.json` to find the exact node type ID. For reference, common ID patterns are:
   - Core nodes: `n8n-nodes-base.<camelCaseName>` (e.g. "HTTP Request" → `n8n-nodes-base.httpRequest`)
   - Trigger variants: `n8n-nodes-base.<name>Trigger` (e.g. "Gmail Trigger" → `n8n-nodes-base.gmailTrigger`)
   - Tool variants: `n8n-nodes-base.<name>Tool` (e.g. "Google Sheets Tool" → `n8n-nodes-base.googleSheetsTool`)
   - LangChain/AI nodes: `@n8n/n8n-nodes-langchain.<camelCaseName>` (e.g. "OpenAI Chat Model" → `@n8n/n8n-nodes-langchain.lmChatOpenAi`)

2. **Look up the node's popularity score** from `packages/frontend/editor-ui/data/node-popularity.json`. Use `Grep` to search for the node ID in that file. The popularity score is a log-scale value between 0 and 1. Use these thresholds to classify:

   | Score | Level | Description | Examples |
   |-------|-------|-------------|----------|
   | ≥ 0.8 | **High** | Core/widely-used nodes, top ~5% | HTTP Request (0.98), Google Sheets (0.95), Postgres (0.83), Gmail Trigger (0.80) |
   | 0.4–0.8 | **Medium** | Regularly used integrations | Slack (0.78), GitHub (0.64), Jira (0.65), MongoDB (0.63) |
   | < 0.4 | **Low** | Niche or rarely used nodes | Amqp (0.34), Wise (0.36), CraftMyPdf (0.33) |

   Include the raw score and the level (high/medium/low) in the summary.

3. If the node is **not found** in the popularity file, note that it may be a community node or a very new/niche node.

### 6. Assess Effort/Complexity

After gathering all context, assess the effort required to fix/implement the issue. Use the following T-shirt sizes:

| Size | Approximate effort |
|------|--------------------|
| XS   | ≤ 1 hour           |
| S    | ≤ 1 day            |
| M    | 2-3 days           |
| L    | 3-5 days           |
| XL   | ≥ 6 days           |

To make this assessment, consider:
- **Scope of changes**: How many files/packages need to be modified? Is it a single node fix or a cross-cutting change?
- **Complexity**: Is it a straightforward parameter change, a new API integration, a new credential type, or an architectural change?
- **Testing**: How much test coverage is needed? Are E2E tests required?
- **Risk**: Could this break existing functionality? Does it need backward compatibility?
- **Dependencies**: Are there external API changes, new packages, or cross-team coordination needed?
- **Documentation**: Does this require docs updates, migration guides, or changelog entries?

Provide the T-shirt size along with a brief justification explaining the key factors that drove the estimate.

### 7. Present Summary

**Before presenting, verify you have completed:**
- [ ] Downloaded and viewed ALL images in the description AND comments
- [ ] Fetched transcripts for ALL Loom videos in the description AND comments
- [ ] Fetched ALL linked GitHub issues/PRs via `gh` CLI
- [ ] Listed all comments on the issue
- [ ] Checked whether the issue is node-specific and looked up popularity if so
- [ ] Assessed effort/complexity with T-shirt size

After gathering all context, present a comprehensive summary including:

1. **Issue Overview**: Title, status, priority, assignee, labels
2. **Description**: Full issue description with any clarifications from comments
3. **Visual Context**: Summary of screenshots/videos (what you observed in each)
4. **Affected Node** (if applicable): Node name, node type ID (`n8n-nodes-base.xxx`), popularity score with level (e.g. `0.64 — medium popularity`)
5. **Related Issues**: How this connects to other work
6. **Technical Context**: Any PRs, code references, or documentation
7. **Effort Estimate**: T-shirt size (XS/S/M/L/XL) with justification
8. **Next Steps**: Suggested approach based on all gathered context

## Notes

- The issue ID can be provided in formats like: `AI-1975`, `node-1975`, or just `1975` (will search)
- If no issue ID is provided, ask the user for one


================================================
FILE: .claude/skills/loom-transcript/SKILL.md
================================================
---
name: loom-transcript
description: Fetch and display the full transcript from a Loom video URL. Use when the user wants to get or read a Loom transcript.
argument-hint: [loom-url]
---

# Loom Transcript Fetcher

Fetch the transcript from a Loom video using Loom's GraphQL API.

## Instructions

Given the Loom URL: $ARGUMENTS

### 1. Extract the Video ID

Parse the Loom URL to extract the 32-character hex video ID. Supported URL formats:
- `https://www.loom.com/share/<video-id>`
- `https://www.loom.com/embed/<video-id>`
- `https://www.loom.com/share/<video-id>?sid=<session-id>`

The video ID is the 32-character hex string after `/share/` or `/embed/`.

### 2. Fetch Video Metadata

Use the `WebFetch` tool to POST to `https://www.loom.com/graphql` to get the video title and details.

Use this curl command via Bash:

```bash
curl -s 'https://www.loom.com/graphql' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-loom-request-source: loom_web_45a5bd4' \
  -H 'apollographql-client-name: web' \
  -H 'apollographql-client-version: 45a5bd4' \
  -d '{
    "operationName": "GetVideoSSR",
    "variables": {"id": "<VIDEO_ID>", "password": null},
    "query": "query GetVideoSSR($id: ID!, $password: String) { getVideo(id: $id, password: $password) { ... on RegularUserVideo { id name description createdAt owner { display_name } } } }"
  }'
```

### 3. Fetch the Transcript URLs

Use curl via Bash to call the GraphQL API:

```bash
curl -s 'https://www.loom.com/graphql' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H 'x-loom-request-source: loom_web_45a5bd4' \
  -H 'apollographql-client-name: web' \
  -H 'apollographql-client-version: 45a5bd4' \
  -d '{
    "operationName": "FetchVideoTranscript",
    "variables": {"videoId": "<VIDEO_ID>", "password": null},
    "query": "query FetchVideoTranscript($videoId: ID!, $password: String) { fetchVideoTranscript(videoId: $videoId, password: $password) { ... on VideoTranscriptDetails { id video_id source_url captions_source_url } ... on GenericError { message } } }"
  }'
```

Replace `<VIDEO_ID>` with the actual video ID extracted in step 1.

The response contains:
- `source_url` — JSON transcript URL
- `captions_source_url` — VTT (WebVTT) captions URL

### 4. Download and Parse the Transcript

Fetch **both** URLs returned from step 3 (if available):

1. **VTT captions** (`captions_source_url`): Download with `curl -sL "<url>"`. This is a WebVTT file with timestamps and text.
2. **JSON transcript** (`source_url`): Download with `curl -sL "<url>"`. This is a JSON file with transcript segments.

Prefer the VTT captions as the primary source since they include proper timestamps. Fall back to the JSON transcript if VTT is unavailable.

### 5. Present the Transcript

Format and present the full transcript to the user:

**Video:** [Title from metadata]
**Author:** [Owner name]
**Date:** [Created date]

---

**0:00** - First transcript segment text...

**0:14** - Second transcript segment text...

(continue for all segments)

---

## Error Handling

- If the GraphQL response contains a `GenericError`, report the error message to the user.
- If both `source_url` and `captions_source_url` are null/missing, tell the user that no transcript is available for this video.
- If the video URL is invalid or the ID cannot be extracted, ask the user for a valid Loom URL.

## Notes

- No authentication or cookies are required — Loom's transcript API is publicly accessible.
- Only English transcripts are available through this API.
- Transcripts are auto-generated and may contain minor errors.

================================================
FILE: .claude/skills/n8n-conventions/SKILL.md
================================================
---
name: n8n-conventions
description: Quick reference for n8n patterns. Full docs /AGENTS.md
---

# n8n Quick Reference

**📚 Full Documentation:**
- **General:** `/AGENTS.md` - Architecture, commands, workflows
- **Frontend:** `/packages/frontend/AGENTS.md` - CSS variables, timing

Use this skill when you need quick reminders on critical patterns.

## Critical Rules (Must Follow)

**TypeScript:**
- Never `any` → use `unknown`
- Prefer `satisfies` over `as` (except tests)
- Shared types in `@n8n/api-types`

**Error Handling:**
```typescript
import { UnexpectedError } from 'n8n-workflow';
throw new UnexpectedError('message', { extra: { context } });
// DON'T use deprecated ApplicationError
```

**Frontend:**
- Vue 3 Composition API (`<script setup lang="ts">`)
- CSS variables (never hardcode px) - see `/packages/frontend/AGENTS.md`
- All text via i18n (`$t('key')`)
- `data-testid` for E2E (single value, no spaces)

**Backend:**
- Controller → Service → Repository
- Dependency injection via `@n8n/di`
- Config via `@n8n/config`
- Zod schemas for validation

**Testing:**
- Vitest (unit), Playwright (E2E)
- Mock external dependencies
- Work from package directory: `pushd packages/cli && pnpm test`

**Database:**
- SQLite/PostgreSQL only (app DB)
- Exception: DB nodes (MySQL Node, etc.) can use DB-specific features

**Commands:**
```bash
pnpm build > build.log 2>&1  # Always redirect
pnpm typecheck               # Before commit
pnpm lint                    # Before commit
```

## Key Packages

| Package | Purpose |
|---------|---------|
| `packages/cli` | Backend API |
| `packages/frontend/editor-ui` | Vue 3 frontend |
| `packages/@n8n/api-types` | Shared types |
| `packages/@n8n/db` | TypeORM entities |
| `packages/workflow` | Core interfaces |

## Common Patterns

**Pinia Store:**
```typescript
import { STORES } from '@n8n/stores';
export const useMyStore = defineStore(STORES.MY_STORE, () => {
  const state = shallowRef([]);
  return { state };
});
```

**Vue Component:**
```vue
<script setup lang="ts">
type Props = { title: string };
const props = defineProps<Props>();
</script>
```

**Service:**
```typescript
import { Service } from '@n8n/di';
import { Config } from '@n8n/config';

@Service()
export class MyService {
  constructor(private readonly config: Config) {}
}
```

---

📖 **Need more details?** Read `/AGENTS.md` and `/packages/frontend/AGENTS.md`


================================================
FILE: .claude/skills/node-add-oauth/SKILL.md
================================================
---
name: node-add-oauth
description: Add OAuth2 credential support to an existing n8n node — creates the credential file, updates the node, adds tests, and keeps the CLI constant in sync. Use when the user says /node-add-oauth.
argument-hint: "[node-name] [optional: custom-scopes flag or scope list]"
---

## Overview

Add OAuth2 (Authorization Code / 3LO) support to an existing n8n node. Works for any
third-party service that supports standard OAuth2.

Before starting, read comparable existing OAuth2 credential files and tests under
`packages/nodes-base/credentials/` to understand the conventions used in this codebase
(e.g. `DiscordOAuth2Api.credentials.ts`, `MicrosoftTeamsOAuth2Api.credentials.ts`).

---

## Step 0 — Parse arguments

Extract:
- `NODE_NAME`: the service name (e.g. `GitHub`, `Notion`). Try to infer from the argument;
  if ambiguous, ask the user.
- `CUSTOM_SCOPES`: whether the credential should support user-defined scopes. If the
  argument does not make this clear, **ask the user** before proceeding:
  > "Should users be able to customise the OAuth2 scopes for this credential, or should
  > scopes be fixed?"

---

## Step 1 — Explore the node

Read the following (adjust path conventions for the specific service):

1. Node directory: `packages/nodes-base/nodes/{NODE_NAME}/`
   - Find `*.node.ts` (main node) and any `*Trigger.node.ts`
   - Find `GenericFunctions.ts` (may be named differently)
   - Check if an `auth` / `version` subdirectory exists
2. Existing credentials: `packages/nodes-base/credentials/` — look for existing
   `{NODE_NAME}*Api.credentials.ts` files to understand the naming convention and any
   auth method already in use.
3. `package.json` at `packages/nodes-base/package.json` — find where existing credentials
   for this node are registered (grep for the node name).

---

## Step 2 — Research OAuth2 endpoints

Look up the service's OAuth2 documentation:
- Authorization URL
- Access Token URL
- Required auth query parameters (e.g. `prompt=consent`, `access_type=offline`)
- Default scopes needed for the node's existing operations
- Whether the API requires a cloudId / workspace ID lookup after the token exchange
  (Atlassian-style gateway APIs do; most services don't)

If you can't determine the endpoints confidently, ask the user to provide them.

---

## Step 3 — Create the credential file

File: `packages/nodes-base/credentials/{NODE_NAME}OAuth2Api.credentials.ts`

```typescript
import type { ICredentialType, INodeProperties } from 'n8n-workflow';

const defaultScopes = [/* minimum scopes for existing node operations */];

export class {NODE_NAME}OAuth2Api implements ICredentialType {
	name = '{camelCase}OAuth2Api';
	extends = ['oAuth2Api'];
	displayName = '{Display Name} OAuth2 API';
	documentationUrl = '{doc-slug}'; // matches docs.n8n.io/integrations/...

	properties: INodeProperties[] = [
		// Include service-specific fields the node needs to construct API calls
		// (e.g. domain, workspace URL) — add BEFORE the hidden fields below.

		{ displayName: 'Grant Type',        name: 'grantType',      type: 'hidden', default: 'authorizationCode' },
		{ displayName: 'Authorization URL', name: 'authUrl',        type: 'hidden', default: '{AUTH_URL}', required: true },
		{ displayName: 'Access Token URL',  name: 'accessTokenUrl', type: 'hidden', default: '{TOKEN_URL}', required: true },
		// Only include authQueryParameters if the service requires extra query params:
		{ displayName: 'Auth URI Query Parameters', name: 'authQueryParameters', type: 'hidden', default: '{QUERY_PARAMS}' },
		{ displayName: 'Authentication',    name: 'authentication', type: 'hidden', default: 'header' },

		// ── Custom scopes block (ONLY when CUSTOM_SCOPES = yes) ──────────────
		{
			displayName: 'Custom Scopes',
			name: 'customScopes',
			type: 'boolean',
			default: false,
			description: 'Define custom scopes',
		},
		{
			displayName:
				'The default scopes needed for the node to work are already set. If you change these the node may not function correctly.',
			name: 'customScopesNotice',
			type: 'notice',
			default: '',
			displayOptions: { show: { customScopes: [true] } },
		},
		{
			displayName: 'Enabled Scopes',
			name: 'enabledScopes',
			type: 'string',
			displayOptions: { show: { customScopes: [true] } },
			default: defaultScopes.join(' '),
			description: 'Scopes that should be enabled',
		},
		// ── End custom scopes block ───────────────────────────────────────────

		{
			displayName: 'Scope',
			name: 'scope',
			type: 'hidden',
			// Custom scopes: expression toggles between user value and defaults.
			// Fixed scopes: use the literal defaultScopes string instead.
			default:
				'={{$self["customScopes"] ? $self["enabledScopes"] : "' + defaultScopes.join(' ') + '"}}',
		},
	];
}
```

**Rules:**
- No `authenticate` block — `oAuth2Api` machinery handles Bearer token injection automatically.
- No `test` block — the OAuth dance validates the credential.
- `defaultScopes` at module level is the single source of truth: it populates both the
  `enabledScopes` default and the `scope` expression fallback. Update it in one place.
- If the service needs a domain / workspace URL for API call construction, add it as a
  visible `string` field **before** the hidden fields.

---

## Step 4 — Register the credential in `package.json`

File: `packages/nodes-base/package.json`

Find the `n8n.credentials` array and insert the new entry near other credentials for this
service (alphabetical ordering within the service's block):

```json
"dist/credentials/{NODE_NAME}OAuth2Api.credentials.js",
```

---

## Step 5 — Update `GENERIC_OAUTH2_CREDENTIALS_WITH_EDITABLE_SCOPE` (custom scopes only)

**Only do this step when CUSTOM_SCOPES = yes.**

File: `packages/cli/src/constants.ts`

Add `'{camelCase}OAuth2Api'` to the `GENERIC_OAUTH2_CREDENTIALS_WITH_EDITABLE_SCOPE`
array. Without this, n8n deletes the user's custom scope on OAuth2 reconnect.

```typescript
export const GENERIC_OAUTH2_CREDENTIALS_WITH_EDITABLE_SCOPE = [
	'oAuth2Api',
	'googleOAuth2Api',
	'microsoftOAuth2Api',
	'highLevelOAuth2Api',
	'mcpOAuth2Api',
	'{camelCase}OAuth2Api', // ← add this
];
```

---

## Step 6 — Update `GenericFunctions.ts`

### 6a — Standard services (token works directly against the instance URL)

Add an `else if` branch before the existing `else` fallback:

```typescript
} else if ({versionParam} === '{camelCase}OAuth2') {
	domain = (await this.getCredentials('{camelCase}OAuth2Api')).{domainField} as string;
	credentialType = '{camelCase}OAuth2Api';
} else {
```

### 6b — Gateway services requiring a workspace/cloud ID lookup

When the OAuth token is scoped for a gateway URL rather than the direct instance URL
(Atlassian's `api.atlassian.com` is the canonical example), add a module-level cache and
lookup helper **before** the main request function:

```typescript
// Module-level cache: normalised domain → site/cloud ID
export const _cloudIdCache = new Map<string, string>();

async function getSiteId(
	this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions,
	credentialType: string,
	domain: string,
): Promise<string> {
	const normalizedDomain = domain.replace(/\/$/, '');
	if (_cloudIdCache.has(normalizedDomain)) return _cloudIdCache.get(normalizedDomain)!;

	const resources = (await this.helpers.requestWithAuthentication.call(this, credentialType, {
		uri: '{ACCESSIBLE_RESOURCES_ENDPOINT}',
		json: true,
	})) as Array<{ id: string; url: string }>;

	const site = resources.find((r) => r.url === normalizedDomain);
	if (!site) {
		throw new NodeOperationError(
			this.getNode(),
			`No accessible site found for domain: ${domain}. Make sure the domain matches your site URL exactly.`,
		);
	}

	_cloudIdCache.set(normalizedDomain, site.id);
	return site.id;
}
```

Then in the main request function:

```typescript
} else if ({versionParam} === '{camelCase}OAuth2') {
	const rawDomain = (await this.getCredentials('{camelCase}OAuth2Api')).domain as string;
	credentialType = '{camelCase}OAuth2Api';
	const siteId = await getSiteId.call(this, credentialType, rawDomain);
	domain = `{GATEWAY_BASE_URL}/${siteId}`;
} else {
```

The existing `uri: \`${domain}/rest${endpoint}\`` construction then produces the correct
gateway URL automatically.

Add `NodeOperationError` to the `n8n-workflow` import if not already present.

---

## Step 7 — Update the node file(s)

### Main node (`*.node.ts`)

**Credentials array** — add an entry for the new credential type:

```typescript
{
	name: '{camelCase}OAuth2Api',
	required: true,
	displayOptions: { show: { {versionParam}: ['{camelCase}OAuth2'] } },
},
```

**Version/auth options** — add to the `{versionParam}` (or equivalent) options list:

```typescript
{ name: '{Display Name} (OAuth2)', value: '{camelCase}OAuth2' },
```

Keep `default` unchanged — existing workflows must not be affected.

### Trigger node (`*Trigger.node.ts`, if present)

Same two changes. Preserve any `displayName` label pattern already used by other credential
entries in that trigger node's credentials array.

---

## Step 8 — Write credential tests

File: `packages/nodes-base/credentials/test/{NODE_NAME}OAuth2Api.credentials.test.ts`

Use `ClientOAuth2` from `@n8n/client-oauth2` and `nock` for HTTP mocking. Follow the
structure in `MicrosoftTeamsOAuth2Api.credentials.test.ts`.

Required test cases:
1. **Metadata** — name, extends array, `enabledScopes` default, auth URL, token URL,
   `authQueryParameters` default (if applicable).
2. **Default scopes in authorization URI** — call `oauthClient.code.getUri()`, assert each
   default scope is present.
3. **Token retrieval with default scopes** — mock the token endpoint with `nock`, call
   `oauthClient.code.getToken(...)`, assert `token.data.scope` contains each scope.
4. **Custom scopes in authorization URI** _(skip when CUSTOM_SCOPES = no)_.
5. **Token retrieval with custom scopes** _(skip when CUSTOM_SCOPES = no)_.
6. **Minimal / different scope set** _(skip when CUSTOM_SCOPES = no)_ — assert scopes not
   in the set are absent from both the URI and token response.

Lifecycle hooks required:
```typescript
beforeAll(() => { nock.disableNetConnect(); });
afterAll(() => { nock.restore(); });
afterEach(() => { nock.cleanAll(); });
```

---

## Step 9 — Update `GenericFunctions.test.ts`

In the credential-routing `describe` block:

1. If a site-ID cache (`_cloudIdCache`) was added, import it and call
   `_cloudIdCache.clear()` (or equivalent) in `afterEach`.
2. Add/update the OAuth2 routing test case:
   - **Simple routing**: assert `getCredentials` was called with the correct credential
     name and `requestWithAuthentication` was called with the correct name and URI.
   - **Gateway lookup**: mock `requestWithAuthentication` to return the accessible-resources
     payload on the first call and `{}` on the second. Assert the first call targets the
     resources endpoint and the second call uses the gateway base URL with the site ID.

---

## Step 10 — Verify

```bash
# From packages/nodes-base/
pnpm test credentials/test/{NODE_NAME}OAuth2Api.credentials.test.ts
pnpm test nodes/{NODE_NAME}/__test__/GenericFunctions.test.ts
pnpm typecheck
pnpm lint

# Only when constants.ts was changed:
pushd ../cli && pnpm typecheck && popd
```

Fix any type errors before finishing. Never skip `pnpm typecheck`.


================================================
FILE: .claude/skills/reproduce-bug/SKILL.md
================================================
---
name: reproduce-bug
description: Reproduce a bug from a Linear ticket with a failing test. Expects the full ticket context (title, description, comments) to be provided as input.
user_invocable: true
---

# Bug Reproduction Framework

Given a Linear ticket context ($ARGUMENTS), systematically reproduce the bug
with a failing regression test.

## Step 1: Parse Signals

Extract the following from the provided ticket context:
- **Error message / stack trace** (if provided)
- **Reproduction steps** (if provided)
- **Workflow JSON** (if attached)
- **Affected area** (node, execution engine, editor, API, config, etc.)
- **Version where it broke / last working version**


## Step 2: Route to Test Strategy

Based on the affected area, pick the test layer and pattern:

| Area | Test Layer | Pattern | Key Location |
|------|-----------|---------|--------------|
| Node operation | Jest unit | NodeTestHarness + nock | `packages/nodes-base/nodes/*/test/` |
| Node credential | Jest unit | jest-mock-extended | `packages/nodes-base/nodes/*/test/` |
| Trigger webhook | Jest unit | mock IHookFunctions + jest.mock GenericFunctions | `packages/nodes-base/nodes/*/test/` |
| Binary data | Jest unit | NodeTestHarness assertBinaryData | `packages/core/nodes-testing/` |
| Execution engine | Jest integration | WorkflowRunner + DI container | `packages/cli/src/__tests__/` |
| CLI / API | Jest integration | setupTestServer + supertest | `packages/cli/test/integration/` |
| Config | Jest unit | GlobalConfig + Container | `packages/@n8n/config/src/__tests__/` |
| Editor UI | Vitest | Vue Test Utils + Pinia | `packages/frontend/editor-ui/src/**/__tests__/` |
| E2E / Canvas | Playwright | Test containers + composables | `packages/testing/playwright/` |

## Step 3: Locate Source Files

Find the source code for the affected area:
1. Search for the node/service/component mentioned in the ticket
2. Find the GenericFunctions file (common bug location for nodes)
3. Check for existing test files in the same area
4. Look at recent git history on affected files (`git log --oneline -10 -- <path>`)

## Step 4: Trace the Code Path

Read the source code and trace the execution path that triggers the bug:
- Follow the call chain from entry point to the failure
- Identify the specific line(s) where the bug manifests
- Note any error handling (or lack thereof) around the bug

## Step 5: Form Hypothesis

State a clear, testable hypothesis:
- "When [input/condition], the code does [wrong thing] because [root cause]"
- Identify the exact line(s) that need to change
- Predict what the test output will show

## Step 6: Find Test Patterns

Look for existing tests in the same area:
1. Check `test/` directories near the affected code
2. Identify which mock/setup patterns they use
3. Use the same patterns for consistency
4. If no tests exist, find the closest similar node/service tests as a template

## Step 7: Write Failing Test

Write a regression test that:
- Uses the patterns found in Step 6
- Targets the specific hypothesis from Step 5
- Includes a comment referencing the ticket ID
- Asserts the CORRECT behavior (test will fail on current code)
- Also includes a "happy path" test to prove the setup works

## Step 8: Run and Score

Run the test from the package directory (e.g., `cd packages/nodes-base && pnpm test <file>`).

Classify the result:

| Confidence | Criteria | Output |
|------------|----------|--------|
| **CONFIRMED** | Test fails consistently, failure matches hypothesis | Reproduction Report |
| **LIKELY** | Test fails but failure mode differs slightly | Report + caveat |
| **UNCONFIRMED** | Cannot trigger the failure | Report: what was tried |
| **SKIPPED** | Hit a hard bailout trigger | Report: why skipped |
| **ALREADY_FIXED** | Bug no longer reproduces on current code | Report: when fixed |

## Step 9: Iterate or Bail

If UNCONFIRMED after first attempt:
- Revisit hypothesis — re-read the code path
- Try a different test approach or layer
- Maximum 3 attempts before declaring UNCONFIRMED

**Hard bailout triggers** (stop immediately):
- Requires real third-party API credentials
- Race condition / timing-dependent
- Requires specific cloud/enterprise infrastructure
- Requires manual UI interaction that can't be scripted

## Output: Reproduction Report

Present findings in this format:

---

**Ticket:** [ID] — [title]
**Confidence:** [CONFIRMED | LIKELY | UNCONFIRMED | SKIPPED | ALREADY_FIXED]

### Root Cause
[1-2 sentences explaining the bug mechanism]

### Location
| File | Lines | Issue |
|------|-------|-------|
| `path/to/file.ts` | XX-YY | Description of the problem |

### Failing Test
`path/to/test/file.test.ts` — X/Y tests fail:
1. `test name` — [failure description]

### Fix Hint
[Pseudocode or description of the fix approach]

---

## Important

- **DO NOT fix the bug** — only reproduce it with a failing test
- **Leave test files in place** as evidence (don't commit unless asked)
- **Run tests from the package directory** (e.g., `pushd packages/nodes-base && pnpm test <file> && popd`)
- **Always redirect build output**: `pnpm build > build.log 2>&1`
- **DO NOT look at existing fix PRs** — the goal is to reproduce from signals alone


================================================
FILE: .claude/skills/spec-driven-development/SKILL.md
================================================
---
name: spec-driven-development
description: Keeps implementation and specs in sync. Use when working on a feature that has a spec in .claude/specs/, when the user says /spec, or when starting implementation of a documented feature. Also use when the user asks to verify implementation against a spec or update a spec after changes.
---

# Spec-Driven Development

Specs live in `.claude/specs/`. They are the source of truth for architectural
decisions, API contracts, and implementation scope. Implementation and specs
must stay in sync — neither leads exclusively.

## Core Loop

```
Read spec → Implement → Verify alignment → Update spec or code → Repeat
```

## Before Starting Work

1. **Find the spec.** Search `.claude/specs/` for files matching the feature:

```bash
ls .claude/specs/
```

2. **Read the full spec.** Understand scope, decisions, API contracts, and
   open questions before writing code.

3. **If no spec exists** and the task is non-trivial (new module, new API,
   architectural change), ask the user whether to create one first.

## During Implementation

- **Reference spec decisions** — don't re-decide what the spec already settled.
- **When you diverge from the spec** (better approach found, user requested
  change, constraint discovered), update the spec immediately in the same
  session. Don't leave spec and code out of sync.
- **Tick off TODO checkboxes** (`- [ ]` → `- [x]`) as items are completed.
- **Strike through or annotate** items that were deliberately skipped or
  replaced, with a brief reason:
  ```markdown
  - [x] ~~OpenRouter proxy~~ → Direct execution: nodes call OpenRouter directly
  ```

## After Completing Work

Run a spec verification pass:

1. **Re-read the spec** alongside the implementation.
2. **Check each section:**
   - Do API endpoints in spec match the controller?
   - Do config/env vars in spec match the config class?
   - Does the module structure in spec match the actual file tree?
   - Do type definitions in spec match `@n8n/api-types`?
   - Are all TODO items correctly checked/unchecked?
3. **Update the spec** for any drift found. Common drift:
   - New files added that aren't listed in the structure section
   - API response shapes changed during implementation
   - Config defaults adjusted
   - Architectural decisions refined
4. **Flag unresolved gaps** to the user — things the spec promises but
   implementation doesn't deliver yet (acceptable for MVP, but should be noted).

## Spec File Conventions

- One or more markdown files per feature in `.claude/specs/`.
- Keep specs concise. Use tables for mappings, code blocks for shapes.
- Use `## Implementation TODO` with checkboxes to track progress.
- Split into multiple files when it helps (e.g. separate backend/frontend),
  but don't enforce a rigid naming scheme.

## When the User Asks to "Self-Review" or "Verify Against Spec"

1. Read all relevant specs.
2. Read all implementation files.
3. Produce a structured comparison:
   - **Aligned**: items where spec and code match
   - **Drift**: items where they diverge (fix immediately)
   - **Gaps**: spec items not yet implemented (note as future work)
4. Fix drift, update specs, report gaps to the user.


================================================
FILE: .devcontainer/Dockerfile
================================================
ARG NODE_VERSION=24

FROM node:${NODE_VERSION}-alpine

ARG NODE_VERSION

RUN apk add --no-cache \
    openssh sudo shadow bash libc-utils \
    git openssl graphicsmagick tini tzdata ca-certificates libc6-compat
RUN echo node ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/node && chmod 0440 /etc/sudoers.d/node
RUN mkdir /workspaces && chown node:node /workspaces
RUN corepack enable

USER node
RUN mkdir -p ~/.pnpm-store && pnpm config set store-dir ~/.pnpm-store --global


================================================
FILE: .devcontainer/devcontainer.json
================================================
{
	"name": "n8n",
	"dockerComposeFile": "docker-compose.yml",
	"service": "n8n",
	"workspaceFolder": "/workspaces",
	"mounts": [
		"type=bind,source=${localWorkspaceFolder},target=/workspaces,consistency=cached",
		"type=bind,source=${localEnv:HOME}/.ssh,target=/home/node/.ssh,consistency=cached",
		"type=bind,source=${localEnv:HOME}/.n8n,target=/home/node/.n8n,consistency=cached"
	],
	"forwardPorts": [8080, 5678],
	"postCreateCommand": "corepack prepare --activate && pnpm install",
	"postAttachCommand": "pnpm build",
	"customizations": {
		"codespaces": {
			"openFiles": ["CONTRIBUTING.md"]
		}
	}
}


================================================
FILE: .devcontainer/docker-compose.yml
================================================
volumes:
  postgres-data:

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=n8n
      - POSTGRES_PASSWORD=password

  n8n:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ..:/workspaces:cached
    command: sleep infinity
    environment:
      DB_POSTGRESDB_HOST: postgres
      DB_TYPE: postgresdb
      DB_POSTGRESDB_PASSWORD: password


================================================
FILE: .dockerignore
================================================
# Whitelist approach: ignore everything, then allow only what Docker builds need
# This reduces build context from ~900MB to just what's required

# Ignore everything first
*

# === n8n main image (docker/images/n8n/Dockerfile) ===
!compiled
!compiled/**
!THIRD_PARTY_LICENSES.md

# === runners image (docker/images/runners/Dockerfile + Dockerfile.distroless) ===
!dist
!dist/task-runner-javascript
!dist/task-runner-javascript/**
!packages
!packages/@n8n
!packages/@n8n/task-runner-python
!packages/@n8n/task-runner-python/**

# === Docker build files (entrypoints, configs) ===
!docker
!docker/images
!docker/images/n8n
!docker/images/n8n/docker-entrypoint.sh
!docker/images/runners
!docker/images/runners/n8n-task-runners.json

# === benchmark image (packages/@n8n/benchmark/Dockerfile) ===
!package.json
!pnpm-lock.yaml
!pnpm-workspace.yaml
!patches
!patches/**
!scripts
!scripts/**
!packages/@n8n/benchmark
!packages/@n8n/benchmark/**
!packages/@n8n/typescript-config
!packages/@n8n/typescript-config/**


================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
indent_style = tab
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[package.json]
indent_style = space
indent_size = 2

[*.yml]
indent_style = space
indent_size = 2

[*.ts]
quote_type = single


================================================
FILE: .git-blame-ignore-revs
================================================
# Commits of large-scale changes to exclude from `git blame` results

# Set up linting and formatting (#2120)

56c4c6991fb21ba4b7bdcd22c929f63cc1d1defe

# refactor(editor): Apply Prettier (no-changelog) #4920

5ca2148c7ed06c90f999508928b7a51f9ac7a788

# refactor: Run lintfix (no-changelog) (#7537)

62c096710fab2f7e886518abdbded34b55e93f62

# refactor: Move test files alongside tested files (#11504)

7e58fc4fec468aca0b45d5bfe6150e1af632acbc
f32b13c6ed078be042a735bc8621f27e00dc3116


================================================
FILE: .gitattributes
================================================
*.sh text eol=lf


================================================
FILE: .github/CI-TELEMETRY.md
================================================
# CI Telemetry

Pipeline: **GitHub Actions → Webhook → n8n → BigQuery**

## Unified Payload Shape

All telemetry uses the same format:

```json
{
  "timestamp": "2026-03-16T12:00:00.000Z",
  "benchmark_name": "kafka-throughput-10n-10kb",
  "git":    { "sha": "abc12345", "branch": "master", "pr": null },
  "ci":     { "runId": "123", "runUrl": "...", "job": "test", "workflow": "CI", "attempt": 1 },
  "runner": { "provider": "blacksmith", "cpuCores": 8, "memoryGb": 16.0 },
  "metrics": [
    { "metric_name": "exec-per-sec", "value": 12.4, "unit": "exec/s", "dimensions": { "trigger": "kafka", "nodes": 10 } }
  ]
}
```

## Standard Context Fields

```typescript
git.sha         // GITHUB_SHA (first 8 chars)
git.branch      // GITHUB_HEAD_REF ?? GITHUB_REF_NAME
git.pr          // PR number from GITHUB_REF

ci.runId        // GITHUB_RUN_ID
ci.runUrl       // https://github.com/<repo>/actions/runs/<runId>
ci.job          // GITHUB_JOB
ci.workflow     // GITHUB_WORKFLOW
ci.attempt      // GITHUB_RUN_ATTEMPT

runner.provider  // 'github' | 'blacksmith' | 'local'
runner.cpuCores  // os.cpus().length
runner.memoryGb  // os.totalmem()
```

**Runner provider logic:**
```typescript
if (!process.env.CI) return 'local';
if (process.env.RUNNER_ENVIRONMENT === 'github-hosted') return 'github';
return 'blacksmith';
```

## Implementations

| Telemetry | Source | Metrics |
|-----------|--------|---------|
| Playwright perf/benchmark | `packages/testing/playwright/reporters/metrics-reporter.ts` | Any metric attached via `attachMetric()` |
| Build stats | `.github/scripts/send-build-stats.mjs` | Per-package build duration, cache hit/miss, run total |
| Docker stats | `.github/scripts/send-docker-stats.mjs` | Image size per platform, docker build duration |
| Container stack | `packages/testing/containers/telemetry.ts` | E2E stack startup times per service |

## Secrets

```
QA_METRICS_WEBHOOK_URL
QA_METRICS_WEBHOOK_USER
QA_METRICS_WEBHOOK_PASSWORD
```

## BigQuery Table

`qa_performance_metrics` — schema:

```sql
timestamp        TIMESTAMP NOT NULL
benchmark_name   STRING
metric_name      STRING NOT NULL
value            FLOAT64 NOT NULL
unit             STRING
dimensions       JSON                 -- {"nodes": 10, "trigger": "kafka", "package": "@n8n/cli"}
git_sha          STRING
git_branch       STRING
git_pr           INT64
ci_run_id        STRING
ci_run_url       STRING
ci_job           STRING
ci_workflow      STRING
ci_attempt       INT64
runner_provider  STRING
runner_cpu_cores INT64
runner_memory_gb FLOAT64
```

Query example:
```sql
-- Build duration trend by package (cache misses only)
SELECT DATE(timestamp), JSON_VALUE(dimensions, '$.package'), AVG(value)
FROM qa_performance_metrics
WHERE metric_name = 'build-duration'
  AND JSON_VALUE(dimensions, '$.cache') = 'miss'
GROUP BY 1, 2 ORDER BY 1;
```

## Adding New Telemetry

**From a script:**
```javascript
import { sendMetrics, metric } from './send-metrics.mjs';

await sendMetrics([
  metric('my-metric', 42.0, 'ms', { context: 'value' }),
]);
```

**From a Playwright test:**
```typescript
import { attachMetric } from '../utils/performance-helper';

await attachMetric(testInfo, 'my-metric', 42.0, 'ms', { context: 'value' });
```


================================================
FILE: .github/CLAUDE.md
================================================
@../AGENTS.md

## .github Quick Reference

This folder contains n8n's GitHub Actions infrastructure.

### Key Files

| File/Folder | Purpose |
|-------------|---------|
| `WORKFLOWS.md` | Complete CI/CD documentation |
| `workflows/` | GitHub Actions workflows |
| `actions/` | Reusable composite actions |
| `scripts/` | Release & Docker automation |
| `CODEOWNERS` | Team review ownership |

### Workflow Naming

| Prefix | Purpose |
|--------|---------|
| `test-` | Testing (unit, E2E, visual) |
| `ci-` | Continuous integration |
| `util-` | Utilities (notifications) |
| `build-` | Build processes |
| `release-` | Release automation |
| `sec-` | Security scanning |

Reusable workflows: add `-reusable` or `-callable` suffix.

### Common Tasks

**Add workflow:** Create in `workflows/`, document in `WORKFLOWS.md`

**Add script:** Create `.mjs` in `scripts/`, document in `WORKFLOWS.md`

### Reference

See `WORKFLOWS.md` for:
- Architecture diagrams
- Workflow call graph
- Scheduled jobs & triggers
- Runners & secrets


================================================
FILE: .github/CODEOWNERS
================================================
packages/@n8n/db/src/migrations/ @n8n-io/migrations-review
.github/workflows @n8n-io/ci-admins
.github/scripts @n8n-io/ci-admins
.github/actions @n8n-io/ci-admins
.github/poutine-rules @n8n-io/ci-admins



================================================
FILE: .github/ISSUE_TEMPLATE/01-bug.yml
================================================
name: Bug Report
description: Create a bug report to help us improve
body:
  - type: markdown
    attributes:
      value: |
        > ⚠️ This form is for reporting bugs only.
        > ❌ Please do not use this form for general support, feature requests, or questions.
        > 💬 For help and general inquiries, visit our [community support forum](https://community.n8n.io).
        > ☁️ If you're experiencing issues with cloud instances not starting or license-related problems, contact [n8n support directly](mailto:help@n8n.io).
        ---
        Thank you for helping us improve n8n!
        To ensure we can address your report efficiently, please fill out all sections in English and provide as much detail as possible.
  - type: textarea
    id: description
    attributes:
      label: Bug Description
      description: A clear and concise description of what the bug is
      placeholder: Tell us what you see!
    validations:
      required: true
  - type: textarea
    id: reproduction
    attributes:
      label: To Reproduce
      description: Steps to reproduce the behavior
      placeholder: |
        1. Go to '...'
        2. Click on '....'
        3. Scroll down to '....'
        4. See error
    validations:
      required: true
  - type: textarea
    id: expected
    attributes:
      label: Expected behavior
      description: A clear and concise description of what you expected to happen
    validations:
      required: true
  - type: textarea
    id: debug-info
    attributes:
      label: Debug Info
      description: This can be found under Help > About n8n > Copy debug information
    validations:
      required: true
  - type: markdown
    attributes:
      value: '## Environment'
  - type: input
    id: os
    attributes:
      label: Operating System
      placeholder: ex. Ubuntu Linux 22.04
    validations:
      required: true
  - type: input
    id: n8n-version
    attributes:
      label: n8n Version
      placeholder: ex. 1.25.0
    validations:
      required: true
  - type: input
    id: nodejs-version
    attributes:
      label: Node.js Version
      placeholder: ex. 24.0.0
    validations:
      required: true
  - type: dropdown
    id: db
    attributes:
      label: Database
      options:
        - SQLite (default)
        - PostgreSQL
      default: 0
    validations:
      required: true
  - type: dropdown
    id: execution-mode
    attributes:
      label: Execution mode
      description: '[Info](https://docs.n8n.io/hosting/scaling/queue-mode/)'
      options:
        - main (default)
        - queue
        - own (deprecated)
      default: 0
    validations:
      required: true
  - type: dropdown
    id: hosting
    attributes:
      label: Hosting
      options:
        - n8n cloud
        - self hosted
      default: 0
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Feature request
    url: https://community.n8n.io
    about: Suggest an idea for this project
  - name: Question / Problem
    url: https://community.n8n.io
    about: Questions and problems with n8n
  - name: n8n Security Vulnerability
    url: https://n8n.io/legal/#vulnerability
    about: Learn about our Vulnerability Disclosure Policy


================================================
FILE: .github/WORKFLOWS.md
================================================
# GitHub Actions & CI/CD Documentation

Complete reference for n8n's `.github/` folder.

---

## Folder Structure

```
.github/
├── WORKFLOWS.md                          # This document
├── CI-TELEMETRY.md                       # Telemetry & metrics guide
├── CODEOWNERS                            # Team ownership for PR reviews
├── pull_request_template.md              # PR description template
├── pull_request_title_conventions.md     # Title format rules (Angular)
├── actionlint.yml                        # Workflow linter config
├── docker-compose.yml                    # DB services for local testing
├── test-metrics/
│   └── playwright.json                   # E2E performance baselines
├── ISSUE_TEMPLATE/
│   ├── config.yml                        # Routes to community/security
│   └── 01-bug.yml                        # Structured bug report form
├── scripts/                              # Automation scripts
│   ├── bump-versions.mjs                 # Calculate next version
│   ├── update-changelog.mjs              # Generate CHANGELOG
│   ├── trim-fe-packageJson.js            # Strip frontend devDeps
│   ├── ensure-provenance-fields.mjs      # Add license/author fields
│   ├── validate-docs-links.js            # Check documentation URLs
│   ├── send-build-stats.mjs              # Turbo build telemetry → webhook
│   └── docker/
│       ├── docker-tags.mjs               # Generate image tags
│       └── docker-config.mjs             # Build context config
├── actions/                              # Custom composite actions
│   ├── setup-nodejs/                     # pnpm + Node + Turbo cache
│   └── docker-registry-login/            # GHCR + DockerHub auth
└── workflows/                            # GitHub Actions workflows
```

---

## Architecture Overview

```
┌────────────────────────────────────────────────────────────────────────────┐
│                          n8n CI/CD ARCHITECTURE                            │
├────────────────────────────────────────────────────────────────────────────┤
│                                                                            │
│  TRIGGERS                     PIPELINES                      OUTPUTS       │
│  ────────                     ─────────                      ───────       │
│                                                                            │
│  ┌──────────┐    ┌──────────────────────────────────┐    ┌────────────┐   │
│  │    PR    │───▶│  ci-pull-requests.yml            │───▶│   Checks   │   │
│  └──────────┘    │  ├─ build + paths-filter         │    │    Gate    │   │
│                  │  ├─ unit-test (reusable)         │    └────────────┘   │
│  ┌──────────┐    │  ├─ typecheck                    │                     │
│  │   Push   │───▶│  ├─ lint (reusable)              │    ┌────────────┐   │
│  │  master  │    │  ├─ e2e-tests (reusable)         │───▶│  Coverage  │   │
│  └──────────┘    │  └─ security (if .github/**)     │    └────────────┘   │
│                  └──────────────────────────────────┘                     │
│                                                                            │
│  ┌──────────┐    ┌──────────────────────────────────┐    ┌────────────┐   │
│  │  Merge   │───▶│  release-publish.yml             │───▶│    NPM     │   │
│  │release/* │    │  ├─ publish-to-npm               │    ├────────────┤   │
│  └──────────┘    │  ├─ publish-to-docker-hub        │───▶│   Docker   │   │
│                  │  ├─ create-github-release        │    ├────────────┤   │
│                  │  ├─ create-sentry-release        │───▶│   Sentry   │   │
│                  │  └─ generate-sbom                │    ├────────────┤   │
│                  └──────────────────────────────────┘───▶│    SBOM    │   │
│                                                          └────────────┘   │
│  ┌──────────┐    ┌──────────────────────────────────┐                     │
│  │ Schedule │───▶│  Nightly/Weekly Jobs             │    ┌────────────┐   │
│  │  (cron)  │    │  ├─ docker-build-push (nightly)  │───▶│   Images   │   │
│  └──────────┘    │  ├─ test-benchmark-nightly       │───▶│  Metrics   │   │
│                  │  ├─ test-workflows-nightly       │    └────────────┘   │
│                  │  └─ test-e2e-coverage-weekly     │                     │
│                  └──────────────────────────────────┘                     │
│                                                                            │
└────────────────────────────────────────────────────────────────────────────┘
```

---

## Quick Reference

| Prefix     | Purpose                                 |
|------------|-----------------------------------------|
| `test-`    | Testing (E2E, unit, visual, benchmarks) |
| `ci-`      | Continuous integration                  |
| `util-`    | Utilities (notifications, sync, Claude) |
| `build-`   | Build processes                         |
| `release-` | Release automation                      |
| `sec-`     | Security scanning                       |
| Other      | Docker, SBOM, patch releases            |

---

## PR Title Conventions

Commits drive changelog generation. Follow Angular convention:

```
Format: <type>(<scope>): <summary>

Types:   feat | fix | perf | test | docs | refactor | build | ci | chore
Scopes:  API | benchmark | core | editor | * Node (optional)

Examples:
  feat(editor): Add dark mode toggle
  fix(Slack Node): Handle rate limiting correctly
  perf(core): Optimize workflow execution by 20%
  refactor: Migrate to TypeScript strict mode (no-changelog)

Breaking Changes:  Add "BREAKING CHANGE:" footer with migration guide
Deprecations:      Add "DEPRECATED:" footer with update path
Skip Changelog:    Add "(no-changelog)" to PR title
```

See `pull_request_title_conventions.md` for full spec.

---

## What Runs When You Open a PR

### Flow Diagram

```
┌──────────────────────────────────────────────────────────────────────────────┐
│                            PR OPENED / UPDATED                               │
└─────────────────────────────────────┬────────────────────────────────────────┘
                                      │
          ┌───────────────────────────┴───────────────────────┐
          ▼                                                   ▼
┌───────────────────────────┐                     ┌───────────────────────────┐
│  ci-pull-requests.yml     │                     │  ci-check-pr-title.yml    │
│  (main orchestrator)      │                     │  (validates title format) │
└─────────────┬─────────────┘                     └───────────────────────────┘
              │
              ▼
┌───────────────────────────┐
│  install-and-build        │
│  └─ paths-filter          │──────────────────────────────────────────┐
└─────────────┬─────────────┘                                          │
              │                                                        │
              │ [if non-Python files changed]                          │ [if .github/** changed]
              │                                                        │
    ┌─────────┼─────────┬─────────────┬─────────────┐                  │
    │         │         │             │             │                  │
    ▼         ▼         ▼             ▼             ▼                  ▼
┌───────┐ ┌───────┐ ┌───────┐ ┌────────────┐ ┌────────────┐   ┌────────────┐
│ unit  │ │ type  │ │ lint  │ │  e2e-tests │ │  security  │   │  security  │
│ test  │ │ check │ │       │ │            │ │  checks    │   │  checks    │
└───┬───┘ └───┬───┘ └───┬───┘ └─────┬──────┘ └─────┬──────┘   └─────┬──────┘
    │         │         │           │              │                │
    │         │         │     ┌─────┴─────┐        │                │
    │         │         │     ▼           ▼        │                │
    │         │         │  Internal    Fork PR     │                │
    │         │         │  14 shards   6 shards    │                │
    │         │         │  Docker      SQLite      │                │
    │         │         │                          │                │
    └─────────┴─────────┴──────────┬───────────────┴────────────────┘
                                   │
                                   ▼
                    ┌──────────────────────────────┐
                    │       required-checks        │
                    │        (merge gate)          │
                    └──────────────────────────────┘
```

### Path-Filtered Workflows

These only run if specific files changed:

| Files Changed                                                          | Workflow                    | Branch     |
|------------------------------------------------------------------------|-----------------------------|------------|
| `packages/@n8n/task-runner-python/**`                                  | `ci-python.yml`             | any        |
| `packages/cli/src/databases/**`, `*.entity.ts`, `*.repository.ts`      | `test-db.yml`               | any        |
| `packages/frontend/@n8n/storybook/**`, design-system, chat             | `test-visual-storybook.yml` | master     |
| `docker/images/n8n-base/Dockerfile`                                    | `build-base-image.yml`      | any        |
| `**/package.json`, `**/turbo.json`                                     | `build-windows.yml`         | master     |
| `packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/python/**` | `test-evals-python.yml`  | any        |
| `packages/@n8n/benchmark/**`                                           | `build-benchmark-image.yml` | master     |
| `packages/cli/src/public-api/**/*.{css,yaml,yml}`                      | `util-sync-api-docs.yml`    | master     |

### On PR Review

| Event                      | Workflow                    | Condition                    |
|----------------------------|-----------------------------|------------------------------|
| Review approved            | `test-visual-chromatic.yml` | + design files changed       |
| Comment with `@claude`     | `util-claude.yml`           | mention in any comment       |
| Any review                 | `util-notify-pr-status.yml` | not community-labeled        |

### On PR Close/Merge

| Event                      | Workflow                    |
|----------------------------|-----------------------------|
| PR closed (any)            | `util-notify-pr-status.yml` |
| PR merged to `release/*`   | `release-publish.yml`       |

### Manual Triggers (PR Comments)

| Command            | Workflow                     | Permissions         |
|--------------------|------------------------------|---------------------|
| `/test-workflows`  | `test-workflows-callable.yml`| admin/write/maintain|

**Why:** Re-run tests without pushing commits. Useful for flaky test investigation.

### Other Manual Workflows

| Workflow                  | Purpose                                                 |
|---------------------------|---------------------------------------------------------|
| `util-claude-task.yml`    | Run Claude Code to complete a task and create a PR      |
| `util-data-tooling.yml`   | SQLite/PostgreSQL export/import validation (manual)     |

#### Claude Task Runner (`util-claude-task.yml`)

Runs Claude Code to complete a task, then creates a PR with the changes. Use for well-specced tasks or simple fixes. Can be triggered via GitHub UI or API.

Claude reads templates from `.github/claude-templates/` for task-specific guidance. Add new templates as needed for recurring task types.

**Inputs:**
- `task` - Description of what Claude should do
- `user_token` - GitHub PAT (PR will be authored by the token owner)

**Token requirements** (fine-grained PAT):
- Repository: `n8n-io/n8n`
- Contents: `Read and write`
- Pull requests: `Read and write`

**Governance:** If you provide your personal PAT, you cannot approve the resulting PR. For automated/bot use cases (e.g., dependabot-style updates via n8n workflows), an app token can be used instead.

---

## Workflow Call Graph

Shows which workflows call which reusable workflows:

```
CALLER                             REUSABLE WORKFLOW
───────────────────────────────────────────────────────────────────────────────

ci-pull-requests.yml
    ├──────────────────────────▶  test-unit-reusable.yml
    ├──────────────────────────▶  test-linting-reusable.yml
    ├──────────────────────────▶  test-e2e-ci-reusable.yml
    │                                 └──────────▶  test-e2e-reusable.yml
    └──────────────────────────▶  sec-ci-reusable.yml
                                      └──────────▶  sec-poutine-reusable.yml

ci-master.yml
    ├──────────────────────────▶  test-unit-reusable.yml
    └──────────────────────────▶  test-linting-reusable.yml

release-publish.yml
    ├──────────────────────────▶  docker-build-push.yml
    │                                 └──────────▶  security-trivy-scan-callable.yml
    └──────────────────────────▶  sbom-generation-callable.yml

test-workflows-nightly.yml
    └──────────────────────────▶  test-workflows-callable.yml

PR Comment Dispatchers (triggered by /command in PR comments):
test-workflows-pr-comment.yml
    └──────────────────────────▶  test-workflows-callable.yml
```

---

## Release Lifecycle

```
┌────────────────────────────────────────────────────────────────────────────┐
│                           RELEASE LIFECYCLE                                │
├────────────────────────────────────────────────────────────────────────────┤
│                                                                            │
│  STAGE 1: Create Release PR                                                │
│  ───────────────────────────                                               │
│  Trigger: Manual workflow_dispatch                                         │
│                                                                            │
│  release-create-pr.yml                                                     │
│  ├─ bump-versions.mjs ────────▶ Calculate X.Y.Z                            │
│  ├─ update-changelog.mjs ─────▶ Generate CHANGELOG                         │
│  └─ Create PR: release-pr/X.Y.Z → release/X.Y.Z                            │
│                                                                            │
│  Inputs:                                                                   │
│  ├─ release-type: patch │ minor │ major │ experimental │ premajor          │
│  └─ base-branch: default master                                            │
│                          │                                                 │
│                          ▼                                                 │
│  STAGE 2: CI Validation                                                    │
│  ───────────────────────                                                   │
│  ci-pull-requests.yml runs full suite                                      │
│  ├─ NO ci-check-pr-title.yml (skipped for release branches)                │
│  └─ NO test-visual-chromatic.yml (skipped)                                 │
│                          │                                                 │
│                          ▼ [Merge PR]                                      │
│  STAGE 3: Publish                                                          │
│  ───────────────                                                           │
│  release-publish.yml (triggered on merge to release/*)                     │
│  ├─ publish-to-npm                                                         │
│  │   ├─ trim-fe-packageJson.js ───▶ Strip devDeps                          │
│  │   ├─ ensure-provenance-fields.mjs ───▶ Add license fields               │
│  │   └─ npm publish (tag: rc or latest)                                    │
│  ├─ publish-to-docker-hub ────────▶ docker-build-push.yml                  │
│  │   └─ Multi-arch: amd64 + arm64                                          │
│  ├─ create-github-release                                                  │
│  ├─ create-sentry-release (sourcemaps)                                     │
│  ├─ generate-sbom ────────────────▶ sbom-generation-callable.yml           │
│  │   └─ CycloneDX + Cosign signing                                         │
│  └─ trigger-release-note (stable only)                                     │
│                          │                                                 │
│                          ▼                                                 │
│  STAGE 4: Channel Promotion (optional)                                     │
│  ──────────────────────────────────────                                    │
│  Trigger: Manual release-push-to-channel.yml                               │
│  ├─ beta ─────▶ npm tags: next, beta                                       │
│  └─ stable ───▶ npm tags: latest, stable                                   │
│                                                                            │
└────────────────────────────────────────────────────────────────────────────┘
```

### Other Release Workflows

| Workflow                         | Trigger            | Purpose                                        |
|----------------------------------|--------------------|------------------------------------------------|
| `release-standalone-package.yml` | Manual dispatch    | Release individual packages (@n8n/codemirror-lang, @n8n/create-node, etc.) |
| `create-patch-release-branch.yml`| Manual dispatch    | Cherry-pick commits for patch releases         |

---

## Fork vs Internal PR

| Aspect             | Internal PR                      | Fork PR                 |
|--------------------|----------------------------------|-------------------------|
| E2E Runner         | `blacksmith-2vcpu-ubuntu-2204`   | `ubuntu-latest`         |
| E2E Mode           | `docker-build` (multi-main)      | `local` (SQLite)        |
| E2E Shards         | 14 + 2                           | 6 + 2                   |
| Test Command       | `test:container:multi-main:*`    | `test:local:*`          |
| Secrets            | Full access                      | None                    |
| Currents Recording | Yes                              | No                      |
| Failure Artifacts  | No                               | Yes                     |

**Why:** Fork PRs cannot access repository secrets. Local mode with SQLite provides feedback without paid services.

---

## ci-master.yml

Runs on push to `master` or `1.x`:

```
Push to master/1.x
├─ build-github (populate cache)
├─ unit-test (matrix: Node 22.x, 24.14.1, 25.x)
│   └─ Coverage only on 24.14.1
├─ lint
└─ notify-on-failure (Slack #alerts-build)
```

---

## Scheduled Jobs

| Schedule (UTC)            | Workflow                          | Purpose                  |
|---------------------------|-----------------------------------|--------------------------|
| Daily 00:00               | `docker-build-push.yml`           | Nightly Docker images    |
| Daily 00:00               | `test-db.yml`                     | Database compatibility   |
| Daily 00:00               | `test-e2e-performance-reusable.yml`| Performance E2E         |
| Daily 00:00               | `test-visual-storybook.yml`       | Storybook deploy         |
| Daily 00:00               | `test-visual-chromatic.yml`       | Visual regression        |
| Daily 00:00               | `util-check-docs-urls.yml`        | Doc link validation      |
| Daily 01:30, 02:30, 03:30 | `test-benchmark-nightly.yml`      | Performance benchmarks   |
| Daily 02:00               | `test-workflows-nightly.yml`      | Workflow tests           |
| Daily 05:00               | `test-benchmark-destroy-nightly.yml`| Cleanup benchmark env  |
| Monday 00:00              | `util-update-node-popularity.yml` | Node usage stats         |
| Monday 02:00              | `test-e2e-coverage-weekly.yml`    | Weekly E2E coverage      |
| Saturday 22:00            | `test-evals-ai.yml`               | AI workflow evals        |

---

## Custom Actions

Composite actions in `.github/actions/`:

| Action                   | Purpose                                      | Used By            |
|--------------------------|----------------------------------------------|--------------------|
| `setup-nodejs`           | pnpm + Node.js + Turbo cache + Docker (opt)  | Most CI workflows  |
| `docker-registry-login`  | GHCR + DockerHub + DHI authentication        | Docker workflows   |

### setup-nodejs

```yaml
inputs:
  node-version:        # default: '24.14.1'
  enable-docker-cache: # default: 'false' (Blacksmith Buildx)
  build-command:       # default: 'pnpm build'
```

### docker-registry-login

```yaml
inputs:
  login-ghcr:       # default: 'true'
  login-dockerhub:  # default: 'false'
  login-dhi:        # default: 'false'
```

---

## Reusable Workflows

Workflows with `workflow_call` trigger:

| Workflow                           | Inputs                                        | Purpose               |
|------------------------------------|-----------------------------------------------|-----------------------|
| `test-unit-reusable.yml`           | `ref`, `nodeVersion`, `collectCoverage`       | Unit tests            |
| `test-linting-reusable.yml`        | `ref`, `nodeVersion`                          | ESLint                |
| `test-e2e-reusable.yml`            | `branch`, `test-mode`, `shards`, `runner`     | Core E2E executor     |
| `test-e2e-ci-reusable.yml`         | `branch`                                      | E2E orchestrator      |
| `test-e2e-docker-pull-reusable.yml`| `branch`, `n8n_version`                       | E2E with pulled image |
| `test-workflows-callable.yml`      | `git_ref`, `compare_schemas`                  | Workflow tests        |
| `docker-build-push.yml`            | `n8n_version`, `release_type`, `push_enabled` | Docker build          |
| `sec-ci-reusable.yml`              | `ref`                                         | Security orchestrator |
| `sec-poutine-reusable.yml`         | `ref`                                         | Poutine scanner       |
| `security-trivy-scan-callable.yml` | `image_ref`                                   | Trivy scan            |
| `sbom-generation-callable.yml`     | `n8n_version`, `release_tag_ref`              | SBOM generation       |

---

## Scripts

Scripts in `.github/scripts/`:

### Release Scripts

| Script                        | Purpose                    | Called By               |
|-------------------------------|----------------------------|-------------------------|
| `bump-versions.mjs`           | Calculate next version     | `release-create-pr.yml` |
| `update-changelog.mjs`        | Generate CHANGELOG         | `release-create-pr.yml` |
| `trim-fe-packageJson.js`      | Strip frontend devDeps     | `release-publish.yml`   |
| `ensure-provenance-fields.mjs`| Add license/author fields  | `release-publish.yml`   |

### Docker Scripts

| Script                  | Purpose           | Called By              |
|-------------------------|-------------------|------------------------|
| `docker/docker-config.mjs`| Build context   | `docker-build-push.yml`|
| `docker/docker-tags.mjs`  | Image tags      | `docker-build-push.yml`|

### Validation Scripts

| Script                  | Purpose           | Called By                 |
|-------------------------|-------------------|---------------------------|
| `validate-docs-links.js`| Check doc URLs    | `util-check-docs-urls.yml`|
| `send-build-stats.mjs`  | Build telemetry   | `setup-nodejs` action     |

---

## Telemetry

CI metrics are collected via webhooks to n8n, then stored in BigQuery for analysis.

See **[CI-TELEMETRY.md](CI-TELEMETRY.md)** for:
- Common data points (git, CI context, runner info)
- Existing implementations (build stats, container stack)
- How to add new telemetry
- BigQuery schema patterns and queries

---

## CODEOWNERS

Team ownership mappings in `CODEOWNERS`:

| Path Pattern                                                 | Team                       |
|--------------------------------------------------------------|----------------------------|
| `packages/@n8n/db/src/migrations/`                           | @n8n-io/migrations-review  |

---

## Runner Selection

| Runner                              | vCPU | Use Case                    |
|-------------------------------------|------|-----------------------------|
| `ubuntu-slim`                       | 1    | Gate jobs (required-checks) |
| `ubuntu-latest`                     | 2    | Simple jobs, fork PR E2E    |
| `blacksmith-2vcpu-ubuntu-2204`      | 2    | Standard builds, E2E shards |
| `blacksmith-4vcpu-ubuntu-2204`      | 4    | Unit tests, typecheck, lint |
| `blacksmith-8vcpu-ubuntu-2204`      | 8    | E2E coverage (weekly)       |
| `blacksmith-4vcpu-ubuntu-2204-arm`  | 4    | ARM64 Docker builds         |

### Selection Guidelines

**`ubuntu-slim`** - Status check aggregation, gate/required-check jobs, notifications

**`ubuntu-latest`** - Simple build verification, scheduled maintenance, PR comment handlers, release tagging, Docker manifest creation, any job where speed is not critical

**`blacksmith-2vcpu-ubuntu-2204`** - Initial build/install (benefits from Blacksmith caching), database integration tests (I/O bound), Chromatic/Storybook builds

**`blacksmith-4vcpu-ubuntu-2204`** - Unit tests (parallelized), linting (parallel file processing), typechecking (CPU-intensive), E2E test shards

**`blacksmith-8vcpu-ubuntu-2204`** - Heavy parallel workloads, full E2E coverage runs

### Runner Provider Toggle

The `RUNNER_PROVIDER` repository variable controls runner selection across workflows:

| Value | Behavior |
|-------|----------|
| (unset) | Use Blacksmith runners (default) |
| `github` | Use GitHub-hosted `ubuntu-latest` |

**Note:** When set to `github`, all jobs use `ubuntu-latest` regardless of any runner inputs or defaults specified in reusable workflows. GitHub runners have fewer vCPUs (2 vs 4), so jobs may run slower.

---

## Security

### Why We Do This

Supply chain security ensures artifacts haven't been tampered with. We provide three types of signed attestations:

```
                    ATTESTATION (signed statement)
                           │
         ┌─────────────────┼─────────────────┐
         │                 │                 │
         ▼                 ▼                 ▼
    PROVENANCE           SBOM              VEX

    "Trust the           "Know the         "Understand
     build"               contents"          the risk"
```

| Attestation | Question It Answers |
|-------------|--------------------------------|
| **Provenance** | "Can we trust this artifact came from n8n's CI and wasn't tampered with?" |
| **SBOM** | "What dependencies are inside?" (license compliance, vulnerability scanning) |
| **VEX** | "The scanner found CVE-X - does it actually affect us or is it a false positive?" |

**How they relate:**
- **SBOM** is the ingredients list - input for both license checks AND security scanning
- **VEX** is the security triage output - "we investigated CVE-X, here's our assessment"
- **Provenance** proves the SBOM and VEX came from our CI, not an attacker

---

### Poutine (Supply Chain)

- **Runs on:** PR changes to `.github/**`
- **Detects:** Exposed secrets, insecure workflow configs
- **Output:** SARIF to GitHub Security tab

### Trivy (Container)

- **Runs on:** stable/nightly/rc Docker builds
- **Scans:** n8n image, runners image
- **Output:** Slack `#notify-security-scan-outputs` (all), `#mission-security` (critical)

### SBOM

- **Runs on:** release-publish
- **Format:** CycloneDX JSON
- **Signing:** GitHub Attestation API
- **Attached to:** GitHub Release

### SLSA L3 Provenance

SLSA (Supply-chain Levels for Software Artifacts) Level 3 provides cryptographic proof of build integrity.

| Artifact | Generator | Level |
|----------|-----------|-------|
| Docker images | `slsa-framework/slsa-github-generator` | L3 |
| npm packages | `NPM_CONFIG_PROVENANCE=true` | L3 |

**Docker provenance** uses the SLSA GitHub Generator as a reusable workflow (not an action). This is required for L3 because provenance must be generated in an isolated environment the build can't tamper with.

```yaml
# IMPORTANT: Must use semantic version tags (@vX.Y.Z), NOT commit SHAs.
# The slsa-verifier requires tagged versions to verify authenticity.
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v2.1.0
```

**Verify provenance:**
```bash
# Docker
slsa-verifier verify-image ghcr.io/n8n-io/n8n:VERSION \
  --source-uri github.com/n8n-io/n8n

# npm
npm audit signatures n8n@VERSION
```

### VEX (Vulnerability Exploitability eXchange)

VEX documents which CVEs actually affect n8n vs false positives from scanners.

- **File:** `security/vex.openvex.json`
- **Format:** OpenVEX (broad scanner compatibility - Trivy, Docker Scout, etc.)
- **Attached to:** GitHub Release, Docker image attestations
- **Used by:** Trivy scans (via `security/trivy.yaml`)

**VEX Status Types:**
| Status | Meaning |
|--------|---------|
| `not_affected` | CVE doesn't impact n8n (code not reachable, etc.) |
| `affected` | CVE impacts n8n, tracking fix |
| `fixed` | CVE was present, now fixed |
| `under_investigation` | Assessing impact |

**Verify VEX attestation:**
```bash
cosign verify-attestation --type openvex \
  --certificate-identity-regexp '.*github.com/n8n-io/n8n.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  ghcr.io/n8n-io/n8n:VERSION
```

**Adding a CVE statement to security/vex.openvex.json:**
```json
{
  "statements": [
    {
      "vulnerability": { "name": "CVE-2024-XXXXX" },
      "products": [{ "@id": "pkg:github/n8n-io/n8n" }],
      "status": "not_affected",
      "justification": "vulnerable_code_not_in_execute_path",
      "statement": "n8n does not use the affected code path in this dependency"
    }
  ]
}
```

---

## Secrets

### By Category

| Category            | Secrets                                                     |
|---------------------|-------------------------------------------------------------|
| Package Publishing  | `NPM_TOKEN`, `DOCKER_USERNAME`, `DOCKER_PASSWORD`           |
| Notifications       | `SLACK_WEBHOOK_URL`, `QBOT_SLACK_TOKEN`                     |
| Code Quality        | `CODECOV_TOKEN`, `CHROMATIC_PROJECT_TOKEN`, `CURRENTS_RECORD_KEY` |
| Error Tracking      | `SENTRY_AUTH_TOKEN`, `SENTRY_ORG`, `SENTRY_*_PROJECT`       |
| Cloud/CDN           | `CLOUDFLARE_API_TOKEN`, `CLOUDFLARE_ACCOUNT_ID`             |
| GitHub Automation   | `N8N_ASSISTANT_APP_ID`, `N8N_ASSISTANT_PRIVATE_KEY`         |
| Benchmarking        | `BENCHMARK_ARM_*`, `N8N_BENCHMARK_LICENSE_CERT`             |
| AI/Evals            | `ANTHROPIC_API_KEY`, `EVALS_LANGSMITH_*`                    |

### Scoping

- **`secrets: inherit`** - passes all secrets to reusable workflows
- **Explicit passing** - for minimal exposure
- **Environment: `benchmarking`** - Azure OIDC credentials

---

## Future Vision

### Redundancy Review

Comment trigger (`/test-workflows`) is a workaround.

Long-term: Main CI should be reliable enough to not need these.

### Workflow Testability

- Tools like `act` for local testing
- Unit tests for `.github/scripts/*.mjs`
- Validation with `actionlint`


================================================
FILE: .github/actionlint.yml
================================================
self-hosted-runner:
  labels:
    - blacksmith-2vcpu-ubuntu-2204
    - blacksmith-4vcpu-ubuntu-2204
    - blacksmith-2vcpu-ubuntu-2204-arm
    - blacksmith-4vcpu-ubuntu-2204-arm
    - blacksmith-8vcpu-ubuntu-2204
    - ubuntu-slim


================================================
FILE: .github/actions/ci-filter/__tests__/ci-filter.test.ts
================================================
import { describe, it } from 'node:test';
import assert from 'node:assert/strict';
import { matchGlob, parseFilters, evaluateFilter, runValidate } from '../ci-filter.mjs';

// --- matchGlob ---

describe('matchGlob', () => {
	it('** matches dotfiles', () => {
		assert.ok(matchGlob('.github/workflows/ci.yml', '**'));
	});

	it('** matches deeply nested paths', () => {
		assert.ok(matchGlob('packages/cli/src/controllers/auth.ts', '**'));
	});

	it('** matches root-level files', () => {
		assert.ok(matchGlob('README.md', '**'));
	});

	it('.github/** matches workflow files', () => {
		assert.ok(matchGlob('.github/workflows/ci.yml', '.github/**'));
	});

	it('.github/** matches action files', () => {
		assert.ok(matchGlob('.github/actions/ci-filter/action.yml', '.github/**'));
	});

	it('.github/** does not match non-.github paths', () => {
		assert.ok(!matchGlob('packages/cli/src/index.ts', '.github/**'));
	});

	it('scoped package pattern matches files in that package', () => {
		assert.ok(
			matchGlob(
				'packages/@n8n/task-runner-python/src/main.py',
				'packages/@n8n/task-runner-python/**',
			),
		);
	});

	it('scoped package pattern does not match other packages', () => {
		assert.ok(!matchGlob('packages/@n8n/config/src/index.ts', 'packages/@n8n/task-runner-python/**'));
	});

	it('* matches single-level only', () => {
		assert.ok(matchGlob('README.md', '*.md'));
		assert.ok(!matchGlob('docs/README.md', '*.md'));
	});

	it('exact path match', () => {
		assert.ok(matchGlob('package.json', 'package.json'));
		assert.ok(!matchGlob('packages/cli/package.json', 'package.json'));
	});

	it('? matches single character', () => {
		assert.ok(matchGlob('file1.txt', 'file?.txt'));
		assert.ok(!matchGlob('file12.txt', 'file?.txt'));
	});

	it('**/ at start matches zero or more path segments', () => {
		assert.ok(matchGlob('src/index.ts', '**/index.ts'));
		assert.ok(matchGlob('packages/cli/src/index.ts', '**/index.ts'));
		assert.ok(matchGlob('index.ts', '**/index.ts'));
	});

	it('**/ in middle matches nested paths', () => {
		assert.ok(matchGlob('packages/@n8n/db/src/deep/file.ts', 'packages/@n8n/db/**'));
	});
});

// --- parseFilters ---

describe('parseFilters', () => {
	it('parses single-line filter', () => {
		const filters = parseFilters('workflows: .github/**');
		assert.deepEqual(filters.get('workflows'), ['.github/**']);
	});

	it('parses single-line with multiple patterns', () => {
		const filters = parseFilters('db: packages/@n8n/db/** packages/cli/**');
		assert.deepEqual(filters.get('db'), ['packages/@n8n/db/**', 'packages/cli/**']);
	});

	it('parses multi-line filter', () => {
		const input = `non-python:
  **
  !packages/@n8n/task-runner-python/**`;
		const filters = parseFilters(input);
		assert.deepEqual(filters.get('non-python'), ['**', '!packages/@n8n/task-runner-python/**']);
	});

	it('parses mixed single and multi-line', () => {
		const input = `non-python:
  **
  !packages/@n8n/task-runner-python/**
workflows: .github/**`;
		const filters = parseFilters(input);
		assert.equal(filters.size, 2);
		assert.deepEqual(filters.get('non-python'), ['**', '!packages/@n8n/task-runner-python/**']);
		assert.deepEqual(filters.get('workflows'), ['.github/**']);
	});

	it('ignores comments and blank lines', () => {
		const input = `# This is a comment

workflows: .github/**

# Another comment
db: packages/@n8n/db/**`;
		const filters = parseFilters(input);
		assert.equal(filters.size, 2);
	});

	it('throws on malformed input', () => {
		assert.throws(() => parseFilters('not a valid filter line'), /Malformed/);
	});

	it('throws on filter with no patterns', () => {
		const input = `empty:
other: .github/**`;
		assert.throws(() => parseFilters(input), /no patterns/);
	});
});

// --- evaluateFilter ---

describe('evaluateFilter', () => {
	it('python-only files with non-python filter returns false', () => {
		const files = [
			'packages/@n8n/task-runner-python/src/main.py',
			'packages/@n8n/task-runner-python/pyproject.toml',
		];
		const patterns = ['**', '!packages/@n8n/task-runner-python/**'];
		assert.equal(evaluateFilter(files, patterns), false);
	});

	it('mixed python and non-python returns true', () => {
		const files = [
			'packages/@n8n/task-runner-python/src/main.py',
			'packages/cli/src/index.ts',
		];
		const patterns = ['**', '!packages/@n8n/task-runner-python/**'];
		assert.equal(evaluateFilter(files, patterns), true);
	});

	it('non-python files with non-python filter returns true', () => {
		const files = ['packages/cli/src/index.ts', 'packages/core/src/utils.ts'];
		const patterns = ['**', '!packages/@n8n/task-runner-python/**'];
		assert.equal(evaluateFilter(files, patterns), true);
	});

	it('.github files with workflows filter returns true', () => {
		const files = ['.github/workflows/ci.yml', '.github/actions/setup/action.yml'];
		const patterns = ['.github/**'];
		assert.equal(evaluateFilter(files, patterns), true);
	});

	it('non-.github files with workflows filter returns false', () => {
		const files = ['packages/cli/src/index.ts'];
		const patterns = ['.github/**'];
		assert.equal(evaluateFilter(files, patterns), false);
	});

	it('empty changed files returns false', () => {
		assert.equal(evaluateFilter([], ['**']), false);
	});

	it('last matching pattern wins (gitignore semantics)', () => {
		const files = ['packages/@n8n/task-runner-python/src/main.py'];
		const patterns = ['**', '!packages/@n8n/task-runner-python/**', 'packages/@n8n/task-runner-python/**'];
		assert.equal(evaluateFilter(files, patterns), true);
	});
});

// --- runValidate ---

describe('runValidate', () => {
	function runWithResults(jobResults: Record<string, { result: string }>): number | null {
		const originalEnv = process.env.INPUT_JOB_RESULTS;
		const originalExit = process.exit;
		let exitCode: number | null = null;

		process.env.INPUT_JOB_RESULTS = JSON.stringify(jobResults);
		process.exit = ((code: number) => { exitCode = code; }) as never;

		try {
			runValidate();
		} finally {
			process.env.INPUT_JOB_RESULTS = originalEnv;
			process.exit = originalExit;
		}

		return exitCode;
	}

	it('passes when all jobs succeed', () => {
		assert.equal(runWithResults({
			'install-and-build': { result: 'success' },
			'unit-test': { result: 'success' },
			typecheck: { result: 'success' },
			lint: { result: 'success' },
		}), null);
	});

	it('passes when some jobs are skipped (filtered out)', () => {
		assert.equal(runWithResults({
			'install-and-build': { result: 'success' },
			'unit-test': { result: 'success' },
			'security-checks': { result: 'skipped' },
		}), null);
	});

	it('fails when a job fails', () => {
		assert.equal(runWithResults({
			'install-and-build': { result: 'success' },
			'unit-test': { result: 'failure' },
			typecheck: { result: 'success' },
		}), 1);
	});

	it('fails when a job is cancelled', () => {
		assert.equal(runWithResults({
			'install-and-build': { result: 'success' },
			'unit-test': { result: 'cancelled' },
		}), 1);
	});

	it('fails when multiple jobs have problems', () => {
		assert.equal(runWithResults({
			'unit-test': { result: 'failure' },
			typecheck: { result: 'cancelled' },
			lint: { result: 'success' },
		}), 1);
	});
});


================================================
FILE: .github/actions/ci-filter/action.yml
================================================
name: 'CI Filter'
description: |
  Filter CI jobs by changed files and validate results.

  Modes:
    - filter: Determines which jobs to run based on changed files and a provided filter definition.
    - validate: Checks the results of required jobs and fails if any of them failed or were cancelled.

inputs:
  mode:
    description: 'filter or validate'
    required: true
  filters:
    description: 'Filter definitions (gitignore-style DSL)'
    required: false
  base-ref:
    description: 'Base branch for diff. Auto-detected if not specified.'
    required: false
  job-results:
    description: 'Job results from needs context as JSON (mode=validate)'
    required: false

outputs:
  results:
    description: 'JSON object: { "filter-name": true/false }'
    value: ${{ steps.run.outputs.results }}

runs:
  using: 'composite'
  steps:
    - name: Run CI Filter
      id: run
      shell: bash
      env:
        INPUT_MODE: ${{ inputs.mode }}
        INPUT_FILTERS: ${{ inputs.filters }}
        INPUT_BASE_REF: ${{ inputs.base-ref || github.event.pull_request.base.ref || github.event.merge_group.base_ref || 'master' }}
        INPUT_JOB_RESULTS: ${{ inputs.job-results }}
      run: node ${{ github.action_path }}/ci-filter.mjs


================================================
FILE: .github/actions/ci-filter/ci-filter.mjs
================================================
import { execSync } from 'node:child_process';
import { appendFileSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { resolve } from 'node:path';

// --- Glob matching (dotfile-safe) ---

/**
 * Match a file path against a glob pattern.
 * Unlike path.matchesGlob / standard POSIX globs, `**` matches dotfiles.
 */
export function matchGlob(filePath, pattern) {
	let regex = '';
	let i = 0;
	while (i < pattern.length) {
		const ch = pattern[i];
		if (ch === '*' && pattern[i + 1] === '*') {
			if (pattern[i + 2] === '/') {
				regex += '(?:.+/)?';
				i += 3;
			} else {
				regex += '.*';
				i += 2;
			}
		} else if (ch === '*') {
			regex += '[^/]*';
			i++;
		} else if (ch === '?') {
			regex += '[^/]';
			i++;
		} else {
			regex += ch.replace(/[.+^${}()|[\]\\]/g, '\\$&');
			i++;
		}
	}
	return new RegExp(`^${regex}$`).test(filePath);
}

// --- Filter DSL parser ---

/**
 * Parse filter definitions from the input DSL.
 *
 * Supports two formats:
 *   Single-line:  `name: pattern1 pattern2`
 *   Multi-line:   `name:` followed by indented patterns (one per line)
 *
 * Lines starting with # and blank lines are ignored.
 */
export function parseFilters(input) {
	const filters = new Map();
	const lines = input.split('\n');
	let currentFilter = null;

	for (const rawLine of lines) {
		const line = rawLine.trim();

		if (!line || line.startsWith('#')) continue;

		const headerMatch = line.match(/^([a-zA-Z0-9_-]+):\s*(.*)?$/);
		if (headerMatch) {
			const name = headerMatch[1];
			const rest = (headerMatch[2] || '').trim();
			const patterns = [];
			currentFilter = name;
			filters.set(name, patterns);

			if (rest) {
				patterns.push(...rest.split(/\s+/));
				currentFilter = null;
			}
			continue;
		}

		if (currentFilter && rawLine.match(/^\s/)) {
			const patterns = filters.get(currentFilter);
			if (patterns) patterns.push(line);
			continue;
		}

		throw new Error(`Malformed filter input at: "${rawLine}"`);
	}

	for (const [name, patterns] of filters) {
		if (patterns.length === 0) {
			throw new Error(`Filter "${name}" has no patterns`);
		}
	}

	return filters;
}

// --- Git operations ---

const SAFE_REF = /^[a-zA-Z0-9_./-]+$/;

export function getChangedFiles(baseRef) {
	if (!SAFE_REF.test(baseRef)) {
		throw new Error(`Unsafe base ref: "${baseRef}"`);
	}
	execSync(`git fetch --depth=1 origin ${baseRef}`, { stdio: 'pipe' });
	const output = execSync('git diff --name-only FETCH_HEAD HEAD', { encoding: 'utf-8' });
	return output
		.split('\n')
		.map((f) => f.trim())
		.filter(Boolean);
}

// --- Filter evaluation ---

/**
 * Evaluate a single filter against changed files using gitignore semantics.
 * Patterns evaluated in order, last match wins. ! prefix excludes.
 * Filter triggers if ANY changed file passes.
 */
export function evaluateFilter(changedFiles, patterns) {
	for (const file of changedFiles) {
		let included = false;
		for (const pattern of patterns) {
			if (pattern.startsWith('!')) {
				if (matchGlob(file, pattern.slice(1))) {
					included = false;
				}
			} else {
				if (matchGlob(file, pattern)) {
					included = true;
				}
			}
		}
		if (included) return true;
	}
	return false;
}

// --- Mode: filter ---

function setOutput(name, value) {
	const outputFile = process.env.GITHUB_OUTPUT;
	if (outputFile) {
		const delimiter = `ghadelimiter_${Date.now()}`;
		appendFileSync(outputFile, `${name}<<${delimiter}\n${value}\n${delimiter}\n`);
	}
}

export function runFilter() {
	const filtersInput = process.env.INPUT_FILTERS;
	const baseRef = process.env.INPUT_BASE_REF;

	if (!filtersInput) {
		throw new Error('INPUT_FILTERS is required in filter mode');
	}
	if (!baseRef) {
		throw new Error('INPUT_BASE_REF is required in filter mode');
	}

	const filters = parseFilters(filtersInput);
	const changedFiles = getChangedFiles(baseRef);

	console.log(`Changed files (${changedFiles.length}):`);
	for (const f of changedFiles) {
		console.log(`  ${f}`);
	}

	const results = {};

	for (const [name, patterns] of filters) {
		const matched = evaluateFilter(changedFiles, patterns);
		results[name] = matched;
		console.log(`Filter "${name}": ${matched}`);
	}

	setOutput('results', JSON.stringify(results));
}

// --- Mode: validate ---

export function runValidate() {
	const raw = process.env.INPUT_JOB_RESULTS;
	if (!raw) {
		throw new Error('INPUT_JOB_RESULTS is required in validate mode');
	}

	const jobResults = JSON.parse(raw);
	const problems = [];

	for (const [job, data] of Object.entries(jobResults)) {
		if (data.result === 'failure') problems.push(`${job}: failed`);
		if (data.result === 'cancelled') problems.push(`${job}: cancelled`);
	}

	if (problems.length > 0) {
		console.error('Required checks failed:');
		for (const p of problems) {
			console.error(`  - ${p}`);
		}
		process.exit(1);
	}

	console.log('All required checks passed:');
	for (const [job, data] of Object.entries(jobResults)) {
		console.log(`  ${job}: ${data.result}`);
	}
}

// --- Main (only when run directly, not when imported by tests) ---

if (resolve(fileURLToPath(import.meta.url)) === resolve(process.argv[1])) {
	const mode = process.env.INPUT_MODE;
	if (mode === 'filter') {
		runFilter();
	} else if (mode === 'validate') {
		runValidate();
	} else {
		throw new Error(`Unknown mode: "${mode}". Expected "filter" or "validate".`);
	}
}


================================================
FILE: .github/actions/docker-registry-login/action.yml
================================================
# Composite action for logging into Docker registries (GHCR and/or DockerHub).
# Centralizes the login pattern used across multiple Docker workflows.

name: 'Docker Registry Login'
description: 'Login to GitHub Container Registry and/or DockerHub'

inputs:
  login-ghcr:
    description: 'Login to GitHub Container Registry'
    required: false
    default: 'true'
  login-dockerhub:
    description: 'Login to DockerHub'
    required: false
    default: 'false'
  login-dhi:
    description: 'Login to Docker Hardened Images registry (dhi.io)'
    required: false
    default: 'false'
  dockerhub-username:
    description: 'DockerHub username (required if login-dockerhub or login-dhi is true)'
    required: false
  dockerhub-password:
    description: 'DockerHub password (required if login-dockerhub or login-dhi is true)'
    required: false

runs:
  using: 'composite'
  steps:
    - name: Login to GitHub Container Registry
      if: inputs.login-ghcr == 'true'
      shell: bash
      env:
        GHCR_TOKEN: ${{ github.token }}
        GHCR_USER: ${{ github.actor }}
      run: |
        node .github/scripts/retry.mjs --attempts 3 --delay 10 \
          'echo "$GHCR_TOKEN" | docker login ghcr.io -u "$GHCR_USER" --password-stdin'

    - name: Login to DockerHub
      if: inputs.login-dockerhub == 'true'
      uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0
      with:
        username: ${{ inputs.dockerhub-username }}
        password: ${{ inputs.dockerhub-password }}

    - name: Login to DHI Registry
      if: inputs.login-dhi == 'true'
      uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # v4.0.0
      with:
        registry: dhi.io
        username: ${{ inputs.dockerhub-username }}
        password: ${{ inputs.dockerhub-password }}


================================================
FILE: .github/actions/setup-nodejs/action.yml
================================================
# This action works transparently on both Blacksmith and GitHub-hosted runners.
# Blacksmith runners benefit from transparent caching and optional Docker layer caching.
# GitHub-hosted runners use standard GitHub Actions caching.

name: 'Node.js Build Setup'
description: 'Configures Node.js with pnpm, installs Aikido SafeChain for supply chain protection, installs dependencies, enables Turborepo caching, (optional) sets up Docker layer caching, and builds the project or an optional command.'

inputs:
  node-version:
    description: 'Node.js version to use. Pinned to 24.14.1 by default for reproducible builds.'
    required: false
    default: '24.14.1'
  enable-docker-cache:
    description: 'Whether to set up Blacksmith Buildx for Docker layer caching (Blacksmith runners only).'
    required: false
    default: 'false'
  build-command:
    description: 'Command to execute for building the project or an optional command. Leave empty to skip build step.'
    required: false
    default: 'pnpm build'
  install-command:
    description: 'Command to execute for installing project dependencies. Leave empty to skip install step.'
    required: false
    default: 'pnpm install --frozen-lockfile'

runs:
  using: 'composite'
  steps:
    - name: Setup pnpm
      uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0

    - name: Setup Node.js
      uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
      with:
        node-version: ${{ inputs.node-version }}
        cache: 'pnpm'

    # To avoid setup-node cache failure.
    # see: https://github.com/actions/setup-node/issues/1137
    - name: Verify PNPM Cache Directory
      shell: bash
      run: |
        PNPM_STORE_PATH="$( pnpm store path --silent )"
        if [ ! -d "$PNPM_STORE_PATH" ]; then
            mkdir -p "$PNPM_STORE_PATH"
        fi

    - name: Install Aikido SafeChain
      if: runner.os != 'Windows'
      run: |
        VERSION="1.4.1"
        EXPECTED_SHA256="628235987175072a4255aa3f5f0128f31795b63970f1970ae8a04d07bf8527b0"
        node .github/scripts/retry.mjs --attempts 3 --delay 10 \
          "curl -fsSL -o install-safe-chain.sh https://github.com/AikidoSec/safe-chain/releases/download/${VERSION}/install-safe-chain.sh"
        echo "${EXPECTED_SHA256}  install-safe-chain.sh" | sha256sum -c -
        sh install-safe-chain.sh --ci
        rm install-safe-chain.sh
      shell: bash

    - name: Install Dependencies
      if: ${{ inputs.install-command != '' }}
      run: |
        ${{ inputs.install-command }}
      shell: bash

    - name: Disable safe-chain
      if: runner.os != 'Windows'
      run: safe-chain teardown
      shell: bash

    - name: Configure Turborepo Cache
      uses: rharkor/caching-for-turbo@0abc2381e688c4d2832f0665a68a01c6e82f0d6c # v2.3.11

    - name: Setup Docker Builder for Docker Cache (Blacksmith)
      if: ${{ inputs.enable-docker-cache == 'true' && contains(runner.name, 'blacksmith') }}
      uses: useblacksmith/setup-docker-builder@ef12d5b165b596e3aa44ea8198d8fde563eab402 # v1.4.0

    - name: Setup Docker Builder (GitHub fallback)
      if: ${{ inputs.enable-docker-cache == 'true' && !contains(runner.name, 'blacksmith') }}
      uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0

    - name: Build Project
      if: ${{ inputs.build-command != '' }}
      run: |
        ${{ inputs.build-command }} --summarize
        node .github/scripts/send-build-stats.mjs || true
        node .github/scripts/send-docker-stats.mjs || true
      shell: bash


================================================
FILE: .github/claude-templates/e2e-test.md
================================================
# E2E Test Task Guide

## Required Reading

**Before writing any code**, read these files:
```
packages/testing/playwright/AGENTS.md      # Patterns, anti-patterns, entry points
packages/testing/playwright/CONTRIBUTING.md # Detailed architecture (first 200 lines)
```

## Spec Validation

Before starting, verify the spec includes:

| Required | Example |
|----------|---------|
| **File(s) to modify** | `tests/e2e/credentials/crud.spec.ts` |
| **Specific behavior** | "Verify credential renaming updates the list" |
| **Pattern reference** | "Follow existing tests in same file" or "See AGENTS.md" |

**If missing, ask for clarification.** Don't guess at requirements.

## Commands

```bash
# Run single test
pnpm --filter=n8n-playwright test:local tests/e2e/your-test.spec.ts --reporter=list 2>&1 | tail -50

# Run with pattern match
pnpm --filter=n8n-playwright test:local --grep "should do something" --reporter=list 2>&1 | tail -50

# Container tests (requires pnpm build:docker first)
pnpm --filter=n8n-playwright test:container:sqlite --grep @capability:email --reporter=list 2>&1 | tail -50
```

## Test Structure

```typescript
import { test, expect } from '../fixtures/base';
import { nanoid } from 'nanoid';

test('should do something @mode:sqlite', async ({ n8n, api }) => {
  // Setup via API (faster, more reliable)
  const workflow = await api.workflowApi.createWorkflow(workflowJson);

  // UI interaction via entry points
  await n8n.start.fromBlankCanvas();

  // Assertions
  await expect(n8n.workflows.getWorkflowByName(workflow.name)).toBeVisible();
});
```

## Entry Points

Use `n8n.start.*` methods - see `composables/TestEntryComposer.ts`:
- `fromBlankCanvas()` - New workflow
- `fromImportedWorkflow(file)` - Pre-built workflow
- `fromNewProjectBlankCanvas()` - Project-scoped
- `withUser(user)` - Isolated browser context

## Multi-User Tests

```typescript
const member = await api.publicApi.createUser({ role: 'global:member' });
const memberPage = await n8n.start.withUser(member);
await memberPage.navigate.toWorkflows();
```

## Development Process

1. **Validate spec** - Has file, behavior, pattern reference?
2. **Read existing code** - Understand current patterns in the file
3. **Identify helpers needed** - Check `pages/`, `services/`, `composables/`
4. **Add helpers first** if missing
5. **Write test** following 4-layer architecture
6. **Verify iteratively** - Small changes, test frequently

## Mandatory Verification

**Always run before marking complete:**

```bash
# 1. Tests pass (check output for failures - piping loses exit code)
pnpm --filter=n8n-playwright test:local <your-test> --reporter=list 2>&1 | tail -50

# 2. Not flaky (required)
pnpm --filter=n8n-playwright test:local <your-test> --repeat-each 3 --reporter=list 2>&1 | tail -50

# 3. Lint passes
pnpm --filter=n8n-playwright lint 2>&1 | tail -30

# 4. Typecheck passes
pnpm --filter=n8n-playwright typecheck 2>&1 | tail -30
```

**Important:** Piping through `tail` loses the exit code. Always check the output for "failed" or error messages rather than relying on exit codes.

**If any fail, fix before completing.**

## Refactoring Existing Tests

**Always verify tests pass BEFORE making changes:**
```bash
pnpm --filter=n8n-playwright test:local tests/e2e/target-file.spec.ts --reporter=list 2>&1 | tail -50
```

Then make small incremental changes, re-running after each.

## Done Checklist

- [ ] Spec had clear file, behavior, and pattern reference
- [ ] Read `AGENTS.md` and relevant existing code
- [ ] Used `n8n.start.*` entry points
- [ ] Used `nanoid()` for unique IDs (not `Date.now()`)
- [ ] No serial mode, `@db:reset`, or `n8n.api.signin()`
- [ ] Multi-user tests use `n8n.start.withUser()`
- [ ] Tests pass with `--repeat-each 3`
- [ ] Lint and typecheck pass


================================================
FILE: .github/claude-templates/security-fix.md
================================================
# Security Vulnerability Fix Guidelines

## Overview
This guide covers how to fix security vulnerabilities in the n8n codebase. Follow a systematic approach to identify, fix, and verify vulnerabilities in dependencies or base images.

## Decision Tree
```
Is it a direct dependency?
  → Yes: Update in catalog or package.json
  → No: Is it transitive?
    → Yes: Add pnpm override
    → No: Is it base image?
      → Yes: Update Dockerfile, trigger base image workflow
```

## Process Flow
```
Scan → Investigate → Fix → Verify
  ↓        ↓          ↓       ↓
pnpm    pnpm why   Update  pnpm
build:  (trace)    deps   build:
docker:            or      docker:
scan              override scan
```

## Step-by-Step Process

### 1. Initial Setup
Start with a clean install:
```bash
pnpm install --frozen-lockfile
```

### 2. Scan for Vulnerabilities
Run the Docker scan to verify if the vulnerability exists:
```bash
pnpm build:docker:scan
```

### 3. Investigate the Source
Use `pnpm why` to trace where the vulnerable package is coming from:
```bash
pnpm why <package-name> -r
```

### 4. Determine Fix Strategy

#### Case A: Direct Dependency
If the vulnerable package is a **direct dependency**:

**Update via Catalog** (preferred for shared dependencies):
```yaml
# pnpm-workspace.yaml
catalog:
  '@azure/identity': 4.13.0  # Updated version
```

```json
// packages/cli/package.json
{
  "dependencies": {
    "@azure/identity": "catalog:"
  }
}
```

**Or update directly in package.json:**
```json
{
  "dependencies": {
    "vulnerable-package": "^1.2.3"
  }
}
```

Then: `pnpm install`

#### Case B: Transitive Dependency
If the vulnerable package is a **transitive dependency**:

**Add an override** in the root `package.json`:
```json
{
  "pnpm": {
    "overrides": {
      "vulnerable-package": "^1.2.3"
    }
  }
}
```

**For multiple versions:**
```json
{
  "pnpm": {
    "overrides": {
      "vulnerable-package@3": "^3.2.1",
      "vulnerable-package@4": "^4.0.1"
    }
  }
}
```

Then: `pnpm install`

#### Case C: Base Image / NPM Issue
If the vulnerability comes from the **base Docker image**:

1. Check `docker/images/n8n-base/Dockerfile`
2. Update Node version or Alpine packages if needed
3. Note: Base image rebuild requires manual workflow trigger

### 5. Verify the Fix
```bash
pnpm install
pnpm why <package-name>  # Check version updated
pnpm build:docker:scan    # Confirm vulnerability resolved
```

## Commit & PR Standards

### Commit Format
```
{type}({scope}): {neutral description}

{Brief neutral context}

Addresses: CVE-XXXX-XXXXX
Refs: {LINEAR-ID}
```

### Type Selection
| Scenario | Type |
|----------|------|
| Dependency update | `fix(deps)` |
| Code vulnerability fix | `fix` |
| License/compliance | `chore` |
| Docker/build hardening | `build` |

### Title Language - USE NEUTRAL LANGUAGE
Commit/PR titles appear in changelogs. Use neutral language:

| ❌ Avoid | ✅ Use Instead |
|----------|----------------|
| CVE-XXXX-XXXXX | (footer only) |
| vulnerability, exploit | issue, concern |
| critical, security fix | improvement, update |
| patch vulnerability | validate, harden, ensure |

### Example Commit
**Good:**
```
fix(deps): update jws to 4.0.1

Updates jws package to latest stable version.

Addresses: CVE-2025-65945
Refs: SEC-412
```

**Bad:**
```
fix(security): patch critical CVE-2025-65945 in jws
```

## Done Checklist
- [ ] `pnpm build:docker:scan` shows no vulnerability for the CVE
- [ ] `pnpm why <package>` shows updated version
- [ ] Commit follows neutral language format (no CVE in title)
- [ ] PR references Linear ticket if provided

## Common Commands
```bash
pnpm install --frozen-lockfile  # Initial setup
pnpm build:docker:scan          # Scan for vulnerabilities
pnpm why <package-name> -r      # Investigate dependency
pnpm install                    # Update lockfile after changes
pnpm list <package-name>        # Check specific package versions
```


================================================
FILE: .github/docker-compose.yml
================================================
services:
  postgres:
    image: postgres:16
    restart: always
    environment:
      - POSTGRES_DB=n8n
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=password
    ports:
      - 5432:5432
    tmpfs:
      - /var/lib/postgresql/data


================================================
FILE: .github/poutine-rules/unpinned_action.rego
================================================
# METADATA
# title: Unpinned GitHub Action
# description: |-
#   GitHub Action not pinned to full commit SHA.
#   Pin actions to SHA for supply chain security.
# custom:
#   level: error
package rules.unpinned_action

import data.poutine
import rego.v1

rule := poutine.rule(rego.metadata.chain())

# Match 40-character hex SHA (Git) or 64-character sha256 digest (Docker)
is_sha_pinned(uses) if {
	regex.match(`@(sha256:[a-f0-9]{64}|[a-f0-9]{40})`, uses)
}

# Check if it's a local action (starts with ./)
is_local_action(uses) if {
	startswith(uses, "./")
}

# Check if it's a reusable workflow call
is_reusable_workflow(uses) if {
	contains(uses, ".github/workflows/")
}

results contains poutine.finding(rule, pkg.purl, {
	"path": workflow.path,
	"job": job.id,
	"step": i,
	"details": sprintf("Action '%s' should be pinned to a full commit SHA", [step.uses]),
}) if {
	pkg := input.packages[_]
	workflow := pkg.github_actions_workflows[_]
	job := workflow.jobs[_]
	step := job.steps[i]
	step.uses
	not is_sha_pinned(step.uses)
	not is_local_action(step.uses)
}


================================================
FILE: .github/pull_request_template.md
================================================
## Summary

<!--
Describe what the PR does and how to test.
Photos and videos are recommended.
-->

## Related Linear tickets, Github issues, and Community forum posts

<!--
Include links to **Linear ticket** or Github issue or Community forum post.
Important in order to close *automatically* and provide context to reviewers.
https://linear.app/n8n/issue/
-->
<!-- Use "closes #<issue-number>", "fixes #<issue-number>", or "resolves #<issue-number>" to automatically close issues when the PR is merged. -->


## Review / Merge checklist

- [ ] PR title and summary are descriptive. ([conventions](../blob/master/.github/pull_request_title_conventions.md)) <!--
   **Remember, the title automatically goes into the changelog.
   Use `(no-changelog)` otherwise.**
-->
- [ ] [Docs updated](https://github.com/n8n-io/n8n-docs) or follow-up ticket created.
- [ ] Tests included. <!--
   A bug is not considered fixed, unless a test is added to prevent it from happening again.
   A feature is not complete without tests.
-->
- [ ] PR Labeled with `Backport to Beta`, `Backport to Stable`, or `Backport to v1` (if the PR is an urgent fix that needs to be backported)


================================================
FILE: .github/pull_request_title_conventions.md
================================================
# PR Title Convention

We have very precise rules over how Pull Requests (to the `master` branch) must be formatted. This format basically follows the [Angular Commit Message Convention](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit). It leads to easier to read commit history and allows for automated generation of release notes:

A PR title consists of these elements:

```text
<type>(<scope>): <summary>
  │       │          │
  │       │          └─⫸ Summary: In imperative present tense.
  |       |                        Capitalized
  |       |                        No period at the end.
  │       │
  │       └─⫸ Scope: API | benchmark | core | editor | * Node
  │
  └─⫸ Type: build | ci | chore | docs | feat | fix | perf | refactor | test
```

- PR title
  - type
  - scope (_optional_)
  - summary
- PR description
  - body (optional)
  - blank line
  - footer (optional)

The structure looks like this:

## Type

Must be one of the following:

| type | description | appears in changelog |
| --- | --- | --- |
| `feat` | A new feature | ✅ |
| `fix` | A bug fix | ✅ |
| `perf` | A code change that improves performance | ✅ |
| `test` | Adding missing tests or correcting existing tests | ❌ |
| `docs` | Documentation only changes | ❌ |
| `refactor` | A behavior-neutral code change that neither fixes a bug nor adds a feature | ❌ |
| `build` | Changes that affect the build system or external dependencies (TypeScript, Jest, pnpm, etc.) | ❌ |
| `ci` | Changes to CI configuration files and scripts (e.g. Github actions) | ❌ |
| `chore` | Routine tasks, maintenance, and minor updates not covered by other types | ❌ |

> BREAKING CHANGES (see Footer section below), will **always** appear in the changelog unless suffixed with `no-changelog`.

## Scope (optional)

The scope should specify the place of the commit change as long as the commit clearly addresses one of the following supported scopes. (Otherwise, omit the scope!)

- `API` - changes to the _public_ API
- `benchmark` - changes to the benchmark cli
- `core` - changes to the core / private API / backend of n8n
- `editor` - changes to the Editor UI
- `* Node` - changes to a specific node or trigger node (”`*`” to be replaced with the node name, not its display name), e.g.
  - mattermost → Mattermost Node
  - microsoftToDo → Microsoft To Do Node
  - n8n → n8n Node

## Summary

The summary contains succinct description of the change:

- use the imperative, present tense: "change" not "changed" nor "changes"
- capitalize the first letter
- _no_ dot (.) at the end
- do _not_ include Linear ticket IDs etc. (e.g. N8N-1234)
- suffix with “(no-changelog)” for commits / PRs that should not get mentioned in the changelog.

## Body (optional)

Just as in the **summary**, use the imperative, present tense: "change" not "changed" nor "changes". The body should include the motivation for the change and contrast this with previous behavior.

## Footer (optional)

The footer can contain information about breaking changes and deprecations and is also the place to [reference GitHub issues](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword), Linear tickets, and other PRs that this commit closes or is related to. For example:

```text
BREAKING CHANGE: <breaking change summary>
<BLANK LINE>
<breaking change description + migration instructions>
<BLANK LINE>
<BLANK LINE>
Fixes #<issue number>
```

or

```text
DEPRECATED: <what is deprecated>
<BLANK LINE>
<deprecation description + recommended update path>
<BLANK LINE>
<BLANK LINE>
Closes #<pr number>
```

A Breaking Change section should start with the phrase "`BREAKING CHANGE:` " followed by a summary of the breaking change, a blank line, and a detailed description of the breaking change that also includes migration instructions.

> 💡 A breaking change can additionally also be marked by adding a “`!`” to the header, right before the “`:`”, e.g. `feat(editor)!: Remove support for dark mode`
>
> This makes locating breaking changes easier when just skimming through commit messages.

> 💡 The breaking changes must also be added to the [packages/cli/BREAKING-CHANGES.md](https://github.com/n8n-io/n8n/blob/master/packages/cli/BREAKING-CHANGES.md) file located in the n8n repository.

Similarly, a Deprecation section should start with "`DEPRECATED:` " followed by a short description of what is deprecated, a blank line, and a detailed description of the deprecation that also mentions the recommended update path.

### Revert commits

If the commit reverts a previous commit, it should begin with `revert:` , followed by the header of the reverted commit.

The content of the commit message body should contain:

- information about the SHA of the commit being reverted in the following format: `This reverts commit <SHA>`,
- a clear description of the reason for reverting the commit message.


================================================
FILE: .github/scripts/bump-versions.mjs
================================================
import semver from 'semver';
import { writeFile, readFile } from 'fs/promises';
import { resolve } from 'path';
import child_process from 'child_process';
import { promisify } from 'util';
import assert from 'assert';

const exec = promisify(child_process.exec);

function generateExperimentalVersion(currentVersion) {
	const parsed = semver.parse(currentVersion);
	if (!parsed) throw new Error(`Invalid version: ${currentVersion}`);

	// Check if it's already an experimental version
	if (parsed.prerelease.length > 0 && parsed.prerelease[0] === 'exp') {
		// Increment the experimental minor version
		const expMinor = (parsed.prerelease[1] || 0) + 1;
		return `${parsed.major}.${parsed.minor}.${parsed.patch}-exp.${expMinor}`;
	}

	// Create new experimental version: <major>.<minor>.<patch>-exp.0
	return `${parsed.major}.${parsed.minor}.${parsed.patch}-exp.0`;
}

const rootDir = process.cwd();
const releaseType = process.env.RELEASE_TYPE;
assert.match(releaseType, /^(patch|minor|major|experimental|premajor)$/, 'Invalid RELEASE_TYPE');

// TODO: if releaseType is `auto` determine release type based on the changelog

const lastTag = (await exec('git describe --tags --match "n8n@*" --abbrev=0')).stdout.trim();
const packages = JSON.parse(
	(
		await exec(
			`pnpm ls -r --only-projects --json | jq -r '[.[] | { name: .name, version: .version, path: .path,  private: .private}]'`,
		)
	).stdout,
);

const packageMap = {};
for (let { name, path, version, private: isPrivate } of packages) {
	if (isPrivate && path !== rootDir) continue;
	if (path === rootDir) name = 'monorepo-root';

	const isDirty = await exec(`git diff --quiet HEAD ${lastTag} -- ${path}`)
		.then(() => false)
		.catch((error) => true);

	packageMap[name] = { path, isDirty, version };
}

assert.ok(
	Object.values(packageMap).some(({ isDirty }) => isDirty),
	'No changes found since the last release',
);

// Propagate isDirty transitively: if a package's dependency will be bumped,
// that package also needs a bump (e.g. design-system → editor-ui → cli).

const depsByPackage = {};
for (const packageName in packageMap) {
	const packageFile = resolve(packageMap[packageName].path, 'package.json');
	const packageJson = JSON.parse(await readFile(packageFile, 'utf-8'));
	depsByPackage[packageName] = Object.keys(packageJson.dependencies || {});
}

let changed = true;
while (changed) {
	changed = false;
	for (const packageName in packageMap) {
		if (packageMap[packageName].isDirty) continue;
		if (depsByPackage[packageName].some((dep) => packageMap[dep]?.isDirty)) {
			packageMap[packageName].isDirty = true;
			changed = true;
		}
	}
}

// Keep the monorepo version up to date with the released version
packageMap['monorepo-root'].version = packageMap['n8n'].version;

for (const packageName in packageMap) {
	const { path, version, isDirty } = packageMap[packageName];
	const packageFile = resolve(path, 'package.json');
	const packageJson = JSON.parse(await readFile(packageFile, 'utf-8'));

	const dependencyIsDirty = Object.keys(packageJson.dependencies || {}).some(
		(dependencyName) => packageMap[dependencyName]?.isDirty,
	);

	let newVersion = version;

	if (isDirty || dependencyIsDirty) {
		switch (releaseType) {
			case 'experimental':
				newVersion = generateExperimentalVersion(version);
				break;
			case 'premajor':
				newVersion = semver.inc(
					version,
					version.includes('-rc.') ? 'prerelease' : 'premajor',
					undefined,
					'rc',
				);
				break;
			default:
				newVersion = semver.inc(version, releaseType);
				break;
		}
	}

	packageJson.version = packageMap[packageName].nextVersion = newVersion;

	await writeFile(packageFile, JSON.stringify(packageJson, null, 2) + '\n');
}

console.log(packageMap['n8n'].nextVersion);


================================================
FILE: .github/scripts/claude-task/prepare-claude-prompt.mjs
================================================
#!/usr/bin/env node
/**
 * Builds the Claude task prompt and writes it to GITHUB_ENV.
 * Uses a random delimiter to prevent heredoc collision with user input.
 *
 * Usage: node prepare-claude-prompt.mjs
 *
 * Environment variables:
 *   INPUT_TASK     - The task description (required)
 *   USE_RAW_PROMPT - "true" to pass task directly without wrapping
 *   GITHUB_ENV     - Path to GitHub env file (set by Actions)
 */

import { randomUUID } from 'node:crypto';
import { appendFileSync, readdirSync } from 'node:fs';

const task = process.env.INPUT_TASK;
const useRaw = process.env.USE_RAW_PROMPT === 'true';
const envFile = process.env.GITHUB_ENV;

if (!task) {
	console.error('INPUT_TASK environment variable is required');
	process.exit(1);
}

if (!envFile) {
	console.error('GITHUB_ENV environment variable is required');
	process.exit(1);
}

let prompt;

if (useRaw) {
	prompt = task;
} else {
	// List available templates so Claude knows what exists (reads them if needed)
	const templateDir = '.github/claude-templates';
	let templateSection = '';
	try {
		const files = readdirSync(templateDir).filter((f) => f.endsWith('.md'));
		if (files.length > 0) {
			const listing = files.map((f) => `  - ${templateDir}/${f}`).join('\n');
			templateSection = `\n# Templates\nThese guides are available if relevant to your task. Read any that match before starting:\n${listing}`;
		}
	} catch {
		// No templates directory, skip
	}

	prompt = `# Task
${task}
${templateSection}
# Instructions
1. Read any relevant templates listed above before starting
2. Complete the task described above
3. Make commits as you work - the last commit message will be used as the PR title
4. IMPORTANT: End every commit message with: Co-authored-by: Claude <noreply@anthropic.com>
5. Ensure code passes linting and type checks before finishing

# Token Optimization
When running lint/typecheck, suppress verbose output:
  pnpm lint 2>&1 | tail -30
  pnpm typecheck 2>&1 | tail -30`;
}

// Random delimiter guarantees no collision with user content
const delimiter = `CLAUDE_PROMPT_DELIM_${randomUUID().replace(/-/g, '')}`;
appendFileSync(envFile, `CLAUDE_PROMPT<<${delimiter}\n${prompt}\n${delimiter}\n`);



================================================
FILE: .github/scripts/claude-task/resume-callback.mjs
================================================
#!/usr/bin/env node
/**
 * Sends a callback to the resume URL with the Claude task result.
 * Uses fetch() directly to avoid E2BIG errors from shell argument limits.
 *
 * Usage: node resume-callback.mjs
 *
 * Environment variables:
 *   RESUME_URL      - Callback URL to POST to (required)
 *   EXECUTION_FILE  - Path to Claude's execution output JSON (optional)
 *   CLAUDE_OUTCOME  - "success" or "failure" (required)
 *   CLAUDE_SESSION_ID - Session ID for resuming conversations (optional)
 *   BRANCH_NAME     - Git branch name (optional)
 */

import { existsSync, readFileSync } from 'node:fs';

const resumeUrl = process.env.RESUME_URL;
const executionFile = process.env.EXECUTION_FILE;
const claudeOutcome = process.env.CLAUDE_OUTCOME;
const sessionId = process.env.CLAUDE_SESSION_ID ?? '';
const branchName = process.env.BRANCH_NAME ?? '';

if (!resumeUrl) {
	console.error('RESUME_URL environment variable is required');
	process.exit(1);
}

const success = claudeOutcome === 'success';
let result = null;

if (executionFile && existsSync(executionFile)) {
	try {
		const execution = JSON.parse(readFileSync(executionFile, 'utf-8'));
		// Extract the last element (Claude's final result message)
		result = Array.isArray(execution) ? execution.at(-1) : execution;
	} catch (err) {
		console.warn(`Failed to parse execution file: ${err.message}`);
	}
}

const payload = JSON.stringify({ success, branch: branchName, sessionId, result });

try {
	const response = await fetch(resumeUrl, {
		method: 'POST',
		headers: { 'Content-Type': 'application/json' },
		body: payload,
	});

	if (!response.ok) {
		const body = await response.text();
		console.error(`Callback failed: ${body}`);
		process.exit(1);
	}
} catch (err) {
	console.error(`Callback error: ${err.message}`);
	process.exit(1);
}


================================================
FILE: .github/scripts/cleanup-ghcr-images.mjs
================================================
#!/usr/bin/env node
/**
 * Cleanup GHCR images for n8n CI
 *
 * Modes:
 *   --tag <tag>     Delete exact tag (post-run cleanup)
 *   --stale <days>  Delete ci-* images older than N days (daily scheduled cleanup)
 *
 * Context:
 *   - Each CI run tags images as ci-{run_id}
 *   - Post-run cleanup uses --tag to delete the current run's images
 *   - Daily cron uses --stale to catch any orphaned images
 */
import { exec } from 'node:child_process';
import { promisify } from 'node:util';

const execAsync = promisify(exec);
const ORG = process.env.GHCR_ORG || 'n8n-io';
const REPO = process.env.GHCR_REPO || 'n8n';
const PACKAGES = [REPO, 'runners'];
const [mode, rawValue] = process.argv.slice(2);

if (!['--tag', '--stale'].includes(mode) || !rawValue) {
	console.error('Usage: cleanup-ghcr-images.mjs --tag <tag> | --stale <days>');
	process.exit(1);
}

const value = mode === '--stale' ? parseInt(rawValue, 10) : rawValue;
if (mode === '--stale' && (isNaN(value) || value <= 0)) {
	console.error('Error: --stale requires a positive number of days');
	process.exit(1);
}

async function ghApi(path) {
	const { stdout } = await execAsync(
		`gh api "/orgs/${ORG}/packages/container/${path}"`,
	);
	return JSON.parse(stdout);
}

async function ghDelete(path) {
	await execAsync(`gh api --method DELETE "/orgs/${ORG}/packages/container/${path}"`);
}

async function fetchPage(pkg, page) {
	try {
		return await ghApi(`${pkg}/versions?per_page=100&page=${page}`);
	} catch (err) {
		if (err.code === 1 && err.stderr?.includes('404')) return [];
		throw new Error(`Failed to fetch ${pkg} page ${page}: ${err.message}`);
	}
}

const isCiImage = (v) => {
	const tags = v.metadata?.container?.tags || [];
	return tags.some((t) => t.startsWith('ci-') || t.startsWith('pr-'));
};

const isStale = (v, days) => {
	const cutoff = Date.now() - days * 86400000;
	return isCiImage(v) && new Date(v.created_at) < cutoff;
};

async function getVersionsForTag(pkg, tag) {
	const batch = await fetchPage(pkg, 1);
	const match = batch.find((v) => v.metadata?.container?.tags?.includes(tag));
	return match ? [match] : [];
}

async function getVersionsForStale(pkg, days) {
	const versions = [];
	const cutoff = Date.now() - days * 86400000;
	// Use 2x cutoff as safety window for early termination
	const earlyExitCutoff = Date.now() - days * 2 * 86400000;
	let pagesWithoutCiImages = 0;

	const firstPage = await fetchPage(pkg, 1);
	if (!firstPage.length) return [];

	for (const v of firstPage) {
		if (isStale(v, days)) versions.push(v);
	}
	if (firstPage.length < 100) return versions;

	for (let page = 2; ; page += 10) {
		const batches = await Promise.all(
			Array.from({ length: 10 }, (_, i) => fetchPage(pkg, page + i)),
		);
		let done = false;
		for (const batch of batches) {
			if (!batch.length || batch.length < 100) done = true;

			let hasCiImages = false;
			for (const v of batch) {
				if (isCiImage(v)) {
					hasCiImages = true;
					if (new Date(v.created_at) < cutoff) versions.push(v);
				}
			}

			// Early termination: if we've gone through pages without finding
			// any CI images and all items are older than 2x cutoff, we're past
			// the CI image window
			if (!hasCiImages) {
				pagesWithoutCiImages++;
				const oldestInBatch = batch[batch.length - 1];
				if (
					pagesWithoutCiImages >= 3 &&
					oldestInBatch &&
					new Date(oldestInBatch.created_at) < earlyExitCutoff
				) {
					console.log(`  Early termination at page ${page + batches.indexOf(batch)}`);
					done = true;
				}
			} else {
				pagesWithoutCiImages = 0;
			}

			if (!batch.length || done) break;
		}
		if (done) break;
	}
	return versions;
}

let hasErrors = false;

for (const pkg of PACKAGES) {
	console.log(`Processing ${pkg}...`);
	let consecutiveErrors = 0;

	const toDelete =
		mode === '--tag'
			? await getVersionsForTag(pkg, value)
			: await getVersionsForStale(pkg, value);

	if (!toDelete.length) {
		console.log(`  No matching images found`);
		continue;
	}

	for (const v of toDelete) {
		try {
			await ghDelete(`${pkg}/versions/${v.id}`);
			console.log(`  Deleted ${v.metadata.container.tags.join(',')}`);
			consecutiveErrors = 0;
		} catch (err) {
			console.error(`  Failed to delete ${v.id}: ${err.message}`);
			hasErrors = true;
			if (++consecutiveErrors >= 3) {
				throw new Error('Too many consecutive delete failures, aborting');
			}
		}
	}
}

if (hasErrors) process.exit(1);


================================================
FILE: .github/scripts/cleanup-release-branch.mjs
================================================
import fs from 'node:fs/promises';
import { getOctokit } from '@actions/github';
import { ensureEnvVar, readPrLabels } from './github-helpers.mjs';

/**
 * @typedef {PullRequestCheckPass | PullRequestCheckFail} PullRequestCheckResult
 **/

/**
 * @typedef PullRequestCheckPass
 * @property {true} pass
 * @property {string} baseRef
 * */

/**
 * @typedef PullRequestCheckFail
 * @property {false} pass
 * @property {string} reason
 * */

/**
 * @param {PullRequestCheckResult} pullRequestCheck
 *
 * @returns { pullRequestCheck is PullRequestCheckFail }
 * */
function pullRequestCheckFailed(pullRequestCheck) {
	return !pullRequestCheck.pass;
}

/**
 * @param {any} pullRequest
 * @returns {PullRequestCheckResult}
 */
export function pullRequestIsDismissedRelease(pullRequest) {
	if (!pullRequest) {
		throw new Error('Missing pullRequest in event payload');
	}

	const baseRef = pullRequest?.base?.ref ?? '';
	const headRef = pullRequest?.head?.ref ?? '';
	const merged = Boolean(pullRequest?.merged);

	if (merged) {
		return { pass: false, reason: 'PR was merged' };
	}

	// Must match your release PR pattern:
	//   base: release/<ver>
	//   head: release-pr/<ver>
	if (!baseRef.startsWith('release/')) {
		return { pass: false, reason: `Base ref '${baseRef}' is not release/*` };
	}
	if (!headRef.startsWith('release-pr/')) {
		return { pass: false, reason: `Head ref '${headRef}' is not release-pr/*` };
	}

	const baseVer = baseRef.slice('release/'.length);
	const headVer = headRef.slice('release-pr/'.length);

	if (!baseVer || baseVer !== headVer) {
		return { pass: false, reason: `Version mismatch: base='${baseVer}' head='${headVer}'` };
	}

	const labelNames = readPrLabels(pullRequest);
	if (!labelNames.includes('release')) {
		return {
			pass: false,
			reason: `Missing required label 'release' (labels: ${labelNames.join(', ') || '[none]'})`,
		};
	}

	return { pass: true, baseRef };
}

async function main() {
	const token = ensureEnvVar('GITHUB_TOKEN');
	const eventPath = ensureEnvVar('GITHUB_EVENT_PATH');
	const repoFullName = ensureEnvVar('GITHUB_REPOSITORY');

	const [owner, repo] = repoFullName.split('/');
	if (!owner || !repo) {
		throw new Error(`Invalid GITHUB_REPOSITORY: '${repoFullName}'`);
	}

	const rawEventData = await fs.readFile(eventPath, 'utf8');
	const event = JSON.parse(rawEventData);

	const result = pullRequestIsDismissedRelease(event.pull_request);
	if (pullRequestCheckFailed(result)) {
		console.log(`no-op: ${result.reason}`);
		return;
	}

	const branch = result.baseRef; // e.g. "release/2.11.0"
	console.log(`PR qualifies. Deleting branch '${branch}'...`);

	const octokit = getOctokit(token);

	try {
		await octokit.rest.git.deleteRef({
			owner,
			repo,
			// ref must be "heads/<branch>"
			ref: `heads/${branch}`,
		});
		console.log(`Deleted '${branch}'.`);
	} catch (err) {
		// If it was already deleted, treat as success.
		const status = err?.status;
		if (status === 404) {
			console.log(`Branch '${branch}' not found (already deleted).`);
			return;
		}

		console.error(err);
		throw new Error(`Failed to delete '${branch}'.`);
	}
}

// only run when executed directly, not when imported by tests
if (import.meta.url === `file://${process.argv[1]}`) {
	await main();
}


================================================
FILE: .github/scripts/cleanup-release-branch.test.mjs
================================================
import { describe, it, mock, before } from 'node:test';
import assert from 'node:assert/strict';
import { readPrLabels } from './github-helpers.mjs';

/**
 * Run these tests by running
 *
 * node --test --experimental-test-module-mocks ./.github/scripts/cleanup-release-branch.test.mjs
 * */

// mock.module must be called before the module under test is imported,
// because static imports are hoisted and resolve before any code runs.
mock.module('./github-helpers.mjs', {
	namedExports: {
		ensureEnvVar: () => {}, // no-op
		readPrLabels: (pr) => {
			return readPrLabels(pr);
		},
	},
});

let pullRequestIsDismissedRelease;
before(async () => {
	({ pullRequestIsDismissedRelease } = await import('./cleanup-release-branch.mjs'));
});

describe('pullRequestIsDismissedRelease', () => {
	it('Recognizes classic dismissed pull request', () => {
		const pullRequest = {
			merged: false,
			labels: ['release'],
			base: {
				ref: 'release/2.9.0',
			},
			head: {
				ref: 'release-pr/2.9.0',
			},
		};

		/** @type { import('./cleanup-release-branch.mjs').PullRequestCheckResult } */
		const result = pullRequestIsDismissedRelease(pullRequest);

		assert.equal(result.pass, true);
		assert.equal(result.reason, undefined);
	});

	it("Doesn't pass PR with malformed head", () => {
		const pullRequest = {
			merged: false,
			labels: ['release'],
			base: {
				ref: 'release/2.9.0',
			},
			head: {
				ref: 'my-fork-release-pr/2.9.0',
			},
		};

		/** @type { import('./cleanup-release-branch.mjs').PullRequestCheckResult } */
		const result = pullRequestIsDismissedRelease(pullRequest);

		assert.equal(result.pass, false);
		assert.equal(result.reason, `Head ref '${pullRequest.head.ref}' is not release-pr/*`);
	});

	it("Doesn't pass PR with malformed base", () => {
		const pullRequest = {
			merged: false,
			labels: ['release'],
			base: {
				ref: 'master',
			},
			head: {
				ref: 'release-pr/2.9.0',
			},
		};

		/** @type { import('./cleanup-release-branch.mjs').PullRequestCheckResult } */
		const result = pullRequestIsDismissedRelease(pullRequest);

		assert.equal(result.pass, false);
		assert.equal(result.reason, `Base ref '${pullRequest.base.ref}' is not release/*`);
	});

	it("Doesn't pass merged PR's", () => {
		const pullRequest = {
			merged: true,
			labels: ['release'],
			base: {
				ref: 'release/2.9.0',
			},
			head: {
				ref: 'release-pr/2.9.0',
			},
		};

		/** @type { import('./cleanup-release-branch.mjs').PullRequestCheckResult } */
		const result = pullRequestIsDismissedRelease(pullRequest);

		assert.equal(result.pass, false);
		assert.equal(result.reason, `PR was merged`);
	});

	it("Doesn't pass on PR version mismatch", () => {
		const pullRequest = {
			merged: false,
			labels: ['release'],
			base: {
				ref: 'release/2.9.0',
			},
			head: {
				ref: 'release-pr/2.9.1',
			},
		};

		/** @type { import('./cleanup-release-branch.mjs').PullRequestCheckResult } */
		const result = pullRequestIsDismissedRelease(pullRequest);

		assert.equal(result.pass, false);
		assert.equal(
			result.reason,
			`Version mismatch: base='${pullRequest.base.ref.replace('release/', '')}' head='${pullRequest.head.ref.replace('release-pr/', '')}'`,
		);
	});

	it("Doesn't pass a PR with missing 'release' label", () => {
		const pullRequest = {
			merged: false,
			labels: ['release-pr', 'core-team'],
			base: {
				ref: 'release/2.9.0',
			},
			head: {
				ref: 'release-pr/2.9.0',
			},
		};

		/** @type { import('./cleanup-release-branch.mjs').PullRequestCheckResult } */
		const result = pullRequestIsDismissedRelease(pullRequest);

		assert.equal(result.pass, false);
		assert.equal(
			result.reason,
			`Missing required label 'release' (labels: ${pullRequest.labels.join(', ')})`,
		);
	});
});


================================================
FILE: .github/scripts/compute-backport-targets.mjs
================================================
// Creates backport PR's according to labels on merged PR

import {
	getPullRequestById,
	readPrLabels,
	resolveRcBranchForTrack,
	writeGithubOutput,
} from './github-helpers.mjs';

/** @type { Record<string, import('./github-helpers.mjs').ReleaseTrack> } */
const BACKPORT_BY_TAG_MAP = {
	'Backport to Beta': 'beta',
	'Backport to Stable': 'stable',
};

const BACKPORT_BY_BRANCH_MAP = {
	'Backport to v1': '1.x',
};

/**
 * @param {Set<string>} labels
 *
 * @returns { Set<string> }
 */
export function labelsToReleaseCandidateBranches(labels) {
	const targets = new Set();

	// Backport by tag map includes mapping of label to git tag to resolve
	for (const [label, tag] of Object.entries(BACKPORT_BY_TAG_MAP)) {
		// Check if backport label is present
		if (!labels.has(label)) {
			continue;
		}

		const branch = resolveRcBranchForTrack(tag);
		// Make sure our backport branch exists
		if (!branch) {
			continue;
		}

		targets.add(branch);
	}

	// Backport by branch map includes mapping of label to git branch. This is used for
	// older versions of n8n. v1, etc.
	for (const [label, branch] of Object.entries(BACKPORT_BY_BRANCH_MAP)) {
		// Check if backport label is present
		if (!labels.has(label)) {
			continue;
		}

		targets.add(branch);
	}

	return targets;
}

/**
 * This script is called in 2 cases:
 *
 * 1. When a PR is merged, in which case functions like `readPrLabels` reads PR info from GITHUB_EVENT_PATH
 * 2. Manually via Workflow Dispatch, where a Pull Request ID is passed as an env parameter
 *
 * @returns { Promise<undefined | any> } Pull request object, if ID was provided in env params
 */
async function fetchPossiblePullRequestFromEnv() {
	const pullRequestEnv = process.env.PULL_REQUEST_ID;
	if (!pullRequestEnv) {
		// No ID provided, will proceed to read data from GITHUB_EVENT_PATH
		return undefined;
	}

	const pullRequestNumber = parseInt(pullRequestEnv);
	if (isNaN(pullRequestNumber)) {
		throw new Error(
			"PULL_REQUEST_ID must be a number. It shouldn't contain any other symbols (#, PR, etc.)",
		);
	}

	return await getPullRequestById(pullRequestNumber);
}

export async function getLabels() {
	const pullRequest = await fetchPossiblePullRequestFromEnv();
	return new Set(readPrLabels(pullRequest));
}

async function main() {
	const labels = await getLabels();
	if (!labels || labels.size === 0) {
		console.log('No labels on PR. Exiting...');
		return;
	}

	const backportBranches = labelsToReleaseCandidateBranches(labels);

	if (backportBranches.size === 0) {
		console.log('No backports needed. Exiting...');
		return;
	}

	const target_branches = [...backportBranches].join(' '); // korthout/backport-action@v4 uses space-delimited branch list
	writeGithubOutput({ target_branches });
}

// only run when executed directly, not when imported by tests
if (import.meta.url === `file://${process.argv[1]}`) {
	await main();
}


================================================
FILE: .github/scripts/compute-backport-targets.test.mjs
================================================
import { describe, it, mock, before } from 'node:test';
import assert from 'node:assert/strict';
import { readPrLabels } from './github-helpers.mjs';

/**
 * Run these tests by running
 *
 * node --test --experimental-test-module-mocks ./.github/scripts/compute-backport-targets.test.mjs
 * */

// mock.module must be called before the module under test is imported,
// because static imports are hoisted and resolve before any code runs.
mock.module('./github-helpers.mjs', {
	namedExports: {
		ensureEnvVar: () => {}, // no-op
		readPrLabels: readPrLabels,
		resolveRcBranchForTrack: mockResolveRcBranchForTrack,
		writeGithubOutput: () => {}, //no-op
		getPullRequestById: () => {
			return {
				labels: ['n8n team', 'Backport to Beta'],
			};
		},
	},
});

function mockResolveRcBranchForTrack(track) {
	switch (track) {
		case 'beta':
			return 'release-candidate/2.10.1';
		case 'stable':
			return 'release-candidate/2.9.4';
	}
	return undefined;
}

let labelsToReleaseCandidateBranches, getLabels;
before(async () => {
	({ labelsToReleaseCandidateBranches, getLabels } = await import(
		'./compute-backport-targets.mjs'
	));
});

describe('Compute backport targets', () => {
	it('Finds backport branches for pointer tag labels', () => {
		const labels = new Set(['Backport to Beta', 'Backport to Stable']);
		/** @type { Set<string> } */
		const result = labelsToReleaseCandidateBranches(labels);

		assert.equal(result.size, 2);
		asser
Download .txt
Showing preview only (1,245K chars total). Download the full file or copy to clipboard to get everything.
gitextract_eip95s6_/

├── .actrc
├── .agents/
│   └── design-system-style-rules.md
├── .claude/
│   ├── README.md
│   ├── agents/
│   │   ├── n8n-developer.md
│   │   └── n8n-linear-issue-triager.md
│   ├── commands/
│   │   ├── n8n-plan.md
│   │   └── n8n-triage.md
│   ├── plugins/
│   │   └── n8n/
│   │       ├── .claude-plugin/
│   │       │   ├── marketplace.json
│   │       │   └── plugin.json
│   │       ├── README.md
│   │       └── skills/
│   │           └── setup-mcps/
│   │               └── SKILL.md
│   ├── settings.json
│   └── skills/
│       ├── content-design/
│       │   └── SKILL.md
│       ├── create-issue/
│       │   └── SKILL.md
│       ├── create-pr/
│       │   └── SKILL.md
│       ├── create-skill/
│       │   └── SKILL.md
│       ├── linear-issue/
│       │   └── SKILL.md
│       ├── loom-transcript/
│       │   └── SKILL.md
│       ├── n8n-conventions/
│       │   └── SKILL.md
│       ├── node-add-oauth/
│       │   └── SKILL.md
│       ├── reproduce-bug/
│       │   └── SKILL.md
│       └── spec-driven-development/
│           └── SKILL.md
├── .devcontainer/
│   ├── Dockerfile
│   ├── devcontainer.json
│   └── docker-compose.yml
├── .dockerignore
├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CI-TELEMETRY.md
│   ├── CLAUDE.md
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── 01-bug.yml
│   │   └── config.yml
│   ├── WORKFLOWS.md
│   ├── actionlint.yml
│   ├── actions/
│   │   ├── ci-filter/
│   │   │   ├── __tests__/
│   │   │   │   └── ci-filter.test.ts
│   │   │   ├── action.yml
│   │   │   └── ci-filter.mjs
│   │   ├── docker-registry-login/
│   │   │   └── action.yml
│   │   └── setup-nodejs/
│   │       └── action.yml
│   ├── claude-templates/
│   │   ├── e2e-test.md
│   │   └── security-fix.md
│   ├── docker-compose.yml
│   ├── poutine-rules/
│   │   └── unpinned_action.rego
│   ├── pull_request_template.md
│   ├── pull_request_title_conventions.md
│   ├── scripts/
│   │   ├── bump-versions.mjs
│   │   ├── claude-task/
│   │   │   ├── prepare-claude-prompt.mjs
│   │   │   └── resume-callback.mjs
│   │   ├── cleanup-ghcr-images.mjs
│   │   ├── cleanup-release-branch.mjs
│   │   ├── cleanup-release-branch.test.mjs
│   │   ├── compute-backport-targets.mjs
│   │   ├── compute-backport-targets.test.mjs
│   │   ├── create-github-release.mjs
│   │   ├── detect-new-packages.mjs
│   │   ├── determine-release-candidate-branch-for-track.mjs
│   │   ├── determine-release-version-changes.mjs
│   │   ├── determine-release-version-changes.test.mjs
│   │   ├── determine-version-info.mjs
│   │   ├── determine-version-info.test.mjs
│   │   ├── docker/
│   │   │   ├── docker-config.mjs
│   │   │   ├── docker-tags.mjs
│   │   │   └── get-manifest-digests.mjs
│   │   ├── ensure-provenance-fields.mjs
│   │   ├── ensure-release-candidate-branches.mjs
│   │   ├── ensure-release-candidate-branches.test.mjs
│   │   ├── fixtures/
│   │   │   └── mock-github-event.json
│   │   ├── get-release-versions.mjs
│   │   ├── github-helpers.mjs
│   │   ├── jsconfig.json
│   │   ├── move-track-tag.mjs
│   │   ├── package.json
│   │   ├── plan-release.mjs
│   │   ├── populate-cloud-databases.mjs
│   │   ├── promote-github-release.mjs
│   │   ├── retry.mjs
│   │   ├── send-build-stats.mjs
│   │   ├── send-docker-stats.mjs
│   │   ├── send-metrics.mjs
│   │   ├── send-version-release-notification.mjs
│   │   ├── trim-fe-packageJson.js
│   │   └── update-changelog.mjs
│   ├── test-metrics/
│   │   └── playwright.json
│   └── workflows/
│       ├── backport.yml
│       ├── build-base-image.yml
│       ├── build-benchmark-image.yml
│       ├── build-windows.yml
│       ├── ci-check-pr-title.yml
│       ├── ci-check-release-from-fork.yml
│       ├── ci-detect-new-packages.yml
│       ├── ci-master.yml
│       ├── ci-pull-requests.yml
│       ├── ci-python.yml
│       ├── ci-restrict-private-merges.yml
│       ├── docker-build-push.yml
│       ├── docker-build-smoke.yml
│       ├── release-create-github-releases.yml
│       ├── release-create-minor-pr.yml
│       ├── release-create-patch-pr.yml
│       ├── release-create-pr.yml
│       ├── release-merge-tag-to-branch.yml
│       ├── release-populate-cloud-with-releases.yml
│       ├── release-promote-github-release.yml
│       ├── release-publish-new-package.yml
│       ├── release-publish-post-release.yml
│       ├── release-publish.yml
│       ├── release-push-to-channel.yml
│       ├── release-schedule-patch-prs.yml
│       ├── release-standalone-package.yml
│       ├── release-update-pointer-tag.yml
│       ├── release-version-release-notification.yml
│       ├── sbom-generation-callable.yml
│       ├── sec-ci-reusable.yml
│       ├── sec-poutine-reusable.yml
│       ├── sec-publish-fix-1x.yml
│       ├── sec-publish-fix.yml
│       ├── sec-sync-public-to-private.yml
│       ├── security-trivy-scan-callable.yml
│       ├── test-bench-reusable.yml
│       ├── test-benchmark-destroy-nightly.yml
│       ├── test-benchmark-nightly.yml
│       ├── test-db-reusable.yml
│       ├── test-e2e-ci-reusable.yml
│       ├── test-e2e-coverage-weekly.yml
│       ├── test-e2e-docker-pull-reusable.yml
│       ├── test-e2e-helm.yml
│       ├── test-e2e-infrastructure-reusable.yml
│       ├── test-e2e-performance-reusable.yml
│       ├── test-e2e-reusable.yml
│       ├── test-evals-ai-release.yml
│       ├── test-evals-ai-reusable.yml
│       ├── test-evals-ai.yml
│       ├── test-evals-python.yml
│       ├── test-linting-reusable.yml
│       ├── test-unit-reusable.yml
│       ├── test-visual-chromatic.yml
│       ├── test-visual-storybook.yml
│       ├── test-workflow-scripts-reusable.yml
│       ├── test-workflows-callable.yml
│       ├── test-workflows-nightly.yml
│       ├── test-workflows-pr-comment.yml
│       ├── util-approve-and-set-automerge.yml
│       ├── util-backport-bundle.yml
│       ├── util-claude-task.yml
│       ├── util-claude.yml
│       ├── util-cleanup-abandoned-release-branches.yml
│       ├── util-cleanup-pr-images.yml
│       ├── util-data-tooling.yml
│       ├── util-determine-current-version.yml
│       ├── util-ensure-release-candidate-branches.yml
│       ├── util-notify-pr-status.yml
│       ├── util-sync-api-docs.yml
│       └── util-update-node-popularity.yml
├── .gitignore
├── .npmignore
├── .npmrc
├── .poutine.yml
├── .prettierignore
├── .prettierrc.js
├── .vscode/
│   ├── extensions.json
│   └── settings.default.json
├── AGENTS.md
├── CHANGELOG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTOR_LICENSE_AGREEMENT.md
├── LICENSE.md
├── LICENSE_EE.md
├── README.md
├── SECURITY.md
├── biome.jsonc
├── codecov.yml
├── cubic.yaml
├── docker/
│   └── images/
│       ├── n8n/
│       │   ├── Dockerfile
│       │   ├── README.md
│       │   └── docker-entrypoint.sh
│       ├── n8n-base/
│       │   └── Dockerfile
│       └── runners/
│           ├── Dockerfile
│           ├── Dockerfile.distroless
│           ├── README.md
│           └── n8n-task-runners.json
├── jest.config.js
├── lefthook.yml
├── package.json
├── packages/
│   ├── @n8n/
│   │   ├── agents/
│   │   │   ├── AGENTS.md
│   │   │   ├── docs/
│   │   │   │   └── agent-runtime-architecture.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── examples/
│   │   │   │   └── basic-agent.ts
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── agent-runtime.test.ts
│   │   │   │   │   ├── event-bus.test.ts
│   │   │   │   │   ├── fixtures/
│   │   │   │   │   │   └── mcp-stdio-server.mjs
│   │   │   │   │   ├── inmemory-working-memory.test.ts
│   │   │   │   │   ├── integration/
│   │   │   │   │   │   ├── batched-tool-execution.test.ts
│   │   │   │   │   │   ├── concurrent-tool-execution.test.ts
│   │   │   │   │   │   ├── custom-message-suspend-resume.test.ts
│   │   │   │   │   │   ├── evaluate.test.ts
│   │   │   │   │   │   ├── events-and-abort.test.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── json-schema-validation.test.ts
│   │   │   │   │   │   ├── mcp-connection.test.ts
│   │   │   │   │   │   ├── mcp-runtime.test.ts
│   │   │   │   │   │   ├── mcp-server-helpers.ts
│   │   │   │   │   │   ├── mcp-sse-transport.test.ts
│   │   │   │   │   │   ├── mcp-stdio-transport.test.ts
│   │   │   │   │   │   ├── mcp-streamable-http-transport.test.ts
│   │   │   │   │   │   ├── memory/
│   │   │   │   │   │   │   ├── memory-custom-backend.test.ts
│   │   │   │   │   │   │   ├── memory-freeform.test.ts
│   │   │   │   │   │   │   ├── memory-postgres.test.ts
│   │   │   │   │   │   │   ├── memory-semantic.test.ts
│   │   │   │   │   │   │   ├── memory-sqlite.test.ts
│   │   │   │   │   │   │   ├── memory-structured.test.ts
│   │   │   │   │   │   │   └── memory.test.ts
│   │   │   │   │   │   ├── multi-tool-calls.test.ts
│   │   │   │   │   │   ├── multimodal.test.ts
│   │   │   │   │   │   ├── orphaned-tool-messages.test.ts
│   │   │   │   │   │   ├── provider-metadata.test.ts
│   │   │   │   │   │   ├── provider-options.test.ts
│   │   │   │   │   │   ├── provider-tools.test.ts
│   │   │   │   │   │   ├── state-restore-after-suspension.test.ts
│   │   │   │   │   │   ├── stream-timing.test.ts
│   │   │   │   │   │   ├── structured-output.test.ts
│   │   │   │   │   │   ├── sub-agent.test.ts
│   │   │   │   │   │   ├── telemetry-langsmith.test.ts
│   │   │   │   │   │   ├── thinking.test.ts
│   │   │   │   │   │   ├── title-generation.test.ts
│   │   │   │   │   │   ├── to-model-output.test.ts
│   │   │   │   │   │   ├── token-usage.test.ts
│   │   │   │   │   │   ├── tool-error-handling.test.ts
│   │   │   │   │   │   ├── tool-interrupt.test.ts
│   │   │   │   │   │   ├── tool-result-to-message.test.ts
│   │   │   │   │   │   ├── usage.test.ts
│   │   │   │   │   │   ├── workspace/
│   │   │   │   │   │   │   └── workspace-agent.test.ts
│   │   │   │   │   │   └── zod-validation-error.test.ts
│   │   │   │   │   ├── model-factory.test.ts
│   │   │   │   │   ├── sqlite-memory.test.ts
│   │   │   │   │   ├── strip-orphaned-tool-messages.test.ts
│   │   │   │   │   ├── telemetry.test.ts
│   │   │   │   │   ├── tool-adapter.test.ts
│   │   │   │   │   ├── tool.test.ts
│   │   │   │   │   ├── working-memory.test.ts
│   │   │   │   │   └── workspace/
│   │   │   │   │       ├── base-filesystem.test.ts
│   │   │   │   │       ├── base-sandbox.test.ts
│   │   │   │   │       ├── lifecycle.test.ts
│   │   │   │   │       ├── test-utils.ts
│   │   │   │   │       ├── workspace-integration.test.ts
│   │   │   │   │       ├── workspace-tools.test.ts
│   │   │   │   │       └── workspace.test.ts
│   │   │   │   ├── evals/
│   │   │   │   │   ├── categorization.ts
│   │   │   │   │   ├── contains-keywords.ts
│   │   │   │   │   ├── correctness.ts
│   │   │   │   │   ├── helpfulness.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── json-validity.ts
│   │   │   │   │   ├── parse-judge-response.ts
│   │   │   │   │   ├── string-similarity.ts
│   │   │   │   │   └── tool-call-accuracy.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── integrations/
│   │   │   │   │   └── langsmith.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── agent-runtime.ts
│   │   │   │   │   ├── event-bus.ts
│   │   │   │   │   ├── logger.ts
│   │   │   │   │   ├── mcp-connection.ts
│   │   │   │   │   ├── mcp-tool-resolver.ts
│   │   │   │   │   ├── memory-store.ts
│   │   │   │   │   ├── message-list.ts
│   │   │   │   │   ├── messages.ts
│   │   │   │   │   ├── model-factory.ts
│   │   │   │   │   ├── run-state.ts
│   │   │   │   │   ├── runtime-helpers.ts
│   │   │   │   │   ├── stream.ts
│   │   │   │   │   ├── strip-orphaned-tool-messages.ts
│   │   │   │   │   ├── title-generation.ts
│   │   │   │   │   ├── tool-adapter.ts
│   │   │   │   │   └── working-memory.ts
│   │   │   │   ├── sdk/
│   │   │   │   │   ├── agent.ts
│   │   │   │   │   ├── catalog.ts
│   │   │   │   │   ├── eval.ts
│   │   │   │   │   ├── evaluate.ts
│   │   │   │   │   ├── guardrail.ts
│   │   │   │   │   ├── mcp-client.ts
│   │   │   │   │   ├── memory.ts
│   │   │   │   │   ├── message.ts
│   │   │   │   │   ├── network.ts
│   │   │   │   │   ├── provider-tools.ts
│   │   │   │   │   ├── telemetry.ts
│   │   │   │   │   ├── tool.ts
│   │   │   │   │   └── verify.ts
│   │   │   │   ├── storage/
│   │   │   │   │   ├── postgres-memory.ts
│   │   │   │   │   └── sqlite-memory.ts
│   │   │   │   ├── types/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── runtime/
│   │   │   │   │   │   ├── event.ts
│   │   │   │   │   │   └── message-list.ts
│   │   │   │   │   ├── sdk/
│   │   │   │   │   │   ├── agent.ts
│   │   │   │   │   │   ├── eval.ts
│   │   │   │   │   │   ├── guardrail.ts
│   │   │   │   │   │   ├── mcp.ts
│   │   │   │   │   │   ├── memory.ts
│   │   │   │   │   │   ├── message.ts
│   │   │   │   │   │   ├── provider.ts
│   │   │   │   │   │   └── tool.ts
│   │   │   │   │   ├── telemetry.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       └── json.ts
│   │   │   │   ├── utils/
│   │   │   │   │   └── zod.ts
│   │   │   │   └── workspace/
│   │   │   │       ├── filesystem/
│   │   │   │       │   └── base-filesystem.ts
│   │   │   │       ├── index.ts
│   │   │   │       ├── lifecycle.ts
│   │   │   │       ├── process.ts
│   │   │   │       ├── sandbox/
│   │   │   │       │   └── base-sandbox.ts
│   │   │   │       ├── tools/
│   │   │   │       │   ├── append-file.ts
│   │   │   │       │   ├── copy-file.ts
│   │   │   │       │   ├── delete-file.ts
│   │   │   │       │   ├── execute-command.ts
│   │   │   │       │   ├── file-stat.ts
│   │   │   │       │   ├── list-files.ts
│   │   │   │       │   ├── mkdir.ts
│   │   │   │       │   ├── move-file.ts
│   │   │   │       │   ├── process-tools.ts
│   │   │   │       │   ├── read-file.ts
│   │   │   │       │   ├── rmdir.ts
│   │   │   │       │   ├── workspace-tools.ts
│   │   │   │       │   └── write-file.ts
│   │   │   │       ├── types.ts
│   │   │   │       └── workspace.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.integration.config.mjs
│   │   ├── ai-node-sdk/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   └── index.ts
│   │   │   ├── tsconfig.build.cjs.json
│   │   │   ├── tsconfig.build.esm.json
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── ai-utilities/
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── integration-tests/
│   │   │   │   ├── openai.fixtures.ts
│   │   │   │   ├── openai.test.ts
│   │   │   │   └── openai.ts
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   └── copy-tokenizer-json.js
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── adapters/
│   │   │   │   │   │   ├── langchain-chat-model.test.ts
│   │   │   │   │   │   ├── langchain-history-adapter.test.ts
│   │   │   │   │   │   └── langchain-memory-adapter.test.ts
│   │   │   │   │   ├── converters/
│   │   │   │   │   │   ├── message-roundtrip.test.ts
│   │   │   │   │   │   └── tool.test.ts
│   │   │   │   │   ├── memory/
│   │   │   │   │   │   └── windowed-chat-memory.test.ts
│   │   │   │   │   ├── suppliers/
│   │   │   │   │   │   └── supplyModel.test.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── embeddings-input-validation.test.ts
│   │   │   │   │       ├── failed-attempt-handler/
│   │   │   │   │       │   ├── n8nDefaultFailedAttemptHandler.test.ts
│   │   │   │   │       │   └── n8nLlmFailedAttemptHandler.test.ts
│   │   │   │   │       ├── fromai-tool-factory.test.ts
│   │   │   │   │       ├── helpers.test.ts
│   │   │   │   │       ├── http-proxy-agent.test.ts
│   │   │   │   │       ├── log-ai-event.test.ts
│   │   │   │   │       ├── n8n-binary-loader.test.ts
│   │   │   │   │       ├── n8n-json-loader.test.ts
│   │   │   │   │       ├── n8n-llm-tracing.test.ts
│   │   │   │   │       ├── sse.test.ts
│   │   │   │   │       └── tokenizer/
│   │   │   │   │           ├── tiktoken.test.ts
│   │   │   │   │           └── token-estimator.test.ts
│   │   │   │   ├── adapters/
│   │   │   │   │   ├── langchain-chat-model.ts
│   │   │   │   │   ├── langchain-history.ts
│   │   │   │   │   └── langchain-memory.ts
│   │   │   │   ├── ai-node-sdk-version.ts
│   │   │   │   ├── chat-model/
│   │   │   │   │   └── base.ts
│   │   │   │   ├── converters/
│   │   │   │   │   ├── message.ts
│   │   │   │   │   └── tool.ts
│   │   │   │   ├── guards.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── memory/
│   │   │   │   │   ├── base-chat-history.ts
│   │   │   │   │   ├── base-chat-memory.ts
│   │   │   │   │   └── windowed-chat-memory.ts
│   │   │   │   ├── suppliers/
│   │   │   │   │   ├── supplyMemory.ts
│   │   │   │   │   └── supplyModel.ts
│   │   │   │   ├── types/
│   │   │   │   │   ├── chat-model.ts
│   │   │   │   │   ├── json.ts
│   │   │   │   │   ├── memory.ts
│   │   │   │   │   ├── message.ts
│   │   │   │   │   ├── openai.ts
│   │   │   │   │   ├── output.ts
│   │   │   │   │   └── tool.ts
│   │   │   │   └── utils/
│   │   │   │       ├── embeddings-input-validation.ts
│   │   │   │       ├── failed-attempt-handler/
│   │   │   │       │   ├── n8nDefaultFailedAttemptHandler.ts
│   │   │   │       │   └── n8nLlmFailedAttemptHandler.ts
│   │   │   │       ├── fromai-tool-factory.ts
│   │   │   │       ├── helpers.ts
│   │   │   │       ├── http-proxy-agent.ts
│   │   │   │       ├── log-ai-event.ts
│   │   │   │       ├── log-wrapper.ts
│   │   │   │       ├── n8n-binary-loader.ts
│   │   │   │       ├── n8n-json-loader.ts
│   │   │   │       ├── n8n-llm-tracing.ts
│   │   │   │       ├── shared-fields.ts
│   │   │   │       ├── sse.ts
│   │   │   │       ├── tokenizer/
│   │   │   │       │   ├── cl100k_base.json
│   │   │   │       │   ├── o200k_base.json
│   │   │   │       │   ├── tiktoken.ts
│   │   │   │       │   └── token-estimator.ts
│   │   │   │       └── vector-store/
│   │   │   │           ├── MemoryManager/
│   │   │   │           │   ├── MemoryCalculator.ts
│   │   │   │           │   ├── MemoryVectorStoreManager.ts
│   │   │   │           │   ├── StoreCleanupService.ts
│   │   │   │           │   ├── config.ts
│   │   │   │           │   ├── test/
│   │   │   │           │   │   ├── MemoryCalculator.test.ts
│   │   │   │           │   │   ├── MemoryVectorStoreManager.test.ts
│   │   │   │           │   │   ├── StoreCleanupService.test.ts
│   │   │   │           │   │   └── config.test.ts
│   │   │   │           │   └── types.ts
│   │   │   │           ├── createVectorStoreNode/
│   │   │   │           │   ├── README.md
│   │   │   │           │   ├── __snapshots__/
│   │   │   │           │   │   └── createVectorStoreNode.test.ts.snap
│   │   │   │           │   ├── __tests__/
│   │   │   │           │   │   └── utils.test.ts
│   │   │   │           │   ├── constants.ts
│   │   │   │           │   ├── createVectorStoreNode.test.ts
│   │   │   │           │   ├── createVectorStoreNode.ts
│   │   │   │           │   ├── operations/
│   │   │   │           │   │   ├── __tests__/
│   │   │   │           │   │   │   ├── insertOperation.test.ts
│   │   │   │           │   │   │   ├── loadOperation.test.ts
│   │   │   │           │   │   │   ├── operationHandlers.test.ts
│   │   │   │           │   │   │   ├── retrieveAsToolExecuteOperation.test.ts
│   │   │   │           │   │   │   ├── retrieveAsToolOperation.test.ts
│   │   │   │           │   │   │   ├── retrieveOperation.test.ts
│   │   │   │           │   │   │   └── updateOperation.test.ts
│   │   │   │           │   │   ├── index.ts
│   │   │   │           │   │   ├── insertOperation.ts
│   │   │   │           │   │   ├── loadOperation.ts
│   │   │   │           │   │   ├── retrieveAsToolExecuteOperation.ts
│   │   │   │           │   │   ├── retrieveAsToolOperation.ts
│   │   │   │           │   │   ├── retrieveOperation.ts
│   │   │   │           │   │   └── updateOperation.ts
│   │   │   │           │   ├── types.ts
│   │   │   │           │   └── utils.ts
│   │   │   │           └── processDocuments.ts
│   │   │   ├── tsconfig.build.cjs.json
│   │   │   ├── tsconfig.build.esm.json
│   │   │   └── tsconfig.json
│   │   ├── ai-workflow-builder.ee/
│   │   │   ├── .gitignore
│   │   │   ├── .madgerc
│   │   │   ├── AGENTS.md
│   │   │   ├── CLAUDE.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── evaluations/
│   │   │   │   ├── README.md
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── argument-parser.test.ts
│   │   │   │   │   ├── cli.test.ts
│   │   │   │   │   ├── csv-prompt-loader.test.ts
│   │   │   │   │   ├── evaluation-helpers.test.ts
│   │   │   │   │   ├── evaluators/
│   │   │   │   │   │   ├── llm-judge.test.ts
│   │   │   │   │   │   ├── pairwise.test.ts
│   │   │   │   │   │   ├── programmatic.test.ts
│   │   │   │   │   │   ├── response-matches-workflow-changes.test.ts
│   │   │   │   │   │   └── similarity.test.ts
│   │   │   │   │   ├── feedback.test.ts
│   │   │   │   │   ├── lifecycle.test.ts
│   │   │   │   │   ├── output.test.ts
│   │   │   │   │   ├── report-generator.test.ts
│   │   │   │   │   ├── runner-langsmith.test.ts
│   │   │   │   │   ├── runner.test.ts
│   │   │   │   │   ├── score-calculator.test.ts
│   │   │   │   │   ├── test-case-generator.test.ts
│   │   │   │   │   ├── trace-filters.test.ts
│   │   │   │   │   └── webhook.test.ts
│   │   │   │   ├── cli/
│   │   │   │   │   ├── argument-parser.ts
│   │   │   │   │   ├── ci-metadata.ts
│   │   │   │   │   ├── csv-prompt-loader.ts
│   │   │   │   │   ├── dataset-file-loader.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── webhook.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── evaluators/
│   │   │   │   │   ├── binary-checks/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── index.test.ts
│   │   │   │   │   │   ├── checks/
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   └── deterministic-checks.test.ts
│   │   │   │   │   │   │   ├── all-nodes-connected.ts
│   │   │   │   │   │   │   ├── create-validation-check.ts
│   │   │   │   │   │   │   ├── expressions-reference-existing-nodes.ts
│   │   │   │   │   │   │   ├── has-start-node.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── no-empty-set-nodes.ts
│   │   │   │   │   │   │   ├── no-unnecessary-code-nodes.ts
│   │   │   │   │   │   │   ├── no-unreachable-nodes.ts
│   │   │   │   │   │   │   └── validation-checks.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── llm-checks/
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   └── create-llm-check.test.ts
│   │   │   │   │   │   │   ├── correct-node-operations.ts
│   │   │   │   │   │   │   ├── create-llm-check.ts
│   │   │   │   │   │   │   ├── descriptive-node-names.ts
│   │   │   │   │   │   │   ├── fulfills-user-request.ts
│   │   │   │   │   │   │   ├── handles-multiple-items.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── response-matches-workflow-changes.ts
│   │   │   │   │   │   │   ├── schemas.ts
│   │   │   │   │   │   │   └── valid-data-flow.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── execution/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── llm-judge/
│   │   │   │   │   │   ├── evaluation.ts
│   │   │   │   │   │   ├── evaluators/
│   │   │   │   │   │   │   ├── base.ts
│   │   │   │   │   │   │   ├── best-practices-evaluator.ts
│   │   │   │   │   │   │   ├── connections-evaluator.ts
│   │   │   │   │   │   │   ├── data-flow-evaluator.ts
│   │   │   │   │   │   │   ├── efficiency-evaluator.ts
│   │   │   │   │   │   │   ├── expressions-evaluator.ts
│   │   │   │   │   │   │   ├── functionality-evaluator.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── maintainability-evaluator.ts
│   │   │   │   │   │   │   └── node-configuration-evaluator.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── workflow-evaluator.test.ts
│   │   │   │   │   │   └── workflow-evaluator.ts
│   │   │   │   │   ├── pairwise/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── judge-chain.test.ts
│   │   │   │   │   │   ├── judge-chain.ts
│   │   │   │   │   │   ├── judge-panel.test.ts
│   │   │   │   │   │   ├── judge-panel.ts
│   │   │   │   │   │   └── metrics.ts
│   │   │   │   │   ├── programmatic/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── responder/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── responder-judge.prompt.ts
│   │   │   │   │   └── similarity/
│   │   │   │   │       └── index.ts
│   │   │   │   ├── fixtures/
│   │   │   │   │   ├── default-prompts.csv
│   │   │   │   │   └── reference-workflows/
│   │   │   │   │       ├── ai-news-digest.json
│   │   │   │   │       ├── daily-weather-report.json
│   │   │   │   │       ├── email-summary.json
│   │   │   │   │       ├── extract-from-file.json
│   │   │   │   │       ├── google-sheets-processing.json
│   │   │   │   │       ├── invoice-pipeline.json
│   │   │   │   │       ├── lead-qualification.json
│   │   │   │   │       ├── multi-agent-research.json
│   │   │   │   │       ├── rag-assistant.json
│   │   │   │   │       └── youtube-auto-chapters.json
│   │   │   │   ├── harness/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── csv-writer.test.ts
│   │   │   │   │   │   └── token-tracking-handler.test.ts
│   │   │   │   │   ├── csv-writer.ts
│   │   │   │   │   ├── evaluation-helpers.ts
│   │   │   │   │   ├── feedback.ts
│   │   │   │   │   ├── harness-types.ts
│   │   │   │   │   ├── langsmith-dataset-writer.ts
│   │   │   │   │   ├── lifecycle.ts
│   │   │   │   │   ├── logger.ts
│   │   │   │   │   ├── output.ts
│   │   │   │   │   ├── runner.ts
│   │   │   │   │   ├── score-calculator.ts
│   │   │   │   │   ├── subgraph-evaluation-local.ts
│   │   │   │   │   ├── subgraph-evaluation.ts
│   │   │   │   │   ├── subgraph-runner.ts
│   │   │   │   │   ├── token-tracking-handler.ts
│   │   │   │   │   └── workflow-regenerator.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── langsmith/
│   │   │   │   │   ├── trace-filters.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── lifecycles/
│   │   │   │   │   └── introspection-analysis.ts
│   │   │   │   ├── programmatic/
│   │   │   │   │   ├── evaluators/
│   │   │   │   │   │   ├── agent-prompt.test.ts
│   │   │   │   │   │   ├── agent-prompt.ts
│   │   │   │   │   │   ├── connections.test.ts
│   │   │   │   │   │   ├── connections.ts
│   │   │   │   │   │   ├── credentials.test.ts
│   │   │   │   │   │   ├── credentials.ts
│   │   │   │   │   │   ├── from-ai.ts
│   │   │   │   │   │   ├── graph-validation.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── node-usage.ts
│   │   │   │   │   │   ├── nodes.test.ts
│   │   │   │   │   │   ├── nodes.ts
│   │   │   │   │   │   ├── parameters.test.ts
│   │   │   │   │   │   ├── parameters.ts
│   │   │   │   │   │   ├── tools.ts
│   │   │   │   │   │   ├── trigger.test.ts
│   │   │   │   │   │   ├── trigger.ts
│   │   │   │   │   │   ├── workflow-similarity.test.ts
│   │   │   │   │   │   └── workflow-similarity.ts
│   │   │   │   │   ├── programmatic-evaluation.ts
│   │   │   │   │   ├── python/
│   │   │   │   │   │   ├── CONFIGURATION.md
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── example_workflows/
│   │   │   │   │   │   │   ├── generated.json
│   │   │   │   │   │   │   ├── generated_wrong.json
│   │   │   │   │   │   │   ├── multi_trigger.json
│   │   │   │   │   │   │   ├── multi_trigger_different_order.json
│   │   │   │   │   │   │   ├── multi_trigger_missing_node.json
│   │   │   │   │   │   │   └── simple_workflow.json
│   │   │   │   │   │   ├── justfile
│   │   │   │   │   │   ├── pyproject.toml
│   │   │   │   │   │   ├── src/
│   │   │   │   │   │   │   ├── __init__.py
│   │   │   │   │   │   │   ├── __main__.py
│   │   │   │   │   │   │   ├── compare_workflows.py
│   │   │   │   │   │   │   ├── config_loader.py
│   │   │   │   │   │   │   ├── configs/
│   │   │   │   │   │   │   │   └── presets/
│   │   │   │   │   │   │   │       ├── lenient.yaml
│   │   │   │   │   │   │   │       ├── standard.yaml
│   │   │   │   │   │   │   │       └── strict.yaml
│   │   │   │   │   │   │   ├── cost_functions.py
│   │   │   │   │   │   │   ├── graph_builder.py
│   │   │   │   │   │   │   └── similarity.py
│   │   │   │   │   │   └── tests/
│   │   │   │   │   │       ├── __init__.py
│   │   │   │   │   │       ├── test_graph_builder.py
│   │   │   │   │   │       └── test_similarity.py
│   │   │   │   │   └── score.ts
│   │   │   │   ├── summarizers/
│   │   │   │   │   └── introspection-summarizer.ts
│   │   │   │   └── support/
│   │   │   │       ├── constants.ts
│   │   │   │       ├── environment.ts
│   │   │   │       ├── load-nodes.test.ts
│   │   │   │       ├── load-nodes.ts
│   │   │   │       ├── pin-data-generator.test.ts
│   │   │   │       ├── pin-data-generator.ts
│   │   │   │       ├── report-generator.ts
│   │   │   │       ├── test-case-generator.ts
│   │   │   │       ├── workflow-executor.test.ts
│   │   │   │       └── workflow-executor.ts
│   │   │   ├── jest.config.integration.js
│   │   │   ├── jest.config.js
│   │   │   ├── jest.config.unit.js
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   ├── categorize-prompts.ts
│   │   │   │   └── workflow-to-mermaid.ts
│   │   │   ├── src/
│   │   │   │   ├── agents/
│   │   │   │   │   ├── planner.agent.ts
│   │   │   │   │   ├── responder.agent.ts
│   │   │   │   │   ├── supervisor.agent.ts
│   │   │   │   │   └── test/
│   │   │   │   │       ├── planner.agent.test.ts
│   │   │   │   │       └── responder.agent.test.ts
│   │   │   │   ├── ai-workflow-builder-agent.service.ts
│   │   │   │   ├── assistant/
│   │   │   │   │   ├── assistant-handler.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   └── assistant-handler.test.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── chains/
│   │   │   │   │   ├── conversation-compact.ts
│   │   │   │   │   ├── parameter-updater.ts
│   │   │   │   │   ├── prompt-categorization.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── conversation-compact.test.ts
│   │   │   │   │   │   └── integration/
│   │   │   │   │   │       ├── README.md
│   │   │   │   │   │       ├── prompt-categorization.integration.test.ts
│   │   │   │   │   │       └── test-helpers.ts
│   │   │   │   │   └── workflow-name.ts
│   │   │   │   ├── code-builder/
│   │   │   │   │   ├── code-builder-agent.ts
│   │   │   │   │   ├── code-workflow-builder.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── engines/
│   │   │   │   │   │   ├── code-builder-node-search-engine.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── code-builder-node-search-engine.test.ts
│   │   │   │   │   ├── handlers/
│   │   │   │   │   │   ├── agent-iteration-handler.ts
│   │   │   │   │   │   ├── auto-finalize-handler.ts
│   │   │   │   │   │   ├── chat-setup-handler.ts
│   │   │   │   │   │   ├── final-response-handler.ts
│   │   │   │   │   │   ├── parse-validate-handler.ts
│   │   │   │   │   │   ├── session-chat-handler.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   ├── agent-iteration-handler.test.ts
│   │   │   │   │   │   │   ├── auto-finalize-handler.test.ts
│   │   │   │   │   │   │   ├── chat-setup-handler.test.ts
│   │   │   │   │   │   │   ├── final-response-handler.test.ts
│   │   │   │   │   │   │   ├── parse-validate-handler.test.ts
│   │   │   │   │   │   │   ├── session-chat-handler.test.ts
│   │   │   │   │   │   │   ├── text-editor-handler.test.ts
│   │   │   │   │   │   │   ├── text-editor-tool-handler.test.ts
│   │   │   │   │   │   │   ├── tool-dispatch-handler.test.ts
│   │   │   │   │   │   │   └── validate-tool-handler.test.ts
│   │   │   │   │   │   ├── text-editor-handler.ts
│   │   │   │   │   │   ├── text-editor-tool-handler.ts
│   │   │   │   │   │   ├── text-editor.types.ts
│   │   │   │   │   │   ├── tool-dispatch-handler.ts
│   │   │   │   │   │   └── validate-tool-handler.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── prompts/
│   │   │   │   │   │   ├── index.test.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── state/
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   └── warning-tracker.test.ts
│   │   │   │   │   │   └── warning-tracker.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── code-builder-agent-pre-validate.test.ts
│   │   │   │   │   │   ├── code-builder-agent-tracing.test.ts
│   │   │   │   │   │   ├── code-builder-agent-validate-loop.test.ts
│   │   │   │   │   │   ├── code-workflow-builder-integration.test.ts
│   │   │   │   │   │   ├── code-workflow-builder.test.ts
│   │   │   │   │   │   ├── constants.test.ts
│   │   │   │   │   │   └── triage.agent.test.ts
│   │   │   │   │   ├── tools/
│   │   │   │   │   │   ├── ask-assistant.tool.ts
│   │   │   │   │   │   ├── build-workflow.tool.ts
│   │   │   │   │   │   ├── code-builder-get.tool.ts
│   │   │   │   │   │   ├── code-builder-search.tool.ts
│   │   │   │   │   │   ├── get-suggested-nodes.tool.ts
│   │   │   │   │   │   ├── suggested-nodes-data.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       ├── code-builder-get.tool.test.ts
│   │   │   │   │   │       ├── code-builder-search.tool.test.ts
│   │   │   │   │   │       └── get-suggested-nodes.tool.test.ts
│   │   │   │   │   ├── triage.agent.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── code-builder-session.ts
│   │   │   │   │       ├── content-extractors.ts
│   │   │   │   │       ├── discriminator-utils.ts
│   │   │   │   │       ├── extract-code.ts
│   │   │   │   │       ├── format-warnings.ts
│   │   │   │   │       ├── llm-response-processor.ts
│   │   │   │   │       ├── node-diff.ts
│   │   │   │   │       ├── node-type-parser.ts
│   │   │   │   │       └── test/
│   │   │   │   │           ├── code-builder-session.test.ts
│   │   │   │   │           ├── content-extractors.test.ts
│   │   │   │   │           ├── discriminator-utils.test.ts
│   │   │   │   │           ├── extract-code.test.ts
│   │   │   │   │           ├── format-warnings.test.ts
│   │   │   │   │           ├── llm-response-processor.test.ts
│   │   │   │   │           ├── node-diff.test.ts
│   │   │   │   │           └── node-type-parser.test.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── errors/
│   │   │   │   │   └── index.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── llm-config.ts
│   │   │   │   ├── multi-agent-workflow-subgraphs.ts
│   │   │   │   ├── parent-graph-state.ts
│   │   │   │   ├── prompts/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── agents/
│   │   │   │   │   │   ├── builder.prompt.ts
│   │   │   │   │   │   ├── discovery.prompt.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── planner.prompt.ts
│   │   │   │   │   │   ├── responder.prompt.test.ts
│   │   │   │   │   │   ├── responder.prompt.ts
│   │   │   │   │   │   └── supervisor.prompt.ts
│   │   │   │   │   ├── builder/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── prompt-builder.test.ts
│   │   │   │   │   │   ├── prompt-builder.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── chains/
│   │   │   │   │   │   ├── categorization.prompt.ts
│   │   │   │   │   │   ├── compact.prompt.ts
│   │   │   │   │   │   ├── parameter-updater/
│   │   │   │   │   │   │   ├── examples/
│   │   │   │   │   │   │   │   ├── if-node.ts
│   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   ├── resource-locator.ts
│   │   │   │   │   │   │   │   ├── set-node.ts
│   │   │   │   │   │   │   │   ├── simple-updates.ts
│   │   │   │   │   │   │   │   ├── switch-node.ts
│   │   │   │   │   │   │   │   └── tool-nodes.ts
│   │   │   │   │   │   │   ├── guides/
│   │   │   │   │   │   │   │   ├── embedding-nodes.ts
│   │   │   │   │   │   │   │   ├── gmail.ts
│   │   │   │   │   │   │   │   ├── http-request.ts
│   │   │   │   │   │   │   │   ├── if-node.ts
│   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   ├── predecessor-output.ts
│   │   │   │   │   │   │   │   ├── resource-locator.ts
│   │   │   │   │   │   │   │   ├── set-node.ts
│   │   │   │   │   │   │   │   ├── switch-node.ts
│   │   │   │   │   │   │   │   ├── system-message.ts
│   │   │   │   │   │   │   │   ├── text-fields.ts
│   │   │   │   │   │   │   │   └── tool-nodes.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── instance-url.ts
│   │   │   │   │   │   │   ├── parameter-updater.prompt.ts
│   │   │   │   │   │   │   ├── registry.test.ts
│   │   │   │   │   │   │   ├── registry.ts
│   │   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   │   └── utils.test.ts
│   │   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   └── workflow-name.prompt.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── shared/
│   │   │   │   │       ├── deictic-resolution.test.ts
│   │   │   │   │       ├── deictic-resolution.ts
│   │   │   │   │       ├── node-guidance/
│   │   │   │   │       │   ├── index.ts
│   │   │   │   │       │   ├── structured-output-parser.ts
│   │   │   │   │       │   └── webhook.ts
│   │   │   │   │       └── node-recommendations/
│   │   │   │   │           ├── audio-generation.ts
│   │   │   │   │           ├── image-generation.ts
│   │   │   │   │           ├── index.ts
│   │   │   │   │           ├── text-manipulation.ts
│   │   │   │   │           ├── utils/
│   │   │   │   │           │   └── format-recommendation.ts
│   │   │   │   │           └── video-generation.ts
│   │   │   │   ├── session-manager.service.ts
│   │   │   │   ├── shared/
│   │   │   │   │   └── code-builder-and-mcp-prompt-constants.ts
│   │   │   │   ├── subgraphs/
│   │   │   │   │   ├── builder.subgraph.ts
│   │   │   │   │   ├── discovery.subgraph.ts
│   │   │   │   │   ├── subgraph-interface.ts
│   │   │   │   │   └── test/
│   │   │   │   │       └── integration/
│   │   │   │   │           ├── discovery-subgraph.integration.test.ts
│   │   │   │   │           ├── multi-agent-error-handling.integration.test.ts
│   │   │   │   │           ├── plan-mode-discovery.integration.test.ts
│   │   │   │   │           ├── question-quality.integration.test.ts
│   │   │   │   │           ├── responder-limitations.integration.test.ts
│   │   │   │   │           └── techniques.json
│   │   │   │   ├── test/
│   │   │   │   │   ├── ai-workflow-builder-agent.service.test.ts
│   │   │   │   │   ├── checkpoint-persistence.test.ts
│   │   │   │   │   ├── session-manager.service.test.ts
│   │   │   │   │   ├── workflow-builder-agent.test.ts
│   │   │   │   │   └── workflow-state.test.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── add-node.tool.ts
│   │   │   │   │   ├── best-practices/
│   │   │   │   │   │   ├── chatbot.ts
│   │   │   │   │   │   ├── content-generation.ts
│   │   │   │   │   │   ├── data-analysis.ts
│   │   │   │   │   │   ├── data-extraction.ts
│   │   │   │   │   │   ├── data-persistence.ts
│   │   │   │   │   │   ├── data-transformation.ts
│   │   │   │   │   │   ├── document-processing.ts
│   │   │   │   │   │   ├── enrichment.ts
│   │   │   │   │   │   ├── form-input.ts
│   │   │   │   │   │   ├── human-in-the-loop.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── knowledge-base.ts
│   │   │   │   │   │   ├── monitoring.ts
│   │   │   │   │   │   ├── notification.ts
│   │   │   │   │   │   ├── scheduling.ts
│   │   │   │   │   │   ├── scraping-and-research.ts
│   │   │   │   │   │   └── triage.ts
│   │   │   │   │   ├── builder-tools.ts
│   │   │   │   │   ├── connect-nodes.tool.ts
│   │   │   │   │   ├── engines/
│   │   │   │   │   │   ├── node-search-engine.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── node-search-engine.test.ts
│   │   │   │   │   ├── get-documentation.tool.ts
│   │   │   │   │   ├── get-execution-logs.tool.ts
│   │   │   │   │   ├── get-execution-schema.tool.ts
│   │   │   │   │   ├── get-expression-data-mapping.tool.ts
│   │   │   │   │   ├── get-node-context.tool.ts
│   │   │   │   │   ├── get-node-examples.tool.ts
│   │   │   │   │   ├── get-node-parameter.tool.ts
│   │   │   │   │   ├── get-resource-locator-options.tool.ts
│   │   │   │   │   ├── get-workflow-examples.tool.ts
│   │   │   │   │   ├── get-workflow-overview.tool.ts
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── progress.ts
│   │   │   │   │   │   ├── response.ts
│   │   │   │   │   │   ├── state.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   └── progress.test.ts
│   │   │   │   │   │   └── validation.ts
│   │   │   │   │   ├── introspect.tool.ts
│   │   │   │   │   ├── node-details.tool.ts
│   │   │   │   │   ├── node-search.tool.ts
│   │   │   │   │   ├── remove-connection.tool.ts
│   │   │   │   │   ├── remove-node.tool.ts
│   │   │   │   │   ├── rename-node.tool.ts
│   │   │   │   │   ├── submit-questions.tool.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── add-node.tool.test.ts
│   │   │   │   │   │   ├── builder-tools.test.ts
│   │   │   │   │   │   ├── connect-nodes.tool.test.ts
│   │   │   │   │   │   ├── get-documentation.tool.test.ts
│   │   │   │   │   │   ├── get-execution-logs.tool.test.ts
│   │   │   │   │   │   ├── get-execution-schema.tool.test.ts
│   │   │   │   │   │   ├── get-expression-data-mapping.tool.test.ts
│   │   │   │   │   │   ├── get-node-context.tool.test.ts
│   │   │   │   │   │   ├── get-node-examples.tool.test.ts
│   │   │   │   │   │   ├── get-resource-locator-options.tool.test.ts
│   │   │   │   │   │   ├── get-workflow-examples.tool.test.ts
│   │   │   │   │   │   ├── get-workflow-overview.tool.test.ts
│   │   │   │   │   │   ├── introspect.tool.test.ts
│   │   │   │   │   │   ├── node-details.tool.test.ts
│   │   │   │   │   │   ├── node-search.tool.test.ts
│   │   │   │   │   │   ├── remove-connection.tool.test.ts
│   │   │   │   │   │   ├── remove-node.tool.test.ts
│   │   │   │   │   │   ├── rename-node.tool.test.ts
│   │   │   │   │   │   ├── submit-questions.tool.test.ts
│   │   │   │   │   │   ├── update-node-parameters.tool.test.ts
│   │   │   │   │   │   ├── validate-configuration.tool.test.ts
│   │   │   │   │   │   ├── validate-structure.tool.test.ts
│   │   │   │   │   │   ├── web-fetch-security.test.ts
│   │   │   │   │   │   └── web-fetch.tool.test.ts
│   │   │   │   │   ├── update-node-parameters.tool.ts
│   │   │   │   │   ├── utils/
│   │   │   │   │   │   ├── allowed-domains.ts
│   │   │   │   │   │   ├── connection-parameters.utils.ts
│   │   │   │   │   │   ├── connection.utils.ts
│   │   │   │   │   │   ├── mermaid.utils.ts
│   │   │   │   │   │   ├── node-configuration.utils.ts
│   │   │   │   │   │   ├── node-creation.utils.ts
│   │   │   │   │   │   ├── node-positioning.utils.ts
│   │   │   │   │   │   ├── parameter-update.utils.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   ├── connection.utils.test.ts
│   │   │   │   │   │   │   ├── mermaid.utils.test.ts
│   │   │   │   │   │   │   ├── parameter-update.utils.test.ts
│   │   │   │   │   │   │   ├── web-fetch.utils.test.ts
│   │   │   │   │   │   │   └── workflows/
│   │   │   │   │   │   │       └── ai-assistant.workflow.ts
│   │   │   │   │   │   ├── web-fetch-security.ts
│   │   │   │   │   │   └── web-fetch.utils.ts
│   │   │   │   │   ├── validate-configuration.tool.ts
│   │   │   │   │   ├── validate-structure.tool.ts
│   │   │   │   │   ├── web/
│   │   │   │   │   │   ├── templates.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── integration/
│   │   │   │   │   │           └── templates.integration.test.ts
│   │   │   │   │   └── web-fetch.tool.ts
│   │   │   │   ├── types/
│   │   │   │   │   ├── best-practices.ts
│   │   │   │   │   ├── callbacks.ts
│   │   │   │   │   ├── categorization.ts
│   │   │   │   │   ├── config.ts
│   │   │   │   │   ├── connections.ts
│   │   │   │   │   ├── coordination.ts
│   │   │   │   │   ├── discovery-types.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── langchain.ts
│   │   │   │   │   ├── messages.ts
│   │   │   │   │   ├── node-guidance.ts
│   │   │   │   │   ├── node-recommendations.ts
│   │   │   │   │   ├── nodes.ts
│   │   │   │   │   ├── planning.ts
│   │   │   │   │   ├── session-storage.ts
│   │   │   │   │   ├── sessions.ts
│   │   │   │   │   ├── streaming.ts
│   │   │   │   │   ├── tools.ts
│   │   │   │   │   ├── utils.ts
│   │   │   │   │   ├── web/
│   │   │   │   │   │   └── templates.ts
│   │   │   │   │   └── workflow.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── cache-control/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── helpers.test.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── cleanup-dangling-tool-call-messages.ts
│   │   │   │   │   ├── context-builders.ts
│   │   │   │   │   ├── coordination-log.ts
│   │   │   │   │   ├── data-table-helpers.ts
│   │   │   │   │   ├── error-sanitizer.ts
│   │   │   │   │   ├── http-proxy-agent.ts
│   │   │   │   │   ├── node-helpers.ts
│   │   │   │   │   ├── operations-processor.ts
│   │   │   │   │   ├── plan-helpers.ts
│   │   │   │   │   ├── resource-operation-extractor.ts
│   │   │   │   │   ├── rlc-prefetch.ts
│   │   │   │   │   ├── state-modifier.ts
│   │   │   │   │   ├── state-reducers.ts
│   │   │   │   │   ├── stream-processor.ts
│   │   │   │   │   ├── subgraph-helpers.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── cleanup-dangling-tool-call-messages.test.ts
│   │   │   │   │   │   ├── context-builders.test.ts
│   │   │   │   │   │   ├── coordination-log.test.ts
│   │   │   │   │   │   ├── data-table-helpers.test.ts
│   │   │   │   │   │   ├── error-sanitizer.test.ts
│   │   │   │   │   │   ├── operations-processor.test.ts
│   │   │   │   │   │   ├── plan-helpers.test.ts
│   │   │   │   │   │   ├── resource-operation-extractor.test.ts
│   │   │   │   │   │   ├── state-modifier.test.ts
│   │   │   │   │   │   ├── stream-processor.test.ts
│   │   │   │   │   │   ├── subgraph-helpers.test.ts
│   │   │   │   │   │   ├── tool-executor.test.ts
│   │   │   │   │   │   ├── trim-workflow-context.test.ts
│   │   │   │   │   │   └── truncate-json.test.ts
│   │   │   │   │   ├── thread-id.ts
│   │   │   │   │   ├── token-usage-tracking-handler.ts
│   │   │   │   │   ├── token-usage.ts
│   │   │   │   │   ├── tool-executor.ts
│   │   │   │   │   ├── trim-workflow-context.ts
│   │   │   │   │   └── truncate-json.ts
│   │   │   │   ├── validation/
│   │   │   │   │   ├── auto-fix/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── auto-fix-connections.test.ts
│   │   │   │   │   │   ├── auto-fix-connections.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── checks/
│   │   │   │   │   │   ├── agent-prompt.ts
│   │   │   │   │   │   ├── connections.test.ts
│   │   │   │   │   │   ├── connections.ts
│   │   │   │   │   │   ├── credentials.ts
│   │   │   │   │   │   ├── from-ai.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── node-usage/
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── webhook-response.test.ts
│   │   │   │   │   │   │   └── webhook-response.ts
│   │   │   │   │   │   ├── nodes.ts
│   │   │   │   │   │   ├── parameters.ts
│   │   │   │   │   │   ├── tools.ts
│   │   │   │   │   │   └── trigger.ts
│   │   │   │   │   ├── programmatic.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── expressions.test.ts
│   │   │   │   │       ├── expressions.ts
│   │   │   │   │       ├── is-tool.ts
│   │   │   │   │       ├── node-type-map.ts
│   │   │   │   │       └── resolve-connections.ts
│   │   │   │   ├── workflow-builder-agent.ts
│   │   │   │   └── workflow-state.ts
│   │   │   ├── test/
│   │   │   │   └── test-utils.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── api-types/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── api-keys.ts
│   │   │   │   ├── chat-hub.ts
│   │   │   │   ├── community-node-types.ts
│   │   │   │   ├── datetime.ts
│   │   │   │   ├── dto/
│   │   │   │   │   ├── ai/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── ai-apply-suggestion-request.dto.test.ts
│   │   │   │   │   │   │   ├── ai-ask-request.dto.test.ts
│   │   │   │   │   │   │   ├── ai-build-request.dto.test.ts
│   │   │   │   │   │   │   ├── ai-chat-request.dto.test.ts
│   │   │   │   │   │   │   └── ai-free-credits-request.dto.test.ts
│   │   │   │   │   │   ├── ai-apply-suggestion-request.dto.ts
│   │   │   │   │   │   ├── ai-ask-request.dto.ts
│   │   │   │   │   │   ├── ai-build-request.dto.ts
│   │   │   │   │   │   ├── ai-chat-request.dto.ts
│   │   │   │   │   │   ├── ai-clear-session-request.dto.ts
│   │   │   │   │   │   ├── ai-free-credits-request.dto.ts
│   │   │   │   │   │   ├── ai-session-retrieval-request.dto.ts
│   │   │   │   │   │   ├── ai-truncate-messages-request.dto.ts
│   │   │   │   │   │   └── ai-usage-settings-request.dto.ts
│   │   │   │   │   ├── api-keys/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-api-key-request.dto.test.ts
│   │   │   │   │   │   │   └── update-api-key-request.dto.test.ts
│   │   │   │   │   │   ├── create-api-key-request.dto.ts
│   │   │   │   │   │   └── update-api-key-request.dto.ts
│   │   │   │   │   ├── auth/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── login-request.dto.test.ts
│   │   │   │   │   │   │   └── resolve-signup-token-query.dto.test.ts
│   │   │   │   │   │   ├── embed-login-body.dto.ts
│   │   │   │   │   │   ├── embed-login-query.dto.ts
│   │   │   │   │   │   ├── login-request.dto.ts
│   │   │   │   │   │   └── resolve-signup-token-query.dto.ts
│   │   │   │   │   ├── binary-data/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── binary-data-query.dto.test.ts
│   │   │   │   │   │   │   └── binary-data-signed-query.dto.test.ts
│   │   │   │   │   │   ├── binary-data-query.dto.ts
│   │   │   │   │   │   └── binary-data-signed-query.dto.ts
│   │   │   │   │   ├── credential-resolver/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-credential-resolver.dto.test.ts
│   │   │   │   │   │   │   └── update-credential-resolver.dto.test.ts
│   │   │   │   │   │   ├── create-credential-resolver.dto.ts
│   │   │   │   │   │   └── update-credential-resolver.dto.ts
│   │   │   │   │   ├── credentials/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-credential.dto.test.ts
│   │   │   │   │   │   │   ├── credentials-get-many-request.dto.test.ts
│   │   │   │   │   │   │   ├── credentials-get-one-request.dto.test.ts
│   │   │   │   │   │   │   └── generate-credential-name.dto.test.ts
│   │   │   │   │   │   ├── create-credential.dto.ts
│   │   │   │   │   │   ├── credentials-get-many-request.dto.ts
│   │   │   │   │   │   ├── credentials-get-one-request.dto.ts
│   │   │   │   │   │   └── generate-credential-name.dto.ts
│   │   │   │   │   ├── data-table/
│   │   │   │   │   │   ├── add-data-table-column.dto.ts
│   │   │   │   │   │   ├── add-data-table-rows.dto.ts
│   │   │   │   │   │   ├── create-data-table-column.dto.ts
│   │   │   │   │   │   ├── create-data-table.dto.ts
│   │   │   │   │   │   ├── delete-data-table-rows.dto.ts
│   │   │   │   │   │   ├── download-data-table-csv-query.dto.ts
│   │   │   │   │   │   ├── import-csv-to-data-table.dto.ts
│   │   │   │   │   │   ├── list-data-table-content-query.dto.ts
│   │   │   │   │   │   ├── list-data-table-query.dto.ts
│   │   │   │   │   │   ├── move-data-table-column.dto.ts
│   │   │   │   │   │   ├── rename-data-table-column.dto.ts
│   │   │   │   │   │   ├── update-data-table-row.dto.ts
│   │   │   │   │   │   ├── update-data-table.dto.ts
│   │   │   │   │   │   └── upsert-data-table-row.dto.ts
│   │   │   │   │   ├── dynamic-node-parameters/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── action-result-request.dto.test.ts
│   │   │   │   │   │   │   ├── options-request.dto.test.ts
│   │   │   │   │   │   │   ├── resource-locator-request.dto.test.ts
│   │   │   │   │   │   │   └── resource-mapper-fields-request.dto.test.ts
│   │   │   │   │   │   ├── action-result-request.dto.ts
│   │   │   │   │   │   ├── base-dynamic-parameters-request.dto.ts
│   │   │   │   │   │   ├── options-request.dto.ts
│   │   │   │   │   │   ├── resource-locator-request.dto.ts
│   │   │   │   │   │   └── resource-mapper-fields-request.dto.ts
│   │   │   │   │   ├── executions/
│   │   │   │   │   │   └── execution-redaction-query.dto.ts
│   │   │   │   │   ├── folders/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-folder-request.dto.test.ts
│   │   │   │   │   │   │   ├── list-folder-query.dto.test.ts
│   │   │   │   │   │   │   └── update-folder.request.dto.test.ts
│   │   │   │   │   │   ├── create-folder.dto.ts
│   │   │   │   │   │   ├── delete-folder.dto.ts
│   │   │   │   │   │   ├── list-folder-query.dto.ts
│   │   │   │   │   │   ├── transfer-folder.dto.ts
│   │   │   │   │   │   └── update-folder.dto.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── insights/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── date-filter.dto.test.ts
│   │   │   │   │   │   │   └── list-workflow-query.dto.test.ts
│   │   │   │   │   │   ├── date-filter.dto.ts
│   │   │   │   │   │   └── list-workflow-query.dto.ts
│   │   │   │   │   ├── instance-ai/
│   │   │   │   │   │   ├── instance-ai-confirm-request.dto.ts
│   │   │   │   │   │   └── instance-ai-rename-thread-request.dto.ts
│   │   │   │   │   ├── invitation/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── accept-invitation-request.dto.test.ts
│   │   │   │   │   │   │   └── invite-users-request.dto.test.ts
│   │   │   │   │   │   ├── accept-invitation-request.dto.ts
│   │   │   │   │   │   └── invite-users-request.dto.ts
│   │   │   │   │   ├── license/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── community-registered-request.dto.test.ts
│   │   │   │   │   │   └── community-registered-request.dto.ts
│   │   │   │   │   ├── log-streaming/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-destination.dto.test.ts
│   │   │   │   │   │   │   ├── delete-destination-query.dto.test.ts
│   │   │   │   │   │   │   ├── get-destination-query.dto.test.ts
│   │   │   │   │   │   │   └── test-destination-query.dto.test.ts
│   │   │   │   │   │   ├── create-destination.dto.ts
│   │   │   │   │   │   ├── delete-destination-query.dto.ts
│   │   │   │   │   │   ├── get-destination-query.dto.ts
│   │   │   │   │   │   └── test-destination-query.dto.ts
│   │   │   │   │   ├── node-types/
│   │   │   │   │   │   └── get-node-types-by-identifier.dto.ts
│   │   │   │   │   ├── oauth/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── oauth-client.dto.ts
│   │   │   │   │   ├── oidc/
│   │   │   │   │   │   ├── config.dto.ts
│   │   │   │   │   │   └── test-oidc-config-response.dto.ts
│   │   │   │   │   ├── owner/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── dismiss-banner-request.dto.test.ts
│   │   │   │   │   │   │   └── owner-setup-request.dto.test.ts
│   │   │   │   │   │   ├── dismiss-banner-request.dto.ts
│   │   │   │   │   │   └── owner-setup-request.dto.ts
│   │   │   │   │   ├── pagination/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── pagination.dto.test.ts
│   │   │   │   │   │   └── pagination.dto.ts
│   │   │   │   │   ├── password-reset/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── change-password-request.dto.test.ts
│   │   │   │   │   │   │   ├── forgot-password-request.dto.test.ts
│   │   │   │   │   │   │   └── resolve-password-token-query.dto.test.ts
│   │   │   │   │   │   ├── change-password-request.dto.ts
│   │   │   │   │   │   ├── forgot-password-request.dto.ts
│   │   │   │   │   │   └── resolve-password-token-query.dto.ts
│   │   │   │   │   ├── project/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── add-users-to-project.dto.test.ts
│   │   │   │   │   │   │   ├── change-user-role-in-project.dto.test.ts
│   │   │   │   │   │   │   ├── create-project.dto.test.ts
│   │   │   │   │   │   │   ├── list-projects-query.dto.test.ts
│   │   │   │   │   │   │   └── update-project.dto.test.ts
│   │   │   │   │   │   ├── add-users-to-project.dto.ts
│   │   │   │   │   │   ├── change-user-role-in-project.dto.ts
│   │   │   │   │   │   ├── create-project.dto.ts
│   │   │   │   │   │   ├── delete-project.dto.ts
│   │   │   │   │   │   ├── list-projects-query.dto.ts
│   │   │   │   │   │   └── update-project.dto.ts
│   │   │   │   │   ├── provisioning/
│   │   │   │   │   │   └── config.dto.ts
│   │   │   │   │   ├── quick-connect/
│   │   │   │   │   │   ├── create-quick-connect-credential.dto.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── roles/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-role.dto.test.ts
│   │   │   │   │   │   │   ├── list-role-mapping-rule-query.dto.test.ts
│   │   │   │   │   │   │   ├── role-get-query.dto.test.ts
│   │   │   │   │   │   │   ├── role-list-query.dto.test.ts
│   │   │   │   │   │   │   └── update-role.dto.test.ts
│   │   │   │   │   │   ├── create-role-mapping-rule.dto.ts
│   │   │   │   │   │   ├── create-role.dto.ts
│   │   │   │   │   │   ├── list-role-mapping-rule-query.dto.ts
│   │   │   │   │   │   ├── move-role-mapping-rule.dto.ts
│   │   │   │   │   │   ├── patch-role-mapping-rule.dto.ts
│   │   │   │   │   │   ├── role-assignments-response.dto.ts
│   │   │   │   │   │   ├── role-get-query.dto.ts
│   │   │   │   │   │   ├── role-list-query.dto.ts
│   │   │   │   │   │   ├── role-project-members-response.dto.ts
│   │   │   │   │   │   └── update-role.dto.ts
│   │   │   │   │   ├── saml/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── saml-preferences.dto.test.ts
│   │   │   │   │   │   ├── saml-acs.dto.ts
│   │   │   │   │   │   ├── saml-preferences.dto.ts
│   │   │   │   │   │   └── saml-toggle.dto.ts
│   │   │   │   │   ├── secrets-provider/
│   │   │   │   │   │   ├── create-secrets-provider-connection.dto.ts
│   │   │   │   │   │   ├── set-secrets-provider-connection-is-enabled.dto.ts
│   │   │   │   │   │   ├── test-secrets-provider-connection.dto.ts
│   │   │   │   │   │   ├── update-external-secrets-settings.dto.ts
│   │   │   │   │   │   └── update-secrets-provider-connection.dto.ts
│   │   │   │   │   ├── security-settings/
│   │   │   │   │   │   └── security-settings.dto.ts
│   │   │   │   │   ├── source-control/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── pull-work-folder-request.dto.test.ts
│   │   │   │   │   │   │   └── push-work-folder-request.dto.test.ts
│   │   │   │   │   │   ├── pull-work-folder-request.dto.ts
│   │   │   │   │   │   ├── push-work-folder-request.dto.ts
│   │   │   │   │   │   └── push-work-folder-response.dto.ts
│   │   │   │   │   ├── tag/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-or-update-tag-request.dto.test.ts
│   │   │   │   │   │   │   └── retrieve-tag-query.dto.test.ts
│   │   │   │   │   │   ├── create-or-update-tag-request.dto.ts
│   │   │   │   │   │   └── retrieve-tag-query.dto.ts
│   │   │   │   │   ├── user/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── password-update-request.dto.test.ts
│   │   │   │   │   │   │   ├── role-change-request.dto.test.ts
│   │   │   │   │   │   │   ├── settings-update-request.dto.test.ts
│   │   │   │   │   │   │   ├── user-self-settings-update-request.dto.test.ts
│   │   │   │   │   │   │   ├── user-update-request.dto.test.ts
│   │   │   │   │   │   │   └── users-list-filter.dto.test.ts
│   │   │   │   │   │   ├── password-update-request.dto.ts
│   │   │   │   │   │   ├── role-change-request.dto.ts
│   │   │   │   │   │   ├── settings-update-request.dto.ts
│   │   │   │   │   │   ├── user-self-settings-update-request.dto.ts
│   │   │   │   │   │   ├── user-update-request.dto.ts
│   │   │   │   │   │   └── users-list-filter.dto.ts
│   │   │   │   │   ├── variables/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── base.dto.test.ts
│   │   │   │   │   │   │   ├── create-variable-request.dto.test.ts
│   │   │   │   │   │   │   ├── update-variable-request.dto.test.ts
│   │   │   │   │   │   │   └── variables-list-request.dto.test.ts
│   │   │   │   │   │   ├── base.dto.ts
│   │   │   │   │   │   ├── create-variable-request.dto.ts
│   │   │   │   │   │   ├── update-variable-request.dto.ts
│   │   │   │   │   │   └── variables-list-request.dto.ts
│   │   │   │   │   ├── workflow-history/
│   │   │   │   │   │   ├── update-workflow-history-version.dto.ts
│   │   │   │   │   │   └── workflow-history-versions-by-ids.dto.ts
│   │   │   │   │   └── workflows/
│   │   │   │   │       ├── __tests__/
│   │   │   │   │       │   ├── create-workflow.dto.test.ts
│   │   │   │   │       │   ├── import-workflow-from-url.dto.test.ts
│   │   │   │   │       │   ├── transfer-workflow.dto.test.ts
│   │   │   │   │       │   └── update-workflow.dto.test.ts
│   │   │   │   │       ├── activate-workflow.dto.ts
│   │   │   │   │       ├── archive-workflow.dto.ts
│   │   │   │   │       ├── base-workflow.dto.ts
│   │   │   │   │       ├── create-workflow.dto.ts
│   │   │   │   │       ├── deactivate-workflow.dto.ts
│   │   │   │   │       ├── get-resource-dependencies.dto.ts
│   │   │   │   │       ├── get-resource-dependency-counts.dto.ts
│   │   │   │   │       ├── import-workflow-from-url.dto.ts
│   │   │   │   │       ├── transfer.dto.ts
│   │   │   │   │       └── update-workflow.dto.ts
│   │   │   │   ├── frontend-settings.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── instance-registry-types.ts
│   │   │   │   ├── push/
│   │   │   │   │   ├── builder-credits.ts
│   │   │   │   │   ├── chat-hub.ts
│   │   │   │   │   ├── collaboration.ts
│   │   │   │   │   ├── debug.ts
│   │   │   │   │   ├── execution.ts
│   │   │   │   │   ├── heartbeat.ts
│   │   │   │   │   ├── hot-reload.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── instance-ai.ts
│   │   │   │   │   ├── webhook.ts
│   │   │   │   │   ├── worker.ts
│   │   │   │   │   └── workflow.ts
│   │   │   │   ├── quick-connect.ts
│   │   │   │   ├── scaling.ts
│   │   │   │   ├── schemas/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── agent-run-reducer.test.ts
│   │   │   │   │   │   ├── credential-resolver.schema.test.ts
│   │   │   │   │   │   ├── folder.schema.test.ts
│   │   │   │   │   │   ├── insights.schema.test.ts
│   │   │   │   │   │   ├── node-version.schema.test.ts
│   │   │   │   │   │   ├── password.schema.test.ts
│   │   │   │   │   │   ├── project.schema.test.ts
│   │   │   │   │   │   └── user.schema.test.ts
│   │   │   │   │   ├── agent-run-reducer.ts
│   │   │   │   │   ├── banner-name.schema.ts
│   │   │   │   │   ├── binary-data.schema.ts
│   │   │   │   │   ├── boolean-from-string.ts
│   │   │   │   │   ├── breaking-changes.schema.ts
│   │   │   │   │   ├── community-package.schema.ts
│   │   │   │   │   ├── credential-resolver.schema.ts
│   │   │   │   │   ├── data-table-filter.schema.ts
│   │   │   │   │   ├── data-table.schema.ts
│   │   │   │   │   ├── dependency-counts.schema.ts
│   │   │   │   │   ├── dependency.schema.ts
│   │   │   │   │   ├── external-secrets.schema.ts
│   │   │   │   │   ├── folder.schema.ts
│   │   │   │   │   ├── insights.schema.ts
│   │   │   │   │   ├── instance-ai.schema.ts
│   │   │   │   │   ├── node-version.schema.ts
│   │   │   │   │   ├── password-reset-token.schema.ts
│   │   │   │   │   ├── password.schema.ts
│   │   │   │   │   ├── project.schema.ts
│   │   │   │   │   ├── scopes.schema.ts
│   │   │   │   │   ├── secrets-provider.schema.ts
│   │   │   │   │   ├── source-controlled-file.schema.ts
│   │   │   │   │   ├── timezone.schema.ts
│   │   │   │   │   ├── usage.schema.ts
│   │   │   │   │   ├── user-settings.schema.ts
│   │   │   │   │   ├── user.schema.ts
│   │   │   │   │   ├── workflow-execution-status.schema.ts
│   │   │   │   │   └── workflow-version.schema.ts
│   │   │   │   ├── user.ts
│   │   │   │   ├── utils/
│   │   │   │   │   └── allowed-domains.ts
│   │   │   │   └── zod-class.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── backend-common/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── cli-parser.test.ts
│   │   │   │   ├── cli-parser.ts
│   │   │   │   ├── environment.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── license-state.ts
│   │   │   │   ├── logging/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── logger.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── logger.ts
│   │   │   │   ├── modules/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── module-registry.test.ts
│   │   │   │   │   │   └── modules.config.test.ts
│   │   │   │   │   ├── errors/
│   │   │   │   │   │   ├── missing-module.error.ts
│   │   │   │   │   │   ├── module-confusion.error.ts
│   │   │   │   │   │   └── unknown-module.error.ts
│   │   │   │   │   ├── module-registry.ts
│   │   │   │   │   └── modules.config.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils/
│   │   │   │       ├── __tests__/
│   │   │   │       │   ├── flatted-async.test.ts
│   │   │   │       │   ├── is-object-literal.test.ts
│   │   │   │       │   ├── parse-flatted.test.ts
│   │   │   │       │   └── path-util.test.ts
│   │   │   │       ├── flatted-async.ts
│   │   │   │       ├── fs.ts
│   │   │   │       ├── is-object-literal.ts
│   │   │   │       ├── parse-flatted.ts
│   │   │   │       └── path-util.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── backend-test-utils/
│   │   │   ├── MIGRATION_TESTING.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── db/
│   │   │   │   │   ├── projects.ts
│   │   │   │   │   └── workflows.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── migration-test-helpers.ts
│   │   │   │   ├── mocking.ts
│   │   │   │   ├── random.ts
│   │   │   │   ├── test-db.ts
│   │   │   │   └── test-modules.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── benchmark/
│   │   │   ├── .gitignore
│   │   │   ├── Dockerfile
│   │   │   ├── README.md
│   │   │   ├── bin/
│   │   │   │   └── n8n-benchmark
│   │   │   ├── biome.jsonc
│   │   │   ├── eslint.config.mjs
│   │   │   ├── infra/
│   │   │   │   ├── .terraform.lock.hcl
│   │   │   │   ├── benchmark-env.tf
│   │   │   │   ├── modules/
│   │   │   │   │   └── benchmark-vm/
│   │   │   │   │       ├── output.tf
│   │   │   │   │       ├── vars.tf
│   │   │   │   │       └── vm.tf
│   │   │   │   ├── output.tf
│   │   │   │   ├── providers.tf
│   │   │   │   └── vars.tf
│   │   │   ├── package.json
│   │   │   ├── scenarios/
│   │   │   │   ├── binary-data/
│   │   │   │   │   ├── binary-data.json
│   │   │   │   │   ├── binary-data.manifest.json
│   │   │   │   │   └── binary-data.script.js
│   │   │   │   ├── credential-http-node/
│   │   │   │   │   ├── credential-bearer.json
│   │   │   │   │   ├── credential-http-node.json
│   │   │   │   │   ├── credential-http-node.manifest.json
│   │   │   │   │   └── credential-http-node.script.js
│   │   │   │   ├── data-table-node/
│   │   │   │   │   ├── data-table-node.json
│   │   │   │   │   ├── data-table-node.manifest.json
│   │   │   │   │   ├── data-table-node.script.js
│   │   │   │   │   └── data-table.json
│   │   │   │   ├── http-node/
│   │   │   │   │   ├── http-node.json
│   │   │   │   │   ├── http-node.manifest.json
│   │   │   │   │   └── http-node.script.js
│   │   │   │   ├── js-code-node/
│   │   │   │   │   ├── js-code-node.json
│   │   │   │   │   ├── js-code-node.manifest.json
│   │   │   │   │   └── js-code-node.script.js
│   │   │   │   ├── multiple-webhooks/
│   │   │   │   │   ├── multiple-webhooks.manifest.json
│   │   │   │   │   ├── multiple-webhooks.script.js
│   │   │   │   │   ├── multiple-webhooks1.json
│   │   │   │   │   ├── multiple-webhooks10.json
│   │   │   │   │   ├── multiple-webhooks2.json
│   │   │   │   │   ├── multiple-webhooks3.json
│   │   │   │   │   ├── multiple-webhooks4.json
│   │   │   │   │   ├── multiple-webhooks5.json
│   │   │   │   │   ├── multiple-webhooks6.json
│   │   │   │   │   ├── multiple-webhooks7.json
│   │   │   │   │   ├── multiple-webhooks8.json
│   │   │   │   │   └── multiple-webhooks9.json
│   │   │   │   ├── py-code-node/
│   │   │   │   │   ├── py-code-node.json
│   │   │   │   │   ├── py-code-node.manifest.json
│   │   │   │   │   └── py-code-node.script.js
│   │   │   │   ├── scenario.schema.json
│   │   │   │   ├── set-node-expressions/
│   │   │   │   │   ├── set-node-expressions.json
│   │   │   │   │   ├── set-node-expressions.manifest.json
│   │   │   │   │   └── set-node-expressions.script.js
│   │   │   │   └── single-webhook/
│   │   │   │       ├── single-webhook.json
│   │   │   │       ├── single-webhook.manifest.json
│   │   │   │       └── single-webhook.script.js
│   │   │   ├── scripts/
│   │   │   │   ├── bootstrap.sh
│   │   │   │   ├── clients/
│   │   │   │   │   ├── docker-compose-client.mjs
│   │   │   │   │   ├── ssh-client.mjs
│   │   │   │   │   └── terraform-client.mjs
│   │   │   │   ├── destroy-cloud-env.mjs
│   │   │   │   ├── mock-api/
│   │   │   │   │   └── mappings/
│   │   │   │   │       └── mockApiData.json
│   │   │   │   ├── n8n-setups/
│   │   │   │   │   ├── postgres/
│   │   │   │   │   │   ├── docker-compose.yml
│   │   │   │   │   │   └── setup.mjs
│   │   │   │   │   ├── scaling-multi-main/
│   │   │   │   │   │   ├── docker-compose.yml
│   │   │   │   │   │   ├── nginx.conf
│   │   │   │   │   │   └── setup.mjs
│   │   │   │   │   ├── scaling-single-main/
│   │   │   │   │   │   ├── docker-compose.yml
│   │   │   │   │   │   └── setup.mjs
│   │   │   │   │   └── sqlite/
│   │   │   │   │       ├── docker-compose.yml
│   │   │   │   │       └── setup.mjs
│   │   │   │   ├── provision-cloud-env.mjs
│   │   │   │   ├── run-for-n8n-setup.mjs
│   │   │   │   ├── run-in-cloud.mjs
│   │   │   │   ├── run-locally.mjs
│   │   │   │   ├── run.mjs
│   │   │   │   └── utils/
│   │   │   │       └── flags.mjs
│   │   │   ├── src/
│   │   │   │   ├── commands/
│   │   │   │   │   ├── list.ts
│   │   │   │   │   └── run.ts
│   │   │   │   ├── config/
│   │   │   │   │   └── common-flags.ts
│   │   │   │   ├── n8n-api-client/
│   │   │   │   │   ├── authenticated-n8n-api-client.ts
│   │   │   │   │   ├── credentials-api-client.ts
│   │   │   │   │   ├── data-table-api-client.ts
│   │   │   │   │   ├── n8n-api-client.ts
│   │   │   │   │   ├── n8n-api-client.types.ts
│   │   │   │   │   ├── project-api-client.ts
│   │   │   │   │   └── workflows-api-client.ts
│   │   │   │   ├── scenario/
│   │   │   │   │   ├── scenario-data-loader.ts
│   │   │   │   │   └── scenario-loader.ts
│   │   │   │   ├── test-execution/
│   │   │   │   │   ├── app-metrics-poller.ts
│   │   │   │   │   ├── k6-executor.ts
│   │   │   │   │   ├── k6-summary.ts
│   │   │   │   │   ├── prometheus-metrics-parser.ts
│   │   │   │   │   ├── scenario-data-importer.ts
│   │   │   │   │   ├── scenario-runner.ts
│   │   │   │   │   └── test-report.ts
│   │   │   │   └── types/
│   │   │   │       └── scenario.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── chat-hub/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── artifact.test.ts
│   │   │   │   ├── artifact.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── parser.test.ts
│   │   │   │   └── parser.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── cli/
│   │   │   ├── LICENSE.md
│   │   │   ├── README.md
│   │   │   ├── bin/
│   │   │   │   └── n8n-cli.mjs
│   │   │   ├── docs/
│   │   │   │   ├── commands/
│   │   │   │   │   ├── audit.md
│   │   │   │   │   ├── config.md
│   │   │   │   │   ├── credential.md
│   │   │   │   │   ├── data-table.md
│   │   │   │   │   ├── execution.md
│   │   │   │   │   ├── project.md
│   │   │   │   │   ├── source-control.md
│   │   │   │   │   ├── tag.md
│   │   │   │   │   ├── user.md
│   │   │   │   │   ├── variable.md
│   │   │   │   │   └── workflow.md
│   │   │   │   ├── getting-started.md
│   │   │   │   ├── guides/
│   │   │   │   │   ├── ai-agents.md
│   │   │   │   │   └── ci-cd.md
│   │   │   │   └── index.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── skills/
│   │   │   │   └── n8n-cli/
│   │   │   │       └── SKILL.md
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── config.test.ts
│   │   │   │   ├── base-command.ts
│   │   │   │   ├── client.ts
│   │   │   │   ├── commands/
│   │   │   │   │   ├── audit/
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   ├── config/
│   │   │   │   │   │   ├── set-api-key.ts
│   │   │   │   │   │   ├── set-url.ts
│   │   │   │   │   │   └── show.ts
│   │   │   │   │   ├── credential/
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── schema.ts
│   │   │   │   │   │   └── transfer.ts
│   │   │   │   │   ├── data-table/
│   │   │   │   │   │   ├── add-rows.ts
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete-rows.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── rows.ts
│   │   │   │   │   │   ├── update-rows.ts
│   │   │   │   │   │   └── upsert-rows.ts
│   │   │   │   │   ├── execution/
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── retry.ts
│   │   │   │   │   │   └── stop.ts
│   │   │   │   │   ├── login.ts
│   │   │   │   │   ├── logout.ts
│   │   │   │   │   ├── project/
│   │   │   │   │   │   ├── add-member.ts
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   ├── members.ts
│   │   │   │   │   │   ├── remove-member.ts
│   │   │   │   │   │   └── update.ts
│   │   │   │   │   ├── skill/
│   │   │   │   │   │   └── install.ts
│   │   │   │   │   ├── source-control/
│   │   │   │   │   │   └── pull.ts
│   │   │   │   │   ├── tag/
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   └── update.ts
│   │   │   │   │   ├── user/
│   │   │   │   │   │   ├── get.ts
│   │   │   │   │   │   └── list.ts
│   │   │   │   │   ├── variable/
│   │   │   │   │   │   ├── create.ts
│   │   │   │   │   │   ├── delete.ts
│   │   │   │   │   │   ├── list.ts
│   │   │   │   │   │   └── update.ts
│   │   │   │   │   └── workflow/
│   │   │   │   │       ├── activate.ts
│   │   │   │   │       ├── create.ts
│   │   │   │   │       ├── deactivate.ts
│   │   │   │   │       ├── delete.ts
│   │   │   │   │       ├── get.ts
│   │   │   │   │       ├── list.ts
│   │   │   │   │       ├── tags.ts
│   │   │   │   │       ├── transfer.ts
│   │   │   │   │       └── update.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── output.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── client-oauth2/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── client-oauth2-token.ts
│   │   │   │   ├── client-oauth2.ts
│   │   │   │   ├── code-flow.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── credentials-flow.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils.ts
│   │   │   ├── test/
│   │   │   │   ├── client-oauth2.test.ts
│   │   │   │   ├── code-flow.test.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── credentials-flow.test.ts
│   │   │   │   └── pkce-flow.test.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── codemirror-lang/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── expressions/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── expressions.grammar
│   │   │   │   │   ├── grammar.terms.ts
│   │   │   │   │   ├── grammar.ts
│   │   │   │   │   └── index.ts
│   │   │   │   └── index.ts
│   │   │   ├── test/
│   │   │   │   └── expressions/
│   │   │   │       ├── cases.txt
│   │   │   │       └── expressions.test.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── codemirror-lang-html/
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── CHANGELOG.md
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── complete.ts
│   │   │   │   ├── grammar/
│   │   │   │   │   ├── content.js
│   │   │   │   │   ├── highlight.js
│   │   │   │   │   ├── html.grammar
│   │   │   │   │   ├── index.js
│   │   │   │   │   ├── parser.js
│   │   │   │   │   ├── parser.terms.js
│   │   │   │   │   ├── rollup.config.js
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── mixed.txt
│   │   │   │   │   │   ├── resolvables.txt
│   │   │   │   │   │   ├── tags.txt
│   │   │   │   │   │   ├── test-html.js
│   │   │   │   │   │   ├── test-incremental.js
│   │   │   │   │   │   └── vue.txt
│   │   │   │   │   └── tokens.js
│   │   │   │   └── html.ts
│   │   │   ├── test/
│   │   │   │   └── test-complete.ts
│   │   │   └── vitest.config.ts
│   │   ├── codemirror-lang-sql/
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── complete.ts
│   │   │   │   ├── grammar.sql.terms.ts
│   │   │   │   ├── grammar.sql.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── sql.grammar
│   │   │   │   ├── sql.ts
│   │   │   │   └── tokens.ts
│   │   │   ├── test/
│   │   │   │   ├── complete.test.ts
│   │   │   │   └── tokens.test.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── config/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── configs/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── ai.config.test.ts
│   │   │   │   │   │   ├── external-hooks.config.test.ts
│   │   │   │   │   │   ├── ssrf-protection.config.test.ts
│   │   │   │   │   │   └── user-management.config.test.ts
│   │   │   │   │   ├── ai-assistant.config.ts
│   │   │   │   │   ├── ai-builder.config.ts
│   │   │   │   │   ├── ai.config.ts
│   │   │   │   │   ├── auth.config.ts
│   │   │   │   │   ├── cache.config.ts
│   │   │   │   │   ├── chat-hub.config.ts
│   │   │   │   │   ├── credentials.config.ts
│   │   │   │   │   ├── data-table.config.ts
│   │   │   │   │   ├── database.config.ts
│   │   │   │   │   ├── deployment.config.ts
│   │   │   │   │   ├── diagnostics.config.ts
│   │   │   │   │   ├── dynamic-banners.config.ts
│   │   │   │   │   ├── endpoints.config.ts
│   │   │   │   │   ├── event-bus.config.ts
│   │   │   │   │   ├── executions.config.ts
│   │   │   │   │   ├── expression-engine.config.ts
│   │   │   │   │   ├── external-hooks.config.ts
│   │   │   │   │   ├── generic.config.ts
│   │   │   │   │   ├── hiring-banner.config.ts
│   │   │   │   │   ├── instance-ai.config.ts
│   │   │   │   │   ├── instance-settings-config.ts
│   │   │   │   │   ├── license.config.ts
│   │   │   │   │   ├── logging.config.ts
│   │   │   │   │   ├── mfa.config.ts
│   │   │   │   │   ├── multi-main-setup.config.ts
│   │   │   │   │   ├── nodes.config.ts
│   │   │   │   │   ├── password.config.ts
│   │   │   │   │   ├── personalization.config.ts
│   │   │   │   │   ├── public-api.config.ts
│   │   │   │   │   ├── redis.config.ts
│   │   │   │   │   ├── runners.config.ts
│   │   │   │   │   ├── scaling-mode.config.ts
│   │   │   │   │   ├── security.config.ts
│   │   │   │   │   ├── sentry.config.ts
│   │   │   │   │   ├── sso.config.ts
│   │   │   │   │   ├── ssrf-protection.config.ts
│   │   │   │   │   ├── tags.config.ts
│   │   │   │   │   ├── templates.config.ts
│   │   │   │   │   ├── user-management.config.ts
│   │   │   │   │   ├── version-notifications.config.ts
│   │   │   │   │   ├── workflow-history-compaction.config.ts
│   │   │   │   │   ├── workflow-history.config.ts
│   │   │   │   │   └── workflows.config.ts
│   │   │   │   ├── custom-types.ts
│   │   │   │   ├── decorators.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── utils/
│   │   │   │       └── utils.ts
│   │   │   ├── test/
│   │   │   │   ├── config.test.ts
│   │   │   │   ├── custom-types.test.ts
│   │   │   │   ├── decorators.test.ts
│   │   │   │   └── string-normalization.test.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── constants/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── api.ts
│   │   │   │   ├── browser.ts
│   │   │   │   ├── community-nodes.ts
│   │   │   │   ├── execution.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── instance.ts
│   │   │   │   ├── logstreaming.ts
│   │   │   │   └── time.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── crdt/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── helpers.ts
│   │   │   │   ├── awareness/
│   │   │   │   │   ├── awareness.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── yjs-awareness.ts
│   │   │   │   ├── index.test.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── protocol.test.ts
│   │   │   │   ├── protocol.ts
│   │   │   │   ├── providers/
│   │   │   │   │   ├── yjs.test.ts
│   │   │   │   │   └── yjs.ts
│   │   │   │   ├── sync/
│   │   │   │   │   ├── base-sync-provider.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── sync-provider.test.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── sync.test.ts
│   │   │   │   ├── test-matchers.d.ts
│   │   │   │   ├── transports/
│   │   │   │   │   ├── broadcast-channel.test.ts
│   │   │   │   │   ├── broadcast-channel.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── integration.test.ts
│   │   │   │   │   ├── message-port.test.ts
│   │   │   │   │   ├── message-port.ts
│   │   │   │   │   ├── mock.test.ts
│   │   │   │   │   ├── mock.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   ├── websocket.test.ts
│   │   │   │   │   ├── websocket.ts
│   │   │   │   │   ├── worker.test.ts
│   │   │   │   │   └── worker.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── undo/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── undo-manager.test.ts
│   │   │   │   │   └── yjs-undo-manager.ts
│   │   │   │   ├── utils.test.ts
│   │   │   │   └── utils.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── create-node/
│   │   │   ├── README.md
│   │   │   ├── bin/
│   │   │   │   └── create-node.cjs
│   │   │   ├── package.json
│   │   │   └── tsconfig.json
│   │   ├── db/
│   │   │   ├── AGENTS.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── connection/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── db-connection-options.test.ts
│   │   │   │   │   │   └── db-connection.test.ts
│   │   │   │   │   ├── db-connection-options.ts
│   │   │   │   │   └── db-connection.ts
│   │   │   │   ├── constants.ts
│   │   │   │   ├── entities/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── types-db.test.ts
│   │   │   │   │   │   └── user.entity.test.ts
│   │   │   │   │   ├── abstract-entity.ts
│   │   │   │   │   ├── annotation-tag-entity.ee.ts
│   │   │   │   │   ├── annotation-tag-mapping.ee.ts
│   │   │   │   │   ├── api-key.ts
│   │   │   │   │   ├── auth-identity.ts
│   │   │   │   │   ├── auth-provider-sync-history.ts
│   │   │   │   │   ├── binary-data-file.ts
│   │   │   │   │   ├── credential-dependency-entity.ts
│   │   │   │   │   ├── credentials-entity.ts
│   │   │   │   │   ├── execution-annotation.ee.ts
│   │   │   │   │   ├── execution-data.ts
│   │   │   │   │   ├── execution-entity.ts
│   │   │   │   │   ├── execution-metadata.ts
│   │   │   │   │   ├── folder-tag-mapping.ts
│   │   │   │   │   ├── folder.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── invalid-auth-token.ts
│   │   │   │   │   ├── processed-data.ts
│   │   │   │   │   ├── project-relation.ts
│   │   │   │   │   ├── project-secrets-provider-access.ts
│   │   │   │   │   ├── project.ts
│   │   │   │   │   ├── role-mapping-rule.ts
│   │   │   │   │   ├── role.ts
│   │   │   │   │   ├── scope.ts
│   │   │   │   │   ├── secrets-provider-connection.ts
│   │   │   │   │   ├── settings.ts
│   │   │   │   │   ├── shared-credentials.ts
│   │   │   │   │   ├── shared-workflow.ts
│   │   │   │   │   ├── tag-entity.ts
│   │   │   │   │   ├── test-case-execution.ee.ts
│   │   │   │   │   ├── test-run.ee.ts
│   │   │   │   │   ├── types-db.ts
│   │   │   │   │   ├── user.ts
│   │   │   │   │   ├── variables.ts
│   │   │   │   │   ├── webhook-entity.ts
│   │   │   │   │   ├── workflow-dependency-entity.ts
│   │   │   │   │   ├── workflow-entity.ts
│   │   │   │   │   ├── workflow-history.ts
│   │   │   │   │   ├── workflow-publish-history.ts
│   │   │   │   │   ├── workflow-published-version.ts
│   │   │   │   │   ├── workflow-statistics.ts
│   │   │   │   │   └── workflow-tag-mapping.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── migrations/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── migration-helpers.ts
│   │   │   │   │   ├── common/
│   │   │   │   │   │   ├── 1620821879465-UniqueWorkflowNames.ts
│   │   │   │   │   │   ├── 1630330987096-UpdateWorkflowCredentials.ts
│   │   │   │   │   │   ├── 1658930531669-AddNodeIds.ts
│   │   │   │   │   │   ├── 1659888469333-AddJsonKeyPinData.ts
│   │   │   │   │   │   ├── 1669739707124-AddWorkflowVersionIdColumn.ts
│   │   │   │   │   │   ├── 1671726148419-RemoveWorkflowDataLoadedFlag.ts
│   │   │   │   │   │   ├── 1674509946020-CreateLdapEntities.ts
│   │   │   │   │   │   ├── 1675940580449-PurgeInvalidWorkflowConnections.ts
│   │   │   │   │   │   ├── 1690000000030-RemoveResetPasswordColumns.ts
│   │   │   │   │   │   ├── 1690000000040-AddMfaColumns.ts
│   │   │   │   │   │   ├── 1691088862123-CreateWorkflowNameIndex.ts
│   │   │   │   │   │   ├── 1692967111175-CreateWorkflowHistoryTable.ts
│   │   │   │   │   │   ├── 1693491613982-ExecutionSoftDelete.ts
│   │   │   │   │   │   ├── 1693554410387-DisallowOrphanExecutions.ts
│   │   │   │   │   │   ├── 1695128658538-AddWorkflowMetadata.ts
│   │   │   │   │   │   ├── 1695829275184-ModifyWorkflowHistoryNodesAndConnections.ts
│   │   │   │   │   │   ├── 1700571993961-AddGlobalAdminRole.ts
│   │   │   │   │   │   ├── 1705429061930-DropRoleMapping.ts
│   │   │   │   │   │   ├── 1711018413374-RemoveFailedExecutionStatus.ts
│   │   │   │   │   │   ├── 1711390882123-MoveSshKeysToDatabase.ts
│   │   │   │   │   │   ├── 1712044305787-RemoveNodesAccess.ts
│   │   │   │   │   │   ├── 1714133768519-CreateProject.ts
│   │   │   │   │   │   ├── 1714133768521-MakeExecutionStatusNonNullable.ts
│   │   │   │   │   │   ├── 1720101653148-AddConstraintToExecutionMetadata.ts
│   │   │   │   │   │   ├── 1723627610222-CreateInvalidAuthTokenTable.ts
│   │   │   │   │   │   ├── 1723796243146-RefactorExecutionIndices.ts
│   │   │   │   │   │   ├── 1724753530828-CreateExecutionAnnotationTables.ts
│   │   │   │   │   │   ├── 1724951148974-AddApiKeysTable.ts
│   │   │   │   │   │   ├── 1726606152711-CreateProcessedDataTable.ts
│   │   │   │   │   │   ├── 1727427440136-SeparateExecutionCreationFromStart.ts
│   │   │   │   │   │   ├── 1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping.ts
│   │   │   │   │   │   ├── 1729607673464-UpdateProcessedDataValueColumnToText.ts
│   │   │   │   │   │   ├── 1729607673469-AddProjectIcons.ts
│   │   │   │   │   │   ├── 1730386903556-CreateTestDefinitionTable.ts
│   │   │   │   │   │   ├── 1731404028106-AddDescriptionToTestDefinition.ts
│   │   │   │   │   │   ├── 1732271325258-CreateTestMetricTable.ts
│   │   │   │   │   │   ├── 1732549866705-CreateTestRunTable.ts
│   │   │   │   │   │   ├── 1733133775640-AddMockedNodesColumnToTestDefinition.ts
│   │   │   │   │   │   ├── 1734479635324-AddManagedColumnToCredentialsTable.ts
│   │   │   │   │   │   ├── 1736172058779-AddStatsColumnsToTestRun.ts
│   │   │   │   │   │   ├── 1736947513045-CreateTestCaseExecutionTable.ts
│   │   │   │   │   │   ├── 1737715421462-AddErrorColumnsToTestRuns.ts
│   │   │   │   │   │   ├── 1738709609940-CreateFolderTable.ts
│   │   │   │   │   │   ├── 1739549398681-CreateAnalyticsTables.ts
│   │   │   │   │   │   ├── 1741167584277-RenameAnalyticsToInsights.ts
│   │   │   │   │   │   ├── 1742918400000-AddScopesColumnToApiKeys.ts
│   │   │   │   │   │   ├── 1745322634000-CleanEvaluations.ts
│   │   │   │   │   │   ├── 1745587087521-AddWorkflowStatisticsRootCount.ts
│   │   │   │   │   │   ├── 1745934666076-AddWorkflowArchivedColumn.ts
│   │   │   │   │   │   ├── 1745934666077-DropRoleTable.ts
│   │   │   │   │   │   ├── 1747824239000-AddProjectDescriptionColumn.ts
│   │   │   │   │   │   ├── 1750252139166-AddLastActiveAtColumnToUser.ts
│   │   │   │   │   │   ├── 1750252139166-AddScopeTables.ts
│   │   │   │   │   │   ├── 1750252139167-AddRolesTables.ts
│   │   │   │   │   │   ├── 1750252139168-LinkRoleToUserTable.ts
│   │   │   │   │   │   ├── 1750252139170-RemoveOldRoleColumn.ts
│   │   │   │   │   │   ├── 1752669793000-AddInputsOutputsToTestCaseExecution.ts
│   │   │   │   │   │   ├── 1753953244168-LinkRoleToProjectRelationTable.ts
│   │   │   │   │   │   ├── 1754475614601-CreateDataStoreTables.ts
│   │   │   │   │   │   ├── 1754475614602-ReplaceDataStoreTablesWithDataTables.ts
│   │   │   │   │   │   ├── 1756906557570-AddTimestampsToRoleAndRoleIndexes.ts
│   │   │   │   │   │   ├── 1758731786132-AddAudienceColumnToApiKey.ts
│   │   │   │   │   │   ├── 1759399811000-ChangeValueTypesForInsights.ts
│   │   │   │   │   │   ├── 1760019379982-CreateChatHubTables.ts
│   │   │   │   │   │   ├── 1760020000000-CreateChatHubAgentTable.ts
│   │   │   │   │   │   ├── 1760020838000-UniqueRoleNames.ts
│   │   │   │   │   │   ├── 1760116750277-CreateOAuthEntities.ts
│   │   │   │   │   │   ├── 1760314000000-CreateWorkflowDependencyTable.ts
│   │   │   │   │   │   ├── 1760965142113-DropUnusedChatHubColumns.ts
│   │   │   │   │   │   ├── 1761773155024-AddAttachmentsToChatHubMessages.ts
│   │   │   │   │   │   ├── 1761830340990-AddToolsColumnToChatHubTables.ts
│   │   │   │   │   │   ├── 1762177736257-AddWorkflowDescriptionColumn.ts
│   │   │   │   │   │   ├── 1762763704614-BackfillMissingWorkflowHistoryRecords.ts
│   │   │   │   │   │   ├── 1762771954619-IsGlobalGlobalColumnToCredentialsTable.ts
│   │   │   │   │   │   ├── 1762847206508-AddWorkflowHistoryAutoSaveFields.ts
│   │   │   │   │   │   ├── 1763047800000-AddActiveVersionIdColumn.ts
│   │   │   │   │   │   ├── 1763048000000-ActivateExecuteWorkflowTriggerWorkflows.ts
│   │   │   │   │   │   ├── 1763572724000-ChangeOAuthStateColumnToUnboundedVarchar.ts
│   │   │   │   │   │   ├── 1763716655000-CreateBinaryDataTable.ts
│   │   │   │   │   │   ├── 1764167920585-CreateWorkflowPublishHistoryTable.ts
│   │   │   │   │   │   ├── 1764276827837-AddCreatorIdToProjectTable.ts
│   │   │   │   │   │   ├── 1764682447000-CreateCredentialResolverTable.ts
│   │   │   │   │   │   ├── 1764689388394-AddDynamicCredentialEntryTable.ts
│   │   │   │   │   │   ├── 1765448186933-BackfillMissingWorkflowHistoryRecords.ts
│   │   │   │   │   │   ├── 1765459448000-AddResolvableFieldsToCredentials.ts
│   │   │   │   │   │   ├── 1765788427674-AddIconToAgentTable.ts
│   │   │   │   │   │   ├── 1765886667897-AddAgentIdForeignKeys.ts
│   │   │   │   │   │   ├── 1765892199653-AddVersionIdToExecutionData.ts
│   │   │   │   │   │   ├── 1766064542000-AddWorkflowPublishScopeToProjectRoles.ts
│   │   │   │   │   │   ├── 1766068346315-AddChatMessageIndices.ts
│   │   │   │   │   │   ├── 1768402473068-ExpandModelColumnLength.ts
│   │   │   │   │   │   ├── 1768557000000-AddStoredAtToExecutionEntity.ts
│   │   │   │   │   │   ├── 1768901721000-AddDynamicCredentialUserEntryTable.ts
│   │   │   │   │   │   ├── 1769000000000-AddPublishedVersionIdToWorkflowDependency.ts
│   │   │   │   │   │   ├── 1769433700000-CreateSecretsProvidersConnectionTables.ts
│   │   │   │   │   │   ├── 1769698710000-CreateWorkflowPublishedVersionTable.ts
│   │   │   │   │   │   ├── 1769784356000-ExpandSubjectIDColumnLength.ts
│   │   │   │   │   │   ├── 1769900001000-AddWorkflowUnpublishScopeToCustomRoles.ts
│   │   │   │   │   │   ├── 1770000000000-CreateChatHubToolsTable.ts
│   │   │   │   │   │   ├── 1770000000000-ExpandProviderIdColumnLength.ts
│   │   │   │   │   │   ├── 1770220686000-CreateWorkflowBuilderSessionTable.ts
│   │   │   │   │   │   ├── 1771417407753-AddScalingFieldsToTestRun.ts
│   │   │   │   │   │   ├── 1771500000000-MigrateExternalSecretsToEntityStorage.ts
│   │   │   │   │   │   ├── 1771500000001-AddUnshareScopeToCustomRoles.ts
│   │   │   │   │   │   ├── 1771500000002-AddFilesColumnToChatHubAgents.ts
│   │   │   │   │   │   ├── 1772000000000-AddSuggestedPromptsToAgentTable.ts
│   │   │   │   │   │   ├── 1772619247761-AddRoleColumnToProjectSecretsProviderAccess.ts
│   │   │   │   │   │   ├── 1772619247762-ChangeWorkflowPublishedVersionFKsToRestrict.ts
│   │   │   │   │   │   ├── 1772700000000-AddTypeToChatHubSessions.ts
│   │   │   │   │   │   ├── 1772800000000-CreateRoleMappingRuleTable.ts
│   │   │   │   │   │   ├── 1773000000000-CreateCredentialDependencyTable.ts
│   │   │   │   │   │   ├── 1774280963551-AddRestoreFieldsToWorkflowBuilderSession.ts
│   │   │   │   │   │   ├── 1774854660000-CreateInstanceVersionHistoryTable.ts
│   │   │   │   │   │   └── 1775000000000-CreateInstanceAiTables.ts
│   │   │   │   │   ├── dsl/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── enum-check.test.ts
│   │   │   │   │   │   ├── column.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── indices.ts
│   │   │   │   │   │   └── table.ts
│   │   │   │   │   ├── migration-helpers.test.ts
│   │   │   │   │   ├── migration-helpers.ts
│   │   │   │   │   ├── migration-types.ts
│   │   │   │   │   ├── postgresdb/
│   │   │   │   │   │   ├── 1587669153312-InitialMigration.ts
│   │   │   │   │   │   ├── 1589476000887-WebhookModel.ts
│   │   │   │   │   │   ├── 1594828256133-CreateIndexStoppedAt.ts
│   │   │   │   │   │   ├── 1607431743768-MakeStoppedAtNullable.ts
│   │   │   │   │   │   ├── 1611144599516-AddWebhookId.ts
│   │   │   │   │   │   ├── 1617270242566-CreateTagEntity.ts
│   │   │   │   │   │   ├── 1620824779533-UniqueWorkflowNames.ts
│   │   │   │   │   │   ├── 1626176912946-AddwaitTill.ts
│   │   │   │   │   │   ├── 1630419189837-UpdateWorkflowCredentials.ts
│   │   │   │   │   │   ├── 1644422880309-AddExecutionEntityIndexes.ts
│   │   │   │   │   │   ├── 1646834195327-IncreaseTypeVarcharLimit.ts
│   │   │   │   │   │   ├── 1646992772331-CreateUserManagement.ts
│   │   │   │   │   │   ├── 1648740597343-LowerCaseUserEmail.ts
│   │   │   │   │   │   ├── 1652254514002-CommunityNodes.ts
│   │   │   │   │   │   ├── 1652367743993-AddUserSettings.ts
│   │   │   │   │   │   ├── 1652905585850-AddAPIKeyColumn.ts
│   │   │   │   │   │   ├── 1654090467022-IntroducePinData.ts
│   │   │   │   │   │   ├── 1658932090381-AddNodeIds.ts
│   │   │   │   │   │   ├── 1659902242948-AddJsonKeyPinData.ts
│   │   │   │   │   │   ├── 1660062385367-CreateCredentialsUserRole.ts
│   │   │   │   │   │   ├── 1663755770893-CreateWorkflowsEditorRole.ts
│   │   │   │   │   │   ├── 1664196174001-WorkflowStatistics.ts
│   │   │   │   │   │   ├── 1665484192212-CreateCredentialUsageTable.ts
│   │   │   │   │   │   ├── 1665754637025-RemoveCredentialUsageTable.ts
│   │   │   │   │   │   ├── 1669739707126-AddWorkflowVersionIdColumn.ts
│   │   │   │   │   │   ├── 1669823906995-AddTriggerCountColumn.ts
│   │   │   │   │   │   ├── 1671535397530-MessageEventBusDestinations.ts
│   │   │   │   │   │   ├── 1671726148421-RemoveWorkflowDataLoadedFlag.ts
│   │   │   │   │   │   ├── 1673268682475-DeleteExecutionsWithWorkflows.ts
│   │   │   │   │   │   ├── 1674138566000-AddStatusToExecutions.ts
│   │   │   │   │   │   ├── 1676996103000-MigrateExecutionStatus.ts
│   │   │   │   │   │   ├── 1677236854063-UpdateRunningExecutionStatus.ts
│   │   │   │   │   │   ├── 1677501636754-CreateVariables.ts
│   │   │   │   │   │   ├── 1679416281778-CreateExecutionMetadataTable.ts
│   │   │   │   │   │   ├── 1681134145996-AddUserActivatedProperty.ts
│   │   │   │   │   │   ├── 1681134145997-RemoveSkipOwnerSetup.ts
│   │   │   │   │   │   ├── 1690000000000-MigrateIntegerKeysToString.ts
│   │   │   │   │   │   ├── 1690000000020-SeparateExecutionData.ts
│   │   │   │   │   │   ├── 1690787606731-AddMissingPrimaryKeyOnExecutionData.ts
│   │   │   │   │   │   ├── 1694091729095-MigrateToTimestampTz.ts
│   │   │   │   │   │   ├── 1717498465931-AddActivatedAtUserSetting.ts
│   │   │   │   │   │   ├── 1721377157740-FixExecutionMetadataSequence.ts
│   │   │   │   │   │   ├── 1731582748663-MigrateTestDefinitionKeyToString.ts
│   │   │   │   │   │   ├── 1740445074052-UpdateParentFolderIdColumn.ts
│   │   │   │   │   │   ├── 1758794506893-AddProjectIdToVariableTable.ts
│   │   │   │   │   │   ├── 1761047826451-AddWorkflowVersionColumn.ts
│   │   │   │   │   │   ├── 1761655473000-ChangeDependencyInfoToJson.ts
│   │   │   │   │   │   ├── 1762771264000-ChangeDefaultForIdInUserTable.ts
│   │   │   │   │   │   ├── 1765804780000-ConvertAgentIdToUuid.ts
│   │   │   │   │   │   ├── 1766500000000-ExpandInsightsWorkflowIdLength.ts
│   │   │   │   │   │   ├── 1767018516000-ChangeWorkflowStatisticsFKToNoAction.ts
│   │   │   │   │   │   └── index.ts
│   │   │   │   │   └── sqlite/
│   │   │   │   │       ├── 1588102412422-InitialMigration.ts
│   │   │   │   │       ├── 1592445003908-WebhookModel.ts
│   │   │   │   │       ├── 1594825041918-CreateIndexStoppedAt.ts
│   │   │   │   │       ├── 1607431743769-MakeStoppedAtNullable.ts
│   │   │   │   │       ├── 1611071044839-AddWebhookId.ts
│   │   │   │   │       ├── 1617213344594-CreateTagEntity.ts
│   │   │   │   │       ├── 1621707690587-AddWaitColumn.ts
│   │   │   │   │       ├── 1644421939510-AddExecutionEntityIndexes.ts
│   │   │   │   │       ├── 1646992772331-CreateUserManagement.ts
│   │   │   │   │       ├── 1648740597343-LowerCaseUserEmail.ts
│   │   │   │   │       ├── 1652254514001-CommunityNodes.ts
│   │   │   │   │       ├── 1652367743993-AddUserSettings.ts
│   │   │   │   │       ├── 1652905585850-AddAPIKeyColumn.ts
│   │   │   │   │       ├── 1654089251344-IntroducePinData.ts
│   │   │   │   │       ├── 1660062385367-CreateCredentialsUserRole.ts
│   │   │   │   │       ├── 1663755770892-CreateWorkflowsUserRole.ts
│   │   │   │   │       ├── 1664196174000-WorkflowStatistics.ts
│   │   │   │   │       ├── 1665484192211-CreateCredentialUsageTable.ts
│   │   │   │   │       ├── 1665754637024-RemoveCredentialUsageTable.ts
│   │   │   │   │       ├── 1669823906993-AddTriggerCountColumn.ts
│   │   │   │   │       ├── 1671535397530-MessageEventBusDestinations.ts
│   │   │   │   │       ├── 1673268682475-DeleteExecutionsWithWorkflows.ts
│   │   │   │   │       ├── 1674138566000-AddStatusToExecutions.ts
│   │   │   │   │       ├── 1676996103000-MigrateExecutionStatus.ts
│   │   │   │   │       ├── 1677237073720-UpdateRunningExecutionStatus.ts
│   │   │   │   │       ├── 1677501636752-CreateVariables.ts
│   │   │   │   │       ├── 1679416281777-CreateExecutionMetadataTable.ts
│   │   │   │   │       ├── 1681134145996-AddUserActivatedProperty.ts
│   │   │   │   │       ├── 1681134145997-RemoveSkipOwnerSetup.ts
│   │   │   │   │       ├── 1690000000002-MigrateIntegerKeysToString.ts
│   │   │   │   │       ├── 1690000000010-SeparateExecutionData.ts
│   │   │   │   │       ├── 1690000000020-FixMissingIndicesFromStringIdMigration.ts
│   │   │   │   │       ├── 1690000000030-RemoveResetPasswordColumns.ts
│   │   │   │   │       ├── 1690000000040-AddMfaColumns.ts
│   │   │   │   │       ├── 1693491613982-ExecutionSoftDelete.ts
│   │   │   │   │       ├── 1695128658538-AddWorkflowMetadata.ts
│   │   │   │   │       ├── 1705429061930-DropRoleMapping.ts
│   │   │   │   │       ├── 1717498465931-AddActivatedAtUserSetting.ts
│   │   │   │   │       ├── 1724951148974-AddApiKeysTable.ts
│   │   │   │   │       ├── 1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping.ts
│   │   │   │   │       ├── 1729607673469-AddProjectIcons.ts
│   │   │   │   │       ├── 1731404028106-AddDescriptionToTestDefinition.ts
│   │   │   │   │       ├── 1731582748663-MigrateTestDefinitionKeyToString.ts
│   │   │   │   │       ├── 1738709609940-CreateFolderTable.ts
│   │   │   │   │       ├── 1740445074052-UpdateParentFolderIdColumn.ts
│   │   │   │   │       ├── 1742918400000-AddScopesColumnToApiKeys.ts
│   │   │   │   │       ├── 1758794506893-AddProjectIdToVariableTable.ts
│   │   │   │   │       ├── 1761047826451-AddWorkflowVersionColumn.ts
│   │   │   │   │       ├── 1761655473000-ChangeDependencyInfoToJson.ts
│   │   │   │   │       ├── 1764276827837-AddCreatorIdToProjectTable.ts
│   │   │   │   │       ├── 1764689448000-AddResolvableFieldsToCredentials.ts
│   │   │   │   │       ├── 1765886667897-AddAgentIdForeignKeys.ts
│   │   │   │   │       ├── 1766068346315-AddChatMessageIndices.ts
│   │   │   │   │       ├── 1767018516000-ChangeWorkflowStatisticsFKToNoAction.ts
│   │   │   │   │       └── index.ts
│   │   │   │   ├── repositories/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── credential-dependency.repository.test.ts
│   │   │   │   │   │   ├── credentials.repository.test.ts
│   │   │   │   │   │   ├── execution.repository.test.ts
│   │   │   │   │   │   ├── secrets-provider-connection.repository.ee.test.ts
│   │   │   │   │   │   ├── shared-credentials.repository.test.ts
│   │   │   │   │   │   ├── shared-workflow.repository.test.ts
│   │   │   │   │   │   └── workflow.repository.test.ts
│   │   │   │   │   ├── annotation-tag-mapping.repository.ee.ts
│   │   │   │   │   ├── annotation-tag.repository.ee.ts
│   │   │   │   │   ├── api-key.repository.ts
│   │   │   │   │   ├── auth-identity.repository.ts
│   │   │   │   │   ├── auth-provider-sync-history.repository.ts
│   │   │   │   │   ├── binary-data.repository.ts
│   │   │   │   │   ├── credential-dependency.repository.ts
│   │   │   │   │   ├── credentials.repository.ts
│   │   │   │   │   ├── execution-annotation.repository.ts
│   │   │   │   │   ├── execution-data.repository.ts
│   │   │   │   │   ├── execution-metadata.repository.ts
│   │   │   │   │   ├── execution.repository.ts
│   │   │   │   │   ├── folder-tag-mapping.repository.ts
│   │   │   │   │   ├── folder.repository.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── invalid-auth-token.repository.ts
│   │   │   │   │   ├── license-metrics.repository.ts
│   │   │   │   │   ├── processed-data.repository.ts
│   │   │   │   │   ├── project-relation.repository.ts
│   │   │   │   │   ├── project-secrets-provider-access.repository.ee.ts
│   │   │   │   │   ├── project.repository.ts
│   │   │   │   │   ├── role-mapping-rule.repository.ts
│   │   │   │   │   ├── role.repository.ts
│   │   │   │   │   ├── scope.repository.ts
│   │   │   │   │   ├── secrets-provider-connection.repository.ee.ts
│   │   │   │   │   ├── settings.repository.ts
│   │   │   │   │   ├── shared-credentials.repository.ts
│   │   │   │   │   ├── shared-workflow.repository.ts
│   │   │   │   │   ├── tag.repository.ts
│   │   │   │   │   ├── test-case-execution.repository.ee.ts
│   │   │   │   │   ├── test-run.repository.ee.ts
│   │   │   │   │   ├── user.repository.ts
│   │   │   │   │   ├── variables.repository.ts
│   │   │   │   │   ├── webhook.repository.ts
│   │   │   │   │   ├── workflow-dependency.repository.ts
│   │   │   │   │   ├── workflow-history.repository.ts
│   │   │   │   │   ├── workflow-publish-history.repository.ts
│   │   │   │   │   ├── workflow-published-version.repository.ts
│   │   │   │   │   ├── workflow-statistics.repository.ts
│   │   │   │   │   ├── workflow-tag-mapping.repository.ts
│   │   │   │   │   └── workflow.repository.ts
│   │   │   │   ├── services/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── db-lock.service.test.ts
│   │   │   │   │   ├── auth.roles.service.ts
│   │   │   │   │   ├── db-lock.service.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── subscribers/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── user-subscriber.ts
│   │   │   │   └── utils/
│   │   │   │       ├── __tests__/
│   │   │   │       │   ├── build-workflows-by-nodes-query.test.ts
│   │   │   │       │   └── get-test-run-final-result.ee.test.ts
│   │   │   │       ├── build-workflows-by-nodes-query.ts
│   │   │   │       ├── generators.ts
│   │   │   │       ├── get-final-test-result.ts
│   │   │   │       ├── is-string-array.ts
│   │   │   │       ├── is-valid-email.ts
│   │   │   │       ├── separate.ts
│   │   │   │       ├── sql.ts
│   │   │   │       ├── test-utils/
│   │   │   │       │   ├── mock-entity-manager.ts
│   │   │   │       │   └── mock-instance.ts
│   │   │   │       ├── timed-query.ts
│   │   │   │       ├── transaction.ts
│   │   │   │       ├── transformers.ts
│   │   │   │       └── validators/
│   │   │   │           ├── __tests__/
│   │   │   │           │   ├── no-url.validator.test.ts
│   │   │   │           │   └── no-xss.validator.test.ts
│   │   │   │           ├── no-url.validator.ts
│   │   │   │           └── no-xss.validator.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── decorators/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── memoized.test.ts
│   │   │   │   │   └── redactable.test.ts
│   │   │   │   ├── auth-handler/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── auth-handler-metadata.test.ts
│   │   │   │   │   ├── auth-handler-metadata.ts
│   │   │   │   │   ├── auth-handler.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── breaking-change-rule/
│   │   │   │   │   ├── breaking-change-rule-metadata.ts
│   │   │   │   │   ├── breaking-change-rule.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── command/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── command.test.ts
│   │   │   │   │   ├── command-metadata.ts
│   │   │   │   │   ├── command.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── context-establishment/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── context-establishment-hook.test.ts
│   │   │   │   │   ├── context-establishment-hook-metadata.ts
│   │   │   │   │   ├── context-establishment-hook.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── controller/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── args.test.ts
│   │   │   │   │   │   ├── controller-registry-metadata.test.ts
│   │   │   │   │   │   ├── license.test.ts
│   │   │   │   │   │   ├── rest-controller.test.ts
│   │   │   │   │   │   ├── root-level-controller.test.ts
│   │   │   │   │   │   ├── route.test.ts
│   │   │   │   │   │   └── scoped.test.ts
│   │   │   │   │   ├── args.ts
│   │   │   │   │   ├── controller-registry-metadata.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── licensed.ts
│   │   │   │   │   ├── middleware.ts
│   │   │   │   │   ├── rate-limit.ts
│   │   │   │   │   ├── rest-controller.ts
│   │   │   │   │   ├── root-level-controller.ts
│   │   │   │   │   ├── route.ts
│   │   │   │   │   ├── scoped.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── credential-resolver/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── credential-resolver.test.ts
│   │   │   │   │   ├── credential-resolver-metadata.ts
│   │   │   │   │   ├── credential-resolver.ts
│   │   │   │   │   ├── errors.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── debounce.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── execution-lifecycle/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── on-lifecycle-event.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lifecycle-metadata.ts
│   │   │   │   │   └── on-lifecycle-event.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── memoized.ts
│   │   │   │   ├── module/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── module.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── module-metadata.ts
│   │   │   │   │   └── module.ts
│   │   │   │   ├── multi-main/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── on-multi-main-event.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── multi-main-metadata.ts
│   │   │   │   │   └── on-multi-main-event.ts
│   │   │   │   ├── pubsub/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── on-pubsub-event.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── on-pubsub-event.ts
│   │   │   │   │   └── pubsub-metadata.ts
│   │   │   │   ├── redactable.ts
│   │   │   │   ├── shutdown/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── on-shutdown.test.ts
│   │   │   │   │   ├── constants.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── on-shutdown.ts
│   │   │   │   │   ├── shutdown-metadata.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── timed.ts
│   │   │   │   └── types.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── di/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── circular-depedency.test.ts
│   │   │   │   │   ├── di.test.ts
│   │   │   │   │   └── fixtures/
│   │   │   │   │       ├── service-a.ts
│   │   │   │   │       └── service-b.ts
│   │   │   │   └── di.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── errors/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── application.error.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── types.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── eslint-config/
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── configs/
│   │   │   │   │   ├── base.ts
│   │   │   │   │   ├── frontend.ts
│   │   │   │   │   └── node.ts
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── plugins.d.ts
│   │   │   │   ├── rules/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── misplaced-n8n-typeorm-import.ts
│   │   │   │   │   ├── no-argument-spread.test.ts
│   │   │   │   │   ├── no-argument-spread.ts
│   │   │   │   │   ├── no-constructor-in-backend-module.test.ts
│   │   │   │   │   ├── no-constructor-in-backend-module.ts
│   │   │   │   │   ├── no-dynamic-import-template.ts
│   │   │   │   │   ├── no-import-enterprise-edition.test.ts
│   │   │   │   │   ├── no-import-enterprise-edition.ts
│   │   │   │   │   ├── no-internal-package-import.test.ts
│   │   │   │   │   ├── no-internal-package-import.ts
│   │   │   │   │   ├── no-interpolation-in-regular-string.ts
│   │   │   │   │   ├── no-json-parse-json-stringify.test.ts
│   │   │   │   │   ├── no-json-parse-json-stringify.ts
│   │   │   │   │   ├── no-plain-errors.ts
│   │   │   │   │   ├── no-skipped-tests.ts
│   │   │   │   │   ├── no-top-level-relative-imports-in-backend-module.test.ts
│   │   │   │   │   ├── no-top-level-relative-imports-in-backend-module.ts
│   │   │   │   │   ├── no-type-only-import-in-di.test.ts
│   │   │   │   │   ├── no-type-only-import-in-di.ts
│   │   │   │   │   ├── no-type-unsafe-event-emitter.ts
│   │   │   │   │   ├── no-uncaught-json-parse.test.ts
│   │   │   │   │   ├── no-uncaught-json-parse.ts
│   │   │   │   │   ├── no-unneeded-backticks.ts
│   │   │   │   │   ├── no-untyped-config-class-field.ts
│   │   │   │   │   ├── no-unused-param-catch-clause.ts
│   │   │   │   │   ├── no-useless-catch-throw.test.ts
│   │   │   │   │   └── no-useless-catch-throw.ts
│   │   │   │   └── utils/
│   │   │   │       └── json.ts
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.ts
│   │   ├── eslint-plugin-community-nodes/
│   │   │   ├── README.md
│   │   │   ├── docs/
│   │   │   │   └── rules/
│   │   │   │       ├── ai-node-package-json.md
│   │   │   │       ├── cred-class-field-icon-missing.md
│   │   │   │       ├── credential-documentation-url.md
│   │   │   │       ├── credential-password-field.md
│   │   │   │       ├── credential-test-required.md
│   │   │   │       ├── icon-validation.md
│   │   │   │       ├── no-credential-reuse.md
│   │   │   │       ├── no-deprecated-workflow-functions.md
│   │   │   │       ├── no-http-request-with-manual-auth.md
│   │   │   │       ├── no-restricted-globals.md
│   │   │   │       ├── no-restricted-imports.md
│   │   │   │       ├── node-class-description-icon-missing.md
│   │   │   │       ├── node-usable-as-tool.md
│   │   │   │       ├── package-name-convention.md
│   │   │   │       └── resource-operation-pattern.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── plugin.ts
│   │   │   │   ├── rules/
│   │   │   │   │   ├── ai-node-package-json.test.ts
│   │   │   │   │   ├── ai-node-package-json.ts
│   │   │   │   │   ├── cred-class-field-icon-missing.test.ts
│   │   │   │   │   ├── cred-class-field-icon-missing.ts
│   │   │   │   │   ├── credential-documentation-url.test.ts
│   │   │   │   │   ├── credential-documentation-url.ts
│   │   │   │   │   ├── credential-password-field.test.ts
│   │   │   │   │   ├── credential-password-field.ts
│   │   │   │   │   ├── credential-test-required.test.ts
│   │   │   │   │   ├── credential-test-required.ts
│   │   │   │   │   ├── icon-validation.test.ts
│   │   │   │   │   ├── icon-validation.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── no-credential-reuse.test.ts
│   │   │   │   │   ├── no-credential-reuse.ts
│   │   │   │   │   ├── no-deprecated-workflow-functions.test.ts
│   │   │   │   │   ├── no-deprecated-workflow-functions.ts
│   │   │   │   │   ├── no-http-request-with-manual-auth.test.ts
│   │   │   │   │   ├── no-http-request-with-manual-auth.ts
│   │   │   │   │   ├── no-restricted-globals.test.ts
│   │   │   │   │   ├── no-restricted-globals.ts
│   │   │   │   │   ├── no-restricted-imports.test.ts
│   │   │   │   │   ├── no-restricted-imports.ts
│   │   │   │   │   ├── node-class-description-icon-missing.test.ts
│   │   │   │   │   ├── node-class-description-icon-missing.ts
│   │   │   │   │   ├── node-usable-as-tool.test.ts
│   │   │   │   │   ├── node-usable-as-tool.ts
│   │   │   │   │   ├── package-name-convention.test.ts
│   │   │   │   │   ├── package-name-convention.ts
│   │   │   │   │   ├── resource-operation-pattern.test.ts
│   │   │   │   │   └── resource-operation-pattern.ts
│   │   │   │   └── utils/
│   │   │   │       ├── ast-utils.ts
│   │   │   │       ├── file-utils.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── rule-creator.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.eslint.json
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.ts
│   │   ├── expression-runtime/
│   │   │   ├── ARCHITECTURE.md
│   │   │   ├── README.md
│   │   │   ├── docs/
│   │   │   │   ├── architecture-diagram.mmd
│   │   │   │   ├── deep-lazy-proxy.md
│   │   │   │   └── implementation-phases.md
│   │   │   ├── esbuild.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── integration.test.ts
│   │   │   │   ├── bridge/
│   │   │   │   │   └── isolated-vm-bridge.ts
│   │   │   │   ├── evaluator/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── expression-evaluator-cache.test.ts
│   │   │   │   │   │   └── lru-cache.test.ts
│   │   │   │   │   ├── expression-evaluator.ts
│   │   │   │   │   └── lru-cache.ts
│   │   │   │   ├── extensions/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── string-extensions.test.ts
│   │   │   │   │   ├── array-extensions.ts
│   │   │   │   │   ├── boolean-extensions.ts
│   │   │   │   │   ├── date-extensions.ts
│   │   │   │   │   ├── expression-extension-error.ts
│   │   │   │   │   ├── extend.ts
│   │   │   │   │   ├── extensions.ts
│   │   │   │   │   ├── function-extensions.ts
│   │   │   │   │   ├── number-extensions.ts
│   │   │   │   │   ├── object-extensions.ts
│   │   │   │   │   ├── string-extensions.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── pool/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── isolate-pool.test.ts
│   │   │   │   │   └── isolate-pool.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── lazy-proxy.test.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lazy-proxy.ts
│   │   │   │   │   ├── reset.ts
│   │   │   │   │   ├── safe-globals.ts
│   │   │   │   │   └── serialize.ts
│   │   │   │   └── types/
│   │   │   │       ├── bridge.ts
│   │   │   │       ├── evaluator.ts
│   │   │   │       ├── index.ts
│   │   │   │       └── runtime.ts
│   │   │   ├── tsconfig.build.cjs.json
│   │   │   ├── tsconfig.build.esm.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── extension-sdk/
│   │   │   ├── .gitignore
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── schema.json
│   │   │   ├── scripts/
│   │   │   │   └── create-json-schema.ts
│   │   │   ├── src/
│   │   │   │   ├── backend/
│   │   │   │   │   ├── define.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── frontend/
│   │   │   │   │   ├── define.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── schema.ts
│   │   │   │   └── shims.d.ts
│   │   │   ├── tsconfig.backend.json
│   │   │   ├── tsconfig.common.json
│   │   │   ├── tsconfig.frontend.json
│   │   │   ├── tsconfig.json
│   │   │   ├── tsconfig.scripts.json
│   │   │   └── tsdown.config.ts
│   │   ├── fs-proxy/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── spec/
│   │   │   │   ├── local-gateway.md
│   │   │   │   └── technical-spec.md
│   │   │   ├── src/
│   │   │   │   ├── __mocks__/
│   │   │   │   │   └── @inquirer/
│   │   │   │   │       └── prompts.ts
│   │   │   │   ├── cli.ts
│   │   │   │   ├── config-templates.test.ts
│   │   │   │   ├── config-templates.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── confirm-resource-cli.ts
│   │   │   │   ├── daemon.ts
│   │   │   │   ├── gateway-client.ts
│   │   │   │   ├── logger.test.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── settings-store.ts
│   │   │   │   ├── sharp.d.ts
│   │   │   │   ├── startup-config-cli.test.ts
│   │   │   │   ├── startup-config-cli.ts
│   │   │   │   └── tools/
│   │   │   │       ├── browser/
│   │   │   │       │   └── index.ts
│   │   │   │       ├── filesystem/
│   │   │   │       │   ├── constants.ts
│   │   │   │       │   ├── copy-file.test.ts
│   │   │   │       │   ├── copy-file.ts
│   │   │   │       │   ├── create-directory.test.ts
│   │   │   │       │   ├── create-directory.ts
│   │   │   │       │   ├── delete.test.ts
│   │   │   │       │   ├── delete.ts
│   │   │   │       │   ├── edit-file.test.ts
│   │   │   │       │   ├── edit-file.ts
│   │   │   │       │   ├── fs-utils.test.ts
│   │   │   │       │   ├── fs-utils.ts
│   │   │   │       │   ├── get-file-tree.test.ts
│   │   │   │       │   ├── get-file-tree.ts
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── list-files.test.ts
│   │   │   │       │   ├── list-files.ts
│   │   │   │       │   ├── move.test.ts
│   │   │   │       │   ├── move.ts
│   │   │   │       │   ├── read-file.test.ts
│   │   │   │       │   ├── read-file.ts
│   │   │   │       │   ├── search-files.test.ts
│   │   │   │       │   ├── search-files.ts
│   │   │   │       │   ├── write-file.test.ts
│   │   │   │       │   └── write-file.ts
│   │   │   │       ├── monitor-utils.ts
│   │   │   │       ├── mouse-keyboard/
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── mouse-keyboard.test.ts
│   │   │   │       │   └── mouse-keyboard.ts
│   │   │   │       ├── screenshot/
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── screenshot.test.ts
│   │   │   │       │   └── screenshot.ts
│   │   │   │       ├── shell/
│   │   │   │       │   ├── build-shell-resource.test.ts
│   │   │   │       │   ├── build-shell-resource.ts
│   │   │   │       │   ├── index.ts
│   │   │   │       │   ├── shell-execute.test.ts
│   │   │   │       │   └── shell-execute.ts
│   │   │   │       ├── test-utils.ts
│   │   │   │       ├── types.ts
│   │   │   │       └── utils.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── imap/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── errors.ts
│   │   │   │   ├── helpers/
│   │   │   │   │   └── get-message.ts
│   │   │   │   ├── imap-simple.test.ts
│   │   │   │   ├── imap-simple.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── part-data.test.ts
│   │   │   │   ├── part-data.ts
│   │   │   │   └── types.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.ts
│   │   ├── instance-ai/
│   │   │   ├── CLAUDE.md
│   │   │   ├── docs/
│   │   │   │   ├── ENGINEERING.md
│   │   │   │   ├── architecture.md
│   │   │   │   ├── configuration.md
│   │   │   │   ├── filesystem-access.md
│   │   │   │   ├── memory.md
│   │   │   │   ├── sandboxing.md
│   │   │   │   ├── streaming-protocol.md
│   │   │   │   └── tools.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── agent/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── register-with-mastra.test.ts
│   │   │   │   │   │   ├── sanitize-mcp-schemas.test.ts
│   │   │   │   │   │   └── system-prompt.test.ts
│   │   │   │   │   ├── instance-agent.ts
│   │   │   │   │   ├── register-with-mastra.ts
│   │   │   │   │   ├── sanitize-mcp-schemas.ts
│   │   │   │   │   ├── sub-agent-factory.ts
│   │   │   │   │   └── system-prompt.ts
│   │   │   │   ├── compaction/
│   │   │   │   │   ├── compaction-helper.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── domain-access/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── domain-access-tracker.test.ts
│   │   │   │   │   │   └── domain-gating.test.ts
│   │   │   │   │   ├── domain-access-tracker.ts
│   │   │   │   │   ├── domain-gating.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── event-bus/
│   │   │   │   │   ├── event-bus.interface.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── mcp/
│   │   │   │   │   └── mcp-client-manager.ts
│   │   │   │   ├── memory/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── memory-config.test.ts
│   │   │   │   │   │   └── title-utils.test.ts
│   │   │   │   │   ├── memory-config.ts
│   │   │   │   │   ├── title-utils.ts
│   │   │   │   │   └── working-memory-template.ts
│   │   │   │   ├── planned-tasks/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── planned-task-service.test.ts
│   │   │   │   │   └── planned-task-service.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── background-task-manager.test.ts
│   │   │   │   │   │   ├── resumable-stream-executor.test.ts
│   │   │   │   │   │   ├── run-state-registry.test.ts
│   │   │   │   │   │   └── stream-runner.test.ts
│   │   │   │   │   ├── background-task-manager.ts
│   │   │   │   │   ├── resumable-stream-executor.ts
│   │   │   │   │   ├── run-state-registry.ts
│   │   │   │   │   ├── stream-runner.ts
│   │   │   │   │   └── working-memory-tracing.ts
│   │   │   │   ├── storage/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── iteration-log.test.ts
│   │   │   │   │   │   ├── mastra-iteration-log-storage.test.ts
│   │   │   │   │   │   ├── mastra-task-storage.test.ts
│   │   │   │   │   │   ├── thread-patch.test.ts
│   │   │   │   │   │   └── workflow-loop-storage.test.ts
│   │   │   │   │   ├── agent-tree-snapshot.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── iteration-log.ts
│   │   │   │   │   ├── mastra-iteration-log-storage.ts
│   │   │   │   │   ├── mastra-task-storage.ts
│   │   │   │   │   ├── planned-task-storage.ts
│   │   │   │   │   ├── thread-patch.ts
│   │   │   │   │   └── workflow-loop-storage.ts
│   │   │   │   ├── stream/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── map-chunk.test.ts
│   │   │   │   │   ├── consume-with-hitl.ts
│   │   │   │   │   └── map-chunk.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── best-practices.test.ts
│   │   │   │   │   │   ├── get-best-practices.tool.test.ts
│   │   │   │   │   │   ├── mermaid.utils.test.ts
│   │   │   │   │   │   ├── node-configuration.utils.test.ts
│   │   │   │   │   │   ├── search-template-parameters.tool.test.ts
│   │   │   │   │   │   └── search-template-structures.tool.test.ts
│   │   │   │   │   ├── best-practices/
│   │   │   │   │   │   ├── get-best-practices.tool.ts
│   │   │   │   │   │   ├── guides/
│   │   │   │   │   │   │   ├── chatbot.ts
│   │   │   │   │   │   │   ├── content-generation.ts
│   │   │   │   │   │   │   ├── data-extraction.ts
│   │   │   │   │   │   │   ├── data-persistence.ts
│   │   │   │   │   │   │   ├── data-transformation.ts
│   │   │   │   │   │   │   ├── document-processing.ts
│   │   │   │   │   │   │   ├── form-input.ts
│   │   │   │   │   │   │   ├── notification.ts
│   │   │   │   │   │   │   ├── scheduling.ts
│   │   │   │   │   │   │   ├── scraping-and-research.ts
│   │   │   │   │   │   │   └── triage.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── techniques.ts
│   │   │   │   │   ├── credentials/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── delete-credential.tool.test.ts
│   │   │   │   │   │   │   ├── get-credential.tool.test.ts
│   │   │   │   │   │   │   ├── search-credential-types.tool.test.ts
│   │   │   │   │   │   │   └── setup-credentials-mock.tool.test.ts
│   │   │   │   │   │   ├── delete-credential.tool.ts
│   │   │   │   │   │   ├── get-credential.tool.ts
│   │   │   │   │   │   ├── list-credentials.tool.ts
│   │   │   │   │   │   ├── search-credential-types.tool.ts
│   │   │   │   │   │   ├── setup-credentials.tool.ts
│   │   │   │   │   │   └── test-credential.tool.ts
│   │   │   │   │   ├── data-tables/
│   │   │   │   │   │   ├── add-data-table-column.tool.ts
│   │   │   │   │   │   ├── create-data-table.tool.ts
│   │   │   │   │   │   ├── delete-data-table-column.tool.ts
│   │   │   │   │   │   ├── delete-data-table-rows.tool.ts
│   │   │   │   │   │   ├── delete-data-table.tool.ts
│   │   │   │   │   │   ├── get-data-table-schema.tool.ts
│   │   │   │   │   │   ├── insert-data-table-rows.tool.ts
│   │   │   │   │   │   ├── list-data-tables.tool.ts
│   │   │   │   │   │   ├── query-data-table-rows.tool.ts
│   │   │   │   │   │   ├── rename-data-table-column.tool.ts
│   │   │   │   │   │   └── update-data-table-rows.tool.ts
│   │   │   │   │   ├── executions/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── get-execution.tool.test.ts
│   │   │   │   │   │   │   ├── get-node-output.tool.test.ts
│   │   │   │   │   │   │   └── list-executions.tool.test.ts
│   │   │   │   │   │   ├── debug-execution.tool.ts
│   │   │   │   │   │   ├── get-execution.tool.ts
│   │   │   │   │   │   ├── get-node-output.tool.ts
│   │   │   │   │   │   ├── list-executions.tool.ts
│   │   │   │   │   │   ├── run-workflow.tool.ts
│   │   │   │   │   │   └── stop-execution.tool.ts
│   │   │   │   │   ├── filesystem/
│   │   │   │   │   │   ├── create-tools-from-mcp-server.ts
│   │   │   │   │   │   ├── get-file-tree.tool.ts
│   │   │   │   │   │   ├── list-files.tool.ts
│   │   │   │   │   │   ├── read-file.tool.ts
│   │   │   │   │   │   └── search-files.tool.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── nodes/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── get-suggested-nodes.tool.test.ts
│   │   │   │   │   │   │   └── node-search-engine.test.ts
│   │   │   │   │   │   ├── explore-node-resources.tool.ts
│   │   │   │   │   │   ├── get-node-description.tool.ts
│   │   │   │   │   │   ├── get-node-type-definition.tool.ts
│   │   │   │   │   │   ├── get-suggested-nodes.tool.ts
│   │   │   │   │   │   ├── list-nodes.tool.ts
│   │   │   │   │   │   ├── node-search-engine.ts
│   │   │   │   │   │   ├── node-search-engine.types.ts
│   │   │   │   │   │   ├── search-nodes.tool.ts
│   │   │   │   │   │   └── suggested-nodes-data.ts
│   │   │   │   │   ├── orchestration/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── correct-background-task.tool.test.ts
│   │   │   │   │   │   │   ├── delegate.tool.test.ts
│   │   │   │   │   │   │   ├── report-verification-verdict.tool.test.ts
│   │   │   │   │   │   │   └── research-with-agent.tool.test.ts
│   │   │   │   │   │   ├── browser-credential-setup.tool.ts
│   │   │   │   │   │   ├── build-workflow-agent.prompt.ts
│   │   │   │   │   │   ├── build-workflow-agent.tool.ts
│   │   │   │   │   │   ├── cancel-background-task.tool.ts
│   │   │   │   │   │   ├── correct-background-task.tool.ts
│   │   │   │   │   │   ├── data-table-agent.prompt.ts
│   │   │   │   │   │   ├── data-table-agent.tool.ts
│   │   │   │   │   │   ├── delegate.schemas.ts
│   │   │   │   │   │   ├── delegate.tool.ts
│   │   │   │   │   │   ├── display-utils.ts
│   │   │   │   │   │   ├── plan.tool.ts
│   │   │   │   │   │   ├── report-verification-verdict.tool.ts
│   │   │   │   │   │   ├── research-agent-prompt.ts
│   │   │   │   │   │   ├── research-with-agent.tool.ts
│   │   │   │   │   │   ├── tracing-utils.ts
│   │   │   │   │   │   ├── update-tasks.tool.ts
│   │   │   │   │   │   └── verify-built-workflow.tool.ts
│   │   │   │   │   ├── shared/
│   │   │   │   │   │   └── ask-user.tool.ts
│   │   │   │   │   ├── templates/
│   │   │   │   │   │   ├── search-template-parameters.tool.ts
│   │   │   │   │   │   ├── search-template-structures.tool.ts
│   │   │   │   │   │   ├── template-api.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── utils/
│   │   │   │   │   │   ├── mermaid.utils.ts
│   │   │   │   │   │   └── node-configuration.utils.ts
│   │   │   │   │   ├── web-research/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── fetch-url.tool.test.ts
│   │   │   │   │   │   │   └── web-search.tool.test.ts
│   │   │   │   │   │   ├── fetch-url.tool.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── sanitize-web-content.ts
│   │   │   │   │   │   └── web-search.tool.ts
│   │   │   │   │   ├── workflows/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── delete-workflow.tool.test.ts
│   │   │   │   │   │   │   ├── get-workflow.tool.test.ts
│   │   │   │   │   │   │   ├── list-workflow-versions.tool.test.ts
│   │   │   │   │   │   │   ├── publish-workflow.tool.test.ts
│   │   │   │   │   │   │   ├── resolve-credentials.test.ts
│   │   │   │   │   │   │   ├── restore-workflow-version.tool.test.ts
│   │   │   │   │   │   │   ├── setup-workflow.service.test.ts
│   │   │   │   │   │   │   ├── setup-workflow.tool.test.ts
│   │   │   │   │   │   │   ├── unpublish-workflow.tool.test.ts
│   │   │   │   │   │   │   └── write-sandbox-file.tool.test.ts
│   │   │   │   │   │   ├── apply-workflow-credentials.tool.ts
│   │   │   │   │   │   ├── build-workflow.tool.ts
│   │   │   │   │   │   ├── delete-workflow.tool.ts
│   │   │   │   │   │   ├── get-workflow-as-code.tool.ts
│   │   │   │   │   │   ├── get-workflow-version.tool.ts
│   │   │   │   │   │   ├── get-workflow.tool.ts
│   │   │   │   │   │   ├── list-workflow-versions.tool.ts
│   │   │   │   │   │   ├── list-workflows.tool.ts
│   │   │   │   │   │   ├── materialize-node-type.tool.ts
│   │   │   │   │   │   ├── publish-workflow.tool.ts
│   │   │   │   │   │   ├── resolve-credentials.ts
│   │   │   │   │   │   ├── restore-workflow-version.tool.ts
│   │   │   │   │   │   ├── setup-workflow.schema.ts
│   │   │   │   │   │   ├── setup-workflow.service.ts
│   │   │   │   │   │   ├── setup-workflow.tool.ts
│   │   │   │   │   │   ├── submit-workflow.tool.ts
│   │   │   │   │   │   ├── unpublish-workflow.tool.ts
│   │   │   │   │   │   ├── update-workflow-version.tool.ts
│   │   │   │   │   │   └── write-sandbox-file.tool.ts
│   │   │   │   │   └── workspace/
│   │   │   │   │       ├── __tests__/
│   │   │   │   │       │   ├── cleanup-test-executions.tool.test.ts
│   │   │   │   │       │   ├── create-folder.tool.test.ts
│   │   │   │   │       │   ├── delete-folder.tool.test.ts
│   │   │   │   │       │   ├── list-folders.tool.test.ts
│   │   │   │   │       │   ├── list-projects.tool.test.ts
│   │   │   │   │       │   ├── list-tags.tool.test.ts
│   │   │   │   │       │   ├── move-workflow-to-folder.tool.test.ts
│   │   │   │   │       │   └── tag-workflow.tool.test.ts
│   │   │   │   │       ├── cleanup-test-executions.tool.ts
│   │   │   │   │       ├── create-folder.tool.ts
│   │   │   │   │       ├── delete-folder.tool.ts
│   │   │   │   │       ├── list-folders.tool.ts
│   │   │   │   │       ├── list-projects.tool.ts
│   │   │   │   │       ├── list-tags.tool.ts
│   │   │   │   │       ├── move-workflow-to-folder.tool.ts
│   │   │   │   │       └── tag-workflow.tool.ts
│   │   │   │   ├── tracing/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── langsmith-tracing.test.ts
│   │   │   │   │   └── langsmith-tracing.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── format-timestamp.test.ts
│   │   │   │   │   │   └── stream-helpers.test.ts
│   │   │   │   │   ├── agent-tree.ts
│   │   │   │   │   ├── format-timestamp.ts
│   │   │   │   │   └── stream-helpers.ts
│   │   │   │   ├── workflow-builder/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── extract-code.test.ts
│   │   │   │   │   │   ├── parse-validate.test.ts
│   │   │   │   │   │   └── patch-code.test.ts
│   │   │   │   │   ├── extract-code.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── parse-validate.ts
│   │   │   │   │   ├── patch-code.ts
│   │   │   │   │   ├── sdk-prompt-sections.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── workflow-loop/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── guidance.test.ts
│   │   │   │   │   │   ├── workflow-loop-controller.test.ts
│   │   │   │   │   │   └── workflow-task-service.test.ts
│   │   │   │   │   ├── guidance.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── runtime.ts
│   │   │   │   │   ├── workflow-loop-controller.ts
│   │   │   │   │   ├── workflow-loop-state.ts
│   │   │   │   │   └── workflow-task-service.ts
│   │   │   │   └── workspace/
│   │   │   │       ├── __tests__/
│   │   │   │       │   ├── create-workspace.test.ts
│   │   │   │       │   ├── n8n-sandbox-client.test.ts
│   │   │   │       │   ├── sandbox-fs.test.ts
│   │   │   │       │   └── sandbox-setup.test.ts
│   │   │   │       ├── builder-sandbox-factory.ts
│   │   │   │       ├── create-workspace.ts
│   │   │   │       ├── daytona-filesystem.ts
│   │   │   │       ├── n8n-sandbox-client.ts
│   │   │   │       ├── n8n-sandbox-filesystem.ts
│   │   │   │       ├── n8n-sandbox-image-manager.ts
│   │   │   │       ├── n8n-sandbox-sandbox.ts
│   │   │   │       ├── sandbox-fs.ts
│   │   │   │       ├── sandbox-setup.ts
│   │   │   │       └── snapshot-manager.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── json-schema-to-zod/
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── postcjs.cjs
│   │   │   ├── postesm.cjs
│   │   │   ├── src/
│   │   │   │   ├── index.ts
│   │   │   │   ├── json-schema-to-zod.ts
│   │   │   │   ├── parsers/
│   │   │   │   │   ├── parse-all-of.ts
│   │   │   │   │   ├── parse-any-of.ts
│   │   │   │   │   ├── parse-array.ts
│   │   │   │   │   ├── parse-boolean.ts
│   │   │   │   │   ├── parse-const.ts
│   │   │   │   │   ├── parse-default.ts
│   │   │   │   │   ├── parse-enum.ts
│   │   │   │   │   ├── parse-if-then-else.ts
│   │   │   │   │   ├── parse-multiple-type.ts
│   │   │   │   │   ├── parse-not.ts
│   │   │   │   │   ├── parse-null.ts
│   │   │   │   │   ├── parse-nullable.ts
│   │   │   │   │   ├── parse-number.ts
│   │   │   │   │   ├── parse-object.ts
│   │   │   │   │   ├── parse-one-of.ts
│   │   │   │   │   ├── parse-schema.ts
│   │   │   │   │   └── parse-string.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── utils/
│   │   │   │       ├── extend-schema.ts
│   │   │   │       ├── half.ts
│   │   │   │       ├── its.ts
│   │   │   │       └── omit.ts
│   │   │   ├── test/
│   │   │   │   ├── all.json
│   │   │   │   ├── extend-expect.ts
│   │   │   │   ├── jest.d.ts
│   │   │   │   ├── json-schema-to-zod.test.ts
│   │   │   │   ├── parsers/
│   │   │   │   │   ├── parse-all-of.test.ts
│   │   │   │   │   ├── parse-any-of.test.ts
│   │   │   │   │   ├── parse-array.test.ts
│   │   │   │   │   ├── parse-const.test.ts
│   │   │   │   │   ├── parse-enum.test.ts
│   │   │   │   │   ├── parse-not.test.ts
│   │   │   │   │   ├── parse-nullable.test.ts
│   │   │   │   │   ├── parse-number.test.ts
│   │   │   │   │   ├── parse-object.test.ts
│   │   │   │   │   ├── parse-one-of.test.ts
│   │   │   │   │   ├── parse-schema.test.ts
│   │   │   │   │   └── parse-string.test.ts
│   │   │   │   └── utils/
│   │   │   │       ├── half.test.ts
│   │   │   │       └── omit.test.ts
│   │   │   ├── tsconfig.cjs.json
│   │   │   ├── tsconfig.esm.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.types.json
│   │   ├── local-gateway/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── assets/
│   │   │   │   ├── README.md
│   │   │   │   └── icon.icns
│   │   │   ├── electron-builder.config.js
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── main/
│   │   │   │   │   ├── daemon-controller.test.ts
│   │   │   │   │   ├── daemon-controller.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── ipc-handlers.ts
│   │   │   │   │   ├── preload.ts
│   │   │   │   │   ├── settings-store.ts
│   │   │   │   │   ├── settings-window.ts
│   │   │   │   │   └── tray.ts
│   │   │   │   ├── renderer/
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── settings.ts
│   │   │   │   │   └── styles.css
│   │   │   │   └── shared/
│   │   │   │       └── types.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── tsconfig.renderer.json
│   │   ├── mcp-browser/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── spec/
│   │   │   │   ├── browser-mcp.md
│   │   │   │   └── technical-spec.md
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── errors.test.ts
│   │   │   │   │   ├── server-config.test.ts
│   │   │   │   │   └── utils.test.ts
│   │   │   │   ├── adapters/
│   │   │   │   │   └── playwright.ts
│   │   │   │   ├── browser-discovery.ts
│   │   │   │   ├── cdp-relay-protocol.ts
│   │   │   │   ├── cdp-relay.ts
│   │   │   │   ├── connection.ts
│   │   │   │   ├── errors.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── server-config.ts
│   │   │   │   ├── server.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── inspection.test.ts
│   │   │   │   │   ├── inspection.ts
│   │   │   │   │   ├── interaction.test.ts
│   │   │   │   │   ├── interaction.ts
│   │   │   │   │   ├── navigation.test.ts
│   │   │   │   │   ├── navigation.ts
│   │   │   │   │   ├── response-envelope.ts
│   │   │   │   │   ├── schemas.ts
│   │   │   │   │   ├── session.test.ts
│   │   │   │   │   ├── session.ts
│   │   │   │   │   ├── state.test.ts
│   │   │   │   │   ├── state.ts
│   │   │   │   │   ├── tabs.test.ts
│   │   │   │   │   ├── tabs.ts
│   │   │   │   │   ├── test-helpers.ts
│   │   │   │   │   ├── wait.test.ts
│   │   │   │   │   └── wait.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── utils.ts
│   │   │   │   └── vendor.d.ts
│   │   │   ├── tsconfig.build.json
│   │   │   └── tsconfig.json
│   │   ├── mcp-browser-extension/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── manifest.json
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── relayConnection.test.ts
│   │   │   │   ├── background.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── relayConnection.ts
│   │   │   │   └── ui/
│   │   │   │       ├── App.vue
│   │   │   │       ├── connect.html
│   │   │   │       ├── main.ts
│   │   │   │       ├── shimsVue.d.ts
│   │   │   │       └── tokens.scss
│   │   │   ├── tsconfig.json
│   │   │   ├── vite.sw.config.mts
│   │   │   └── vite.ui.config.mts
│   │   ├── node-cli/
│   │   │   ├── README.md
│   │   │   ├── bin/
│   │   │   │   └── n8n-node.mjs
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   └── copy-templates.mjs
│   │   │   ├── src/
│   │   │   │   ├── commands/
│   │   │   │   │   ├── build.test.ts
│   │   │   │   │   ├── build.ts
│   │   │   │   │   ├── cloud-support.test.ts
│   │   │   │   │   ├── cloud-support.ts
│   │   │   │   │   ├── dev/
│   │   │   │   │   │   ├── index.test.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── utils.test.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── lint.test.ts
│   │   │   │   │   ├── lint.ts
│   │   │   │   │   ├── new/
│   │   │   │   │   │   ├── index.test.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── prompts.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── prerelease.test.ts
│   │   │   │   │   ├── prerelease.ts
│   │   │   │   │   ├── release.test.ts
│   │   │   │   │   └── release.ts
│   │   │   │   ├── configs/
│   │   │   │   │   └── eslint.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── modules.d.ts
│   │   │   │   ├── template/
│   │   │   │   │   ├── core.test.ts
│   │   │   │   │   ├── core.ts
│   │   │   │   │   └── templates/
│   │   │   │   │       ├── declarative/
│   │   │   │   │       │   ├── custom/
│   │   │   │   │       │   │   ├── ast.ts
│   │   │   │   │       │   │   ├── prompts.ts
│   │   │   │   │       │   │   ├── template/
│   │   │   │   │       │   │   │   ├── README.md
│   │   │   │   │       │   │   │   ├── nodes/
│   │   │   │   │       │   │   │   │   └── Example/
│   │   │   │   │       │   │   │   │       ├── Example.node.json
│   │   │   │   │       │   │   │   │       ├── Example.node.ts
│   │   │   │   │       │   │   │   │       └── resources/
│   │   │   │   │       │   │   │   │           ├── company/
│   │   │   │   │       │   │   │   │           │   ├── getAll.ts
│   │   │   │   │       │   │   │   │           │   └── index.ts
│   │   │   │   │       │   │   │   │           └── user/
│   │   │   │   │       │   │   │   │               ├── create.ts
│   │   │   │   │       │   │   │   │               ├── get.ts
│   │   │   │   │       │   │   │   │               └── index.ts
│   │   │   │   │       │   │   │   ├── package.json
│   │   │   │   │       │   │   │   └── tsconfig.json
│   │   │   │   │       │   │   ├── template.ts
│   │   │   │   │       │   │   └── types.ts
│   │   │   │   │       │   └── github-issues/
│   │   │   │   │       │       ├── template/
│   │   │   │   │       │       │   ├── README.md
│   │   │   │   │       │       │   ├── credentials/
│   │   │   │   │       │       │   │   ├── GithubIssuesApi.credentials.ts
│   │   │   │   │       │       │   │   └── GithubIssuesOAuth2Api.credentials.ts
│   │   │   │   │       │       │   ├── nodes/
│   │   │   │   │       │       │   │   └── GithubIssues/
│   │   │   │   │       │       │   │       ├── GithubIssues.node.json
│   │   │   │   │       │       │   │       ├── GithubIssues.node.ts
│   │   │   │   │       │       │   │       ├── listSearch/
│   │   │   │   │       │       │   │       │   ├── getIssues.ts
│   │   │   │   │       │       │   │       │   ├── getRepositories.ts
│   │   │   │   │       │       │   │       │   └── getUsers.ts
│   │   │   │   │       │       │   │       ├── resources/
│   │   │   │   │       │       │   │       │   ├── issue/
│   │   │   │   │       │       │   │       │   │   ├── create.ts
│   │   │   │   │       │       │   │       │   │   ├── get.ts
│   │   │   │   │       │       │   │       │   │   ├── getAll.ts
│   │   │   │   │       │       │   │       │   │   └── index.ts
│   │   │   │   │       │       │   │       │   └── issueComment/
│   │   │   │   │       │       │   │       │       ├── getAll.ts
│   │   │   │   │       │       │   │       │       └── index.ts
│   │   │   │   │       │       │   │       └── shared/
│   │   │   │   │       │       │   │           ├── descriptions.ts
│   │   │   │   │       │       │   │           ├── transport.ts
│   │   │   │   │       │       │   │           └── utils.ts
│   │   │   │   │       │       │   ├── package.json
│   │   │   │   │       │       │   └── tsconfig.json
│   │   │   │   │       │       └── template.ts
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── programmatic/
│   │   │   │   │       │   ├── ai/
│   │   │   │   │       │   │   ├── memory-custom/
│   │   │   │   │       │   │   │   ├── template/
│   │   │   │   │       │   │   │   │   ├── README.md
│   │   │   │   │       │   │   │   │   ├── nodes/
│   │   │   │   │       │   │   │   │   │   └── ExampleChatMemory/
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatMemory.node.json
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatMemory.node.ts
│   │   │   │   │       │   │   │   │   │       └── memory.ts
│   │   │   │   │       │   │   │   │   ├── package.json
│   │   │   │   │       │   │   │   │   └── tsconfig.json
│   │   │   │   │       │   │   │   └── template.ts
│   │   │   │   │       │   │   ├── model-ai-custom/
│   │   │   │   │       │   │   │   ├── template/
│   │   │   │   │       │   │   │   │   ├── README.md
│   │   │   │   │       │   │   │   │   ├── credentials/
│   │   │   │   │       │   │   │   │   │   └── ExampleApi.credentials.ts
│   │   │   │   │       │   │   │   │   ├── nodes/
│   │   │   │   │       │   │   │   │   │   └── ExampleChatModel/
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatModel.node.json
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatModel.node.ts
│   │   │   │   │       │   │   │   │   │       └── model.ts
│   │   │   │   │       │   │   │   │   ├── package.json
│   │   │   │   │       │   │   │   │   └── tsconfig.json
│   │   │   │   │       │   │   │   └── template.ts
│   │   │   │   │       │   │   ├── model-ai-custom-example/
│   │   │   │   │       │   │   │   ├── template/
│   │   │   │   │       │   │   │   │   ├── README.md
│   │   │   │   │       │   │   │   │   ├── credentials/
│   │   │   │   │       │   │   │   │   │   └── ExampleApi.credentials.ts
│   │   │   │   │       │   │   │   │   ├── nodes/
│   │   │   │   │       │   │   │   │   │   └── ExampleChatModel/
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatModel.node.json
│   │   │   │   │       │   │   │   │   │       ├── ExampleChatModel.node.ts
│   │   │   │   │       │   │   │   │   │       ├── common.ts
│   │   │   │   │       │   │   │   │   │       ├── model.ts
│   │   │   │   │       │   │   │   │   │       └── properties.ts
│   │   │   │   │       │   │   │   │   ├── package.json
│   │   │   │   │       │   │   │   │   └── tsconfig.json
│   │   │   │   │       │   │   │   └── template.ts
│   │   │   │   │       │   │   └── model-openai-compatible/
│   │   │   │   │       │   │       ├── template/
│   │   │   │   │       │   │       │   ├── README.md
│   │   │   │   │       │   │       │   ├── credentials/
│   │   │   │   │       │   │       │   │   └── ExampleApi.credentials.ts
│   │   │   │   │       │   │       │   ├── nodes/
│   │   │   │   │       │   │       │   │   └── ExampleChatModel/
│   │   │   │   │       │   │       │   │       ├── ExampleChatModel.node.json
│   │   │   │   │       │   │       │   │       └── ExampleChatModel.node.ts
│   │   │   │   │       │   │       │   ├── package.json
│   │   │   │   │       │   │       │   └── tsconfig.json
│   │   │   │   │       │   │       └── template.ts
│   │   │   │   │       │   └── example/
│   │   │   │   │       │       ├── template/
│   │   │   │   │       │       │   ├── README.md
│   │   │   │   │       │       │   ├── nodes/
│   │   │   │   │       │       │   │   └── Example/
│   │   │   │   │       │       │   │       ├── Example.node.json
│   │   │   │   │       │       │   │       └── Example.node.ts
│   │   │   │   │       │       │   ├── package.json
│   │   │   │   │       │       │   └── tsconfig.json
│   │   │   │   │       │       └── template.ts
│   │   │   │   │       └── shared/
│   │   │   │   │           ├── credentials/
│   │   │   │   │           │   ├── apiKey.credentials.ts
│   │   │   │   │           │   ├── basicAuth.credentials.ts
│   │   │   │   │           │   ├── bearer.credentials.ts
│   │   │   │   │           │   ├── custom.credentials.ts
│   │   │   │   │           │   ├── oauth2AuthorizationCode.credentials.ts
│   │   │   │   │           │   └── oauth2ClientCredentials.credentials.ts
│   │   │   │   │           └── default/
│   │   │   │   │               ├── .agents/
│   │   │   │   │               │   ├── credentials.md
│   │   │   │   │               │   ├── nodes-declarative.md
│   │   │   │   │               │   ├── nodes-programmatic.md
│   │   │   │   │               │   ├── nodes.md
│   │   │   │   │               │   ├── properties.md
│   │   │   │   │               │   ├── versioning.md
│   │   │   │   │               │   └── workflow.md
│   │   │   │   │               ├── .github/
│   │   │   │   │               │   └── workflows/
│   │   │   │   │               │       ├── ci.yml
│   │   │   │   │               │       └── publish.yml
│   │   │   │   │               ├── .gitignore
│   │   │   │   │               ├── .prettierrc.js
│   │   │   │   │               ├── .vscode/
│   │   │   │   │               │   └── launch.json
│   │   │   │   │               ├── AGENTS.md
│   │   │   │   │               ├── CHANGELOG.md
│   │   │   │   │               ├── CLAUDE.md
│   │   │   │   │               └── eslint.config.mjs
│   │   │   │   ├── test-utils/
│   │   │   │   │   ├── command-tester.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── matchers.ts
│   │   │   │   │   ├── mock-child-process.ts
│   │   │   │   │   ├── mock-prompts.ts
│   │   │   │   │   ├── package-setup.ts
│   │   │   │   │   ├── setup.ts
│   │   │   │   │   └── temp-fs.ts
│   │   │   │   └── utils/
│   │   │   │       ├── ast.test.ts
│   │   │   │       ├── ast.ts
│   │   │   │       ├── child-process.ts
│   │   │   │       ├── command-suggestions.ts
│   │   │   │       ├── filesystem.test.ts
│   │   │   │       ├── filesystem.ts
│   │   │   │       ├── git.test.ts
│   │   │   │       ├── git.ts
│   │   │   │       ├── json.ts
│   │   │   │       ├── package-manager.test.ts
│   │   │   │       ├── package-manager.ts
│   │   │   │       ├── package.ts
│   │   │   │       ├── prompts.test.ts
│   │   │   │       ├── prompts.ts
│   │   │   │       └── validation.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vite.config.ts
│   │   ├── nodes-langchain/
│   │   │   ├── .editorconfig
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── .vscode/
│   │   │   │   └── extensions.json
│   │   │   ├── README.md
│   │   │   ├── credentials/
│   │   │   │   ├── AnthropicApi.credentials.ts
│   │   │   │   ├── AzureAiSearchApi.credentials.ts
│   │   │   │   ├── AzureEntraCognitiveServicesOAuth2Api.credentials.ts
│   │   │   │   ├── AzureOpenAiApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStorePGVectorApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStorePineconeApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStoreQdrantApi.credentials.ts
│   │   │   │   ├── ChromaCloudApi.credentials.ts
│   │   │   │   ├── ChromaSelfHostedApi.credentials.ts
│   │   │   │   ├── CohereApi.credentials.ts
│   │   │   │   ├── DeepSeekApi.credentials.ts
│   │   │   │   ├── GooglePalmApi.credentials.ts
│   │   │   │   ├── GroqApi.credentials.ts
│   │   │   │   ├── HuggingFaceApi.credentials.ts
│   │   │   │   ├── LemonadeApi.credentials.ts
│   │   │   │   ├── McpOAuth2Api.credentials.ts
│   │   │   │   ├── MicrosoftAgent365Api.credentials.ts
│   │   │   │   ├── MilvusApi.credentials.ts
│   │   │   │   ├── MistralCloudApi.credentials.ts
│   │   │   │   ├── MotorheadApi.credentials.ts
│   │   │   │   ├── OllamaApi.credentials.ts
│   │   │   │   ├── OpenRouterApi.credentials.ts
│   │   │   │   ├── PineconeApi.credentials.ts
│   │   │   │   ├── QdrantApi.credentials.ts
│   │   │   │   ├── SearXngApi.credentials.ts
│   │   │   │   ├── SerpApi.credentials.ts
│   │   │   │   ├── VercelAiGatewayApi.credentials.ts
│   │   │   │   ├── WeaviateApi.credentials.ts
│   │   │   │   ├── WolframAlphaApi.credentials.ts
│   │   │   │   ├── XAiApi.credentials.ts
│   │   │   │   ├── XataApi.credentials.ts
│   │   │   │   ├── ZepApi.credentials.ts
│   │   │   │   └── test/
│   │   │   │       ├── AnthropicApi.credentials.test.ts
│   │   │   │       └── ChromaCloudApi.credentials.test.ts
│   │   │   ├── eslint.config.mjs
│   │   │   ├── index.js
│   │   │   ├── jest.config.js
│   │   │   ├── nodes/
│   │   │   │   ├── Guardrails/
│   │   │   │   │   ├── CREDIT.MD
│   │   │   │   │   ├── Guardrails.node.ts
│   │   │   │   │   ├── actions/
│   │   │   │   │   │   ├── checks/
│   │   │   │   │   │   │   ├── jailbreak.ts
│   │   │   │   │   │   │   ├── keywords.ts
│   │   │   │   │   │   │   ├── nsfw.ts
│   │   │   │   │   │   │   ├── pii.ts
│   │   │   │   │   │   │   ├── secretKeys.ts
│   │   │   │   │   │   │   ├── topicalAlignment.ts
│   │   │   │   │   │   │   └── urls.ts
│   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   ├── process.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── description.ts
│   │   │   │   │   ├── helpers/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── model.test.ts
│   │   │   │   │   │   ├── base.ts
│   │   │   │   │   │   ├── common.ts
│   │   │   │   │   │   ├── configureNodeInputs.ts
│   │   │   │   │   │   ├── mappers.ts
│   │   │   │   │   │   ├── model.ts
│   │   │   │   │   │   └── preflight.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── Guardrails.node.test.ts
│   │   │   │   │   │   ├── checks/
│   │   │   │   │   │   │   ├── keywords.test.ts
│   │   │   │   │   │   │   ├── pii.test.ts
│   │   │   │   │   │   │   └── secretKeys.test.ts
│   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   ├── base.test.ts
│   │   │   │   │   │   │   ├── common.test.ts
│   │   │   │   │   │   │   ├── configureNodeInputs.test.ts
│   │   │   │   │   │   │   ├── mappers.test.ts
│   │   │   │   │   │   │   ├── model.test.ts
│   │   │   │   │   │   │   └── preflight.test.ts
│   │   │   │   │   │   └── process.test.ts
│   │   │   │   │   ├── v1/
│   │   │   │   │   │   └── GuardrailsV1.node.ts
│   │   │   │   │   └── v2/
│   │   │   │   │       └── GuardrailsV2.node.ts
│   │   │   │   ├── ModelSelector/
│   │   │   │   │   ├── ModelSelector.node.ts
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   └── test/
│   │   │   │   │       ├── ModelSelector.node.test.ts
│   │   │   │   │       └── helpers.test.ts
│   │   │   │   ├── ToolExecutor/
│   │   │   │   │   ├── ToolExecutor.node.json
│   │   │   │   │   ├── ToolExecutor.node.ts
│   │   │   │   │   ├── test/
│   │   │   │   │   │   ├── ToolExecutor.node.test.ts
│   │   │   │   │   │   └── convertToSchema.test.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       ├── convertToSchema.ts
│   │   │   │   │       └── executeTool.ts
│   │   │   │   ├── agents/
│   │   │   │   │   ├── Agent/
│   │   │   │   │   │   ├── Agent.node.ts
│   │   │   │   │   │   ├── AgentTool.node.ts
│   │   │   │   │   │   ├── V1/
│   │   │   │   │   │   │   └── AgentV1.node.ts
│   │   │   │   │   │   ├── V2/
│   │   │   │   │   │   │   ├── AgentToolV2.node.ts
│   │   │   │   │   │   │   ├── AgentV2.node.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   ├── V3/
│   │   │   │   │   │   │   ├── AgentToolV3.node.ts
│   │   │   │   │   │   │   └── AgentV3.node.ts
│   │   │   │   │   │   ├── agents/
│   │   │   │   │   │   │   ├── ConversationalAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   ├── OpenAiFunctionsAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   ├── PlanAndExecuteAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   ├── ReActAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   ├── SqlAgent/
│   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   ├── execute.test.ts
│   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   └── other/
│   │   │   │   │   │   │   │       ├── handlers/
│   │   │   │   │   │   │   │       │   ├── mysql.ts
│   │   │   │   │   │   │   │       │   ├── postgres.test.ts
│   │   │   │   │   │   │   │       │   ├── postgres.ts
│   │   │   │   │   │   │   │       │   └── sqlite.ts
│   │   │   │   │   │   │   │       └── prompts.ts
│   │   │   │   │   │   │   ├── ToolsAgent/
│   │   │   │   │   │   │   │   ├── V1/
│   │   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   │   └── execute.ts
│   │   │   │   │   │   │   │   ├── V2/
│   │   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   │   └── execute.ts
│   │   │   │   │   │   │   │   ├── V3/
│   │   │   │   │   │   │   │   │   ├── description.ts
│   │   │   │   │   │   │   │   │   ├── execute.ts
│   │   │   │   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   │   │   │   ├── buildExecutionContext.ts
│   │   │   │   │   │   │   │   │   │   ├── checkMaxIterations.ts
│   │   │   │   │   │   │   │   │   │   ├── createAgentSequence.ts
│   │   │   │   │   │   │   │   │   │   ├── executeBatch.ts
│   │   │   │   │   │   │   │   │   │   ├── finalizeResult.ts
│   │   │   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   │   │   ├── prepareItemContext.ts
│   │   │   │   │   │   │   │   │   │   ├── runAgent.ts
│   │   │   │   │   │   │   │   │   │   └── tests/
│   │   │   │   │   │   │   │   │   │       ├── buildExecutionContext.test.ts
│   │   │   │   │   │   │   │   │   │       ├── checkMaxIterations.test.ts
│   │   │   │   │   │   │   │   │   │       ├── createAgentSequence.test.ts
│   │   │   │   │   │   │   │   │   │       ├── finalizeResult.test.ts
│   │   │   │   │   │   │   │   │   │       ├── prepareItemContext.test.ts
│   │   │   │   │   │   │   │   │   │       └── runAgent.test.ts
│   │   │   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   │   │   ├── common.ts
│   │   │   │   │   │   │   │   ├── options.ts
│   │   │   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   ├── ToolsAgent/
│   │   │   │   │   │   │   │   ├── ToolsAgentV1.test.ts
│   │   │   │   │   │   │   │   ├── ToolsAgentV2.test.ts
│   │   │   │   │   │   │   │   ├── ToolsAgentV3.test.ts
│   │   │   │   │   │   │   │   └── commons.test.ts
│   │   │   │   │   │   │   ├── integration/
│   │   │   │   │   │   │   │   ├── agent-tool-v3.workflow.test.ts
│   │   │   │   │   │   │   │   ├── agent-v3.workflow.test.ts
│   │   │   │   │   │   │   │   └── workflows/
│   │   │   │   │   │   │   │       ├── agent-tool-v3-basic.json
│   │   │   │   │   │   │   │       ├── agent-v3-auto-prompt.json
│   │   │   │   │   │   │   │       ├── agent-v3-basic.json
│   │   │   │   │   │   │   │       ├── agent-v3-binary-images.json
│   │   │   │   │   │   │   │       ├── agent-v3-continue-on-fail.json
│   │   │   │   │   │   │   │       ├── agent-v3-fallback-model.json
│   │   │   │   │   │   │   │       ├── agent-v3-intermediate-steps.json
│   │   │   │   │   │   │   │       ├── agent-v3-memory.json
│   │   │   │   │   │   │   │       ├── agent-v3-output-parser.json
│   │   │   │   │   │   │   │       ├── agent-v3-system-message.json
│   │   │   │   │   │   │   │       └── agent-v3-with-tool.json
│   │   │   │   │   │   │   └── utils.test.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   └── OpenAiAssistant/
│   │   │   │   │       ├── OpenAiAssistant.node.ts
│   │   │   │   │       └── utils.ts
│   │   │   │   ├── chains/
│   │   │   │   │   ├── ChainLLM/
│   │   │   │   │   │   ├── ChainLlm.node.ts
│   │   │   │   │   │   ├── methods/
│   │   │   │   │   │   │   ├── chainExecutor.ts
│   │   │   │   │   │   │   ├── config.ts
│   │   │   │   │   │   │   ├── imageUtils.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   ├── processItem.ts
│   │   │   │   │   │   │   ├── promptUtils.ts
│   │   │   │   │   │   │   ├── responseFormatter.ts
│   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       ├── ChainLlm.node.test.ts
│   │   │   │   │   │       ├── chainExecutor.test.ts
│   │   │   │   │   │       ├── config.test.ts
│   │   │   │   │   │       ├── imageUtils.test.ts
│   │   │   │   │   │       ├── promptUtils.test.ts
│   │   │   │   │   │       └── responseFormatter.test.ts
│   │   │   │   │   ├── ChainRetrievalQA/
│   │   │   │   │   │   ├── ChainRetrievalQa.node.ts
│   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   ├── processItem.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── ChainRetrievalQa.node.test.ts
│   │   │   │   │   ├── ChainSummarization/
│   │   │   │   │   │   ├── ChainSummarization.node.ts
│   │   │   │   │   │   ├── V1/
│   │   │   │   │   │   │   └── ChainSummarizationV1.node.ts
│   │   │   │   │   │   ├── V2/
│   │   │   │   │   │   │   ├── ChainSummarizationV2.node.ts
│   │   │   │   │   │   │   └── processItem.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   └── prompt.ts
│   │   │   │   │   ├── InformationExtractor/
│   │   │   │   │   │   ├── InformationExtractor.node.ts
│   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   ├── helpers.ts
│   │   │   │   │   │   ├── processItem.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   ├── InformationExtraction.node.test.ts
│   │   │   │   │   │   │   └── processItem.test.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── SentimentAnalysis/
│   │   │   │   │   │   ├── SentimentAnalysis.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── SentimentAnalysis.node.test.ts
│   │   │   │   │   └── TextClassifier/
│   │   │   │   │       ├── TextClassifier.node.ts
│   │   │   │   │       ├── constants.ts
│   │   │   │   │       ├── processItem.ts
│   │   │   │   │       └── test/
│   │   │   │   │           ├── TextClassifier.node.test.ts
│   │   │   │   │           └── processItem.test.ts
│   │   │   │   ├── code/
│   │   │   │   │   ├── Code.node.test.ts
│   │   │   │   │   └── Code.node.ts
│   │   │   │   ├── document_loaders/
│   │   │   │   │   ├── DocumentBinaryInputLoader/
│   │   │   │   │   │   └── DocumentBinaryInputLoader.node.ts
│   │   │   │   │   ├── DocumentDefaultDataLoader/
│   │   │   │   │   │   ├── DocumentDefaultDataLoader.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── DocumentDefaultDataLoader.node.test.ts
│   │   │   │   │   ├── DocumentGithubLoader/
│   │   │   │   │   │   ├── DocumentGithubLoader.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── DocumentGithubLoader.node.test.ts
│   │   │   │   │   └── DocumentJSONInputLoader/
│   │   │   │   │       └── DocumentJsonInputLoader.node.ts
│   │   │   │   ├── embeddings/
│   │   │   │   │   ├── EmbeddingsAwsBedrock/
│   │   │   │   │   │   └── EmbeddingsAwsBedrock.node.ts
│   │   │   │   │   ├── EmbeddingsAzureOpenAi/
│   │   │   │   │   │   └── EmbeddingsAzureOpenAi.node.ts
│   │   │   │   │   ├── EmbeddingsCohere/
│   │   │   │   │   │   └── EmbeddingsCohere.node.ts
│   │   │   │   │   ├── EmbeddingsGoogleGemini/
│   │   │   │   │   │   └── EmbeddingsGoogleGemini.node.ts
│   │   │   │   │   ├── EmbeddingsGoogleVertex/
│   │   │   │   │   │   └── EmbeddingsGoogleVertex.node.ts
│   │   │   │   │   ├── EmbeddingsHuggingFaceInference/
│   │   │   │   │   │   └── EmbeddingsHuggingFaceInference.node.ts
│   │   │   │   │   ├── EmbeddingsLemonade/
│   │   │   │   │   │   └── EmbeddingsLemonade.node.ts
│   │   │   │   │   ├── EmbeddingsMistralCloud/
│   │   │   │   │   │   └── EmbeddingsMistralCloud.node.ts
│   │   │   │   │   ├── EmbeddingsOllama/
│   │   │   │   │   │   └── EmbeddingsOllama.node.ts
│   │   │   │   │   ├── EmbeddingsOpenAI/
│   │   │   │   │   │   └── EmbeddingsOpenAi.node.ts
│   │   │   │   │   └── test/
│   │   │   │   │       ├── EmbeddingsAzureOpenAi.test.ts
│   │   │   │   │       └── EmbeddingsOpenAi.test.ts
│   │   │   │   ├── llms/
│   │   │   │   │   ├── LMChatAnthropic/
│   │   │   │   │   │   ├── LmChatAnthropic.node.ts
│   │   │   │   │   │   ├── methods/
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   └── searchModels.test.ts
│   │   │   │   │   │   │   └── searchModels.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatAnthropic.test.ts
│   │   │   │   │   ├── LMChatLemonade/
│   │   │   │   │   │   └── LmChatLemonade.node.ts
│   │   │   │   │   ├── LMChatOllama/
│   │   │   │   │   │   └── LmChatOllama.node.ts
│   │   │   │   │   ├── LMChatOpenAi/
│   │   │   │   │   │   ├── LmChatOpenAi.node.ts
│   │   │   │   │   │   ├── common.ts
│   │   │   │   │   │   ├── methods/
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   └── loadModels.test.ts
│   │   │   │   │   │   │   └── loadModels.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   └── common.test.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── LMCohere/
│   │   │   │   │   │   └── LmCohere.node.ts
│   │   │   │   │   ├── LMLemonade/
│   │   │   │   │   │   ├── LmLemonade.node.ts
│   │   │   │   │   │   └── description.ts
│   │   │   │   │   ├── LMOllama/
│   │   │   │   │   │   ├── LmOllama.node.ts
│   │   │   │   │   │   └── description.ts
│   │   │   │   │   ├── LMOpenAi/
│   │   │   │   │   │   └── LmOpenAi.node.ts
│   │   │   │   │   ├── LMOpenHuggingFaceInference/
│   │   │   │   │   │   └── LmOpenHuggingFaceInference.node.ts
│   │   │   │   │   ├── LmChatAwsBedrock/
│   │   │   │   │   │   ├── LmChatAwsBedrock.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatAwsBedrock.test.ts
│   │   │   │   │   ├── LmChatAzureOpenAi/
│   │   │   │   │   │   ├── LmChatAzureOpenAi.node.ts
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── N8nOAuth2TokenCredential.test.ts
│   │   │   │   │   │   │   ├── api-key.handler.test.ts
│   │   │   │   │   │   │   └── oauth2.handler.test.ts
│   │   │   │   │   │   ├── credentials/
│   │   │   │   │   │   │   ├── N8nOAuth2TokenCredential.ts
│   │   │   │   │   │   │   ├── api-key.ts
│   │   │   │   │   │   │   └── oauth2.ts
│   │   │   │   │   │   ├── properties.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── LmChatCohere/
│   │   │   │   │   │   └── LmChatCohere.node.ts
│   │   │   │   │   ├── LmChatDeepSeek/
│   │   │   │   │   │   └── LmChatDeepSeek.node.ts
│   │   │   │   │   ├── LmChatGoogleGemini/
│   │   │   │   │   │   └── LmChatGoogleGemini.node.ts
│   │   │   │   │   ├── LmChatGoogleVertex/
│   │   │   │   │   │   ├── LmChatGoogleVertex.node.ts
│   │   │   │   │   │   ├── error-handling.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatGoogleVertex.test.ts
│   │   │   │   │   ├── LmChatGroq/
│   │   │   │   │   │   └── LmChatGroq.node.ts
│   │   │   │   │   ├── LmChatMistralCloud/
│   │   │   │   │   │   └── LmChatMistralCloud.node.ts
│   │   │   │   │   ├── LmChatOpenRouter/
│   │   │   │   │   │   ├── LmChatOpenRouter.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatOpenRouter.test.ts
│   │   │   │   │   ├── LmChatVercelAiGateway/
│   │   │   │   │   │   └── LmChatVercelAiGateway.node.ts
│   │   │   │   │   ├── LmChatXAiGrok/
│   │   │   │   │   │   └── LmChatXAiGrok.node.ts
│   │   │   │   │   ├── N8nNonEstimatingTracing.ts
│   │   │   │   │   ├── gemini-common/
│   │   │   │   │   │   ├── additional-options.ts
│   │   │   │   │   │   └── safety-options.ts
│   │   │   │   │   └── test/
│   │   │   │   │       ├── LmChatAnthropic.test.ts
│   │   │   │   │       ├── LmChatOpenAi.test.ts
│   │   │   │   │       └── N8nLlmTracing.test.ts
│   │   │   │   ├── mcp/
│   │   │   │   │   ├── McpClient/
│   │   │   │   │   │   ├── McpClient.node.ts
│   │   │   │   │   │   ├── __test__/
│   │   │   │   │   │   │   ├── McpClient.node.test.ts
│   │   │   │   │   │   │   └── utils.test.ts
│   │   │   │   │   │   ├── listSearch.ts
│   │   │   │   │   │   ├── resourceMapping.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── McpClientTool/
│   │   │   │   │   │   ├── McpClientTool.node.ts
│   │   │   │   │   │   ├── __test__/
│   │   │   │   │   │   │   └── McpClientTool.node.test.ts
│   │   │   │   │   │   ├── loadOptions.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── McpTrigger/
│   │   │   │   │   │   ├── McpServer.ts
│   │   │   │   │   │   ├── McpTrigger.node.ts
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── McpServer.test.ts
│   │   │   │   │   │   │   ├── McpTrigger.node.test.ts
│   │   │   │   │   │   │   ├── helpers/
│   │   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   │   ├── mock-express.ts
│   │   │   │   │   │   │   │   ├── mock-langchain.ts
│   │   │   │   │   │   │   │   ├── mock-logger.ts
│   │   │   │   │   │   │   │   └── mock-mcp-sdk.ts
│   │   │   │   │   │   │   └── setup.ts
│   │   │   │   │   │   ├── execution/
│   │   │   │   │   │   │   ├── DirectExecutionStrategy.ts
│   │   │   │   │   │   │   ├── ExecutionCoordinator.ts
│   │   │   │   │   │   │   ├── ExecutionStrategy.ts
│   │   │   │   │   │   │   ├── PendingCallsManager.ts
│   │   │   │   │   │   │   ├── QueuedExecutionStrategy.ts
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   ├── DirectExecutionStrategy.test.ts
│   │   │   │   │   │   │   │   ├── ExecutionCoordinator.test.ts
│   │   │   │   │   │   │   │   ├── PendingCallsManager.test.ts
│   │   │   │   │   │   │   │   └── QueuedExecutionStrategy.test.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── protocol/
│   │   │   │   │   │   │   ├── MessageFormatter.ts
│   │   │   │   │   │   │   ├── MessageParser.ts
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   ├── MessageFormatter.test.ts
│   │   │   │   │   │   │   │   └── MessageParser.test.ts
│   │   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   │   └── types.ts
│   │   │   │   │   │   ├── session/
│   │   │   │   │   │   │   ├── InMemorySessionStore.ts
│   │   │   │   │   │   │   ├── RedisSessionStore.ts
│   │   │   │   │   │   │   ├── SessionManager.ts
│   │   │   │   │   │   │   ├── SessionStore.ts
│   │   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   │   ├── InMemorySessionStore.test.ts
│   │   │   │   │   │   │   │   ├── RedisSessionStore.test.ts
│   │   │   │   │   │   │   │   └── SessionManager.test.ts
│   │   │   │   │   │   │   └── index.ts
│   │   │   │   │   │   └── transport/
│   │   │   │   │   │       ├── SSETransport.ts
│   │   │   │   │   │       ├── StreamableHttpTransport.ts
│   │   │   │   │   │       ├── Transport.ts
│   │   │   │   │   │       ├── TransportFactory.ts
│   │   │   │   │   │       ├── __tests__/
│   │   │   │   │   │       │   ├── SSETransport.test.ts
│   │   │   │   │   │       │   ├── StreamableHttpTransport.test.ts
│   │   │   │   │   │       │   └── TransportFactory.test.ts
│   │   │   │   │   │       └── index.ts
│   │   │   │   │   └── shared/
│   │   │   │   │       ├── __test__/
│   │   │   │   │       │   └── utils.test.ts
│   │   │   │   │       ├── descriptions.ts
│   │   │   │   │       ├── types.ts
│   │   │   │   │       └── utils.ts
│   │   │   │   ├── memory/
│   │   │   │   │   ├── MemoryBufferWindow/
│   │   │   │   │   │   └── MemoryBufferWindow.node.ts
│   │   │   │   │   ├── MemoryChatRetriever/
│   │   │   │   │   │   └── MemoryChatRetriever.node.ts
│   │   │   │   │   ├── MemoryManager/
│   │   │   │   │   │   ├── MemoryManager.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       ├── MemoryManager.execute.test.ts
│   │   │   │   │   │       └── MemoryManager.node.test.ts
│   │   │   │   │   ├── MemoryMongoDbChat/
│   │   │   │   │   │   └── MemoryMongoDbChat.node.ts
│   │   │   │   │   ├── MemoryMotorhead/
│   │   │   │   │   │   └── MemoryMotorhead.node.ts
│   │   │   │   │   ├── MemoryPostgresChat/
│   │   │   │   │   │   └── MemoryPostgresChat.node.ts
│   │   │   │   │   ├── MemoryRedisChat/
│   │   │   │   │   │   └── MemoryRedisChat.node.ts
│   │   │   │   │   ├── MemoryXata/
│   │   │   │   │   │   └── MemoryXata.node.ts
│   │   │   │   │   ├── MemoryZep/
│   │   │   │   │   │   └── MemoryZep.node.ts
│   │   │   │   │   └── descriptions.ts
│   │   │   │   ├── output_parser/
│   │   │   │   │   ├── OutputParserAutofixing/
│   │   │   │   │   │   ├── OutputParserAutofixing.node.ts
│   │   │   │   │   │   ├── prompt.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── OutputParserAutofixing.node.test.ts
│   │   │   │   │   ├── OutputParserItemList/
│   │   │   │   │   │   ├── OutputParserItemList.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── OutputParserItemList.node.test.ts
│   │   │   │   │   └── OutputParserStructured/
│   │   │   │   │       ├── OutputParserStructured.node.ts
│   │   │   │   │       ├── prompt.ts
│   │   │   │   │       └── test/
│   │   │   │   │           └── OutputParserStructured.node.test.ts
│   │   │   │   ├── rerankers/
│   │   │   │   │   └── RerankerCohere/
│   │   │   │   │       ├── RerankerCohere.node.ts
│   │   │   │   │       └── test/
│   │   │   │   │           └── RerankerCohere.node.test.ts
│   │   │   │   ├── retrievers/
│   │   │   │   │   ├── RetrieverContextualCompression/
│   │   │   │   │   │   └── RetrieverContextualCompression.node.ts
│   │   │   │   │   ├── RetrieverMultiQuery/
│   │   │   │   │   │   └── RetrieverMultiQuery.node.ts
│   │   │   │   │   ├── RetrieverVectorStore/
│   │   │   │   │   │   ├── RetrieverVectorStore.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── RetrieverVectorStore.node.test.ts
│   │   │   │   │   └── RetrieverWorkflow/
│   │   │   │   │       └── RetrieverWorkflow.node.ts
│   │   │   │   ├── text_splitters/
│   │   │   │   │   ├── TextSplitterCharacterTextSplitter/
│   │   │   │   │   │   └── TextSplitterCharacterTextSplitter.node.ts
│   │   │   │   │   ├── TextSplitterRecursiveCharacterTextSplitter/
│   │   │   │   │   │   └── TextSplitterRecursiveCharacterTextSplitter.node.ts
│   │   │   │   │   └── TextSplitterTokenSplitter/
│   │   │   │   │       ├── TextSplitterTokenSplitter.node.ts
│   │   │   │   │       ├── TokenTextSplitter.ts
│   │   │   │   │       └── tests/
│   │   │   │   │           └── TokenTextSplitter.test.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── ToolCalculator/
│   │   │   │   │   │   ├── ToolCalculator.node.test.ts
│   │   │   │   │   │   └── ToolCalculator.node.ts
│   │   │   │   │   ├── ToolCode/
│   │   │   │   │   │   ├── ToolCode.node.test.ts
│   │   │   │   │   │   └── ToolCode.node.ts
│   │   │   │   │   ├── ToolHttpRequest/
│   │   │   │   │   │   ├── ToolHttpRequest.node.ts
│   │   │   │   │   │   ├── descriptions.ts
│   │   │   │   │   │   ├── interfaces.ts
│   │   │   │   │   │   ├── test/
│   │   │   │   │   │   │   └── ToolHttpRequest.node.test.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── ToolSearXng/
│   │   │   │   │   │   ├── ToolSearXng.node.test.ts
│   │   │   │   │   │   └── ToolSearXng.node.ts
│   │   │   │   │   ├── ToolSerpApi/
│   │   │   │   │   │   ├── ToolSerpApi.node.test.ts
│   │   │   │   │   │   └── ToolSerpApi.node.ts
│   │   │   │   │   ├── ToolThink/
│   │   │   │   │   │   ├── ToolThink.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── ToolThink.node.test.ts
│   │   │   │   │   ├── ToolVectorStore/
│   │   │   │   │   │   ├── ToolVectorStore.node.test.ts
│   │   │   │   │   │   └── ToolVectorStore.node.ts
│   │   │   │   │   ├── ToolWikipedia/
│   │   │   │   │   │   ├── ToolWikipedia.node.test.ts
│   │   │   │   │   │   └── ToolWikipedia.node.ts
│   │   │   │   │   ├── ToolWolframAlpha/
│   │   │   │   │   │   ├── ToolWolframAlpha.node.test.ts
│   │   │   │   │   │   └── ToolWolframAlpha.node.ts
│   │   │   │   │   └── ToolWorkflow/
│   │   │   │   │       ├── ToolWorkflow.node.test.ts
│   │   │   │   │       ├── ToolWorkflow.node.ts
│   │   │   │   │       ├── v1/
│   │   │   │   │       │   ├── ToolWorkflowV1.node.ts
│   │   │   │   │       │   └── versionDescription.ts
│   │   │   │   │       └── v2/
│   │   │   │   │           ├── ToolWorkflowV2.node.ts
│   │   │   │   │           ├── ToolWorkflowV2.test.ts
│   │   │   │   │           ├── methods/
│   │   │   │   │           │   ├── index.ts
│   │   │   │   │           │   └── localResourceMapping.ts
│   │   │   │   │           ├── utils/
│   │   │   │   │           │   └── WorkflowToolService.ts
│   │   │   │   │           └── versionDescription.ts
│   │   │   │   ├── trigger/
│   │   │   │   │   ├── ChatTrigger/
│   │   │   │   │   │   ├── Chat.node.ts
│   │   │   │   │   │   ├── ChatTrigger.node.ts
│   │   │   │   │   │   ├── GenericFunctions.ts
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── __test__/
│   │   │   │   │   │   │   ├── Chat.node.test.ts
│   │   │   │   │   │   │   ├── ChatTrigger.node.test.ts
│   │   │   │   │   │   │   ├── GenericFunctions.test.ts
│   │   │   │   │   │   │   ├── templates.test.ts
│   │   │   │   │   │   │   └── util.test.ts
│   │   │   │   │   │   ├── constants.ts
│   │   │   │   │   │   ├── error.ts
│   │   │   │   │   │   ├── templates.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── util.ts
│   │   │   │   │   └── ManualChatTrigger/
│   │   │   │   │       └── ManualChatTrigger.node.ts
│   │   │   │   ├── vector_store/
│   │   │   │   │   ├── ChatHubVectorStorePGVector/
│   │   │   │   │   │   └── ChatHubVectorStorePGVector.node.ts
│   │   │   │   │   ├── ChatHubVectorStorePinecone/
│   │   │   │   │   │   └── ChatHubVectorStorePinecone.node.ts
│   │   │   │   │   ├── ChatHubVectorStoreQdrant/
│   │   │   │   │   │   ├── ChatHubVectorStoreQdrant.node.test.ts
│   │   │   │   │   │   └── ChatHubVectorStoreQdrant.node.ts
│   │   │   │   │   ├── VectorStoreAzureAISearch/
│   │   │   │   │   │   ├── VectorStoreAzureAISearch.node.test.ts
│   │   │   │   │   │   └── VectorStoreAzureAISearch.node.ts
│   │   │   │   │   ├── VectorStoreChromaDB/
│   │   │   │   │   │   ├── VectorStoreChromaDB.node.test.ts
│   │   │   │   │   │   └── VectorStoreChromaDB.node.ts
│   │   │   │   │   ├── VectorStoreInMemory/
│   │   │   │   │   │   └── VectorStoreInMemory.node.ts
│   │   │   │   │   ├── VectorStoreInMemoryInsert/
│   │   │   │   │   │   └── VectorStoreInMemoryInsert.node.ts
│   │   │   │   │   ├── VectorStoreInMemoryLoad/
│   │   │   │   │   │   └── VectorStoreInMemoryLoad.node.ts
│   │   │   │   │   ├── VectorStoreMilvus/
│   │   │   │   │   │   └── VectorStoreMilvus.node.ts
│   │   │   │   │   ├── VectorStoreMongoDBAtlas/
│   │   │   │   │   │   ├── VectorStoreMongoDBAtlas.node.test.ts
│   │   │   │   │   │   └── VectorStoreMongoDBAtlas.node.ts
│   │   │   │   │   ├── VectorStorePGVector/
│   │   │   │   │   │   └── VectorStorePGVector.node.ts
│   │   │   │   │   ├── VectorStorePinecone/
│   │   │   │   │   │   └── VectorStorePinecone.node.ts
│   │   │   │   │   ├── VectorStorePineconeInsert/
│   │   │   │   │   │   └── VectorStorePineconeInsert.node.ts
│   │   │   │   │   ├── VectorStorePineconeLoad/
│   │   │   │   │   │   └── VectorStorePineconeLoad.node.ts
│   │   │   │   │   ├── VectorStoreQdrant/
│   │   │   │   │   │   ├── Qdrant.utils.ts
│   │   │   │   │   │   ├── VectorStoreQdrant.node.test.ts
│   │   │   │   │   │   └── VectorStoreQdrant.node.ts
│   │   │   │   │   ├── VectorStoreRedis/
│   │   │   │   │   │   ├── VectorStoreRedis.node.test.ts
│   │   │   │   │   │   └── VectorStoreRedis.node.ts
│   │   │   │   │   ├── VectorStoreSupabase/
│   │   │   │   │   │   └── VectorStoreSupabase.node.ts
│   │   │   │   │   ├── VectorStoreSupabaseInsert/
│   │   │   │   │   │   └── VectorStoreSupabaseInsert.node.ts
│   │   │   │   │   ├── VectorStoreSupabaseLoad/
│   │   │   │   │   │   └── VectorStoreSupabaseLoad.node.ts
│   │   │   │   │   ├── VectorStoreWeaviate/
│   │   │   │   │   │   ├── VectorStoreWeaviate.node.ts
│   │   │   │   │   │   └── Weaviate.utils.ts
│   │   │   │   │   ├── VectorStoreZep/
│   │   │   │   │   │   ├── VectorStoreZep.node.test.ts
│   │   │   │   │   │   └── VectorStoreZep.node.ts
│   │   │   │   │   ├── VectorStoreZepInsert/
│   │   │   │   │   │   └── VectorStoreZepInsert.node.ts
│   │   │   │   │   ├── VectorStoreZepLoad/
│   │   │   │   │   │   └── VectorStoreZepLoad.node.ts
│   │   │   │   │   └── shared/
│   │   │   │   │       ├── chatHub.ts
│   │   │   │   │       ├── descriptions.ts
│   │   │   │   │       ├── methods/
│   │   │   │   │       │   └── listSearch.ts
│   │   │   │   │       ├── userScoped.test.ts
│   │   │   │   │       └── userScoped.ts
│   │   │   │   └── vendors/
│   │   │   │       ├── Anthropic/
│   │   │   │       │   ├── Anthropic.node.test.ts
│   │   │   │       │   ├── Anthropic.node.ts
│   │   │   │       │   ├── actions/
│   │   │   │       │   │   ├── descriptions.ts
│   │   │   │       │   │   ├── document/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── file/
│   │   │   │       │   │   │   ├── delete.operation.ts
│   │   │   │       │   │   │   ├── get.operation.ts
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   ├── list.operation.ts
│   │   │   │       │   │   │   └── upload.operation.ts
│   │   │   │       │   │   ├── image/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── node.type.ts
│   │   │   │       │   │   ├── prompt/
│   │   │   │       │   │   │   ├── generate.operation.ts
│   │   │   │       │   │   │   ├── improve.operation.ts
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── templatize.operation.ts
│   │   │   │       │   │   ├── router.test.ts
│   │   │   │       │   │   ├── router.ts
│   │   │   │       │   │   ├── text/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── message.operation.ts
│   │   │   │       │   │   └── versionDescription.ts
│   │   │   │       │   ├── helpers/
│   │   │   │       │   │   ├── baseAnalyze.ts
│   │   │   │       │   │   ├── interfaces.ts
│   │   │   │       │   │   ├── utils.test.ts
│   │   │   │       │   │   └── utils.ts
│   │   │   │       │   ├── methods/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   ├── listSearch.test.ts
│   │   │   │       │   │   └── listSearch.ts
│   │   │   │       │   └── transport/
│   │   │   │       │       ├── index.test.ts
│   │   │   │       │       └── index.ts
│   │   │   │       ├── GoogleGemini/
│   │   │   │       │   ├── GoogleGemini.node.test.ts
│   │   │   │       │   ├── GoogleGemini.node.ts
│   │   │   │       │   ├── actions/
│   │   │   │       │   │   ├── audio/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── transcribe.operation.ts
│   │   │   │       │   │   ├── descriptions.ts
│   │   │   │       │   │   ├── document/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── file/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── upload.operation.ts
│   │   │   │       │   │   ├── fileSearch/
│   │   │   │       │   │   │   ├── createStore.operation.ts
│   │   │   │       │   │   │   ├── deleteStore.operation.ts
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   ├── listStores.operation.ts
│   │   │   │       │   │   │   └── uploadToStore.operation.ts
│   │   │   │       │   │   ├── image/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   ├── edit.operation.test.ts
│   │   │   │       │   │   │   ├── edit.operation.ts
│   │   │   │       │   │   │   ├── generate.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── node.type.ts
│   │   │   │       │   │   ├── router.test.ts
│   │   │   │       │   │   ├── router.ts
│   │   │   │       │   │   ├── text/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── message.operation.ts
│   │   │   │       │   │   ├── versionDescription.ts
│   │   │   │       │   │   └── video/
│   │   │   │       │   │       ├── analyze.operation.ts
│   │   │   │       │   │       ├── download.operation.ts
│   │   │   │       │   │       ├── generate.operation.ts
│   │   │   │       │   │       └── index.ts
│   │   │   │       │   ├── helpers/
│   │   │   │       │   │   ├── baseAnalyze.ts
│   │   │   │       │   │   ├── interfaces.ts
│   │   │   │       │   │   ├── utils.test.ts
│   │   │   │       │   │   └── utils.ts
│   │   │   │       │   ├── methods/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   ├── listSearch.test.ts
│   │   │   │       │   │   └── listSearch.ts
│   │   │   │       │   └── transport/
│   │   │   │       │       ├── index.test.ts
│   │   │   │       │       └── index.ts
│   │   │   │       ├── Microsoft/
│   │   │   │       │   ├── MicrosoftAgent365Trigger.node.test.ts
│   │   │   │       │   ├── MicrosoftAgent365Trigger.node.ts
│   │   │   │       │   ├── __tests__/
│   │   │   │       │   │   ├── langchain-utils.test.ts
│   │   │   │       │   │   └── microsoft-utils.test.ts
│   │   │   │       │   ├── langchain-utils.ts
│   │   │   │       │   └── microsoft-utils.ts
│   │   │   │       ├── Ollama/
│   │   │   │       │   ├── Ollama.node.test.ts
│   │   │   │       │   ├── Ollama.node.ts
│   │   │   │       │   ├── actions/
│   │   │   │       │   │   ├── descriptions.ts
│   │   │   │       │   │   ├── image/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── node.type.ts
│   │   │   │       │   │   ├── router.test.ts
│   │   │   │       │   │   ├── router.ts
│   │   │   │       │   │   ├── text/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── message.operation.ts
│   │   │   │       │   │   └── versionDescription.ts
│   │   │   │       │   ├── helpers/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   └── interfaces.ts
│   │   │   │       │   ├── methods/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   ├── listSearch.test.ts
│   │   │   │       │   │   └── listSearch.ts
│   │   │   │       │   └── transport/
│   │   │   │       │       ├── index.test.ts
│   │   │   │       │       └── index.ts
│   │   │   │       └── OpenAi/
│   │   │   │           ├── OpenAi.node.ts
│   │   │   │           ├── helpers/
│   │   │   │           │   ├── __tests__/
│   │   │   │           │   │   └── modelFiltering.test.ts
│   │   │   │           │   ├── binary-data.ts
│   │   │   │           │   ├── constants.ts
│   │   │   │           │   ├── description.ts
│   │   │   │           │   ├── error-handling.test.ts
│   │   │   │           │   ├── error-handling.ts
│   │   │   │           │   ├── interfaces.ts
│   │   │   │           │   ├── modelFiltering.ts
│   │   │   │           │   ├── polling.ts
│   │   │   │           │   └── utils.ts
│   │   │   │           ├── methods/
│   │   │   │           │   ├── __tests__/
│   │   │   │           │   │   └── listSearch.test.ts
│   │   │   │           │   ├── index.ts
│   │   │   │           │   ├── listSearch.ts
│   │   │   │           │   └── loadOptions.ts
│   │   │   │           ├── test/
│   │   │   │           │   ├── utils.test.ts
│   │   │   │           │   ├── v1/
│   │   │   │           │   │   ├── OpenAI.workflow.test.ts
│   │   │   │           │   │   ├── OpenAi.node.test.ts
│   │   │   │           │   │   └── list-assistants.workflow.json
│   │   │   │           │   └── v2/
│   │   │   │           │       ├── actions/
│   │   │   │           │       │   ├── image/
│   │   │   │           │       │   │   ├── analyze.test.ts
│   │   │   │           │       │   │   └── edit.operation.test.ts
│   │   │   │           │       │   ├── text/
│   │   │   │           │       │   │   ├── classify.operation.test.ts
│   │   │   │           │       │   │   ├── response.operation.test.ts
│   │   │   │           │       │   │   └── responses.test.ts
│   │   │   │           │       │   └── video/
│   │   │   │           │       │       └── generate.operation.test.ts
│   │   │   │           │       └── conversation.test.ts
│   │   │   │           ├── transport/
│   │   │   │           │   ├── index.ts
│   │   │   │           │   └── test/
│   │   │   │           │       └── transport.test.ts
│   │   │   │           ├── v1/
│   │   │   │           │   ├── OpenAiV1.node.ts
│   │   │   │           │   └── actions/
│   │   │   │           │       ├── assistant/
│   │   │   │           │       │   ├── create.operation.ts
│   │   │   │           │       │   ├── deleteAssistant.operation.ts
│   │   │   │           │       │   ├── index.ts
│   │   │   │           │       │   ├── list.operation.ts
│   │   │   │           │       │   ├── message.operation.ts
│   │   │   │           │       │   └── update.operation.ts
│   │   │   │           │       ├── audio/
│   │   │   │           │       │   ├── generate.operation.ts
│   │   │   │           │       │   ├── index.ts
│   │   │   │           │       │   ├── transcribe.operation.ts
│   │   │   │           │       │   └── translate.operation.ts
│   │   │   │           │       ├── descriptions.ts
│   │   │   │           │       ├── file/
│   │   │   │           │       │   ├── deleteFile.operation.ts
│   │   │   │           │       │   ├── index.ts
│   │   │   │           │       │   ├── list.operation.ts
│   │   │   │           │       │   └── upload.operation.ts
│   │   │   │           │       ├── image/
│   │   │   │           │       │   ├── analyze.operation.ts
│   │   │   │           │       │   ├── generate.operation.ts
│   │   │   │           │       │   └── index.ts
│   │   │   │           │       ├── node.type.ts
│   │   │   │           │       ├── router.test.ts
│   │   │   │           │       ├── router.ts
│   │   │   │           │       └── text/
│   │   │   │           │           ├── classify.operation.ts
│   │   │   │           │           ├── index.ts
│   │   │   │           │           └── message.operation.ts
│   │   │   │           └── v2/
│   │   │   │               ├── OpenAiV2.node.ts
│   │   │   │               └── actions/
│   │   │   │                   ├── audio/
│   │   │   │                   │   ├── generate.operation.ts
│   │   │   │                   │   ├── index.ts
│   │   │   │                   │   ├── transcribe.operation.ts
│   │   │   │                   │   └── translate.operation.ts
│   │   │   │                   ├── conversation/
│   │   │   │                   │   ├── create.operation.ts
│   │   │   │                   │   ├── get.operation.ts
│   │   │   │                   │   ├── index.ts
│   │   │   │                   │   ├── remove.operation.ts
│   │   │   │                   │   └── update.operation.ts
│   │   │   │                   ├── descriptions.ts
│   │   │   │                   ├── file/
│   │   │   │                   │   ├── deleteFile.operation.ts
│   │   │   │                   │   ├── index.ts
│   │   │   │                   │   ├── list.operation.ts
│   │   │   │                   │   └── upload.operation.ts
│   │   │   │                   ├── image/
│   │   │   │                   │   ├── analyze.operation.ts
│   │   │   │                   │   ├── edit.operation.ts
│   │   │   │                   │   ├── generate.operation.ts
│   │   │   │                   │   └── index.ts
│   │   │   │                   ├── node.type.ts
│   │   │   │                   ├── router.test.ts
│   │   │   │                   ├── router.ts
│   │   │   │                   ├── text/
│   │   │   │                   │   ├── classify.operation.ts
│   │   │   │                   │   ├── helpers/
│   │   │   │                   │   │   └── responses.ts
│   │   │   │                   │   ├── index.ts
│   │   │   │                   │   └── response.operation.ts
│   │   │   │                   └── video/
│   │   │   │                       ├── generate.operation.ts
│   │   │   │                       └── index.ts
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   └── post-build.js
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   ├── types/
│   │   │   │   ├── generate-schema.d.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── zod.types.ts
│   │   │   └── utils/
│   │   │       ├── N8nTool.test.ts
│   │   │       ├── N8nTool.ts
│   │   │       ├── agent-execution/
│   │   │       │   ├── buildResponseMetadata.ts
│   │   │       │   ├── buildSteps.ts
│   │   │       │   ├── createEngineRequests.ts
│   │   │       │   ├── index.ts
│   │   │       │   ├── memoryManagement.ts
│   │   │       │   ├── processEventStream.ts
│   │   │       │   ├── processHitlResponses.ts
│   │   │       │   ├── serializeIntermediateSteps.ts
│   │   │       │   ├── test/
│   │   │       │   │   ├── buildResponseMetadata.test.ts
│   │   │       │   │   ├── buildSteps.test.ts
│   │   │       │   │   ├── createEngineRequests.test.ts
│   │   │       │   │   ├── memoryManagement.test.ts
│   │   │       │   │   ├── processHitlResponses.test.ts
│   │   │       │   │   └── serializeIntermediateSteps.test.ts
│   │   │       │   └── types.ts
│   │   │       ├── checkDomainRestrictions.ts
│   │   │       ├── descriptions.test.ts
│   │   │       ├── descriptions.ts
│   │   │       ├── embeddings/
│   │   │       │   └── embeddingInputValidation.test.ts
│   │   │       ├── helpers.ts
│   │   │       ├── output_parsers/
│   │   │       │   ├── N8nItemListOutputParser.ts
│   │   │       │   ├── N8nOutputFixingParser.ts
│   │   │       │   ├── N8nOutputParser.test.ts
│   │   │       │   ├── N8nOutputParser.ts
│   │   │       │   ├── N8nStructuredOutputParser.test.ts
│   │   │       │   ├── N8nStructuredOutputParser.ts
│   │   │       │   └── prompt.ts
│   │   │       ├── schemaParsing.ts
│   │   │       ├── tests/
│   │   │       │   ├── checkDomainRestrictions.test.ts
│   │   │       │   ├── helpers.test.ts
│   │   │       │   └── schemaParsing.test.ts
│   │   │       ├── tracing.test.ts
│   │   │       └── tracing.ts
│   │   ├── permissions/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── __snapshots__/
│   │   │   │   │   │   └── scope-information.test.ts.snap
│   │   │   │   │   ├── schemas.test.ts
│   │   │   │   │   ├── scope-information.test.ts
│   │   │   │   │   └── types.test.ts
│   │   │   │   ├── constants.ee.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── public-api-permissions.ee.ts
│   │   │   │   ├── roles/
│   │   │   │   │   ├── all-roles.ts
│   │   │   │   │   ├── role-maps.ee.ts
│   │   │   │   │   └── scopes/
│   │   │   │   │       ├── credential-sharing-scopes.ee.ts
│   │   │   │   │       ├── global-scopes.ee.ts
│   │   │   │   │       ├── project-scopes.ee.ts
│   │   │   │   │       ├── secrets-provider-connection-sharing-scopes.ee.ts
│   │   │   │   │       └── workflow-sharing-scopes.ee.ts
│   │   │   │   ├── schemas.ee.ts
│   │   │   │   ├── scope-information.ts
│   │   │   │   ├── types.ee.ts
│   │   │   │   └── utilities/
│   │   │   │       ├── __tests__/
│   │   │   │       │   ├── c
Download .txt
Showing preview only (3,574K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (35533 symbols across 7097 files)

FILE: .github/actions/ci-filter/__tests__/ci-filter.test.ts
  function runWithResults (line 178) | function runWithResults(jobResults: Record<string, { result: string }>):...

FILE: .github/actions/ci-filter/ci-filter.mjs
  function matchGlob (line 12) | function matchGlob(filePath, pattern) {
  function parseFilters (line 50) | function parseFilters(input) {
  constant SAFE_REF (line 95) | const SAFE_REF = /^[a-zA-Z0-9_./-]+$/;
  function getChangedFiles (line 97) | function getChangedFiles(baseRef) {
  function evaluateFilter (line 116) | function evaluateFilter(changedFiles, patterns) {
  function setOutput (line 137) | function setOutput(name, value) {
  function runFilter (line 145) | function runFilter() {
  function runValidate (line 177) | function runValidate() {

FILE: .github/scripts/bump-versions.mjs
  function generateExperimentalVersion (line 10) | function generateExperimentalVersion(currentVersion) {

FILE: .github/scripts/cleanup-ghcr-images.mjs
  constant ORG (line 18) | const ORG = process.env.GHCR_ORG || 'n8n-io';
  constant REPO (line 19) | const REPO = process.env.GHCR_REPO || 'n8n';
  constant PACKAGES (line 20) | const PACKAGES = [REPO, 'runners'];
  function ghApi (line 34) | async function ghApi(path) {
  function ghDelete (line 41) | async function ghDelete(path) {
  function fetchPage (line 45) | async function fetchPage(pkg, page) {
  function getVersionsForTag (line 64) | async function getVersionsForTag(pkg, tag) {
  function getVersionsForStale (line 70) | async function getVersionsForStale(pkg, days) {

FILE: .github/scripts/cleanup-release-branch.mjs
  function pullRequestCheckFailed (line 26) | function pullRequestCheckFailed(pullRequestCheck) {
  function pullRequestIsDismissedRelease (line 34) | function pullRequestIsDismissedRelease(pullRequest) {
  function main (line 75) | async function main() {

FILE: .github/scripts/compute-backport-targets.mjs
  constant BACKPORT_BY_TAG_MAP (line 11) | const BACKPORT_BY_TAG_MAP = {
  constant BACKPORT_BY_BRANCH_MAP (line 16) | const BACKPORT_BY_BRANCH_MAP = {
  function labelsToReleaseCandidateBranches (line 25) | function labelsToReleaseCandidateBranches(labels) {
  function fetchPossiblePullRequestFromEnv (line 66) | async function fetchPossiblePullRequestFromEnv() {
  function getLabels (line 83) | async function getLabels() {
  function main (line 88) | async function main() {

FILE: .github/scripts/compute-backport-targets.test.mjs
  function mockResolveRcBranchForTrack (line 27) | function mockResolveRcBranchForTrack(track) {

FILE: .github/scripts/create-github-release.mjs
  function createGitHubRelease (line 27) | async function createGitHubRelease() {

FILE: .github/scripts/determine-release-candidate-branch-for-track.mjs
  function main (line 9) | function main() {
  function filterActionableCommits (line 45) | function filterActionableCommits(commitList) {

FILE: .github/scripts/determine-release-version-changes.mjs
  function determineReleaseVersionChanges (line 3) | function determineReleaseVersionChanges() {
  function hasNodeEnhancements (line 30) | function hasNodeEnhancements(log) {
  function hasCoreChanges (line 39) | function hasCoreChanges(log) {

FILE: .github/scripts/determine-version-info.mjs
  function determineTrack (line 13) | function determineTrack(packageVersion) {
  function matchesTrack (line 93) | function matchesTrack(tagVersionInfo, currentVersion) {
  function assertNewBetaRelease (line 107) | function assertNewBetaRelease(currentBetaVersion, currentVersion) {
  function determineReleaseType (line 120) | function determineReleaseType(currentVersion) {
  function determineBump (line 127) | function determineBump(currentVersion) {

FILE: .github/scripts/docker/docker-config.mjs
  class BuildContext (line 5) | class BuildContext {
    method constructor (line 6) | constructor() {
    method determine (line 10) | determine({ event, pr, branch, version, releaseType, pushEnabled }) {
    method sanitizeBranch (line 78) | sanitizeBranch(branch) {
    method buildMatrix (line 88) | buildMatrix(platforms) {
    method output (line 112) | output(context, matrix = null) {

FILE: .github/scripts/docker/docker-tags.mjs
  class TagGenerator (line 5) | class TagGenerator {
    method constructor (line 6) | constructor() {
    method generate (line 12) | generate({ image, version, platform, includeDockerHub = false }) {
    method output (line 33) | output(tags, prefix = '') {
    method generateAll (line 49) | generateAll({ version, platform, includeDockerHub = false }) {

FILE: .github/scripts/docker/get-manifest-digests.mjs
  function getDigest (line 20) | function getDigest(imageRef) {
  function getImageName (line 29) | function getImageName(imageRef) {
  function setOutput (line 34) | function setOutput(name, value) {

FILE: .github/scripts/ensure-release-candidate-branches.mjs
  function determineBranchChanges (line 26) | function determineBranchChanges() {
  function ensureBranch (line 58) | function ensureBranch(tagInfo) {
  function removeBranch (line 84) | function removeBranch(branch) {
  function main (line 103) | function main() {

FILE: .github/scripts/get-release-versions.mjs
  function highestSemverTag (line 17) | function highestSemverTag(tags) {
  function getSemverTagForTrack (line 35) | function getSemverTagForTrack(track) {
  function main (line 43) | function main() {

FILE: .github/scripts/github-helpers.mjs
  constant CURRENT_MAJOR_VERSION (line 7) | const CURRENT_MAJOR_VERSION = 2;
  constant RELEASE_CANDIDATE_BRANCH_PREFIX (line 8) | const RELEASE_CANDIDATE_BRANCH_PREFIX = 'release-candidate/';
  constant RELEASE_TRACKS (line 10) | const RELEASE_TRACKS = /** @type { const } */ ([
  constant RELEASE_PREFIX (line 37) | const RELEASE_PREFIX = 'n8n@';
  function pickHighestReleaseTag (line 47) | function pickHighestReleaseTag(tags) {
  function isReleaseTrack (line 62) | function isReleaseTrack(track) {
  function ensureReleaseTrack (line 71) | function ensureReleaseTrack(track) {
  function resolveReleaseTagForTrack (line 89) | function resolveReleaseTagForTrack(track) {
  function resolveRcBranchForTrack (line 112) | function resolveRcBranchForTrack(track) {
  function tagVersionInfoToReleaseCandidateBranchName (line 140) | function tagVersionInfoToReleaseCandidateBranchName(tagVersionInfo) {
  function stripReleasePrefixes (line 155) | function stripReleasePrefixes(tag) {
  function getEventFromGithubEventPath (line 161) | function getEventFromGithubEventPath() {
  function readPrLabels (line 174) | function readPrLabels(pullRequest) {
  function ensureTagExists (line 191) | function ensureTagExists(tag) {
  function isReleaseType (line 200) | function isReleaseType(bump) {
  function ensureEnvVar (line 207) | function ensureEnvVar(variableName) {
  function sh (line 222) | function sh(cmd, args, opts = {}) {
  function trySh (line 233) | function trySh(cmd, args, opts = {}) {
  function writeGithubOutput (line 246) | function writeGithubOutput(obj) {
  function getCommitForRef (line 264) | function getCommitForRef(ref) {
  function listTagsPointingAt (line 274) | function listTagsPointingAt(commit) {
  function listCommitsBetweenRefs (line 288) | function listCommitsBetweenRefs(from, to) {
  function countCommitsBetweenRefs (line 296) | function countCommitsBetweenRefs(from, to) {
  function remoteBranchExists (line 306) | function remoteBranchExists(branch) {
  function localRefExists (line 314) | function localRefExists(ref) {
  function initGithub (line 324) | function initGithub() {
  function getPullRequestById (line 342) | async function getPullRequestById(pullRequestId) {
  function getExistingRelease (line 357) | async function getExistingRelease(tag) {
  function deleteRelease (line 379) | async function deleteRelease(releaseId) {

FILE: .github/scripts/move-track-tag.mjs
  function main (line 3) | function main() {

FILE: .github/scripts/populate-cloud-databases.mjs
  function populateCloudDatabases (line 3) | async function populateCloudDatabases() {

FILE: .github/scripts/promote-github-release.mjs
  function promoteGitHubRelease (line 19) | async function promoteGitHubRelease() {

FILE: .github/scripts/retry.mjs
  function getFlag (line 18) | function getFlag(name, defaultValue) {

FILE: .github/scripts/send-metrics.mjs
  function metric (line 16) | function metric(name, value, unit, dimensions = {}) {
  function buildContext (line 21) | function buildContext(benchmarkName = null) {
  function sendMetrics (line 58) | async function sendMetrics(metrics, benchmarkName = null) {

FILE: .github/scripts/send-version-release-notification.mjs
  function sendVersionReleaseNotification (line 3) | async function sendVersionReleaseNotification() {

FILE: .github/scripts/update-changelog.mjs
  method transformCommit (line 28) | transformCommit(commit) {

FILE: packages/@n8n/agents/examples/basic-agent.ts
  function main (line 108) | async function main() {

FILE: packages/@n8n/agents/src/__tests__/agent-runtime.test.ts
  type AiImport (line 31) | type AiImport = typeof import('ai');
  function makeGenerateSuccess (line 58) | function makeGenerateSuccess(text = 'OK') {
  function silentReject (line 88) | function silentReject<T = never>(error: Error): Promise<T> {
  function makeErrorStream (line 94) | function makeErrorStream(error: Error) {
  function collectChunks (line 103) | async function collectChunks(stream: ReadableStream<unknown>): Promise<S...
  function makeStreamSuccess (line 115) | function makeStreamSuccess(text = 'Hello') {
  function createRuntime (line 128) | function createRuntime(eventBus?: AgentEventBus) {
  function createStructuredRuntime (line 142) | function createStructuredRuntime(options?: { tools?: BuiltTool[]; eventB...
  function makeGenerateSuccessWithOutput (line 156) | function makeGenerateSuccessWithOutput(output: unknown, text = 'OK') {
  function makeStreamSuccessWithOutput (line 161) | function makeStreamSuccessWithOutput(output: unknown, text = 'Hello') {
  function makeGenerateWithToolCall (line 166) | function makeGenerateWithToolCall(toolCallId: string, toolName: string, ...
  function makeInterruptibleTool (line 183) | function makeInterruptibleTool(): BuiltTool {
  function makeMockTool (line 537) | function makeMockTool(name: string, handler: (input: unknown) => Promise...
  function makeSuspendingTool (line 547) | function makeSuspendingTool(
  function createRuntimeWithTools (line 562) | function createRuntimeWithTools(tools: BuiltTool[], concurrency: number,...
  function makeGenerateWithToolCalls (line 577) | function makeGenerateWithToolCalls(
  type ToolOutputContent (line 904) | type ToolOutputContent = {
  type ToolMessage (line 908) | type ToolMessage = { role: string; content: ToolOutputContent[] };

FILE: packages/@n8n/agents/src/__tests__/fixtures/mcp-stdio-server.mjs
  constant TINY_PNG (line 11) | const TINY_PNG =

FILE: packages/@n8n/agents/src/__tests__/integration/evaluate.test.ts
  function createFruitBowlAgent (line 11) | function createFruitBowlAgent(provider: 'anthropic' | 'openai'): Agent {

FILE: packages/@n8n/agents/src/__tests__/integration/events-and-abort.test.ts
  function createSimpleAgent (line 13) | function createSimpleAgent(provider: 'openai' | 'anthropic' = 'anthropic...
  function createAgentWithTool (line 19) | function createAgentWithTool(provider: 'openai' | 'anthropic' = 'anthrop...

FILE: packages/@n8n/agents/src/__tests__/integration/helpers.ts
  function describeIf (line 23) | function describeIf(provider: 'anthropic' | 'openai') {
  function collectStreamChunks (line 31) | async function collectStreamChunks(stream: ReadableStream<unknown>): Pro...
  function chunksOfType (line 45) | function chunksOfType<T extends StreamChunk['type']>(
  function getModel (line 55) | function getModel(provider: 'anthropic' | 'openai'): string {
  function createAgentWithAddTool (line 62) | function createAgentWithAddTool(provider: 'anthropic' | 'openai'): Agent {
  function createAgentWithInterruptibleTool (line 89) | function createAgentWithInterruptibleTool(provider: 'anthropic' | 'opena...
  function createAgentWithMixedTools (line 116) | function createAgentWithMixedTools(provider: 'anthropic' | 'openai'): Ag...
  function createAgentWithToContentTool (line 154) | function createAgentWithToContentTool(provider: 'anthropic' | 'openai'):...
  function createAgentWithParallelInterruptibleCalls (line 186) | function createAgentWithParallelInterruptibleCalls(provider: 'anthropic'...
  function createAgentWithConcurrentInterruptibleCalls (line 215) | function createAgentWithConcurrentInterruptibleCalls(
  function createAgentWithConcurrentMixedTools (line 246) | function createAgentWithConcurrentMixedTools(provider: 'anthropic' | 'op...
  function createAgentWithBatchedInterruptibleCalls (line 284) | function createAgentWithBatchedInterruptibleCalls(
  function createAgentWithBatchedNormalCalls (line 315) | function createAgentWithBatchedNormalCalls(
  function createAgentWithAlwaysErrorTool (line 339) | function createAgentWithAlwaysErrorTool(provider: 'anthropic' | 'openai'...
  function createAgentWithFlakyTool (line 360) | function createAgentWithFlakyTool(provider: 'anthropic' | 'openai'): {
  function createSqliteMemory (line 419) | function createSqliteMemory(): {

FILE: packages/@n8n/agents/src/__tests__/integration/json-schema-validation.test.ts
  function makeJsonSchemaTool (line 27) | function makeJsonSchemaTool(overrides: Partial<BuiltTool> = {}): BuiltTo...

FILE: packages/@n8n/agents/src/__tests__/integration/mcp-connection.test.ts
  function isApprovalWrapped (line 21) | function isApprovalWrapped(tool: { suspendSchema?: unknown }): boolean {
  type McpConnectionInternals (line 213) | type McpConnectionInternals = { client: { close(): Promise<void> } };

FILE: packages/@n8n/agents/src/__tests__/integration/mcp-server-helpers.ts
  constant TINY_PNG (line 14) | const TINY_PNG =
  type TestServer (line 17) | interface TestServer {
  function createTestMcpServer (line 23) | function createTestMcpServer(): McpServer {
  function startSseServer (line 97) | async function startSseServer(): Promise<TestServer> {
  function startStreamableHttpServer (line 139) | async function startStreamableHttpServer(): Promise<TestServer> {

FILE: packages/@n8n/agents/src/__tests__/integration/mcp-stdio-transport.test.ts
  constant FIXTURE_PATH (line 13) | const FIXTURE_PATH = path.resolve(__dirname, '../fixtures/mcp-stdio-serv...
  function stdioConfig (line 16) | function stdioConfig(name = 'test') {

FILE: packages/@n8n/agents/src/__tests__/integration/memory/memory-custom-backend.test.ts
  class CustomMapMemory (line 19) | class CustomMapMemory implements BuiltMemory {
    method getThread (line 26) | async getThread(threadId: string): Promise<Thread | null> {
    method saveThread (line 30) | async saveThread(thread: Omit<Thread, 'createdAt' | 'updatedAt'>): Pro...
    method deleteThread (line 37) | async deleteThread(threadId: string): Promise<void> {
    method getMessages (line 44) | async getMessages(
    method saveMessages (line 61) | async saveMessages(args: {
    method deleteMessages (line 70) | async deleteMessages(messageIds: string[]): Promise<void> {
    method getWorkingMemory (line 82) | async getWorkingMemory(params: {
    method saveWorkingMemory (line 93) | async saveWorkingMemory(

FILE: packages/@n8n/agents/src/__tests__/integration/memory/memory-postgres.test.ts
  function isDockerAvailable (line 21) | function isDockerAvailable(): boolean {
  function describeWithDocker (line 64) | function describeWithDocker(name: string, fn: () => void) {
  function describeWithDockerAndApi (line 487) | function describeWithDockerAndApi(name: string, fn: () => void) {

FILE: packages/@n8n/agents/src/__tests__/integration/multimodal.test.ts
  function base64ToUint8Array (line 16) | function base64ToUint8Array(base64: string): Uint8Array {
  constant RED_PIXEL_BASE64 (line 21) | const RED_PIXEL_BASE64 =
  constant BLUE_PIXEL_BASE64 (line 24) | const BLUE_PIXEL_BASE64 =

FILE: packages/@n8n/agents/src/__tests__/integration/orphaned-tool-messages.test.ts
  function buildLookupTool (line 22) | function buildLookupTool() {
  function buildSeedMessages (line 44) | function buildSeedMessages(): AgentMessage[] {

FILE: packages/@n8n/agents/src/__tests__/integration/provider-options.test.ts
  constant LONG_SYSTEM_PROMPT (line 18) | const LONG_SYSTEM_PROMPT =

FILE: packages/@n8n/agents/src/__tests__/integration/provider-tools.test.ts
  constant WEB_SEARCH_INSTRUCTIONS (line 20) | const WEB_SEARCH_INSTRUCTIONS =

FILE: packages/@n8n/agents/src/__tests__/integration/state-restore-after-suspension.test.ts
  class InMemoryCheckpointStore (line 15) | class InMemoryCheckpointStore implements CheckpointStore {
    method save (line 18) | async save(key: string, state: SerializableAgentState): Promise<void> {
    method load (line 22) | async load(key: string): Promise<SerializableAgentState | undefined> {
    method delete (line 27) | async delete(key: string): Promise<void> {
    method size (line 31) | get size(): number {
  function buildDeleteAgent (line 40) | function buildDeleteAgent(checkpointStore: CheckpointStore): Agent {

FILE: packages/@n8n/agents/src/__tests__/integration/structured-output.test.ts
  function createStructuredAgent (line 14) | function createStructuredAgent(provider: 'anthropic' | 'openai'): Agent {
  function createStructuredAgentWithTool (line 23) | function createStructuredAgentWithTool(provider: 'anthropic' | 'openai')...
  function createStructuredAgentWithInterruptibleTool (line 46) | function createStructuredAgentWithInterruptibleTool(provider: 'anthropic...

FILE: packages/@n8n/agents/src/__tests__/integration/telemetry-langsmith.test.ts
  type CapturedRequest (line 22) | interface CapturedRequest {
  function createTestAgent (line 77) | function createTestAgent(telemetry: Telemetry | BuiltTelemetry) {

FILE: packages/@n8n/agents/src/__tests__/sqlite-memory.test.ts
  function makeTempDb (line 12) | function makeTempDb(): string {
  function makeMsg (line 16) | function makeMsg(role: 'user' | 'assistant', text: string): Message {
  function textOf (line 20) | function textOf(msg: AgentMessage): string {
  function makeMemory (line 25) | function makeMemory(dbPath: string, namespace?: string): SqliteMemory {

FILE: packages/@n8n/agents/src/__tests__/strip-orphaned-tool-messages.test.ts
  function seed (line 5) | function seed(messages: AgentMessage[]): AgentDbMessage[] {

FILE: packages/@n8n/agents/src/__tests__/tool-adapter.test.ts
  type AiImport (line 12) | type AiImport = typeof import('ai');
  function makeJsonSchemaTool (line 29) | function makeJsonSchemaTool(
  function makeZodSchemaTool (line 41) | function makeZodSchemaTool(overrides: Partial<BuiltTool> = {}): BuiltTool {

FILE: packages/@n8n/agents/src/__tests__/tool.test.ts
  function makeBuiltTool (line 10) | function makeBuiltTool(overrides: Partial<BuiltTool> = {}): BuiltTool {
  function makeCtx (line 22) | function makeCtx(resumeData?: unknown): { ctx: InterruptibleToolContext;...

FILE: packages/@n8n/agents/src/__tests__/working-memory.test.ts
  function runStreamFilter (line 87) | async function runStreamFilter(

FILE: packages/@n8n/agents/src/__tests__/workspace/base-filesystem.test.ts
  class TestFilesystem (line 15) | class TestFilesystem extends BaseFilesystem {
    method constructor (line 24) | constructor(id: string, options?: BaseFilesystemOptions) {
    method init (line 29) | override async init(): Promise<void> {
    method destroy (line 33) | override async destroy(): Promise<void> {
    method readFile (line 37) | async readFile(_path: string, _options?: ReadOptions): Promise<string ...
    method writeFile (line 42) | async writeFile(_path: string, _content: FileContent, _options?: Write...
    method appendFile (line 46) | async appendFile(_path: string, _content: FileContent): Promise<void> {
    method deleteFile (line 50) | async deleteFile(_path: string, _options?: RemoveOptions): Promise<voi...
    method copyFile (line 54) | async copyFile(_src: string, _dest: string, _options?: CopyOptions): P...
    method moveFile (line 58) | async moveFile(_src: string, _dest: string, _options?: CopyOptions): P...
    method mkdir (line 62) | async mkdir(_path: string, _options?: { recursive?: boolean }): Promis...
    method rmdir (line 66) | async rmdir(_path: string, _options?: RemoveOptions): Promise<void> {
    method readdir (line 70) | async readdir(_path: string, _options?: ListOptions): Promise<FileEntr...
    method exists (line 75) | async exists(_path: string): Promise<boolean> {
    method stat (line 80) | async stat(_path: string): Promise<FileStat> {

FILE: packages/@n8n/agents/src/__tests__/workspace/base-sandbox.test.ts
  class StubProcessHandle (line 9) | class StubProcessHandle extends ProcessHandle {
    method constructor (line 13) | constructor(pid: number) {
    method exitCode (line 18) | get exitCode(): number | undefined {
    method kill (line 22) | async kill(): Promise<boolean> {
    method sendStdin (line 27) | async sendStdin(_data: string): Promise<void> {}
    method _wait (line 29) | protected async _wait(): Promise<CommandResult> {
  function makeStubProcessManager (line 42) | function makeStubProcessManager(): SandboxProcessManager & {
  class TestSandbox (line 56) | class TestSandbox extends BaseSandbox {
    method constructor (line 65) | constructor(id: string, options?: BaseSandboxOptions) {
    method start (line 71) | async start(): Promise<void> {
    method stop (line 75) | async stop(): Promise<void> {
    method destroy (line 79) | async destroy(): Promise<void> {

FILE: packages/@n8n/agents/src/__tests__/workspace/test-utils.ts
  class InMemoryFilesystem (line 23) | class InMemoryFilesystem extends BaseFilesystem {
    method constructor (line 33) | constructor(id = 'mem-fs') {
    method init (line 39) | override async init(): Promise<void> {
    method normalizePath (line 43) | private normalizePath(p: string): string {
    method parentDir (line 47) | private parentDir(p: string): string {
    method readFile (line 53) | async readFile(filePath: string, options?: ReadOptions): Promise<strin...
    method writeFile (line 62) | async writeFile(filePath: string, content: FileContent, options?: Writ...
    method appendFile (line 74) | async appendFile(filePath: string, content: FileContent): Promise<void> {
    method deleteFile (line 82) | async deleteFile(filePath: string): Promise<void> {
    method copyFile (line 89) | async copyFile(src: string, dest: string): Promise<void> {
    method moveFile (line 95) | async moveFile(src: string, dest: string): Promise<void> {
    method mkdir (line 101) | async mkdir(dirPath: string, options?: { recursive?: boolean }): Promi...
    method rmdir (line 111) | async rmdir(dirPath: string, options?: RemoveOptions): Promise<void> {
    method readdir (line 126) | async readdir(dirPath: string, options?: ListOptions): Promise<FileEnt...
    method exists (line 170) | async exists(filePath: string): Promise<boolean> {
    method stat (line 176) | async stat(filePath: string): Promise<FileStat> {
    method getMountConfig (line 202) | getMountConfig(): MountConfig {
    method getInstructions (line 206) | getInstructions(): string {
    method getFileContent (line 210) | getFileContent(filePath: string): string | undefined {
    method mkdirRecursive (line 215) | private mkdirRecursive(p: string): void {
  class FakeProcessHandle (line 226) | class FakeProcessHandle extends ProcessHandle {
    method constructor (line 236) | constructor(
    method exitCode (line 248) | get exitCode(): number | undefined {
    method kill (line 252) | async kill(): Promise<boolean> {
    method sendStdin (line 257) | async sendStdin(_data: string): Promise<void> {}
    method _wait (line 259) | protected async _wait(): Promise<CommandResult> {
  class FakeProcessManager (line 280) | class FakeProcessManager extends SandboxProcessManager {
    method constructor (line 285) | constructor() {
    method spawn (line 290) | async spawn(command: string, _options?: SpawnProcessOptions): Promise<...
    method list (line 297) | async list(): Promise<ProcessInfo[]> {
    method get (line 307) | async get(pid: number): Promise<ProcessHandle | undefined> {
    method kill (line 311) | async kill(pid: number): Promise<boolean> {
  class FakeSandbox (line 320) | class FakeSandbox extends BaseSandbox {
    method constructor (line 325) | constructor(id: string, pm: FakeProcessManager) {
    method start (line 331) | async start(): Promise<void> {}
    method stop (line 332) | async stop(): Promise<void> {}
    method destroy (line 333) | async destroy(): Promise<void> {}
    method getInstructions (line 335) | override getInstructions(): string {

FILE: packages/@n8n/agents/src/__tests__/workspace/workspace-tools.test.ts
  function makeFakeFilesystem (line 4) | function makeFakeFilesystem(overrides: Partial<WorkspaceFilesystem> = {}...
  function makeFakeSandbox (line 35) | function makeFakeSandbox(overrides: Partial<WorkspaceSandbox> = {}): Wor...

FILE: packages/@n8n/agents/src/__tests__/workspace/workspace.test.ts
  function makeFakeFilesystem (line 4) | function makeFakeFilesystem(overrides: Partial<WorkspaceFilesystem> = {}...
  function makeFakeSandbox (line 25) | function makeFakeSandbox(overrides: Partial<WorkspaceSandbox> = {}): Wor...

FILE: packages/@n8n/agents/src/evals/categorization.ts
  function categorization (line 4) | function categorization(): Eval {

FILE: packages/@n8n/agents/src/evals/contains-keywords.ts
  function containsKeywords (line 8) | function containsKeywords(): Eval {

FILE: packages/@n8n/agents/src/evals/correctness.ts
  function correctness (line 8) | function correctness(): Eval {

FILE: packages/@n8n/agents/src/evals/helpfulness.ts
  function helpfulness (line 8) | function helpfulness(): Eval {

FILE: packages/@n8n/agents/src/evals/json-validity.ts
  function jsonValidity (line 4) | function jsonValidity(): Eval {

FILE: packages/@n8n/agents/src/evals/parse-judge-response.ts
  function parseJudgeResponse (line 7) | function parseJudgeResponse(text: string): EvalScore {

FILE: packages/@n8n/agents/src/evals/string-similarity.ts
  function diceSimilarity (line 7) | function diceSimilarity(a: string, b: string): number {
  function stringSimilarity (line 33) | function stringSimilarity(): Eval {

FILE: packages/@n8n/agents/src/evals/tool-call-accuracy.ts
  function toolCallAccuracy (line 8) | function toolCallAccuracy(): Eval {

FILE: packages/@n8n/agents/src/integrations/langsmith.ts
  type LangSmithTelemetryConfig (line 4) | interface LangSmithTelemetryConfig {
  function createLangSmithTracer (line 23) | async function createLangSmithTracer(
  class LangSmithTelemetry (line 96) | class LangSmithTelemetry extends Telemetry {
    method constructor (line 99) | constructor(config?: LangSmithTelemetryConfig) {
    method build (line 105) | override async build(): Promise<BuiltTelemetry> {

FILE: packages/@n8n/agents/src/runtime/agent-runtime.ts
  function isTextPart (line 81) | function isTextPart(part: unknown): part is { type: 'text'; text: string...
  type AgentRuntimeConfig (line 91) | interface AgentRuntimeConfig {
  constant MAX_LOOP_ITERATIONS (line 117) | const MAX_LOOP_ITERATIONS = 20;
  constant EMPTY_MESSAGE_LIST (line 121) | const EMPTY_MESSAGE_LIST: SerializedMessageList = {
  type PendingResume (line 129) | interface PendingResume {
  type ToolCallOutcome (line 138) | type ToolCallOutcome =
  type ToolCallSuccess (line 151) | interface ToolCallSuccess {
  type ToolCallSuspension (line 162) | interface ToolCallSuspension {
  type ToolCallError (line 172) | interface ToolCallError {
  type ToolCallBatchResult (line 181) | interface ToolCallBatchResult {
  class AgentRuntime (line 202) | class AgentRuntime {
    method constructor (line 215) | constructor(config: AgentRuntimeConfig) {
    method getState (line 228) | getState(): SerializableAgentState {
    method abort (line 233) | abort(): void {
    method generate (line 238) | async generate(
    method stream (line 260) | async stream(
    method resume (line 298) | async resume(
    method buildMessageList (line 397) | private async buildMessageList(
    method performSemanticRecall (line 433) | private async performSemanticRecall(
    method expandMessageRange (line 517) | private expandMessageRange(
    method initRun (line 546) | private async initRun(
    method finalizeGenerate (line 565) | private finalizeGenerate(
    method resolveTelemetry (line 580) | private resolveTelemetry(options?: ExecutionOptions): BuiltTelemetry |...
    method flushTelemetry (line 588) | private async flushTelemetry(options?: ExecutionOptions): Promise<void> {
    method buildTelemetryOptions (line 600) | private buildTelemetryOptions(options?: ExecutionOptions): Record<stri...
    method runGenerateLoop (line 626) | private async runGenerateLoop(
    method startStreamLoop (line 811) | private startStreamLoop(
    method runStreamLoop (line 847) | private async runStreamLoop(
    method saveToMemory (line 1125) | private async saveToMemory(
    method saveEmbeddingsForMessages (line 1149) | private async saveEmbeddingsForMessages(
    method extractAndPersistWorkingMemory (line 1196) | private extractAndPersistWorkingMemory(
    method buildThinkingProviderOptions (line 1230) | private buildThinkingProviderOptions(): Record<string, Record<string, ...
    method buildCallProviderOptions (line 1276) | private buildCallProviderOptions(
    method iterateToolCallsConcurrent (line 1309) | private async iterateToolCallsConcurrent(
    method iteratePendingToolCallsConcurrent (line 1438) | private async iteratePendingToolCallsConcurrent(
    method processToolCall (line 1558) | private async processToolCall(
    method buildLoopContext (line 1698) | private buildLoopContext(execOptions?: ExecutionOptions) {
    method persistSuspension (line 1718) | private async persistSuspension(
    method cleanupRun (line 1746) | private async cleanupRun(runId: string | undefined): Promise<void> {
    method emitTurnEnd (line 1753) | private emitTurnEnd(newMessages: AgentDbMessage[], toolResults: Conten...
    method updateState (line 1761) | private updateState(patch: Partial<SerializableAgentState>): void {
    method modelIdString (line 1766) | private get modelIdString(): string {
    method concurrency (line 1778) | private get concurrency(): number {
    method ensureModelCost (line 1783) | private async ensureModelCost(): Promise<ModelCost | undefined> {
    method applyCost (line 1794) | private applyCost(usage: TokenUsage | undefined): TokenUsage | undefin...
    method setListWorkingMemoryConfig (line 1799) | private async setListWorkingMemoryConfig(
    method resolveWorkingMemoryParams (line 1814) | private resolveWorkingMemoryParams(options: AgentPersistenceOptions | ...

FILE: packages/@n8n/agents/src/runtime/event-bus.ts
  class AgentEventBus (line 19) | class AgentEventBus {
    method on (line 26) | on(event: AgentEvent, handler: AgentEventHandler): void {
    method emit (line 35) | emit(data: AgentEventData): void {
    method abort (line 43) | abort(): void {
    method resetAbort (line 56) | resetAbort(externalSignal?: AbortSignal): void {
    method signal (line 73) | get signal(): AbortSignal {
    method isAborted (line 77) | get isAborted(): boolean {

FILE: packages/@n8n/agents/src/runtime/logger.ts
  constant SUPPRESSED_PATTERNS (line 6) | const SUPPRESSED_PATTERNS = [
  function isSuppressed (line 10) | function isSuppressed(message: string): boolean {
  function createFilteredLogger (line 18) | function createFilteredLogger() {

FILE: packages/@n8n/agents/src/runtime/mcp-connection.ts
  type McpCallToolResult (line 14) | type McpCallToolResult = CallToolResult;
  class McpConnection (line 17) | class McpConnection {
    method constructor (line 28) | constructor(config: McpServerConfig, requireToolApproval = false) {
    method connect (line 34) | async connect(): Promise<void> {
    method connectWithTransport (line 47) | private async connectWithTransport(
    method listTools (line 83) | async listTools(): Promise<BuiltTool[]> {
    method needsApproval (line 102) | private needsApproval(tool: BuiltTool): boolean {
    method callTool (line 119) | async callTool(name: string, args: Record<string, unknown>): Promise<M...
    method disconnect (line 124) | async disconnect(): Promise<void> {
    method doDisconnect (line 133) | private async doDisconnect(): Promise<void> {
    method name (line 140) | get name(): string {
    method declaresApproval (line 148) | declaresApproval(): boolean {
    method createTransport (line 155) | private createTransport(

FILE: packages/@n8n/agents/src/runtime/mcp-tool-resolver.ts
  type McpContentBlock (line 8) | type McpContentBlock = McpCallToolResult['content'][number];
  class McpToolResolver (line 15) | class McpToolResolver {
    method resolve (line 16) | resolve(connection: McpConnection, tools: Tool[]): BuiltTool[] {
    method resolveTool (line 20) | private resolveTool(connection: McpConnection, tool: Tool): BuiltTool {
  function buildRichMessage (line 55) | function buildRichMessage(result: McpCallToolResult): AgentMessage | und...
  function blockToContentPart (line 73) | function blockToContentPart(block: McpContentBlock): ContentText | Conte...

FILE: packages/@n8n/agents/src/runtime/memory-store.ts
  type StoredMessage (line 5) | interface StoredMessage {
  class InMemoryMemory (line 17) | class InMemoryMemory implements BuiltMemory {
    method getWorkingMemory (line 25) | async getWorkingMemory(params: { threadId: string; resourceId?: string...
    method saveWorkingMemory (line 32) | async saveWorkingMemory(
    method getThread (line 40) | async getThread(threadId: string): Promise<Thread | null> {
    method saveThread (line 45) | async saveThread(thread: Omit<Thread, 'createdAt' | 'updatedAt'>): Pro...
    method deleteThread (line 60) | async deleteThread(threadId: string): Promise<void> {
    method getMessages (line 66) | async getMessages(
    method saveMessages (line 84) | async saveMessages(args: {
    method deleteMessages (line 98) | async deleteMessages(messageIds: string[]): Promise<void> {
  function saveMessagesToThread (line 114) | async function saveMessagesToThread(

FILE: packages/@n8n/agents/src/runtime/message-list.ts
  type WorkingMemoryContext (line 13) | interface WorkingMemoryContext {
  class AgentMessageList (line 32) | class AgentMessageList {
    method addHistory (line 44) | addHistory(messages: AgentDbMessage[]): void {
    method addInput (line 51) | addInput(messages: AgentDbMessage[]): void {
    method addResponse (line 58) | addResponse(messages: AgentDbMessage[]): void {
    method forLlm (line 70) | forLlm(baseInstructions: string, instructionProviderOptions?: Provider...
    method turnDelta (line 93) | turnDelta(): AgentDbMessage[] {
    method responseDelta (line 101) | responseDelta(): AgentDbMessage[] {
    method serialize (line 105) | serialize(): SerializedMessageList {
    method deserialize (line 115) | static deserialize(data: SerializedMessageList): AgentMessageList {

FILE: packages/@n8n/agents/src/runtime/messages.ts
  type ReasoningPart (line 29) | type ReasoningPart = { type: 'reasoning'; text: string };
  type AiContentPart (line 31) | type AiContentPart =
  function isText (line 43) | function isText(block: MessageContent): block is ContentText {
  function isReasoning (line 47) | function isReasoning(block: MessageContent): block is ContentReasoning {
  function isFile (line 51) | function isFile(block: MessageContent): block is ContentFile {
  function isToolCall (line 55) | function isToolCall(block: MessageContent): block is ContentToolCall {
  function isToolResult (line 59) | function isToolResult(block: MessageContent): block is ContentToolResult {
  function parseJsonValue (line 67) | function parseJsonValue(value: JSONValue): unknown {
  function toAiContent (line 79) | function toAiContent(block: MessageContent): AiContentPart | undefined {
  function fromAiContent (line 134) | function fromAiContent(part: AiContentPart): MessageContent | undefined {
  function toAiMessage (line 207) | function toAiMessage(msg: Message): ModelMessage {
  function toAiMessages (line 261) | function toAiMessages(messages: Message[]): ModelMessage[] {
  function fromAiMessage (line 266) | function fromAiMessage(msg: ModelMessage): AgentDbMessage {
  function fromAiMessages (line 280) | function fromAiMessages(messages: ModelMessage[]): AgentDbMessage[] {
  function fromAiFinishReason (line 284) | function fromAiFinishReason(reason: AiFinishReason): FinishReason {

FILE: packages/@n8n/agents/src/runtime/model-factory.ts
  type CreateProviderFn (line 6) | type CreateProviderFn = (opts?: {
  type CreateEmbeddingProviderFn (line 10) | type CreateEmbeddingProviderFn = (opts?: { apiKey?: string }) => {
  function isLanguageModel (line 14) | function isLanguageModel(config: unknown): config is LanguageModel {
  function createModel (line 22) | function createModel(config: ModelConfig): LanguageModel {
  constant EMBEDDING_PROVIDERS (line 83) | const EMBEDDING_PROVIDERS = {
  type EmbeddingProvider (line 92) | type EmbeddingProvider = keyof typeof EMBEDDING_PROVIDERS;
  type EmbeddingModelId (line 93) | type EmbeddingModelId = `${EmbeddingProvider}/${string}`;
  function createEmbeddingModel (line 100) | function createEmbeddingModel(

FILE: packages/@n8n/agents/src/runtime/run-state.ts
  class MemoryCheckpointStore (line 11) | class MemoryCheckpointStore implements CheckpointStore {
    method save (line 14) | async save(key: string, state: SerializableAgentState): Promise<void> {
    method load (line 18) | async load(key: string): Promise<SerializableAgentState | undefined> {
    method delete (line 22) | async delete(key: string): Promise<void> {
  class RunStateManager (line 32) | class RunStateManager {
    method constructor (line 35) | constructor(storage?: 'memory' | CheckpointStore) {
    method suspend (line 40) | async suspend(runId: string, state: SerializableAgentState): Promise<v...
    method resume (line 45) | async resume(runId: string): Promise<SerializableAgentState | undefine...
    method complete (line 56) | async complete(runId: string): Promise<void> {
  function generateRunId (line 66) | function generateRunId(): string {

FILE: packages/@n8n/agents/src/runtime/runtime-helpers.ts
  function normalizeInput (line 12) | function normalizeInput(input: AgentMessage[] | string): AgentDbMessage[] {
  function makeToolResultMessage (line 20) | function makeToolResultMessage(
  function makeErrorToolResultMessage (line 43) | function makeErrorToolResultMessage(
  function extractToolResults (line 64) | function extractToolResults(messages: AgentDbMessage[]): ContentToolResu...
  function makeErrorStream (line 75) | function makeErrorStream(error: unknown): ReadableStream<StreamChunk> {
  function mergeUsage (line 85) | function mergeUsage(
  function accumulateUsage (line 121) | function accumulateUsage(
  function applySubAgentUsage (line 138) | function applySubAgentUsage(result: GenerateResult): GenerateResult {

FILE: packages/@n8n/agents/src/runtime/stream.ts
  function toTokenUsage (line 7) | function toTokenUsage(
  function convertChunk (line 43) | function convertChunk(c: TextStreamPart<ToolSet>): StreamChunk | undefin...

FILE: packages/@n8n/agents/src/runtime/strip-orphaned-tool-messages.ts
  function stripOrphanedToolMessages (line 20) | function stripOrphanedToolMessages(messages: AgentDbMessage[]): AgentDbM...

FILE: packages/@n8n/agents/src/runtime/title-generation.ts
  constant DEFAULT_TITLE_INSTRUCTIONS (line 11) | const DEFAULT_TITLE_INSTRUCTIONS = [
  function generateThreadTitle (line 26) | async function generateThreadTitle(opts: {

FILE: packages/@n8n/agents/src/runtime/tool-adapter.ts
  type AiSdkProviderTool (line 15) | type AiSdkProviderTool = AiSdkTool & {
  constant SUSPEND_BRAND (line 23) | const SUSPEND_BRAND = Symbol('SuspendBrand');
  constant AGENT_TOOL_BRAND (line 30) | const AGENT_TOOL_BRAND = Symbol('AgentToolBrand');
  type SuspendedToolResult (line 32) | interface SuspendedToolResult {
  function isSuspendedToolResult (line 38) | function isSuspendedToolResult(value: unknown): value is SuspendedToolRe...
  type AgentToolResult (line 42) | interface AgentToolResult {
  function isAgentToolResult (line 51) | function isAgentToolResult(value: unknown): value is AgentToolResult {
  function createAgentToolResult (line 63) | function createAgentToolResult(output: unknown, subAgentUsage: SubAgentU...
  function toAiSdkProviderTools (line 77) | function toAiSdkProviderTools(tools?: BuiltProviderTool[]): Record<strin...
  function toAiSdkTools (line 111) | function toAiSdkTools(tools?: BuiltTool[]): Record<string, AiSdkTool> {
  function executeTool (line 140) | async function executeTool(
  function isInterruptible (line 168) | function isInterruptible(toolName: string, toolMap: Map<string, BuiltToo...
  function buildToolMap (line 174) | function buildToolMap(tools?: BuiltTool[]): Map<string, BuiltTool> {

FILE: packages/@n8n/agents/src/runtime/working-memory.ts
  type ZodObjectSchema (line 8) | type ZodObjectSchema = z.ZodObject<z.ZodRawShape>;
  constant OPEN_TAG (line 10) | const OPEN_TAG = '<working_memory>';
  constant CLOSE_TAG (line 11) | const CLOSE_TAG = '</working_memory>';
  function parseWorkingMemory (line 17) | function parseWorkingMemory(text: string): {
  function buildWorkingMemoryInstruction (line 41) | function buildWorkingMemoryInstruction(template: string, structured: boo...
  function templateFromSchema (line 67) | function templateFromSchema(schema: ZodObjectSchema): string {
  type PersistFn (line 76) | type PersistFn = (content: string) => Promise<void>;
  class WorkingMemoryStreamFilter (line 83) | class WorkingMemoryStreamFilter {
    method constructor (line 94) | constructor(writer: WritableStreamDefaultWriter<StreamChunk>, persist:...
    method write (line 99) | async write(chunk: StreamChunk): Promise<void> {
    method flush (line 174) | async flush(): Promise<void> {

FILE: packages/@n8n/agents/src/sdk/agent.ts
  constant DEFAULT_LAST_MESSAGES (line 40) | const DEFAULT_LAST_MESSAGES = 10;
  type ToolParameter (line 42) | type ToolParameter = BuiltTool | { build(): BuiltTool };
  class Agent (line 59) | class Agent implements BuiltAgent {
    method constructor (line 114) | constructor(name: string) {
    method model (line 130) | model(providerOrIdOrConfig: string | ModelConfig, modelName?: string):...
    method instructions (line 142) | instructions(text: string, options?: { providerOptions?: ProviderOptio...
    method tool (line 149) | tool(t: ToolParameter | ToolParameter[]): this {
    method providerTool (line 162) | providerTool(builtProviderTool: BuiltProviderTool): this {
    method memory (line 168) | memory(m: MemoryConfig | Memory | BuiltMemory): this {
    method middleware (line 183) | middleware(m: AgentMiddleware): this {
    method inputGuardrail (line 190) | inputGuardrail(g: BuiltGuardrail | { build(): BuiltGuardrail }): this {
    method outputGuardrail (line 196) | outputGuardrail(g: BuiltGuardrail | { build(): BuiltGuardrail }): this {
    method eval (line 202) | eval(e: Eval | BuiltEval | { ensureBuilt(): BuiltEval }): this {
    method checkpoint (line 224) | checkpoint(storage: 'memory' | CheckpointStore): this {
    method credential (line 242) | credential(name: string): this {
    method declaredCredential (line 248) | protected get declaredCredential(): string | undefined {
    method resolvedApiKey (line 253) | protected set resolvedApiKey(key: string) {
    method structuredOutput (line 275) | structuredOutput(schema: z.ZodType): this {
    method thinking (line 297) | thinking<P extends Provider>(_provider: P, config?: ThinkingConfigFor<...
    method telemetry (line 303) | telemetry(t: Telemetry | BuiltTelemetry): this {
    method declaredTelemetry (line 315) | protected get declaredTelemetry(): Telemetry | undefined {
    method toolCallConcurrency (line 326) | toolCallConcurrency(n: number): this {
    method requireToolApproval (line 339) | requireToolApproval(): this {
    method workspace (line 348) | workspace(ws: Workspace): this {
    method mcp (line 371) | mcp(client: McpClient): this {
    method evaluations (line 377) | get evaluations(): BuiltEval[] {
    method on (line 385) | on(event: AgentEvent, handler: AgentEventHandler): void {
    method asTool (line 401) | asTool(description: string): BuiltTool {
    method getState (line 451) | getState(): SerializableAgentState {
    method abort (line 467) | abort(): void {
    method generate (line 472) | async generate(
    method stream (line 481) | async stream(
    method resume (line 500) | async resume(
    method approve (line 514) | async approve(
    method deny (line 526) | async deny(
    method ensureBuilt (line 541) | private async ensureBuilt(): Promise<AgentRuntime> {
    method toMessages (line 552) | private toMessages(input: string | AgentMessage[]): AgentMessage[] {
    method build (line 558) | protected async build(): Promise<AgentRuntime> {

FILE: packages/@n8n/agents/src/sdk/catalog.ts
  constant MODELS_DEV_URL (line 1) | const MODELS_DEV_URL = 'https://models.dev/api.json';
  type ModelCost (line 4) | interface ModelCost {
  type ModelLimits (line 16) | interface ModelLimits {
  type ModelInfo (line 24) | interface ModelInfo {
  type ProviderInfo (line 40) | interface ProviderInfo {
  type ProviderCatalog (line 50) | type ProviderCatalog = Record<string, ProviderInfo>;
  type ModelsDevModel (line 52) | interface ModelsDevModel {
  type ModelsDevProvider (line 61) | interface ModelsDevProvider {
  function fetchProviderCatalog (line 82) | async function fetchProviderCatalog(): Promise<ProviderCatalog> {
  function getCachedCatalog (line 140) | async function getCachedCatalog(): Promise<ProviderCatalog | undefined> {
  function getModelCost (line 166) | async function getModelCost(modelId: string): Promise<ModelCost | undefi...
  function computeCost (line 179) | function computeCost(

FILE: packages/@n8n/agents/src/sdk/eval.ts
  function extractText (line 7) | function extractText(messages: AgentMessage[]): string {
  class Eval (line 44) | class Eval {
    method constructor (line 59) | constructor(name: string) {
    method description (line 64) | description(desc: string): this {
    method model (line 70) | model(modelId: string): this {
    method credential (line 76) | credential(name: string): this {
    method declaredCredential (line 82) | protected get declaredCredential(): string | undefined {
    method resolvedApiKey (line 87) | protected set resolvedApiKey(key: string) {
    method check (line 95) | check(fn: CheckFn): this {
    method judge (line 109) | judge(fn: JudgeHandlerFn): this {
    method name (line 118) | get name(): string {
    method build (line 123) | protected build(): BuiltEval {
    method ensureBuilt (line 174) | ensureBuilt(): BuiltEval {
    method run (line 180) | async run(input: EvalInput): Promise<EvalScore> {

FILE: packages/@n8n/agents/src/sdk/evaluate.ts
  function extractText (line 8) | function extractText(messages: AgentMessage[]): string {
  type DatasetRow (line 16) | interface DatasetRow {
  type EvaluateConfig (line 32) | interface EvaluateConfig {
  function evaluate (line 58) | async function evaluate(agent: Agent, config: EvaluateConfig): Promise<E...
  function runWithInterrupts (line 128) | async function runWithInterrupts(

FILE: packages/@n8n/agents/src/sdk/guardrail.ts
  class Guardrail (line 3) | class Guardrail {
    method constructor (line 14) | constructor(name: string) {
    method type (line 18) | type(guardType: GuardrailType): this {
    method strategy (line 23) | strategy(strategy: GuardrailStrategy): this {
    method detect (line 28) | detect(types: PiiDetectionType[]): this {
    method threshold (line 33) | threshold(value: number): this {
    method build (line 38) | build(): BuiltGuardrail {

FILE: packages/@n8n/agents/src/sdk/mcp-client.ts
  class McpClient (line 30) | class McpClient {
    method constructor (line 45) | constructor(configs: McpServerConfig[], requireToolApproval = false) {
    method connect (line 73) | async connect(): Promise<void> {
    method listTools (line 83) | async listTools(): Promise<BuiltTool[]> {
    method close (line 98) | async close(): Promise<void> {
    method verify (line 120) | async verify(): Promise<McpVerifyResult> {
    method declaresApproval (line 164) | declaresApproval(): boolean {
    method doListTools (line 168) | private async doListTools(): Promise<BuiltTool[]> {
    method doClose (line 220) | private async doClose(): Promise<void> {

FILE: packages/@n8n/agents/src/sdk/memory.ts
  type ZodObjectSchema (line 12) | type ZodObjectSchema = z.ZodObject<z.ZodRawShape>;
  constant DEFAULT_LAST_MESSAGES (line 14) | const DEFAULT_LAST_MESSAGES = 10;
  class Memory (line 29) | class Memory {
    method lastMessageCount (line 45) | get lastMessageCount(): number {
    method storage (line 55) | storage(backend: 'memory' | BuiltMemory): this {
    method lastMessages (line 65) | lastMessages(count: number): this {
    method semanticRecall (line 71) | semanticRecall(config: SemanticRecallConfig): this {
    method structured (line 80) | structured(schema: ZodObjectSchema): this {
    method freeform (line 89) | freeform(template: string): this {
    method scope (line 100) | scope(s: 'resource' | 'thread'): this {
    method titleGeneration (line 114) | titleGeneration(config: boolean | TitleGenerationConfig): this {
    method build (line 132) | build(): MemoryConfig {

FILE: packages/@n8n/agents/src/sdk/message.ts
  function toDbMessage (line 7) | function toDbMessage(message: AgentMessage): AgentDbMessage {
  function isLlmMessage (line 14) | function isLlmMessage(message: AgentMessage): message is Message {
  function filterLlmMessages (line 18) | function filterLlmMessages(messages: AgentMessage[]): Message[] {

FILE: packages/@n8n/agents/src/sdk/network.ts
  type BuiltNetwork (line 5) | interface BuiltNetwork {
  class Network (line 23) | class Network {
    method constructor (line 32) | constructor(name: string) {
    method coordinator (line 37) | coordinator(a: Agent): this {
    method agent (line 43) | agent(a: Agent): this {
    method ensureBuilt (line 49) | private ensureBuilt(): BuiltNetwork {
    method name (line 55) | get name(): string {
    method run (line 60) | async run(prompt: string, options?: RunOptions): Promise<GenerateResul...
    method build (line 65) | protected build(): BuiltNetwork {

FILE: packages/@n8n/agents/src/sdk/provider-tools.ts
  type WebSearchConfig (line 3) | interface WebSearchConfig {
  method anthropicWebSearch (line 39) | anthropicWebSearch(config?: WebSearchConfig): BuiltProviderTool {
  method openaiImageGeneration (line 61) | openaiImageGeneration(): BuiltProviderTool {

FILE: packages/@n8n/agents/src/sdk/telemetry.ts
  type RedactFn (line 10) | type RedactFn = (data: Record<string, unknown>) => Record<string, unknown>;
  function redactValue (line 16) | function redactValue(value: unknown, redact: RedactFn): unknown {
  function redactEvent (line 41) | function redactEvent<T extends object>(event: T, redact: RedactFn): T {
  function wrapIntegrationWithRedaction (line 57) | function wrapIntegrationWithRedaction(
  function createOtlpTracer (line 96) | async function createOtlpTracer(endpoint: string): Promise<{
  class Telemetry (line 145) | class Telemetry {
    method credential (line 178) | credential(name: string): this {
    method declaredCredential (line 184) | get declaredCredential(): string | undefined {
    method resolvedApiKey (line 192) | set resolvedApiKey(key: string) {
    method enabled (line 197) | enabled(value: boolean): this {
    method functionId (line 203) | functionId(value: string): this {
    method metadata (line 209) | metadata(value: Record<string, AttributeValue>): this {
    method recordInputs (line 215) | recordInputs(value: boolean): this {
    method recordOutputs (line 221) | recordOutputs(value: boolean): this {
    method redact (line 231) | redact(fn: RedactFn): this {
    method integration (line 237) | integration(value: TelemetryIntegration): this {
    method tracer (line 248) | tracer(value: OpaqueTracer): this {
    method otlpEndpoint (line 260) | otlpEndpoint(value: string): this {
    method build (line 266) | async build(): Promise<BuiltTelemetry> {
    method shutdown (line 298) | static async shutdown(telemetry: BuiltTelemetry): Promise<void> {

FILE: packages/@n8n/agents/src/sdk/tool.ts
  constant APPROVAL_SUSPEND_SCHEMA (line 7) | const APPROVAL_SUSPEND_SCHEMA = z.object({
  constant APPROVAL_RESUME_SCHEMA (line 13) | const APPROVAL_RESUME_SCHEMA = z.object({
  type ApprovalConfig (line 17) | interface ApprovalConfig {
  function wrapToolForApproval (line 31) | function wrapToolForApproval(tool: BuiltTool, config: ApprovalConfig): B...
  type HandlerContext (line 66) | type HandlerContext<S, R> = S extends z.ZodTypeAny
  class Tool (line 90) | class Tool<
    method constructor (line 123) | constructor(name: string) {
    method description (line 128) | description(desc: string): this {
    method input (line 134) | input<S extends z.ZodTypeAny>(schema: S): Tool<S, TOutput, TSuspend, T...
    method output (line 141) | output<S extends z.ZodTypeAny>(schema: S): Tool<TInput, S, TSuspend, T...
    method suspend (line 148) | suspend<S extends z.ZodTypeAny>(schema: S): Tool<TInput, TOutput, S, T...
    method resume (line 155) | resume<R extends z.ZodTypeAny>(schema: R): Tool<TInput, TOutput, TSusp...
    method handler (line 165) | handler(
    method toMessage (line 175) | toMessage(toMessage: (output: z.infer<TOutput>) => AgentMessage): this {
    method toModelOutput (line 187) | toModelOutput(fn: (output: z.infer<TOutput>) => unknown): this {
    method requireApproval (line 193) | requireApproval(): this {
    method needsApprovalFn (line 199) | needsApprovalFn(fn: (args: z.infer<TInput>) => Promise<boolean> | bool...
    method providerOptions (line 210) | providerOptions(options: Record<string, JSONObject>): this {
    method build (line 221) | build(): BuiltTool {

FILE: packages/@n8n/agents/src/sdk/verify.ts
  type VerifyResult (line 1) | interface VerifyResult {
  function verify (line 24) | function verify(source: string): VerifyResult {

FILE: packages/@n8n/agents/src/storage/postgres-memory.ts
  type ThreadRow (line 8) | interface ThreadRow {
  type MessageRow (line 17) | interface MessageRow {
  type EmbeddingDimRow (line 26) | interface EmbeddingDimRow {
  type EmbeddingResultRow (line 30) | interface EmbeddingResultRow {
  function parseJsonSafe (line 36) | function parseJsonSafe(text: string): unknown {
  type PostgresConnectionConfig (line 44) | interface PostgresConnectionConfig {
  type PostgresMemoryConfig (line 57) | interface PostgresMemoryConfig {
  class PostgresMemory (line 86) | class PostgresMemory implements BuiltMemory {
    method constructor (line 95) | constructor(config: PostgresMemoryConfig) {
    method ensureInitialized (line 109) | private async ensureInitialized(): Promise<Pool> {
    method _initialize (line 117) | private async _initialize(): Promise<Pool> {
    method getThread (line 186) | async getThread(threadId: string): Promise<Thread | null> {
    method saveThread (line 207) | async saveThread(thread: Omit<Thread, 'createdAt' | 'updatedAt'>): Pro...
    method deleteThread (line 237) | async deleteThread(threadId: string): Promise<void> {
    method getMessages (line 267) | async getMessages(
    method saveMessages (line 324) | async saveMessages(args: {
    method deleteMessages (line 364) | async deleteMessages(messageIds: string[]): Promise<void> {
    method getWorkingMemory (line 387) | async getWorkingMemory(params: {
    method saveWorkingMemory (line 403) | async saveWorkingMemory(
    method ensureEmbeddingsTable (line 430) | private async ensureEmbeddingsTable(pool: Pool, dimension: number): Pr...
    method _initializeEmbeddingsTable (line 446) | private async _initializeEmbeddingsTable(pool: Pool, dimension: number...
    method saveEmbeddings (line 490) | async saveEmbeddings(opts: {
    method queryEmbeddings (line 540) | async queryEmbeddings(opts: {
    method close (line 592) | async close(): Promise<void> {

FILE: packages/@n8n/agents/src/storage/sqlite-memory.ts
  function parseJsonSafe (line 8) | function parseJsonSafe(text: string): unknown {
  function float32ToBuffer (line 17) | function float32ToBuffer(arr: number[]): Buffer {
  type SqliteMemoryConfig (line 22) | interface SqliteMemoryConfig {
  class SqliteMemory (line 27) | class SqliteMemory implements BuiltMemory {
    method constructor (line 36) | constructor(config: SqliteMemoryConfig) {
    method ensureInitialized (line 50) | private async ensureInitialized(): Promise<Client> {
    method _initialize (line 58) | private async _initialize(): Promise<Client> {
    method getThread (line 96) | async getThread(threadId: string): Promise<Thread | null> {
    method saveThread (line 118) | async saveThread(thread: Omit<Thread, 'createdAt' | 'updatedAt'>): Pro...
    method deleteThread (line 140) | async deleteThread(threadId: string): Promise<void> {
    method getMessages (line 163) | async getMessages(
    method saveMessages (line 216) | async saveMessages(args: {
    method deleteMessages (line 239) | async deleteMessages(messageIds: string[]): Promise<void> {
    method getWorkingMemory (line 265) | async getWorkingMemory(params: { threadId: string; resourceId?: string...
    method saveWorkingMemory (line 280) | async saveWorkingMemory(
    method ensureEmbeddingsTable (line 305) | private async ensureEmbeddingsTable(db: Client, dimension: number): Pr...
    method _initializeEmbeddingsTable (line 319) | private async _initializeEmbeddingsTable(db: Client, dimension: number...
    method saveEmbeddings (line 358) | async saveEmbeddings(opts: {
    method queryEmbeddings (line 395) | async queryEmbeddings(opts: {

FILE: packages/@n8n/agents/src/types/runtime/event.ts
  type AgentEvent (line 3) | const enum AgentEvent {
  type AgentEventData (line 13) | type AgentEventData =
  type AgentEventHandler (line 28) | type AgentEventHandler = (data: AgentEventData) => void;
  type AgentMiddleware (line 31) | interface AgentMiddleware {

FILE: packages/@n8n/agents/src/types/runtime/message-list.ts
  type SerializedMessageList (line 3) | interface SerializedMessageList {

FILE: packages/@n8n/agents/src/types/sdk/agent.ts
  type FinishReason (line 12) | type FinishReason = 'stop' | 'length' | 'content-filter' | 'tool-calls' ...
  type TokenUsage (line 14) | type TokenUsage<T extends Record<string, unknown> = Record<string, unkno...
  type ModelConfig (line 31) | type ModelConfig = string | { id: string; apiKey?: string; url?: string ...
  type AgentResult (line 33) | interface AgentResult {
  type StreamChunk (line 50) | type StreamChunk = ContentMetadata &
  type RunOptions (line 98) | interface RunOptions {
  type ExecutionOptions (line 102) | interface ExecutionOptions {
  type PersistedExecutionOptions (line 110) | interface PersistedExecutionOptions {
  type ToolResultEntry (line 114) | interface ToolResultEntry {
  type SubAgentUsage (line 122) | interface SubAgentUsage {
  type GenerateResult (line 131) | interface GenerateResult {
  type StreamResult (line 168) | interface StreamResult {
  type ResumeOptions (line 175) | interface ResumeOptions {
  type BuiltAgent (line 180) | interface BuiltAgent {
  type AgentRunState (line 224) | type AgentRunState =
  type AgentResumeData (line 233) | interface AgentResumeData {
  type PendingToolCall (line 240) | type PendingToolCall = {
  type SerializableAgentState (line 255) | interface SerializableAgentState {
  type AgentPersistenceOptions (line 266) | type AgentPersistenceOptions = {

FILE: packages/@n8n/agents/src/types/sdk/eval.ts
  type EvalInput (line 2) | interface EvalInput {
  type EvalScore (line 14) | interface EvalScore {
  type JudgeFn (line 22) | type JudgeFn = (prompt: string) => Promise<{ text: string }>;
  type JudgeInput (line 25) | interface JudgeInput extends EvalInput {
  type CheckFn (line 31) | type CheckFn = (input: EvalInput) => EvalScore | Promise<EvalScore>;
  type JudgeHandlerFn (line 34) | type JudgeHandlerFn = (input: JudgeInput) => EvalScore | Promise<EvalSco...
  type BuiltEval (line 37) | interface BuiltEval {
  type EvalRunResult (line 44) | interface EvalRunResult {
  type EvalResults (line 52) | interface EvalResults {

FILE: packages/@n8n/agents/src/types/sdk/guardrail.ts
  type GuardrailType (line 1) | type GuardrailType = 'pii' | 'prompt-injection' | 'moderation' | 'custom';
  type GuardrailStrategy (line 2) | type GuardrailStrategy = 'block' | 'redact' | 'warn';
  type PiiDetectionType (line 3) | type PiiDetectionType = 'email' | 'phone' | 'credit-card' | 'ssn' | 'add...
  type BuiltGuardrail (line 5) | interface BuiltGuardrail {

FILE: packages/@n8n/agents/src/types/sdk/mcp.ts
  type McpVerifyResult (line 1) | type McpVerifyResult =
  type McpServerConfig (line 5) | interface McpServerConfig {

FILE: packages/@n8n/agents/src/types/sdk/memory.ts
  type Thread (line 6) | interface Thread {
  type BuiltMemory (line 15) | interface BuiltMemory {
  type SemanticRecallConfig (line 83) | interface SemanticRecallConfig {
  type TitleGenerationConfig (line 93) | interface TitleGenerationConfig {
  type MemoryConfig (line 101) | interface MemoryConfig {
  type CheckpointStore (line 130) | interface CheckpointStore {

FILE: packages/@n8n/agents/src/types/sdk/message.ts
  type MessageRole (line 5) | type MessageRole = 'system' | 'user' | 'assistant' | 'tool';
  type MessageContent (line 7) | type MessageContent =
  type ContentMetadata (line 17) | interface ContentMetadata {
  type ContentCitation (line 22) | type ContentCitation = ContentMetadata & {
  type ContentText (line 53) | type ContentText = ContentMetadata & {
  type ContentReasoning (line 61) | type ContentReasoning = ContentMetadata & {
  type ContentFile (line 66) | type ContentFile = ContentMetadata & {
  type ContentToolCall (line 87) | type ContentToolCall = ContentMetadata & {
  type ContentToolResult (line 109) | type ContentToolResult = ContentMetadata & {
  type ContentInvalidToolCall (line 133) | type ContentInvalidToolCall = ContentMetadata & {
  type ContentProvider (line 157) | type ContentProvider = ContentMetadata & {
  type Message (line 163) | interface Message {
  type AgentMessageBase (line 172) | interface AgentMessageBase {
  type CustomAgentMessages (line 190) | interface CustomAgentMessages {
  type CustomAgentMessage (line 195) | type CustomAgentMessage = {
  type AgentMessage (line 205) | type AgentMessage = Message | CustomAgentMessage;
  type AgentDbMessage (line 207) | type AgentDbMessage = { id: string } & AgentMessage;

FILE: packages/@n8n/agents/src/types/sdk/provider.ts
  type Provider (line 6) | type Provider =
  type AnthropicThinkingConfig (line 24) | interface AnthropicThinkingConfig {
  type OpenAIThinkingConfig (line 29) | interface OpenAIThinkingConfig {
  type GoogleThinkingConfig (line 34) | interface GoogleThinkingConfig {
  type XaiThinkingConfig (line 41) | interface XaiThinkingConfig {
  type ThinkingConfigFor (line 51) | type ThinkingConfigFor<P> = P extends 'anthropic'
  type ThinkingConfig (line 62) | type ThinkingConfig =

FILE: packages/@n8n/agents/src/types/sdk/tool.ts
  type ToolContext (line 8) | interface ToolContext {
  type InterruptibleToolContext (line 13) | interface InterruptibleToolContext<S = unknown, R = unknown> {
  type BuiltTool (line 26) | interface BuiltTool {
  type BuiltProviderTool (line 68) | interface BuiltProviderTool {

FILE: packages/@n8n/agents/src/types/telemetry.ts
  type AttributeValue (line 4) | type AttributeValue = string | number | boolean | string[] | number[] | ...
  type OpaqueTracer (line 12) | type OpaqueTracer = unknown;
  type OpaqueTracerProvider (line 18) | interface OpaqueTracerProvider {
  type BuiltTelemetry (line 23) | interface BuiltTelemetry {

FILE: packages/@n8n/agents/src/types/utils/json.ts
  type JSONValue (line 5) | type JSONValue = null | string | number | boolean | JSONObject | JSONArray;
  type JSONObject (line 7) | type JSONObject = {
  type JSONArray (line 11) | type JSONArray = JSONValue[];

FILE: packages/@n8n/agents/src/utils/zod.ts
  function isZodSchema (line 5) | function isZodSchema(schema: ZodType | JSONSchema7): schema is ZodType {

FILE: packages/@n8n/agents/src/workspace/filesystem/base-filesystem.ts
  type FilesystemLifecycleHook (line 14) | type FilesystemLifecycleHook = (args: {
  type BaseFilesystemOptions (line 18) | interface BaseFilesystemOptions {
  method constructor (line 36) | constructor(options?: BaseFilesystemOptions) {
  method _init (line 41) | async _init(): Promise<void> {
  method executeInit (line 61) | private async executeInit(): Promise<void> {
  method init (line 80) | async init(): Promise<void> {
  method ensureReady (line 84) | protected async ensureReady(): Promise<void> {
  method _destroy (line 93) | async _destroy(): Promise<void> {
  method executeDestroy (line 111) | private async executeDestroy(): Promise<void> {
  method destroy (line 136) | async destroy(): Promise<void> {

FILE: packages/@n8n/agents/src/workspace/lifecycle.ts
  type LifecycleMethod (line 1) | type LifecycleMethod = 'init' | 'start' | 'stop' | 'destroy';
  type LifecycleTarget (line 3) | interface LifecycleTarget {
  function callLifecycle (line 14) | async function callLifecycle(

FILE: packages/@n8n/agents/src/workspace/process.ts
  method constructor (line 65) | constructor(options?: Pick<SpawnProcessOptions, 'onStdout' | 'onStderr'>) {
  method wait (line 80) | async wait(options?: {
  method stdout (line 98) | get stdout(): string {
  method stderr (line 103) | get stderr(): string {
  method emitStdout (line 111) | protected emitStdout(data: string): void {
  method emitStderr (line 121) | protected emitStderr(data: string): void {
  method addStdoutListener (line 127) | addStdoutListener(listener: (data: string) => void): void {
  method addStderrListener (line 132) | addStderrListener(listener: (data: string) => void): void {
  method reader (line 137) | get reader(): Readable {
  method writer (line 151) | get writer(): Writable {

FILE: packages/@n8n/agents/src/workspace/sandbox/base-sandbox.ts
  function shellQuote (line 15) | function shellQuote(arg: string): string {
  method constructor (line 35) | constructor(options?: BaseSandboxOptions) {
  method _start (line 48) | async _start(): Promise<void> {
  method _stop (line 68) | async _stop(): Promise<void> {
  method _destroy (line 84) | async _destroy(): Promise<void> {
  method ensureRunning (line 105) | async ensureRunning(): Promise<void> {
  method executeCommand (line 124) | async executeCommand(
  method getInstructions (line 141) | getInstructions(): string {
  method executeStart (line 145) | private async executeStart(): Promise<void> {
  method executeStop (line 161) | private async executeStop(): Promise<void> {
  method executeDestroy (line 177) | private async executeDestroy(): Promise<void> {

FILE: packages/@n8n/agents/src/workspace/tools/append-file.ts
  function createAppendFileTool (line 7) | function createAppendFileTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/copy-file.ts
  function createCopyFileTool (line 7) | function createCopyFileTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/delete-file.ts
  function createDeleteFileTool (line 7) | function createDeleteFileTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/execute-command.ts
  function createExecuteCommandTool (line 7) | function createExecuteCommandTool(sandbox: WorkspaceSandbox): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/file-stat.ts
  function createFileStatTool (line 7) | function createFileStatTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/list-files.ts
  function createListFilesTool (line 7) | function createListFilesTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/mkdir.ts
  function createMkdirTool (line 7) | function createMkdirTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/move-file.ts
  function createMoveFileTool (line 7) | function createMoveFileTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/process-tools.ts
  function createListProcessesTool (line 7) | function createListProcessesTool(processes: SandboxProcessManager): Buil...
  function createKillProcessTool (line 29) | function createKillProcessTool(processes: SandboxProcessManager): BuiltT...

FILE: packages/@n8n/agents/src/workspace/tools/read-file.ts
  function createReadFileTool (line 7) | function createReadFileTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/rmdir.ts
  function createRmdirTool (line 7) | function createRmdirTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/tools/workspace-tools.ts
  type WorkspaceLike (line 16) | interface WorkspaceLike {
  function createWorkspaceTools (line 21) | function createWorkspaceTools(workspace: WorkspaceLike): BuiltTool[] {

FILE: packages/@n8n/agents/src/workspace/tools/write-file.ts
  function createWriteFileTool (line 7) | function createWriteFileTool(filesystem: WorkspaceFilesystem): BuiltTool {

FILE: packages/@n8n/agents/src/workspace/types.ts
  type ProviderStatus (line 3) | type ProviderStatus =
  type FileContent (line 15) | type FileContent = string | Buffer | Uint8Array;
  type FileEntry (line 17) | interface FileEntry {
  type FileStat (line 23) | interface FileStat {
  type ReadOptions (line 32) | interface ReadOptions {
  type WriteOptions (line 36) | interface WriteOptions {
  type ListOptions (line 41) | interface ListOptions {
  type RemoveOptions (line 46) | interface RemoveOptions {
  type CopyOptions (line 51) | interface CopyOptions {
  type MountConfig (line 56) | interface MountConfig {
  type WorkspaceFilesystem (line 61) | interface WorkspaceFilesystem {
  type CommandResult (line 89) | interface CommandResult {
  type CommandOptions (line 101) | interface CommandOptions {
  type ExecuteCommandOptions (line 110) | type ExecuteCommandOptions = CommandOptions;
  type SandboxInfo (line 112) | interface SandboxInfo {
  type WorkspaceSandbox (line 125) | interface WorkspaceSandbox {
  type SpawnProcessOptions (line 145) | type SpawnProcessOptions = CommandOptions;
  type ProcessInfo (line 147) | interface ProcessInfo {
  type BaseSandboxOptions (line 155) | interface BaseSandboxOptions {
  type LocalFilesystemOptions (line 162) | interface LocalFilesystemOptions {
  type LocalSandboxOptions (line 170) | interface LocalSandboxOptions {
  type DaytonaSandboxOptions (line 178) | interface DaytonaSandboxOptions {
  type WorkspaceConfig (line 196) | interface WorkspaceConfig {
  type MountResult (line 203) | interface MountResult {

FILE: packages/@n8n/agents/src/workspace/workspace.ts
  class Workspace (line 13) | class Workspace {
    method constructor (line 24) | constructor(config: WorkspaceConfig) {
    method status (line 31) | get status(): ProviderStatus {
    method filesystem (line 35) | get filesystem(): WorkspaceFilesystem | undefined {
    method sandbox (line 39) | get sandbox(): WorkspaceSandbox | undefined {
    method init (line 43) | async init(): Promise<void> {
    method destroy (line 59) | async destroy(): Promise<void> {
    method getInstructions (line 80) | getInstructions(): string {
    method getTools (line 93) | getTools(): BuiltTool[] {
    method performInit (line 97) | private async performInit(): Promise<void> {
    method performDestroy (line 126) | private async performDestroy(): Promise<void> {

FILE: packages/@n8n/ai-utilities/integration-tests/openai.fixtures.ts
  function createSSEStream (line 542) | function createSSEStream(events: Array<{ type: string; data: unknown }>) {
  function createMockHttpRequests (line 569) | function createMockHttpRequests() {

FILE: packages/@n8n/ai-utilities/integration-tests/openai.ts
  type OpenAITool (line 20) | type OpenAITool =
  type OpenAIToolChoice (line 32) | type OpenAIToolChoice = 'auto' | 'required' | 'none' | { type: 'function...
  type ResponsesInputItem (line 34) | type ResponsesInputItem =
  type OpenAIResponsesRequest (line 50) | interface OpenAIResponsesRequest {
  type OpenAIResponsesResponse (line 65) | interface OpenAIResponsesResponse {
  type ResponsesOutputItem (line 89) | type ResponsesOutputItem =
  type OpenAIStreamEvent (line 115) | interface OpenAIStreamEvent {
  function genericMessagesToResponsesInput (line 143) | function genericMessagesToResponsesInput(messages: Message[]): {
  function genericToolToResponsesTool (line 241) | function genericToolToResponsesTool(tool: Tool): OpenAITool {
  function parseResponsesOutput (line 261) | function parseResponsesOutput(output: ResponsesOutputItem[]): {
  function parseTokenUsage (line 293) | function parseTokenUsage(
  type OpenAIChatModelConfig (line 315) | interface OpenAIChatModelConfig extends ChatModelConfig {
  type RequestConfig (line 322) | interface RequestConfig {
  class OpenAIChatModel (line 337) | class OpenAIChatModel extends BaseChatModel<OpenAIChatModelConfig> {
    method constructor (line 340) | constructor(
    method getTools (line 349) | private getTools(config?: OpenAIChatModelConfig) {
    method generate (line 355) | async generate(messages: Message[], config?: OpenAIChatModelConfig): P...
    method stream (line 434) | async *stream(messages: Message[], config?: OpenAIChatModelConfig): As...

FILE: packages/@n8n/ai-utilities/scripts/copy-tokenizer-json.js
  function copyTokenizerJsonFiles (line 5) | function copyTokenizerJsonFiles(baseDir) {

FILE: packages/@n8n/ai-utilities/src/__tests__/adapters/langchain-chat-model.test.ts
  function createMockChatModel (line 34) | function createMockChatModel(

FILE: packages/@n8n/ai-utilities/src/__tests__/converters/message-roundtrip.test.ts
  function roundTrip (line 19) | function roundTrip(original: Message): Message {
  function roundTrip (line 388) | function roundTrip(original: BaseMessage): BaseMessage {
  function normalizeContent (line 400) | function normalizeContent(
  function expectLcEqual (line 409) | function expectLcEqual(actual: BaseMessage, expected: BaseMessage) {

FILE: packages/@n8n/ai-utilities/src/__tests__/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.test.ts
  class MockHttpError (line 3) | class MockHttpError extends Error {
    method constructor (line 6) | constructor(message: string, code: number) {
  class MockAbortError (line 24) | class MockAbortError extends Error {
    method constructor (line 25) | constructor() {
    method constructor (line 40) | constructor() {
  class MockAbortError (line 37) | class MockAbortError extends Error {
    method constructor (line 25) | constructor() {
    method constructor (line 40) | constructor() {

FILE: packages/@n8n/ai-utilities/src/__tests__/utils/sse.test.ts
  function createStreamFromChunks (line 5) | function createStreamFromChunks(chunks: string[]): AsyncIterableIterator...
  function collectEvents (line 15) | async function collectEvents(

FILE: packages/@n8n/ai-utilities/src/adapters/langchain-chat-model.ts
  class LangchainChatModelAdapter (line 18) | class LangchainChatModelAdapter<
    method constructor (line 21) | constructor(
    method _llmType (line 52) | _llmType(): string {
    method _generate (line 56) | async _generate(
    method _streamResponseChunks (line 108) | async *_streamResponseChunks(
    method bindTools (line 221) | bindTools(

FILE: packages/@n8n/ai-utilities/src/adapters/langchain-history.ts
  class LangchainHistoryAdapter (line 7) | class LangchainHistoryAdapter extends BaseListChatMessageHistory {
    method constructor (line 10) | constructor(private readonly history: ChatHistory) {
    method getMessages (line 14) | async getMessages(): Promise<BaseMessage[]> {
    method addMessage (line 19) | async addMessage(message: BaseMessage): Promise<void> {
    method addMessages (line 23) | async addMessages(messages: BaseMessage[]): Promise<void> {
    method clear (line 27) | async clear(): Promise<void> {

FILE: packages/@n8n/ai-utilities/src/adapters/langchain-memory.ts
  class LangchainMemoryAdapter (line 8) | class LangchainMemoryAdapter extends LangchainBaseChatMemory {
    method constructor (line 9) | constructor(private readonly memory: ChatMemory) {
    method memoryKeys (line 18) | get memoryKeys(): string[] {
    method loadMemoryVariables (line 22) | async loadMemoryVariables(_values: InputValues): Promise<MemoryVariabl...
    method saveContext (line 29) | async saveContext(inputValues: InputValues, outputValues: OutputValues...
    method clear (line 35) | async clear(): Promise<void> {

FILE: packages/@n8n/ai-utilities/src/ai-node-sdk-version.ts
  constant AI_NODE_SDK_VERSION (line 3) | const AI_NODE_SDK_VERSION: number = 1;

FILE: packages/@n8n/ai-utilities/src/chat-model/base.ts
  method constructor (line 9) | constructor(
  method withTools (line 24) | withTools(tools: Tool[]): ChatModel<TConfig> {
  method mergeConfig (line 35) | protected mergeConfig(config?: TConfig): ChatModelConfig {

FILE: packages/@n8n/ai-utilities/src/converters/message.ts
  function isN8nTextBlock (line 7) | function isN8nTextBlock(block: N8nMessages.MessageContent): block is N8n...
  function isN8nReasoningBlock (line 10) | function isN8nReasoningBlock(
  function isN8nFileBlock (line 15) | function isN8nFileBlock(block: N8nMessages.MessageContent): block is N8n...
  function isN8nToolCallBlock (line 18) | function isN8nToolCallBlock(
  function isN8nInvalidToolCallBlock (line 23) | function isN8nInvalidToolCallBlock(
  function isN8nToolResultBlock (line 28) | function isN8nToolResultBlock(
  function isN8nCitationBlock (line 33) | function isN8nCitationBlock(
  function isN8nProviderBlock (line 38) | function isN8nProviderBlock(
  function fromLcRole (line 44) | function fromLcRole(role: LangchainMessages.MessageType): N8nMessages.Me...
  function isTextBlock (line 58) | function isTextBlock(
  function isReasoningBlock (line 63) | function isReasoningBlock(
  function isFileBlock (line 68) | function isFileBlock(
  function isToolCallBlock (line 79) | function isToolCallBlock(
  function isInvalidToolCallBlock (line 84) | function isInvalidToolCallBlock(
  function isToolResultBlock (line 89) | function isToolResultBlock(
  function isCitationBlock (line 94) | function isCitationBlock(block: unknown): block is LangchainMessages.Con...
  function isNonStandardBlock (line 99) | function isNonStandardBlock(
  function fromLcContent (line 105) | function fromLcContent(
  function fromLcMessage (line 191) | function fromLcMessage(msg: LangchainMessages.BaseMessage): N8nMessages....
  function toLcContent (line 256) | function toLcContent(block: N8nMessages.MessageContent): LangchainMessag...
  function toLcMessage (line 320) | function toLcMessage(message: Message): LangchainMessages.BaseMessage {

FILE: packages/@n8n/ai-utilities/src/converters/tool.ts
  function fromLcTool (line 13) | function fromLcTool(tool: LangchainChatModels.BindToolsInput): N8nTools....
  function getParametersJsonSchema (line 54) | function getParametersJsonSchema(tool: N8nTools.FunctionTool): JSONSchem...

FILE: packages/@n8n/ai-utilities/src/guards.ts
  function hasMethods (line 7) | function hasMethods<T>(obj: unknown, ...methodNames: Array<string | symb...
  function isBaseChatMemory (line 17) | function isBaseChatMemory(obj: unknown) {
  function isBaseChatMessageHistory (line 21) | function isBaseChatMessageHistory(obj: unknown) {
  function isChatInstance (line 25) | function isChatInstance(model: unknown): model is BaseChatModel {
  function isToolsInstance (line 31) | function isToolsInstance(model: unknown): model is Tool {

FILE: packages/@n8n/ai-utilities/src/memory/base-chat-history.ts
  method addMessages (line 9) | async addMessages(messages: Message[]): Promise<void> {

FILE: packages/@n8n/ai-utilities/src/memory/windowed-chat-memory.ts
  type WindowedChatMemoryConfig (line 5) | interface WindowedChatMemoryConfig {
  class WindowedChatMemory (line 10) | class WindowedChatMemory extends BaseChatMemory {
    method constructor (line 14) | constructor(chatHistory: ChatHistory, config?: WindowedChatMemoryConfi...
    method loadMessages (line 20) | async loadMessages(): Promise<Message[]> {
    method saveTurn (line 36) | async saveTurn(input: string, output: string): Promise<void> {
    method clear (line 50) | async clear(): Promise<void> {

FILE: packages/@n8n/ai-utilities/src/suppliers/supplyMemory.ts
  type SupplyMemoryOptions (line 7) | interface SupplyMemoryOptions {
  function supplyMemory (line 11) | function supplyMemory(

FILE: packages/@n8n/ai-utilities/src/suppliers/supplyModel.ts
  type OpenAiModel (line 13) | type OpenAiModel = OpenAIModelOptions & {
  type SupplyModelOptions (line 16) | type SupplyModelOptions = ChatModel | OpenAiModel;
  function isOpenAiModel (line 18) | function isOpenAiModel(model: SupplyModelOptions): model is OpenAiModel {
  function getOpenAiModel (line 22) | function getOpenAiModel(ctx: ISupplyDataFunctions, model: OpenAiModel) {
  function supplyModel (line 85) | function supplyModel(ctx: ISupplyDataFunctions, model: SupplyModelOption...

FILE: packages/@n8n/ai-utilities/src/types/chat-model.ts
  type ChatModelConfig (line 5) | interface ChatModelConfig {
  type ChatModel (line 67) | interface ChatModel<TConfig extends ChatModelConfig = ChatModelConfig> {

FILE: packages/@n8n/ai-utilities/src/types/json.ts
  type JSONValue (line 5) | type JSONValue = null | string | number | boolean | JSONObject | JSONArray;
  type JSONObject (line 7) | type JSONObject = {
  type JSONArray (line 11) | type JSONArray = JSONValue[];

FILE: packages/@n8n/ai-utilities/src/types/memory.ts
  type ChatHistory (line 3) | interface ChatHistory {
  type ChatMemory (line 10) | interface ChatMemory {

FILE: packages/@n8n/ai-utilities/src/types/message.ts
  type MessageRole (line 1) | type MessageRole = 'system' | 'user' | 'assistant' | 'tool';
  type MessageContent (line 3) | type MessageContent =
  type ContentMetadata (line 13) | interface ContentMetadata {
  type ContentCitation (line 17) | type ContentCitation = ContentMetadata & {
  type ContentText (line 48) | type ContentText = ContentMetadata & {
  type ContentReasoning (line 56) | type ContentReasoning = ContentMetadata & {
  type ContentFile (line 61) | type ContentFile = ContentMetadata & {
  type ContentToolCall (line 82) | type ContentToolCall = ContentMetadata & {
  type ContentToolResult (line 102) | type ContentToolResult = ContentMetadata & {
  type ContentInvalidToolCall (line 121) | type ContentInvalidToolCall = ContentMetadata & {
  type ContentProvider (line 145) | type ContentProvider = ContentMetadata & {
  type Message (line 150) | interface Message {

FILE: packages/@n8n/ai-utilities/src/types/openai.ts
  type ReasoningEffort (line 3) | type ReasoningEffort = 'none' | 'minimal' | 'low' | 'medium' | 'high' | ...
  type VerbosityParam (line 4) | type VerbosityParam = 'low' | 'medium' | 'high' | null;
  type OpenAIModelOptions (line 6) | interface OpenAIModelOptions {

FILE: packages/@n8n/ai-utilities/src/types/output.ts
  type FinishReason (line 3) | type FinishReason = 'stop' | 'length' | 'content-filter' | 'tool-calls' ...
  type TokenUsage (line 5) | type TokenUsage<T extends Record<string, unknown> = Record<string, unkno...
  type GenerateResult (line 18) | interface GenerateResult {
  type StreamChunk (line 33) | type StreamChunk = ContentMetadata &

FILE: packages/@n8n/ai-utilities/src/types/tool.ts
  type FunctionTool (line 4) | interface FunctionTool {
  type ProviderTool (line 32) | interface ProviderTool<TArgs extends Record<string, unknown> = Record<st...
  type Tool (line 38) | type Tool = FunctionTool | ProviderTool;
  type ToolCall (line 42) | interface ToolCall {
  type ToolResult (line 67) | interface ToolResult {

FILE: packages/@n8n/ai-utilities/src/utils/embeddings-input-validation.ts
  function validateEmbedQueryInput (line 13) | function validateEmbedQueryInput(query: unknown, node: INode): string {
  function validateEmbedDocumentsInput (line 32) | function validateEmbedDocumentsInput(documents: unknown, node: INode): s...

FILE: packages/@n8n/ai-utilities/src/utils/failed-attempt-handler/n8nDefaultFailedAttemptHandler.ts
  constant STATUS_NO_RETRY (line 1) | const STATUS_NO_RETRY = [

FILE: packages/@n8n/ai-utilities/src/utils/fromai-tool-factory.ts
  type ToolFunc (line 7) | type ToolFunc = (
  type CreateToolOptions (line 12) | interface CreateToolOptions {
  function extractFromAIParameters (line 26) | function extractFromAIParameters(nodeParameters: INodeParameters): FromA...
  function createZodSchemaFromArgs (line 41) | function createZodSchemaFromArgs(args: FromAIArgument[]): z.ZodObject<z....
  function createToolFromNode (line 57) | function createToolFromNode(

FILE: packages/@n8n/ai-utilities/src/utils/helpers.ts
  function getMetadataFiltersValues (line 3) | function getMetadataFiltersValues(
  function hasLongSequentialRepeat (line 37) | function hasLongSequentialRepeat(text: string, threshold = 1000): boolean {

FILE: packages/@n8n/ai-utilities/src/utils/http-proxy-agent.ts
  type AgentTimeoutOptions (line 9) | interface AgentTimeoutOptions {
  constant DEFAULT_TIMEOUT (line 18) | const DEFAULT_TIMEOUT = parseInt(process.env.N8N_AI_TIMEOUT_MAX ?? '3600...
  function getProxyUrlFromEnv (line 31) | function getProxyUrlFromEnv(targetUrl?: string): string {
  function getProxyAgent (line 50) | function getProxyAgent(targetUrl?: string, timeoutOptions?: AgentTimeout...
  function proxyFetch (line 79) | async function proxyFetch(
  function getNodeProxyAgent (line 101) | function getNodeProxyAgent(targetUrl?: string) {

FILE: packages/@n8n/ai-utilities/src/utils/log-ai-event.ts
  function logAiEvent (line 4) | function logAiEvent(

FILE: packages/@n8n/ai-utilities/src/utils/log-wrapper.ts
  function callMethodAsync (line 38) | async function callMethodAsync<T>(
  function callMethodSync (line 80) | function callMethodSync<T>(
  function logWrapper (line 109) | function logWrapper<

FILE: packages/@n8n/ai-utilities/src/utils/n8n-binary-loader.ts
  constant SUPPORTED_MIME_TYPES (line 22) | const SUPPORTED_MIME_TYPES = {
  class N8nBinaryLoader (line 32) | class N8nBinaryLoader {
    method constructor (line 33) | constructor(
    method processAll (line 40) | async processAll(items?: INodeExecutionData[]): Promise<Document[]> {
    method validateMimeType (line 54) | private async validateMimeType(
    method getFilePathOrBlob (line 86) | private async getFilePathOrBlob(
    method getLoader (line 104) | private async getLoader(
    method loadDocuments (line 158) | private async loadDocuments(
    method cleanupTmpFileIfNeeded (line 166) | private async cleanupTmpFileIfNeeded(
    method processItem (line 174) | async processItem(item: INodeExecutionData, itemIndex: number): Promis...
    method processItemByKey (line 198) | async processItemByKey(

FILE: packages/@n8n/ai-utilities/src/utils/n8n-json-loader.ts
  class N8nJsonLoader (line 14) | class N8nJsonLoader {
    method constructor (line 15) | constructor(
    method processAll (line 21) | async processAll(items?: INodeExecutionData[]): Promise<Document[]> {
    method processItem (line 35) | async processItem(item: INodeExecutionData, itemIndex: number): Promis...

FILE: packages/@n8n/ai-utilities/src/utils/n8n-llm-tracing.ts
  type TokensUsageParser (line 18) | type TokensUsageParser = (result: LLMResult) => {
  type RunDetail (line 24) | type RunDetail = {
  constant TIKTOKEN_ESTIMATE_MODEL (line 30) | const TIKTOKEN_ESTIMATE_MODEL = 'gpt-4o';
  class N8nLlmTracing (line 31) | class N8nLlmTracing extends BaseCallbackHandler {
    method constructor (line 69) | constructor(
    method estimateTokensFromGeneration (line 80) | async estimateTokensFromGeneration(generations: LLMResult['generations...
    method estimateTokensFromStringList (line 85) | async estimateTokensFromStringList(list: string[]) {
    method handleLLMEnd (line 90) | async handleLLMEnd(output: LLMResult, runId: string) {
    method handleLLMStart (line 158) | async handleLLMStart(llm: Serialized, prompts: string[], runId: string) {
    method handleLLMError (line 191) | async handleLLMError(error: IDataObject | Error, runId: string, parent...
    method setParentRunIndex (line 232) | setParentRunIndex(runIndex: number) {

FILE: packages/@n8n/ai-utilities/src/utils/shared-fields.ts
  function getTemplateNoticeField (line 37) | function getTemplateNoticeField(templateId: number): INodeProperties {
  function getBatchingOptionFields (line 46) | function getBatchingOptionFields(
  type AllowedConnectionTypes (line 103) | type AllowedConnectionTypes =
  function determineArticle (line 110) | function determineArticle(nextWord: string): string {
  function getConnectionHintNoticeField (line 125) | function getConnectionHintNoticeField(

FILE: packages/@n8n/ai-utilities/src/utils/sse.ts
  type ServerSentEventMessage (line 1) | interface ServerSentEventMessage {
  function processLine (line 74) | function processLine(line: string): ServerSentEventMessage | null {
  function processField (line 112) | function processField(name: string, value: string): void {
  function hasEventContent (line 147) | function hasEventContent(): boolean {
  function finalizeEvent (line 152) | function finalizeEvent(): ServerSentEventMessage {

FILE: packages/@n8n/ai-utilities/src/utils/tokenizer/tiktoken.ts
  function getEncoding (line 15) | async function getEncoding(encoding: TiktokenEncoding): Promise<Tiktoken> {
  function encodingForModel (line 43) | async function encodingForModel(model: TiktokenModel): Promise<Tiktoken> {

FILE: packages/@n8n/ai-utilities/src/utils/tokenizer/token-estimator.ts
  constant MODEL_CHAR_PER_TOKEN_RATIOS (line 15) | const MODEL_CHAR_PER_TOKEN_RATIOS: Record<string, number> = {
  function estimateTokensByCharCount (line 33) | function estimateTokensByCharCount(text: string, model: string = 'cl100k...
  function estimateTextSplitsByTokens (line 70) | function estimateTextSplitsByTokens(
  function estimateTokensFromStringList (line 129) | async function estimateTokensFromStringList(

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/MemoryManager/MemoryCalculator.ts
  constant FLOAT_SIZE_BYTES (line 7) | const FLOAT_SIZE_BYTES = 8;
  constant CHAR_SIZE_BYTES (line 8) | const CHAR_SIZE_BYTES = 2;
  constant VECTOR_OVERHEAD_BYTES (line 9) | const VECTOR_OVERHEAD_BYTES = 200;
  constant EMBEDDING_DIMENSIONS (line 10) | const EMBEDDING_DIMENSIONS = 1536;
  constant EMBEDDING_SIZE_BYTES (line 11) | const EMBEDDING_SIZE_BYTES = EMBEDDING_DIMENSIONS * FLOAT_SIZE_BYTES;
  constant AVG_METADATA_SIZE_BYTES (line 12) | const AVG_METADATA_SIZE_BYTES = 100;
  class MemoryCalculator (line 17) | class MemoryCalculator implements IMemoryCalculator {
    method estimateBatchSize (line 21) | estimateBatchSize(documents: Document[]): number {
    method calculateVectorStoreSize (line 61) | calculateVectorStoreSize(vectorStore: MemoryVectorStore): number {

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/MemoryManager/MemoryVectorStoreManager.ts
  class MemoryVectorStoreManager (line 15) | class MemoryVectorStoreManager {
    method constructor (line 40) | protected constructor(
    method getInstance (line 69) | static getInstance(
    method setupTtlCleanup (line 91) | private setupTtlCleanup(): void {
    method handleCleanup (line 114) | private handleCleanup(removedKeys: string[], freedBytes: number, reaso...
    method getMemoryKeysList (line 131) | getMemoryKeysList(): string[] {
    method getVectorStore (line 138) | async getVectorStore(memoryKey: string): Promise<MemoryVectorStore> {
    method clearStoreMetadata (line 163) | protected clearStoreMetadata(memoryKey: string): void {
    method getMemoryUsage (line 175) | getMemoryUsage(): number {
    method getMemoryUsageFormatted (line 182) | getMemoryUsageFormatted(): string {
    method recalculateMemoryUsage (line 190) | recalculateMemoryUsage(): void {
    method addDocuments (line 211) | async addDocuments(
    method getStats (line 268) | getStats(): VectorStoreStats {

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/MemoryManager/StoreCleanupService.ts
  class StoreCleanupService (line 8) | class StoreCleanupService implements IStoreCleanupService {
    method constructor (line 16) | constructor(
    method isStoreInactive (line 31) | isStoreInactive(metadata: VectorStoreMetadata): boolean {
    method cleanupInactiveStores (line 45) | cleanupInactiveStores(): void {
    method cleanupOldestStores (line 79) | cleanupOldestStores(requiredBytes: number): void {

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/MemoryManager/config.ts
  constant DEFAULT_MAX_MEMORY_MB (line 4) | const DEFAULT_MAX_MEMORY_MB = -1;
  constant DEFAULT_INACTIVE_TTL_HOURS (line 5) | const DEFAULT_INACTIVE_TTL_HOURS = -1;
  function getConfig (line 10) | function getConfig(): MemoryVectorStoreConfig {
  function mbToBytes (line 38) | function mbToBytes(mb: number): number {
  function hoursToMs (line 47) | function hoursToMs(hours: number): number {

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/MemoryManager/test/MemoryCalculator.test.ts
  function createTestEmbedding (line 7) | function createTestEmbedding(dimensions = 1536, initialValue = 0.1, mult...

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/MemoryManager/test/MemoryVectorStoreManager.test.ts
  function createTestEmbedding (line 10) | function createTestEmbedding(dimensions = 1536, initialValue = 0.1, mult...

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/MemoryManager/types.ts
  type MemoryVectorStoreConfig (line 7) | interface MemoryVectorStoreConfig {
  type VectorStoreMetadata (line 22) | interface VectorStoreMetadata {
  type StoreStats (line 31) | interface StoreStats {
  type VectorStoreStats (line 45) | interface VectorStoreStats {
  type IMemoryCalculator (line 59) | interface IMemoryCalculator {
  type IStoreCleanupService (line 67) | interface IStoreCleanupService {

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/constants.ts
  constant DEFAULT_OPERATION_MODES (line 6) | const DEFAULT_OPERATION_MODES: NodeOperationMode[] = [
  constant OPERATION_MODE_DESCRIPTIONS (line 13) | const OPERATION_MODE_DESCRIPTIONS: INodePropertyOptions[] = [

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/createVectorStoreNode.test.ts
  constant DEFAULT_PARAMETERS (line 30) | const DEFAULT_PARAMETERS = {
  constant MOCK_DOCUMENTS (line 36) | const MOCK_DOCUMENTS: Array<[DocumentInterface, number]> = [
  constant MOCK_SEARCH_VALUE (line 57) | const MOCK_SEARCH_VALUE = 'search value';
  constant MOCK_EMBEDDED_SEARCH_VALUE (line 58) | const MOCK_EMBEDDED_SEARCH_VALUE = [1, 2, 3];

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/createVectorStoreNode.ts
  method execute (line 280) | async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
  method supplyData (line 338) | async supplyData(this: ISupplyDataFunctions, itemIndex: number): Promise...

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/operations/__tests__/insertOperation.test.ts
  function createMockAbortSignal (line 57) | function createMockAbortSignal(aborted = false): AbortSignal {
  function createNodeParameterMock (line 70) | function createNodeParameterMock(batchSize?: number) {

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/operations/insertOperation.ts
  function handleInsertOperation (line 17) | async function handleInsertOperation<T extends VectorStore = VectorStore>(

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/operations/loadOperation.ts
  function handleLoadOperation (line 15) | async function handleLoadOperation<T extends VectorStore = VectorStore>(

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolExecuteOperation.ts
  function handleRetrieveAsToolExecuteOperation (line 16) | async function handleRetrieveAsToolExecuteOperation<T extends VectorStor...

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/operations/retrieveAsToolOperation.ts
  function handleRetrieveAsToolOperation (line 16) | async function handleRetrieveAsToolOperation<T extends VectorStore = Vec...

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/operations/retrieveOperation.ts
  function handleRetrieveOperation (line 15) | async function handleRetrieveOperation<T extends VectorStore = VectorSto...

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/operations/updateOperation.ts
  function handleUpdateOperation (line 16) | async function handleUpdateOperation<T extends VectorStore = VectorStore>(

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/types.ts
  type NodeOperationMode (line 19) | type NodeOperationMode = 'insert' | 'load' | 'retrieve' | 'update' | 're...
  type NodeMeta (line 21) | interface NodeMeta {
  type VectorStoreNodeConstructorArgs (line 36) | interface VectorStoreNodeConstructorArgs<T extends VectorStore = VectorS...

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/createVectorStoreNode/utils.ts
  function transformDescriptionForOperationMode (line 11) | function transformDescriptionForOperationMode(
  function isUpdateSupported (line 25) | function isUpdateSupported<T extends VectorStore>(
  function getOperationModeOptions (line 35) | function getOperationModeOptions<T extends VectorStore>(

FILE: packages/@n8n/ai-utilities/src/utils/vector-store/processDocuments.ts
  function processDocuments (line 7) | async function processDocuments(
  function processDocument (line 28) | async function processDocument(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/cli.test.ts
  function createMockWorkflow (line 100) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {
  function createMockArgs (line 105) | function createMockArgs(overrides: Record<string, unknown> = {}) {
  function createMockEnvironment (line 128) | function createMockEnvironment() {
  function createMockAgentInstance (line 146) | function createMockAgentInstance(workflowJSON: SimpleWorkflow = createMo...
  function createMockSummary (line 159) | function createMockSummary(overrides: Record<string, unknown> = {}) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/csv-prompt-loader.test.ts
  function writeTempCsv (line 14) | function writeTempCsv(filename: string, content: string): string {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/evaluators/llm-judge.test.ts
  function createMockWorkflow (line 23) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {
  function createMockEvalResult (line 28) | function createMockEvalResult(overrides: Record<string, unknown> = {}) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/evaluators/pairwise.test.ts
  function createMockWorkflow (line 24) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {
  function createMockPanelResult (line 29) | function createMockPanelResult(
  type PairwiseFeedback (line 72) | type PairwiseFeedback = { evaluator: string; metric: string; score: numb...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/evaluators/programmatic.test.ts
  function createMockWorkflow (line 21) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {
  function createMockEvaluationResult (line 26) | function createMockEvaluationResult(
  type ProgrammaticFeedback (line 59) | type ProgrammaticFeedback = {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/evaluators/similarity.test.ts
  function createMockWorkflow (line 23) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {
  function createMockSimilarityResult (line 28) | function createMockSimilarityResult(
  type SimilarityFeedback (line 45) | type SimilarityFeedback = { evaluator: string; metric: string; score: nu...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/lifecycle.test.ts
  function createMockWorkflow (line 45) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/output.test.ts
  function findExampleDir (line 18) | function findExampleDir(baseDir: string, paddedIndex: string): string {
  type ParsedWorkflow (line 27) | interface ParsedWorkflow {
  type ParsedFeedback (line 34) | interface ParsedFeedback {
  type ParsedSummary (line 52) | interface ParsedSummary {
  function createMockWorkflow (line 69) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {
  function createMockResult (line 87) | function createMockResult(overrides: Partial<ExampleResult> = {}): Examp...
  function createMockSummary (line 105) | function createMockSummary(): RunSummary {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/report-generator.test.ts
  function createFeedback (line 16) | function createFeedback(
  function createExampleResult (line 27) | function createExampleResult(overrides: Partial<ExampleResult> = {}): Ex...
  function createRunSummary (line 40) | function createRunSummary(overrides: Partial<RunSummary> = {}): RunSumma...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/runner-langsmith.test.ts
  function createMockWorkflow (line 36) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {
  function createMockEvaluator (line 40) | function createMockEvaluator(
  function isRecord (line 50) | function isRecord(value: unknown): value is Record<string, unknown> {
  function isCallable (line 54) | function isCallable(value: unknown): value is (...args: unknown[]) => un...
  type LangsmithTargetOutput (line 58) | type LangsmithTargetOutput = {
  function isSimpleWorkflow (line 64) | function isSimpleWorkflow(value: unknown): value is SimpleWorkflow {
  function isFeedback (line 68) | function isFeedback(value: unknown): value is Feedback {
  function isLangsmithTargetOutput (line 78) | function isLangsmithTargetOutput(value: unknown): value is LangsmithTarg...
  function callLangsmithTarget (line 88) | async function callLangsmithTarget(target: unknown, inputs: unknown): Pr...
  function createMockLangsmithClient (line 94) | function createMockLangsmithClient() {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/runner.test.ts
  function createMockWorkflow (line 16) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {
  function createMockEvaluator (line 21) | function createMockEvaluator(
  function createFailingEvaluator (line 32) | function createFailingEvaluator(name: string, error: Error): Evaluator {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/score-calculator.test.ts
  function createFeedback (line 19) | function createFeedback(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/test-case-generator.test.ts
  function isMessageWithContent (line 15) | function isMessageWithContent(msg: unknown): msg is { content: unknown } {
  function hasGetTypeMethod (line 20) | function hasGetTypeMethod(msg: unknown): msg is { _getType: () => string...
  function getMessagesFromMockCall (line 28) | function getMessagesFromMockCall(mockInvoke: jest.Mock): { system: strin...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/__tests__/webhook.test.ts
  function createMockLogger (line 27) | function createMockLogger() {
  function createMockSummary (line 41) | function createMockSummary(overrides: Partial<RunSummary> = {}): RunSumm...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/cli/argument-parser.ts
  type EvaluationSuite (line 11) | type EvaluationSuite =
  type EvaluationBackend (line 18) | type EvaluationBackend = 'local' | 'langsmith';
  type AgentType (line 19) | type AgentType = 'multi-agent' | 'code-builder';
  type SubgraphName (line 21) | type SubgraphName = 'responder' | 'discovery' | 'builder' | 'configurator';
  type EvaluationArgs (line 23) | interface EvaluationArgs {
  type CliValueKind (line 89) | type CliValueKind = 'boolean' | 'string';
  type FlagGroup (line 90) | type FlagGroup =
  type CliKey (line 162) | type CliKey = keyof z.infer<typeof cliSchema>;
  type FlagDef (line 164) | type FlagDef = { key: CliKey; kind: CliValueKind; desc: string; group: F...
  constant FLAG_DEFS (line 166) | const FLAG_DEFS: Record<string, FlagDef> = {
  constant FLAG_ALIASES (line 383) | const FLAG_ALIASES: Record<string, string> = {
  constant FLAG_TO_KEY (line 389) | const FLAG_TO_KEY: Record<string, FlagDef> = {
  function formatValidFlags (line 396) | function formatValidFlags(): string {
  constant GROUP_TITLES (line 403) | const GROUP_TITLES: Record<FlagGroup, string> = {
  function formatHelp (line 414) | function formatHelp(): string {
  function printHelp (line 458) | function printHelp(): void {
  function ensureValue (line 462) | function ensureValue(argv: string[], i: number, flag: string): string {
  function splitFlagToken (line 468) | function splitFlagToken(token: string): { flag: string; inlineValue?: st...
  function isStringArray (line 475) | function isStringArray(value: unknown): value is string[] {
  function parseCli (line 479) | function parseCli(argv: string[]): {
  function parseFeatureFlags (line 519) | function parseFeatureFlags(args: {
  function parseFilters (line 537) | function parseFilters(args: {
  function validateSubgraphArgs (line 580) | function validateSubgraphArgs(parsed: {
  function parseEvaluationArgs (line 611) | function parseEvaluationArgs(argv: string[] = process.argv.slice(2)): Ev...
  function argsToStageModels (line 695) | function argsToStageModels(args: EvaluationArgs): StageModels {
  function getDefaultExperimentName (line 707) | function getDefaultExperimentName(suite: EvaluationSuite): string {
  function getDefaultDatasetName (line 711) | function getDefaultDatasetName(suite: EvaluationSuite): string {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/cli/ci-metadata.ts
  type CIMetadata (line 11) | interface CIMetadata {
  function buildCIMetadata (line 26) | function buildCIMetadata(): CIMetadata {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/cli/csv-prompt-loader.ts
  constant DEFAULT_PROMPTS_PATH (line 8) | const DEFAULT_PROMPTS_PATH = join(__dirname, '..', 'fixtures', 'default-...
  type ParsedCsvRow (line 10) | type ParsedCsvRow = string[];
  function isHeaderRow (line 12) | function isHeaderRow(row: ParsedCsvRow) {
  function detectColumnIndex (line 16) | function detectColumnIndex(header: ParsedCsvRow, name: string) {
  function sanitizeValue (line 22) | function sanitizeValue(value: string | undefined) {
  function parseCsv (line 26) | function parseCsv(content: string): ParsedCsvRow[] {
  function loadTestCasesFromCsv (line 42) | function loadTestCasesFromCsv(csvPath: string): TestCase[] {
  function loadDefaultTestCases (line 143) | function loadDefaultTestCases(): TestCase[] {
  function getDefaultTestCaseIds (line 151) | function getDefaultTestCaseIds(): string[] {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/cli/dataset-file-loader.ts
  type DatasetExample (line 10) | interface DatasetExample {
  function isRecord (line 18) | function isRecord(value: unknown): value is Record<string, unknown> {
  function validateExample (line 22) | function validateExample(raw: unknown, index: number): DatasetExample {
  function loadSubgraphDatasetFile (line 50) | function loadSubgraphDatasetFile(
  type DatasetWriteBackEntry (line 87) | interface DatasetWriteBackEntry {
  function writeBackToDatasetFile (line 98) | function writeBackToDatasetFile(filePath: string, updates: DatasetWriteB...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/cli/index.ts
  function isSimpleWorkflow (line 20) | function isSimpleWorkflow(value: unknown): value is SimpleWorkflow {
  function isWorkflowUpdateChunk (line 91) | function isWorkflowUpdateChunk(chunk: StreamChunk): chunk is WorkflowUpd...
  function hasCoordinationLog (line 98) | function hasCoordinationLog(
  function reportSubgraphMetrics (line 109) | function reportSubgraphMetrics(
  function createWorkflowGenerator (line 134) | function createWorkflowGenerator(
  function createEvaluators (line 208) | function createEvaluators(params: {
  function buildHistoryContextFromMessages (line 251) | function buildHistoryContextFromMessages(messages: unknown[]): HistoryCo...
  function isUnknownRecord (line 295) | function isUnknownRecord(value: unknown): value is Record<string, unknow...
  function processCodeBuilderMessage (line 300) | function processCodeBuilderMessage(
  function createCodeWorkflowBuilderGenerator (line 329) | function createCodeWorkflowBuilderGenerator(
  function loadTestCases (line 432) | function loadTestCases(args: ReturnType<typeof parseEvaluationArgs>): Te...
  function handleSubgraphMode (line 482) | async function handleSubgraphMode(
  function runV2Evaluation (line 577) | async function runV2Evaluation(): Promise<void> {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/cli/webhook.ts
  function maskWebhookUrl (line 14) | function maskWebhookUrl(webhookUrl: string): string {
  function generateWebhookSignature (line 23) | function generateWebhookSignature(payload: string, secret: string): stri...
  function verifyWebhookSignature (line 32) | function verifyWebhookSignature(
  type WebhookPayload (line 50) | interface WebhookPayload {
  function isPrivateIp (line 74) | function isPrivateIp(ip: string): boolean {
  function validateWebhookUrl (line 111) | function validateWebhookUrl(webhookUrl: string): void {
  function validateWebhookUrlWithDns (line 145) | async function validateWebhookUrlWithDns(webhookUrl: string): Promise<vo...
  constant WEBHOOK_SIGNATURE_HEADER (line 181) | const WEBHOOK_SIGNATURE_HEADER = 'X-Signature-256';
  constant WEBHOOK_TIMESTAMP_HEADER (line 184) | const WEBHOOK_TIMESTAMP_HEADER = 'X-Timestamp';
  function sendWebhookNotification (line 197) | async function sendWebhookNotification(params: {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/errors.ts
  class WorkflowGenerationError (line 6) | class WorkflowGenerationError extends Error {
    method constructor (line 9) | constructor(message: string, logs?: string) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/__tests__/deterministic-checks.test.ts
  function makeCtx (line 59) | function makeCtx(overrides?: Partial<BinaryCheckContext>): BinaryCheckCo...
  function makeWorkflow (line 64) | function makeWorkflow(partial: Record<string, any>) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/all-nodes-connected.ts
  constant STICKY_NOTE_TYPE (line 5) | const STICKY_NOTE_TYPE = 'n8n-nodes-base.stickyNote';
  method run (line 10) | async run(workflow: SimpleWorkflow) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/create-validation-check.ts
  type ValidateFn (line 7) | type ValidateFn = (
  type ValidationCheckConfig (line 12) | interface ValidationCheckConfig {
  function createValidationCheck (line 28) | function createValidationCheck(config: ValidationCheckConfig): BinaryChe...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/expressions-reference-existing-nodes.ts
  constant QUOTED_NODE_REFS (line 9) | const QUOTED_NODE_REFS: RegExp[] = [
  constant DOT_NODE_REF (line 16) | const DOT_NODE_REF = /\$node\.(\w+)\./g;
  function unescapeNodeName (line 19) | function unescapeNodeName(raw: string): string {
  function collectMatches (line 24) | function collectMatches(pattern: RegExp, text: string, groupIndex: numbe...
  function extractNodeNamesFromExpression (line 29) | function extractNodeNamesFromExpression(expression: string): string[] {
  function extractExpressionsFromParams (line 47) | function extractExpressionsFromParams(value: unknown, key?: string): str...
  method run (line 70) | async run(workflow: SimpleWorkflow) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/has-start-node.ts
  method run (line 10) | async run(workflow: SimpleWorkflow, ctx: BinaryCheckContext) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/index.ts
  constant DETERMINISTIC_CHECKS (line 22) | const DETERMINISTIC_CHECKS: BinaryCheck[] = [

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/no-empty-set-nodes.ts
  function isRecord (line 3) | function isRecord(value: unknown): value is Record<string, unknown> {
  function hasSetNodeValues (line 12) | function hasSetNodeValues(parameters: unknown): boolean {
  method run (line 33) | async run(workflow: SimpleWorkflow) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/no-unnecessary-code-nodes.ts
  method run (line 6) | async run(workflow: SimpleWorkflow, ctx: BinaryCheckContext) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/no-unreachable-nodes.ts
  constant STICKY_NOTE_TYPE (line 8) | const STICKY_NOTE_TYPE = 'n8n-nodes-base.stickyNote';
  function findTriggerNames (line 10) | function findTriggerNames(workflow: SimpleWorkflow, nodeTypes: INodeType...
  function connectsToReachableViaAi (line 23) | function connectsToReachableViaAi(
  function expandReachableWithSubNodes (line 41) | function expandReachableWithSubNodes(
  method run (line 68) | async run(workflow: SimpleWorkflow, ctx: BinaryCheckContext) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/index.ts
  type BinaryChecksEvaluatorOptions (line 11) | interface BinaryChecksEvaluatorOptions {
  constant EVALUATOR_NAME (line 17) | const EVALUATOR_NAME = 'binary-checks';
  function createBinaryChecksEvaluator (line 24) | function createBinaryChecksEvaluator(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/llm-checks/create-llm-check.ts
  constant REASONING_FIRST_SUFFIX (line 6) | const REASONING_FIRST_SUFFIX = `
  type LlmCheckOptions (line 10) | interface LlmCheckOptions {
  function createLlmCheck (line 21) | function createLlmCheck(options: LlmCheckOptions): BinaryCheck {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/llm-checks/index.ts
  constant LLM_CHECKS (line 9) | const LLM_CHECKS: BinaryCheck[] = [

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/llm-checks/schemas.ts
  type BinaryJudgeResult (line 14) | type BinaryJudgeResult = z.infer<typeof binaryJudgeResultSchema>;

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/types.ts
  type BinaryCheckResult (line 8) | interface BinaryCheckResult {
  type BinaryCheckContext (line 13) | interface BinaryCheckContext {
  type BinaryCheck (line 25) | interface BinaryCheck {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/execution/index.ts
  function createExecutionEvaluator (line 20) | function createExecutionEvaluator(): Evaluator<EvaluationContext> {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluation.ts
  type Violation (line 72) | type Violation = z.infer<typeof violationSchema>;
  type CategoryScore (line 73) | type CategoryScore = z.infer<typeof categoryScoreSchema>;
  type EfficiencyScore (line 74) | type EfficiencyScore = z.infer<typeof efficiencyScoreSchema>;
  type MaintainabilityScore (line 75) | type MaintainabilityScore = z.infer<typeof maintainabilityScoreSchema>;
  type BestPracticesScore (line 76) | type BestPracticesScore = z.infer<typeof bestPracticesScoreSchema>;
  type EvaluationResult (line 77) | type EvaluationResult = z.infer<typeof evaluationResultSchema>;
  type TestCase (line 87) | type TestCase = z.infer<typeof testCaseSchema>;
  type EvaluationInput (line 99) | type EvaluationInput = z.infer<typeof evaluationInputSchema>;

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluators/base.ts
  type EvaluatorChainInput (line 11) | type EvaluatorChainInput = {
  function createEvaluatorChain (line 19) | function createEvaluatorChain<TResult extends Record<string, unknown>>(
  function invokeEvaluatorChain (line 39) | async function invokeEvaluatorChain<TResult>(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluators/best-practices-evaluator.ts
  type BestPracticesResult (line 27) | type BestPracticesResult = z.infer<typeof bestPracticesResultSchema>;
  function createBestPracticesEvaluatorChain (line 191) | function createBestPracticesEvaluatorChain(llm: BaseChatModel) {
  function loadRelevantBestPractices (line 199) | async function loadRelevantBestPractices(
  type BestPracticesChainInput (line 241) | type BestPracticesChainInput = {
  function evaluateBestPractices (line 248) | async function evaluateBestPractices(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluators/connections-evaluator.ts
  type ConnectionsResult (line 20) | type ConnectionsResult = z.infer<typeof connectionsResultSchema>;
  function createConnectionsEvaluatorChain (line 213) | function createConnectionsEvaluatorChain(llm: BaseChatModel) {
  function evaluateConnections (line 217) | async function evaluateConnections(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluators/data-flow-evaluator.ts
  type DataFlowResult (line 20) | type DataFlowResult = z.infer<typeof dataFlowResultSchema>;
  function createDataFlowEvaluatorChain (line 163) | function createDataFlowEvaluatorChain(llm: BaseChatModel) {
  function evaluateDataFlow (line 167) | async function evaluateDataFlow(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluators/efficiency-evaluator.ts
  type EfficiencyResult (line 23) | type EfficiencyResult = z.infer<typeof efficiencyResultSchema>;
  function createEfficiencyEvaluatorChain (line 112) | function createEfficiencyEvaluatorChain(llm: BaseChatModel) {
  function evaluateEfficiency (line 116) | async function evaluateEfficiency(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluators/expressions-evaluator.ts
  type ExpressionsResult (line 20) | type ExpressionsResult = z.infer<typeof expressionsResultSchema>;
  function createExpressionsEvaluatorChain (line 121) | function createExpressionsEvaluatorChain(llm: BaseChatModel) {
  function evaluateExpressions (line 125) | async function evaluateExpressions(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluators/functionality-evaluator.ts
  type FunctionalityResult (line 20) | type FunctionalityResult = z.infer<typeof functionalityResultSchema>;
  function createFunctionalityEvaluatorChain (line 174) | function createFunctionalityEvaluatorChain(llm: BaseChatModel) {
  function evaluateFunctionality (line 178) | async function evaluateFunctionality(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluators/maintainability-evaluator.ts
  type MaintainabilityResult (line 23) | type MaintainabilityResult = z.infer<typeof maintainabilityResultSchema>;
  function createMaintainabilityEvaluatorChain (line 215) | function createMaintainabilityEvaluatorChain(llm: BaseChatModel) {
  function evaluateMaintainability (line 219) | async function evaluateMaintainability(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/evaluators/node-configuration-evaluator.ts
  type NodeConfigurationResult (line 20) | type NodeConfigurationResult = z.infer<typeof nodeConfigurationResultSch...
  function createNodeConfigurationEvaluatorChain (line 178) | function createNodeConfigurationEvaluatorChain(llm: BaseChatModel) {
  function evaluateNodeConfiguration (line 182) | async function evaluateNodeConfiguration(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/index.ts
  constant EVALUATOR_NAME (line 11) | const EVALUATOR_NAME = 'llm-judge';
  type Violation (line 16) | interface Violation {
  function formatViolations (line 25) | function formatViolations(violations: Violation[]): string {
  function createLLMJudgeEvaluator (line 37) | function createLLMJudgeEvaluator(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/workflow-evaluator.test.ts
  function createCategoryScore (line 14) | function createCategoryScore(
  function createUniformResult (line 24) | function createUniformResult(score: number): EvaluationResult {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/llm-judge/workflow-evaluator.ts
  constant LLM_JUDGE_CATEGORY_WEIGHTS (line 22) | const LLM_JUDGE_CATEGORY_WEIGHTS = {
  constant EVALUATION_WEIGHTS (line 37) | const EVALUATION_WEIGHTS = LLM_JUDGE_CATEGORY_WEIGHTS;
  constant TOTAL_WEIGHT_WITHOUT_STRUCTURAL (line 42) | const TOTAL_WEIGHT_WITHOUT_STRUCTURAL =
  constant TOTAL_WEIGHT_WITH_STRUCTURAL (line 55) | const TOTAL_WEIGHT_WITH_STRUCTURAL =
  function calculateWeightedScore (line 63) | function calculateWeightedScore(result: EvaluationResult): number {
  function generateEvaluationSummary (line 92) | function generateEvaluationSummary(result: EvaluationResult): string {
  function identifyCriticalIssues (line 142) | function identifyCriticalIssues(result: EvaluationResult): string[] | un...
  function evaluateWorkflow (line 176) | async function evaluateWorkflow(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/pairwise/index.ts
  type PairwiseEvaluatorOptions (line 17) | interface PairwiseEvaluatorOptions {
  function createPairwiseEvaluator (line 36) | function createPairwiseEvaluator(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/pairwise/judge-chain.ts
  type PairwiseEvaluationInput (line 10) | interface PairwiseEvaluationInput {
  type PairwiseEvaluationResult (line 36) | type PairwiseEvaluationResult = z.infer<typeof pairwiseEvaluationLLMResu...
  constant EVALUATOR_SYSTEM_PROMPT (line 43) | const EVALUATOR_SYSTEM_PROMPT = prompt()
  function evaluateWorkflowPairwise (line 111) | async function evaluateWorkflowPairwise(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/pairwise/judge-panel.test.ts
  function createMockWorkflow (line 15) | function createMockWorkflow(name = 'Test Workflow'): SimpleWorkflow {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/pairwise/judge-panel.ts
  type EvalCriteria (line 18) | interface EvalCriteria {
  type JudgePanelTiming (line 23) | interface JudgePanelTiming {
  type JudgePanelResult (line 30) | interface JudgePanelResult {
  function getMajorityThreshold (line 48) | function getMajorityThreshold(numJudges: number): number {
  type JudgePanelOptions (line 59) | interface JudgePanelOptions {
  function runJudgePanel (line 79) | async function runJudgePanel(
  function aggregateJudgeResults (line 136) | function aggregateJudgeResults(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/pairwise/metrics.ts
  constant PAIRWISE_METRICS (line 1) | const PAIRWISE_METRICS = {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/programmatic/index.ts
  function formatViolations (line 11) | function formatViolations(
  function createProgrammaticEvaluator (line 25) | function createProgrammaticEvaluator(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/responder/index.ts
  constant EVALUATOR_NAME (line 10) | const EVALUATOR_NAME = 'responder-judge';
  type ResponderEvaluatorOptions (line 12) | interface ResponderEvaluatorOptions {
  type ResponderJudgeDimension (line 17) | interface ResponderJudgeDimension {
  type ResponderJudgeResult (line 22) | interface ResponderJudgeResult {
  type ResponderEvaluationContext (line 38) | interface ResponderEvaluationContext extends EvaluationContext {
  function isResponderContext (line 47) | function isResponderContext(ctx: EvaluationContext): ctx is ResponderEva...
  function parseJudgeResponse (line 56) | function parseJudgeResponse(content: string): ResponderJudgeResult {
  constant DIMENSION_KEYS (line 67) | const DIMENSION_KEYS = [
  function runSingleJudge (line 86) | async function runSingleJudge(
  function aggregateResults (line 115) | function aggregateResults(results: ResponderJudgeResult[], numJudges: nu...
  function createResponderEvaluator (line 168) | function createResponderEvaluator(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/responder/responder-judge.prompt.ts
  type ResponderEvalType (line 9) | type ResponderEvalType = 'workflow_summary' | 'datatable_instructions' |...
  type ResponderEvalCriteria (line 11) | interface ResponderEvalCriteria {
  constant FORBIDDEN_PHRASES (line 16) | const FORBIDDEN_PHRASES = [
  function buildForbiddenPhrasesSection (line 22) | function buildForbiddenPhrasesSection(): string {
  function buildTypeSpecificGuidance (line 26) | function buildTypeSpecificGuidance(evalType: ResponderEvalType): string {
  function buildWorkflowSummary (line 51) | function buildWorkflowSummary(workflowJSON: unknown): string {
  function buildResponderJudgePrompt (line 75) | function buildResponderJudgePrompt(args: {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/similarity/index.ts
  type SimilarityEvaluatorOptions (line 12) | interface SimilarityEvaluatorOptions {
  function formatViolations (line 22) | function formatViolations(
  function createSimilarityEvaluator (line 53) | function createSimilarityEvaluator(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/csv-writer.ts
  constant FIXED_COLUMNS (line 10) | const FIXED_COLUMNS = [
  constant LLM_JUDGE_METRICS (line 27) | const LLM_JUDGE_METRICS = [
  constant PAIRWISE_METRICS (line 41) | const PAIRWISE_METRICS = [
  constant BINARY_CHECK_NAMES (line 53) | const BINARY_CHECK_NAMES = [
  type EvaluationSuite (line 58) | type EvaluationSuite = 'llm-judge' | 'pairwise' | 'binary-checks' | 'unk...
  function escapeCsvValue (line 64) | function escapeCsvValue(value: string | number | undefined): string {
  function detectSuite (line 76) | function detectSuite(feedback: Feedback[]): EvaluationSuite {
  function extractMetricDetail (line 92) | function extractMetricDetail(feedback: Feedback[], evaluator: string, me...
  function extractMetricScore (line 100) | function extractMetricScore(
  function getJudgeCount (line 112) | function getJudgeCount(feedback: Feedback[]): number {
  function buildLlmJudgeRow (line 122) | function buildLlmJudgeRow(result: ExampleResult): string[] {
  function buildPairwiseRow (line 149) | function buildPairwiseRow(result: ExampleResult, judgeCount: number): st...
  function buildBinaryChecksRow (line 182) | function buildBinaryChecksRow(result: ExampleResult): string[] {
  function buildLlmJudgeHeader (line 199) | function buildLlmJudgeHeader(): string[] {
  function buildPairwiseHeader (line 213) | function buildPairwiseHeader(judgeCount: number): string[] {
  function buildBinaryChecksHeader (line 233) | function buildBinaryChecksHeader(): string[] {
  type WriteResultsCsvOptions (line 237) | interface WriteResultsCsvOptions {
  function writeResultsCsv (line 248) | function writeResultsCsv(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/evaluation-helpers.ts
  function getTracingCallbacks (line 14) | async function getTracingCallbacks(): Promise<Callbacks | undefined> {
  function consumeGenerator (line 22) | async function consumeGenerator<T>(gen: AsyncGenerator<T>) {
  function collectAgentTextResponse (line 32) | async function collectAgentTextResponse<
  function runWithOptionalLimiter (line 48) | async function runWithOptionalLimiter<T>(
  function withTimeout (line 55) | async function withTimeout<T>(args: {
  type GetChatPayloadOptions (line 85) | interface GetChatPayloadOptions {
  function getChatPayload (line 96) | function getChatPayload(options: GetChatPayloadOptions): ChatPayload {
  type CoordinationLogEntry (line 126) | interface CoordinationLogEntry {
  type ExtractedSubgraphMetrics (line 135) | interface ExtractedSubgraphMetrics {
  function calculatePhaseDuration (line 146) | function calculatePhaseDuration(
  function extractSubgraphMetrics (line 173) | function extractSubgraphMetrics(
  function runEvaluatorsOnExample (line 208) | async function runEvaluatorsOnExample(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/feedback.ts
  type LangsmithEvaluationResultLike (line 3) | interface LangsmithEvaluationResultLike {
  function feedbackKey (line 9) | function feedbackKey(feedback: Feedback): string {
  function isPairwiseV1Metric (line 13) | function isPairwiseV1Metric(metric: string): boolean {
  function langsmithMetricKey (line 26) | function langsmithMetricKey(feedback: Feedback): string {
  constant LANGSMITH_SCORE_MIN (line 55) | const LANGSMITH_SCORE_MIN = -99999.9999;
  constant LANGSMITH_SCORE_MAX (line 56) | const LANGSMITH_SCORE_MAX = 99999.9999;
  function clampScoreForLangsmith (line 62) | function clampScoreForLangsmith(score: number): number {
  function toLangsmithEvaluationResult (line 66) | function toLangsmithEvaluationResult(feedback: Feedback): LangsmithEvalu...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/harness-types.ts
  type LlmCallLimiter (line 12) | type LlmCallLimiter = ReturnType<typeof pLimit>;
  type DatasetInputContext (line 18) | interface DatasetInputContext {
  type EvaluationContext (line 37) | interface EvaluationContext {
  type TestCaseContext (line 72) | type TestCaseContext = Omit<Partial<EvaluationContext>, 'prompt'>;
  type GlobalRunContext (line 75) | type GlobalRunContext = Omit<Partial<EvaluationContext>, 'prompt'>;
  type DisplayLine (line 81) | interface DisplayLine {
  type Feedback (line 89) | interface Feedback {
  type Evaluator (line 116) | interface Evaluator<TContext = EvaluationContext> {
  type TestCase (line 124) | interface TestCase {
  type EvaluationSuite (line 134) | type EvaluationSuite =
  type RunConfigBase (line 145) | interface RunConfigBase {
  type LocalRunConfig (line 174) | interface LocalRunConfig extends RunConfigBase {
  type LangsmithRunConfig (line 183) | interface LangsmithRunConfig extends RunConfigBase {
  type RunConfig (line 192) | type RunConfig = LocalRunConfig | LangsmithRunConfig;
  type LangsmithOptions (line 197) | interface LangsmithOptions {
  type LangsmithExampleFilters (line 211) | interface LangsmithExampleFilters {
  type SubgraphMetrics (line 225) | interface SubgraphMetrics {
  type ExampleResult (line 239) | interface ExampleResult {
  type SubgraphExampleOutput (line 272) | interface SubgraphExampleOutput {
  type GenerationResult (line 283) | interface GenerationResult {
  function isGenerationResult (line 294) | function isGenerationResult(
  type RunSummary (line 308) | interface RunSummary {
  type EvaluationLifecycle (line 328) | interface EvaluationLifecycle {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/langsmith-dataset-writer.ts
  type LangSmithWriteBackEntry (line 17) | interface LangSmithWriteBackEntry {
  function writeBackToLangSmithDataset (line 28) | async function writeBackToLangSmithDataset(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/lifecycle.ts
  function truncate (line 18) | function truncate(str: string, maxLen = 50): string {
  function truncateForSingleLine (line 23) | function truncateForSingleLine(str: string, maxLen: number): string {
  function exampleLabel (line 27) | function exampleLabel(mode: RunConfig['mode'] | undefined): 'call' | 'ex' {
  function formatScore (line 34) | function formatScore(score: number): string {
  function formatDuration (line 42) | function formatDuration(ms: number): string {
  constant CRITICAL_METRICS (line 49) | const CRITICAL_METRICS = [
  constant DISPLAY_METRICS_BY_EVALUATOR (line 59) | const DISPLAY_METRICS_BY_EVALUATOR: Record<string, string[]> = {
  constant PAIRWISE_COUNT_METRICS (line 80) | const PAIRWISE_COUNT_METRICS = new Set([
  constant PAIRWISE_DISPLAY_NAMES (line 86) | const PAIRWISE_DISPLAY_NAMES: Record<string, string> = {
  function getDisplayMetricName (line 94) | function getDisplayMetricName(evaluator: string, metric: string): string {
  function isDisplayLine (line 101) | function isDisplayLine(item: unknown): item is DisplayLine {
  function getDisplayLines (line 107) | function getDisplayLines(details?: Feedback['details']): DisplayLine[] |...
  function formatMetricValue (line 114) | function formatMetricValue(evaluator: string, metric: string, score: num...
  function hasSeverityMarker (line 122) | function hasSeverityMarker(comment: string): boolean {
  function extractIssuesForLogs (line 127) | function extractIssuesForLogs(evaluator: string, feedback: Feedback[]): ...
  function formatExampleHeaderLines (line 164) | function formatExampleHeaderLines(args: {
  function splitEvaluatorFeedback (line 203) | function splitEvaluatorFeedback(feedback: Feedback[]): {
  function formatEvaluatorLines (line 213) | function formatEvaluatorLines(args: {
  function scoreColor (line 293) | function scoreColor(score: number): (s: string) => string {
  function formatExampleStatus (line 299) | function formatExampleStatus(status: ExampleResult['status']): string {
  type ConsoleLifecycleOptions (line 313) | interface ConsoleLifecycleOptions {
  function createConsoleLifecycle (line 322) | function createConsoleLifecycle(options: ConsoleLifecycleOptions): Evalu...
  function createQuietLifecycle (line 438) | function createQuietLifecycle(): EvaluationLifecycle {
  function isDefined (line 451) | function isDefined<T>(value: T | undefined): value is T {
  function mergeLifecycles (line 459) | function mergeLifecycles(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/logger.ts
  type EvalLogger (line 12) | interface EvalLogger {
  function createLogger (line 29) | function createLogger(verbose: boolean = false): EvalLogger {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/output.ts
  type ArtifactSaver (line 20) | interface ArtifactSaver {
  type ArtifactSaverOptions (line 30) | interface ArtifactSaverOptions {
  function createArtifactSaver (line 55) | function createArtifactSaver(options: ArtifactSaverOptions): ArtifactSav...
  function getExampleDirName (line 118) | function getExampleDirName(result: ExampleResult): string {
  function shortId (line 124) | function shortId(input: string): string {
  function formatWorkflowForExport (line 133) | function formatWorkflowForExport(workflow: SimpleWorkflow): object {
  function formatFeedbackForExport (line 144) | function formatFeedbackForExport(result: ExampleResult): object {
  function formatSummaryForExport (line 191) | function formatSummaryForExport(summary: RunSummary, results: ExampleRes...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/runner.ts
  constant DEFAULT_PASS_THRESHOLD (line 41) | const DEFAULT_PASS_THRESHOLD = 0.7;
  type TokenUsageCollector (line 47) | type TokenUsageCollector = (usage: { inputTokens: number; outputTokens: ...
  type SubgraphMetricsCollector (line 53) | type SubgraphMetricsCollector = (metrics: {
  type IntrospectionEventsCollector (line 64) | type IntrospectionEventsCollector = (events: IntrospectionEvent[]) => void;
  type GenerationCollectors (line 69) | interface GenerationCollectors {
  function evaluateWithPlugins (line 79) | async function evaluateWithPlugins(
  function calculateExampleScore (line 117) | function calculateExampleScore(feedback: Feedback[]): number {
  function determineStatus (line 124) | function determineStatus(args: { score: number; passThreshold: number })...
  function hasErrorFeedback (line 129) | function hasErrorFeedback(feedback: Feedback[]): boolean {
  function msToSeconds (line 138) | function msToSeconds(ms: number): number {
  function createMetricsFeedback (line 149) | function createMetricsFeedback(args: {
  function buildContext (line 199) | function buildContext(args: {
  function isUnknownRecord (line 232) | function isUnknownRecord(value: unknown): value is Record<string, unknow...
  function isUnknownArray (line 236) | function isUnknownArray(value: unknown): value is unknown[] {
  function asRecord (line 240) | function asRecord(value: unknown): Record<string, unknown> {
  function isNumberArray2 (line 244) | function isNumberArray2(value: unknown): value is [number, number] {
  function isNodeLike (line 255) | function isNodeLike(value: unknown): boolean {
  function isConnectionsLike (line 272) | function isConnectionsLike(value: unknown): boolean {
  function isSimpleWorkflow (line 289) | function isSimpleWorkflow(value: unknown): value is SimpleWorkflow {
  function getNotionIdFromMetadata (line 296) | function getNotionIdFromMetadata(metadata: unknown): string | undefined {
  function getCategoriesFromMetadata (line 301) | function getCategoriesFromMetadata(metadata: unknown): string[] | undefi...
  function getEvalsFromExampleInputs (line 309) | function getEvalsFromExampleInputs(exampleInputs: unknown): { dos?: stri...
  function isFeedback (line 318) | function isFeedback(value: unknown): value is Feedback {
  function exampleMatchesFilters (line 330) | function exampleMatchesFilters(example: Example, filters: LangsmithExamp...
  function loadExamplesFromDataset (line 355) | async function loadExamplesFromDataset(params: {
  function resolveLangsmithData (line 402) | async function resolveLangsmithData(params: {
  function extractContextFromLangsmithInputs (line 447) | function extractContextFromLangsmithInputs(inputs: unknown): TestCaseCon...
  type CollectedMetrics (line 480) | interface CollectedMetrics {
  function createMetricsCollectors (line 494) | function createMetricsCollectors(): {
  function buildSubgraphMetrics (line 522) | function buildSubgraphMetrics(metrics: CollectedMetrics): ExampleResult[...
  function createErrorFeedback (line 538) | function createErrorFeedback(errorMessage: string): Feedback[] {
  function runLocalExampleSuccess (line 554) | async function runLocalExampleSuccess(args: {
  function runLocalExample (line 657) | async function runLocalExample(args: {
  function createArtifactSaverIfRequested (line 730) | function createArtifactSaverIfRequested(args: {
  function runLocalDataset (line 739) | async function runLocalDataset(params: {
  function buildRunSummary (line 794) | function buildRunSummary(results: ExampleResult[]): RunSummary {
  function computeEvaluatorAverages (line 816) | function computeEvaluatorAverages(
  type LangsmithSummaryParams (line 855) | interface LangsmithSummaryParams {
  function buildLangsmithSummary (line 872) | function buildLangsmithSummary(params: LangsmithSummaryParams): RunSumma...
  function runLocal (line 894) | async function runLocal(config: LocalRunConfig): Promise<RunSummary> {
  type LangsmithTargetOutput (line 964) | interface LangsmithTargetOutput {
  type LangsmithDatasetInput (line 974) | interface LangsmithDatasetInput {
  function extractPrompt (line 991) | function extractPrompt(inputs: LangsmithDatasetInput): string {
  function enrichExamplesWithHistory (line 1015) | function enrichExamplesWithHistory(examples: Example[]): Example[] {
  function deserializeLcMessages (line 1063) | function deserializeLcMessages(rawMessages: unknown[]): BaseMessage[] {
  function extractDatasetInputContext (line 1087) | function extractDatasetInputContext(
  function createLangsmithFeedbackExtractor (line 1115) | function createLangsmithFeedbackExtractor(): (
  function applyRepetitions (line 1142) | function applyRepetitions(data: string | Example[], repetitions: number)...
  function computeFilterMetadata (line 1147) | function computeFilterMetadata(filters?: LangsmithExampleFilters): {
  function logLangsmithInputsSummary (line 1181) | function logLangsmithInputsSummary(logger: EvalLogger, effectiveData: st...
  function runLangsmithEvaluateAndFlush (line 1196) | async function runLangsmithEvaluateAndFlush(params: {
  type LangsmithStats (line 1284) | interface LangsmithStats {
  function updateStats (line 1296) | function updateStats(
  function resolveAndEnrichLangsmithData (line 1315) | async function resolveAndEnrichLangsmithData(params: {
  function runLangsmith (line 1343) | async function runLangsmith(config: LangsmithRunConfig): Promise<RunSumm...
  function runEvaluation (line 1645) | async function runEvaluation(config: RunConfig): Promise<RunSummary> {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/score-calculator.ts
  type ScoreWeights (line 13) | interface ScoreWeights {
  type AggregatedScore (line 20) | interface AggregatedScore {
  type FeedbackKeyParts (line 32) | interface FeedbackKeyParts {
  constant DEFAULT_EVALUATOR_WEIGHTS (line 46) | const DEFAULT_EVALUATOR_WEIGHTS: ScoreWeights = {
  constant DEFAULT_WEIGHTS (line 57) | const DEFAULT_WEIGHTS: ScoreWeights = DEFAULT_EVALUATOR_WEIGHTS;
  constant UNKNOWN_EVALUATOR_WEIGHT (line 60) | const UNKNOWN_EVALUATOR_WEIGHT = 0.1;
  function parseFeedbackKey (line 72) | function parseFeedbackKey(key: string): FeedbackKeyParts {
  function extractCategory (line 88) | function extractCategory(key: string): string {
  function groupByEvaluator (line 102) | function groupByEvaluator(feedback: Feedback[]): Record<string, Feedback...
  function calculateFiniteAverage (line 119) | function calculateFiniteAverage(items: Feedback[]): number {
  function selectScoringItems (line 136) | function selectScoringItems(items: Feedback[]): Feedback[] {
  function calculateWeightedScore (line 159) | function calculateWeightedScore(
  function computeEvaluatorAverages (line 186) | function computeEvaluatorAverages(
  function aggregateScores (line 213) | function aggregateScores(feedback: Feedback[]): AggregatedScore {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/subgraph-evaluation-local.ts
  constant DEFAULT_PASS_THRESHOLD (line 36) | const DEFAULT_PASS_THRESHOLD = 0.7;
  type LocalSubgraphEvaluationConfig (line 38) | interface LocalSubgraphEvaluationConfig {
  function isRecord (line 61) | function isRecord(value: unknown): value is Record<string, unknown> {
  function extractPromptFromInputs (line 65) | function extractPromptFromInputs(inputs: Record<string, unknown>): string {
  function extractResponderEvals (line 74) | function extractResponderEvals(
  function runLocalSubgraphEvaluation (line 98) | async function runLocalSubgraphEvaluation(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/subgraph-evaluation.ts
  constant DEFAULT_PASS_THRESHOLD (line 46) | const DEFAULT_PASS_THRESHOLD = 0.7;
  type SubgraphEvaluationConfig (line 48) | interface SubgraphEvaluationConfig {
  function isRecord (line 70) | function isRecord(value: unknown): value is Record<string, unknown> {
  function isFeedback (line 74) | function isFeedback(value: unknown): value is Feedback {
  function isUnknownArray (line 86) | function isUnknownArray(value: unknown): value is unknown[] {
  function extractPromptFromInputs (line 90) | function extractPromptFromInputs(inputs: Record<string, unknown>): string {
  function extractResponderEvals (line 99) | function extractResponderEvals(
  type SubgraphTargetOutput (line 120) | interface SubgraphTargetOutput {
  type ResolveStateResult (line 129) | interface ResolveStateResult {
  function resolveState (line 138) | async function resolveState(args: {
  function preloadExampleIds (line 189) | async function preloadExampleIds(
  function extractExperimentIds (line 208) | async function extractExperimentIds(
  function runSubgraphEvaluation (line 231) | async function runSubgraphEvaluation(config: SubgraphEvaluationConfig): ...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/subgraph-runner.ts
  type SubgraphName (line 12) | type SubgraphName = 'responder' | 'discovery' | 'builder' | 'configurator';
  type PreComputedState (line 18) | interface PreComputedState {
  type SubgraphResult (line 26) | interface SubgraphResult {
  type SubgraphRunFn (line 33) | type SubgraphRunFn = (state: PreComputedState) => Promise<SubgraphResult>;
  type SubgraphRunnerConfig (line 35) | interface SubgraphRunnerConfig {
  function isRecord (line 40) | function isRecord(value: unknown): value is Record<string, unknown> {
  function deserializeMessages (line 48) | function deserializeMessages(raw: unknown[]): BaseMessage[] {
  function extractPreComputedState (line 67) | function extractPreComputedState(inputs: Record<string, unknown>): PreCo...
  function createSubgraphRunner (line 103) | function createSubgraphRunner(config: SubgraphRunnerConfig): SubgraphRun...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/harness/workflow-regenerator.ts
  type SerializedMessage (line 22) | interface SerializedMessage {
  type RegeneratedState (line 28) | interface RegeneratedState {
  type RegenerateOptions (line 36) | interface RegenerateOptions {
  function serializeMessage (line 45) | function serializeMessage(msg: BaseMessage): SerializedMessage {
  function regenerateWorkflowState (line 57) | async function regenerateWorkflowState(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/langsmith/trace-filters.ts
  function isRecord (line 13) | function isRecord(value: unknown): value is Record<string, unknown> {
  constant LARGE_STATE_FIELDS (line 25) | const LARGE_STATE_FIELDS = ['cachedTemplates', 'parsedNodeTypes'] as const;
  constant LANGCHAIN_SERIALIZABLE_KEYS (line 31) | const LANGCHAIN_SERIALIZABLE_KEYS = ['lc_serializable', 'lc_kwargs', 'lc...
  constant LARGE_CONTEXT_FIELDS (line 36) | const LARGE_CONTEXT_FIELDS = ['executionData', 'executionSchema', 'expre...
  constant WORKFLOW_SUMMARY_THRESHOLD (line 41) | const WORKFLOW_SUMMARY_THRESHOLD = 20;
  function isLangChainSerializable (line 47) | function isLangChainSerializable(obj: KVMap): boolean {
  function hasFilterableFields (line 54) | function hasFilterableFields(obj: KVMap): boolean {
  function summarizeWorkflow (line 68) | function summarizeWorkflow(workflow: unknown): Record<string, unknown> {
  function summarizeCachedTemplates (line 84) | function summarizeCachedTemplates(templates: unknown[]): Array<Record<st...
  function filterLargeStateFields (line 98) | function filterLargeStateFields(obj: KVMap): void {
  function summarizeContextField (line 113) | function summarizeContextField(key: string, value: unknown): string {
  function filterWorkflowContext (line 129) | function filterWorkflowContext(ctx: Record<string, unknown>): Record<str...
  function summarizeLargeWorkflow (line 148) | function summarizeLargeWorkflow(workflow: unknown): unknown {
  function isMinimalTracingEnabled (line 163) | function isMinimalTracingEnabled(): boolean {
  type TraceFilters (line 172) | interface TraceFilters {
  function createTraceFilters (line 183) | function createTraceFilters(logger?: EvalLogger): TraceFilters {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/langsmith/types.ts
  type WorkflowOutput (line 8) | interface WorkflowOutput {
  type WorkflowStateValues (line 14) | interface WorkflowStateValues {
  function isValidPrompt (line 21) | function isValidPrompt(value: unknown): value is string {
  function isSimpleWorkflow (line 25) | function isSimpleWorkflow(value: unknown): value is SimpleWorkflow {
  function isWorkflowStateValues (line 34) | function isWorkflowStateValues(values: unknown): values is WorkflowState...
  function formatViolations (line 42) | function formatViolations(violations: Array<{ type: string; description:...
  function generateRunId (line 52) | function generateRunId(): string {
  function extractMessageContent (line 57) | function extractMessageContent(message: BaseMessage | undefined): string {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/lifecycles/introspection-analysis.ts
  type IntrospectionAnalysisOptions (line 9) | interface IntrospectionAnalysisOptions {
  function createIntrospectionAnalysisLifecycle (line 15) | function createIntrospectionAnalysisLifecycle(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/agent-prompt.ts
  function evaluateAgentPrompt (line 7) | function evaluateAgentPrompt(workflow: SimpleWorkflow): SingleEvaluatorR...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/connections.test.ts
  constant DEFAULT_VERSION (line 15) | const DEFAULT_VERSION = 1;

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/connections.ts
  function evaluateConnections (line 9) | function evaluateConnections(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/credentials.test.ts
  type HeaderParam (line 8) | interface HeaderParam {
  type QueryParam (line 13) | interface QueryParam {
  type Assignment (line 18) | interface Assignment {
  type HttpRequestNodeOptions (line 24) | interface HttpRequestNodeOptions {
  type SetNodeOptions (line 32) | interface SetNodeOptions {
  function createHttpRequestNode (line 39) | function createHttpRequestNode(options: HttpRequestNodeOptions = {}): Si...
  function createSetNode (line 68) | function createSetNode(options: SetNodeOptions = {}): SimpleWorkflow['no...
  function createWorkflow (line 90) | function createWorkflow(nodes: SimpleWorkflow['nodes']): SimpleWorkflow {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/credentials.ts
  function evaluateCredentials (line 7) | function evaluateCredentials(workflow: SimpleWorkflow): SingleEvaluatorR...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/from-ai.ts
  function evaluateFromAi (line 9) | function evaluateFromAi(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/graph-validation.ts
  function codeToViolationName (line 18) | function codeToViolationName(code: string): ProgrammaticViolationName {
  function getViolationType (line 27) | function getViolationType(issue: {
  function getPointsDeducted (line 36) | function getPointsDeducted(type: 'critical' | 'major' | 'minor'): number {
  function evaluateGraphValidation (line 54) | function evaluateGraphValidation(generatedCode: string | undefined): Sin...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/node-usage.ts
  function evaluateNodeUsage (line 7) | function evaluateNodeUsage(workflow: SimpleWorkflow): SingleEvaluatorRes...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/nodes.ts
  function evaluateNodes (line 9) | function evaluateNodes(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/parameters.test.ts
  function createNodeType (line 7) | function createNodeType(
  function createNode (line 25) | function createNode(
  function createWorkflow (line 41) | function createWorkflow(nodes: SimpleWorkflow['nodes']): SimpleWorkflow {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/parameters.ts
  function evaluateParameters (line 9) | function evaluateParameters(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/tools.ts
  function evaluateTools (line 9) | function evaluateTools(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/trigger.ts
  function evaluateTrigger (line 9) | function evaluateTrigger(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/evaluators/workflow-similarity.ts
  type ExecError (line 13) | interface ExecError extends Error {
  function isExecError (line 20) | function isExecError(error: unknown): error is ExecError {
  function mapEditTypeToViolationName (line 27) | function mapEditTypeToViolationName(editType: string): ProgrammaticViola...
  type WorkflowSimilarityResult (line 40) | interface WorkflowSimilarityResult {
  function isWorkflowSimilarityResult (line 67) | function isWorkflowSimilarityResult(value: unknown): value is WorkflowSi...
  function evaluateWorkflowSimilarity (line 94) | async function evaluateWorkflowSimilarity(
  function evaluateWorkflowSimilarityMultiple (line 225) | async function evaluateWorkflowSimilarityMultiple(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/programmatic-evaluation.ts
  function programmaticEvaluation (line 23) | async function programmaticEvaluation(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/python/src/compare_workflows.py
  function parse_args (line 23) | def parse_args():
  function load_workflow (line 67) | def load_workflow(path: str) -> Dict[str, Any]:
  function format_output_json (line 94) | def format_output_json(
  function _format_parameter_diff (line 119) | def _format_parameter_diff(
  function format_output_summary (line 176) | def format_output_summary(
  function main (line 258) | def main():

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/python/src/config_loader.py
  function _get_param_path_matching_pattern (line 14) | def _get_param_path_matching_pattern(pattern: str) -> str:
  class NodeIgnoreRule (line 31) | class NodeIgnoreRule:
    method matches (line 39) | def matches(self, node: Dict) -> bool:
  class ParameterComparisonRule (line 51) | class ParameterComparisonRule:
    method matches_parameter (line 62) | def matches_parameter(self, param_path: str) -> bool:
  class ExemptionRule (line 69) | class ExemptionRule:
    method matches (line 78) | def matches(self, node: Dict) -> bool:
  class WorkflowComparisonConfig (line 96) | class WorkflowComparisonConfig:
    method should_ignore_node (line 145) | def should_ignore_node(self, node: Dict) -> bool:
    method should_ignore_parameter (line 158) | def should_ignore_parameter(self, node_type: str, param_path: str) -> ...
    method get_parameter_rule (line 181) | def get_parameter_rule(self, param_path: str) -> Optional[ParameterCom...
    method get_exemption_penalty (line 188) | def get_exemption_penalty(
    method _matches_path_pattern (line 207) | def _matches_path_pattern(path: str, pattern: str) -> bool:
    method are_node_types_similar (line 212) | def are_node_types_similar(self, type1: str, type2: str) -> bool:
    method to_dict (line 219) | def to_dict(self) -> Dict:
    method from_yaml (line 251) | def from_yaml(cls, path: Path) -> "WorkflowComparisonConfig":
    method from_json (line 258) | def from_json(cls, path: Path) -> "WorkflowComparisonConfig":
    method _from_dict (line 265) | def _from_dict(cls, data: Dict) -> "WorkflowComparisonConfig":
    method load_preset (line 348) | def load_preset(cls, preset_name: str) -> "WorkflowComparisonConfig":
  function load_config (line 359) | def load_config(config_source: Optional[str] = None) -> WorkflowComparis...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/python/src/cost_functions.py
  function normalize_expression (line 11) | def normalize_expression(value: Any) -> Any:
  function node_substitution_cost (line 56) | def node_substitution_cost(
  function node_deletion_cost (line 134) | def node_deletion_cost(
  function node_insertion_cost (line 160) | def node_insertion_cost(
  function edge_substitution_cost (line 185) | def edge_substitution_cost(
  function edge_deletion_cost (line 231) | def edge_deletion_cost(
  function edge_insertion_cost (line 238) | def edge_insertion_cost(
  function compare_parameters (line 245) | def compare_parameters(
  function compare_lists (line 311) | def compare_lists(list1: list, list2: list, config: WorkflowComparisonCo...
  function apply_comparison_rule (line 340) | def apply_comparison_rule(val1: Any, val2: Any, rule: ParameterCompariso...
  function calculate_semantic_similarity (line 382) | def calculate_semantic_similarity(text1: str, text2: str) -> float:
  function normalize_value (line 412) | def normalize_value(value: Any, options: Dict[str, Any]) -> Any:
  function get_parameter_diff (line 439) | def get_parameter_diff(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/python/src/graph_builder.py
  function build_workflow_graph (line 10) | def build_workflow_graph(
  function _filter_parameters (line 93) | def _filter_parameters(
  function _is_trigger_node (line 131) | def _is_trigger_node(node: Dict[str, Any]) -> bool:
  function get_node_data (line 165) | def get_node_data(graph: nx.DiGraph, node_name: str) -> Dict[str, Any]:
  function get_edge_data (line 182) | def get_edge_data(graph: nx.DiGraph, source: str, target: str) -> Dict[s...
  function graph_stats (line 200) | def graph_stats(graph: nx.DiGraph) -> Dict[str, Any]:

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/python/src/similarity.py
  function calculate_graph_edit_distance (line 19) | def calculate_graph_edit_distance(
  function _calculate_basic_edit_cost (line 147) | def _calculate_basic_edit_cost(
  function _calculate_max_cost (line 195) | def _calculate_max_cost(
  function _extract_operations_from_path (line 223) | def _extract_operations_from_path(
  function _determine_priority (line 389) | def _determine_priority(
  function _relabel_graph_by_structure (line 421) | def _relabel_graph_by_structure(graph: nx.DiGraph) -> tuple[nx.DiGraph, ...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/python/tests/test_graph_builder.py
  function test_build_simple_workflow_graph (line 9) | def test_build_simple_workflow_graph():
  function test_build_graph_with_filtering (line 41) | def test_build_graph_with_filtering():
  function test_parameter_filtering (line 73) | def test_parameter_filtering():
  function test_is_trigger_node (line 106) | def test_is_trigger_node():
  function test_graph_stats (line 115) | def test_graph_stats():
  function test_empty_workflow (line 154) | def test_empty_workflow():

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/python/tests/test_similarity.py
  function test_identical_workflows (line 10) | def test_identical_workflows():
  function test_empty_workflows (line 36) | def test_empty_workflows():
  function test_missing_node (line 50) | def test_missing_node():
  function test_trigger_mismatch (line 81) | def test_trigger_mismatch():
  function test_parameter_differences (line 129) | def test_parameter_differences():
  function test_connection_difference (line 169) | def test_connection_difference():
  function test_trigger_parameter_update_priority (line 203) | def test_trigger_parameter_update_priority():
  function test_trigger_deletion_is_critical (line 251) | def test_trigger_deletion_is_critical():
  function test_trigger_insertion_is_critical (line 291) | def test_trigger_insertion_is_critical():

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/programmatic/score.ts
  constant IMPORTANCE_TIER (line 7) | const IMPORTANCE_TIER = {
  type ImportanceTier (line 13) | type ImportanceTier = keyof typeof IMPORTANCE_TIER;
  constant CATEGORY_IMPORTANCE (line 21) | const CATEGORY_IMPORTANCE: Record<string, ImportanceTier> = {
  function calculateWeightsFromTiers (line 37) | function calculateWeightsFromTiers(categories: string[]): Record<string,...
  function calculateOverallScore (line 50) | function calculateOverallScore(
  function calcSingleEvaluatorScore (line 72) | function calcSingleEvaluatorScore(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/summarizers/introspection-summarizer.ts
  type IntrospectionSummary (line 5) | interface IntrospectionSummary {
  constant SUMMARIZATION_PROMPT (line 11) | const SUMMARIZATION_PROMPT = `You are analyzing introspection events fro...
  function summarizeIntrospectionResults (line 32) | async function summarizeIntrospectionResults(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/support/constants.ts
  constant AGENT_TYPES (line 5) | const AGENT_TYPES = {
  constant EVAL_TYPES (line 14) | const EVAL_TYPES = {
  constant EVAL_USERS (line 20) | const EVAL_USERS = {
  constant TRACEABLE_NAMES (line 25) | const TRACEABLE_NAMES = {
  constant DEFAULTS (line 34) | const DEFAULTS = {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/support/environment.ts
  constant MAX_INGEST_MEMORY_BYTES (line 22) | const MAX_INGEST_MEMORY_BYTES = 3 * 1024 * 1024 * 1024;
  type StageModels (line 32) | interface StageModels {
  type ResolvedStageLLMs (line 55) | interface ResolvedStageLLMs {
  type TestEnvironment (line 66) | interface TestEnvironment {
  function setupLLM (line 84) | async function setupLLM(modelId: ModelId = DEFAULT_MODEL): Promise<BaseC...
  function resolveStageModels (line 100) | async function resolveStageModels(stageModels: StageModels): Promise<Res...
  function createTracer (line 126) | function createTracer(client: Client, projectName: string): LangChainTra...
  type LangsmithClientResult (line 136) | interface LangsmithClientResult {
  function createLangsmithClient (line 149) | function createLangsmithClient(logger?: EvalLogger): LangsmithClientResu...
  function resolveBuiltinNodeDefinitionDirs (line 181) | function resolveBuiltinNodeDefinitionDirs(): string[] {
  function findRepoRoot (line 210) | function findRepoRoot(startDir: string): string | undefined {
  function resolveNodesBasePath (line 225) | function resolveNodesBasePath(): string | undefined {
  function setupTestEnvironment (line 238) | async function setupTestEnvironment(
  type CreateAgentOptions (line 264) | interface CreateAgentOptions {
  function createAgent (line 278) | function createAgent(options: CreateAgentOptions): WorkflowBuilderAgent {
  function getConcurrencyLimit (line 305) | function getConcurrencyLimit(): number {
  function shouldGenerateTestCases (line 320) | function shouldGenerateTestCases(): boolean {
  function howManyTestCasesToGenerate (line 328) | function howManyTestCasesToGenerate(): number {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/support/load-nodes.ts
  type NodeWithVersion (line 5) | interface NodeWithVersion extends INodeTypeDescription {
  constant IGNORED_TYPES (line 12) | const IGNORED_TYPES = new Set([
  function getDisabledNodes (line 19) | function getDisabledNodes(): Set<string> {
  function filterNodeTypes (line 36) | function filterNodeTypes(
  function loadNodesFromFile (line 60) | function loadNodesFromFile(): INodeTypeDescription[] {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/support/pin-data-generator.test.ts
  function makeNode (line 15) | function makeNode(overrides: Partial<INode> & { name: string; type: stri...
  function makeNodeType (line 27) | function makeNodeType(
  function createMockLLM (line 353) | function createMockLLM(responseContent: string) {

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/support/pin-data-generator.ts
  type PinDataGeneratorOptions (line 28) | interface PinDataGeneratorOptions {
  type NodeSchemaContext (line 39) | interface NodeSchemaContext {
  constant NON_SERVICE_NODES_WITH_CREDENTIALS (line 57) | const NON_SERVICE_NODES_WITH_CREDENTIALS = new Set([
  function findAiRootNodeNames (line 72) | function findAiRootNodeNames(workflow: SimpleWorkflow): Set<string> {
  function identifyPinDataNodes (line 93) | function identifyPinDataNodes(
  function buildSchemaMap (line 144) | function buildSchemaMap(nodesBasePath: string): Map<string, string> {
  function normalizeVersion (line 193) | function normalizeVersion(version: number): string {
  function resolveSchemaForNode (line 203) | function resolveSchemaForNode(
  function buildSchemaContexts (line 257) | function buildSchemaContexts(nodes: INode[], nodesBasePath?: string): No...
  function workflowToMermaid (line 293) | function workflowToMermaid(workflow: SimpleWorkflow): string {
  constant SYSTEM_PROMPT (line 348) | const SYSTEM_PROMPT = `You are a test data generator for n8n workflow au...
  function buildUserPrompt (line 358) | function buildUserPrompt(workflow: SimpleWorkflow, contexts: NodeSchemaC...
  function parsePinDataResponse (line 426) | function parsePinDataResponse(responseText: string, expectedNodes: strin...
  function generateEvalPinData (line 462) | async function generateEvalPinData(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/support/report-generator.ts
  type ViolationSeverity (line 18) | type ViolationSeverity = 'critical' | 'major' | 'minor';
  type ReportOptions (line 23) | interface ReportOptions {
  type ReportMetrics (line 33) | interface ReportMetrics {
  constant MAX_PROMPT_LENGTH (line 41) | const MAX_PROMPT_LENGTH = 80;
  function extractViolationSeverity (line 51) | function extractViolationSeverity(comment?: string): ViolationSeverity |...
  function formatPercentage (line 66) | function formatPercentage(value: number, decimals = 1): string {
  function truncate (line 74) | function truncate(str: string, maxLength: number): string {
  function calculateReportMetrics (line 85) | function calculateReportMetrics(results: ExampleResult[]): ReportMetrics {
  function generateMarkdownReport (line 128) | function generateMarkdownReport(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/support/test-case-generator.ts
  type TestCaseGeneratorOptions (line 15) | interface TestCaseGeneratorOptions {
  type GeneratedTestCase (line 27) | interface GeneratedTestCase {
  type TestCaseGenerator (line 37) | interface TestCaseGenerator {
  type GeneratedTestCasesOutput (line 57) | type GeneratedTestCasesOutput = z.infer<typeof generatedTestCasesSchema>;
  function parseTestCasesOutput (line 60) | function parseTestCasesOutput(value: unknown): GeneratedTestCasesOutput {
  function getFocus (line 111) | function getFocus(options?: TestCaseGeneratorOptions): string {
  function buildHumanMessage (line 132) | function buildHumanMessage(count: number, focus: string): string {
  function createTestCaseGenerator (line 154) | function createTestCaseGenerator(

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/support/workflow-executor.test.ts
  function makeSimpleWorkflow (line 26) | function makeSimpleWorkflow(nodes?: INode[]): SimpleWorkflow {
  function makeNodeTypes (line 106) | function makeNodeTypes(types: Record<string, { group: string[] }>): INod...

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/support/workflow-executor.ts
  type ExecutionResult (line 39) | interface ExecutionResult {
  type KnownNodeEntry (line 65) | interface KnownNodeEntry {
  class DistNodeTypes (line 71) | class DistNodeTypes implements INodeTypes {
    method constructor (line 76) | constructor(
    method getByName (line 93) | getByName(type: string): INodeType | IVersionedNodeType {
    method getByNameAndVersion (line 97) | getByNameAndVersion(type: string, version?: number): INodeType {
    method getKnownTypes (line 105) | getKnownTypes() {
    method loadNode (line 109) | private loadNode(type: string): INodeType | IVersionedNodeType {
  type ResolvedImports (line 147) | interface ResolvedImports {
  function getPaths (line 163) | function getPaths(): { corePath: string; nodesBasePath: string; langchai...
  function resolveImports (line 175) | async function resolveImports(): Promise<ResolvedImports> {
  function makeAdditionalDataStub (line 233) | function makeAdditionalDataStub(
  function findTriggerByGroup (line 253) | function findTriggerByGroup(nodes: INode[], nodeTypes: INodeTypes): INod...
  function executeWorkflowWithPinData (line 275) | async function executeWorkflowWithPinData(
  function findErrorNode (line 367) | function findErrorNode(run: IRun): string | undefined {

FILE: packages/@n8n/ai-workflow-builder.ee/scripts/categorize-prompts.ts
  type CategorizationResult (line 19) | interface CategorizationResult {
  function categorizeAllPrompts (line 28) | async function categorizeAllPrompts() {

FILE: packages/@n8n/ai-workflow-builder.ee/scripts/workflow-to-mermaid.ts
  function isDirectWorkflowFormat (line 18) | function isDirectWorkflowFormat(value: unknown): value is SimpleWorkflow...
  function isWorkflowMetadataFormat (line 31) | function isWorkflowMetadataFormat(
  type CliOptions (line 41) | interface CliOptions {
  function printUsage (line 49) | function printUsage(): void {
  type ParseResult (line 71) | interface ParseResult {
  function parseArgs (line 76) | function parseArgs(args: string[]): ParseResult {
  function loadWorkflow (line 131) | function loadWorkflow(filePath: string): WorkflowMetadata {
  function main (line 169) | function main(): void {

FILE: packages/@n8n/ai-workflow-builder.ee/src/agents/planner.agent.ts
  type PlannerOutput (line 51) | type PlannerOutput = z.infer<typeof plannerOutputSchema>;
  type PlannerAgentConfig (line 57) | interface PlannerAgentConfig {
  function createPlannerAgent (line 62) | function createPlannerAgent(config: PlannerAgentConfig) {
  type PlannerAgentType (line 85) | type PlannerAgentType = ReturnType<typeof createPlannerAgent>;
  type PlannerNodeInput (line 91) | interface PlannerNodeInput {
  type PlannerNodeResult (line 100) | interface PlannerNodeResult {
  function parsePlanDecision (line 109) | function parsePlanDecision(value: unknown): { action: PlanDecision; feed...
  constant MAX_PLANNER_RETRIES (line 134) | const MAX_PLANNER_RETRIES = 1;
  function invokePlannerNode (line 136) | async function invokePlannerNode(

FILE: packages/@n8n/ai-workflow-builder.ee/src/agents/responder.agent.ts
  type ResponderContext (line 40) | interface ResponderContext {
  type ResponderResult (line 58) | interface ResponderResult {
  function buildErrorContext (line 78) | function buildErrorContext(coordinationLog: CoordinationLogEntry[], node...
  function buildFetchedUrlContentBlock (line 104) | function buildFetchedUrlContentBlock(discoveryContext?: DiscoveryContext...
  function buildContextContent (line 112) | function buildContextContent(context: ResponderContext): string | null {
  type ResponderAgentConfig (line 218) | interface ResponderAgentConfig {
  function createResponderAgent (line 231) | function createResponderAgent(config: ResponderAgentConfig) {
  type ResponderAgentType (line 261) | type ResponderAgentType = ReturnType<typeof createResponderAgent>;
  function invokeResponderAgent (line 269) | async function invokeResponderAgent(

FILE: packages/@n8n/ai-workflow-builder.ee/src/agents/supervisor.agent.ts
  constant ROUTING_OPTIONS_WITH_ASSISTANT (line 20) | const ROUTING_OPTIONS_WITH_ASSISTANT = ['responder', 'discovery', 'build...
  constant ROUTING_OPTIONS_WITHOUT_ASSISTANT (line 21) | const ROUTING_OPTIONS_WITHOUT_ASSISTANT = ['responder', 'discovery', 'bu...
  function createSupervisorRoutingSchema (line 23) | function createSupervisorRoutingSchema(mergeAskBuild: boolean) {
  type SupervisorRouting (line 32) | type SupervisorRouting = z.infer<ReturnType<typeof createSupervisorRouti...
  type SupervisorAgentConfig (line 34) | interface SupervisorAgentConfig {
  type SupervisorContext (line 42) | interface SupervisorContext {
  class SupervisorAgent (line 61) | class SupervisorAgent {
    method constructor (line 66) | constructor(config: SupervisorAgentConfig) {
    method buildContextMessage (line 74) | private buildContextMessage(context: SupervisorContext): HumanMessage ...
    method invoke (line 122) | async invoke(context: SupervisorContext, config?: RunnableConfig): Pro...

FILE: packages/@n8n/ai-workflow-builder.ee/src/agents/test/responder.agent.test.ts
  function createMockAgent (line 11) | function createMockAgent(responseContent = 'Test response'): ResponderAg...
  function createContext (line 19) | function createContext(messages: BaseMessage[]): ResponderContext {

FILE: packages/@n8n/ai-workflow-builder.ee/src/ai-workflow-builder-agent.service.ts
  type OnCreditsUpdated (line 26) | type OnCreditsUpdated = (userId: string, creditsQuota: number, creditsCl...
  type OnTelemetryEvent (line 28) | type OnTelemetryEvent = (event: string, properties: ITelemetryTrackPrope...
  class AiWorkflowBuilderService (line 31) | class AiWorkflowBuilderService {
    method constructor (line 36) | constructor(
    method updateNodeTypes (line 58) | updateNodeTypes(nodeTypes: INodeTypeDescription[]) {
    method getAnthropicClaudeModel (line 63) | private static async getAnthropicClaudeModel({
    method getApiProxyAuthHeaders (line 83) | private async getApiProxyAuthHeaders(user: IUser, userMessageId: strin...
    method setupModels (line 95) | private async setupModels(
    method filterNodeTypes (line 152) | private filterNodeTypes(nodeTypes: INodeTypeDescription[]): INodeTypeD...
    method getAgent (line 189) | private async getAgent(user: IUser, userMessageId: string, featureFlag...
    method onGenerationSuccess (line 238) | private async onGenerationSuccess(
    method chat (line 261) | async *chat(payload: ChatPayload, user: IUser, abortSignal?: AbortSign...
    method storeHitlInteraction (line 322) | private storeHitlInteraction(
    method extractLastAiMessageContent (line 359) | private extractLastAiMessageContent(messages: BaseMessage[]): string {
    method extractUniqueToolNames (line 368) | private extractUniqueToolNames(messages: BaseMessage[]): string[] {
    method trackBuilderReplyTelemetry (line 381) | private async trackBuilderReplyTelemetry(
    method getSessions (line 419) | async getSessions(workflowId: string | undefined, user?: IUser, codeBu...
    method getBuilderInstanceCredits (line 425) | async getBuilderInstanceCredits(
    method truncateMessagesAfter (line 443) | async truncateMessagesAfter(
    method loadSessionMessagesSafe (line 464) | private async loadSessionMessagesSafe(threadId: string) {
    method saveSessionSafe (line 480) | private async saveSessionSafe(
    method clearSession (line 499) | async clearSession(workflowId: string, user: IUser): Promise<void> {
    method extractHitlFromStreamOutput (line 539) | private extractHitlFromStreamOutput(output: unknown): HITLInterruptVal...

FILE: packages/@n8n/ai-workflow-builder.ee/src/assistant/assistant-handler.ts
  constant SUMMARY_MAX_LENGTH (line 28) | const SUMMARY_MAX_LENGTH = 200;
  class AssistantHandler (line 35) | class AssistantHandler {
    method constructor (line 36) | constructor(
    method execute (line 46) | async execute(
    method buildSdkPayload (line 82) | buildSdkPayload(context: AssistantContext): { payload: object; session...
    method callSdk (line 143) | private async callSdk(
    method consumeSdkStream (line 160) | private async consumeSdkStream(
    method processChunkMessages (line 249) | private async processChunkMessages(
    method mapSdkMessage (line 292) | private mapSdkMessage(
    method isSdkText (line 371) | private isSdkText(msg: SdkMessageResponse): msg is SdkTextMessage {
    method isSdkCodeDiff (line 375) | private isSdkCodeDiff(msg: SdkMessageResponse): msg is SdkCodeDiffMess...
    method isSdkSummary (line 379) | private isSdkSummary(msg: SdkMessageResponse): msg is SdkSummaryMessage {
    method isSdkAgentSuggestion (line 383) | private isSdkAgentSuggestion(msg: SdkMessageResponse): msg is SdkAgent...
    method isSdkIntermediateStep (line 387) | private isSdkIntermediateStep(msg: SdkMessageResponse): msg is SdkInte...
    method isSdkEvent (line 391) | private isSdkEvent(msg: SdkMessageResponse): msg is SdkEndSessionEvent {
    method isSdkError (line 395) | private isSdkError(msg: SdkMessageResponse): msg is SdkErrorMessage {

FILE: packages/@n8n/ai-workflow-builder.ee/src/assistant/test/assistant-handler.test.ts
  function createMockSdkResponse (line 17) | function createMockSdkResponse(chunks: SdkStreamChunk[], ok = true, stat...
  function createSplitResponse (line 41) | function createSplitResponse(chunks: SdkStreamChunk[], splitAt: number):...
  function createMockClient (line 57) | function createMockClient(response: Response): AssistantSdkClient {
  method start (line 547) | start(controller) {
  method pull (line 581) | pull(controller) {

FILE: packages/@n8n/ai-workflow-builder.ee/src/assistant/types.ts
  type AssistantSdkClient (line 10) | interface AssistantSdkClient {
  type StreamWriter (line 18) | type StreamWriter = (chunk: StreamChunk) => void | Promise<void>;
  type AssistantContext (line 24) | interface AssistantContext {
  type AssistantResult (line 44) | interface AssistantResult {
  type SdkTextMessage (line 62) | interface SdkTextMessage {
  type SdkCodeDiffMessage (line 71) | interface SdkCodeDiffMessage {
  type SdkSummaryMessage (line 80) | interface SdkSummaryMessage {
  type SdkAgentSuggestionMessage (line 87) | interface SdkAgentSuggestionMessage {
  type SdkIntermediateStep (line 95) | interface SdkIntermediateStep {
  type SdkEndSessionEvent (line 102) | interface SdkEndSessionEvent {
  type SdkErrorMessage (line 107) | interface SdkErrorMessage {
  type SdkMessageResponse (line 114) | type SdkMessageResponse =
  type SdkStreamChunk (line 124) | interface SdkStreamChunk {

FILE: packages/@n8n/ai-workflow-builder.ee/src/chains/conversation-compact.ts
  function conversationCompactChain (line 9) | async function conversationCompactChain(

FILE: packages/@n8n/ai-workflow-builder.ee/src/chains/prompt-categorization.ts
  function promptCategorizationChain (line 10) | async function promptCategorizationChain(

FILE: packages/@n8n/ai-workflow-builder.ee/src/chains/test/conversation-compact.test.ts
  class MockStructuredLLM (line 9) | class MockStructuredLLM extends FakeListChatModel {
    method constructor (line 12) | constructor(response: Record<string, unknown>) {
    method withStructuredOutput (line 18) | withStructuredOutput(): any {
  class ErrorLLM (line 207) | class ErrorLLM extends FakeListChatModel {
    method withStructuredOutput (line 209) | withStructuredOutput(): any {

FILE: packages/@n8n/ai-workflow-builder.ee/src/chains/test/integration/prompt-categorization.integration.test.ts
  function hasExpectedTechniques (line 92) | function hasExpectedTechniques(
  function calculateTechniqueFrequency (line 104) | function calculateTechniqueFrequency(

FILE: packages/@n8n/ai-workflow-builder.ee/src/chains/test/integration/test-helpers.ts
  function setupIntegrationLLM (line 12) | async function setupIntegrationLLM(): Promise<BaseChatModel> {
  function shouldRunIntegrationTests (line 26) | function shouldRunIntegrationTests(): boolean {

FILE: packages/@n8n/ai-workflow-builder.ee/src/chains/workflow-name.ts
  function workflowNameChain (line 7) | async function workflowNameChain(

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/code-builder-agent.ts
  class CodeBuilderAgent (line 65) | class CodeBuilderAgent {
    method constructor (line 89) | constructor(config: CodeBuilderAgentConfig) {
    method resetAccumulatedTokens (line 179) | private resetAccumulatedTokens(): void {
    method emitTelemetryEvent (line 186) | private emitTelemetryEvent(params: {
    method chat (line 249) | async *chat(
    method runAgenticLoop (line 401) | private async *runAgenticLoop(
    method checkConsecutiveParseErrors (line 537) | private checkConsecutiveParseErrors(count: number): void {
    method processIteration (line 546) | private async *processIteration(params: {
    method handleToolCalls (line 602) | private async *handleToolCalls(params: {
    method handleTextEditorAutoFinalize (line 668) | private async *handleTextEditorAutoFinalize(params: {
    method handleFinalResponse (line 733) | private async handleFinalResponse(params: {
  type AgenticLoopParams (line 770) | interface AgenticLoopParams {
  type AgenticLoopResult (line 785) | interface AgenticLoopResult {
  type TraceEntry (line 796) | type TraceEntry = { type: 'text'; text: string } | { type: 'tool-call'; ...
  type AgenticLoopState (line 801) | interface AgenticLoopState {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/code-workflow-builder.ts
  type CodeWorkflowBuilderConfig (line 33) | interface CodeWorkflowBuilderConfig {
  class CodeWorkflowBuilder (line 86) | class CodeWorkflowBuilder {
    method constructor (line 92) | constructor(config: CodeWorkflowBuilderConfig) {
    method chat (line 129) | async *chat(
  function createCodeWorkflowBuilder (line 183) | function createCodeWorkflowBuilder(

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/constants.ts
  constant MAX_AGENT_ITERATIONS (line 10) | const MAX_AGENT_ITERATIONS = 50;
  constant MAX_VALIDATE_ATTEMPTS (line 13) | const MAX_VALIDATE_ATTEMPTS = 10;
  constant FIX_VALIDATION_ERRORS_INSTRUCTION (line 16) | const FIX_VALIDATION_ERRORS_INSTRUCTION = `
  constant TEXT_EDITOR_TOOL (line 25) | const TEXT_EDITOR_TOOL = {
  constant BATCH_STR_REPLACE_TOOL (line 31) | const BATCH_STR_REPLACE_TOOL = {
  constant VALIDATE_TOOL (line 59) | const VALIDATE_TOOL = {
  constant CODE_BUILDER_TEXT_EDITOR_TOOL (line 81) | const CODE_BUILDER_TEXT_EDITOR_TOOL: BuilderToolBase = {
  constant CODE_BUILDER_BATCH_STR_REPLACE_TOOL (line 86) | const CODE_BUILDER_BATCH_STR_REPLACE_TOOL: BuilderToolBase = {
  constant CODE_BUILDER_VALIDATE_TOOL (line 91) | const CODE_BUILDER_VALIDATE_TOOL: BuilderToolBase = {
  constant CODE_BUILDER_SEARCH_NODES_TOOL (line 96) | const CODE_BUILDER_SEARCH_NODES_TOOL: BuilderToolBase = {
  constant CODE_BUILDER_GET_NODE_TYPES_TOOL (line 101) | const CODE_BUILDER_GET_NODE_TYPES_TOOL: BuilderToolBase = {
  constant CODE_BUILDER_GET_SUGGESTED_NODES_TOOL (line 106) | const CODE_BUILDER_GET_SUGGESTED_NODES_TOOL: BuilderToolBase = {
  constant MCP_GET_SDK_REFERENCE_TOOL (line 112) | const MCP_GET_SDK_REFERENCE_TOOL: BuilderToolBase = {
  constant MCP_CREATE_WORKFLOW_FROM_CODE_TOOL (line 117) | const MCP_CREATE_WORKFLOW_FROM_CODE_TOOL: BuilderToolBase = {
  constant MCP_ARCHIVE_WORKFLOW_TOOL (line 122) | const MCP_ARCHIVE_WORKFLOW_TOOL: BuilderToolBase = {
  constant MCP_UPDATE_WORKFLOW_TOOL (line 127) | const MCP_UPDATE_WORKFLOW_TOOL: BuilderToolBase = {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/engines/code-builder-node-search-engine.ts
  function isNodeConnectionType (line 19) | function isNodeConnectionType(value: string): value is NodeConnectionType {
  constant DEFAULT_SUBNODES (line 27) | const DEFAULT_SUBNODES: Record<string, string[]> = {
  constant NODE_SEARCH_KEYS (line 39) | const NODE_SEARCH_KEYS = [
  function getTypeName (line 50) | function getTypeName(nodeName: string): string {
  constant SCORE_WEIGHTS (line 59) | const SCORE_WEIGHTS = {
  function getLatestVersion (line 64) | function getLatestVersion(version: number | number[]): number {
  function extractSubnodeRequirements (line 71) | function extractSubnodeRequirements(inputs?: BuilderHintInputs): Subnode...
  function dedupeNodes (line 81) | function dedupeNodes(nodes: INodeTypeDescription[]): INodeTypeDescriptio...
  class CodeBuilderNodeSearchEngine (line 105) | class CodeBuilderNodeSearchEngine {
    method constructor (line 107) | constructor(nodeTypes: INodeTypeDescription[]) {
    method searchByName (line 118) | searchByName(query: string, limit: number = 20): CodeBuilderNodeSearch...
    method searchByConnectionType (line 179) | searchByConnectionType(
    method formatResult (line 250) | formatResult(result: CodeBuilderNodeSearchResult): string {
    method getSubnodesForConnectionType (line 298) | getSubnodesForConnectionType(connectionType: string): string[] {
    method getRelatedSubnodeIds (line 311) | getRelatedSubnodeIds(nodeIds: string[], excludeNodeIds: Set<string>): ...
    method getNodeType (line 352) | getNodeType(nodeId: string): INodeTypeDescription | undefined {
    method getConnectionScore (line 362) | private getConnectionScore(
    method isAiConnectionType (line 388) | static isAiConnectionType(connectionType: string): boolean {
    method getAiConnectionTypes (line 396) | static getAiConnectionTypes(): NodeConnectionType[] {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/agent-iteration-handler.ts
  type ResponseMetadataWithUsage (line 19) | interface ResponseMetadataWithUsage {
  function hasUsageMetadata (line 23) | function hasUsageMetadata(metadata: unknown): metadata is ResponseMetada...
  type AgentIterationHandlerConfig (line 35) | interface AgentIterationHandlerConfig {
  type IterationParams (line 46) | interface IterationParams {
  type LlmInvocationResult (line 62) | interface LlmInvocationResult {
  class AgentIterationHandler (line 92) | class AgentIterationHandler {
    method constructor (line 97) | constructor(config: AgentIterationHandlerConfig = {}) {
    method getCallbacks (line 104) | getCallbacks(): Callbacks | undefined {
    method getRunMetadata (line 109) | getRunMetadata(): Record<string, unknown> | undefined {
    method invokeLlm (line 127) | async *invokeLlm(

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/auto-finalize-handler.ts
  type ParseAndValidateFn (line 21) | type ParseAndValidateFn = (
  type GetErrorContextFn (line 29) | type GetErrorContextFn = (code: string, errorMessage: string) => string;
  type AutoFinalizeHandlerConfig (line 34) | interface AutoFinalizeHandlerConfig {
  type AutoFinalizeParams (line 42) | interface AutoFinalizeParams {
  type AutoFinalizeResult (line 56) | interface AutoFinalizeResult {
  class AutoFinalizeHandler (line 72) | class AutoFinalizeHandler {
    method constructor (line 76) | constructor(config: AutoFinalizeHandlerConfig) {
    method execute (line 89) | async *execute(

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/chat-setup-handler.ts
  type ParseAndValidateFn (line 34) | type ParseAndValidateFn = (
  type GetErrorContextFn (line 42) | type GetErrorContextFn = (code: string, errorMessage: string) => string;
  type ChatSetupHandlerConfig (line 47) | interface ChatSetupHandlerConfig {
  type ChatSetupParams (line 60) | interface ChatSetupParams {
  type LlmWithTools (line 68) | type LlmWithTools = Runnable<BaseMessage[], AIMessage, BaseChatModelCall...
  type ChatSetupResult (line 73) | interface ChatSetupResult {
  class ChatSetupHandler (line 94) | class ChatSetupHandler {
    method constructor (line 103) | constructor(config: ChatSetupHandlerConfig) {
    method execute (line 119) | async execute(params: ChatSetupParams): Promise<ChatSetupResult> {
    method shouldEnableTextEditor (line 179) | private shouldEnableTextEditor(): boolean {
    method preGenerateWorkflowCode (line 195) | private preGenerateWorkflowCode(
    method bindToolsToLlm (line 218) | private bindToolsToLlm(textEditorEnabled: boolean, hasPlanOutput: bool...
    method formatInitialMessages (line 242) | private async formatInitialMessages(
    method initializeTextEditorHandlers (line 253) | private initializeTextEditorHandlers(
    method prefetchSearchResults (line 288) | private prefetchSearchResults(plan: PlanOutput): string | undefined {
  function extractNodeNamesFromPlan (line 313) | function extractNodeNamesFromPlan(plan: PlanOutput): string[] {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/final-response-handler.ts
  type ParseAndValidateFn (line 20) | type ParseAndValidateFn = (
  type FinalResponseHandlerConfig (line 28) | interface FinalResponseHandlerConfig {
  type FinalResponseParams (line 35) | interface FinalResponseParams {
  type FinalResponseResult (line 49) | interface FinalResponseResult {
  class FinalResponseHandler (line 73) | class FinalResponseHandler {
    method constructor (line 76) | constructor(config: FinalResponseHandlerConfig) {
    method process (line 86) | async process(params: FinalResponseParams): Promise<FinalResponseResul...
    method parseStructuredOutput (line 168) | private parseStructuredOutput(message: AIMessage): {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/parse-validate-handler.ts
  type ParseValidateHandlerConfig (line 19) | interface ParseValidateHandlerConfig {
  type ValidationIssue (line 34) | interface ValidationIssue {
  class ParseValidateHandler (line 40) | class ParseValidateHandler {
    method constructor (line 44) | constructor(config: ParseValidateHandlerConfig = {}) {
    method collectValidationIssues (line 53) | private collectValidationIssues(
    method validateExistingWorkflow (line 92) | validateExistingWorkflow(json: WorkflowJSON): ValidationWarning[] {
    method parseAndValidate (line 123) | async parseAndValidate(
    method getErrorContext (line 217) | getErrorContext(code: string, errorMessage: string): string {
    method detectFixHint (line 257) | private detectFixHint(lines: string[], errorLine: number): string | nu...

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/session-chat-handler.ts
  function isSessionMessagesChunk (line 25) | function isSessionMessagesChunk(chunk: StreamChunk): chunk is SessionMes...
  type AgentChatFn (line 32) | type AgentChatFn = (
  type SessionChatHandlerConfig (line 42) | interface SessionChatHandlerConfig {
  type SessionChatParams (line 56) | interface SessionChatParams {
  class SessionChatHandler (line 74) | class SessionChatHandler {
    method constructor (line 80) | constructor(config: SessionChatHandlerConfig) {
    method buildHistoryContext (line 90) | private buildHistoryContext(session: {
    method processChunk (line 106) | private processChunk(chunk: StreamOutput): {
    method execute (line 135) | async *execute(params: SessionChatParams): AsyncGenerator<StreamOutput...

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/test/auto-finalize-handler.test.ts
  function consumeGenerator (line 317) | async function consumeGenerator<T, R>(gen: AsyncGenerator<T, R>): Promis...

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/test/chat-setup-handler.test.ts
  function createMockTool (line 10) | function createMockTool(name: string): StructuredToolInterface {
  function createMockLlm (line 14) | function createMockLlm() {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/test/text-editor-tool-handler.test.ts
  function isToolProgressChunk (line 18) | function isToolProgressChunk(chunk: unknown): chunk is ToolProgressChunk {
  function isWorkflowUpdateChunk (line 28) | function isWorkflowUpdateChunk(chunk: unknown): chunk is WorkflowUpdateC...

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/test/tool-dispatch-handler.test.ts
  function isToolProgressChunk (line 21) | function isToolProgressChunk(chunk: unknown): chunk is ToolProgressChunk {
  function isWorkflowUpdateChunk (line 31) | function isWorkflowUpdateChunk(chunk: unknown): chunk is WorkflowUpdateC...
  function createHandler (line 43) | function createHandler(
  function drainGenerator (line 55) | async function drainGenerator(
  function createMockTextEditorToolHandler (line 277) | function createMockTextEditorToolHandler(): TextEditorToolHandler {
  function createMockTextEditorHandler (line 287) | function createMockTextEditorHandler(): TextEditorHandler {
  function createMockValidateToolHandler (line 294) | function createMockValidateToolHandler(workflowReady = false): ValidateT...
  function collectChunks (line 553) | async function collectChunks(

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/test/validate-tool-handler.test.ts
  function isToolProgressChunk (line 13) | function isToolProgressChunk(chunk: unknown): chunk is ToolProgressChunk {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/text-editor-handler.ts
  constant WORKFLOW_FILE_PATH (line 28) | const WORKFLOW_FILE_PATH = '/workflow.js';
  constant PREVIEW_MAX_LENGTH (line 31) | const PREVIEW_MAX_LENGTH = 80;
  function truncatePreview (line 33) | function truncatePreview(str: string): string {
  function formatCodeWithLineNumbers (line 44) | function formatCodeWithLineNumbers(code: string): string {
  constant MIN_PREFIX_LENGTH (line 50) | const MIN_PREFIX_LENGTH = 10;
  constant CONTEXT_LINES (line 53) | const CONTEXT_LINES = 3;
  constant OLD_STR_CONTEXT_LENGTH (line 56) | const OLD_STR_CONTEXT_LENGTH = 40;
  function escapeWhitespace (line 58) | function escapeWhitespace(str: string): string {
  function findDivergenceContext (line 67) | function findDivergenceContext(code: string, searchStr: string): string ...
  class TextEditorHandler (line 118) | class TextEditorHandler {
    method constructor (line 121) | constructor() {}
    method execute (line 130) | execute(command: TextEditorCommand): string {
    method validatePath (line 165) | private validatePath(path: string): void {
    method handleView (line 174) | private handleView(command: ViewCommand): string {
    method handleCreate (line 209) | private handleCreate(command: CreateCommand): string {
    method handleStrReplace (line 217) | private handleStrReplace(command: StrReplaceCommand): string {
    method handleInsert (line 256) | private handleInsert(command: InsertCommand): string {
    method countOccurrences (line 279) | private countOccurrences(text: string, search: string): number {
    method executeBatch (line 303) | executeBatch(replacements: StrReplacement[]): string | BatchReplaceRes...
    method getWorkflowCode (line 367) | getWorkflowCode(): string | null {
    method setWorkflowCode (line 374) | setWorkflowCode(code: string): void {
    method hasWorkflowCode (line 381) | hasWorkflowCode(): boolean {
    method clearWorkflowCode (line 388) | clearWorkflowCode(): void {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/text-editor-tool-handler.ts
  type TextEditorExecuteFn (line 21) | type TextEditorExecuteFn = (args: Record<string, unknown>) => string;
  type TextEditorGetCodeFn (line 26) | type TextEditorGetCodeFn = () => string | null;
  type ParseAndValidateFn (line 31) | type ParseAndValidateFn = (
  type GetErrorContextFn (line 39) | type GetErrorContextFn = (code: string, errorMessage: string) => string;
  type TextEditorToolHandlerConfig (line 44) | interface TextEditorToolHandlerConfig {
  type TextEditorToolParams (line 54) | interface TextEditorToolParams {
  type TextEditorToolResult (line 67) | interface TextEditorToolResult {
  type PreviewParseResult (line 75) | interface PreviewParseResult {
  class TextEditorToolHandler (line 91) | class TextEditorToolHandler {
    method constructor (line 97) | constructor(config: TextEditorToolHandlerConfig) {
    method execute (line 111) | async *execute(
    method autoValidateAfterCreate (line 184) | private async autoValidateAfterCreate(
    method tryParseForPreview (line 262) | async tryParseForPreview(currentWorkflow?: WorkflowJSON): Promise<Prev...
    method createToolProgressChunk (line 280) | private createToolProgressChunk(
    method createWorkflowUpdateChunk (line 302) | private createWorkflowUpdateChunk(workflow: WorkflowJSON): StreamOutput {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/text-editor.types.ts
  type ViewCommand (line 11) | interface ViewCommand {
  type CreateCommand (line 21) | interface CreateCommand {
  type StrReplaceCommand (line 30) | interface StrReplaceCommand {
  type InsertCommand (line 40) | interface InsertCommand {
  type TextEditorCommand (line 51) | type TextEditorCommand = ViewCommand | CreateCommand | StrReplaceCommand...
  type TextEditorToolCall (line 56) | interface TextEditorToolCall {
  type TextEditorResult (line 65) | interface TextEditorResult {
  class NoMatchFoundError (line 73) | class NoMatchFoundError extends Error {
    method constructor (line 74) | constructor(_searchStr: string, nearMatchContext?: string) {
  class MultipleMatchesError (line 86) | class MultipleMatchesError extends Error {
    method constructor (line 87) | constructor(count: number) {
  class InvalidLineNumberError (line 96) | class InvalidLineNumberError extends Error {
    method constructor (line 97) | constructor(line: number, maxLine: number) {
  class InvalidViewRangeError (line 106) | class InvalidViewRangeError extends Error {
    method constructor (line 107) | constructor(start: number, end: number, maxLine: number) {
  class InvalidPathError (line 118) | class InvalidPathError extends Error {
    method constructor (line 119) | constructor(path: string) {
  class FileExistsError (line 128) | class FileExistsError extends Error {
    method constructor (line 129) | constructor() {
  class FileNotFoundError (line 138) | class FileNotFoundError extends Error {
    method constructor (line 139) | constructor() {
  type StrReplacement (line 148) | interface StrReplacement {
  type BatchReplaceResult (line 157) | interface BatchReplaceResult {
  class BatchReplacementError (line 169) | class BatchReplacementError extends Error {
    method constructor (line 174) | constructor(

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/tool-dispatch-handler.ts
  function parseReplacements (line 24) | function parseReplacements(raw: unknown): StrReplacement[] {
  type ToolCall (line 63) | interface ToolCall {
  type ToolDispatchHandlerConfig (line 72) | interface ToolDispatchHandlerConfig {
  type ToolDispatchParams (line 81) | interface ToolDispatchParams {
  type ToolDispatchResult (line 94) | interface ToolDispatchResult {
  class ToolDispatchHandler (line 113) | class ToolDispatchHandler {
    method constructor (line 118) | constructor(config: ToolDispatchHandlerConfig) {
    method dispatch (line 131) | async *dispatch(
    method executeToolCall (line 212) | private async *executeToolCall(params: {
    method executeGeneralToolCall (line 299) | private async *executeGeneralToolCall(
    method executeBatchStrReplace (line 397) | private async *executeBatchStrReplace(params: {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/handlers/validate-tool-handler.ts
  type ParseAndValidateFn (line 21) | type ParseAndValidateFn = (
  type GetErrorContextFn (line 29) | type GetErrorContextFn = (code: string, errorMessage: string) => string;
  type ValidateToolHandlerConfig (line 34) | interface ValidateToolHandlerConfig {
  type ValidateToolParams (line 42) | interface ValidateToolParams {
  type ValidateToolResult (line 54) | interface ValidateToolResult {
  class ValidateToolHandler (line 69) | class ValidateToolHandler {
    method constructor (line 73) | constructor(config: ValidateToolHandlerConfig) {
    method execute (line 85) | async *execute(
    method createToolProgressChunk (line 183) | private createToolProgressChunk(
    method createWorkflowUpdateChunk (line 203) | private createWorkflowUpdateChunk(workflow: WorkflowJSON): StreamOutput {

FILE: packages/@n8n/ai-workflow-builder.ee/src/code-builder/prompts/index.ts
  function escapeCurlyBrackets (line 28) | function escapeCurlyBrackets(text: string): string {
  constant ROLE (line 35) | const ROLE =
  constant RESPONSE_STYLE (line 41) | const RESPONSE_STYLE = `**Be extremely concise in your visible responses...
  constant WORKFLOW_P
Copy disabled (too large) Download .json
Condensed preview — 16087 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (112,308K chars).
[
  {
    "path": ".actrc",
    "chars": 189,
    "preview": "-P blacksmith-2vcpu-ubuntu-2204=ubuntu-latest\n-P blacksmith-4vcpu-ubuntu-2204=ubuntu-latest\n-P ubuntu-22.04=ubuntu-lates"
  },
  {
    "path": ".agents/design-system-style-rules.md",
    "chars": 2180,
    "preview": "# Design System Style Review Rules\n\nUse these rules when reviewing CSS/SCSS/Vue style changes, especially in\n`packages/f"
  },
  {
    "path": ".claude/README.md",
    "chars": 1829,
    "preview": "# Claude Code Configuration\n\nThis directory contains shared Claude Code configuration for the n8n team.\n\n## Setup\n\n### L"
  },
  {
    "path": ".claude/agents/n8n-developer.md",
    "chars": 3083,
    "preview": "---\nname: n8n-developer\ndescription: Use this agent for any n8n development task - frontend (Vue 3), backend (Node.js/Ty"
  },
  {
    "path": ".claude/agents/n8n-linear-issue-triager.md",
    "chars": 4939,
    "preview": "---\nname: n8n-linear-issue-triager\ndescription: Use this agent proactively when a Linear issue is created, updated, or n"
  },
  {
    "path": ".claude/commands/n8n-plan.md",
    "chars": 1042,
    "preview": "---\ndescription: Plan n8n Linear ticket implementation\nargument-hint: [PAY-XXXX | DEV-XXXX | ENG-XXXX]\nallowed-tools: Ta"
  },
  {
    "path": ".claude/commands/n8n-triage.md",
    "chars": 212,
    "preview": "---\ndescription: Triage Linear issue with comprehensive analysis\nargument-hint: [PAY-XXXX | DEV-XXXX | ENG-XXXX]\nallowed"
  },
  {
    "path": ".claude/plugins/n8n/.claude-plugin/marketplace.json",
    "chars": 130,
    "preview": "{\n  \"name\": \"n8n\",\n  \"owner\": {\n    \"name\": \"n8n\"\n  },\n  \"plugins\": [\n    {\n      \"name\": \"n8n\",\n      \"source\": \"./\"\n  "
  },
  {
    "path": ".claude/plugins/n8n/.claude-plugin/plugin.json",
    "chars": 121,
    "preview": "{\n  \"name\": \"n8n\",\n  \"description\": \"n8n Claude Code plugin — shared skills, commands, and agents for n8n development\"\n}"
  },
  {
    "path": ".claude/plugins/n8n/README.md",
    "chars": 2294,
    "preview": "# n8n Claude Code Plugin\n\nShared skills, commands, and agents for n8n development.\n\n## Skills\n\n### `n8n:setup-mcps`\n\nCon"
  },
  {
    "path": ".claude/plugins/n8n/skills/setup-mcps/SKILL.md",
    "chars": 2689,
    "preview": "---\ndescription: >-\n  Configure MCP servers for n8n development. Use when the user says /setup-mcps\n  or asks to set up "
  },
  {
    "path": ".claude/settings.json",
    "chars": 497,
    "preview": "{\n\t\"permissions\": {\n\t\t\"allow\": [\n\t\t\t\"Bash(git log:*)\",\n\t\t\t\"Bash(git show:*)\",\n\t\t\t\"Bash(grep:*)\",\n\t\t\t\"Bash(ls:*)\",\n\t\t\t\"Ba"
  },
  {
    "path": ".claude/skills/content-design/SKILL.md",
    "chars": 13741,
    "preview": "---\nname: content-design\ndescription: >\n  Product content designer for UI copy. Use when writing, reviewing, or auditing"
  },
  {
    "path": ".claude/skills/create-issue/SKILL.md",
    "chars": 11447,
    "preview": "---\nname: create-issue\ndescription: Create Linear tickets or GitHub issues following n8n conventions. Use when the user "
  },
  {
    "path": ".claude/skills/create-pr/SKILL.md",
    "chars": 6536,
    "preview": "---\nname: create-pr\ndescription: Creates GitHub pull requests with properly formatted titles that pass the check-pr-titl"
  },
  {
    "path": ".claude/skills/create-skill/SKILL.md",
    "chars": 6011,
    "preview": "---\nname: create-skill\ndescription: >-\n  Guides users through creating effective Agent Skills. Use when you want to\n  cr"
  },
  {
    "path": ".claude/skills/linear-issue/SKILL.md",
    "chars": 9039,
    "preview": "---\nname: linear-issue\ndescription: Fetch and analyze Linear issue with all related context. Use when starting work on a"
  },
  {
    "path": ".claude/skills/loom-transcript/SKILL.md",
    "chars": 3630,
    "preview": "---\nname: loom-transcript\ndescription: Fetch and display the full transcript from a Loom video URL. Use when the user wa"
  },
  {
    "path": ".claude/skills/n8n-conventions/SKILL.md",
    "chars": 2395,
    "preview": "---\nname: n8n-conventions\ndescription: Quick reference for n8n patterns. Full docs /AGENTS.md\n---\n\n# n8n Quick Reference"
  },
  {
    "path": ".claude/skills/node-add-oauth/SKILL.md",
    "chars": 11355,
    "preview": "---\nname: node-add-oauth\ndescription: Add OAuth2 credential support to an existing n8n node — creates the credential fil"
  },
  {
    "path": ".claude/skills/reproduce-bug/SKILL.md",
    "chars": 5206,
    "preview": "---\nname: reproduce-bug\ndescription: Reproduce a bug from a Linear ticket with a failing test. Expects the full ticket c"
  },
  {
    "path": ".claude/skills/spec-driven-development/SKILL.md",
    "chars": 3207,
    "preview": "---\nname: spec-driven-development\ndescription: Keeps implementation and specs in sync. Use when working on a feature tha"
  },
  {
    "path": ".devcontainer/Dockerfile",
    "chars": 471,
    "preview": "ARG NODE_VERSION=24\n\nFROM node:${NODE_VERSION}-alpine\n\nARG NODE_VERSION\n\nRUN apk add --no-cache \\\n    openssh sudo shado"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 608,
    "preview": "{\n\t\"name\": \"n8n\",\n\t\"dockerComposeFile\": \"docker-compose.yml\",\n\t\"service\": \"n8n\",\n\t\"workspaceFolder\": \"/workspaces\",\n\t\"mo"
  },
  {
    "path": ".devcontainer/docker-compose.yml",
    "chars": 496,
    "preview": "volumes:\n  postgres-data:\n\nservices:\n  postgres:\n    image: postgres:16-alpine\n    restart: unless-stopped\n    volumes:\n"
  },
  {
    "path": ".dockerignore",
    "chars": 1009,
    "preview": "# Whitelist approach: ignore everything, then allow only what Docker builds need\n# This reduces build context from ~900M"
  },
  {
    "path": ".editorconfig",
    "chars": 272,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nindent_style = tab\nindent_size = 2\nend_of_line = lf\ninsert_final_newline = true\ntrim_tr"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 485,
    "preview": "# Commits of large-scale changes to exclude from `git blame` results\n\n# Set up linting and formatting (#2120)\n\n56c4c6991"
  },
  {
    "path": ".gitattributes",
    "chars": 17,
    "preview": "*.sh text eol=lf\n"
  },
  {
    "path": ".github/CI-TELEMETRY.md",
    "chars": 3223,
    "preview": "# CI Telemetry\n\nPipeline: **GitHub Actions → Webhook → n8n → BigQuery**\n\n## Unified Payload Shape\n\nAll telemetry uses th"
  },
  {
    "path": ".github/CLAUDE.md",
    "chars": 1027,
    "preview": "@../AGENTS.md\n\n## .github Quick Reference\n\nThis folder contains n8n's GitHub Actions infrastructure.\n\n### Key Files\n\n| F"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 204,
    "preview": "packages/@n8n/db/src/migrations/ @n8n-io/migrations-review\n.github/workflows @n8n-io/ci-admins\n.github/scripts @n8n-io/c"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/01-bug.yml",
    "chars": 2849,
    "preview": "name: Bug Report\ndescription: Create a bug report to help us improve\nbody:\n  - type: markdown\n    attributes:\n      valu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 394,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Feature request\n    url: https://community.n8n.io\n    about: Sugges"
  },
  {
    "path": ".github/WORKFLOWS.md",
    "chars": 31378,
    "preview": "# GitHub Actions & CI/CD Documentation\n\nComplete reference for n8n's `.github/` folder.\n\n---\n\n## Folder Structure\n\n```\n."
  },
  {
    "path": ".github/actionlint.yml",
    "chars": 231,
    "preview": "self-hosted-runner:\n  labels:\n    - blacksmith-2vcpu-ubuntu-2204\n    - blacksmith-4vcpu-ubuntu-2204\n    - blacksmith-2vc"
  },
  {
    "path": ".github/actions/ci-filter/__tests__/ci-filter.test.ts",
    "chars": 7219,
    "preview": "import { describe, it } from 'node:test';\nimport assert from 'node:assert/strict';\nimport { matchGlob, parseFilters, eva"
  },
  {
    "path": ".github/actions/ci-filter/action.yml",
    "chars": 1241,
    "preview": "name: 'CI Filter'\ndescription: |\n  Filter CI jobs by changed files and validate results.\n\n  Modes:\n    - filter: Determi"
  },
  {
    "path": ".github/actions/ci-filter/ci-filter.mjs",
    "chars": 5343,
    "preview": "import { execSync } from 'node:child_process';\nimport { appendFileSync } from 'node:fs';\nimport { fileURLToPath } from '"
  },
  {
    "path": ".github/actions/docker-registry-login/action.yml",
    "chars": 1807,
    "preview": "# Composite action for logging into Docker registries (GHCR and/or DockerHub).\n# Centralizes the login pattern used acro"
  },
  {
    "path": ".github/actions/setup-nodejs/action.yml",
    "chars": 3579,
    "preview": "# This action works transparently on both Blacksmith and GitHub-hosted runners.\n# Blacksmith runners benefit from transp"
  },
  {
    "path": ".github/claude-templates/e2e-test.md",
    "chars": 3790,
    "preview": "# E2E Test Task Guide\n\n## Required Reading\n\n**Before writing any code**, read these files:\n```\npackages/testing/playwrig"
  },
  {
    "path": ".github/claude-templates/security-fix.md",
    "chars": 3925,
    "preview": "# Security Vulnerability Fix Guidelines\n\n## Overview\nThis guide covers how to fix security vulnerabilities in the n8n co"
  },
  {
    "path": ".github/docker-compose.yml",
    "chars": 245,
    "preview": "services:\n  postgres:\n    image: postgres:16\n    restart: always\n    environment:\n      - POSTGRES_DB=n8n\n      - POSTGR"
  },
  {
    "path": ".github/poutine-rules/unpinned_action.rego",
    "chars": 1066,
    "preview": "# METADATA\n# title: Unpinned GitHub Action\n# description: |-\n#   GitHub Action not pinned to full commit SHA.\n#   Pin ac"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 1163,
    "preview": "## Summary\n\n<!--\nDescribe what the PR does and how to test.\nPhotos and videos are recommended.\n-->\n\n## Related Linear ti"
  },
  {
    "path": ".github/pull_request_title_conventions.md",
    "chars": 4959,
    "preview": "# PR Title Convention\n\nWe have very precise rules over how Pull Requests (to the `master` branch) must be formatted. Thi"
  },
  {
    "path": ".github/scripts/bump-versions.mjs",
    "chars": 3749,
    "preview": "import semver from 'semver';\nimport { writeFile, readFile } from 'fs/promises';\nimport { resolve } from 'path';\nimport c"
  },
  {
    "path": ".github/scripts/claude-task/prepare-claude-prompt.mjs",
    "chars": 2192,
    "preview": "#!/usr/bin/env node\n/**\n * Builds the Claude task prompt and writes it to GITHUB_ENV.\n * Uses a random delimiter to prev"
  },
  {
    "path": ".github/scripts/claude-task/resume-callback.mjs",
    "chars": 1802,
    "preview": "#!/usr/bin/env node\n/**\n * Sends a callback to the resume URL with the Claude task result.\n * Uses fetch() directly to a"
  },
  {
    "path": ".github/scripts/cleanup-ghcr-images.mjs",
    "chars": 4408,
    "preview": "#!/usr/bin/env node\n/**\n * Cleanup GHCR images for n8n CI\n *\n * Modes:\n *   --tag <tag>     Delete exact tag (post-run c"
  },
  {
    "path": ".github/scripts/cleanup-release-branch.mjs",
    "chars": 3244,
    "preview": "import fs from 'node:fs/promises';\nimport { getOctokit } from '@actions/github';\nimport { ensureEnvVar, readPrLabels } f"
  },
  {
    "path": ".github/scripts/cleanup-release-branch.test.mjs",
    "chars": 3759,
    "preview": "import { describe, it, mock, before } from 'node:test';\nimport assert from 'node:assert/strict';\nimport { readPrLabels }"
  },
  {
    "path": ".github/scripts/compute-backport-targets.mjs",
    "chars": 2881,
    "preview": "// Creates backport PR's according to labels on merged PR\n\nimport {\n\tgetPullRequestById,\n\treadPrLabels,\n\tresolveRcBranch"
  },
  {
    "path": ".github/scripts/compute-backport-targets.test.mjs",
    "chars": 3187,
    "preview": "import { describe, it, mock, before } from 'node:test';\nimport assert from 'node:assert/strict';\nimport { readPrLabels }"
  },
  {
    "path": ".github/scripts/create-github-release.mjs",
    "chars": 2366,
    "preview": "import {\n\tdeleteRelease,\n\tensureEnvVar,\n\tgetExistingRelease,\n\tinitGithub,\n\tisReleaseTrack,\n\twriteGithubOutput,\n} from '."
  },
  {
    "path": ".github/scripts/detect-new-packages.mjs",
    "chars": 3084,
    "preview": "/**\n * Detects packages in the monorepo that have not yet been published to npm.\n *\n * Packages that are new (never publ"
  },
  {
    "path": ".github/scripts/determine-release-candidate-branch-for-track.mjs",
    "chars": 1488,
    "preview": "import {\n\tensureEnvVar,\n\tlistCommitsBetweenRefs,\n\tresolveRcBranchForTrack,\n\tresolveReleaseTagForTrack,\n\twriteGithubOutpu"
  },
  {
    "path": ".github/scripts/determine-release-version-changes.mjs",
    "chars": 1051,
    "preview": "import { ensureEnvVar, sh, writeGithubOutput } from './github-helpers.mjs';\n\nfunction determineReleaseVersionChanges() {"
  },
  {
    "path": ".github/scripts/determine-release-version-changes.test.mjs",
    "chars": 1483,
    "preview": "import { describe, it, mock, before } from 'node:test';\nimport assert from 'node:assert/strict';\n\n/**\n * Run these tests"
  },
  {
    "path": ".github/scripts/determine-version-info.mjs",
    "chars": 3994,
    "preview": "import { readFileSync } from 'node:fs';\nimport {\n\tRELEASE_TRACKS,\n\tresolveReleaseTagForTrack,\n\ttagVersionInfoToReleaseCa"
  },
  {
    "path": ".github/scripts/determine-version-info.test.mjs",
    "chars": 3818,
    "preview": "import { describe, it, mock, before } from 'node:test';\nimport assert from 'node:assert/strict';\nimport { tagVersionInfo"
  },
  {
    "path": ".github/scripts/docker/docker-config.mjs",
    "chars": 4888,
    "preview": "#!/usr/bin/env node\n\nimport { appendFileSync } from 'node:fs';\n\nclass BuildContext {\n\tconstructor() {\n\t\tthis.githubOutpu"
  },
  {
    "path": ".github/scripts/docker/docker-tags.mjs",
    "chars": 3085,
    "preview": "#!/usr/bin/env node\n\nimport { appendFileSync } from 'node:fs';\n\nclass TagGenerator {\n\tconstructor() {\n\t\tthis.githubOwner"
  },
  {
    "path": ".github/scripts/docker/get-manifest-digests.mjs",
    "chars": 2392,
    "preview": "#!/usr/bin/env node\n/**\n * Extracts manifest digests and image names for SLSA provenance and VEX attestation.\n *\n * Usag"
  },
  {
    "path": ".github/scripts/ensure-provenance-fields.mjs",
    "chars": 1566,
    "preview": "import { writeFile, readFile, copyFile } from 'fs/promises';\nimport { resolve, dirname } from 'path';\nimport child_proce"
  },
  {
    "path": ".github/scripts/ensure-release-candidate-branches.mjs",
    "chars": 4135,
    "preview": "import semver from 'semver';\nimport {\n\tgetCommitForRef,\n\tlocalRefExists,\n\tRELEASE_CANDIDATE_BRANCH_PREFIX,\n\tremoteBranch"
  },
  {
    "path": ".github/scripts/ensure-release-candidate-branches.test.mjs",
    "chars": 2425,
    "preview": "import { describe, it, mock, before } from 'node:test';\nimport assert from 'node:assert/strict';\nimport { RELEASE_CANDID"
  },
  {
    "path": ".github/scripts/fixtures/mock-github-event.json",
    "chars": 72,
    "preview": "{\n\t\"pull_request\": {\n\t\t\"labels\": [\"release\", \"Backport to Stable\"]\n\t}\n}\n"
  },
  {
    "path": ".github/scripts/get-release-versions.mjs",
    "chars": 1377,
    "preview": "import semver from 'semver';\nimport {\n\tgetCommitForRef,\n\tlistTagsPointingAt,\n\tRELEASE_PREFIX,\n\tRELEASE_TRACKS,\n\tstripRel"
  },
  {
    "path": ".github/scripts/github-helpers.mjs",
    "chars": 9092,
    "preview": "import { getOctokit } from '@actions/github';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs"
  },
  {
    "path": ".github/scripts/jsconfig.json",
    "chars": 166,
    "preview": "{\n  \"compilerOptions\": {\n    \"module\": \"esnext\",\n    \"target\": \"esnext\",\n    \"checkJs\": true,\n    \"moduleResolution\": \"b"
  },
  {
    "path": ".github/scripts/move-track-tag.mjs",
    "chars": 515,
    "preview": "import { ensureEnvVar, ensureReleaseTrack, ensureTagExists, sh } from './github-helpers.mjs';\n\nfunction main() {\n\tconst "
  },
  {
    "path": ".github/scripts/package.json",
    "chars": 416,
    "preview": "{\n  \"name\": \"workflow-scripts\",\n  \"scripts\": {\n    \"test\": \"node --test --experimental-test-module-mocks ./*.test.mjs\"\n "
  },
  {
    "path": ".github/scripts/plan-release.mjs",
    "chars": 1295,
    "preview": "import semver from 'semver';\nimport {\n\tensureEnvVar,\n\tisReleaseType,\n\tRELEASE_PREFIX,\n\tstripReleasePrefixes,\n\twriteGithu"
  },
  {
    "path": ".github/scripts/populate-cloud-databases.mjs",
    "chars": 891,
    "preview": "import { ensureEnvVar } from './github-helpers.mjs';\n\nasync function populateCloudDatabases() {\n\tconst payload = ensureE"
  },
  {
    "path": ".github/scripts/promote-github-release.mjs",
    "chars": 1868,
    "preview": "import {\n\tdeleteRelease,\n\tensureEnvVar,\n\tgetExistingRelease,\n\tinitGithub,\n\twriteGithubOutput,\n} from './github-helpers.m"
  },
  {
    "path": ".github/scripts/retry.mjs",
    "chars": 1653,
    "preview": "#!/usr/bin/env node\n/**\n * Retry a shell command with configurable attempts and delay.\n *\n * Usage: node retry.mjs [--at"
  },
  {
    "path": ".github/scripts/send-build-stats.mjs",
    "chars": 1986,
    "preview": "#!/usr/bin/env node\n/**\n * Sends Turbo build stats to the unified QA metrics webhook.\n *\n * Reads the Turbo run summary "
  },
  {
    "path": ".github/scripts/send-docker-stats.mjs",
    "chars": 2109,
    "preview": "#!/usr/bin/env node\n/**\n * Sends Docker build stats to the unified QA metrics webhook.\n *\n * Reads manifests produced by"
  },
  {
    "path": ".github/scripts/send-metrics.mjs",
    "chars": 2874,
    "preview": "#!/usr/bin/env node\n/**\n * Shared metrics sender for CI scripts.\n * See .github/CI-TELEMETRY.md for payload shape and Bi"
  },
  {
    "path": ".github/scripts/send-version-release-notification.mjs",
    "chars": 913,
    "preview": "import { ensureEnvVar } from './github-helpers.mjs';\n\nasync function sendVersionReleaseNotification() {\n\tconst payload ="
  },
  {
    "path": ".github/scripts/trim-fe-packageJson.js",
    "chars": 656,
    "preview": "const { writeFileSync } = require('fs');\nconst { resolve } = require('path');\nconst baseDir = resolve(__dirname, '../..'"
  },
  {
    "path": ".github/scripts/update-changelog.mjs",
    "chars": 2500,
    "preview": "import createTempFile from 'tempfile';\nimport { ConventionalChangelog } from 'conventional-changelog';\nimport { resolve "
  },
  {
    "path": ".github/test-metrics/playwright.json",
    "chars": 21720,
    "preview": "{\n  \"updatedAt\": \"2026-03-03T14:06:03.725Z\",\n  \"source\": \"currents\",\n  \"projectId\": \"LRxcNt\",\n  \"specs\": {\n    \"tests/e2"
  },
  {
    "path": ".github/workflows/backport.yml",
    "chars": 2936,
    "preview": "name: 'Util: Backport pull request changes'\n\nrun-name: Backport pull request ${{ github.event.pull_request.number || inp"
  },
  {
    "path": ".github/workflows/build-base-image.yml",
    "chars": 2740,
    "preview": "name: 'Build: Base Image'\n\non:\n  push:\n    branches:\n      - master\n    paths:\n      - 'docker/images/n8n-base/Dockerfil"
  },
  {
    "path": ".github/workflows/build-benchmark-image.yml",
    "chars": 1155,
    "preview": "name: 'Build: Benchmark Image'\n\non:\n  workflow_dispatch:\n  push:\n    branches:\n      - master\n    paths:\n      - 'packag"
  },
  {
    "path": ".github/workflows/build-windows.yml",
    "chars": 3352,
    "preview": "name: 'Build: Windows'\n\non:\n  workflow_dispatch:\n    inputs:\n      notify_on_failure:\n        description: 'Send Slack n"
  },
  {
    "path": ".github/workflows/ci-check-pr-title.yml",
    "chars": 440,
    "preview": "name: 'CI: Check PR Title'\n\non:\n  pull_request:\n    types:\n      - opened\n      - edited\n      - synchronize\n    branche"
  },
  {
    "path": ".github/workflows/ci-check-release-from-fork.yml",
    "chars": 2130,
    "preview": "name: 'CI: Block fork PRs to release branches'\n\non:\n  pull_request:\n    branches:\n      - 'release/**'\n    types:\n      "
  },
  {
    "path": ".github/workflows/ci-detect-new-packages.yml",
    "chars": 1967,
    "preview": "name: 'CI: Detect New Packages on Master'\n\non:\n  pull_request:\n    types:\n      - closed\n    branches:\n      - master\n\nj"
  },
  {
    "path": ".github/workflows/ci-master.yml",
    "chars": 1877,
    "preview": "name: 'CI: Master (Build, Test, Lint)'\n\non:\n  push:\n    branches:\n      - master\n      - 1.x\n    paths-ignore:\n      - p"
  },
  {
    "path": ".github/workflows/ci-pull-requests.yml",
    "chars": 8233,
    "preview": "name: 'CI: Pull Requests (Build, Test, Lint)'\n\non:\n  pull_request:\n  merge_group:\n\nconcurrency:\n  group: ci-${{ github.e"
  },
  {
    "path": ".github/workflows/ci-python.yml",
    "chars": 1484,
    "preview": "name: 'CI: Python'\n\non:\n  pull_request:\n    paths:\n      - packages/@n8n/task-runner-python/**\n      - .github/workflows"
  },
  {
    "path": ".github/workflows/ci-restrict-private-merges.yml",
    "chars": 2896,
    "preview": "name: 'CI: Check merge source and destination'\n\non:\n  pull_request:\n    branches:\n      - master\n\npermissions:\n  pull-re"
  },
  {
    "path": ".github/workflows/docker-build-push.yml",
    "chars": 18208,
    "preview": "# This workflow is used to build and push the Docker image for n8nio/n8n and n8nio/runners\n#\n# - Uses docker-config.mjs "
  },
  {
    "path": ".github/workflows/docker-build-smoke.yml",
    "chars": 2321,
    "preview": "name: 'Docker Build Smoke Test'\n\n# Verifies the full Docker build chain works without any caching.\n# Catches native modu"
  },
  {
    "path": ".github/workflows/release-create-github-releases.yml",
    "chars": 2267,
    "preview": "name: 'Release: Create GitHub Releases'\nrun-name: 'Creating GitHub Releases for ${{ inputs.version-tag }} (${{ inputs.tr"
  },
  {
    "path": ".github/workflows/release-create-minor-pr.yml",
    "chars": 1037,
    "preview": "name: 'Release: Create Minor Release PR'\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: 0 13 * * 1 # 2pm CET (UTC+1),"
  },
  {
    "path": ".github/workflows/release-create-patch-pr.yml",
    "chars": 2747,
    "preview": "name: 'Release: Create Patch Release PR'\nrun-name: 'Release: Create Patch Release PR for track ${{ inputs.track }}'\n\non:"
  },
  {
    "path": ".github/workflows/release-create-pr.yml",
    "chars": 4345,
    "preview": "name: 'Release: Create Pull Request'\n\non:\n  workflow_call:\n    inputs:\n      base-branch:\n        description: 'The bran"
  },
  {
    "path": ".github/workflows/release-merge-tag-to-branch.yml",
    "chars": 2480,
    "preview": "name: 'Release: Merge tag to branch'\nrun-name: 'Merge n8n@${{ inputs.version }} to ${{ inputs.target-branch }}'\n\non:\n  w"
  },
  {
    "path": ".github/workflows/release-populate-cloud-with-releases.yml",
    "chars": 2448,
    "preview": "name: 'Release: Populate cloud with releases'\nrun-name: 'Populate cloud with version n8n@${{ inputs.version }}'\n\non:\n  w"
  },
  {
    "path": ".github/workflows/release-promote-github-release.yml",
    "chars": 1475,
    "preview": "name: 'Release: Promote GitHub Releases'\nrun-name: 'Promoting GitHub Release ${{ inputs.version-tag }} to latest'\n\non:\n "
  },
  {
    "path": ".github/workflows/release-publish-new-package.yml",
    "chars": 1814,
    "preview": "name: 'Release: Publish New Package'\n\non:\n  workflow_dispatch:\n    inputs:\n      package-path:\n        description: 'Pat"
  },
  {
    "path": ".github/workflows/release-publish-post-release.yml",
    "chars": 2833,
    "preview": "name: 'Release: Publish: Post-release'\n\non:\n  workflow_call:\n    inputs:\n      track:\n        description: 'Release trac"
  },
  {
    "path": ".github/workflows/release-publish.yml",
    "chars": 7822,
    "preview": "name: 'Release: Publish'\n\non:\n  pull_request:\n    types:\n      - closed\n    branches:\n      - 'release/*'\n\njobs:\n  deter"
  },
  {
    "path": ".github/workflows/release-push-to-channel.yml",
    "chars": 7849,
    "preview": "name: 'Release: Push to Channel'\n\non:\n  workflow_call:\n    inputs:\n      version:\n        description: 'n8n Release vers"
  },
  {
    "path": ".github/workflows/release-schedule-patch-prs.yml",
    "chars": 409,
    "preview": "name: 'Release: Schedule Patch Release PRs'\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 8 * * 2-5' # 9am CET (U"
  },
  {
    "path": ".github/workflows/release-standalone-package.yml",
    "chars": 1736,
    "preview": "name: 'Release: Standalone Package'\n\non:\n  workflow_dispatch:\n    inputs:\n      package:\n        description: 'Package t"
  },
  {
    "path": ".github/workflows/release-update-pointer-tag.yml",
    "chars": 2061,
    "preview": "name: 'Release: Update pointer tag'\nrun-name: 'Update pointer tag: ${{ inputs.track }} -> ${{ inputs.version-tag }}'\n\non"
  },
  {
    "path": ".github/workflows/release-version-release-notification.yml",
    "chars": 1546,
    "preview": "name: 'Release: Send version release notification'\nrun-name: 'Send version release notification for n8n@${{ inputs.versi"
  },
  {
    "path": ".github/workflows/sbom-generation-callable.yml",
    "chars": 2892,
    "preview": "name: 'Release: Attach SBOM'\n\non:\n  workflow_call:\n    inputs:\n      n8n_version:\n        description: 'N8N version to g"
  },
  {
    "path": ".github/workflows/sec-ci-reusable.yml",
    "chars": 460,
    "preview": "name: 'Sec: CI Checks'\n\non:\n  workflow_call:\n    inputs:\n      ref:\n        description: GitHub ref to scan.\n        req"
  },
  {
    "path": ".github/workflows/sec-poutine-reusable.yml",
    "chars": 1364,
    "preview": "name: 'Sec: Poutine Scan'\n\non:\n  workflow_dispatch:\n  workflow_call:\n    inputs:\n      ref:\n        description: GitHub "
  },
  {
    "path": ".github/workflows/sec-publish-fix-1x.yml",
    "chars": 2395,
    "preview": "name: 'Security: Publish fix (1.x)'\n\non:\n  pull_request:\n    types: [closed]\n    branches: ['1.x']\n\njobs:\n  sync-securit"
  },
  {
    "path": ".github/workflows/sec-publish-fix.yml",
    "chars": 2390,
    "preview": "name: 'Security: Publish fix'\n\non:\n  pull_request:\n    types: [closed]\n    branches: [master]\n\njobs:\n  sync-security-fix"
  },
  {
    "path": ".github/workflows/sec-sync-public-to-private.yml",
    "chars": 3872,
    "preview": "# Sync n8n-io/n8n to n8n-io/n8n-private\n#\n# Runs hourly to keep private in sync with public.\n# Can also be triggered man"
  },
  {
    "path": ".github/workflows/security-trivy-scan-callable.yml",
    "chars": 11526,
    "preview": "name: Security - Scan Docker Image With Trivy\n\non:\n  workflow_dispatch:\n    inputs:\n      image_ref:\n        description"
  },
  {
    "path": ".github/workflows/test-bench-reusable.yml",
    "chars": 988,
    "preview": "name: 'Test: Benchmarks'\n\non:\n  workflow_call:\n    inputs:\n      ref:\n        description: GitHub ref to test.\n        r"
  },
  {
    "path": ".github/workflows/test-benchmark-destroy-nightly.yml",
    "chars": 967,
    "preview": "name: 'Test: Benchmark Destroy Env'\n\non:\n  schedule:\n    - cron: '0 5 * * *'\n  workflow_dispatch:\n\npermissions:\n  id-tok"
  },
  {
    "path": ".github/workflows/test-benchmark-nightly.yml",
    "chars": 3827,
    "preview": "name: 'Test: Benchmark Nightly'\nrun-name: Benchmark ${{ inputs.n8n_tag || 'nightly' }}\n\non:\n  schedule:\n    - cron: '30 "
  },
  {
    "path": ".github/workflows/test-db-reusable.yml",
    "chars": 1402,
    "preview": "name: 'Test: DB Integration'\n\non:\n  workflow_call:\n    inputs:\n      ref:\n        required: false\n        type: string\n "
  },
  {
    "path": ".github/workflows/test-e2e-ci-reusable.yml",
    "chars": 6602,
    "preview": "name: 'Test: E2E CI'\n\non:\n  workflow_call:\n    inputs:\n      branch:\n        description: 'GitHub branch/ref to test'\n  "
  },
  {
    "path": ".github/workflows/test-e2e-coverage-weekly.yml",
    "chars": 2942,
    "preview": "name: 'Test: E2E Coverage Weekly'\n\non:\n  schedule:\n    - cron: '0 2 * * 1' # Every Monday at 2 AM\n  workflow_dispatch: #"
  },
  {
    "path": ".github/workflows/test-e2e-docker-pull-reusable.yml",
    "chars": 1001,
    "preview": "name: 'Test: E2E Docker Pull'\n# This workflow is used to run Playwright tests in a Docker container pulled from the regi"
  },
  {
    "path": ".github/workflows/test-e2e-helm.yml",
    "chars": 5677,
    "preview": "name: 'Test: E2E Helm Chart'\n\non:\n  pull_request:\n    paths:\n      - '.github/workflows/test-e2e-helm.yml'\n      - 'pack"
  },
  {
    "path": ".github/workflows/test-e2e-infrastructure-reusable.yml",
    "chars": 1298,
    "preview": "name: 'Test: E2E Infrastructure'\n\non:\n  workflow_call:\n  workflow_dispatch:\n  pull_request:\n    paths:\n      - 'packages"
  },
  {
    "path": ".github/workflows/test-e2e-performance-reusable.yml",
    "chars": 491,
    "preview": "name: 'Test: E2E Performance'\n\non:\n  workflow_call:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 0 * * *' # Runs dail"
  },
  {
    "path": ".github/workflows/test-e2e-reusable.yml",
    "chars": 7464,
    "preview": "name: 'Test: E2E'\n\non:\n  workflow_call:\n    inputs:\n      branch:\n        description: 'GitHub branch to test.'\n        "
  },
  {
    "path": ".github/workflows/test-evals-ai-release.yml",
    "chars": 1973,
    "preview": "name: 'Test: Evals AI (Release)'\n\non:\n  release:\n    types: [published]\n\njobs:\n  check-minor-release:\n    name: Check Mi"
  },
  {
    "path": ".github/workflows/test-evals-ai-reusable.yml",
    "chars": 3870,
    "preview": "name: 'Test: Evals AI'\n\non:\n  workflow_call:\n    inputs:\n      branch:\n        description: 'GitHub branch to test.'\n   "
  },
  {
    "path": ".github/workflows/test-evals-ai.yml",
    "chars": 5786,
    "preview": "name: 'Test: Evals AI'\n\non:\n  push:\n    branches:\n      - master\n    paths:\n      - 'packages/@n8n/ai-workflow-builder.e"
  },
  {
    "path": ".github/workflows/test-evals-python.yml",
    "chars": 1685,
    "preview": "name: 'Test: Evals Python'\n\non:\n  pull_request:\n    paths:\n      - packages/@n8n/ai-workflow-builder.ee/evaluations/prog"
  },
  {
    "path": ".github/workflows/test-linting-reusable.yml",
    "chars": 804,
    "preview": "name: 'Test: Linting'\n\non:\n  workflow_call:\n    inputs:\n      ref:\n        description: GitHub ref to lint.\n        requ"
  },
  {
    "path": ".github/workflows/test-unit-reusable.yml",
    "chars": 7596,
    "preview": "name: 'Test: Unit'\n\non:\n  workflow_call:\n    inputs:\n      ref:\n        description: GitHub ref to test.\n        require"
  },
  {
    "path": ".github/workflows/test-visual-chromatic.yml",
    "chars": 1093,
    "preview": "name: 'Test: Visual Chromatic'\n\non:\n  workflow_dispatch:\n  workflow_call:\n    inputs:\n      ref:\n        description: Gi"
  },
  {
    "path": ".github/workflows/test-visual-storybook.yml",
    "chars": 1790,
    "preview": "name: 'Test: Visual Storybook'\n\non:\n  schedule:\n    - cron: '0 0 * * *'\n  workflow_dispatch:\n  pull_request:\n    branche"
  },
  {
    "path": ".github/workflows/test-workflow-scripts-reusable.yml",
    "chars": 991,
    "preview": "name: 'Test: Workflow scripts'\n\non:\n  workflow_call:\n    inputs:\n      ref:\n        description: GitHub ref to lint.\n   "
  },
  {
    "path": ".github/workflows/test-workflows-callable.yml",
    "chars": 1695,
    "preview": "name: 'Test: Workflows'\n\non:\n  workflow_call:\n    inputs:\n      git_ref:\n        description: 'The Git ref (branch, tag,"
  },
  {
    "path": ".github/workflows/test-workflows-nightly.yml",
    "chars": 530,
    "preview": "name: 'Test: Workflows Nightly'\n\non:\n  schedule:\n    - cron: '0 2 * * *'\n  workflow_dispatch:\n    inputs:\n      git_ref_"
  },
  {
    "path": ".github/workflows/test-workflows-pr-comment.yml",
    "chars": 4579,
    "preview": "name: 'Test: Workflows PR Comment'\n\non:\n  issue_comment:\n    types: [created]\n\npermissions:\n  pull-requests: read\n  cont"
  },
  {
    "path": ".github/workflows/util-approve-and-set-automerge.yml",
    "chars": 1275,
    "preview": "name: 'Util: Approve and set Automerge'\n\nrun-name: Approve and automerge PR ${{ inputs.pull-request-number }}\n\non:\n  wor"
  },
  {
    "path": ".github/workflows/util-backport-bundle.yml",
    "chars": 2420,
    "preview": "name: 'Util: Backport bundle PR to bundle/1.x'\n\nrun-name: Backport pull request ${{ github.event.pull_request.number || "
  },
  {
    "path": ".github/workflows/util-claude-task.yml",
    "chars": 6844,
    "preview": "name: 'Util: Claude Task Runner'\n\non:\n  workflow_dispatch:\n    inputs:\n      task:\n        description: 'Task descriptio"
  },
  {
    "path": ".github/workflows/util-claude.yml",
    "chars": 1677,
    "preview": "name: 'Util: Claude'\n\non:\n  issue_comment:\n    types: [created]\n  pull_request_review_comment:\n    types: [created]\n  is"
  },
  {
    "path": ".github/workflows/util-cleanup-abandoned-release-branches.yml",
    "chars": 1256,
    "preview": "name: 'Util: Cleanup abandoned release branches'\n\non:\n  pull_request:\n    types: [closed]\n\njobs:\n  delete-release-branch"
  },
  {
    "path": ".github/workflows/util-cleanup-pr-images.yml",
    "chars": 740,
    "preview": "name: 'Util: Cleanup CI Docker Images'\n\non:\n  schedule:\n    # Daily cleanup at 3 AM UTC\n    - cron: '0 3 * * *'\n\njobs:\n "
  },
  {
    "path": ".github/workflows/util-data-tooling.yml",
    "chars": 2887,
    "preview": "name: 'Util: Data Tooling'\n\n# TODO: Uncomment this after it works on a manual invocation\n# on:\n#   pull_request:\n#     b"
  },
  {
    "path": ".github/workflows/util-determine-current-version.yml",
    "chars": 1352,
    "preview": "name: 'Util: Determine current versions'\n\non:\n  workflow_dispatch:\n  workflow_call:\n    outputs:\n      stable:\n        d"
  },
  {
    "path": ".github/workflows/util-ensure-release-candidate-branches.yml",
    "chars": 1059,
    "preview": "name: 'Util: Ensure release candidate branches'\n\non:\n  workflow_dispatch:\n  workflow_call:\n\njobs:\n  ensure-release-candi"
  },
  {
    "path": ".github/workflows/util-notify-pr-status.yml",
    "chars": 1308,
    "preview": "name: 'Util: Notify PR Status'\n\non:\n  pull_request_review:\n    types: [submitted, dismissed]\n  pull_request:\n    types: "
  },
  {
    "path": ".github/workflows/util-sync-api-docs.yml",
    "chars": 6098,
    "preview": "name: 'Util: Sync API Docs'\n\non:\n  # Triggers for the master branch if relevant Public API files have changed\n  push:\n  "
  },
  {
    "path": ".github/workflows/util-update-node-popularity.yml",
    "chars": 3443,
    "preview": "name: 'Util: Update Node Popularity'\n\non:\n  schedule:\n    # Run every Monday at 00:00 UTC\n    - cron: '0 0 * * 1'\n  work"
  },
  {
    "path": ".gitignore",
    "chars": 1059,
    "preview": "node_modules\n.DS_Store\n.tmp\ntmp\ndist\ncoverage\nnpm-debug.log*\nyarn.lock\ngoogle-generated-credentials.json\n_START_PACKAGE\n"
  },
  {
    "path": ".npmignore",
    "chars": 278,
    "preview": "dist/test\ndist/**/*.{js.map}\n\n.DS_Store\n\n# local env files\n.env.local\n.env.*.local\n\n# Log files\nyarn-debug.log*\nyarn-err"
  },
  {
    "path": ".npmrc",
    "chars": 368,
    "preview": "audit = false\nfund = false\nupdate-notifier = false\nauto-install-peers = true\nstrict-peer-dependencies = false\nprefer-wor"
  },
  {
    "path": ".poutine.yml",
    "chars": 2620,
    "preview": "# Poutine Security Scanner Configuration\n# https://github.com/boostsecurityio/poutine\n#\n# This file defines skip rules f"
  },
  {
    "path": ".prettierignore",
    "chars": 497,
    "preview": "coverage\ndist\npackage.json\npnpm-lock.yaml\npackages/frontend/editor-ui/index.html\npackages/nodes-base/nodes/**/test\npacka"
  },
  {
    "path": ".prettierrc.js",
    "chars": 904,
    "preview": "module.exports = {\n\t/**\n\t * https://prettier.io/docs/en/options.html#semicolons\n\t */\n\tsemi: true,\n\n\t/**\n\t * https://pret"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 316,
    "preview": "{\n\t\"recommendations\": [\n\t\t\"biomejs.biome\",\n\t\t\"streetsidesoftware.code-spell-checker\",\n\t\t\"dangmai.workspace-default-setti"
  },
  {
    "path": ".vscode/settings.default.json",
    "chars": 972,
    "preview": "{\n\t\"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n\t\"editor.formatOnSave\": true,\n\t\"[javascript]\": {\n\t\t\"editor.defau"
  },
  {
    "path": "AGENTS.md",
    "chars": 10004,
    "preview": "# AGENTS.md\n\nThis file provides guidance on how to work with the n8n repository.\n\n## Project Overview\n\nn8n is a workflow"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 1401407,
    "preview": "# [2.15.0](https://github.com/n8n-io/n8n/compare/n8n@2.14.0...n8n@2.15.0) (2026-03-30)\n\n\n### Bug Fixes\n\n* **API:** Skip "
  },
  {
    "path": "CLAUDE.md",
    "chars": 11,
    "preview": "@AGENTS.md\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3345,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 18415,
    "preview": "# Contributing to n8n\n\nGreat that you are here and you want to contribute to n8n\n\n## Contents\n\n- [Contributing to n8n](#"
  },
  {
    "path": "CONTRIBUTOR_LICENSE_AGREEMENT.md",
    "chars": 447,
    "preview": "# n8n Contributor License Agreement\n\nI give n8n permission to license my contributions on any terms they like. I am givi"
  },
  {
    "path": "LICENSE.md",
    "chars": 4415,
    "preview": "# License\n\nPortions of this software are licensed as follows:\n\n- Content of branches other than the main branch (i.e. \"m"
  },
  {
    "path": "LICENSE_EE.md",
    "chars": 1875,
    "preview": "# The n8n Enterprise License (the “Enterprise License”)\n\nCopyright (c) 2022-present n8n GmbH.\n\nWith regard to the n8n So"
  },
  {
    "path": "README.md",
    "chars": 3675,
    "preview": "![Banner image](https://user-images.githubusercontent.com/10284570/173569848-c624317f-42b1-45a6-ab09-f0ea3c247648.png)\n\n"
  },
  {
    "path": "SECURITY.md",
    "chars": 211,
    "preview": "## Reporting a Vulnerability\n\nIf you discover a (suspected) security vulnerability, please report it through our [Vulner"
  },
  {
    "path": "biome.jsonc",
    "chars": 1095,
    "preview": "{\n\t\"$schema\": \"./node_modules/@biomejs/biome/configuration_schema.json\",\n\t\"vcs\": {\n\t\t\"clientKind\": \"git\",\n\t\t\"enabled\": t"
  },
  {
    "path": "codecov.yml",
    "chars": 2472,
    "preview": "codecov:\n  max_report_age: off\n  require_ci_to_pass: true\n\nbundle_analysis:\n  status: warning\n  warning_threshold: 1%\n\nc"
  },
  {
    "path": "cubic.yaml",
    "chars": 13096,
    "preview": "# yaml-language-server: $schema=https://cubic.dev/schema/cubic-repository-config.schema.json\n\n# cubic.yaml\n# This file c"
  },
  {
    "path": "docker/images/n8n/Dockerfile",
    "chars": 1282,
    "preview": "ARG NODE_VERSION=24.14.1\nARG N8N_VERSION=snapshot\n\n# Rebuild native addons for the container platform. The base image ha"
  },
  {
    "path": "docker/images/n8n/README.md",
    "chars": 9462,
    "preview": "![n8n.io - Workflow Automation](https://user-images.githubusercontent.com/65276001/173571060-9f2f6d7b-bac0-43b6-bdb2-001"
  },
  {
    "path": "docker/images/n8n/docker-entrypoint.sh",
    "chars": 386,
    "preview": "#!/bin/sh\nif [ -d /opt/custom-certificates ]; then\n  echo \"Trusting custom certificates from /opt/custom-certificates.\"\n"
  },
  {
    "path": "docker/images/n8n-base/Dockerfile",
    "chars": 1145,
    "preview": "ARG NODE_VERSION=24.14.1\n\nFROM dhi.io/node:${NODE_VERSION}-alpine3.22-dev\n\nARG NODE_VERSION\n\n# Install all dependencies "
  },
  {
    "path": "docker/images/runners/Dockerfile",
    "chars": 7054,
    "preview": "ARG NODE_VERSION=24.14.1\nARG PYTHON_VERSION=3.13\n\n# ===================================================================="
  },
  {
    "path": "docker/images/runners/Dockerfile.distroless",
    "chars": 9056,
    "preview": "# ==============================================================================\n# DISTROLESS RUNNERS IMAGE\n# =========="
  },
  {
    "path": "docker/images/runners/README.md",
    "chars": 1778,
    "preview": "# n8n - Task runners (`n8nio/runners`) - (PREVIEW)\n\n`n8nio/runners` image includes [JavaScript runner](https://github.co"
  },
  {
    "path": "docker/images/runners/n8n-task-runners.json",
    "chars": 1408,
    "preview": "{\n\t\"task-runners\": [\n\t\t{\n\t\t\t\"runner-type\": \"javascript\",\n\t\t\t\"workdir\": \"/home/runner\",\n\t\t\t\"command\": \"/usr/local/bin/nod"
  },
  {
    "path": "jest.config.js",
    "chars": 2024,
    "preview": "const { pathsToModuleNameMapper } = require('ts-jest');\nconst { compilerOptions } = require('get-tsconfig').getTsconfig("
  },
  {
    "path": "lefthook.yml",
    "chars": 1228,
    "preview": "pre-commit:\n  commands:\n    biome_check:\n      glob: 'packages/**/*.{js,ts,json}'\n      run: pnpm biome check --write --"
  },
  {
    "path": "package.json",
    "chars": 7669,
    "preview": "{\n  \"name\": \"n8n-monorepo\",\n  \"version\": \"2.15.0\",\n  \"private\": true,\n  \"engines\": {\n    \"node\": \">=22.16\",\n    \"pnpm\": "
  },
  {
    "path": "packages/@n8n/agents/AGENTS.md",
    "chars": 5700,
    "preview": "# AGENTS.md\n\nConventions for the `@n8n/agents` package.\n\n## Code Style\n\n- **No `_` prefix on private properties** — use "
  },
  {
    "path": "packages/@n8n/agents/docs/agent-runtime-architecture.md",
    "chars": 18367,
    "preview": "# Agent Runtime Architecture\n\nThis document describes the internal architecture of the `@n8n/agents` agent\nruntime — the"
  },
  {
    "path": "packages/@n8n/agents/eslint.config.mjs",
    "chars": 626,
    "preview": "import { defineConfig } from 'eslint/config';\nimport { nodeConfig } from '@n8n/eslint-config/node';\n\nexport default defi"
  },
  {
    "path": "packages/@n8n/agents/examples/basic-agent.ts",
    "chars": 5126,
    "preview": "/**\n * @n8n/agents — Full API Demonstration\n *\n * This example demonstrates the complete builder-pattern API for creatin"
  },
  {
    "path": "packages/@n8n/agents/jest.config.js",
    "chars": 200,
    "preview": "/** @type {import('jest').Config} */\nconst base = require('../../../jest.config');\n\nmodule.exports = {\n\t...base,\n\ttestPa"
  },
  {
    "path": "packages/@n8n/agents/package.json",
    "chars": 1820,
    "preview": "{\n  \"name\": \"@n8n/agents\",\n  \"version\": \"0.2.0\",\n  \"description\": \"AI agent SDK for n8n's code-first execution engine\",\n"
  },
  {
    "path": "packages/@n8n/agents/src/__tests__/agent-runtime.test.ts",
    "chars": 71623,
    "preview": "import { z } from 'zod';\n\nimport { AgentRuntime } from '../runtime/agent-runtime';\nimport { AgentEventBus } from '../run"
  },
  {
    "path": "packages/@n8n/agents/src/__tests__/event-bus.test.ts",
    "chars": 1369,
    "preview": "import { AgentEventBus } from '../runtime/event-bus';\n\ndescribe('AgentEventBus', () => {\n\tdescribe('resetAbort', () => {"
  },
  {
    "path": "packages/@n8n/agents/src/__tests__/fixtures/mcp-stdio-server.mjs",
    "chars": 2264,
    "preview": "/**\n * Minimal MCP server for stdio transport integration tests.\n * Spawned as a child process by mcp-stdio-transport.te"
  },
  {
    "path": "packages/@n8n/agents/src/__tests__/inmemory-working-memory.test.ts",
    "chars": 2435,
    "preview": "import { InMemoryMemory } from '../runtime/memory-store';\n\ndescribe('InMemoryMemory working memory', () => {\n\tit('return"
  },
  {
    "path": "packages/@n8n/agents/src/__tests__/integration/batched-tool-execution.test.ts",
    "chars": 5028,
    "preview": "import { expect, it } from 'vitest';\n\nimport {\n\tdescribeIf,\n\tcollectStreamChunks,\n\tchunksOfType,\n\tcreateAgentWithBatched"
  },
  {
    "path": "packages/@n8n/agents/src/__tests__/integration/concurrent-tool-execution.test.ts",
    "chars": 8383,
    "preview": "import { expect, it } from 'vitest';\n\nimport {\n\tdescribeIf,\n\tcollectStreamChunks,\n\tchunksOfType,\n\tcreateAgentWithConcurr"
  },
  {
    "path": "packages/@n8n/agents/src/__tests__/integration/custom-message-suspend-resume.test.ts",
    "chars": 3254,
    "preview": "import { expect, it } from 'vitest';\nimport { z } from 'zod';\n\nimport { describeIf, getModel } from './helpers';\nimport "
  }
]

// ... and 15887 more files (download for full content)

About this extraction

This page contains the full source code of the n8n-io/n8n GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 16087 files (93.2 MB), approximately 25.5M tokens, and a symbol index with 35533 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!