Full Code of n8n-io/n8n for AI

master 34f210707147 cached
17655 files
104.2 MB
27.4M tokens
38461 symbols
4 requests
Copy disabled (too large) Download .txt
Showing preview only (109,507K chars total). Download the full file to get everything.
Repository: n8n-io/n8n
Branch: master
Commit: 34f210707147
Files: 17655
Total size: 104.2 MB

Directory structure:
gitextract_1o9k1ghr/

├── .actrc
├── .claude/
│   ├── README.md
│   ├── plugins/
│   │   └── n8n/
│   │       ├── .claude-plugin/
│   │       │   ├── marketplace.json
│   │       │   └── plugin.json
│   │       ├── README.md
│   │       ├── agents/
│   │       │   ├── developer.md
│   │       │   └── linear-issue-triager.md
│   │       ├── commands/
│   │       │   ├── plan.md
│   │       │   └── triage.md
│   │       ├── scripts/
│   │       │   └── track-skill-usage.mjs
│   │       └── skills/
│   │           ├── community-pr-review/
│   │           │   └── SKILL.md
│   │           ├── content-design/
│   │           │   └── SKILL.md
│   │           ├── conventions/
│   │           │   └── SKILL.md
│   │           ├── create-community-node-lint-rule/
│   │           │   ├── SKILL.md
│   │           │   └── reference.md
│   │           ├── create-issue/
│   │           │   └── SKILL.md
│   │           ├── create-pr/
│   │           │   └── SKILL.md
│   │           ├── create-skill/
│   │           │   └── SKILL.md
│   │           ├── design-system/
│   │           │   ├── SKILL.md
│   │           │   └── rules/
│   │           │       ├── web-animation-guidelines.md
│   │           │       └── web-interface-guidelines.md
│   │           ├── linear-issue/
│   │           │   └── SKILL.md
│   │           ├── loom-transcript/
│   │           │   └── SKILL.md
│   │           ├── node-add-oauth/
│   │           │   └── SKILL.md
│   │           ├── protect-endpoints/
│   │           │   └── SKILL.md
│   │           ├── reproduce-bug/
│   │           │   └── SKILL.md
│   │           ├── setup-mcps/
│   │           │   └── SKILL.md
│   │           └── spec-driven-development/
│   │               └── SKILL.md
│   └── settings.json
├── .code-health-baseline.json
├── .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/
│   │   ├── build-n8n-docker/
│   │   │   └── action.yml
│   │   ├── ci-filter/
│   │   │   ├── __tests__/
│   │   │   │   └── ci-filter.test.ts
│   │   │   ├── action.yml
│   │   │   └── ci-filter.mjs
│   │   ├── docker-registry-login/
│   │   │   └── action.yml
│   │   ├── load-n8n-docker/
│   │   │   └── 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
│   │   ├── bump-versions.test.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
│   │   ├── pnpm-utils.mjs
│   │   ├── populate-cloud-databases.mjs
│   │   ├── post-qa-metrics-comment.mjs
│   │   ├── promote-github-release.mjs
│   │   ├── quality/
│   │   │   ├── check-ownership-checkbox.mjs
│   │   │   ├── check-ownership-checkbox.test.mjs
│   │   │   ├── check-pr-size.mjs
│   │   │   ├── check-pr-size.test.mjs
│   │   │   └── handle-size-override.mjs
│   │   ├── retry.mjs
│   │   ├── send-build-stats.mjs
│   │   ├── send-docker-stats.mjs
│   │   ├── send-metrics.mjs
│   │   ├── send-version-release-notification.mjs
│   │   ├── set-latest-for-monorepo-packages.mjs
│   │   ├── trim-fe-packageJson.js
│   │   └── update-changelog.mjs
│   ├── test-metrics/
│   │   ├── playwright.json
│   │   └── quarantine.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-pr-quality.yml
│       ├── ci-pull-request-review.yml
│       ├── ci-pull-requests.yml
│       ├── ci-python.yml
│       ├── ci-restrict-private-merges.yml
│       ├── docker-build-push.yml
│       ├── docker-build-smoke.yml
│       ├── prepare-docker-reusable.yml
│       ├── release-build-daytona-snapshot.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-set-stable-npm-packages-to-latest.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-dev-server-smoke-reusable.yml
│       ├── test-e2e-coverage-weekly.yml
│       ├── test-e2e-helm.yml
│       ├── test-e2e-infrastructure-reusable.yml
│       ├── test-e2e-performance-reusable.yml
│       ├── test-e2e-reusable.yml
│       ├── test-e2e-vm-expressions-nightly.yml
│       ├── test-evals-ai-release.yml
│       ├── test-evals-ai-reusable.yml
│       ├── test-evals-ai.yml
│       ├── test-evals-instance-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-qa-metrics-comment-reusable.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
│   │   │   │   │   ├── from-json-config.test.ts
│   │   │   │   │   ├── inmemory-working-memory.test.ts
│   │   │   │   │   ├── integration/
│   │   │   │   │   │   ├── agent-runtime-conversion.test.ts
│   │   │   │   │   │   ├── 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
│   │   │   │   │   │   ├── interim-user-message-during-suspend.test.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-call-upsert.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
│   │   │   │   │   ├── message-list.test.ts
│   │   │   │   │   ├── message.test.ts
│   │   │   │   │   ├── model-factory.test.ts
│   │   │   │   │   ├── parse.test.ts
│   │   │   │   │   ├── sqlite-memory.test.ts
│   │   │   │   │   ├── strip-orphaned-tool-messages.test.ts
│   │   │   │   │   ├── telemetry.test.ts
│   │   │   │   │   ├── title-generation.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
│   │   │   │   │   ├── provider-credentials.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-capabilities.ts
│   │   │   │   │   ├── provider-tools.ts
│   │   │   │   │   ├── telemetry.ts
│   │   │   │   │   ├── tool.ts
│   │   │   │   │   └── verify.ts
│   │   │   │   ├── storage/
│   │   │   │   │   ├── base-memory.ts
│   │   │   │   │   ├── postgres-memory.ts
│   │   │   │   │   └── sqlite-memory.ts
│   │   │   │   ├── types/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── runtime/
│   │   │   │   │   │   ├── event.ts
│   │   │   │   │   │   └── message-list.ts
│   │   │   │   │   ├── sdk/
│   │   │   │   │   │   ├── agent-builder.ts
│   │   │   │   │   │   ├── agent.ts
│   │   │   │   │   │   ├── credential-provider.ts
│   │   │   │   │   │   ├── eval.ts
│   │   │   │   │   │   ├── guardrail.ts
│   │   │   │   │   │   ├── handler-executor.ts
│   │   │   │   │   │   ├── mcp.ts
│   │   │   │   │   │   ├── memory.ts
│   │   │   │   │   │   ├── message.ts
│   │   │   │   │   │   ├── provider.ts
│   │   │   │   │   │   ├── tool-descriptor.ts
│   │   │   │   │   │   └── tool.ts
│   │   │   │   │   ├── telemetry.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       └── json.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── parse.ts
│   │   │   │   │   └── 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
│   │   │   │   │   ├── 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-code-imports.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
│   │   │   │   │   ├── lifecycle.ts
│   │   │   │   │   ├── logger.ts
│   │   │   │   │   ├── output.ts
│   │   │   │   │   ├── runner.ts
│   │   │   │   │   ├── score-calculator.ts
│   │   │   │   │   └── token-tracking-handler.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/
│   │   │   │   │   │   ├── 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/
│   │   │   │   │   │   │   │   └── index.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
│   │   │   │   │       └── node-recommendations/
│   │   │   │   │           └── index.ts
│   │   │   │   ├── session-manager.service.ts
│   │   │   │   ├── subgraphs/
│   │   │   │   │   ├── discovery.subgraph.ts
│   │   │   │   │   ├── subgraph-interface.ts
│   │   │   │   │   └── test/
│   │   │   │   │       └── integration/
│   │   │   │   │           ├── discovery-subgraph.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/
│   │   │   │   │   │   └── index.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
│   │   │   │   │   ├── 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
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── agent-builder-admin-settings.test.ts
│   │   │   │   │   ├── instance-registry-types.test.ts
│   │   │   │   │   └── proxy-feature.test.ts
│   │   │   │   ├── agent-builder-interactive.ts
│   │   │   │   ├── agent-sse.ts
│   │   │   │   ├── agents.ts
│   │   │   │   ├── api-keys.ts
│   │   │   │   ├── chat-hub.ts
│   │   │   │   ├── community-node-types.ts
│   │   │   │   ├── constants/
│   │   │   │   │   └── proxy-feature.ts
│   │   │   │   ├── datetime.ts
│   │   │   │   ├── dto/
│   │   │   │   │   ├── agents/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── agent-skill.dto.test.ts
│   │   │   │   │   │   ├── agent-build-resume.dto.ts
│   │   │   │   │   │   ├── agent-chat-message.dto.ts
│   │   │   │   │   │   ├── agent-integration.dto.ts
│   │   │   │   │   │   ├── create-agent-skill.dto.ts
│   │   │   │   │   │   ├── create-agent.dto.ts
│   │   │   │   │   │   ├── update-agent-config.dto.ts
│   │   │   │   │   │   ├── update-agent-schedule.dto.ts
│   │   │   │   │   │   ├── update-agent-skill.dto.ts
│   │   │   │   │   │   └── update-agent.dto.ts
│   │   │   │   │   ├── 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-gateway-config-response.dto.ts
│   │   │   │   │   │   ├── ai-gateway-usage-response.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
│   │   │   │   │   │   ├── public-api-create-data-table.dto.ts
│   │   │   │   │   │   ├── rename-data-table-column.dto.ts
│   │   │   │   │   │   ├── update-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
│   │   │   │   │   ├── encryption/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-encryption-key.dto.test.ts
│   │   │   │   │   │   │   └── list-encryption-keys-query.dto.test.ts
│   │   │   │   │   │   ├── create-encryption-key.dto.ts
│   │   │   │   │   │   ├── encryption-key-response.dto.ts
│   │   │   │   │   │   └── list-encryption-keys-query.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/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── instance-ai-confirm-request.dto.test.ts
│   │   │   │   │   │   ├── instance-ai-confirm-request.dto.ts
│   │   │   │   │   │   ├── instance-ai-feedback-request.dto.ts
│   │   │   │   │   │   └── instance-ai-rename-thread-request.dto.ts
│   │   │   │   │   ├── instance-version-history/
│   │   │   │   │   │   ├── version-query.dto.ts
│   │   │   │   │   │   └── version-since-date-query.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-mapping-rule.dto.test.ts
│   │   │   │   │   │   │   ├── 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
│   │   │   │   │   │   ├── instance-ai.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
│   │   │   │   │   ├── credential-response.schema.ts
│   │   │   │   │   ├── data-table-filter.schema.ts
│   │   │   │   │   ├── data-table.schema.ts
│   │   │   │   │   ├── dependency-counts.schema.ts
│   │   │   │   │   ├── dependency.schema.ts
│   │   │   │   │   ├── encryption-key.schema.ts
│   │   │   │   │   ├── evaluations.schema.ts
│   │   │   │   │   ├── external-secrets.schema.ts
│   │   │   │   │   ├── favorites.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
│   │   │   └── vite.config.ts
│   │   ├── 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
│   │   │   ├── 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
│   │   │   └── vite.config.ts
│   │   ├── 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
│   │   ├── computer-use/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── joke.txt
│   │   │   ├── package.json
│   │   │   ├── spec/
│   │   │   │   ├── local-gateway.md
│   │   │   │   └── technical-spec.md
│   │   │   ├── src/
│   │   │   │   ├── __mocks__/
│   │   │   │   │   └── @inquirer/
│   │   │   │   │       └── prompts.ts
│   │   │   │   ├── cli.ts
│   │   │   │   ├── config-templates.test.ts
│   │   │   │   ├── config-templates.ts
│   │   │   │   ├── config.test.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── confirm-resource-cli.ts
│   │   │   │   ├── gateway-client.test.ts
│   │   │   │   ├── gateway-client.ts
│   │   │   │   ├── gateway-session.test.ts
│   │   │   │   ├── gateway-session.ts
│   │   │   │   ├── logger.test.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── settings-store.test.ts
│   │   │   │   ├── settings-store.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
│   │   ├── config/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── configs/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── ai.config.test.ts
│   │   │   │   │   │   ├── expression-engine.config.test.ts
│   │   │   │   │   │   ├── external-hooks.config.test.ts
│   │   │   │   │   │   ├── ssrf-protection.config.test.ts
│   │   │   │   │   │   └── user-management.config.test.ts
│   │   │   │   │   ├── agents.config.ts
│   │   │   │   │   ├── ai-assistant.config.ts
│   │   │   │   │   ├── ai-builder.config.ts
│   │   │   │   │   ├── ai.config.ts
│   │   │   │   │   ├── auth.config.ts
│   │   │   │   │   ├── cache.config.ts
│   │   │   │   │   ├── chat-hub.config.ts
│   │   │   │   │   ├── chat-trigger.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
│   │   │   │   │   ├── evaluation.config.ts
│   │   │   │   │   ├── event-bus.config.ts
│   │   │   │   │   ├── executions.config.ts
│   │   │   │   │   ├── expression-engine.config.ts
│   │   │   │   │   ├── external-hooks.config.ts
│   │   │   │   │   ├── generic.config.ts
│   │   │   │   │   ├── hiring-banner.config.ts
│   │   │   │   │   ├── http-request.config.ts
│   │   │   │   │   ├── instance-ai.config.ts
│   │   │   │   │   ├── instance-settings-config.ts
│   │   │   │   │   ├── instance-settings-loader.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
│   │   │   │   │   ├── ai-builder-temporary-workflow.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
│   │   │   │   │   ├── deployment-key.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
│   │   │   │   │   │   ├── 1775116241000-CreateTokenExchangeJtiTable.ts
│   │   │   │   │   │   ├── 1775740765000-ChangeWorkflowPublishHistoryVersionIdToSetNull.ts
│   │   │   │   │   │   ├── 1776000000000-CreateTrustedKeyTables.ts
│   │   │   │   │   │   ├── 1776150756000-CreateFavoritesTable.ts
│   │   │   │   │   │   ├── 1777000000000-CreateDeploymentKeyTable.ts
│   │   │   │   │   │   ├── 1777023444000-AddJweKeyIndexesToDeploymentKey.ts
│   │   │   │   │   │   ├── 1777045000000-AddTracingContextToExecution.ts
│   │   │   │   │   │   ├── 1777100000000-AddLangsmithIdsToInstanceAiRunSnapshots.ts
│   │   │   │   │   │   ├── 1777281990043-CreateAiBuilderTemporaryWorkflowTable.ts
│   │   │   │   │   │   ├── 1778000000000-AddExecutionDeduplicationKey.ts
│   │   │   │   │   │   ├── 1783000000000-CreateAgentTables.ts
│   │   │   │   │   │   └── 1783000000001-CreateAgentExecutionTables.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
│   │   │   │   │   │   ├── 1777420800000-ExpandVariablesValueColumnToText.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
│   │   │   │   │   ├── ai-builder-temporary-workflow.repository.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
│   │   │   │   │   ├── deployment-key.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__/
│   │   │   │       │   ├── apply-workflow-boolean-setting-filter.test.ts
│   │   │   │       │   ├── build-workflows-by-nodes-query.test.ts
│   │   │   │       │   └── get-test-run-final-result.ee.test.ts
│   │   │   │       ├── apply-workflow-boolean-setting-filter.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
│   │   │   │   ├── cluster-check/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── cluster-check-metadata.test.ts
│   │   │   │   │   ├── cluster-check-metadata.ts
│   │   │   │   │   ├── cluster-check.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
│   │   ├── engine/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   └── index.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── errors/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── application.error.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── isolate.error.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
│   │   │   │       ├── cred-class-name-suffix.md
│   │   │   │       ├── cred-class-oauth2-naming.md
│   │   │   │       ├── credential-documentation-url.md
│   │   │   │       ├── credential-password-field.md
│   │   │   │       ├── credential-test-required.md
│   │   │   │       ├── icon-validation.md
│   │   │   │       ├── missing-paired-item.md
│   │   │   │       ├── n8n-object-validation.md
│   │   │   │       ├── no-credential-reuse.md
│   │   │   │       ├── no-deprecated-workflow-functions.md
│   │   │   │       ├── no-forbidden-lifecycle-scripts.md
│   │   │   │       ├── no-http-request-with-manual-auth.md
│   │   │   │       ├── no-overrides-field.md
│   │   │   │       ├── no-restricted-globals.md
│   │   │   │       ├── no-restricted-imports.md
│   │   │   │       ├── no-runtime-dependencies.md
│   │   │   │       ├── no-template-placeholders.md
│   │   │   │       ├── node-class-description-icon-missing.md
│   │   │   │       ├── node-connection-type-literal.md
│   │   │   │       ├── node-operation-error-itemindex.md
│   │   │   │       ├── node-usable-as-tool.md
│   │   │   │       ├── options-sorted-alphabetically.md
│   │   │   │       ├── package-name-convention.md
│   │   │   │       ├── require-community-node-keyword.md
│   │   │   │       ├── require-continue-on-fail.md
│   │   │   │       ├── require-node-api-error.md
│   │   │   │       ├── require-node-description-fields.md
│   │   │   │       ├── resource-operation-pattern.md
│   │   │   │       ├── valid-credential-references.md
│   │   │   │       ├── valid-peer-dependencies.md
│   │   │   │       └── webhook-lifecycle-complete.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
│   │   │   │   │   ├── cred-class-name-suffix.test.ts
│   │   │   │   │   ├── cred-class-name-suffix.ts
│   │   │   │   │   ├── cred-class-oauth2-naming.test.ts
│   │   │   │   │   ├── cred-class-oauth2-naming.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
│   │   │   │   │   ├── missing-paired-item.test.ts
│   │   │   │   │   ├── missing-paired-item.ts
│   │   │   │   │   ├── n8n-object-validation.test.ts
│   │   │   │   │   ├── n8n-object-validation.ts
│   │   │   │   │   ├── no-credential-reuse.test.ts
│   │   │   │   │   ├── no-credential-reuse.ts
│   │   │   │   │   ├── no-deprecated-workflow-functions.test.ts
│   │   │   │   │   ├── no-deprecated-workflow-functions.ts
│   │   │   │   │   ├── no-forbidden-lifecycle-scripts.test.ts
│   │   │   │   │   ├── no-forbidden-lifecycle-scripts.ts
│   │   │   │   │   ├── no-http-request-with-manual-auth.test.ts
│   │   │   │   │   ├── no-http-request-with-manual-auth.ts
│   │   │   │   │   ├── no-overrides-field.test.ts
│   │   │   │   │   ├── no-overrides-field.ts
│   │   │   │   │   ├── no-restricted-globals.test.ts
│   │   │   │   │   ├── no-restricted-globals.ts
│   │   │   │   │   ├── no-restricted-imports.test.ts
│   │   │   │   │   ├── no-restricted-imports.ts
│   │   │   │   │   ├── no-runtime-dependencies.test.ts
│   │   │   │   │   ├── no-runtime-dependencies.ts
│   │   │   │   │   ├── no-template-placeholders.test.ts
│   │   │   │   │   ├── no-template-placeholders.ts
│   │   │   │   │   ├── node-class-description-icon-missing.test.ts
│   │   │   │   │   ├── node-class-description-icon-missing.ts
│   │   │   │   │   ├── node-connection-type-literal.test.ts
│   │   │   │   │   ├── node-connection-type-literal.ts
│   │   │   │   │   ├── node-operation-error-itemindex.test.ts
│   │   │   │   │   ├── node-operation-error-itemindex.ts
│   │   │   │   │   ├── node-usable-as-tool.test.ts
│   │   │   │   │   ├── node-usable-as-tool.ts
│   │   │   │   │   ├── options-sorted-alphabetically.test.ts
│   │   │   │   │   ├── options-sorted-alphabetically.ts
│   │   │   │   │   ├── package-name-convention.test.ts
│   │   │   │   │   ├── package-name-convention.ts
│   │   │   │   │   ├── require-community-node-keyword.test.ts
│   │   │   │   │   ├── require-community-node-keyword.ts
│   │   │   │   │   ├── require-continue-on-fail.test.ts
│   │   │   │   │   ├── require-continue-on-fail.ts
│   │   │   │   │   ├── require-node-api-error.test.ts
│   │   │   │   │   ├── require-node-api-error.ts
│   │   │   │   │   ├── require-node-description-fields.test.ts
│   │   │   │   │   ├── require-node-description-fields.ts
│   │   │   │   │   ├── resource-operation-pattern.test.ts
│   │   │   │   │   ├── resource-operation-pattern.ts
│   │   │   │   │   ├── valid-credential-references.test.ts
│   │   │   │   │   ├── valid-credential-references.ts
│   │   │   │   │   ├── valid-peer-dependencies.test.ts
│   │   │   │   │   ├── valid-peer-dependencies.ts
│   │   │   │   │   ├── webhook-lifecycle-complete.test.ts
│   │   │   │   │   └── webhook-lifecycle-complete.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__/
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   └── integration.test.ts
│   │   │   │   ├── bridge/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── isolated-vm-bridge.test.ts
│   │   │   │   │   └── isolated-vm-bridge.ts
│   │   │   │   ├── evaluator/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── expression-evaluator-cache.test.ts
│   │   │   │   │   │   ├── expression-evaluator-metrics.test.ts
│   │   │   │   │   │   ├── expression-evaluator.test.ts
│   │   │   │   │   │   └── lru-cache.test.ts
│   │   │   │   │   ├── error-classification.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
│   │   │   │   ├── observability/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── noop-provider.test.ts
│   │   │   │   │   ├── metrics.ts
│   │   │   │   │   └── noop-provider.ts
│   │   │   │   ├── pool/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── idle-scaling-pool.test.ts
│   │   │   │   │   │   └── isolate-pool.test.ts
│   │   │   │   │   ├── idle-scaling-pool.ts
│   │   │   │   │   └── isolate-pool.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── context.test.ts
│   │   │   │   │   │   └── lazy-proxy.test.ts
│   │   │   │   │   ├── context.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lazy-proxy.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
│   │   ├── imap/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── errors.ts
│   │   │   │   ├── helpers/
│   │   │   │   │   ├── get-message.test.ts
│   │   │   │   │   └── 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/
│   │   │   ├── .gitignore
│   │   │   ├── CLAUDE.md
│   │   │   ├── docs/
│   │   │   │   ├── ENGINEERING.md
│   │   │   │   ├── architecture.md
│   │   │   │   ├── configuration.md
│   │   │   │   ├── e2e-tests.md
│   │   │   │   ├── filesystem-access.md
│   │   │   │   ├── memory.md
│   │   │   │   ├── sandboxing.md
│   │   │   │   ├── streaming-protocol.md
│   │   │   │   └── tools.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── evaluations/
│   │   │   │   ├── README.md
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── args.test.ts
│   │   │   │   │   ├── comparison-compare.test.ts
│   │   │   │   │   ├── comparison-format.test.ts
│   │   │   │   │   ├── comparison-statistics.test.ts
│   │   │   │   │   ├── dataset-sync.test.ts
│   │   │   │   │   ├── event-parser.test.ts
│   │   │   │   │   ├── lane-allocator.test.ts
│   │   │   │   │   ├── lanes.test.ts
│   │   │   │   │   ├── normalize-workflow.test.ts
│   │   │   │   │   ├── pair-records.test.ts
│   │   │   │   │   ├── redact.test.ts
│   │   │   │   │   ├── sandbox-config.test.ts
│   │   │   │   │   └── stub-services.test.ts
│   │   │   │   ├── binaryChecks/
│   │   │   │   │   ├── checks/
│   │   │   │   │   │   ├── agent-has-dynamic-prompt.ts
│   │   │   │   │   │   ├── agent-has-language-model.ts
│   │   │   │   │   │   ├── all-nodes-connected.ts
│   │   │   │   │   │   ├── correct-node-operations.ts
│   │   │   │   │   │   ├── create-llm-check.ts
│   │   │   │   │   │   ├── descriptive-node-names.ts
│   │   │   │   │   │   ├── expressions-reference-existing-nodes.ts
│   │   │   │   │   │   ├── fulfills-user-request.ts
│   │   │   │   │   │   ├── handles-multiple-items.ts
│   │   │   │   │   │   ├── has-nodes.ts
│   │   │   │   │   │   ├── has-start-node.ts
│   │   │   │   │   │   ├── has-trigger.ts
│   │   │   │   │   │   ├── inbound-trigger-auth-defaults.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── memory-properly-connected.ts
│   │   │   │   │   │   ├── memory-session-key-expression.test.ts
│   │   │   │   │   │   ├── memory-session-key-expression.ts
│   │   │   │   │   │   ├── no-disabled-nodes.ts
│   │   │   │   │   │   ├── no-empty-set-nodes.ts
│   │   │   │   │   │   ├── no-hardcoded-credentials.ts
│   │   │   │   │   │   ├── no-invalid-from-ai.ts
│   │   │   │   │   │   ├── no-unnecessary-code-nodes.ts
│   │   │   │   │   │   ├── no-unreachable-nodes.ts
│   │   │   │   │   │   ├── response-matches-workflow-changes.ts
│   │   │   │   │   │   ├── tools-have-parameters.ts
│   │   │   │   │   │   ├── valid-data-flow.ts
│   │   │   │   │   │   ├── valid-field-references.ts
│   │   │   │   │   │   ├── valid-node-config.ts
│   │   │   │   │   │   └── vector-store-has-embeddings.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── checklist/
│   │   │   │   │   └── verifier.ts
│   │   │   │   ├── cli/
│   │   │   │   │   ├── aggregator.ts
│   │   │   │   │   ├── args.ts
│   │   │   │   │   ├── ci-metadata.ts
│   │   │   │   │   ├── compare-pairwise.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lane-allocator.ts
│   │   │   │   │   ├── lanes.ts
│   │   │   │   │   ├── pairwise.ts
│   │   │   │   │   └── report.ts
│   │   │   │   ├── clients/
│   │   │   │   │   ├── n8n-client.ts
│   │   │   │   │   └── sse-client.ts
│   │   │   │   ├── comparison/
│   │   │   │   │   ├── compare.ts
│   │   │   │   │   ├── fetch-baseline.ts
│   │   │   │   │   ├── format.ts
│   │   │   │   │   └── statistics.ts
│   │   │   │   ├── credentials/
│   │   │   │   │   └── seeder.ts
│   │   │   │   ├── data/
│   │   │   │   │   ├── subagent/
│   │   │   │   │   │   ├── schedule-to-email.json
│   │   │   │   │   │   └── webhook-to-slack.json
│   │   │   │   │   └── workflows/
│   │   │   │   │       ├── airtable-split-to-slack.json
│   │   │   │   │       ├── contact-form-automation.json
│   │   │   │   │       ├── cross-team-linear-report.json
│   │   │   │   │       ├── daily-slack-summary.json
│   │   │   │   │       ├── form-to-hubspot.json
│   │   │   │   │       ├── github-notion-sync.json
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── linear-bq-leaderboard.json
│   │   │   │   │       ├── notification-router.json
│   │   │   │   │       ├── rest-api-data-pipeline.json
│   │   │   │   │       ├── set-edit-fields-contract.json
│   │   │   │   │       ├── telegram-chatbot-memory-session.json
│   │   │   │   │       ├── weather-alert.json
│   │   │   │   │       ├── weather-monitoring.json
│   │   │   │   │       └── workflow-data-table.json
│   │   │   │   ├── harness/
│   │   │   │   │   ├── in-process-builder.ts
│   │   │   │   │   ├── logger.ts
│   │   │   │   │   ├── normalize-workflow.ts
│   │   │   │   │   ├── redact.ts
│   │   │   │   │   ├── runner.ts
│   │   │   │   │   ├── sandbox-config.ts
│   │   │   │   │   └── stub-services.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── langsmith/
│   │   │   │   │   └── dataset-sync.ts
│   │   │   │   ├── outcome/
│   │   │   │   │   ├── event-parser.ts
│   │   │   │   │   └── workflow-discovery.ts
│   │   │   │   ├── report/
│   │   │   │   │   └── workflow-report.ts
│   │   │   │   ├── subagent/
│   │   │   │   │   ├── cli.ts
│   │   │   │   │   ├── langsmith.ts
│   │   │   │   │   ├── runner.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── system-prompts/
│   │   │   │   │   └── mock-execution-verify.ts
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── types.ts
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   ├── build-snapshot.cjs
│   │   │   │   ├── print-prompts.ts
│   │   │   │   └── tsconfig.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── binary-checks.test.ts
│   │   │   │   ├── agent/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── computer-use-prompt.test.ts
│   │   │   │   │   │   ├── instance-agent.test.ts
│   │   │   │   │   │   ├── register-with-mastra-leak.test.ts
│   │   │   │   │   │   ├── register-with-mastra.test.ts
│   │   │   │   │   │   ├── sanitize-mcp-schemas.test.ts
│   │   │   │   │   │   └── system-prompt.test.ts
│   │   │   │   │   ├── computer-use-prompt.ts
│   │   │   │   │   ├── credential-guardrails.prompt.ts
│   │   │   │   │   ├── instance-agent.ts
│   │   │   │   │   ├── register-with-mastra.ts
│   │   │   │   │   ├── sanitize-mcp-schemas.ts
│   │   │   │   │   ├── shared-prompts.ts
│   │   │   │   │   ├── sub-agent-briefing.ts
│   │   │   │   │   ├── sub-agent-debriefing.ts
│   │   │   │   │   ├── sub-agent-factory.ts
│   │   │   │   │   └── system-prompt.ts
│   │   │   │   ├── compaction/
│   │   │   │   │   ├── compaction-helper.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── constants/
│   │   │   │   │   ├── max-steps.ts
│   │   │   │   │   └── model-settings.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
│   │   │   │   ├── logger.ts
│   │   │   │   ├── mcp/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── mcp-client-manager.test.ts
│   │   │   │   │   └── mcp-client-manager.ts
│   │   │   │   ├── memory/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── memory-config.test.ts
│   │   │   │   │   │   └── title-utils.test.ts
│   │   │   │   │   ├── memory-config.ts
│   │   │   │   │   └── title-utils.ts
│   │   │   │   ├── parsers/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── structured-file-parser.test.ts
│   │   │   │   │   └── structured-file-parser.ts
│   │   │   │   ├── planned-tasks/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── planned-task-permissions.test.ts
│   │   │   │   │   │   └── planned-task-service.test.ts
│   │   │   │   │   ├── planned-task-permissions.ts
│   │   │   │   │   └── planned-task-service.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── background-task-manager.test.ts
│   │   │   │   │   │   ├── builder-sandbox-session-registry.test.ts
│   │   │   │   │   │   ├── resumable-stream-executor.test.ts
│   │   │   │   │   │   ├── run-state-registry.test.ts
│   │   │   │   │   │   ├── stream-runner.test.ts
│   │   │   │   │   │   └── terminal-response-guard.test.ts
│   │   │   │   │   ├── background-task-manager.ts
│   │   │   │   │   ├── builder-sandbox-session-registry.ts
│   │   │   │   │   ├── resumable-stream-executor.ts
│   │   │   │   │   ├── run-state-registry.ts
│   │   │   │   │   ├── stream-runner.ts
│   │   │   │   │   └── terminal-response-guard.ts
│   │   │   │   ├── storage/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── iteration-log.test.ts
│   │   │   │   │   │   ├── mastra-iteration-log-storage.test.ts
│   │   │   │   │   │   ├── mastra-task-storage.test.ts
│   │   │   │   │   │   ├── planned-task-storage.test.ts
│   │   │   │   │   │   ├── terminal-outcome-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
│   │   │   │   │   ├── terminal-outcome-storage.ts
│   │   │   │   │   ├── thread-patch.ts
│   │   │   │   │   └── workflow-loop-storage.ts
│   │   │   │   ├── stream/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── map-chunk.test.ts
│   │   │   │   │   │   └── work-summary-accumulator.test.ts
│   │   │   │   │   ├── consume-with-hitl.ts
│   │   │   │   │   ├── map-chunk.ts
│   │   │   │   │   └── work-summary-accumulator.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── best-practices.test.ts
│   │   │   │   │   │   ├── credentials.tool.test.ts
│   │   │   │   │   │   ├── data-tables.tool.test.ts
│   │   │   │   │   │   ├── executions.tool.test.ts
│   │   │   │   │   │   ├── nodes.tool.test.ts
│   │   │   │   │   │   ├── research.tool.test.ts
│   │   │   │   │   │   ├── task-control.tool.test.ts
│   │   │   │   │   │   ├── templates.tool.test.ts
│   │   │   │   │   │   ├── workflows.tool.test.ts
│   │   │   │   │   │   └── workspace.tool.test.ts
│   │   │   │   │   ├── attachments/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── parse-file-registration.test.ts
│   │   │   │   │   │   │   └── parse-file.tool.test.ts
│   │   │   │   │   │   └── parse-file.tool.ts
│   │   │   │   │   ├── best-practices/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── techniques.ts
│   │   │   │   │   ├── credentials.tool.ts
│   │   │   │   │   ├── data-tables.tool.ts
│   │   │   │   │   ├── executions.tool.ts
│   │   │   │   │   ├── filesystem/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── create-tools-from-mcp-server.test.ts
│   │   │   │   │   │   └── create-tools-from-mcp-server.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── nodes/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── node-search-engine.test.ts
│   │   │   │   │   │   ├── node-search-engine.ts
│   │   │   │   │   │   ├── node-search-engine.types.ts
│   │   │   │   │   │   └── suggested-nodes-data.ts
│   │   │   │   │   ├── nodes.tool.ts
│   │   │   │   │   ├── orchestration/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── blueprint-accumulator.test.ts
│   │   │   │   │   │   │   ├── blueprint.schema.test.ts
│   │   │   │   │   │   │   ├── browser-credential-setup.nudge.test.ts
│   │   │   │   │   │   │   ├── build-workflow-agent.tool.test.ts
│   │   │   │   │   │   │   ├── builder-memory-compaction.test.ts
│   │   │   │   │   │   │   ├── complete-checkpoint.tool.test.ts
│   │   │   │   │   │   │   ├── credential-guardrails.prompt.test.ts
│   │   │   │   │   │   │   ├── delegate.tool.test.ts
│   │   │   │   │   │   │   ├── plan-with-agent.tool.test.ts
│   │   │   │   │   │   │   ├── plan.tool.test.ts
│   │   │   │   │   │   │   ├── report-verification-verdict.tool.test.ts
│   │   │   │   │   │   │   ├── research-with-agent.tool.test.ts
│   │   │   │   │   │   │   └── verify-built-workflow.tool.test.ts
│   │   │   │   │   │   ├── add-plan-item.tool.ts
│   │   │   │   │   │   ├── blueprint-accumulator.ts
│   │   │   │   │   │   ├── blueprint.schema.ts
│   │   │   │   │   │   ├── browser-credential-setup.nudge.ts
│   │   │   │   │   │   ├── browser-credential-setup.prompt.ts
│   │   │   │   │   │   ├── browser-credential-setup.tool.ts
│   │   │   │   │   │   ├── build-workflow-agent.prompt.ts
│   │   │   │   │   │   ├── build-workflow-agent.tool.ts
│   │   │   │   │   │   ├── builder-memory-compaction.ts
│   │   │   │   │   │   ├── complete-checkpoint.tool.ts
│   │   │   │   │   │   ├── data-table-agent.prompt.ts
│   │   │   │   │   │   ├── data-table-agent.tool.ts
│   │   │   │   │   │   ├── delegate.schemas.ts
│   │   │   │   │   │   ├── delegate.tool.ts
│   │   │   │   │   │   ├── display-utils.ts
│   │   │   │   │   │   ├── plan-agent-prompt.ts
│   │   │   │   │   │   ├── plan-with-agent.tool.ts
│   │   │   │   │   │   ├── plan.tool.ts
│   │   │   │   │   │   ├── report-verification-verdict.tool.ts
│   │   │   │   │   │   ├── research-agent-prompt.ts
│   │   │   │   │   │   ├── research-with-agent.tool.ts
│   │   │   │   │   │   ├── submit-plan.tool.ts
│   │   │   │   │   │   ├── tracing-utils.ts
│   │   │   │   │   │   └── verify-built-workflow.tool.ts
│   │   │   │   │   ├── research.tool.ts
│   │   │   │   │   ├── shared/
│   │   │   │   │   │   └── ask-user.tool.ts
│   │   │   │   │   ├── task-control.tool.ts
│   │   │   │   │   ├── templates.tool.ts
│   │   │   │   │   ├── web-research/
│   │   │   │   │   │   └── sanitize-web-content.ts
│   │   │   │   │   ├── workflows/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── build-workflow-schema.test.ts
│   │   │   │   │   │   │   ├── resolve-credentials.test.ts
│   │   │   │   │   │   │   ├── setup-workflow.service.test.ts
│   │   │   │   │   │   │   ├── submit-workflow-identity.test.ts
│   │   │   │   │   │   │   ├── submit-workflow.tool.test.ts
│   │   │   │   │   │   │   └── write-sandbox-file.tool.test.ts
│   │   │   │   │   │   ├── apply-workflow-credentials.tool.ts
│   │   │   │   │   │   ├── build-workflow.tool.ts
│   │   │   │   │   │   ├── materialize-node-type.tool.ts
│   │   │   │   │   │   ├── resolve-credentials.ts
│   │   │   │   │   │   ├── setup-workflow.schema.ts
│   │   │   │   │   │   ├── setup-workflow.service.ts
│   │   │   │   │   │   ├── submit-workflow-identity.ts
│   │   │   │   │   │   ├── submit-workflow.tool.ts
│   │   │   │   │   │   └── write-sandbox-file.tool.ts
│   │   │   │   │   ├── workflows.tool.ts
│   │   │   │   │   └── workspace.tool.ts
│   │   │   │   ├── tracing/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── langsmith-tracing.test.ts
│   │   │   │   │   │   └── trace-replay.test.ts
│   │   │   │   │   ├── langsmith-tracing.ts
│   │   │   │   │   └── trace-replay.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── format-timestamp.test.ts
│   │   │   │   │   │   └── stream-helpers.test.ts
│   │   │   │   │   ├── agent-tree.ts
│   │   │   │   │   ├── eval-agents.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
│   │   │   │   │   │   ├── remediation.test.ts
│   │   │   │   │   │   ├── workflow-loop-controller.test.ts
│   │   │   │   │   │   └── workflow-task-service.test.ts
│   │   │   │   │   ├── guidance.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── remediation.ts
│   │   │   │   │   ├── runtime.ts
│   │   │   │   │   ├── workflow-loop-controller.ts
│   │   │   │   │   ├── workflow-loop-state.ts
│   │   │   │   │   └── workflow-task-service.ts
│   │   │   │   └── workspace/
│   │   │   │       ├── __tests__/
│   │   │   │       │   ├── builder-sandbox-factory.test.ts
│   │   │   │       │   ├── create-workspace.test.ts
│   │   │   │       │   ├── n8n-sandbox-client.test.ts
│   │   │   │       │   ├── sandbox-fs.test.ts
│   │   │   │       │   ├── sandbox-setup.test.ts
│   │   │   │       │   └── snapshot-manager.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
│   │   │   │       ├── pack-workspace-sdk.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
│   │   │   ├── 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
│   │   │   └── vite.config.ts
│   │   ├── local-gateway/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── assets/
│   │   │   │   ├── README.md
│   │   │   │   └── icon.icns
│   │   │   ├── electron-builder.config.js
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   ├── copy-assets.js
│   │   │   │   └── copy-renderer.js
│   │   │   ├── 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__/
│   │   │   │   │   ├── cdp-relay.test.ts
│   │   │   │   │   ├── errors.test.ts
│   │   │   │   │   ├── server-config.test.ts
│   │   │   │   │   └── utils.test.ts
│   │   │   │   ├── adapters/
│   │   │   │   │   ├── agent-browser.test.ts
│   │   │   │   │   ├── agent-browser.ts
│   │   │   │   │   └── 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/
│   │   │   ├── .gitignore
│   │   │   ├── eslint.config.mjs
│   │   │   ├── manifest.json
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   └── bundle.mjs
│   │   │   ├── src/
│   │   │   │   ├── background.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── relayConnection.test.ts
│   │   │   │   ├── relayConnection.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── ui/
│   │   │   │       ├── App.vue
│   │   │   │       ├── components/
│   │   │   │       │   ├── SettingsPanel.vue
│   │   │   │       │   ├── StatusBadge.vue
│   │   │   │       │   ├── TabItem.vue
│   │   │   │       │   └── TabList.vue
│   │   │   │       ├── composables/
│   │   │   │       │   ├── useConnection.test.ts
│   │   │   │       │   └── useConnection.ts
│   │   │   │       ├── connect.html
│   │   │   │       ├── main.ts
│   │   │   │       ├── shimsVue.d.ts
│   │   │   │       └── tokens.scss
│   │   │   ├── tsconfig.json
│   │   │   ├── vite.sw.config.mts
│   │   │   ├── vite.ui.config.mts
│   │   │   └── vitest.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.test.ts
│   │   │   │   │   └── 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/
│   │   │   │   ├── AlibabaCloudApi.credentials.ts
│   │   │   │   ├── AnthropicApi.credentials.ts
│   │   │   │   ├── AzureAiSearchApi.credentials.ts
│   │   │   │   ├── AzureEntraCognitiveServicesOAuth2Api.credentials.ts
│   │   │   │   ├── AzureOpenAiApi.credentials.ts
│   │   │   │   ├── BraveSearchApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStorePGVectorApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStorePineconeApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStoreQdrantApi.credentials.ts
│   │   │   │   ├── ChromaCloudApi.credentials.ts
│   │   │   │   ├── ChromaSelfHostedApi.credentials.ts
│   │   │   │   ├── CohereApi.credentials.ts
│   │   │   │   ├── DaytonaApi.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
│   │   │   │   ├── MinimaxApi.credentials.ts
│   │   │   │   ├── MistralCloudApi.credentials.ts
│   │   │   │   ├── MoonshotApi.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
│   │   │   ├── 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
│   │   │   │   │   ├── LmChatAlibabaCloud/
│   │   │   │   │   │   ├── LmChatAlibabaCloud.node.ts
│   │   │   │   │   │   ├── alibaba-cloud-base-url.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatAlibabaCloud.test.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
│   │   │   │   │   ├── LmChatMinimax/
│   │   │   │   │   │   ├── LmChatMinimax.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatMinimax.test.ts
│   │   │   │   │   ├── LmChatMistralCloud/
│   │   │   │   │   │   └── LmChatMistralCloud.node.ts
│   │   │   │   │   ├── LmChatMoonshot/
│   │   │   │   │   │   ├── LmChatMoonshot.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatMoonshot.test.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
│   │   │   │   │   │   │   └── utils.test.ts
│   │   │   │   │   │   ├── loadOptions.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── McpRegistryClientTool/
│   │   │   │   │   │   ├── McpRegistryClientTool.node.test.ts
│   │   │   │   │   │   └── McpRegistryClientTool.node.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
│   │   │   │   │       ├── runtime.test.ts
│   │   │   │   │       ├── runtime.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/
│   │   │   │       ├── AlibabaCloud/
│   │   │   │       │   ├── AlibabaCloud.node.ts
│   │   │   │       │   ├── actions/
│   │   │   │       │   │   ├── descriptions.ts
│   │   │   │       │   │   ├── image/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   ├── generate.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── router.ts
│   │   │   │       │   │   ├── text/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── message.operation.ts
│   │   │   │       │   │   ├── versionDescription.ts
│   │   │   │       │   │   └── video/
│   │   │   │       │   │       ├── generate.i2v.operation.ts
│   │   │   │       │   │       ├── generate.t2v.operation.ts
│   │   │   │       │   │       └── index.ts
│   │   │   │       │   ├── helpers/
│   │   │   │       │   │   └── interfaces.ts
│   │   │   │       │   ├── methods/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   └── listSearch.ts
│   │   │   │       │   ├── test/
│   │   │   │       │   │   ├── listSearch.test.ts
│   │   │   │       │   │   ├── operations.test.ts
│   │   │   │       │   │   ├── router.test.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: .claude/README.md
================================================
# Claude Code Configuration

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

All skills, agents, and commands live under the `n8n` plugin at
`.claude/plugins/n8n/` for `n8n:` namespacing. See
[plugin README](plugins/n8n/README.md) for full details.

## 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.

## Plugin

All skills, commands, and agents are auto-discovered from
`.claude/plugins/n8n/`. They get the `n8n:` namespace prefix automatically
(e.g. `n8n:create-pr`, `/n8n:plan`, `n8n:developer`).

See [plugin README](plugins/n8n/README.md) for structure and design decisions.


================================================
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",
  "version": "0.2.0",
  "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. All items are
namespaced under `n8n:` to avoid collisions with personal or third-party
plugins.

## Usage

Skills, commands, and agents are auto-discovered by Claude Code from this
plugin directory. Everything gets the `n8n:` namespace prefix automatically.

| Type | Example | Invocation |
|------|---------|------------|
| Skill | `skills/create-pr/SKILL.md` | `n8n:create-pr` |
| Command | `commands/plan.md` | `/n8n:plan PAY-XXX` |
| Agent | `agents/developer.md` | `n8n:developer` |

## Plugin Structure

```
.claude/plugins/n8n/
├── .claude-plugin/
│   ├── marketplace.json    # Marketplace manifest
│   └── plugin.json         # Plugin identity
├── agents/
│   └── <name>.md           # → n8n:<name> agent
├── commands/
│   └── <name>.md           # → /n8n:<name> command
├── skills/
│   └── <name>/SKILL.md     # → n8n:<name> skill
└── README.md
```

## Design Decisions

### Why a plugin instead of standalone skills?

To get the `n8n:` namespace prefix, avoiding collisions with personal or
third-party plugins. Claude Code only supports colon-namespaced items through
the plugin system — standalone `.claude/skills/` entries cannot be namespaced.

### 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/agents/developer.md
================================================
---
name: 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 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 developer agent to build this API endpoint.'</example> <example>user: 'Fix the CSS issue in the node panel' assistant: 'I'll use the 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/plugins/n8n/agents/linear-issue-triager.md
================================================
---
name: 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/plugins/n8n/commands/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/plugins/n8n/commands/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/scripts/track-skill-usage.mjs
================================================
#!/usr/bin/env node

// Tracks n8n plugin skill usage by sending anonymized analytics.
// Called as a PostToolUse hook for the Skill tool.
// Receives JSON on stdin: { "tool_name": "Skill", "tool_input": { "skill": "n8n:foo", ... }, "tool_response": ... }

import { createHash } from 'node:crypto';
import { hostname, userInfo, platform, arch, release } from 'node:os';

const TELEMETRY_HOST = 'https://telemetry.n8n.io';
const TELEMETRY_WRITE_KEY = '1zPn7YoGC3ZXE9zLeTKLuQCB4F6';

const input = await new Promise((resolve) => {
	let data = '';
	process.stdin.on('data', (chunk) => (data += chunk));
	process.stdin.on('end', () => resolve(data));
});

const { tool_input: toolInput } = JSON.parse(input);
const skillName = toolInput?.skill;

// Only track n8n-namespaced skills ("n8n-foo" or "n8n:foo")
const isN8nSkill = skillName.startsWith('n8n:') || skillName.startsWith('n8n-');
if (!skillName || !isN8nSkill) {
	process.exit(0);
}

// Generate anonymized user ID: SHA-256 of (username + hostname + OS + arch + release)
const raw = `${userInfo().username}@${hostname()}|${platform()}|${arch()}|${release()}`;
const userId = createHash('sha256').update(raw).digest('hex');

const payload = JSON.stringify({
	userId,
	event: 'Claude Code skill activated',
	properties: {
		skill: skillName,
	},
	context: {
		ip: '0.0.0.0',
	},
});

// Send to telemetry HTTP Track API (fire-and-forget, never block the user)
try {
	await fetch(`${TELEMETRY_HOST}/v1/track`, {
		method: 'POST',
		headers: {
			'Content-Type': 'application/json',
			Authorization: `Basic ${Buffer.from(`${TELEMETRY_WRITE_KEY}:`).toString('base64')}`,
		},
		body: payload,
	});
} catch {
	// Silently ignore network errors
}


================================================
FILE: .claude/plugins/n8n/skills/community-pr-review/SKILL.md
================================================
---
description: >-
  Checks if a community pull request is ready for human review. Verifies CLA
  signature, PR title format, description completeness, test coverage, and
  cubic-dev-ai issues. Use when given a PR number or branch name to review,
  or when the user says /community-pr-review, /pr-review, or asks to check if
  a PR is ready for review.
allowed-tools: Bash(gh:*), Bash(git:*), Read, Glob, Grep
---

# Community PR Review

Given a PR number or branch name, determine whether it is ready for human review.

## Steps

### 1. Resolve the PR

If given a branch name, find the PR number first:
```bash
gh pr view <branch> --repo n8n-io/n8n --json number --jq .number
```

### 2. Fetch PR data

```bash
gh pr view <number> --repo n8n-io/n8n \
  --json number,title,body,author,headRefName,headRefOid,files,isDraft,state
```

Fetch in parallel:

```bash
# CLA commit status (primary signal) — statuses are newest-first; use the first returned entry
gh api --paginate "repos/n8n-io/n8n/commits/<headRefOid>/statuses" \
  --jq '[.[] | select(.context == "license/cla") | {state, description}] | first'

# CLAassistant issue comment (fallback when no commit status) — use the last returned entry
gh api --paginate "repos/n8n-io/n8n/issues/<number>/comments" \
  --jq '[.[] | select(.user.login == "CLAassistant") | .body] | last'

# cubic-dev-ai PR review comments (streamed so results concatenate cleanly across pages)
gh api --paginate "repos/n8n-io/n8n/pulls/<number>/comments" \
  --jq '.[] | select(.user.login == "cubic-dev-ai[bot]") | {body: .body, path: .path}'
```

### 3. Run the five checks

#### A. CLA signed

Check the `license/cla` commit status first; fall back to the CLAassistant comment if no status exists.

**Commit status** (`context == "license/cla"`):
- `state: "success"` → ✅ signed
- `state: "failure"` or `state: "error"` → ❌ not signed
- `state: "pending"` → ⏳ pending
- Not present → fall back to comment

**CLAassistant issue comment** (fallback):
- Body contains `"All committers have signed the CLA."` → ✅ signed
- Body contains `"not signed"` or a link to sign → ❌ not signed
- No comment → ❌ treat as not signed

#### B. PR title format

For all types except `revert`, the title must match:
```
^(feat|fix|perf|test|docs|refactor|build|ci|chore)(\([a-zA-Z0-9 ]+( Node)?\))?!?: [A-Z].+[^.]$
```

For `revert` titles, the summary is the original commit header (which starts with a lowercase type), so capitalization is not enforced:
```
^revert(\([a-zA-Z0-9 ]+( Node)?\))?!?: .+[^.]$
```

- Type must be one of: `feat fix perf test docs refactor build ci chore revert`
- Scope is optional, in parentheses e.g. `(editor)` or `(Slack Node)`
- Breaking changes: `!` before the colon
- Summary: starts with capital letter (lowercase allowed for `revert:`), no trailing period
- No Linear ticket IDs in the title (e.g. `N8N-1234`)

#### C. PR description completeness

1. **Summary** (`## Summary`) — must have non-empty content below the heading (not just the HTML comment).
2. **Related tickets** (`## Related Linear tickets, Github issues, and Community forum posts`) — acceptable content: a URL (`http`), a GitHub closing keyword (`closes #N`, `fixes #N`, `resolves #N`, etc.), or empty. Only flag if the section heading is missing entirely.
3. **Checklist** (`## Review / Merge checklist`) — all four items must be present. Unchecked checkboxes are expected for community PRs; do **not** flag them as missing.

#### D. Tests

Skip this check if the PR type (from the title) is `docs`, `ci`, `chore`, or `build`.

Otherwise:
1. Identify source files changed: non-test files under `packages/` from the `files` list.
2. If there are source file changes, check out the PR in a temporary worktree:

```bash
git fetch origin pull/<number>/head:pr/<number>
git worktree add /tmp/pr-<number>-review pr/<number>
```

3. Read the changed source files from the worktree to understand whether the changes introduce logic that warrants tests (new functions, bug fixes, behaviour changes, data transformations). Pure config changes, type-only changes, and trivial renames do not require tests.
4. Look for matching test files (`*.test.ts`, `*.spec.ts`, files inside `__tests__/`) among the changed files.
5. **Always clean up the worktree**, even if a previous check failed:

```bash
git worktree remove /tmp/pr-<number>-review --force
git branch -D pr/<number>
```

Report:
- ✅ Tests present, or change does not require tests
- ❌ Source logic changed but no test files found

#### E. cubic-dev-ai issues

Review the PR review comments fetched in step 2. `cubic-dev-ai[bot]` leaves comments for every issue it finds.

- No comments from `cubic-dev-ai[bot]`, or every comment explicitly states no issues were found → ✅
- Any other comment → ❌ report the total count and priority breakdown (e.g. "3 issues: 1× P1, 1× P2, 1× P3")

### 4. Output

Always output valid JSON in this exact shape:

```json
{
  "readyForReview": <true if all passing checks allow merge, false otherwise>,
  "messageForUser": "<Human-readable summary of what needs to change, written as if posted directly to the PR contributor. 'N/A' if nothing is needed.>",
  "checks": {
    "CLA": <true if signed, false if not signed or pending>,
    "Title": <true if title matches convention, false otherwise>,
    "Description": <true if all three template sections are complete, false otherwise>,
    "TestsNeeded": <true if the code changes require tests, false if not applicable>,
    "TestsIncluded": <true if test files are present in the PR, false otherwise>,
    "CubicIssues": <true if cubic-dev-ai raised issues, false if no issues>
  }
}
```

`readyForReview` is `true` only when: `CLA`, `Title`, and `Description` are all `true`; `CubicIssues` is `false`; and either `TestsNeeded` is `false` or `TestsIncluded` is `true`.

`messageForUser` should be a short, friendly message directed at the contributor listing exactly what they need to address. If `readyForReview` is `true`, set it to `"N/A"`.

Output nothing other than the JSON block.

## Notes

- Draft PRs — report all findings but note the PR is a draft.
- If the PR is already merged or closed, say so and skip the checks.
- Always remove the worktree even if earlier checks failed.


================================================
FILE: .claude/plugins/n8n/skills/content-design/SKILL.md
================================================
---
name: n8n: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/plugins/n8n/skills/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/plugins/n8n/skills/create-community-node-lint-rule/SKILL.md
================================================
---
name: n8n:create-community-node-lint-rule
description: >-
  Create new ESLint rules for the @n8n/eslint-plugin-community-nodes package.
  Use when adding a lint rule, creating a community node lint, or working on
  eslint-plugin-community-nodes. Guides rule implementation, tests, docs, and
  plugin registration.
---

# Create Community Node Lint Rule

Guide for adding new ESLint rules to `packages/@n8n/eslint-plugin-community-nodes/`.

All paths below are relative to `packages/@n8n/eslint-plugin-community-nodes/`.

## Step 1: Understand the Rule

Before writing code, clarify:
- **What** does the rule detect? (missing property, wrong pattern, bad value)
- **Where** does it apply? (`.node.ts` files, credential classes, both)
- **Severity**: `error` (must fix) or `warn` (should fix)?
- **Fixable?** Can it be auto-fixed safely, or only suggest?
- **Scope**: Both `recommended` configs, or exclude from `recommendedWithoutN8nCloudSupport`?

## Step 2: Implement the Rule

Create `src/rules/<rule-name>.ts`:

```typescript
import { AST_NODE_TYPES } from '@typescript-eslint/utils';

import {
  isNodeTypeClass,       // or isCredentialTypeClass
  findClassProperty,
  findObjectProperty,
  createRule,
} from '../utils/index.js';

export const YourRuleNameRule = createRule({
  name: 'rule-name',
  meta: {
    type: 'problem',  // or 'suggestion'
    docs: {
      description: 'One-line description of what the rule enforces',
    },
    messages: {
      messageId: 'Human-readable message. Use {{placeholder}} for dynamic data.',
    },
    fixable: 'code',     // omit if not auto-fixable
    hasSuggestions: true, // omit if no suggestions
    schema: [],           // add options schema if configurable
  },
  defaultOptions: [],
  create(context) {
    return {
      ClassDeclaration(node) {
        if (!isNodeTypeClass(node)) return;

        const descriptionProperty = findClassProperty(node, 'description');
        if (!descriptionProperty) return;

        const descriptionValue = descriptionProperty.value;
        if (descriptionValue?.type !== AST_NODE_TYPES.ObjectExpression) return;

        // Rule logic here — use findObjectProperty(), getLiteralValue(), etc.

        context.report({
          node: targetNode,
          messageId: 'messageId',
          data: { /* template vars */ },
          fix(fixer) {
            return fixer.replaceText(targetNode, 'replacement');
          },
        });
      },
    };
  },
});
```

**Naming**: Export as `PascalCaseRule` (e.g. `MissingPairedItemRule`). The `name` field is kebab-case.

**Available AST helpers** — see [reference.md](reference.md) for the full catalog of `ast-utils` and `file-utils` exports.

## Step 3: Write Tests

Create `src/rules/<rule-name>.test.ts`:

```typescript
import { RuleTester } from '@typescript-eslint/rule-tester';

import { YourRuleNameRule } from './rule-name.js';

const ruleTester = new RuleTester();

// Helper to generate test code — keeps test cases readable
function createNodeCode(/* parameterize the varying parts */): string {
  return `
import type { INodeType, INodeTypeDescription } from 'n8n-workflow';

export class TestNode implements INodeType {
  description: INodeTypeDescription = {
    displayName: 'Test Node',
    name: 'testNode',
    group: ['input'],
    version: 1,
    description: 'A test node',
    defaults: { name: 'Test Node' },
    inputs: [],
    outputs: [],
    properties: [],
  };
}`;
}

ruleTester.run('rule-name', YourRuleNameRule, {
  valid: [
    { name: 'class that does not implement INodeType', code: '...' },
    { name: 'node with correct pattern', code: createNodeCode(/* correct */) },
  ],
  invalid: [
    {
      name: 'descriptive case name',
      code: createNodeCode(/* incorrect */),
      errors: [{ messageId: 'messageId', data: { /* expected template vars */ } }],
      output: createNodeCode(/* expected after fix */),  // or `output: null` if no fix
    },
  ],
});
```

**Test guidelines:**
- Always test that non-INodeType classes are skipped (valid case)
- Test both the error message and the fixed output for fixable rules
- For rules with options, test each option combination
- For rules using filesystem, mock with `vi.mock('../utils/file-utils.js')`
- For suggestion-only rules, use `errors: [{ messageId, suggestions: [...] }]`

## Step 4: Register the Rule

### 4a. Add to `src/rules/index.ts`

```typescript
import { YourRuleNameRule } from './rule-name.js';

// Add to the rules object:
export const rules = {
  // ... existing rules
  'rule-name': YourRuleNameRule,
} satisfies Record<string, AnyRuleModule>;
```

### 4b. Add to `src/plugin.ts` configs

Add to **both** config objects (unless the rule depends on n8n cloud features):

```typescript
'@n8n/community-nodes/rule-name': 'error',  // or 'warn'
```

- Use `error` for rules that catch bugs or required patterns
- Use `warn` for style/convention rules (like `options-sorted-alphabetically`)
- If the rule uses `no-restricted-globals` or `no-restricted-imports` patterns,
  only add to `recommended` (not `recommendedWithoutN8nCloudSupport`)

## Step 5: Write Documentation

Create `docs/rules/<rule-name>.md`:

```markdown
# Description of what the rule does (`@n8n/community-nodes/rule-name`)

<!-- end auto-generated rule header -->

## Rule Details

Explain why this rule exists and what problem it prevents.

## Examples

### Incorrect

\`\`\`typescript
// code that triggers the rule
\`\`\`

### Correct

\`\`\`typescript
// code that passes the rule
\`\`\`
```

The header above `<!-- end auto-generated rule header -->` will be regenerated by `pnpm build:docs`. Write a reasonable first version — it gets overwritten.

## Step 6: Verify

Run from `packages/@n8n/eslint-plugin-community-nodes/`:

```bash
pushd packages/@n8n/eslint-plugin-community-nodes
pnpm test <rule-name>.test.ts   # tests pass
pnpm typecheck                   # types are clean
pnpm build                       # compiles
pnpm build:docs                  # regenerates doc headers and README table
pnpm lint:docs                   # docs match schema
popd
```

## Checklist

- [ ] Rule file: `src/rules/<rule-name>.ts`
- [ ] Test file: `src/rules/<rule-name>.test.ts`
- [ ] Registered in `src/rules/index.ts`
- [ ] Added to configs in `src/plugin.ts`
- [ ] Doc file: `docs/rules/<rule-name>.md`
- [ ] README table updated via `pnpm build:docs`
- [ ] All verification commands pass


================================================
FILE: .claude/plugins/n8n/skills/create-community-node-lint-rule/reference.md
================================================
# AST & File Utilities Reference

Helpers available from `../utils/index.js`. Use these instead of writing custom AST traversal.

## ast-utils.ts

### Class/Interface detection

| Function | Returns | Use when |
|----------|---------|----------|
| `isNodeTypeClass(node)` | `boolean` | Check if class implements `INodeType` or extends `Node` |
| `isCredentialTypeClass(node)` | `boolean` | Check if class implements `ICredentialType` |

### Property finding

| Function | Returns | Use when |
|----------|---------|----------|
| `findClassProperty(node, name)` | `PropertyDefinition \| null` | Find a property on a class (e.g. `description`, `icon`) |
| `findObjectProperty(obj, name)` | `Property \| null` | Find a property in an object literal (Identifier key) |
| `findJsonProperty(obj, name)` | `Property \| null` | Find a property with a Literal key (JSON-style `"key"`) |
| `findArrayLiteralProperty(obj, name)` | `Property \| null` | Find a property whose value is an ArrayExpression |

### Value extraction

| Function | Returns | Use when |
|----------|---------|----------|
| `getLiteralValue(node)` | `string \| boolean \| number \| null` | Extract primitive from a Literal node |
| `getStringLiteralValue(node)` | `string \| null` | Extract string specifically |
| `getBooleanLiteralValue(node)` | `boolean \| null` | Extract boolean specifically |
| `getModulePath(node)` | `string \| null` | Get import path from string literal or template literal |

### Array operations

| Function | Returns | Use when |
|----------|---------|----------|
| `hasArrayLiteralValue(arr, value)` | `boolean` | Check if array contains a specific string literal |
| `extractCredentialInfoFromArray(element)` | `{ name, testedBy } \| null` | Parse credential object from array element |
| `extractCredentialNameFromArray(element)` | `string \| null` | Get just the credential name from array element |

### Method matching

| Function | Returns | Use when |
|----------|---------|----------|
| `isThisHelpersAccess(node)` | `boolean` | Match `this.helpers` member expression |
| `isThisMethodCall(node, method)` | `boolean` | Match `this.methodName(...)` calls |
| `isThisHelpersMethodCall(node, method)` | `boolean` | Match `this.helpers.methodName(...)` calls |

### Similarity

| Function | Returns | Use when |
|----------|---------|----------|
| `findSimilarStrings(target, candidates, maxDistance?)` | `string[]` | Suggest similar names (Levenshtein distance) |

## file-utils.ts

### Path operations

| Function | Use when |
|----------|----------|
| `isContainedWithin(child, parent)` | Check path is within a directory |
| `safeJoinPath(base, ...parts)` | Join paths with traversal prevention |

### Package.json

| Function | Returns | Use when |
|----------|---------|----------|
| `findPackageJson(startDir)` | `string \| null` | Walk up to find nearest package.json |
| `readPackageJsonN8n(startDir)` | `N8nPackageJson \| null` | Parse n8n config section |
| `readPackageJsonCredentials(startDir)` | `Set<string>` | Get credential names from package.json |
| `readPackageJsonNodes(startDir)` | `string[]` | Get resolved node file paths |

### File system

| Function | Use when |
|----------|----------|
| `validateIconPath(filePath, iconValue)` | Check icon file exists and is SVG |
| `extractCredentialNameFromFile(filePath)` | Parse credential class name from file |
| `fileExistsWithCaseSync(filePath)` | Case-sensitive existence check |
| `findSimilarSvgFiles(dir, name)` | Suggest similar SVG filenames |

### Credential verification

| Function | Use when |
|----------|----------|
| `areAllCredentialUsagesTestedByNodes(startDir)` | Check all credentials have testedBy |


================================================
FILE: .claude/plugins/n8n/skills/create-issue/SKILL.md
================================================
---
name: n8n: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/plugins/n8n/skills/create-pr/SKILL.md
================================================
---
name: n8n: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. Read `.github/pull_request_template.md` as the
   body structure, then populate each section with actual content before
   creating the PR:
   - **Summary**: describe what the PR does and how to test it
   - **Related tickets**: add the Linear ticket URL (`https://linear.app/n8n/issue/[TICKET-ID]`) and any GitHub issue links
   - **Checklist**: keep as-is from the template
	 - Add a "🤖 PR Summary generated by AI" at the end of the body

   ```bash
   gh pr create --draft --title "<type>(<scope>): <summary>" --body "$(cat <<'EOF'
   <populated body based on pull_request_template.md>
   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:
- The human author of the PR has checked the "I have seen this code, I have run this code, and I take responsibility for this code." checkbox
- 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.

**When in doubt, check the Linear issue for possible extra precautions**


================================================
FILE: .claude/plugins/n8n/skills/create-skill/SKILL.md
================================================
---
name: n8n: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/plugins/n8n/skills/<name>/`** | Default for n8n: team-shared, versioned, namespaced under `n8n:`. |
| `~/.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 **plugin `.claude/plugins/n8n/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/plugins/n8n/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** — use the namespaced invocation name (e.g. `n8n:create-issue`) so the agent resolves the plugin skill. For human-readable links, give the path from the repo root (e.g. `.claude/plugins/n8n/skills/create-issue/SKILL.md`). From a sibling folder, a relative link works too: `[create-issue](../create-issue/SKILL.md)`. 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/plugins/n8n/skills/design-system/SKILL.md
================================================
---
name: n8n:design-system
description: Guidelines on using Design System styles and components. Use when working on .vue files in packages/frontend. Triggers for tasks that include component architecture, styling, UI changes, or feature work.
---

# Design System

Comprehensive guide for building, styling, and using components in the frontend.

## When to Apply
Reference these guidelines when:
- Working on `.{vue|css|scss}` files in `packages/frontend`
- Adding new components to `packages/frontend/@n8n/design-system`
- Refactoring styles for Vue components
- Implementing new UI components or features
- Reviewing changes to UI

## Rules
- Follow guidelines in `packages/frontend/@n8n/design-system/src/styleguide/*.mdx`
- ALWAYS use CSS variables for styles from `packages/frontend/@n8n/design-system/src/css/_tokens.scss` or `packages/frontend/@n8n/design-system/src/css/_primtivies.scss`. Use hard-coded values only when no suitable tokens.
- ALWAYS prefer using existing components from `packages/frontend/@n8n/design-system/src/components`. Prefer components that aren't marked `@deprecated`.
- Use `light-dark()` when alternating colors for ligh/dark mode
- When working with animations or transitions, ALWAYS prefer using mixins from `packages/frontend/@n8n/design-system/src/css/mixins/motion.scss`
- When reviewing animations, follow the guides in `rules/web-animation-guidelines.md`
- When reviewing UI changes or adding new components, follow `rules/web-interface-guidelines.md`

## Examples
- "Add a modal dialog for confirming workflow deletion" → Use `N8nDialog`
- "Add a dropdown to select workflow status" → Use `N8nDropdown` or `N8nSelect`
- "Add button with + icon to add new tiem" → Wrap `N8nButton` with `iconOnly` prop with `N8nTooltip` and wrap in `N8nTooltip`. Use `N8nIcon` and proper aria-label.
- "Add a destructive action button" → use `N8nButton` with `variant="destructive"`
- "Make background color white/black" → Use `var(--background--surface)` for white on light mode and "black" on dark mode
- "Animate the title in gracefully" -> Use `fade-in-up` mixin from `motion.scss` with `var(--duration--base)`


================================================
FILE: .claude/plugins/n8n/skills/design-system/rules/web-animation-guidelines.md
================================================
# Web Motion Guidelines
Design and implement web animations that feel natural and purposeful

## Timing and Duration

## Duration Guidelines

| Element Type                      | Duration  |
| --------------------------------- | --------- |
| Micro-interactions                | 100-150ms |
| Standard UI (tooltips, dropdowns) | 150-250ms |
| Modals, drawers                   | 200-300ms |

**Rules:**

- UI animations should stay under 300ms
- Larger elements animate slower than smaller ones
- Exit animations can be ~20% faster than entrance
- Match duration to distance - longer travel = longer duration

### The Frequency

Determine how often users will see the animation:

- **100+ times/day** → No animation (or drastically reduced)
- **Occasional use** → Standard animation
- **Rare/first-time** → Can be more special

**Example:** Raycast never animates because users open it hundreds of times a day.

## When to Animate

**Do animate:**

- Enter/exit transitions for spatial consistency
- State changes that benefit from visual continuity
- Responses to user actions (feedback)
- Rarely-used interactions where delight adds value

**Don't animate:**

- Keyboard-initiated actions
- Hover effects on frequently-used elements
- Anything users interact with 100+ times daily
- When speed matters more than smoothness

## Performance

Prefer animating `transform` and `opacity`. These skip layout and paint stages, running entirely on the GPU.

**Avoid animating:**

- `padding`, `margin`, `height`, `width` (trigger layout)
- `blur` filters above 20px (expensive, especially Safari)
- CSS variables in deep component trees

### Optimization Techniques

```css
/* Force GPU acceleration */
.animated-element {
  will-change: transform;
}
```

## Practical Tips

Quick reference for common scenarios. See [PRACTICAL-TIPS.md](PRACTICAL-TIPS.md) for detailed implementations.

| Scenario                        | Solution                                        |
| ------------------------------- | ----------------------------------------------- |
| Make buttons feel responsive    | Add `transform: scale(0.97)` on `:active`       |
| Element appears from nowhere    | Start from `scale(0.95)`, not `scale(0)`        |
| Shaky/jittery animations        | Add `will-change: transform`                    |
| Hover causes flicker            | Animate child element, not parent               |
| Popover scales from wrong point | Set `transform-origin` to trigger location      |
| Sequential tooltips feel slow   | Skip delay/animation after first tooltip        |
| Small buttons hard to tap       | Use 44px minimum hit area (pseudo-element)      |
| Something still feels off       | Add subtle blur (under 20px) to mask it         |
| Hover triggers on mobile        | Use `@media (hover: hover) and (pointer: fine)` |

## Easing Decision Flowchart

Is the element entering or exiting the viewport?
├── Yes → ease-out
└── No
├── Is it moving/morphing on screen?
│ └── Yes → ease-in-out
└── Is it a hover change?
├── Yes → ease
└── Is it constant motion?
├── Yes → linear
└── Default → ease-out


================================================
FILE: .claude/plugins/n8n/skills/design-system/rules/web-interface-guidelines.md
================================================
# Web Interface Guidelines
<!-- credit to https://github.com/raunofreiberg/interfaces -->
This document outlines a non-exhaustive list of details that make a good (web) interface. It is a living document, periodically updated based on learnings. Some of these may be subjective, but most apply to all websites.

The [WAI-ARIA](https://www.w3.org/TR/wai-aria-1.1/) spec is deliberately not duplicated in this document. However, some accessibility guidelines may be pointed out. Contributions are welcome. Edit [this file](https://github.com/raunofreiberg/interfaces/blob/main/README.md) and submit a pull request.

## Interactivity

- Clicking the input label should focus the input field
- Inputs should be wrapped with a `<form>` to submit by pressing Enter
- Inputs should have an appropriate `type` like `password`, `email`, etc
- Inputs should disable `spellcheck` and `autocomplete` attributes most of the time
- Inputs should leverage HTML form validation by using the `required` attribute when appropriate
- Input prefix and suffix decorations, such as icons, should be absolutely positioned on top of the text input with padding, not next to it, and trigger focus on the input
- Toggles should immediately take effect, not require confirmation
- Buttons should be disabled after submission to avoid duplicate network requests
- Interactive elements should disable `user-select` for inner content
- Decorative elements (glows, gradients) should disable `pointer-events` to not hijack events
- Interactive elements in a vertical or horizontal list should have no dead areas between each element, instead, increase their `padding`

## Typography

- Fonts should have `-webkit-font-smoothing: antialiased` applied for better legibility
- Fonts should have `text-rendering: optimizeLegibility` applied for better legibility
- Fonts should be subset based on the content, alphabet or relevant language(s)
- Font weight should not change on hover or selected state to prevent layout shift
- Font weights below 400 should not be used
- Medium sized headings generally look best with a font weight between 500-600
- Adjust values fluidly by using CSS [`clamp()`](https://developer.mozilla.org/en-US/docs/Web/CSS/clamp), e.g. `clamp(48px, 5vw, 72px)` for the `font-size` of a heading
- Where available, tabular figures should be applied with `font-variant-numeric: tabular-nums`, particularly in tables or when layout shifts are undesirable, like in timers
- Prevent text resizing unexpectedly in landscape mode on iOS with `-webkit-text-size-adjust: 100%`


## Motion

- Switching themes should not trigger transitions and animations on elements [^1]
- Animation duration should not be more than 200ms for interactions to feel immediate
- Animation values should be proportional to the trigger size:
  - Don't animate dialog scale in from 0 → 1, fade opacity and scale from ~0.8
  - Don't scale buttons on press from 1 → 0.8, but ~0.96, ~0.9, or so
- Actions that are frequent and low in novelty should avoid extraneous animations: [^2]
  - Opening a right click menu
  - Deleting or adding items from a list
  - Hovering trivial buttons
- Looping animations should pause when not visible on the screen to offload CPU and GPU usage
- Use `scroll-behavior: smooth` for navigating to in-page anchors, with an appropriate offset

## Touch

- Hover states should not be visible on touch press, use `@media (hover: hover)` [^3]
- Font size for inputs should not be smaller than 16px to prevent iOS zooming on focus
- Inputs should not auto focus on touch devices as it will open the keyboard and cover the screen
- Apply `muted` and `playsinline` to `<video />` tags to auto play on iOS
- Disable `touch-action` for custom components that implement pan and zoom gestures to prevent interference from native behavior like zooming and scrolling
- Disable the default iOS tap highlight with `-webkit-tap-highlight-color: rgba(0,0,0,0)`, but always replace it with an appropriate alternative

## Optimizations

- Large `blur()` values for `filter` and `backdrop-filter` may be slow
- Scaling and blurring filled rectangles will cause banding, use radial gradients instead
- Sparingly enable GPU rendering with `transform: translateZ(0)` for unperformant animations
- Toggle `will-change` on unperformant scroll animations for the duration of the animation [^4]
- Auto-playing too many videos on iOS will choke the device, pause or even unmount off-screen videos
- Bypass React's render lifecycle with refs for real-time values that can commit to the DOM directly [^5]
- [Detect and adapt](https://github.com/GoogleChromeLabs/react-adaptive-hooks) to the hardware and network capabilities of the user's device

## Accessibility

- Disabled buttons should not have tooltips, they are not accessible [^6]
- Focusable elements in a sequential list should be navigable with <kbd>↑</kbd> <kbd>↓</kbd>
- Focusable elements in a sequential list should be deletable with <kbd>⌘</kbd> <kbd>Backspace</kbd>
- To open immediately on press, dropdown menus should trigger on `mousedown`, not `click`
- Use a svg favicon with a style tag that adheres to the system theme based on `prefers-color-scheme`
- Icon only interactive elements should define an explicit `aria-label`
- Tooltips triggered by hover should not contain interactive content
- Images should always be rendered with `<img>` for screen readers and ease of copying from the right click menu
- Illustrations built with HTML should have an explicit `aria-label` instead of announcing the raw DOM tree to people using screen readers
- Gradient text should unset the gradient on `::selection` state
- When using nested menus, use a "prediction cone" to prevent the pointer from accidentally closing the menu when moving across other elements.


## Design

- Optimistically update data locally and roll back on server error with feedback
- Authentication redirects should happen on the server before the client loads to avoid janky URL changes
- Style the document selection state with `::selection`
- Display feedback relative to its trigger:
  - Show a temporary inline checkmark on a successful copy, not a notification
  - Highlight the relevant input(s) on form error(s)
- Empty states should prompt to create a new item, with optional templates

[^1]: Switching between dark mode or light mode will trigger transitions on elements that are meant for explicit interactions like hover. We can [disable transitions temporarily](https://paco.me/writing/disable-theme-transitions) to prevent this. For Next.js, use [next-themes](https://github.com/pacocoursey/next-themes) which prevents transitions out of the box.
[^2]: This is a matter of taste but some interactions just feel better with no motion. For example, the native macOS right click menu only animates out, not in, due to the frequent usage of it.
[^3]: Most touch devices on press will temporarily flash the hover state, unless explicitly only defined for pointer devices with [`@media (hover: hover)`](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/hover).
[^4]: Use [`will-change`](https://developer.mozilla.org/en-US/docs/Web/CSS/will-change) as a last resort to improve performance. Pre-emptively throwing it on elements for better performance may have the opposite effect.
[^5]: This might be controversial but sometimes it can be beneficial to manipulate the DOM directly. For example, instead of relying on React re-rendering on every wheel event, we can track the delta in a ref and update relevant elements directly in the callback.
[^6]: Disabled buttons do not appear in tab order in the DOM so the tooltip will never be announced for keyboard users and they won't know why the button is disabled.
[^7]: As of 2023, Safari will not take the border radius of an element into account when defining custom outline styles. [Safari 16.4](https://developer.apple.com/documentation/safari-release-notes/safari-16_4-release-notes) has added support for `outline` following the curve of border radius. However, keep in mind that not everyone updates their OS immediately.


================================================
FILE: .claude/plugins/n8n/skills/linear-issue/SKILL.md
================================================
---
name: n8n: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.
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. Check for Private/Security Issues (MANDATORY — do this before anything else)

After fetching the issue, immediately check its labels:

1. Look at the labels returned with the issue.
2. If any label is **`n8n-private`**:
   a. Run `git remote -v` (via Bash) to list all configured remotes.
   b. If **any** remote URL contains `n8n-io/n8n` without the `-private` suffix (i.e. matches the public repo), **stop immediately** and tell the user:

   > **This issue is marked `n8n-private` and must be developed in a clean clone of the private repository.**
   >
   > One or more of your remotes point to the **public** `n8n-io/n8n` repo. Mixed remotes are not allowed — you must work in a **separate local clone** of `n8n-io/n8n-private` with no references to the public repo.
   > For the full process, see: https://www.notion.so/n8n/Processing-critical-high-security-bugs-vulnerabilities-in-private-2f45b6e0c94f803da806f472111fb1a5

   Do **not** continue with any further steps — return after showing this message.

3. If the label is not present, or all remotes point exclusively to `n8n-io/n8n-private`, continue normally.

### 3. 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

### 4. 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

### 5. 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 3)
- Clarifications or updates to the original issue description

### 6. 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** — first check for a Flaky assessment (see below), otherwise use the popularity file:

   **Primary: Check for Flaky's assessment in Linear comments.** Flaky is an auto-triage agent that posts issue analysis as a comment. Search the comments already fetched in Step 1 for a comment from a user named "Flaky" (or containing "Flaky" in the author name) — do not re-fetch comments. If found, extract the popularity score and level directly from Flaky's analysis and use those values.

   **Fallback (if no Flaky comment exists):** 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, and note whether it came from Flaky or the popularity file.

3. If the node is **not found** in the popularity file (and no Flaky comment exists), note that it may be a community node or a very new/niche node.

### 7. Assess Effort/Complexity

**Primary: Check for Flaky's effort estimate in Linear comments.** Search the comments already fetched in Step 1 for a Flaky comment — do not re-fetch. If found, extract the effort/complexity estimate directly from it and use that as your assessment.

**Fallback (if no Flaky comment exists):** 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. Note whether it came from Flaky or your own assessment.

### 8. 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/plugins/n8n/skills/loom-transcript/SKILL.md
================================================
---
name: n8n: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/plugins/n8n/skills/node-add-oauth/SKILL.md
================================================
---
name: n8n: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/plugins/n8n/skills/protect-endpoints/SKILL.md
================================================
---
name: n8n:protect-endpoints
description: Applies n8n's RBAC scope decorators to REST endpoints. Use when creating a new @RestController, adding any @Get/@Post/@Put/@Patch/@Delete route to an existing controller, or reviewing endpoint authorization. Every authenticated endpoint must be gated by @ProjectScope or @GlobalScope.
---

# Protect REST endpoints with RBAC

**Rule:** every authenticated route on a `@RestController` MUST carry an access-scope decorator. If you add a route without one, the IDOR/permission bypass is on you.

## Decision

```
URL has :projectId  → @ProjectScope('<resource>:<op>')
URL has no project  → @GlobalScope('<resource>:<op>')
skipAuth: true      → no decorator + comment explaining alternate auth
```

`@ProjectScope` succeeds if the user has the scope **globally OR in the project named in the URL**. `@GlobalScope` ignores project relations entirely.

Both decorators come from `@n8n/decorators`. The middleware lives in `packages/cli/src/controller.registry.ts` (`createScopedMiddleware`) and resolves access via `userHasScopes` in `packages/cli/src/permissions.ee/check-access.ts`.

## Apply the decorator

```ts
import { Get, Post, ProjectScope, RestController } from '@n8n/decorators';

@RestController('/projects/:projectId/widgets')
export class WidgetsController {
  @Post('/')
  @ProjectScope('widget:create')          // create
  async create(...) { ... }

  @Get('/:widgetId')
  @ProjectScope('widget:read')            // read one
  async get(...) { ... }

  @Get('/')
  @ProjectScope('widget:list')            // list
  async list(...) { ... }

  @Patch('/:widgetId')
  @ProjectScope('widget:update')          // update
  async update(...) { ... }

  @Delete('/:widgetId')
  @ProjectScope('widget:delete')          // delete
  async delete(...) { ... }
}
```

Conventions:
- One decorator per route, placed directly under the HTTP-method decorator.
- Use the most specific scope that fits. Reuse `*:update` for state-changing actions like `publish`/`unpublish`/`build` unless the resource needs to gate them separately (see `workflow:publish` for the precedent).
- Routes without `:projectId` and not global-only operations are usually a design smell — flag it.

## When the scope doesn't exist yet

Add the resource and ops in `packages/@n8n/permissions/`:

1. **`src/constants.ee.ts`** — add to `RESOURCES` (alphabetical):
   ```ts
   widget: [...DEFAULT_OPERATIONS, 'execute'] as const,
   ```
   The `Scope` union (`<resource>:<op>` template-literal type) auto-derives.
2. **`src/scope-information.ts`** — add a display name + description per scope.
3. **`src/roles/scopes/project-scopes.ee.ts`** — add to project roles. Match the `workflow` precedent unless product says otherwise:
   - `REGULAR_PROJECT_ADMIN_SCOPES`, `PERSONAL_PROJECT_OWNER_SCOPES`, `PROJECT_EDITOR_SCOPES` → all CRUDL+execute scopes.
   - `PROJECT_VIEWER_SCOPES` → read/list/execute only.
   - `PROJECT_CHAT_USER_SCOPES` → execute only (if applicable).
4. **`src/roles/scopes/global-scopes.ee.ts`** — add to `GLOBAL_OWNER_SCOPES` (admin inherits via `concat()`). Do **not** add to member/chat-user globals — they get scopes via project relations.
5. **Personal-space publishing**: if you add a `<resource>:publish` scope, also append it to `PERSONAL_SPACE_PUBLISHING_SETTING.scopes` in `constants.ee.ts` so personal-owner gating matches `workflow:publish`.
6. **Frontend wiring** — three files in the editor; skipping any of them means the new scopes will not appear in the project-role configuration UI:
   - `packages/frontend/editor-ui/src/app/stores/rbac.store.ts` — add `<resource>: {}` to `scopesByResourceId` (typecheck will fail otherwise).
   - `packages/frontend/editor-ui/src/features/project-roles/projectRoleScopes.ts` — add the resource to `UI_OPERATIONS` (operations to render in the permissions matrix, in display order) **and** to `SCOPE_TYPES` (the order the resource group appears on the page).
   - `packages/frontend/@n8n/i18n/src/locales/en.json` — add `projectRoles.<resource>:<op>` (column label) and `projectRoles.<resource>:<op>.tooltip` (hover description) for every op, plus `projectRoles.type.<resource>` (the group header).
7. **Snapshot** — update `packages/@n8n/permissions/src/__tests__/__snapshots__/scope-information.test.ts.snap` to include the new `<resource>:*` entries.

No DB migration needed — `AuthRolesService.init()` syncs scopes/roles on every startup. Custom team roles created in the UI are **not** auto-updated; mention this in the PR description.

## Public / unauthenticated routes

`{ skipAuth: true }` skips the auth middleware → `req.user` is undefined → adding `@ProjectScope` would 401 every call. Public routes (third-party webhooks, signed callbacks) must:

1. **Omit the scope decorator.**
2. Authenticate via signature/HMAC verification inside the handler (or another route-specific mechanism).
3. Carry a comment explaining why no scope is applied, so the next reviewer doesn't try to "fix" it.

Example:
```ts
// Third-party webhook callback: do not add @ProjectScope. Auth happens
// via per-platform signature verification inside webhookHandler, and
// :projectId is unused in the (agentId, platform) lookup.
@Post('/:agentId/webhooks/:platform', { skipAuth: true, allowBots: true })
async handleWebhook(...) { ... }
```

## Verify with a route-metadata test

Add a regression test that fails when a future route is added without a scope. Iterate every route on the controller via `ControllerRegistryMetadata` and assert the gate.

```ts
import { ControllerRegistryMetadata } from '@n8n/decorators';
import { Container } from '@n8n/di';
import { WidgetsController } from '../widgets.controller';

const UNAUTHENTICATED_HANDLERS = new Set<string>(); // add public handler names here

const metadata = Container.get(ControllerRegistryMetadata).getControllerMetadata(
  WidgetsController as never,
);
const routeCases = Array.from(metadata.routes.entries()).map(([handlerName, route]) => ({
  handlerName, route,
}));

describe('WidgetsController route access scopes', () => {
  it.each(routeCases)(
    '$handlerName is gated by a project-scoped widget:* check',
    ({ handlerName, route }) => {
      if (UNAUTHENTICATED_HANDLERS.has(handlerName)) {
        expect(route.accessScope).toBeUndefined();
        expect(route.skipAuth).toBe(true);
        return;
      }
      expect(route.accessScope).toBeDefined();
      expect(route.accessScope?.globalOnly).toBe(false);
      expect(route.accessScope?.scope.startsWith('widget:')).toBe(true);
    },
  );
});
```

## Defense in depth (still required)

Decorator alone is not enough when handlers leak data via downstream calls. Service/repository methods should still **filter by `projectId`** (or user-scoped helpers like `findByUser`). The decorator gates *who can call this URL*; the service gates *what they can read*. Both, always.

## Reference patterns

- Project-scoped CRUD: `packages/cli/src/workflows/workflows.controller.ts`, `packages/cli/src/credentials/credentials.controller.ts`, `packages/cli/src/modules/data-table/data-table.controller.ts`.
- Mixed global + project: `packages/cli/src/controllers/project.controller.ts`.


================================================
FILE: .claude/plugins/n8n/skills/reproduce-bug/SKILL.md
================================================
---
name: n8n: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.
---

# 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/plugins/n8n/skills/setup-mcps/SKILL.md
================================================
---
name: n8n:setup-mcps
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/plugins/n8n/skills/spec-driven-development/SKILL.md
================================================
---
name: n8n: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: .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/*)"
		]
	},
	"hooks": {
		"PostToolUse": [
			{
				"matcher": "Skill",
				"hooks": [
					{
						"type": "command",
						"command": "node .claude/plugins/n8n/scripts/track-skill-usage.mjs",
						"timeout": 10,
						"async": true
					}
				]
			}
		]
	},
	"extraKnownMarketplaces": {
		"n8n": {
			"source": {
				"source": "directory",
				"path": "./.claude/plugins/n8n"
			}
		}
	},
	"enabledPlugins": {
		"n8n@n8n": true
	}
}


================================================
FILE: .code-health-baseline.json
================================================
{
	"version": 1,
	"generated": "2026-04-23T08:42:21.615Z",
	"totalViolations": 102,
	"violations": {
		"packages/@n8n/agents/package.json": [
			{
				"rule": "catalog-violations",
				"line": 40,
				"message": "langsmith@>=0.3.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "193bb785d0b4"
			},
			{
				"rule": "catalog-violations",
				"line": 27,
				"message": "@ai-sdk/anthropic appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "b58f03d0d5c1"
			},
			{
				"rule": "catalog-violations",
				"line": 41,
				"message": "@opentelemetry/sdk-trace-node appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "a77ced903cdf"
			}
		],
		"packages/@n8n/ai-workflow-builder.ee/package.json": [
			{
				"rule": "catalog-violations",
				"line": 72,
				"message": "langsmith@^0.4.6 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "6ee5e003d795"
			},
			{
				"rule": "catalog-violations",
				"line": 61,
				"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "d2120f012c93"
			},
			{
				"rule": "catalog-violations",
				"line": 70,
				"message": "jsdom appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "9c770d66baf2"
			},
			{
				"rule": "catalog-violations",
				"line": 76,
				"message": "turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "85c311d87491"
			},
			{
				"rule": "catalog-violations",
				"line": 82,
				"message": "@types/turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "407c8d1b3428"
			}
		],
		"packages/@n8n/cli/package.json": [
			{
				"rule": "catalog-violations",
				"line": 79,
				"message": "@types/node@24.10.1 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "a5a872807ede"
			},
			{
				"rule": "catalog-violations",
				"line": 74,
				"message": "@oclif/core appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "733c3960022e"
			}
		],
		"packages/@n8n/eslint-config/package.json": [
			{
				"rule": "catalog-violations",
				"line": 56,
				"message": "eslint@>= 9 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "82841e89293f"
			}
		],
		"packages/@n8n/eslint-plugin-community-nodes/package.json": [
			{
				"rule": "catalog-violations",
				"line": 46,
				"message": "eslint@>= 9 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "46d3130cf108"
			},
			{
				"rule": "catalog-violations",
				"line": 47,
				"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "589f90baeece"
			}
		],
		"packages/@n8n/json-schema-to-zod/package.json": [
			{
				"rule": "catalog-violations",
				"line": 63,
				"message": "zod@^3.0.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "436de7cbc5ea"
			}
		],
		"packages/@n8n/node-cli/package.json": [
			{
				"rule": "catalog-violations",
				"line": 76,
				"message": "eslint@>= 9 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "1b5deae544ea"
			},
			{
				"rule": "catalog-violations",
				"line": 52,
				"message": "change-case appears in 5 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "da74ed210d07"
			},
			{
				"rule": "catalog-violations",
				"line": 51,
				"message": "@oclif/core appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "9711a9b00bf9"
			},
			{
				"rule": "catalog-violations",
				"line": 55,
				"message": "eslint-plugin-n8n-nodes-base appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "6a9e12780943"
			},
			{
				"rule": "catalog-violations",
				"line": 59,
				"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "d536f5a9c3f8"
			}
		],
		"packages/@n8n/nodes-langchain/package.json": [
			{
				"rule": "catalog-violations",
				"line": 289,
				"message": "openai@^6.9.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "b9b214e61fdc"
			},
			{
				"rule": "catalog-violations",
				"line": 299,
				"message": "zod-to-json-schema@3.23.3 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "081b5d0b5ca5"
			},
			{
				"rule": "catalog-violations",
				"line": 296,
				"message": "tmp-promise appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "88d67e2ef747"
			},
			{
				"rule": "catalog-violations",
				"line": 254,
				"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "69d6fa7e46f9"
			},
			{
				"rule": "catalog-violations",
				"line": 270,
				"message": "cheerio appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "8cd029bb871e"
			},
			{
				"rule": "catalog-violations",
				"line": 280,
				"message": "jsdom appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "26f20ebea4b1"
			},
			{
				"rule": "catalog-violations",
				"line": 286,
				"message": "mongodb appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "46cb48884e22"
			},
			{
				"rule": "catalog-violations",
				"line": 290,
				"message": "pdf-parse appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "0c7d44a9c2e4"
			}
		],
		"packages/testing/janitor/package.json": [
			{
				"rule": "catalog-violations",
				"line": 39,
				"message": "ts-morph@>=20.0.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "4a2907301983"
			}
		],
		"packages/frontend/@n8n/chat/package.json": [
			{
				"rule": "catalog-violations",
				"line": 56,
				"message": "unplugin-icons@^0.19.0 should use \"catalog:frontend\" (exists in pnpm-workspace.yaml [frontend])",
				"hash": "a0d24d761026"
			},
			{
				"rule": "catalog-violations",
				"line": 59,
				"message": "vite-plugin-dts@^4.5.3 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "37ac4b34bc06"
			}
		],
		"packages/frontend/@n8n/design-system/package.json": [
			{
				"rule": "catalog-violations",
				"line": 73,
				"message": "@vueuse/core@* should use \"catalog:frontend\" (exists in pnpm-workspace.yaml [frontend])",
				"hash": "237e9d17c4ba"
			}
		],
		"packages/frontend/@n8n/storybook/package.json": [
			{
				"rule": "catalog-violations",
				"line": 31,
				"message": "@types/node@^24.10.1 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "50fb70481f8f"
			}
		],
		"packages/@n8n/node-cli/src/template/templates/declarative/custom/template/package.json": [
			{
				"rule": "catalog-violations",
				"line": 40,
				"message": "eslint@9.32.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "c55e0c75d586"
			},
			{
				"rule": "catalog-violations",
				"line": 43,
				"message": "typescript@5.9.2 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "999c932ac3ae"
			},
			{
				"rule": "catalog-violations",
				"line": 46,
				"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "2f772d0b5a09"
			},
			{
				"rule": "catalog-violations",
				"line": 41,
				"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "6ded3ee6fafe"
			}
		],
		"packages/@n8n/node-cli/src/template/templates/declarative/github-issues/template/package.json": [
			{
				"rule": "catalog-violations",
				"line": 43,
				"message": "eslint@9.32.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "c3815ab2677d"
			},
			{
				"rule": "catalog-violations",
				"line": 46,
				"message": "typescript@5.9.2 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "11608ee90ba9"
			},
			{
				"rule": "catalog-violations",
				"line": 49,
				"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "4514689aef5c"
			},
			{
				"rule": "catalog-violations",
				"line": 44,
				"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "ce8e04a67c4c"
			}
		],
		"packages/@n8n/node-cli/src/template/templates/programmatic/example/template/package.json": [
			{
				"rule": "catalog-violations",
				"line": 40,
				"message": "eslint@9.32.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "cd90d70b3ce4"
			},
			{
				"rule": "catalog-violations",
				"line": 43,
				"message": "typescript@5.9.2 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "d0998542352d"
			},
			{
				"rule": "catalog-violations",
				"line": 46,
				"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "fd2577d9c87b"
			},
			{
				"rule": "catalog-violations",
				"line": 41,
				"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "a931f101c8a0"
			}
		],
		"packages/@n8n/node-cli/src/template/templates/programmatic/ai/memory-custom/template/package.json": [
			{
				"rule": "catalog-violations",
				"line": 41,
				"message": "eslint@9.32.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "298daa052478"
			},
			{
				"rule": "catalog-violations",
				"line": 44,
				"message": "typescript@5.9.2 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "9d70bb26b233"
			},
			{
				"rule": "catalog-violations",
				"line": 47,
				"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "42aefb6c9989"
			},
			{
				"rule": "catalog-violations",
				"line": 42,
				"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "cf4f2ca88b59"
			}
		],
		"packages/@n8n/node-cli/src/template/templates/programmatic/ai/model-ai-custom/template/package.json": [
			{
				"rule": "catalog-violations",
				"line": 43,
				"message": "eslint@9.32.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "3c8b4977fd8a"
			},
			{
				"rule": "catalog-violations",
				"line": 46,
				"message": "typescript@5.9.2 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "9d31f8f7537c"
			},
			{
				"rule": "catalog-violations",
				"line": 49,
				"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "e1734c74601d"
			},
			{
				"rule": "catalog-violations",
				"line": 44,
				"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "2a2dea670608"
			}
		],
		"packages/@n8n/node-cli/src/template/templates/programmatic/ai/model-ai-custom-example/template/package.json": [
			{
				"rule": "catalog-violations",
				"line": 43,
				"message": "eslint@9.32.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "91ea1dbe7d4e"
			},
			{
				"rule": "catalog-violations",
				"line": 46,
				"message": "typescript@5.9.2 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "72d08eab5625"
			},
			{
				"rule": "catalog-violations",
				"line": 49,
				"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "91b58c718e73"
			},
			{
				"rule": "catalog-violations",
				"line": 44,
				"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "83b610ec607a"
			}
		],
		"packages/@n8n/node-cli/src/template/templates/programmatic/ai/model-openai-compatible/template/package.json": [
			{
				"rule": "catalog-violations",
				"line": 43,
				"message": "eslint@9.32.0 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "082bc9c01097"
			},
			{
				"rule": "catalog-violations",
				"line": 46,
				"message": "typescript@5.9.2 should use \"catalog:\" (exists in pnpm-workspace.yaml)",
				"hash": "1b9d2910ce91"
			},
			{
				"rule": "catalog-violations",
				"line": 49,
				"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "6b5e714159dc"
			},
			{
				"rule": "catalog-violations",
				"line": 44,
				"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "ba672d26d64d"
			}
		],
		"packages/cli/package.json": [
			{
				"rule": "catalog-violations",
				"line": 97,
				"message": "@ai-sdk/anthropic appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "1e3686e1923b"
			},
			{
				"rule": "catalog-violations",
				"line": 132,
				"message": "@opentelemetry/sdk-trace-node appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "a3dad0b8dc21"
			},
			{
				"rule": "catalog-violations",
				"line": 142,
				"message": "change-case appears in 5 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "949e802528f7"
			},
			{
				"rule": "catalog-violations",
				"line": 193,
				"message": "semver appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "5b7e9b03fb10"
			},
			{
				"rule": "catalog-violations",
				"line": 200,
				"message": "undici appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "91c29775e961"
			},
			{
				"rule": "catalog-violations",
				"line": 203,
				"message": "ws appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "cd07242e8163"
			}
		],
		"packages/@n8n/instance-ai/package.json": [
			{
				"rule": "catalog-violations",
				"line": 56,
				"message": "@ai-sdk/anthropic appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "5b2153508e47"
			},
			{
				"rule": "catalog-violations",
				"line": 37,
				"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "8fa6b9a8fc91"
			},
			{
				"rule": "catalog-violations",
				"line": 47,
				"message": "turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "9a9d97065952"
			},
			{
				"rule": "catalog-violations",
				"line": 59,
				"message": "@types/turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "12e346c47b39"
			},
			{
				"rule": "catalog-violations",
				"line": 31,
				"message": "@joplin/turndown-plugin-gfm appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "a3cf1504b5c2"
			},
			{
				"rule": "catalog-violations",
				"line": 46,
				"message": "pdf-parse appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "283fa9114c03"
			}
		],
		"packages/node-dev/package.json": [
			{
				"rule": "catalog-violations",
				"line": 47,
				"message": "change-case appears in 5 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "6988b9f58c92"
			},
			{
				"rule": "catalog-violations",
				"line": 46,
				"message": "@oclif/core appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "da9b64834300"
			},
			{
				"rule": "catalog-violations",
				"line": 53,
				"message": "tmp-promise appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "632a744e397e"
			}
		],
		"packages/nodes-base/package.json": [
			{
				"rule": "catalog-violations",
				"line": 908,
				"message": "change-case appears in 5 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "2d1fab7a5b05"
			},
			{
				"rule": "catalog-violations",
				"line": 958,
				"message": "semver appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "2daf37aa14e4"
			},
			{
				"rule": "catalog-violations",
				"line": 963,
				"message": "tmp-promise appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "3f93c404ae9c"
			},
			{
				"rule": "catalog-violations",
				"line": 897,
				"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "ca4ac788adc6"
			},
			{
				"rule": "catalog-violations",
				"line": 909,
				"message": "cheerio appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "1a1b5bbc50c9"
			},
			{
				"rule": "catalog-violations",
				"line": 914,
				"message": "eventsource appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "9795e6c6d9e9"
			},
			{
				"rule": "catalog-violations",
				"line": 927,
				"message": "jsdom appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "02341f2b5e3e"
			},
			{
				"rule": "catalog-violations",
				"line": 938,
				"message": "mongodb appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "f688907d087a"
			},
			{
				"rule": "catalog-violations",
				"line": 889,
				"message": "eslint-plugin-n8n-nodes-base appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "ac254baa61f9"
			}
		],
		"packages/frontend/editor-ui/package.json": [
			{
				"rule": "catalog-violations",
				"line": 69,
				"message": "change-case appears in 5 packages with 3 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "bd9a2eeb072b"
			},
			{
				"rule": "catalog-violations",
				"line": 92,
				"message": "semver appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "d8c606e42c92"
			},
			{
				"rule": "catalog-violations",
				"line": 90,
				"message": "prettier appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "8a66e00b94fa"
			}
		],
		"packages/@n8n/scan-community-package/package.json": [
			{
				"rule": "catalog-violations",
				"line": 15,
				"message": "semver appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "ac0e4301d694"
			}
		],
		"packages/@n8n/ai-utilities/package.json": [
			{
				"rule": "catalog-violations",
				"line": 57,
				"message": "undici appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "c14cd05614e8"
			},
			{
				"rule": "catalog-violations",
				"line": 53,
				"message": "tmp-promise appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "884a45bdbcf2"
			},
			{
				"rule": "catalog-violations",
				"line": 60,
				"message": "n8n-workflow appears in 9 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "717de3a58c50"
			}
		],
		"packages/@n8n/mcp-browser/package.json": [
			{
				"rule": "catalog-violations",
				"line": 37,
				"message": "ws appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "9650c1b55f3c"
			},
			{
				"rule": "catalog-violations",
				"line": 31,
				"message": "@mozilla/readability appears in 5 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "0c97891a24f4"
			},
			{
				"rule": "catalog-violations",
				"line": 32,
				"message": "jsdom appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "8466b03b1044"
			},
			{
				"rule": "catalog-violations",
				"line": 36,
				"message": "turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "f23a9d3d7aa2"
			},
			{
				"rule": "catalog-violations",
				"line": 44,
				"message": "@types/turndown appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "3f9e46e56803"
			},
			{
				"rule": "catalog-violations",
				"line": 29,
				"message": "@joplin/turndown-plugin-gfm appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "743e3a7dbb32"
			}
		],
		"packages/@n8n/task-runner/package.json": [
			{
				"rule": "catalog-violations",
				"line": 50,
				"message": "ws appears in 3 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "51cb5069f382"
			}
		],
		"packages/@n8n/benchmark/package.json": [
			{
				"rule": "catalog-violations",
				"line": 36,
				"message": "@oclif/core appears in 4 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "67f9d81d9528"
			}
		],
		"packages/@n8n/computer-use/package.json": [
			{
				"rule": "catalog-violations",
				"line": 44,
				"message": "eventsource appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "f50c1eee2ed6"
			}
		],
		"packages/@n8n/stylelint-config/package.json": [
			{
				"rule": "catalog-violations",
				"line": 29,
				"message": "stylelint appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "955f3fe044c7"
			},
			{
				"rule": "catalog-violations",
				"line": 45,
				"message": "stylelint appears in 2 packages with 2 different versions — add to pnpm-workspace.yaml catalog",
				"hash": "955f3fe044c7"
			}
		]
	}
}


================================================
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/qa-dx
.github/scripts @n8n-io/qa-dx
.github/actions @n8n-io/qa-dx
.github/poutine-rules @n8n-io/qa-dx



================================================
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-vm-expressions      │                     │
│                  │  └─ 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-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

test-e2e-vm-expressions-nightly.yml
    └──────────────────────────▶  test-e2e-reusable.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 04:00               | `test-e2e-vm-expressions-nightly.yml`| VM expression E2E     |
| 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-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`
- 
Download .txt
Showing preview only (1,376K chars total). Download the full file or copy to clipboard to get everything.
gitextract_1o9k1ghr/

├── .actrc
├── .claude/
│   ├── README.md
│   ├── plugins/
│   │   └── n8n/
│   │       ├── .claude-plugin/
│   │       │   ├── marketplace.json
│   │       │   └── plugin.json
│   │       ├── README.md
│   │       ├── agents/
│   │       │   ├── developer.md
│   │       │   └── linear-issue-triager.md
│   │       ├── commands/
│   │       │   ├── plan.md
│   │       │   └── triage.md
│   │       ├── scripts/
│   │       │   └── track-skill-usage.mjs
│   │       └── skills/
│   │           ├── community-pr-review/
│   │           │   └── SKILL.md
│   │           ├── content-design/
│   │           │   └── SKILL.md
│   │           ├── conventions/
│   │           │   └── SKILL.md
│   │           ├── create-community-node-lint-rule/
│   │           │   ├── SKILL.md
│   │           │   └── reference.md
│   │           ├── create-issue/
│   │           │   └── SKILL.md
│   │           ├── create-pr/
│   │           │   └── SKILL.md
│   │           ├── create-skill/
│   │           │   └── SKILL.md
│   │           ├── design-system/
│   │           │   ├── SKILL.md
│   │           │   └── rules/
│   │           │       ├── web-animation-guidelines.md
│   │           │       └── web-interface-guidelines.md
│   │           ├── linear-issue/
│   │           │   └── SKILL.md
│   │           ├── loom-transcript/
│   │           │   └── SKILL.md
│   │           ├── node-add-oauth/
│   │           │   └── SKILL.md
│   │           ├── protect-endpoints/
│   │           │   └── SKILL.md
│   │           ├── reproduce-bug/
│   │           │   └── SKILL.md
│   │           ├── setup-mcps/
│   │           │   └── SKILL.md
│   │           └── spec-driven-development/
│   │               └── SKILL.md
│   └── settings.json
├── .code-health-baseline.json
├── .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/
│   │   ├── build-n8n-docker/
│   │   │   └── action.yml
│   │   ├── ci-filter/
│   │   │   ├── __tests__/
│   │   │   │   └── ci-filter.test.ts
│   │   │   ├── action.yml
│   │   │   └── ci-filter.mjs
│   │   ├── docker-registry-login/
│   │   │   └── action.yml
│   │   ├── load-n8n-docker/
│   │   │   └── 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
│   │   ├── bump-versions.test.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
│   │   ├── pnpm-utils.mjs
│   │   ├── populate-cloud-databases.mjs
│   │   ├── post-qa-metrics-comment.mjs
│   │   ├── promote-github-release.mjs
│   │   ├── quality/
│   │   │   ├── check-ownership-checkbox.mjs
│   │   │   ├── check-ownership-checkbox.test.mjs
│   │   │   ├── check-pr-size.mjs
│   │   │   ├── check-pr-size.test.mjs
│   │   │   └── handle-size-override.mjs
│   │   ├── retry.mjs
│   │   ├── send-build-stats.mjs
│   │   ├── send-docker-stats.mjs
│   │   ├── send-metrics.mjs
│   │   ├── send-version-release-notification.mjs
│   │   ├── set-latest-for-monorepo-packages.mjs
│   │   ├── trim-fe-packageJson.js
│   │   └── update-changelog.mjs
│   ├── test-metrics/
│   │   ├── playwright.json
│   │   └── quarantine.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-pr-quality.yml
│       ├── ci-pull-request-review.yml
│       ├── ci-pull-requests.yml
│       ├── ci-python.yml
│       ├── ci-restrict-private-merges.yml
│       ├── docker-build-push.yml
│       ├── docker-build-smoke.yml
│       ├── prepare-docker-reusable.yml
│       ├── release-build-daytona-snapshot.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-set-stable-npm-packages-to-latest.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-dev-server-smoke-reusable.yml
│       ├── test-e2e-coverage-weekly.yml
│       ├── test-e2e-helm.yml
│       ├── test-e2e-infrastructure-reusable.yml
│       ├── test-e2e-performance-reusable.yml
│       ├── test-e2e-reusable.yml
│       ├── test-e2e-vm-expressions-nightly.yml
│       ├── test-evals-ai-release.yml
│       ├── test-evals-ai-reusable.yml
│       ├── test-evals-ai.yml
│       ├── test-evals-instance-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-qa-metrics-comment-reusable.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
│   │   │   │   │   ├── from-json-config.test.ts
│   │   │   │   │   ├── inmemory-working-memory.test.ts
│   │   │   │   │   ├── integration/
│   │   │   │   │   │   ├── agent-runtime-conversion.test.ts
│   │   │   │   │   │   ├── 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
│   │   │   │   │   │   ├── interim-user-message-during-suspend.test.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-call-upsert.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
│   │   │   │   │   ├── message-list.test.ts
│   │   │   │   │   ├── message.test.ts
│   │   │   │   │   ├── model-factory.test.ts
│   │   │   │   │   ├── parse.test.ts
│   │   │   │   │   ├── sqlite-memory.test.ts
│   │   │   │   │   ├── strip-orphaned-tool-messages.test.ts
│   │   │   │   │   ├── telemetry.test.ts
│   │   │   │   │   ├── title-generation.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
│   │   │   │   │   ├── provider-credentials.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-capabilities.ts
│   │   │   │   │   ├── provider-tools.ts
│   │   │   │   │   ├── telemetry.ts
│   │   │   │   │   ├── tool.ts
│   │   │   │   │   └── verify.ts
│   │   │   │   ├── storage/
│   │   │   │   │   ├── base-memory.ts
│   │   │   │   │   ├── postgres-memory.ts
│   │   │   │   │   └── sqlite-memory.ts
│   │   │   │   ├── types/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── runtime/
│   │   │   │   │   │   ├── event.ts
│   │   │   │   │   │   └── message-list.ts
│   │   │   │   │   ├── sdk/
│   │   │   │   │   │   ├── agent-builder.ts
│   │   │   │   │   │   ├── agent.ts
│   │   │   │   │   │   ├── credential-provider.ts
│   │   │   │   │   │   ├── eval.ts
│   │   │   │   │   │   ├── guardrail.ts
│   │   │   │   │   │   ├── handler-executor.ts
│   │   │   │   │   │   ├── mcp.ts
│   │   │   │   │   │   ├── memory.ts
│   │   │   │   │   │   ├── message.ts
│   │   │   │   │   │   ├── provider.ts
│   │   │   │   │   │   ├── tool-descriptor.ts
│   │   │   │   │   │   └── tool.ts
│   │   │   │   │   ├── telemetry.ts
│   │   │   │   │   └── utils/
│   │   │   │   │       └── json.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── parse.ts
│   │   │   │   │   └── 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
│   │   │   │   │   ├── 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-code-imports.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
│   │   │   │   │   ├── lifecycle.ts
│   │   │   │   │   ├── logger.ts
│   │   │   │   │   ├── output.ts
│   │   │   │   │   ├── runner.ts
│   │   │   │   │   ├── score-calculator.ts
│   │   │   │   │   └── token-tracking-handler.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/
│   │   │   │   │   │   ├── 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/
│   │   │   │   │   │   │   │   └── index.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
│   │   │   │   │       └── node-recommendations/
│   │   │   │   │           └── index.ts
│   │   │   │   ├── session-manager.service.ts
│   │   │   │   ├── subgraphs/
│   │   │   │   │   ├── discovery.subgraph.ts
│   │   │   │   │   ├── subgraph-interface.ts
│   │   │   │   │   └── test/
│   │   │   │   │       └── integration/
│   │   │   │   │           ├── discovery-subgraph.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/
│   │   │   │   │   │   └── index.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
│   │   │   │   │   ├── 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
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── agent-builder-admin-settings.test.ts
│   │   │   │   │   ├── instance-registry-types.test.ts
│   │   │   │   │   └── proxy-feature.test.ts
│   │   │   │   ├── agent-builder-interactive.ts
│   │   │   │   ├── agent-sse.ts
│   │   │   │   ├── agents.ts
│   │   │   │   ├── api-keys.ts
│   │   │   │   ├── chat-hub.ts
│   │   │   │   ├── community-node-types.ts
│   │   │   │   ├── constants/
│   │   │   │   │   └── proxy-feature.ts
│   │   │   │   ├── datetime.ts
│   │   │   │   ├── dto/
│   │   │   │   │   ├── agents/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── agent-skill.dto.test.ts
│   │   │   │   │   │   ├── agent-build-resume.dto.ts
│   │   │   │   │   │   ├── agent-chat-message.dto.ts
│   │   │   │   │   │   ├── agent-integration.dto.ts
│   │   │   │   │   │   ├── create-agent-skill.dto.ts
│   │   │   │   │   │   ├── create-agent.dto.ts
│   │   │   │   │   │   ├── update-agent-config.dto.ts
│   │   │   │   │   │   ├── update-agent-schedule.dto.ts
│   │   │   │   │   │   ├── update-agent-skill.dto.ts
│   │   │   │   │   │   └── update-agent.dto.ts
│   │   │   │   │   ├── 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-gateway-config-response.dto.ts
│   │   │   │   │   │   ├── ai-gateway-usage-response.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
│   │   │   │   │   │   ├── public-api-create-data-table.dto.ts
│   │   │   │   │   │   ├── rename-data-table-column.dto.ts
│   │   │   │   │   │   ├── update-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
│   │   │   │   │   ├── encryption/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── create-encryption-key.dto.test.ts
│   │   │   │   │   │   │   └── list-encryption-keys-query.dto.test.ts
│   │   │   │   │   │   ├── create-encryption-key.dto.ts
│   │   │   │   │   │   ├── encryption-key-response.dto.ts
│   │   │   │   │   │   └── list-encryption-keys-query.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/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── instance-ai-confirm-request.dto.test.ts
│   │   │   │   │   │   ├── instance-ai-confirm-request.dto.ts
│   │   │   │   │   │   ├── instance-ai-feedback-request.dto.ts
│   │   │   │   │   │   └── instance-ai-rename-thread-request.dto.ts
│   │   │   │   │   ├── instance-version-history/
│   │   │   │   │   │   ├── version-query.dto.ts
│   │   │   │   │   │   └── version-since-date-query.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-mapping-rule.dto.test.ts
│   │   │   │   │   │   │   ├── 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
│   │   │   │   │   │   ├── instance-ai.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
│   │   │   │   │   ├── credential-response.schema.ts
│   │   │   │   │   ├── data-table-filter.schema.ts
│   │   │   │   │   ├── data-table.schema.ts
│   │   │   │   │   ├── dependency-counts.schema.ts
│   │   │   │   │   ├── dependency.schema.ts
│   │   │   │   │   ├── encryption-key.schema.ts
│   │   │   │   │   ├── evaluations.schema.ts
│   │   │   │   │   ├── external-secrets.schema.ts
│   │   │   │   │   ├── favorites.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
│   │   │   └── vite.config.ts
│   │   ├── 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
│   │   │   ├── 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
│   │   │   └── vite.config.ts
│   │   ├── 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
│   │   ├── computer-use/
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── joke.txt
│   │   │   ├── package.json
│   │   │   ├── spec/
│   │   │   │   ├── local-gateway.md
│   │   │   │   └── technical-spec.md
│   │   │   ├── src/
│   │   │   │   ├── __mocks__/
│   │   │   │   │   └── @inquirer/
│   │   │   │   │       └── prompts.ts
│   │   │   │   ├── cli.ts
│   │   │   │   ├── config-templates.test.ts
│   │   │   │   ├── config-templates.ts
│   │   │   │   ├── config.test.ts
│   │   │   │   ├── config.ts
│   │   │   │   ├── confirm-resource-cli.ts
│   │   │   │   ├── gateway-client.test.ts
│   │   │   │   ├── gateway-client.ts
│   │   │   │   ├── gateway-session.test.ts
│   │   │   │   ├── gateway-session.ts
│   │   │   │   ├── logger.test.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── settings-store.test.ts
│   │   │   │   ├── settings-store.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
│   │   ├── config/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── configs/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── ai.config.test.ts
│   │   │   │   │   │   ├── expression-engine.config.test.ts
│   │   │   │   │   │   ├── external-hooks.config.test.ts
│   │   │   │   │   │   ├── ssrf-protection.config.test.ts
│   │   │   │   │   │   └── user-management.config.test.ts
│   │   │   │   │   ├── agents.config.ts
│   │   │   │   │   ├── ai-assistant.config.ts
│   │   │   │   │   ├── ai-builder.config.ts
│   │   │   │   │   ├── ai.config.ts
│   │   │   │   │   ├── auth.config.ts
│   │   │   │   │   ├── cache.config.ts
│   │   │   │   │   ├── chat-hub.config.ts
│   │   │   │   │   ├── chat-trigger.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
│   │   │   │   │   ├── evaluation.config.ts
│   │   │   │   │   ├── event-bus.config.ts
│   │   │   │   │   ├── executions.config.ts
│   │   │   │   │   ├── expression-engine.config.ts
│   │   │   │   │   ├── external-hooks.config.ts
│   │   │   │   │   ├── generic.config.ts
│   │   │   │   │   ├── hiring-banner.config.ts
│   │   │   │   │   ├── http-request.config.ts
│   │   │   │   │   ├── instance-ai.config.ts
│   │   │   │   │   ├── instance-settings-config.ts
│   │   │   │   │   ├── instance-settings-loader.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
│   │   │   │   │   ├── ai-builder-temporary-workflow.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
│   │   │   │   │   ├── deployment-key.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
│   │   │   │   │   │   ├── 1775116241000-CreateTokenExchangeJtiTable.ts
│   │   │   │   │   │   ├── 1775740765000-ChangeWorkflowPublishHistoryVersionIdToSetNull.ts
│   │   │   │   │   │   ├── 1776000000000-CreateTrustedKeyTables.ts
│   │   │   │   │   │   ├── 1776150756000-CreateFavoritesTable.ts
│   │   │   │   │   │   ├── 1777000000000-CreateDeploymentKeyTable.ts
│   │   │   │   │   │   ├── 1777023444000-AddJweKeyIndexesToDeploymentKey.ts
│   │   │   │   │   │   ├── 1777045000000-AddTracingContextToExecution.ts
│   │   │   │   │   │   ├── 1777100000000-AddLangsmithIdsToInstanceAiRunSnapshots.ts
│   │   │   │   │   │   ├── 1777281990043-CreateAiBuilderTemporaryWorkflowTable.ts
│   │   │   │   │   │   ├── 1778000000000-AddExecutionDeduplicationKey.ts
│   │   │   │   │   │   ├── 1783000000000-CreateAgentTables.ts
│   │   │   │   │   │   └── 1783000000001-CreateAgentExecutionTables.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
│   │   │   │   │   │   ├── 1777420800000-ExpandVariablesValueColumnToText.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
│   │   │   │   │   ├── ai-builder-temporary-workflow.repository.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
│   │   │   │   │   ├── deployment-key.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__/
│   │   │   │       │   ├── apply-workflow-boolean-setting-filter.test.ts
│   │   │   │       │   ├── build-workflows-by-nodes-query.test.ts
│   │   │   │       │   └── get-test-run-final-result.ee.test.ts
│   │   │   │       ├── apply-workflow-boolean-setting-filter.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
│   │   │   │   ├── cluster-check/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── cluster-check-metadata.test.ts
│   │   │   │   │   ├── cluster-check-metadata.ts
│   │   │   │   │   ├── cluster-check.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
│   │   ├── engine/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   └── index.ts
│   │   │   ├── tsconfig.build.json
│   │   │   ├── tsconfig.json
│   │   │   └── vitest.config.ts
│   │   ├── errors/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── application.error.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── isolate.error.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
│   │   │   │       ├── cred-class-name-suffix.md
│   │   │   │       ├── cred-class-oauth2-naming.md
│   │   │   │       ├── credential-documentation-url.md
│   │   │   │       ├── credential-password-field.md
│   │   │   │       ├── credential-test-required.md
│   │   │   │       ├── icon-validation.md
│   │   │   │       ├── missing-paired-item.md
│   │   │   │       ├── n8n-object-validation.md
│   │   │   │       ├── no-credential-reuse.md
│   │   │   │       ├── no-deprecated-workflow-functions.md
│   │   │   │       ├── no-forbidden-lifecycle-scripts.md
│   │   │   │       ├── no-http-request-with-manual-auth.md
│   │   │   │       ├── no-overrides-field.md
│   │   │   │       ├── no-restricted-globals.md
│   │   │   │       ├── no-restricted-imports.md
│   │   │   │       ├── no-runtime-dependencies.md
│   │   │   │       ├── no-template-placeholders.md
│   │   │   │       ├── node-class-description-icon-missing.md
│   │   │   │       ├── node-connection-type-literal.md
│   │   │   │       ├── node-operation-error-itemindex.md
│   │   │   │       ├── node-usable-as-tool.md
│   │   │   │       ├── options-sorted-alphabetically.md
│   │   │   │       ├── package-name-convention.md
│   │   │   │       ├── require-community-node-keyword.md
│   │   │   │       ├── require-continue-on-fail.md
│   │   │   │       ├── require-node-api-error.md
│   │   │   │       ├── require-node-description-fields.md
│   │   │   │       ├── resource-operation-pattern.md
│   │   │   │       ├── valid-credential-references.md
│   │   │   │       ├── valid-peer-dependencies.md
│   │   │   │       └── webhook-lifecycle-complete.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
│   │   │   │   │   ├── cred-class-name-suffix.test.ts
│   │   │   │   │   ├── cred-class-name-suffix.ts
│   │   │   │   │   ├── cred-class-oauth2-naming.test.ts
│   │   │   │   │   ├── cred-class-oauth2-naming.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
│   │   │   │   │   ├── missing-paired-item.test.ts
│   │   │   │   │   ├── missing-paired-item.ts
│   │   │   │   │   ├── n8n-object-validation.test.ts
│   │   │   │   │   ├── n8n-object-validation.ts
│   │   │   │   │   ├── no-credential-reuse.test.ts
│   │   │   │   │   ├── no-credential-reuse.ts
│   │   │   │   │   ├── no-deprecated-workflow-functions.test.ts
│   │   │   │   │   ├── no-deprecated-workflow-functions.ts
│   │   │   │   │   ├── no-forbidden-lifecycle-scripts.test.ts
│   │   │   │   │   ├── no-forbidden-lifecycle-scripts.ts
│   │   │   │   │   ├── no-http-request-with-manual-auth.test.ts
│   │   │   │   │   ├── no-http-request-with-manual-auth.ts
│   │   │   │   │   ├── no-overrides-field.test.ts
│   │   │   │   │   ├── no-overrides-field.ts
│   │   │   │   │   ├── no-restricted-globals.test.ts
│   │   │   │   │   ├── no-restricted-globals.ts
│   │   │   │   │   ├── no-restricted-imports.test.ts
│   │   │   │   │   ├── no-restricted-imports.ts
│   │   │   │   │   ├── no-runtime-dependencies.test.ts
│   │   │   │   │   ├── no-runtime-dependencies.ts
│   │   │   │   │   ├── no-template-placeholders.test.ts
│   │   │   │   │   ├── no-template-placeholders.ts
│   │   │   │   │   ├── node-class-description-icon-missing.test.ts
│   │   │   │   │   ├── node-class-description-icon-missing.ts
│   │   │   │   │   ├── node-connection-type-literal.test.ts
│   │   │   │   │   ├── node-connection-type-literal.ts
│   │   │   │   │   ├── node-operation-error-itemindex.test.ts
│   │   │   │   │   ├── node-operation-error-itemindex.ts
│   │   │   │   │   ├── node-usable-as-tool.test.ts
│   │   │   │   │   ├── node-usable-as-tool.ts
│   │   │   │   │   ├── options-sorted-alphabetically.test.ts
│   │   │   │   │   ├── options-sorted-alphabetically.ts
│   │   │   │   │   ├── package-name-convention.test.ts
│   │   │   │   │   ├── package-name-convention.ts
│   │   │   │   │   ├── require-community-node-keyword.test.ts
│   │   │   │   │   ├── require-community-node-keyword.ts
│   │   │   │   │   ├── require-continue-on-fail.test.ts
│   │   │   │   │   ├── require-continue-on-fail.ts
│   │   │   │   │   ├── require-node-api-error.test.ts
│   │   │   │   │   ├── require-node-api-error.ts
│   │   │   │   │   ├── require-node-description-fields.test.ts
│   │   │   │   │   ├── require-node-description-fields.ts
│   │   │   │   │   ├── resource-operation-pattern.test.ts
│   │   │   │   │   ├── resource-operation-pattern.ts
│   │   │   │   │   ├── valid-credential-references.test.ts
│   │   │   │   │   ├── valid-credential-references.ts
│   │   │   │   │   ├── valid-peer-dependencies.test.ts
│   │   │   │   │   ├── valid-peer-dependencies.ts
│   │   │   │   │   ├── webhook-lifecycle-complete.test.ts
│   │   │   │   │   └── webhook-lifecycle-complete.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__/
│   │   │   │   │   ├── helpers.ts
│   │   │   │   │   └── integration.test.ts
│   │   │   │   ├── bridge/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── isolated-vm-bridge.test.ts
│   │   │   │   │   └── isolated-vm-bridge.ts
│   │   │   │   ├── evaluator/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── expression-evaluator-cache.test.ts
│   │   │   │   │   │   ├── expression-evaluator-metrics.test.ts
│   │   │   │   │   │   ├── expression-evaluator.test.ts
│   │   │   │   │   │   └── lru-cache.test.ts
│   │   │   │   │   ├── error-classification.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
│   │   │   │   ├── observability/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── noop-provider.test.ts
│   │   │   │   │   ├── metrics.ts
│   │   │   │   │   └── noop-provider.ts
│   │   │   │   ├── pool/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── idle-scaling-pool.test.ts
│   │   │   │   │   │   └── isolate-pool.test.ts
│   │   │   │   │   ├── idle-scaling-pool.ts
│   │   │   │   │   └── isolate-pool.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── context.test.ts
│   │   │   │   │   │   └── lazy-proxy.test.ts
│   │   │   │   │   ├── context.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lazy-proxy.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
│   │   ├── imap/
│   │   │   ├── eslint.config.mjs
│   │   │   ├── package.json
│   │   │   ├── src/
│   │   │   │   ├── errors.ts
│   │   │   │   ├── helpers/
│   │   │   │   │   ├── get-message.test.ts
│   │   │   │   │   └── 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/
│   │   │   ├── .gitignore
│   │   │   ├── CLAUDE.md
│   │   │   ├── docs/
│   │   │   │   ├── ENGINEERING.md
│   │   │   │   ├── architecture.md
│   │   │   │   ├── configuration.md
│   │   │   │   ├── e2e-tests.md
│   │   │   │   ├── filesystem-access.md
│   │   │   │   ├── memory.md
│   │   │   │   ├── sandboxing.md
│   │   │   │   ├── streaming-protocol.md
│   │   │   │   └── tools.md
│   │   │   ├── eslint.config.mjs
│   │   │   ├── evaluations/
│   │   │   │   ├── README.md
│   │   │   │   ├── __tests__/
│   │   │   │   │   ├── args.test.ts
│   │   │   │   │   ├── comparison-compare.test.ts
│   │   │   │   │   ├── comparison-format.test.ts
│   │   │   │   │   ├── comparison-statistics.test.ts
│   │   │   │   │   ├── dataset-sync.test.ts
│   │   │   │   │   ├── event-parser.test.ts
│   │   │   │   │   ├── lane-allocator.test.ts
│   │   │   │   │   ├── lanes.test.ts
│   │   │   │   │   ├── normalize-workflow.test.ts
│   │   │   │   │   ├── pair-records.test.ts
│   │   │   │   │   ├── redact.test.ts
│   │   │   │   │   ├── sandbox-config.test.ts
│   │   │   │   │   └── stub-services.test.ts
│   │   │   │   ├── binaryChecks/
│   │   │   │   │   ├── checks/
│   │   │   │   │   │   ├── agent-has-dynamic-prompt.ts
│   │   │   │   │   │   ├── agent-has-language-model.ts
│   │   │   │   │   │   ├── all-nodes-connected.ts
│   │   │   │   │   │   ├── correct-node-operations.ts
│   │   │   │   │   │   ├── create-llm-check.ts
│   │   │   │   │   │   ├── descriptive-node-names.ts
│   │   │   │   │   │   ├── expressions-reference-existing-nodes.ts
│   │   │   │   │   │   ├── fulfills-user-request.ts
│   │   │   │   │   │   ├── handles-multiple-items.ts
│   │   │   │   │   │   ├── has-nodes.ts
│   │   │   │   │   │   ├── has-start-node.ts
│   │   │   │   │   │   ├── has-trigger.ts
│   │   │   │   │   │   ├── inbound-trigger-auth-defaults.ts
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── memory-properly-connected.ts
│   │   │   │   │   │   ├── memory-session-key-expression.test.ts
│   │   │   │   │   │   ├── memory-session-key-expression.ts
│   │   │   │   │   │   ├── no-disabled-nodes.ts
│   │   │   │   │   │   ├── no-empty-set-nodes.ts
│   │   │   │   │   │   ├── no-hardcoded-credentials.ts
│   │   │   │   │   │   ├── no-invalid-from-ai.ts
│   │   │   │   │   │   ├── no-unnecessary-code-nodes.ts
│   │   │   │   │   │   ├── no-unreachable-nodes.ts
│   │   │   │   │   │   ├── response-matches-workflow-changes.ts
│   │   │   │   │   │   ├── tools-have-parameters.ts
│   │   │   │   │   │   ├── valid-data-flow.ts
│   │   │   │   │   │   ├── valid-field-references.ts
│   │   │   │   │   │   ├── valid-node-config.ts
│   │   │   │   │   │   └── vector-store-has-embeddings.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── checklist/
│   │   │   │   │   └── verifier.ts
│   │   │   │   ├── cli/
│   │   │   │   │   ├── aggregator.ts
│   │   │   │   │   ├── args.ts
│   │   │   │   │   ├── ci-metadata.ts
│   │   │   │   │   ├── compare-pairwise.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── lane-allocator.ts
│   │   │   │   │   ├── lanes.ts
│   │   │   │   │   ├── pairwise.ts
│   │   │   │   │   └── report.ts
│   │   │   │   ├── clients/
│   │   │   │   │   ├── n8n-client.ts
│   │   │   │   │   └── sse-client.ts
│   │   │   │   ├── comparison/
│   │   │   │   │   ├── compare.ts
│   │   │   │   │   ├── fetch-baseline.ts
│   │   │   │   │   ├── format.ts
│   │   │   │   │   └── statistics.ts
│   │   │   │   ├── credentials/
│   │   │   │   │   └── seeder.ts
│   │   │   │   ├── data/
│   │   │   │   │   ├── subagent/
│   │   │   │   │   │   ├── schedule-to-email.json
│   │   │   │   │   │   └── webhook-to-slack.json
│   │   │   │   │   └── workflows/
│   │   │   │   │       ├── airtable-split-to-slack.json
│   │   │   │   │       ├── contact-form-automation.json
│   │   │   │   │       ├── cross-team-linear-report.json
│   │   │   │   │       ├── daily-slack-summary.json
│   │   │   │   │       ├── form-to-hubspot.json
│   │   │   │   │       ├── github-notion-sync.json
│   │   │   │   │       ├── index.ts
│   │   │   │   │       ├── linear-bq-leaderboard.json
│   │   │   │   │       ├── notification-router.json
│   │   │   │   │       ├── rest-api-data-pipeline.json
│   │   │   │   │       ├── set-edit-fields-contract.json
│   │   │   │   │       ├── telegram-chatbot-memory-session.json
│   │   │   │   │       ├── weather-alert.json
│   │   │   │   │       ├── weather-monitoring.json
│   │   │   │   │       └── workflow-data-table.json
│   │   │   │   ├── harness/
│   │   │   │   │   ├── in-process-builder.ts
│   │   │   │   │   ├── logger.ts
│   │   │   │   │   ├── normalize-workflow.ts
│   │   │   │   │   ├── redact.ts
│   │   │   │   │   ├── runner.ts
│   │   │   │   │   ├── sandbox-config.ts
│   │   │   │   │   └── stub-services.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── langsmith/
│   │   │   │   │   └── dataset-sync.ts
│   │   │   │   ├── outcome/
│   │   │   │   │   ├── event-parser.ts
│   │   │   │   │   └── workflow-discovery.ts
│   │   │   │   ├── report/
│   │   │   │   │   └── workflow-report.ts
│   │   │   │   ├── subagent/
│   │   │   │   │   ├── cli.ts
│   │   │   │   │   ├── langsmith.ts
│   │   │   │   │   ├── runner.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── system-prompts/
│   │   │   │   │   └── mock-execution-verify.ts
│   │   │   │   ├── tsconfig.json
│   │   │   │   └── types.ts
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   ├── build-snapshot.cjs
│   │   │   │   ├── print-prompts.ts
│   │   │   │   └── tsconfig.json
│   │   │   ├── src/
│   │   │   │   ├── __tests__/
│   │   │   │   │   └── binary-checks.test.ts
│   │   │   │   ├── agent/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── computer-use-prompt.test.ts
│   │   │   │   │   │   ├── instance-agent.test.ts
│   │   │   │   │   │   ├── register-with-mastra-leak.test.ts
│   │   │   │   │   │   ├── register-with-mastra.test.ts
│   │   │   │   │   │   ├── sanitize-mcp-schemas.test.ts
│   │   │   │   │   │   └── system-prompt.test.ts
│   │   │   │   │   ├── computer-use-prompt.ts
│   │   │   │   │   ├── credential-guardrails.prompt.ts
│   │   │   │   │   ├── instance-agent.ts
│   │   │   │   │   ├── register-with-mastra.ts
│   │   │   │   │   ├── sanitize-mcp-schemas.ts
│   │   │   │   │   ├── shared-prompts.ts
│   │   │   │   │   ├── sub-agent-briefing.ts
│   │   │   │   │   ├── sub-agent-debriefing.ts
│   │   │   │   │   ├── sub-agent-factory.ts
│   │   │   │   │   └── system-prompt.ts
│   │   │   │   ├── compaction/
│   │   │   │   │   ├── compaction-helper.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── constants/
│   │   │   │   │   ├── max-steps.ts
│   │   │   │   │   └── model-settings.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
│   │   │   │   ├── logger.ts
│   │   │   │   ├── mcp/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── mcp-client-manager.test.ts
│   │   │   │   │   └── mcp-client-manager.ts
│   │   │   │   ├── memory/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── memory-config.test.ts
│   │   │   │   │   │   └── title-utils.test.ts
│   │   │   │   │   ├── memory-config.ts
│   │   │   │   │   └── title-utils.ts
│   │   │   │   ├── parsers/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   └── structured-file-parser.test.ts
│   │   │   │   │   └── structured-file-parser.ts
│   │   │   │   ├── planned-tasks/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── planned-task-permissions.test.ts
│   │   │   │   │   │   └── planned-task-service.test.ts
│   │   │   │   │   ├── planned-task-permissions.ts
│   │   │   │   │   └── planned-task-service.ts
│   │   │   │   ├── runtime/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── background-task-manager.test.ts
│   │   │   │   │   │   ├── builder-sandbox-session-registry.test.ts
│   │   │   │   │   │   ├── resumable-stream-executor.test.ts
│   │   │   │   │   │   ├── run-state-registry.test.ts
│   │   │   │   │   │   ├── stream-runner.test.ts
│   │   │   │   │   │   └── terminal-response-guard.test.ts
│   │   │   │   │   ├── background-task-manager.ts
│   │   │   │   │   ├── builder-sandbox-session-registry.ts
│   │   │   │   │   ├── resumable-stream-executor.ts
│   │   │   │   │   ├── run-state-registry.ts
│   │   │   │   │   ├── stream-runner.ts
│   │   │   │   │   └── terminal-response-guard.ts
│   │   │   │   ├── storage/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── iteration-log.test.ts
│   │   │   │   │   │   ├── mastra-iteration-log-storage.test.ts
│   │   │   │   │   │   ├── mastra-task-storage.test.ts
│   │   │   │   │   │   ├── planned-task-storage.test.ts
│   │   │   │   │   │   ├── terminal-outcome-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
│   │   │   │   │   ├── terminal-outcome-storage.ts
│   │   │   │   │   ├── thread-patch.ts
│   │   │   │   │   └── workflow-loop-storage.ts
│   │   │   │   ├── stream/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── map-chunk.test.ts
│   │   │   │   │   │   └── work-summary-accumulator.test.ts
│   │   │   │   │   ├── consume-with-hitl.ts
│   │   │   │   │   ├── map-chunk.ts
│   │   │   │   │   └── work-summary-accumulator.ts
│   │   │   │   ├── tools/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── best-practices.test.ts
│   │   │   │   │   │   ├── credentials.tool.test.ts
│   │   │   │   │   │   ├── data-tables.tool.test.ts
│   │   │   │   │   │   ├── executions.tool.test.ts
│   │   │   │   │   │   ├── nodes.tool.test.ts
│   │   │   │   │   │   ├── research.tool.test.ts
│   │   │   │   │   │   ├── task-control.tool.test.ts
│   │   │   │   │   │   ├── templates.tool.test.ts
│   │   │   │   │   │   ├── workflows.tool.test.ts
│   │   │   │   │   │   └── workspace.tool.test.ts
│   │   │   │   │   ├── attachments/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── parse-file-registration.test.ts
│   │   │   │   │   │   │   └── parse-file.tool.test.ts
│   │   │   │   │   │   └── parse-file.tool.ts
│   │   │   │   │   ├── best-practices/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   └── techniques.ts
│   │   │   │   │   ├── credentials.tool.ts
│   │   │   │   │   ├── data-tables.tool.ts
│   │   │   │   │   ├── executions.tool.ts
│   │   │   │   │   ├── filesystem/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── create-tools-from-mcp-server.test.ts
│   │   │   │   │   │   └── create-tools-from-mcp-server.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── nodes/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   └── node-search-engine.test.ts
│   │   │   │   │   │   ├── node-search-engine.ts
│   │   │   │   │   │   ├── node-search-engine.types.ts
│   │   │   │   │   │   └── suggested-nodes-data.ts
│   │   │   │   │   ├── nodes.tool.ts
│   │   │   │   │   ├── orchestration/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── blueprint-accumulator.test.ts
│   │   │   │   │   │   │   ├── blueprint.schema.test.ts
│   │   │   │   │   │   │   ├── browser-credential-setup.nudge.test.ts
│   │   │   │   │   │   │   ├── build-workflow-agent.tool.test.ts
│   │   │   │   │   │   │   ├── builder-memory-compaction.test.ts
│   │   │   │   │   │   │   ├── complete-checkpoint.tool.test.ts
│   │   │   │   │   │   │   ├── credential-guardrails.prompt.test.ts
│   │   │   │   │   │   │   ├── delegate.tool.test.ts
│   │   │   │   │   │   │   ├── plan-with-agent.tool.test.ts
│   │   │   │   │   │   │   ├── plan.tool.test.ts
│   │   │   │   │   │   │   ├── report-verification-verdict.tool.test.ts
│   │   │   │   │   │   │   ├── research-with-agent.tool.test.ts
│   │   │   │   │   │   │   └── verify-built-workflow.tool.test.ts
│   │   │   │   │   │   ├── add-plan-item.tool.ts
│   │   │   │   │   │   ├── blueprint-accumulator.ts
│   │   │   │   │   │   ├── blueprint.schema.ts
│   │   │   │   │   │   ├── browser-credential-setup.nudge.ts
│   │   │   │   │   │   ├── browser-credential-setup.prompt.ts
│   │   │   │   │   │   ├── browser-credential-setup.tool.ts
│   │   │   │   │   │   ├── build-workflow-agent.prompt.ts
│   │   │   │   │   │   ├── build-workflow-agent.tool.ts
│   │   │   │   │   │   ├── builder-memory-compaction.ts
│   │   │   │   │   │   ├── complete-checkpoint.tool.ts
│   │   │   │   │   │   ├── data-table-agent.prompt.ts
│   │   │   │   │   │   ├── data-table-agent.tool.ts
│   │   │   │   │   │   ├── delegate.schemas.ts
│   │   │   │   │   │   ├── delegate.tool.ts
│   │   │   │   │   │   ├── display-utils.ts
│   │   │   │   │   │   ├── plan-agent-prompt.ts
│   │   │   │   │   │   ├── plan-with-agent.tool.ts
│   │   │   │   │   │   ├── plan.tool.ts
│   │   │   │   │   │   ├── report-verification-verdict.tool.ts
│   │   │   │   │   │   ├── research-agent-prompt.ts
│   │   │   │   │   │   ├── research-with-agent.tool.ts
│   │   │   │   │   │   ├── submit-plan.tool.ts
│   │   │   │   │   │   ├── tracing-utils.ts
│   │   │   │   │   │   └── verify-built-workflow.tool.ts
│   │   │   │   │   ├── research.tool.ts
│   │   │   │   │   ├── shared/
│   │   │   │   │   │   └── ask-user.tool.ts
│   │   │   │   │   ├── task-control.tool.ts
│   │   │   │   │   ├── templates.tool.ts
│   │   │   │   │   ├── web-research/
│   │   │   │   │   │   └── sanitize-web-content.ts
│   │   │   │   │   ├── workflows/
│   │   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   │   ├── build-workflow-schema.test.ts
│   │   │   │   │   │   │   ├── resolve-credentials.test.ts
│   │   │   │   │   │   │   ├── setup-workflow.service.test.ts
│   │   │   │   │   │   │   ├── submit-workflow-identity.test.ts
│   │   │   │   │   │   │   ├── submit-workflow.tool.test.ts
│   │   │   │   │   │   │   └── write-sandbox-file.tool.test.ts
│   │   │   │   │   │   ├── apply-workflow-credentials.tool.ts
│   │   │   │   │   │   ├── build-workflow.tool.ts
│   │   │   │   │   │   ├── materialize-node-type.tool.ts
│   │   │   │   │   │   ├── resolve-credentials.ts
│   │   │   │   │   │   ├── setup-workflow.schema.ts
│   │   │   │   │   │   ├── setup-workflow.service.ts
│   │   │   │   │   │   ├── submit-workflow-identity.ts
│   │   │   │   │   │   ├── submit-workflow.tool.ts
│   │   │   │   │   │   └── write-sandbox-file.tool.ts
│   │   │   │   │   ├── workflows.tool.ts
│   │   │   │   │   └── workspace.tool.ts
│   │   │   │   ├── tracing/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── langsmith-tracing.test.ts
│   │   │   │   │   │   └── trace-replay.test.ts
│   │   │   │   │   ├── langsmith-tracing.ts
│   │   │   │   │   └── trace-replay.ts
│   │   │   │   ├── types.ts
│   │   │   │   ├── utils/
│   │   │   │   │   ├── __tests__/
│   │   │   │   │   │   ├── format-timestamp.test.ts
│   │   │   │   │   │   └── stream-helpers.test.ts
│   │   │   │   │   ├── agent-tree.ts
│   │   │   │   │   ├── eval-agents.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
│   │   │   │   │   │   ├── remediation.test.ts
│   │   │   │   │   │   ├── workflow-loop-controller.test.ts
│   │   │   │   │   │   └── workflow-task-service.test.ts
│   │   │   │   │   ├── guidance.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── remediation.ts
│   │   │   │   │   ├── runtime.ts
│   │   │   │   │   ├── workflow-loop-controller.ts
│   │   │   │   │   ├── workflow-loop-state.ts
│   │   │   │   │   └── workflow-task-service.ts
│   │   │   │   └── workspace/
│   │   │   │       ├── __tests__/
│   │   │   │       │   ├── builder-sandbox-factory.test.ts
│   │   │   │       │   ├── create-workspace.test.ts
│   │   │   │       │   ├── n8n-sandbox-client.test.ts
│   │   │   │       │   ├── sandbox-fs.test.ts
│   │   │   │       │   ├── sandbox-setup.test.ts
│   │   │   │       │   └── snapshot-manager.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
│   │   │   │       ├── pack-workspace-sdk.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
│   │   │   ├── 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
│   │   │   └── vite.config.ts
│   │   ├── local-gateway/
│   │   │   ├── .gitignore
│   │   │   ├── README.md
│   │   │   ├── assets/
│   │   │   │   ├── README.md
│   │   │   │   └── icon.icns
│   │   │   ├── electron-builder.config.js
│   │   │   ├── eslint.config.mjs
│   │   │   ├── jest.config.js
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   ├── copy-assets.js
│   │   │   │   └── copy-renderer.js
│   │   │   ├── 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__/
│   │   │   │   │   ├── cdp-relay.test.ts
│   │   │   │   │   ├── errors.test.ts
│   │   │   │   │   ├── server-config.test.ts
│   │   │   │   │   └── utils.test.ts
│   │   │   │   ├── adapters/
│   │   │   │   │   ├── agent-browser.test.ts
│   │   │   │   │   ├── agent-browser.ts
│   │   │   │   │   └── 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/
│   │   │   ├── .gitignore
│   │   │   ├── eslint.config.mjs
│   │   │   ├── manifest.json
│   │   │   ├── package.json
│   │   │   ├── scripts/
│   │   │   │   └── bundle.mjs
│   │   │   ├── src/
│   │   │   │   ├── background.ts
│   │   │   │   ├── logger.ts
│   │   │   │   ├── relayConnection.test.ts
│   │   │   │   ├── relayConnection.ts
│   │   │   │   ├── types.ts
│   │   │   │   └── ui/
│   │   │   │       ├── App.vue
│   │   │   │       ├── components/
│   │   │   │       │   ├── SettingsPanel.vue
│   │   │   │       │   ├── StatusBadge.vue
│   │   │   │       │   ├── TabItem.vue
│   │   │   │       │   └── TabList.vue
│   │   │   │       ├── composables/
│   │   │   │       │   ├── useConnection.test.ts
│   │   │   │       │   └── useConnection.ts
│   │   │   │       ├── connect.html
│   │   │   │       ├── main.ts
│   │   │   │       ├── shimsVue.d.ts
│   │   │   │       └── tokens.scss
│   │   │   ├── tsconfig.json
│   │   │   ├── vite.sw.config.mts
│   │   │   ├── vite.ui.config.mts
│   │   │   └── vitest.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.test.ts
│   │   │   │   │   └── 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/
│   │   │   │   ├── AlibabaCloudApi.credentials.ts
│   │   │   │   ├── AnthropicApi.credentials.ts
│   │   │   │   ├── AzureAiSearchApi.credentials.ts
│   │   │   │   ├── AzureEntraCognitiveServicesOAuth2Api.credentials.ts
│   │   │   │   ├── AzureOpenAiApi.credentials.ts
│   │   │   │   ├── BraveSearchApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStorePGVectorApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStorePineconeApi.credentials.ts
│   │   │   │   ├── ChatHubVectorStoreQdrantApi.credentials.ts
│   │   │   │   ├── ChromaCloudApi.credentials.ts
│   │   │   │   ├── ChromaSelfHostedApi.credentials.ts
│   │   │   │   ├── CohereApi.credentials.ts
│   │   │   │   ├── DaytonaApi.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
│   │   │   │   ├── MinimaxApi.credentials.ts
│   │   │   │   ├── MistralCloudApi.credentials.ts
│   │   │   │   ├── MoonshotApi.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
│   │   │   ├── 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
│   │   │   │   │   ├── LmChatAlibabaCloud/
│   │   │   │   │   │   ├── LmChatAlibabaCloud.node.ts
│   │   │   │   │   │   ├── alibaba-cloud-base-url.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatAlibabaCloud.test.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
│   │   │   │   │   ├── LmChatMinimax/
│   │   │   │   │   │   ├── LmChatMinimax.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatMinimax.test.ts
│   │   │   │   │   ├── LmChatMistralCloud/
│   │   │   │   │   │   └── LmChatMistralCloud.node.ts
│   │   │   │   │   ├── LmChatMoonshot/
│   │   │   │   │   │   ├── LmChatMoonshot.node.ts
│   │   │   │   │   │   └── test/
│   │   │   │   │   │       └── LmChatMoonshot.test.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
│   │   │   │   │   │   │   └── utils.test.ts
│   │   │   │   │   │   ├── loadOptions.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── utils.ts
│   │   │   │   │   ├── McpRegistryClientTool/
│   │   │   │   │   │   ├── McpRegistryClientTool.node.test.ts
│   │   │   │   │   │   └── McpRegistryClientTool.node.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
│   │   │   │   │       ├── runtime.test.ts
│   │   │   │   │       ├── runtime.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/
│   │   │   │       ├── AlibabaCloud/
│   │   │   │       │   ├── AlibabaCloud.node.ts
│   │   │   │       │   ├── actions/
│   │   │   │       │   │   ├── descriptions.ts
│   │   │   │       │   │   ├── image/
│   │   │   │       │   │   │   ├── analyze.operation.ts
│   │   │   │       │   │   │   ├── generate.operation.ts
│   │   │   │       │   │   │   └── index.ts
│   │   │   │       │   │   ├── router.ts
│   │   │   │       │   │   ├── text/
│   │   │   │       │   │   │   ├── index.ts
│   │   │   │       │   │   │   └── message.operation.ts
│   │   │   │       │   │   ├── versionDescription.ts
│   │   │   │       │   │   └── video/
│   │   │   │       │   │       ├── generate.i2v.operation.ts
│   │   │   │       │   │       ├── generate.t2v.operation.ts
│   │   │   │       │   │       └── index.ts
│   │   │   │       │   ├── helpers/
│   │   │   │       │   │   └── interfaces.ts
│   │   │   │       │   ├── methods/
│   │   │   │       │   │   ├── index.ts
│   │   │   │       │   │   └── listSearch.ts
│   │   │   │       │   ├── test/
│   │   │   │       │   │   ├── listSearch.test.ts
│   │   │   │       │   │   ├── operations.test.ts
│   │   │   │       │   │   ├── router.test.ts
│   │   │   │       │   │   └── transport.test.ts
│   │   │   │       │   └── transport/
│   │   │   │       │       └
Download .txt
Showing preview only (3,877K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (38461 symbols across 7636 files)

FILE: .claude/plugins/n8n/scripts/track-skill-usage.mjs
  constant TELEMETRY_HOST (line 10) | const TELEMETRY_HOST = 'https://telemetry.n8n.io';
  constant TELEMETRY_WRITE_KEY (line 11) | const TELEMETRY_WRITE_KEY = '1zPn7YoGC3ZXE9zLeTKLuQCB4F6';

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 179) | function runValidate() {

FILE: .github/scripts/bump-versions.mjs
  function generateExperimentalVersion (line 14) | function generateExperimentalVersion(currentVersion) {
  function getOverrides (line 35) | function getOverrides(pkg) {
  function parseWorkspaceYaml (line 43) | function parseWorkspaceYaml(content) {
  function getCatalogs (line 55) | function getCatalogs(ws) {
  function computeChangedOverrides (line 73) | function computeChangedOverrides(currentOverrides, previousOverrides) {
  function computeChangedCatalogEntries (line 86) | function computeChangedCatalogEntries(currentCatalogs, previousCatalogs) {
  function markDirtyByRootChanges (line 110) | function markDirtyByRootChanges(
  function propagateDirtyTransitively (line 141) | function propagateDirtyTransitively(packageMap, depsByPackage) {
  function computeNewVersion (line 160) | function computeNewVersion(version, releaseType) {
  function bumpVersions (line 178) | async function bumpVersions() {

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, sha = '...
    method output (line 48) | output(tags, prefix = '') {
    method generateAll (line 67) | generateAll({ version, platform, includeDockerHub = false, sha = '' }) {

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/pnpm-utils.mjs
  function getMonorepoProjects (line 17) | async function getMonorepoProjects() {

FILE: .github/scripts/populate-cloud-databases.mjs
  function populateCloudDatabases (line 3) | async function populateCloudDatabases() {

FILE: .github/scripts/post-qa-metrics-comment.mjs
  constant MARKER (line 18) | const MARKER = '<!-- n8n-qa-metrics-comparison -->';
  function inferPr (line 140) | function inferPr() {

FILE: .github/scripts/promote-github-release.mjs
  function promoteGitHubRelease (line 19) | async function promoteGitHubRelease() {

FILE: .github/scripts/quality/check-ownership-checkbox.mjs
  constant BOT_MARKER (line 11) | const BOT_MARKER = '<!-- pr-ownership-check -->';
  function isOwnershipCheckboxChecked (line 19) | function isOwnershipCheckboxChecked(body) {
  function main (line 25) | async function main() {

FILE: .github/scripts/quality/check-pr-size.mjs
  constant SIZE_LIMIT (line 18) | const SIZE_LIMIT = 1000;
  constant OVERRIDE_COMMAND (line 19) | const OVERRIDE_COMMAND = '/size-limit-override';
  constant EXCLUDE_PATTERNS (line 21) | const EXCLUDE_PATTERNS = [
  constant BOT_MARKER (line 47) | const BOT_MARKER = '<!-- pr-size-check -->';
  function hasValidOverride (line 57) | async function hasValidOverride(comments, getPermission) {
  function countFilteredAdditions (line 82) | function countFilteredAdditions(files, excludePatterns) {
  function main (line 88) | async function main() {

FILE: .github/scripts/quality/check-pr-size.test.mjs
  constant SIZE_LIMIT (line 16) | let hasValidOverride, countFilteredAdditions, SIZE_LIMIT, OVERRIDE_COMMA...
  constant OVERRIDE_COMMAND (line 16) | let hasValidOverride, countFilteredAdditions, SIZE_LIMIT, OVERRIDE_COMMA...
  constant EXCLUDE_PATTERNS (line 16) | let hasValidOverride, countFilteredAdditions, SIZE_LIMIT, OVERRIDE_COMMA...

FILE: .github/scripts/quality/handle-size-override.mjs
  constant CHECK_NAME (line 15) | const CHECK_NAME = 'PR Size Limit';
  function run (line 27) | async function run({ octokit, owner, repo, prNumber, commenter, commentI...
  function main (line 81) | async function main() {

FILE: .github/scripts/retry.mjs
  function getFlag (line 20) | function getFlag(name, defaultValue) {

FILE: .github/scripts/send-docker-stats.mjs
  function parseSizeToMB (line 22) | function parseSizeToMB(val) {

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/set-latest-for-monorepo-packages.mjs
  constant NPM_REGISTRY (line 3) | const NPM_REGISTRY = 'https://registry.npmjs.org';
  function setDistTag (line 11) | async function setDistTag(name, version, tag, token) {
  function setLatestForMonorepoPackages (line 26) | async function setLatestForMonorepoPackages() {

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 32) | type AiImport = typeof import('ai');
  function makeGenerateSuccess (line 59) | function makeGenerateSuccess(text = 'OK') {
  function silentReject (line 89) | function silentReject<T = never>(error: Error): Promise<T> {
  function makeErrorStream (line 95) | function makeErrorStream(error: Error) {
  function collectChunks (line 104) | async function collectChunks(stream: ReadableStream<unknown>): Promise<S...
  function makeStreamSuccess (line 116) | function makeStreamSuccess(text = 'Hello') {
  function createRuntime (line 129) | function createRuntime(eventBus?: AgentEventBus) {
  function createStructuredRuntime (line 143) | function createStructuredRuntime(options?: { tools?: BuiltTool[]; eventB...
  function makeGenerateSuccessWithOutput (line 157) | function makeGenerateSuccessWithOutput(output: unknown, text = 'OK') {
  function makeStreamSuccessWithOutput (line 162) | function makeStreamSuccessWithOutput(output: unknown, text = 'Hello') {
  function makeGenerateWithToolCall (line 167) | function makeGenerateWithToolCall(toolCallId: string, toolName: string, ...
  function makeInterruptibleTool (line 184) | function makeInterruptibleTool(): BuiltTool {
  function makeMemory (line 479) | function makeMemory(savedWorkingMemory: string[]): BuiltMemory {
  function makeMockTool (line 652) | function makeMockTool(name: string, handler: (input: unknown) => Promise...
  function makeSuspendingTool (line 662) | function makeSuspendingTool(
  function createRuntimeWithTools (line 677) | function createRuntimeWithTools(tools: BuiltTool[], concurrency: number,...
  function makeGenerateWithToolCalls (line 692) | function makeGenerateWithToolCalls(
  type ToolOutputContent (line 1019) | type ToolOutputContent = {
  type ToolMessage (line 1023) | type ToolMessage = { role: string; content: ToolOutputContent[] };
  function getSystemMessageText (line 2210) | function getSystemMessageText(): string {

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__/inmemory-working-memory.test.ts
  function makeDbMsg (line 64) | function makeDbMsg(id: string, createdAt: Date, text: string): AgentDbMe...

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 22) | function describeIf(provider: 'anthropic' | 'openai') {
  function collectStreamChunks (line 30) | async function collectStreamChunks(stream: ReadableStream<unknown>): Pro...
  function chunksOfType (line 44) | function chunksOfType<T extends StreamChunk['type']>(
  function getModel (line 54) | function getModel(provider: 'anthropic' | 'openai'): string {
  function createAgentWithAddTool (line 61) | function createAgentWithAddTool(provider: 'anthropic' | 'openai'): Agent {
  function createAgentWithInterruptibleTool (line 88) | function createAgentWithInterruptibleTool(provider: 'anthropic' | 'opena...
  function createAgentWithMixedTools (line 115) | function createAgentWithMixedTools(provider: 'anthropic' | 'openai'): Ag...
  function createAgentWithToContentTool (line 153) | function createAgentWithToContentTool(provider: 'anthropic' | 'openai'):...
  function createAgentWithParallelInterruptibleCalls (line 185) | function createAgentWithParallelInterruptibleCalls(provider: 'anthropic'...
  function createAgentWithConcurrentInterruptibleCalls (line 214) | function createAgentWithConcurrentInterruptibleCalls(
  function createAgentWithConcurrentMixedTools (line 245) | function createAgentWithConcurrentMixedTools(provider: 'anthropic' | 'op...
  function createAgentWithBatchedInterruptibleCalls (line 283) | function createAgentWithBatchedInterruptibleCalls(
  function createAgentWithBatchedNormalCalls (line 314) | function createAgentWithBatchedNormalCalls(
  function createAgentWithAlwaysErrorTool (line 338) | function createAgentWithAlwaysErrorTool(provider: 'anthropic' | 'openai'...
  function createAgentWithFlakyTool (line 359) | function createAgentWithFlakyTool(provider: 'anthropic' | 'openai'): {
  function createSqliteMemory (line 418) | function createSqliteMemory(): {

FILE: packages/@n8n/agents/src/__tests__/integration/interim-user-message-during-suspend.test.ts
  function buildInterruptibleAgent (line 42) | function buildInterruptibleAgent(mem: Memory): Agent {

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 describe (line 20) | describe(): MemoryDescriptor {
    method getThread (line 29) | async getThread(threadId: string): Promise<Thread | null> {
    method saveThread (line 33) | async saveThread(thread: Omit<Thread, 'createdAt' | 'updatedAt'>): Pro...
    method deleteThread (line 40) | async deleteThread(threadId: string): Promise<void> {
    method getMessages (line 47) | async getMessages(
    method saveMessages (line 64) | async saveMessages(args: {
    method deleteMessages (line 73) | async deleteMessages(messageIds: string[]): Promise<void> {
    method getWorkingMemory (line 85) | async getWorkingMemory(params: {
    method saveWorkingMemory (line 96) | async saveWorkingMemory(

FILE: packages/@n8n/agents/src/__tests__/integration/memory/memory-postgres.test.ts
  function isDockerAvailable (line 22) | function isDockerAvailable(): boolean {
  function makePostgresMemory (line 68) | function makePostgresMemory(namespace: string): PostgresMemory {
  function describeWithDocker (line 77) | function describeWithDocker(name: string, fn: () => void) {
  function describeWithDockerAndApi (line 516) | 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 42) | function buildSeedMessages(): AgentDbMessage[] {

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__/integration/tool-call-upsert.test.ts
  function extractToolCallBlocks (line 33) | function extractToolCallBlocks(messages: AgentDbMessage[]): ContentToolC...
  function buildInterruptibleAgent (line 39) | function buildInterruptibleAgent(memory: ReturnType<typeof createSqliteM...

FILE: packages/@n8n/agents/src/__tests__/message-list.test.ts
  function makeUserMsg (line 5) | function makeUserMsg(text: string): AgentMessage {
  function makeDbMsg (line 9) | function makeDbMsg(text: string, createdAt: Date): AgentDbMessage {
  function makePendingToolCallMsg (line 182) | function makePendingToolCallMsg(toolCallId: string): AgentMessage {

FILE: packages/@n8n/agents/src/__tests__/message.test.ts
  function userMessage (line 4) | function userMessage(partial: Partial<AgentMessage> & { createdAt?: unkn...

FILE: packages/@n8n/agents/src/__tests__/model-factory.test.ts
  type ProviderOpts (line 5) | type ProviderOpts = {

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): AgentDbMessa...
  function textOf (line 25) | function textOf(msg: AgentMessage): string {
  function makeMemory (line 30) | function makeMemory(dbPath: string, namespace?: string): SqliteMemory {

FILE: packages/@n8n/agents/src/__tests__/title-generation.test.ts
  type GenerateTextCall (line 6) | type GenerateTextCall = {

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__/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
  type AgentRuntimeConfig (line 71) | interface AgentRuntimeConfig {
  constant MAX_LOOP_ITERATIONS (line 98) | const MAX_LOOP_ITERATIONS = 20;
  constant EMPTY_MESSAGE_LIST (line 100) | const EMPTY_MESSAGE_LIST: SerializedMessageList = {
  type PendingResume (line 108) | interface PendingResume {
  type ToolCallOutcome (line 117) | type ToolCallOutcome =
  type ToolCallSuccess (line 140) | interface ToolCallSuccess {
  type ToolCallSuspension (line 151) | interface ToolCallSuspension {
  type ToolCallError (line 161) | interface ToolCallError {
  type ToolCallBatchResult (line 169) | interface ToolCallBatchResult {
  type LoopContext (line 178) | interface LoopContext {
  type ToolBatchContext (line 186) | interface ToolBatchContext {
  class AgentRuntime (line 206) | class AgentRuntime {
    method constructor (line 219) | constructor(config: AgentRuntimeConfig) {
    method getState (line 232) | getState(): SerializableAgentState {
    method abort (line 237) | abort(): void {
    method generate (line 242) | async generate(
    method stream (line 264) | async stream(
    method resume (line 302) | async resume(
    method buildMessageList (line 406) | private async buildMessageList(
    method performSemanticRecall (line 442) | private async performSemanticRecall(
    method expandMessageRange (line 524) | private expandMessageRange(
    method initRun (line 553) | private async initRun(
    method finalizeGenerate (line 572) | private finalizeGenerate(
    method resolveTelemetry (line 587) | private resolveTelemetry(options?: ExecutionOptions): BuiltTelemetry |...
    method flushTelemetry (line 595) | private async flushTelemetry(options?: ExecutionOptions): Promise<void> {
    method buildTelemetryOptions (line 607) | private buildTelemetryOptions(options?: ExecutionOptions): Record<stri...
    method runGenerateLoop (line 625) | private async runGenerateLoop(ctx: LoopContext): Promise<GenerateResul...
    method startStreamLoop (line 794) | private startStreamLoop(ctx: LoopContext): ReadableStream<StreamChunk> {
    method runStreamLoop (line 838) | private async runStreamLoop(
    method saveToMemory (line 1108) | private async saveToMemory(
    method saveEmbeddingsForMessages (line 1132) | private async saveEmbeddingsForMessages(
    method buildThinkingProviderOptions (line 1176) | private buildThinkingProviderOptions(): Record<string, Record<string, ...
    method buildCallProviderOptions (line 1222) | private buildCallProviderOptions(
    method iterateToolCallsConcurrent (line 1255) | private async iterateToolCallsConcurrent(
    method iteratePendingToolCallsConcurrent (line 1384) | private async iteratePendingToolCallsConcurrent(
    method processToolCall (line 1503) | private async processToolCall(
    method buildLoopContext (line 1648) | private buildLoopContext(
    method composeEffectiveInstructions (line 1679) | private composeEffectiveInstructions(tools: BuiltTool[]): string {
    method buildWorkingMemoryToolForRun (line 1695) | private buildWorkingMemoryToolForRun(persistence: AgentPersistenceOpti...
    method persistSuspension (line 1709) | private async persistSuspension(
    method cleanupRun (line 1737) | private async cleanupRun(runId: string | undefined): Promise<void> {
    method emitTurnEnd (line 1744) | private emitTurnEnd(newMessages: AgentMessage[], toolResults: ContentT...
    method updateState (line 1752) | private updateState(patch: Partial<SerializableAgentState>): void {
    method modelIdString (line 1757) | private get modelIdString(): string {
    method concurrency (line 1769) | private get concurrency(): number {
    method ensureModelCost (line 1774) | private async ensureModelCost(): Promise<ModelCost | undefined> {
    method applyCost (line 1785) | private applyCost(usage: TokenUsage | undefined): TokenUsage | undefin...
    method setListWorkingMemoryConfig (line 1790) | private async setListWorkingMemoryConfig(
    method resolveWorkingMemoryParams (line 1806) | 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 off (line 35) | off(event: AgentEvent, handler: AgentEventHandler): void {
    method emit (line 39) | emit(data: AgentEventData): void {
    method abort (line 47) | abort(): void {
    method resetAbort (line 60) | resetAbort(externalSignal?: AbortSignal): void {
    method signal (line 77) | get signal(): AbortSignal {
    method isAborted (line 81) | get isAborted(): boolean {
    method dispose (line 90) | dispose(): void {

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 4) | interface StoredMessage {
  class InMemoryMemory (line 16) | class InMemoryMemory implements BuiltMemory {
    method getWorkingMemory (line 24) | async getWorkingMemory(params: { threadId: string; resourceId?: string...
    method saveWorkingMemory (line 31) | async saveWorkingMemory(
    method getThread (line 39) | async getThread(threadId: string): Promise<Thread | null> {
    method saveThread (line 44) | async saveThread(thread: Omit<Thread, 'createdAt' | 'updatedAt'>): Pro...
    method deleteThread (line 59) | async deleteThread(threadId: string): Promise<void> {
    method getMessages (line 65) | async getMessages(
    method saveMessages (line 85) | async saveMessages(args: {
    method deleteMessages (line 106) | async deleteMessages(messageIds: string[]): Promise<void> {
    method describe (line 116) | describe(): MemoryDescriptor {
  function saveMessagesToThread (line 126) | async function saveMessagesToThread(

FILE: packages/@n8n/agents/src/runtime/message-list.ts
  type MessageSource (line 15) | type MessageSource = 'history' | 'input' | 'response';
  type WorkingMemoryContext (line 17) | interface WorkingMemoryContext {
  class AgentMessageList (line 41) | class AgentMessageList {
    method addMessage (line 67) | private addMessage(message: AgentMessage, source: MessageSource): Agen...
    method createdAtSortKey (line 90) | private createdAtSortKey(m: AgentDbMessage): number {
    method sortAllByCreatedAt (line 96) | private sortAllByCreatedAt(): void {
    method addHistory (line 115) | addHistory(messages: AgentMessage[] | AgentDbMessage[]): void {
    method addInput (line 123) | addInput(messages: AgentMessage[] | AgentDbMessage[]): void {
    method addResponse (line 131) | addResponse(messages: AgentMessage[] | AgentDbMessage[]): void {
    method setToolCallResult (line 146) | setToolCallResult(toolCallId: string, output: JSONValue): AgentDbMessa...
    method setToolCallError (line 171) | setToolCallError(toolCallId: string, error: unknown): AgentDbMessage |...
    method findToolCallHost (line 187) | private findToolCallHost(toolCallId: string): AgentDbMessage | undefin...
    method findToolCallBlock (line 202) | private findToolCallBlock(host: AgentDbMessage, toolCallId: string): C...
    method forLlm (line 214) | forLlm(baseInstructions: string, instructionProviderOptions?: Provider...
    method turnDelta (line 238) | turnDelta(): AgentDbMessage[] {
    method responseDelta (line 246) | responseDelta(): AgentDbMessage[] {
    method serialize (line 250) | serialize(): SerializedMessageList {
    method deserialize (line 260) | static deserialize(data: SerializedMessageList): AgentMessageList {

FILE: packages/@n8n/agents/src/runtime/messages.ts
  type ReasoningPart (line 26) | type ReasoningPart = { type: 'reasoning'; text: string };
  type AiContentPart (line 28) | type AiContentPart =
  function isText (line 40) | function isText(block: MessageContent): block is ContentText {
  function isReasoning (line 44) | function isReasoning(block: MessageContent): block is ContentReasoning {
  function isFile (line 48) | function isFile(block: MessageContent): block is ContentFile {
  function isToolCall (line 52) | function isToolCall(block: MessageContent): block is ContentToolCall {
  function parseJsonValue (line 60) | function parseJsonValue(value: JSONValue): unknown {
  function toAiContent (line 72) | function toAiContent(block: MessageContent): AiContentPart | undefined {
  function toolCallToResultPart (line 101) | function toolCallToResultPart(
  function fromAiContent (line 131) | function fromAiContent(part: AiContentPart): MessageContent | undefined {
  function toAiMessageList (line 189) | function toAiMessageList(msg: Message): ModelMessage[] {
  function toAiMessages (line 271) | function toAiMessages(messages: Message[]): ModelMessage[] {
  function fromAiMessages (line 286) | function fromAiMessages(messages: ModelMessage[]): AgentMessage[] {
  function fromAiFinishReason (line 347) | function fromAiFinishReason(reason: AiFinishReason): FinishReason {

FILE: packages/@n8n/agents/src/runtime/model-factory.ts
  type FetchFn (line 13) | type FetchFn = typeof globalThis.fetch;
  type CreateEmbeddingProviderFn (line 14) | type CreateEmbeddingProviderFn = (opts?: { apiKey?: string }) => {
  function isLanguageModel (line 18) | function isLanguageModel(config: unknown): config is LanguageModel {
  function getProxyFetch (line 28) | function getProxyFetch(): FetchFn | undefined {
  type EntryBuilder (line 42) | type EntryBuilder<P extends ProviderId> = (
  type RegistryEntry (line 48) | type RegistryEntry<P extends ProviderId = ProviderId> = {
  type ProviderRegistry (line 52) | type ProviderRegistry = {
  constant LANGUAGE_PROVIDERS (line 61) | const LANGUAGE_PROVIDERS: ProviderRegistry = {
  constant SUPPORTED_PROVIDERS (line 158) | const SUPPORTED_PROVIDERS = Object.keys(LANGUAGE_PROVIDERS).join(', ');
  function createModel (line 164) | function createModel(config: ModelConfig): LanguageModel {
  constant EMBEDDING_PROVIDERS (line 216) | const EMBEDDING_PROVIDERS = {
  type EmbeddingProvider (line 225) | type EmbeddingProvider = keyof typeof EMBEDDING_PROVIDERS;
  type EmbeddingModelId (line 226) | type EmbeddingModelId = `${EmbeddingProvider}/${string}`;
  function createEmbeddingModel (line 233) | function createEmbeddingModel(

FILE: packages/@n8n/agents/src/runtime/provider-credentials.ts
  constant PROVIDER_CREDENTIAL_SCHEMAS (line 13) | const PROVIDER_CREDENTIAL_SCHEMAS = {
  type ProviderId (line 39) | type ProviderId = keyof typeof PROVIDER_CREDENTIAL_SCHEMAS;
  type ProviderCredentials (line 40) | type ProviderCredentials<P extends ProviderId> = z.infer<

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 46) | async resume(runId: string): Promise<SerializableAgentState | undefine...
    method complete (line 57) | async complete(runId: string): Promise<void> {
  function generateRunId (line 67) | function generateRunId(): string {

FILE: packages/@n8n/agents/src/runtime/runtime-helpers.ts
  function normalizeInput (line 13) | function normalizeInput(input: AgentMessage[] | string): AgentMessage[] {
  function stringifyError (line 21) | function stringifyError(error: unknown): string {
  function extractSettledToolCalls (line 26) | function extractSettledToolCalls(messages: AgentMessage[]): ContentToolC...
  function makeErrorStream (line 37) | function makeErrorStream(error: unknown): ReadableStream<StreamChunk> {
  function mergeUsage (line 47) | function mergeUsage(
  function accumulateUsage (line 83) | function accumulateUsage(
  function applySubAgentUsage (line 100) | function applySubAgentUsage(result: GenerateResult): GenerateResult {

FILE: packages/@n8n/agents/src/runtime/stream.ts
  function toTokenUsage (line 7) | function toTokenUsage(
  function convertChunk (line 45) | function convertChunk(c: TextStreamPart<ToolSet>): StreamChunk | undefin...

FILE: packages/@n8n/agents/src/runtime/strip-orphaned-tool-messages.ts
  function stripOrphanedToolMessages (line 13) | function stripOrphanedToolMessages<T extends AgentMessage>(messages: T[]...

FILE: packages/@n8n/agents/src/runtime/title-generation.ts
  constant DEFAULT_TITLE_INSTRUCTIONS (line 11) | const DEFAULT_TITLE_INSTRUCTIONS = [
  constant DEFAULT_TITLE_AND_EMOJI_INSTRUCTIONS (line 36) | const DEFAULT_TITLE_AND_EMOJI_INSTRUCTIONS = [
  constant TRIVIAL_MESSAGE_MAX_CHARS (line 46) | const TRIVIAL_MESSAGE_MAX_CHARS = 15;
  constant TRIVIAL_MESSAGE_MAX_WORDS (line 47) | const TRIVIAL_MESSAGE_MAX_WORDS = 3;
  constant MAX_TITLE_LENGTH (line 48) | const MAX_TITLE_LENGTH = 80;
  function isTrivialMessage (line 56) | function isTrivialMessage(message: string): boolean {
  function sanitizeTitle (line 63) | function sanitizeTitle(raw: string): string {
  function generateTitleFromMessage (line 99) | async function generateTitleFromMessage(
  function generateTitleAndEmojiFromMessage (line 138) | async function generateTitleAndEmojiFromMessage(
  function generateThreadTitle (line 196) | 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 5) | type ZodObjectSchema = z.ZodObject<z.ZodRawShape>;
  constant UPDATE_WORKING_MEMORY_TOOL_NAME (line 7) | const UPDATE_WORKING_MEMORY_TOOL_NAME = 'update_working_memory';
  constant WORKING_MEMORY_DEFAULT_INSTRUCTION (line 13) | const WORKING_MEMORY_DEFAULT_INSTRUCTION = [
  function buildWorkingMemoryInstruction (line 29) | function buildWorkingMemoryInstruction(
  function templateFromSchema (line 57) | function templateFromSchema(schema: ZodObjectSchema): string {
  type WorkingMemoryToolConfig (line 66) | interface WorkingMemoryToolConfig {
  function buildWorkingMemoryTool (line 82) | function buildWorkingMemoryTool(config: WorkingMemoryToolConfig): BuiltT...

FILE: packages/@n8n/agents/src/sdk/agent.ts
  constant DEFAULT_LAST_MESSAGES (line 41) | const DEFAULT_LAST_MESSAGES = 10;
  type ToolParameter (line 43) | type ToolParameter = BuiltTool | { build(): BuiltTool };
  type AgentSnapshot (line 49) | interface AgentSnapshot {
  class Agent (line 82) | class Agent implements BuiltAgent, AgentBuilder {
    method constructor (line 131) | constructor(name: string) {
    method hasCheckpointStorage (line 135) | hasCheckpointStorage(): boolean {
    method hasMemory (line 139) | hasMemory(): boolean {
    method model (line 155) | model(providerOrIdOrConfig: string | ModelConfig, modelName?: string):...
    method instructions (line 165) | instructions(text: string, options?: { providerOptions?: ProviderOptio...
    method tool (line 172) | tool(t: ToolParameter | ToolParameter[]): this {
    method providerTool (line 185) | providerTool(builtProviderTool: BuiltProviderTool): this {
    method declaredTools (line 191) | get declaredTools(): BuiltTool[] {
    method memory (line 196) | memory(m: MemoryConfig | Memory | BuiltMemory): this {
    method middleware (line 222) | middleware(m: AgentMiddleware): this {
    method inputGuardrail (line 229) | inputGuardrail(g: BuiltGuardrail | { build(): BuiltGuardrail }): this {
    method outputGuardrail (line 235) | outputGuardrail(g: BuiltGuardrail | { build(): BuiltGuardrail }): this {
    method eval (line 241) | eval(e: Eval | BuiltEval | { ensureBuilt(): BuiltEval }): this {
    method checkpoint (line 263) | checkpoint(storage: 'memory' | CheckpointStore): this {
    method structuredOutput (line 286) | structuredOutput(schema: z.ZodType): this {
    method thinking (line 308) | thinking<P extends Provider>(_provider: P, config?: ThinkingConfigFor<...
    method telemetry (line 314) | telemetry(t: Telemetry | BuiltTelemetry): this {
    method declaredTelemetry (line 326) | protected get declaredTelemetry(): Telemetry | undefined {
    method toolCallConcurrency (line 337) | toolCallConcurrency(n: number): this {
    method requireToolApproval (line 350) | requireToolApproval(): this {
    method workspace (line 359) | workspace(ws: Workspace): this {
    method mcp (line 382) | mcp(client: McpClient): this {
    method evaluations (line 388) | get evaluations(): BuiltEval[] {
    method on (line 396) | on(event: AgentEvent, handler: AgentEventHandler): void {
    method asTool (line 412) | asTool(description: string): BuiltTool {
    method snapshot (line 465) | get snapshot(): AgentSnapshot {
    method getState (line 501) | getState(): SerializableAgentState {
    method abort (line 517) | abort(): void {
    method generate (line 522) | async generate(
    method stream (line 531) | async stream(
    method resume (line 550) | async resume(
    method approve (line 564) | async approve(
    method deny (line 576) | async deny(
    method ensureBuilt (line 591) | private async ensureBuilt(): Promise<AgentRuntime> {
    method toMessages (line 602) | private toMessages(input: string | AgentMessage[]): AgentMessage[] {
    method build (line 608) | 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 8) | function extractText(messages: AgentMessage[]): string {
  class Eval (line 45) | class Eval {
    method constructor (line 58) | constructor(name: string) {
    method description (line 63) | description(desc: string): this {
    method model (line 69) | model(modelId: string): this {
    method credential (line 76) | credential(name: string): this {
    method check (line 85) | check(fn: CheckFn): this {
    method judge (line 99) | judge(fn: JudgeHandlerFn): this {
    method name (line 108) | get name(): string {
    method build (line 113) | protected build(): BuiltEval {
    method ensureBuilt (line 171) | ensureBuilt(): BuiltEval {
    method run (line 177) | 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 serverNames (line 73) | get serverNames(): string[] {
    method connect (line 81) | async connect(): Promise<void> {
    method listTools (line 91) | async listTools(): Promise<BuiltTool[]> {
    method close (line 106) | async close(): Promise<void> {
    method verify (line 128) | async verify(): Promise<McpVerifyResult> {
    method declaresApproval (line 172) | declaresApproval(): boolean {
    method doListTools (line 176) | private async doListTools(): Promise<BuiltTool[]> {
    method doClose (line 228) | 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 47) | get lastMessageCount(): number {
    method storage (line 57) | storage(backend: 'memory' | BuiltMemory): this {
    method lastMessages (line 67) | lastMessages(count: number): this {
    method semanticRecall (line 73) | semanticRecall(config: SemanticRecallConfig): this {
    method structured (line 82) | structured(schema: ZodObjectSchema): this {
    method freeform (line 91) | freeform(template: string): this {
    method scope (line 102) | scope(s: 'resource' | 'thread'): this {
    method instruction (line 122) | instruction(text: string): this {
    method titleGeneration (line 136) | titleGeneration(config: boolean | TitleGenerationConfig): this {
    method build (line 154) | build(): MemoryConfig {

FILE: packages/@n8n/agents/src/sdk/message.ts
  function getCreatedAt (line 3) | function getCreatedAt(message: AgentMessage): Date | null {
  function isLlmMessage (line 19) | function isLlmMessage(message: AgentMessage): message is Message {
  function filterLlmMessages (line 23) | 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-capabilities.ts
  type ProviderCapability (line 1) | interface ProviderCapability {

FILE: packages/@n8n/agents/src/sdk/provider-tools.ts
  type AnthropicWebSearchConfig (line 3) | interface AnthropicWebSearchConfig {
  type OpenAIWebSearchConfig (line 16) | interface OpenAIWebSearchConfig {
  method anthropicWebSearch (line 63) | anthropicWebSearch(config?: AnthropicWebSearchConfig): BuiltProviderTool {
  method openaiWebSearch (line 109) | openaiWebSearch(config?: OpenAIWebSearchConfig): BuiltProviderTool {
  method openaiImageGeneration (line 131) | 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 10) | const APPROVAL_SUSPEND_SCHEMA = z.object({
  constant APPROVAL_RESUME_SCHEMA (line 16) | const APPROVAL_RESUME_SCHEMA = z.object({
  type ZodOrJsonSchema (line 20) | type ZodOrJsonSchema = z.ZodType | JSONSchema7;
  type OutputType (line 22) | type OutputType<TOutput> = TOutput extends z.ZodType ? z.infer<TOutput> ...
  type ApprovalConfig (line 24) | interface ApprovalConfig {
  function wrapToolForApproval (line 39) | function wrapToolForApproval(tool: BuiltTool, config: ApprovalConfig): B...
  type HandlerContext (line 75) | type HandlerContext<S, R> = S extends z.ZodType
  class Tool (line 99) | class Tool<
    method constructor (line 134) | constructor(name: string) {
    method description (line 139) | description(desc: string): this {
    method systemInstruction (line 153) | systemInstruction(text: string): this {
    method input (line 159) | input<S extends ZodOrJsonSchema>(schema: S): Tool<S, TOutput, TSuspend...
    method output (line 166) | output<S extends ZodOrJsonSchema>(schema: S): Tool<TInput, S, TSuspend...
    method suspend (line 173) | suspend<S extends ZodOrJsonSchema>(schema: S): Tool<TInput, TOutput, S...
    method resume (line 180) | resume<R extends ZodOrJsonSchema>(schema: R): Tool<TInput, TOutput, TS...
    method handler (line 190) | handler(
    method toMessage (line 200) | toMessage(toMessage: (output: OutputType<TOutput>) => AgentMessage): t...
    method toModelOutput (line 212) | toModelOutput(fn: (output: OutputType<TOutput>) => unknown): this {
    method requireApproval (line 218) | requireApproval(): this {
    method needsApprovalFn (line 224) | needsApprovalFn(fn: (args: OutputType<TInput>) => Promise<boolean> | b...
    method providerOptions (line 235) | providerOptions(options: Record<string, JSONObject>): this {
    method build (line 246) | build(): BuiltTool {
    method describe (line 310) | describe(): ToolDescriptor {

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/base-memory.ts
  method constructor (line 9) | constructor(
  method getThread (line 14) | getThread(_threadId: string): Promise<Thread | null> {
  method saveThread (line 17) | saveThread(_thread: Omit<Thread, 'createdAt' | 'updatedAt'>): Promise<Th...
  method deleteThread (line 20) | deleteThread(_threadId: string): Promise<void> {
  method getMessages (line 23) | getMessages(
  method saveMessages (line 29) | saveMessages(_args: {
  method deleteMessages (line 36) | deleteMessages(_messageIds: string[]): Promise<void> {
  method search (line 39) | search?(
  method getWorkingMemory (line 51) | getWorkingMemory?(_params: {
  method saveWorkingMemory (line 58) | saveWorkingMemory?(
  method saveEmbeddings (line 64) | saveEmbeddings?(_opts: {
  method queryEmbeddings (line 72) | queryEmbeddings?(_opts: {
  method close (line 82) | close?(): Promise<void> {
  method describe (line 86) | describe(): MemoryDescriptor<TConstructorOptions> {

FILE: packages/@n8n/agents/src/storage/postgres-memory.ts
  type ThreadRow (line 7) | interface ThreadRow {
  type MessageRow (line 16) | interface MessageRow {
  type EmbeddingDimRow (line 25) | interface EmbeddingDimRow {
  type EmbeddingResultRow (line 29) | interface EmbeddingResultRow {
  function parseJsonSafe (line 35) | function parseJsonSafe(text: string): unknown {
  type PostgresConnectionOptions (line 43) | type PostgresConnectionOptions =
  type PostgresMemoryOptions (line 60) | type PostgresMemoryOptions = {
  type PostgresConstructorOptions (line 85) | type PostgresConstructorOptions = (
  class PostgresMemory (line 98) | class PostgresMemory extends BaseMemory<PostgresConstructorOptions> {
    method constructor (line 105) | constructor(
    method ensureInitialized (line 123) | private async ensureInitialized(): Promise<Pool> {
    method _initialize (line 131) | private async _initialize(): Promise<Pool> {
    method getThread (line 219) | async getThread(threadId: string): Promise<Thread | null> {
    method saveThread (line 240) | async saveThread(thread: Omit<Thread, 'createdAt' | 'updatedAt'>): Pro...
    method deleteThread (line 270) | async deleteThread(threadId: string): Promise<void> {
    method getMessages (line 300) | async getMessages(
    method saveMessages (line 358) | async saveMessages(args: {
    method deleteMessages (line 400) | async deleteMessages(messageIds: string[]): Promise<void> {
    method getWorkingMemory (line 423) | async getWorkingMemory(params: {
    method saveWorkingMemory (line 439) | async saveWorkingMemory(
    method ensureEmbeddingsTable (line 466) | private async ensureEmbeddingsTable(pool: Pool, dimension: number): Pr...
    method _initializeEmbeddingsTable (line 482) | private async _initializeEmbeddingsTable(pool: Pool, dimension: number...
    method saveEmbeddings (line 526) | async saveEmbeddings(opts: {
    method queryEmbeddings (line 576) | async queryEmbeddings(opts: {
    method close (line 628) | async close(): Promise<void> {

FILE: packages/@n8n/agents/src/storage/sqlite-memory.ts
  function parseJsonSafe (line 9) | function parseJsonSafe(text: string): unknown {
  function float32ToBuffer (line 18) | function float32ToBuffer(arr: number[]): Buffer {
  type SqliteMemoryConfig (line 33) | type SqliteMemoryConfig = z.infer<typeof SqliteMemoryConfigSchema>;
  class SqliteMemory (line 35) | class SqliteMemory extends BaseMemory<SqliteMemoryConfig> {
    method constructor (line 44) | constructor(protected readonly constructorOptions: SqliteMemoryConfig) {
    method ensureInitialized (line 52) | private async ensureInitialized(): Promise<Client> {
    method _initialize (line 60) | private async _initialize(): Promise<Client> {
    method getThread (line 98) | async getThread(threadId: string): Promise<Thread | null> {
    method saveThread (line 120) | async saveThread(thread: Omit<Thread, 'createdAt' | 'updatedAt'>): Pro...
    method deleteThread (line 142) | async deleteThread(threadId: string): Promise<void> {
    method getMessages (line 165) | async getMessages(
    method saveMessages (line 219) | async saveMessages(args: {
    method deleteMessages (line 244) | async deleteMessages(messageIds: string[]): Promise<void> {
    method getWorkingMemory (line 270) | async getWorkingMemory(params: { threadId: string; resourceId?: string...
    method saveWorkingMemory (line 285) | async saveWorkingMemory(
    method ensureEmbeddingsTable (line 310) | private async ensureEmbeddingsTable(db: Client, dimension: number): Pr...
    method _initializeEmbeddingsTable (line 324) | private async _initializeEmbeddingsTable(db: Client, dimension: number...
    method saveEmbeddings (line 363) | async saveEmbeddings(opts: {
    method queryEmbeddings (line 400) | 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-builder.ts
  type AgentBuilder (line 16) | interface AgentBuilder {

FILE: packages/@n8n/agents/src/types/sdk/agent.ts
  type FinishReason (line 13) | type FinishReason = 'stop' | 'length' | 'content-filter' | 'tool-calls' ...
  type TokenUsage (line 15) | type TokenUsage<T extends Record<string, unknown> = Record<string, unkno...
  type TypedModelConfig (line 35) | type TypedModelConfig = {
  type ModelConfig (line 39) | type ModelConfig =
  type AgentResult (line 46) | interface AgentResult {
  type StreamChunk (line 63) | type StreamChunk = ContentMetadata &
  type RunOptions (line 118) | interface RunOptions {
  type ExecutionOptions (line 122) | interface ExecutionOptions {
  type PersistedExecutionOptions (line 130) | interface PersistedExecutionOptions {
  type ToolResultEntry (line 134) | interface ToolResultEntry {
  type SubAgentUsage (line 142) | interface SubAgentUsage {
  type GenerateResult (line 151) | interface GenerateResult {
  type StreamResult (line 188) | interface StreamResult {
  type ResumeOptions (line 195) | interface ResumeOptions {
  type BuiltAgent (line 200) | interface BuiltAgent {
  type AgentRunState (line 244) | type AgentRunState =
  type AgentResumeData (line 253) | interface AgentResumeData {
  type PendingToolCall (line 260) | type PendingToolCall = {
  type SerializableAgentState (line 276) | interface SerializableAgentState {
  type AgentPersistenceOptions (line 287) | type AgentPersistenceOptions = {

FILE: packages/@n8n/agents/src/types/sdk/credential-provider.ts
  type ResolvedCredential (line 2) | type ResolvedCredential = {
  type CredentialListItem (line 7) | interface CredentialListItem {
  type CredentialProvider (line 29) | interface CredentialProvider {

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 47) | interface EvalRunResult {
  type EvalResults (line 55) | 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/handler-executor.ts
  type HandlerExecutor (line 8) | interface HandlerExecutor {

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 MemoryDescriptor (line 11) | interface MemoryDescriptor<TParams extends JSONObject = JSONObject> {
  type Thread (line 20) | interface Thread {
  type BuiltMemory (line 29) | interface BuiltMemory {
  type SemanticRecallConfig (line 107) | interface SemanticRecallConfig {
  type TitleGenerationConfig (line 117) | interface TitleGenerationConfig {
  type MemoryConfig (line 127) | interface MemoryConfig {
  type CheckpointStore (line 161) | 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 16) | interface ContentMetadata {
  type ContentCitation (line 21) | type ContentCitation = ContentMetadata & {
  type ContentText (line 52) | type ContentText = ContentMetadata & {
  type ContentReasoning (line 60) | type ContentReasoning = ContentMetadata & {
  type ContentFile (line 65) | type ContentFile = ContentMetadata & {
  type ContentToolCall (line 86) | type ContentToolCall = ContentMetadata & {
  type ContentInvalidToolCall (line 112) | type ContentInvalidToolCall = ContentMetadata & {
  type ContentProvider (line 136) | type ContentProvider = ContentMetadata & {
  type Message (line 142) | interface Message {
  type AgentMessageBase (line 151) | interface AgentMessageBase {
  type CustomAgentMessages (line 169) | interface CustomAgentMessages {
  type CustomAgentMessage (line 174) | type CustomAgentMessage = {
  type AgentMessage (line 184) | type AgentMessage = Message | CustomAgentMessage;
  type AgentDbMessage (line 186) | type AgentDbMessage = { id: string; createdAt: Date } & 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-descriptor.ts
  type ToolDescriptor (line 3) | interface ToolDescriptor {

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 88) | 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/parse.ts
  type ParseResult (line 7) | type ParseResult<T = unknown> =
  function getAjv (line 13) | function getAjv(): InstanceType<typeof AjvType> {
  function parseWithSchema (line 26) | async function parseWithSchema(

FILE: packages/@n8n/agents/src/utils/zod.ts
  function isZodSchema (line 6) | function isZodSchema(schema: unknown): schema is ZodType {
  function zodToJsonSchema (line 14) | function zodToJsonSchema(schema?: unknown): JSONSchema7 | null {

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 293) | async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
  method supplyData (line 351) | 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 EvaluationArgs (line 21) | interface EvaluationArgs {
  type CliValueKind (line 75) | type CliValueKind = 'boolean' | 'string';
  type FlagGroup (line 76) | type FlagGroup =
  type CliKey (line 143) | type CliKey = keyof z.infer<typeof cliSchema>;
  type FlagDef (line 145) | type FlagDef = { key: CliKey; kind: CliValueKind; desc: string; group: F...
  constant FLAG_DEFS (line 147) | const FLAG_DEFS: Record<string, FlagDef> = {
  constant FLAG_ALIASES (line 339) | const FLAG_ALIASES: Record<string, string> = {
  constant FLAG_TO_KEY (line 345) | const FLAG_TO_KEY: Record<string, FlagDef> = {
  function formatValidFlags (line 352) | function formatValidFlags(): string {
  constant GROUP_TITLES (line 359) | const GROUP_TITLES: Record<FlagGroup, string> = {
  function formatHelp (line 370) | function formatHelp(): string {
  function printHelp (line 411) | function printHelp(): void {
  function ensureValue (line 415) | function ensureValue(argv: string[], i: number, flag: string): string {
  function splitFlagToken (line 421) | function splitFlagToken(token: string): { flag: string; inlineValue?: st...
  function isStringArray (line 428) | function isStringArray(value: unknown): value is string[] {
  function parseCli (line 432) | function parseCli(argv: string[]): {
  function parseFeatureFlags (line 472) | function parseFeatureFlags(args: {
  function parseFilters (line 490) | function parseFilters(args: {
  function parseEvaluationArgs (line 533) | function parseEvaluationArgs(argv: string[] = process.argv.slice(2)): Ev...
  function argsToStageModels (line 611) | function argsToStageModels(args: EvaluationArgs): StageModels {
  function getDefaultExperimentName (line 623) | function getDefaultExperimentName(suite: EvaluationSuite): string {
  function getDefaultDatasetName (line 627) | 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/index.ts
  function isSimpleWorkflow (line 20) | function isSimpleWorkflow(value: unknown): value is SimpleWorkflow {
  function isWorkflowUpdateChunk (line 83) | function isWorkflowUpdateChunk(chunk: StreamChunk): chunk is WorkflowUpd...
  function hasCoordinationLog (line 90) | function hasCoordinationLog(
  function reportSubgraphMetrics (line 101) | function reportSubgraphMetrics(
  function createWorkflowGenerator (line 126) | function createWorkflowGenerator(
  function createEvaluators (line 200) | function createEvaluators(params: {
  function buildHistoryContextFromMessages (line 243) | function buildHistoryContextFromMessages(messages: unknown[]): HistoryCo...
  function isUnknownRecord (line 287) | function isUnknownRecord(value: unknown): value is Record<string, unknow...
  function processCodeBuilderMessage (line 292) | function processCodeBuilderMessage(
  function createCodeWorkflowBuilderGenerator (line 321) | function createCodeWorkflowBuilderGenerator(
  function loadTestCases (line 424) | function loadTestCases(args: ReturnType<typeof parseEvaluationArgs>): Te...
  function runV2Evaluation (line 473) | 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 60) | function makeCtx(overrides?: Partial<BinaryCheckContext>): BinaryCheckCo...
  function makeWorkflow (line 65) | 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 23) | const DETERMINISTIC_CHECKS: BinaryCheck[] = [

FILE: packages/@n8n/ai-workflow-builder.ee/evaluations/evaluators/binary-checks/checks/no-code-imports.ts
  constant JS_IMPORT_PATTERNS (line 9) | const JS_IMPORT_PATTERNS = [/\brequire\s*\(/, /\bimport\s+[\s\S]*?\s+fro...
  constant PYTHON_IMPORT_PATTERNS (line 17) | const PYTHON_IMPORT_PATTERNS = [
  constant LANGUAGE_CONFIG (line 23) | const LANGUAGE_CONFIG: Record<string, [string, RegExp[]]> = {
  function getCodeAndPatterns (line 28) | function getCodeAndPatterns(
  function detectImports (line 40) | function detectImports(code: string, patterns: RegExp[]): boolean {
  method run (line 47) | async run(workflow: SimpleWorkflow) {

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 23) | interface PairwiseEvaluatorOptions {
  function createPairwiseEvaluator (line 42) | 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 GenerationResult (line 271) | interface GenerationResult {
  function isGenerationResult (line 282) | function isGenerationResult(
  type RunSummary (line 296) | interface RunSummary {
  type EvaluationLifecycle (line 316) | interface EvaluationLifecycle {

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/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 27) | type OnCreditsUpdated = (userId: string, creditsQuota: number, creditsCl...
  type OnTelemetryEvent (line 29) | type OnTelemetryEvent = (event: string, properties: ITelemetryTrackPrope...
  class AiWorkflowBuilderService (line 32) | class AiWorkflowBuilderService {
    method constructor (line 37) | constructor(
    method updateNodeTypes (line 59) | updateNodeTypes(nodeTypes: INodeTypeDescription[]) {
    method getAnthropicClaudeModel (line 64) | private static async getAnthropicClaudeModel({
    method getApiProxyAuthHeaders (line 84) | private async getApiProxyAuthHeaders(user: IUser, userMessageId: strin...
    method setupModels (line 100) | private async setupModels(
    method filterNodeTypes (line 157) | private filterNodeTypes(nodeTypes: INodeTypeDescription[]): INodeTypeD...
    method getAgent (line 194) | private async getAgent(user: IUser, userMessageId: string, featureFlag...
    method onGenerationSuccess (line 241) | private async onGenerationSuccess(
    method chat (line 264) | async *chat(payload: ChatPayload, user: IUser, abortSignal?: AbortSign...
    method storeHitlInteraction (line 323) | private storeHitlInteraction(
    method extractLastAiMessageContent (line 360) | private extractLastAiMessageContent(messages: BaseMessage[]): string {
    method extractUniqueToolNames (line 369) | private extractUniqueToolNames(messages: BaseMessage[]): string[] {
    method trackBuilderReplyTelemetry (line 382) | private async trackBuilderReplyTelemetry(
    method getSessions (line 420) | async getSessions(workflowId: string | undefined, user?: IUser) {
    method getBuilderInstanceCredits (line 425) | async getBuilderInstanceCredits(
    method truncateMessagesAfter (line 443) | async truncateMessagesAfter(
    method loadSessionMessagesSafe (line 462) | private async loadSessionMessagesSafe(threadId: string) {
    method saveSessionSafe (line 478) | private async saveSessionSafe(
    method clearSession (line 497) | async clearSession(workflowId: string, user: IUser): Promise<void> {
    method extractHitlFromStreamOutput (line 537) | 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(
    method searchByConnectionType (line 183) | searchByConnectionType(
    method formatResult (line 254) | formatResult(result: CodeBuilderNodeSearchResult): string {
    method getSubnodesForConnectionType (line 302) | getSubnodesForConnectionType(connectionType: string): string[] {
    method getRelatedSubnodeIds (line 315) | getRelatedSubnodeIds(nodeIds: string[], excludeNodeIds: Set<string>): ...
    method getNodeType (line 356) | getNodeType(nodeId: string): INodeTypeDescription | undefined {
    method getConnectionScore (line 366) | private getConnectionScore(
    method isAiConnectionType (line 392) | static isAiConnectionType(connectionType: string): boolean {
    method getAiConnectionTypes (line 400) | 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
  class WorkflowCodeParseError (line 20) | class WorkflowCodeParseError extends Error {
    method constructor (line 21) | constructor(message: string, options?: ErrorOptions) {
  type ParseValidateHandlerConfig (line 30) | interface ParseValidateHandlerConfig {
  type ValidationIssue (line 45) | interface ValidationIssue {
  class ParseValidateHandler (line 51) | class ParseValidateHandler {
    method constructor (line 55) | constructor(config: ParseValidateHandlerConfig = {}) {
    method collectValidationIssues (line 64) | private collectValidationIssues(
    method validateExistingWorkflow (line 103) | validateExistingWorkflow(json: WorkflowJSON): ValidationWarning[] {
    method parseAndValidate (line 134) | async parseAndValidate(
    method getErrorContext (line 228) | getErrorContext(code: string, errorMessage: string): string {
    method detectFixHint (line 268) | 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: TextEditorCom
Copy disabled (too large) Download .json
Condensed preview — 17655 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (120,168K 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": ".claude/README.md",
    "chars": 1303,
    "preview": "# Claude Code Configuration\n\nThis directory contains shared Claude Code configuration for the n8n team.\n\nAll skills, age"
  },
  {
    "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": 143,
    "preview": "{\n  \"name\": \"n8n\",\n  \"version\": \"0.2.0\",\n  \"description\": \"n8n Claude Code plugin — shared skills, commands, and agents "
  },
  {
    "path": ".claude/plugins/n8n/README.md",
    "chars": 1496,
    "preview": "# n8n Claude Code Plugin\n\nShared skills, commands, and agents for n8n development. All items are\nnamespaced under `n8n:`"
  },
  {
    "path": ".claude/plugins/n8n/agents/developer.md",
    "chars": 3067,
    "preview": "---\nname: developer\ndescription: Use this agent for any n8n development task - frontend (Vue 3), backend (Node.js/TypeSc"
  },
  {
    "path": ".claude/plugins/n8n/agents/linear-issue-triager.md",
    "chars": 4935,
    "preview": "---\nname: linear-issue-triager\ndescription: Use this agent proactively when a Linear issue is created, updated, or needs"
  },
  {
    "path": ".claude/plugins/n8n/commands/plan.md",
    "chars": 1042,
    "preview": "---\ndescription: Plan n8n Linear ticket implementation\nargument-hint: [PAY-XXXX | DEV-XXXX | ENG-XXXX]\nallowed-tools: Ta"
  },
  {
    "path": ".claude/plugins/n8n/commands/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/scripts/track-skill-usage.mjs",
    "chars": 1695,
    "preview": "#!/usr/bin/env node\n\n// Tracks n8n plugin skill usage by sending anonymized analytics.\n// Called as a PostToolUse hook f"
  },
  {
    "path": ".claude/plugins/n8n/skills/community-pr-review/SKILL.md",
    "chars": 6241,
    "preview": "---\ndescription: >-\n  Checks if a community pull request is ready for human review. Verifies CLA\n  signature, PR title f"
  },
  {
    "path": ".claude/plugins/n8n/skills/content-design/SKILL.md",
    "chars": 13745,
    "preview": "---\nname: n8n:content-design\ndescription: >\n  Product content designer for UI copy. Use when writing, reviewing, or audi"
  },
  {
    "path": ".claude/plugins/n8n/skills/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/plugins/n8n/skills/create-community-node-lint-rule/SKILL.md",
    "chars": 6418,
    "preview": "---\nname: n8n:create-community-node-lint-rule\ndescription: >-\n  Create new ESLint rules for the @n8n/eslint-plugin-commu"
  },
  {
    "path": ".claude/plugins/n8n/skills/create-community-node-lint-rule/reference.md",
    "chars": 3685,
    "preview": "# AST & File Utilities Reference\n\nHelpers available from `../utils/index.js`. Use these instead of writing custom AST tr"
  },
  {
    "path": ".claude/plugins/n8n/skills/create-issue/SKILL.md",
    "chars": 11451,
    "preview": "---\nname: n8n:create-issue\ndescription: Create Linear tickets or GitHub issues following n8n conventions. Use when the u"
  },
  {
    "path": ".claude/plugins/n8n/skills/create-pr/SKILL.md",
    "chars": 6451,
    "preview": "---\nname: n8n:create-pr\ndescription: Creates GitHub pull requests with properly formatted titles that pass the check-pr-"
  },
  {
    "path": ".claude/plugins/n8n/skills/create-skill/SKILL.md",
    "chars": 6032,
    "preview": "---\nname: n8n:create-skill\ndescription: >-\n  Guides users through creating effective Agent Skills. Use when you want to\n"
  },
  {
    "path": ".claude/plugins/n8n/skills/design-system/SKILL.md",
    "chars": 2144,
    "preview": "---\nname: n8n:design-system\ndescription: Guidelines on using Design System styles and components. Use when working on .v"
  },
  {
    "path": ".claude/plugins/n8n/skills/design-system/rules/web-animation-guidelines.md",
    "chars": 3103,
    "preview": "# Web Motion Guidelines\nDesign and implement web animations that feel natural and purposeful\n\n## Timing and Duration\n\n##"
  },
  {
    "path": ".claude/plugins/n8n/skills/design-system/rules/web-interface-guidelines.md",
    "chars": 8083,
    "preview": "# Web Interface Guidelines\n<!-- credit to https://github.com/raunofreiberg/interfaces -->\nThis document outlines a non-e"
  },
  {
    "path": ".claude/plugins/n8n/skills/linear-issue/SKILL.md",
    "chars": 11147,
    "preview": "---\nname: n8n:linear-issue\ndescription: Fetch and analyze Linear issue with all related context. Use when starting work "
  },
  {
    "path": ".claude/plugins/n8n/skills/loom-transcript/SKILL.md",
    "chars": 3635,
    "preview": "---\nname: n8n:loom-transcript\ndescription: Fetch and display the full transcript from a Loom video URL. Use when the use"
  },
  {
    "path": ".claude/plugins/n8n/skills/node-add-oauth/SKILL.md",
    "chars": 11359,
    "preview": "---\nname: n8n:node-add-oauth\ndescription: Add OAuth2 credential support to an existing n8n node — creates the credential"
  },
  {
    "path": ".claude/plugins/n8n/skills/protect-endpoints/SKILL.md",
    "chars": 7182,
    "preview": "---\nname: n8n:protect-endpoints\ndescription: Applies n8n's RBAC scope decorators to REST endpoints. Use when creating a "
  },
  {
    "path": ".claude/plugins/n8n/skills/reproduce-bug/SKILL.md",
    "chars": 5189,
    "preview": "---\nname: n8n:reproduce-bug\ndescription: Reproduce a bug from a Linear ticket with a failing test. Expects the full tick"
  },
  {
    "path": ".claude/plugins/n8n/skills/setup-mcps/SKILL.md",
    "chars": 2710,
    "preview": "---\nname: n8n:setup-mcps\ndescription: >-\n  Configure MCP servers for n8n development. Use when the user says /setup-mcps"
  },
  {
    "path": ".claude/plugins/n8n/skills/spec-driven-development/SKILL.md",
    "chars": 3211,
    "preview": "---\nname: n8n:spec-driven-development\ndescription: Keeps implementation and specs in sync. Use when working on a feature"
  },
  {
    "path": ".claude/settings.json",
    "chars": 746,
    "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": ".code-health-baseline.json",
    "chars": 22224,
    "preview": "{\n\t\"version\": 1,\n\t\"generated\": \"2026-04-23T08:42:21.615Z\",\n\t\"totalViolations\": 102,\n\t\"violations\": {\n\t\t\"packages/@n8n/ag"
  },
  {
    "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": 188,
    "preview": "packages/@n8n/db/src/migrations/ @n8n-io/migrations-review\n.github/workflows @n8n-io/qa-dx\n.github/scripts @n8n-io/qa-dx"
  },
  {
    "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": 31343,
    "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/build-n8n-docker/action.yml",
    "chars": 1898,
    "preview": "# Builds the n8n and runners CI test images (n8nio/n8n:local +\n# n8nio/runners:local) and caches the tarball under a SHA"
  },
  {
    "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": 1517,
    "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": 5430,
    "preview": "import { execSync } from 'node:child_process';\nimport { appendFileSync } from 'node:fs';\nimport { fileURLToPath } from '"
  },
  {
    "path": ".github/actions/docker-registry-login/action.yml",
    "chars": 1908,
    "preview": "# Composite action for logging into Docker registries (GHCR and/or DockerHub).\n# Centralizes the login pattern used acro"
  },
  {
    "path": ".github/actions/load-n8n-docker/action.yml",
    "chars": 885,
    "preview": "# Restores the n8n + runners image tarball (produced by build-n8n-docker\n# under the SHA-derived cache key) and loads bo"
  },
  {
    "path": ".github/actions/setup-nodejs/action.yml",
    "chars": 3936,
    "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": 1266,
    "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": 9444,
    "preview": "import semver from 'semver';\nimport { parse } from 'yaml';\nimport { writeFile, readFile } from 'fs/promises';\nimport { r"
  },
  {
    "path": ".github/scripts/bump-versions.test.mjs",
    "chars": 13474,
    "preview": "/**\n * Run these tests with:\n *\n * node --test ./.github/scripts/bump-versions.test.mjs\n */\n\nimport { describe, it } fro"
  },
  {
    "path": ".github/scripts/claude-task/prepare-claude-prompt.mjs",
    "chars": 2491,
    "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": 3887,
    "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": 486,
    "preview": "{\n  \"name\": \"workflow-scripts\",\n  \"scripts\": {\n    \"test\": \"node --test --experimental-test-module-mocks ./*.test.mjs ./"
  },
  {
    "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/pnpm-utils.mjs",
    "chars": 569,
    "preview": "import child_process from 'child_process';\nimport { promisify } from 'node:util';\n\nconst exec = promisify(child_process."
  },
  {
    "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/post-qa-metrics-comment.mjs",
    "chars": 4050,
    "preview": "#!/usr/bin/env node\n/**\n * Fetches QA metric comparisons and posts/updates a PR comment.\n *\n * Usage:\n *   node .github/"
  },
  {
    "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/quality/check-ownership-checkbox.mjs",
    "chars": 2025,
    "preview": "/**\n * Checks that the PR description contains a checked ownership acknowledgement checkbox.\n *\n * Exit codes:\n *   0 – "
  },
  {
    "path": ".github/scripts/quality/check-ownership-checkbox.test.mjs",
    "chars": 2661,
    "preview": "import { describe, it, before, mock } from 'node:test';\nimport assert from 'node:assert/strict';\n\n/**\n * Run with:\n * no"
  },
  {
    "path": ".github/scripts/quality/check-pr-size.mjs",
    "chars": 5014,
    "preview": "/**\n * Checks that the PR does not exceed the line addition limit.\n *\n * Files matching any pattern in EXCLUDE_PATTERNS "
  },
  {
    "path": ".github/scripts/quality/check-pr-size.test.mjs",
    "chars": 8100,
    "preview": "import { describe, it, before, mock } from 'node:test';\nimport assert from 'node:assert/strict';\n\n/**\n * Run with:\n * no"
  },
  {
    "path": ".github/scripts/quality/handle-size-override.mjs",
    "chars": 2344,
    "preview": "/**\n * Re-triggers the PR Size Limit check when a maintainer comments `/size-limit-override`.\n *\n * Finds the latest `PR"
  },
  {
    "path": ".github/scripts/retry.mjs",
    "chars": 2378,
    "preview": "#!/usr/bin/env node\n/**\n * Retry a shell command with configurable attempts and delay.\n *\n * Usage (safe):   node retry."
  },
  {
    "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": 2823,
    "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/set-latest-for-monorepo-packages.mjs",
    "chars": 1998,
    "preview": "import { getMonorepoProjects } from './pnpm-utils.mjs';\n\nconst NPM_REGISTRY = 'https://registry.npmjs.org';\n\n/**\n * @par"
  },
  {
    "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": 24781,
    "preview": "{\n  \"updatedAt\": \"2026-04-23T08:33:49.040Z\",\n  \"source\": \"currents\",\n  \"projectId\": \"LRxcNt\",\n  \"specs\": {\n    \"tests/e2"
  },
  {
    "path": ".github/test-metrics/quarantine.json",
    "chars": 2382,
    "preview": "{\n  \"updatedAt\": \"2026-04-23T14:38:52.015Z\",\n  \"source\": \"currents\",\n  \"projectId\": \"LRxcNt\",\n  \"quarantined\": [\n    \"Ca"
  },
  {
    "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-pr-quality.yml",
    "chars": 3929,
    "preview": "name: 'CI: PR Quality Checks'\n\non:\n  merge_group:\n  pull_request:\n    types:\n      - opened\n      - edited\n      - synch"
  },
  {
    "path": ".github/workflows/ci-pull-request-review.yml",
    "chars": 2002,
    "preview": "name: 'CI: Pull Request Review'\n\non:\n  pull_request_review:\n    types: [submitted]\n\nconcurrency:\n  group: ci-review-${{ "
  },
  {
    "path": ".github/workflows/ci-pull-requests.yml",
    "chars": 14789,
    "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": 2923,
    "preview": "name: 'CI: Check merge source and destination'\n\non:\n  pull_request:\n    branches:\n      - master\n      - 1.x\n\npermission"
  },
  {
    "path": ".github/workflows/docker-build-push.yml",
    "chars": 19909,
    "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/prepare-docker-reusable.yml",
    "chars": 1524,
    "preview": "name: 'Prepare n8n Docker (reusable)'\n\n# Reusable workflow that ensures the n8n + runners CI test images for the\n# curre"
  },
  {
    "path": ".github/workflows/release-build-daytona-snapshot.yml",
    "chars": 1164,
    "preview": "name: 'Release: Build Daytona snapshot'\n\non:\n  workflow_call:\n    inputs:\n      n8n_version:\n        description: 'n8n v"
  },
  {
    "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 8 * * 2 # 9am 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": 1827,
    "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": 3091,
    "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": 8673,
    "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": 454,
    "preview": "name: 'Release: Schedule Patch Release PRs'\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 8 * * 3-5,1' # 9am CET "
  },
  {
    "path": ".github/workflows/release-set-stable-npm-packages-to-latest.yml",
    "chars": 868,
    "preview": "name: 'Release: Set stable npm packages to latest'\n\non:\n  workflow_call:\n  workflow_dispatch:\n\npermissions:\n  contents: "
  },
  {
    "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": 2936,
    "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": 4014,
    "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": 11649,
    "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": 1036,
    "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-dev-server-smoke-reusable.yml",
    "chars": 1508,
    "preview": "name: 'Test: Dev-server boot smoke'\n\non:\n  workflow_call:\n    inputs:\n      ref:\n        description: 'Git 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-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": 1409,
    "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": 592,
    "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": 5768,
    "preview": "name: 'Test: E2E'\n\non:\n  workflow_call:\n    inputs:\n      branch:\n        description: 'GitHub branch to test.'\n        "
  },
  {
    "path": ".github/workflows/test-e2e-vm-expressions-nightly.yml",
    "chars": 1615,
    "preview": "name: 'Test: E2E VM Expressions Nightly'\n\non:\n  schedule:\n    - cron: '0 4 * * *'\n  workflow_dispatch:\n    inputs:\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": 4186,
    "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-instance-ai.yml",
    "chars": 7629,
    "preview": "name: 'Test: Instance AI Exec Evals'\n\non:\n  workflow_call:\n    inputs:\n      branch:\n        description: 'GitHub branch"
  },
  {
    "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": 807,
    "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": 7689,
    "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": 1833,
    "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": 1707,
    "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": 1407,
    "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": 7291,
    "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": 2056,
    "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-qa-metrics-comment-reusable.yml",
    "chars": 1453,
    "preview": "name: 'QA: Metrics PR Comment'\n\non:\n  workflow_call:\n    inputs:\n      metrics:\n        description: 'Comma-separated li"
  },
  {
    "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": 1316,
    "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": 10339,
    "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": 1496832,
    "preview": "# [2.20.0](https://github.com/n8n-io/n8n/compare/n8n@2.19.0...n8n@2.20.0) (2026-05-05)\n\n\n### Bug Fixes\n\n* **ai-builder:*"
  },
  {
    "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": 18438,
    "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"
  }
]

// ... and 17455 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 17655 files (104.2 MB), approximately 27.4M tokens, and a symbol index with 38461 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!