Compare commits

..

23 Commits

Author SHA1 Message Date
n8n-assistant[bot]
aa3d214338
🚀 Release 2.31.5 (#34699)
Co-authored-by: CharlieKolb <13814565+CharlieKolb@users.noreply.github.com>
2026-07-22 10:03:36 +00:00
n8n-assistant[bot]
f6cb6cf3ab
chore: Bundle/2.x (backport to release-candidate/2.31.x) (#34688)
Co-authored-by: n8n-assistant[bot] <100856346+n8n-assistant[bot]@users.noreply.github.com>
Co-authored-by: Charlie Kolb <charlie@n8n.io>
2026-07-22 10:59:50 +02:00
n8n-assistant[bot]
6a8d4e9a9b
fix(core): Coerce AWS request header values to strings before signing (backport to release-candidate/2.31.x) (#34568)
Co-authored-by: Ilfat Mindubaev <ilfat.mindubaev@n8n.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 05:41:48 +00:00
n8n-assistant[bot]
5b3b09d579
fix(editor): Keep dropdown tooltips above menus (backport to release-candidate/2.31.x) (#34555)
Co-authored-by: Rob Hough <robhough180@gmail.com>
2026-07-20 12:18:03 +00:00
n8n-release-tag-merge[bot]
00fa67809e Merge tag 'n8n@2.31.4' into release-candidate/2.31.x 2026-07-20 08:17:39 +00:00
n8n-assistant[bot]
0a4ef52006
fix(core): Fix AI Agent not seeing tools connected through HITL tools (backport to release-candidate/2.31.x) (#34434)
Co-authored-by: Elias Meire <elias@meire.dev>
2026-07-20 09:11:42 +01:00
n8n-assistant[bot]
c7dd6b93e9
🚀 Release 2.31.4 (#34533)
Co-authored-by: n8n-release-helper[bot] <265227495+n8n-release-helper[bot]@users.noreply.github.com>
2026-07-20 07:33:19 +00:00
n8n-assistant[bot]
bb8dbedb84
fix(editor): Auto-ungroup invalid groups on workflow save (backport to release-candidate/2.31.x) (#34513)
Co-authored-by: Milorad FIlipović <milorad@n8n.io>
2026-07-19 14:34:46 +00:00
n8n-assistant[bot]
ed7217bb81
fix(core): Wire pubsub handlers of the workflow publication modules (no-changelog) (backport to release-candidate/2.31.x) (#34351)
Co-authored-by: mfsiega <93014743+mfsiega@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Danny Martini <danny@n8n.io>
Co-authored-by: Michael Siega <michael.siega@n8n.io>
2026-07-17 11:59:47 +00:00
n8n-assistant[bot]
9e0db2a1d0
🚀 Release 2.31.3 (#34394)
Co-authored-by: n8n-release-helper[bot] <265227495+n8n-release-helper[bot]@users.noreply.github.com>
2026-07-17 07:20:24 +00:00
n8n-assistant[bot]
f85ff0b198
perf(core): Skip webhook-only workflows when enqueuing publications on leader handoff (no-changelog) (backport to release-candidate/2.31.x) (#34353)
Co-authored-by: mfsiega <93014743+mfsiega@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Danny Martini <danny@n8n.io>
2026-07-16 13:47:41 +00:00
n8n-assistant[bot]
df01643120
feat(core): Add trigger reconciliation to recover missed activations (no-changelog) (backport to release-candidate/2.31.x) (#34311)
Co-authored-by: mfsiega <93014743+mfsiega@users.noreply.github.com>
Co-authored-by: Michael Siega <michael.siega@n8n.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 15:12:31 +02:00
n8n-assistant[bot]
d8c9e45a55
fix: Correct end-user credential validation, re-evaluation, and identity-hook recognition (backport to release-candidate/2.31.x) (#34277)
Co-authored-by: Andreas Fitzek <andreas.fitzek@n8n.io>
2026-07-16 13:16:57 +02:00
n8n-assistant[bot]
4e72e2536d
fix(core): Sign SES requests with the ses service name (backport to release-candidate/2.31.x) (#34282)
Co-authored-by: Stephen Wright <sjw948@gmail.com>
2026-07-16 08:48:47 +00:00
n8n-assistant[bot]
7da56d3b2c
🚀 Release 2.31.2 (#34299)
Co-authored-by: n8n-release-helper[bot] <265227495+n8n-release-helper[bot]@users.noreply.github.com>
2026-07-16 07:32:26 +00:00
n8n-assistant[bot]
9aced71e11
fix(core): Require execution mode for MCP workflow executions (backport to release-candidate/2.31.x) (#34280)
Co-authored-by: Svetoslav Dekov <svetoslav.dekov@n8n.io>
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>
2026-07-15 16:40:40 +00:00
n8n-assistant[bot]
953bbe5b06
fix(core): Fix change in width of all dropdowns in UI (backport to release-candidate/2.31.x) (#34266)
Co-authored-by: Konstantin Tieber <46342664+konstantintieber@users.noreply.github.com>
2026-07-15 15:53:07 +00:00
n8n-assistant[bot]
c36f121a89
🚀 Release 2.31.1 (#34196)
Co-authored-by: n8n-release-helper[bot] <265227495+n8n-release-helper[bot]@users.noreply.github.com>
2026-07-15 07:20:28 +00:00
n8n-assistant[bot]
b01032cfe9
fix(core): Preserve node aliases when generating AI tool variants (backport to release-candidate/2.31.x) (#34194)
Co-authored-by: Alexander Gekov <40495748+alexander-gekov@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-15 06:45:13 +00:00
n8n-assistant[bot]
ea140677bb
fix(core): Count AI assistant workflow test runs as manual executions in statistics (backport to release-candidate/2.31.x) (#34152)
Co-authored-by: oleg <me@olegivaniv.com>
2026-07-14 12:22:03 +00:00
n8n-assistant[bot]
3b7e637114
fix(editor): Allow scrolling the AI Assistant empty view when content overflows (no-changelog) (backport to release-candidate/2.31.x) (#34149)
Co-authored-by: Filipe Tavares <filipe.tavares@n8n.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 12:14:09 +00:00
n8n-assistant[bot]
e81d108eb6
fix(editor): Make AI assistant quota-exhausted error states explicit (backport to release-candidate/2.31.x) (#34137)
Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 10:25:40 +00:00
n8n-assistant[bot]
ab2acc81b3
fix(core): Bind dynamic credential tokens to a user ID (backport to release-candidate/2.31.x) (#34134)
Co-authored-by: James Martin <393605+ymhr@users.noreply.github.com>
2026-07-14 10:10:11 +00:00
3988 changed files with 53877 additions and 244203 deletions

View File

@ -23,7 +23,7 @@ Given a PR number or branch name, determine whether it is ready for human review
## Decision tree
1. **Bot author** (`n8n-cat-bot` / `aikido-autofix`) → cleanup-only, no review. See "Internal automation PRs" below.
2. **Auto-rejection screen matches** (typo-only / unsanctioned new node / low-value) → action path **D — close** with the matching template.
2. **Auto-rejection screen matches** (typo-only / unsanctioned new node) → action path **D — close** with the matching template.
3. **All checks pass** (`readyForReview === true`) → action path **B — triage to team**.
4. **One or more checks fail** → action path **A** (if title is minor-fix only) then **C — post comment**.
@ -91,25 +91,22 @@ gh api --paginate "repos/n8n-io/n8n/issues/<number>/comments" \
## Step 2.5 — Auto-rejection screen
Per `CONTRIBUTING.md`, three PR patterns should be closed outright rather than reviewed:
Per `CONTRIBUTING.md`, two PR patterns should be closed outright rather than reviewed:
- **Typo-only PR** — diff is entirely spelling/grammar fixes with no logic or tests.
- **New-node PR** — adds a brand-new node, unless the n8n team has explicitly agreed to take it.
- **Low-value / automated PR** — diff is entirely whitespace/formatting/reordering, an unexplained mass rename or dependency bump, badge/comment-only tweaks, or a bulk scripted submission, with no functional change or rationale. Screen conservatively.
If any matches, set `checks.AutoReject` and skip directly to action **D**. Full rules and how to verify each pattern: see `reference/checks.md`.
If either matches, set `checks.AutoReject` and skip directly to action **D**. Full rules and how to verify each pattern: see `reference/checks.md`.
## Step 3 — Run the readiness checks
## Step 3 — Run the five checks
Run when `AutoReject` is `null`. Full rules for each in `reference/checks.md`:
- **A. CLA**`cla-signed` label present.
- **B. Title** — matches the conventional-commit regex. Authoritative rules in `.github/pull_request_title_conventions.md`.
- **C. Description** — every section heading and checklist item from `.github/pull_request_template.md` is present in the PR body. The template is read at check time, so changes to it propagate automatically.
- **D. Tests** — source logic changes have matching test files (a `fix` needs a regression test covering the bug). Skip for `docs/ci/chore/build` PRs.
- **D. Tests** — source logic changes have matching test files. Skip for `docs/ci/chore/build` PRs.
- **E. cubic-dev-ai** — no unresolved comments (resolved = "Addressed in commit" marker).
- **F. Linked issue or forum discussion**`fix` PRs link a GitHub issue; `feat`/`refactor`/`perf` PRs link an issue or `community.n8n.io` topic. Skip for `docs/ci/chore/build/test`.
- **G. Size** — sum of per-file `additions` in `files` (skipping lockfiles/generated) ≤ 1000 and one logical change; sets `Oversized`.
## Step 4 — Identify the responsible team
@ -161,20 +158,18 @@ Also inspect the matched Linear issue ticket (from the search above) for an alre
"relatedIssueTickets": [<"GHC-1234" | "NODE-5678" | ...>],
"duplicatePRs": [<{ "number": <int>, "title": "<string>" }, ...>],
"checks": {
"AutoReject": <"typo-only" | "new-node" | "low-value" | null>,
"AutoReject": <"typo-only" | "new-node" | null>,
"CLA": <bool>,
"Title": <bool>,
"Description": <bool>,
"TestsNeeded": <bool>,
"TestsIncluded": <bool>,
"CubicIssues": <true if unresolved cubic issues exist, false otherwise>,
"LinkedIssueOrDiscussion": <true if the §1 issue/forum link is present or the type is skipped>,
"Oversized": <true if the filtered per-file additions sum > 1000 and the work is separable>
"CubicIssues": <true if unresolved cubic issues exist, false otherwise>
}
}
```
`readyForReview` is `true` only when: `AutoReject` is `null`; `CLA`, `Title`, `Description`, and `LinkedIssueOrDiscussion` are all `true`; `CubicIssues` and `Oversized` are both `false`; and either `TestsNeeded` is `false` or `TestsIncluded` is `true`. If `AutoReject` is set, `readyForReview` is always `false`.
`readyForReview` is `true` only when: `AutoReject` is `null`; `CLA`, `Title`, and `Description` are all `true`; `CubicIssues` is `false`; and either `TestsNeeded` is `false` or `TestsIncluded` is `true`. If `AutoReject` is set, `readyForReview` is always `false`.
Emit the JSON first, then take the appropriate action path below.
@ -260,15 +255,13 @@ The PR's own review ticket is **not** canceled in the classic path — it remain
If `relatedIssueTickets` is non-empty, run "Linking a PR to its issue ticket" (not-ready variant): add the PR link and post the "in progress, still being triaged" comment. **Leave each issue ticket's state unchanged and do not cancel the PR's own review ticket** — the PR isn't ready yet, so we only flag the in-progress work. (Optionally surface `duplicatePRs` to the user, but do not close here — closing is a path-D action driven from B.)
`messageForUser` should list every failing check the contributor must address, including a **missing linked issue / forum topic** (check F — ask them to open or link a GitHub issue for a `fix`, or a `community.n8n.io` topic for a `feat`/`refactor`) and an **oversized PR** (check G — ask them to split it into focused PRs *if the work is separable*).
Show `messageForUser` and ask `Post as-is / Edit before posting / Skip`. On post:
```bash
gh pr comment <number> --repo n8n-io/n8n --body "<final message>"
```
Then apply the right terminal triage label — exactly one, priority `triage:tests-needed` > `triage:needs-info` (a missing linked issue/forum topic or an oversized PR maps to `triage:needs-info`). See `reference/label-flow.md`. On `Skip`, leave the PR on `triage:in-progress` so the next loop picks it up.
Then apply the right terminal triage label — exactly one, priority `triage:tests-needed` > `triage:needs-info`. See `reference/label-flow.md`. On `Skip`, leave the PR on `triage:in-progress` so the next loop picks it up.
Skip C entirely if A already handled the only failing check and the PR is now ready — run B instead.
@ -276,7 +269,7 @@ Skip C entirely if A already handled the only failing check and the PR is now re
Used when the PR should be closed rather than reviewed. Three common triggers:
1. **Auto-rejection** (`AutoReject` set) — typo-only, unsanctioned new node, or low-value/automated.
1. **Auto-rejection** (`AutoReject` set) — typo-only or unsanctioned new node.
2. **Duplicate**`duplicatePRs` is non-empty (another open PR addresses the same change), confirmed via the duplicate guard in path B. Use `#<other-pr>` from `duplicatePRs` in the template.
3. **Out of scope / bundled** — multiple unrelated fixes that should be split, or scope n8n team has declined.
@ -288,9 +281,6 @@ Ask `Close + comment / Edit before closing / Skip`. Templates below; pick one an
**New node:**
> Thanks for the contribution! n8n no longer accepts new nodes directly into the core monorepo unless the team has explicitly agreed to scope one in. Please publish this as a [community node](https://docs.n8n.io/integrations/creating-nodes/overview/) instead — that gives you full ownership and avoids the long review queue here. Closing this PR per our [contributing guide](../blob/master/CONTRIBUTING.md#community-pr-guidelines).
**Low-value / automated:**
> Thanks for taking the time to open this! We review every PR by hand, so per our [contributing guide](../blob/master/CONTRIBUTING.md#community-pr-guidelines) we only take changes that carry a clear functional benefit. This one doesn't change behaviour (or comes without a rationale we can act on), so we're closing it to keep the review queue focused. If there's a real fix or improvement behind it, please open an issue or forum topic describing the problem first and we'll be glad to look. 🙏
**Duplicate of another PR:**
> Thanks for the contribution! This change is already being handled in #<other-pr>, which is further along in review. Closing this in favour of that PR to keep the queue tidy — please feel free to chime in over there if there's anything missing.

View File

@ -1,27 +1,24 @@
# Community PR Readiness Check — checks
The full ruleset for the auto-rejection screen and the readiness checks. Loaded when the skill is mid-review.
The full ruleset for the auto-rejection screen and the five readiness checks. Loaded when the skill is mid-review.
## Contents
- Step 2.5 — Auto-rejection screening
- Typo-only PR
- New-node PR
- Low-value / automated PR
- The readiness checks (run after auto-rejection screen clears)
- The five checks (run after auto-rejection screen clears)
- A. CLA signed
- B. PR title format
- C. PR description completeness
- D. Tests
- E. cubic-dev-ai issues
- F. Linked issue or forum discussion
- G. Size (single logical change)
---
## Step 2.5 — Auto-rejection screening
Before running the readiness checks, screen for PRs that the project policy in `CONTRIBUTING.md` (section "Community PR Guidelines") says should be rejected outright. If a PR matches one of these patterns, skip the readiness checks and recommend a polite close instead.
Before running the five checks, screen for PRs that the project policy in `CONTRIBUTING.md` (section "Community PR Guidelines") says should be rejected outright. If a PR matches one of these patterns, skip the five checks and recommend a polite close instead.
### Typo-only PR
@ -38,25 +35,13 @@ The diff adds a new node entry: a new `*.node.ts` (and usually a sibling credent
Per CONTRIBUTING.md: *"PRs that introduce new nodes will be auto-closed unless they are explicitly requested by the n8n team."* If the user calling the skill states the n8n team has agreed to take this node, proceed with the normal review; otherwise flag for close with a pointer to the [Community Nodes](https://docs.n8n.io/integrations/creating-nodes/overview/) flow.
### Low-value / automated PR
CONTRIBUTING.md §6 lists low-value and automated PRs as close-on-sight. Match **only** when the diff, read via `gh pr diff <number>`, is **entirely** one of these with no functional change and no rationale in the description:
- Whitespace, formatting, or pure reordering with no functional reason.
- Mass find-and-replace or renames submitted with no rationale.
- A dependency bump with no explanation of why the bump is needed.
- README badges, comment-only tweaks, or restating the obvious.
- Bulk or scripted submissions spanning many unrelated files.
Be conservative — this is a close, so bias toward *not* matching. If any part of the diff changes behaviour, adds a test, or the description gives a genuine reason, do **not** match; run the readiness checks instead. Contribution-farming intent (e.g. Hacktoberfest with no real change) reinforces a match but is never the sole basis — the diff must already be low-value.
### When a screen matches
Skip the readiness checks. Set `checks.AutoReject` in the JSON output to `"typo-only"`, `"new-node"`, or `"low-value"` and proceed to action path 7D in SKILL.md (close the PR).
Skip the five checks. Set `checks.AutoReject` in the JSON output to `"typo-only"` or `"new-node"` and proceed to action path 7D in SKILL.md (close the PR).
---
## The readiness checks
## The five checks
Run these in order when step 2.5 clears (`AutoReject` is `null`).
@ -122,7 +107,6 @@ Otherwise:
```
3. Use the diff to judge 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. For a **bug fix** (`fix` type), CONTRIBUTING.md §3 asks for a regression test that fails against `master` without the change. You can't run it here, so confirm the PR both adds/updates a test that exercises the fixed path **and** the description says how to see it fail. A `fix` PR with no test covering the bug, or a test that clearly doesn't touch the changed path, is ❌ even if unrelated tests exist.
**Fallback only if needed**: if the diff alone is insufficient (e.g. you need to read the full surrounding function body to assess whether a refactor preserved behaviour), check out a temporary worktree:
@ -154,27 +138,3 @@ gh api --paginate "repos/n8n-io/n8n/pulls/<number>/comments" \
- No comments, every comment explicitly states no issues were found, or every issue is marked addressed → ✅
- One or more unresolved comments → ❌ report the unresolved count and priority breakdown (e.g. "3 unresolved issues: 1× P1, 1× P2, 1× P3")
### F. Linked issue or forum discussion
CONTRIBUTING.md §1 moves the quality gate before the code: bug fixes need a tracked issue, features and refactors need prior discussion. Gate by PR type (from the title):
- **Skip** (auto-pass) for `docs`, `ci`, `chore`, `build`, and `test` types — housekeeping doesn't need a prior issue.
- **`fix`** — require a linked GitHub issue: a closing keyword (`fixes/closes/resolves #N`) or an `github.com/n8n-io/n8n/issues/N` URL in the body (i.e. `relatedIssueTickets` from step 5b is non-empty, or the raw reference is present).
- **`feat`, `refactor`, `perf`** — require prior discussion: either a linked GitHub issue (as above) **or** a `community.n8n.io` forum link in the body.
Report:
- ✅ Required link present, or type is skipped
- ❌ `fix` with no linked issue, or `feat`/`refactor`/`perf` with no linked issue or forum link
A ❌ here is a **return**, not a close: it sets `readyForReview` false and drives a path-C contributor comment asking for the issue or forum topic (see SKILL.md). This is a heuristic — if the PR body clearly describes a tracked discussion by other means, use judgement.
### G. Size (single logical change)
CONTRIBUTING.md §6: a PR should add no more than **1000 lines** and cover one logical change. Compute the line count from the per-file `additions` in the `files` list fetched in step 2 (each entry has `path` and `additions`) — not the aggregate `additions` from `gh pr view`, which can't be filtered:
- Sum `additions` across the `files` list, **skipping** obvious lockfiles and generated/vendored files (e.g. `pnpm-lock.yaml`, generated API clients). Set `Oversized` true when that filtered sum is `> 1000` — a large lockfile diff alone is not "oversized".
- `Oversized` true is a **return**, not a close: `readyForReview` becomes false and path C asks the contributor to split the PR into focused pieces.
This is advisory-strength: a single cohesive change that genuinely needs >1000 lines (e.g. one sanctioned node) can be waved through by the human reviewer, so phrase the comment as a request to split *if the work is separable*.

View File

@ -54,7 +54,7 @@ Use the canonical owners script at `.github/scripts/owners.mjs`. It parses `.git
| `design` | Design | `team:design` |
| `iam` | Identity & Access | `team:identity` |
| `ligo` | Lifecycle & Governance | `team:lifecycle` |
| `instance-ai` | AI Assistant | `team:instance-ai` |
| `instance-ai` | instanceAI | `team:instance-ai` |
| `frontend` | Adore | `team:adore` |
| `qa-dx` | Developer Platform | `team:qa-dx` |
| `migrations-review` | Catalysts | `team:cats` |

View File

@ -52,8 +52,6 @@ pnpm build > build.log 2>&1 # Always redirect
pnpm typecheck # Before commit
pnpm lint # Before commit
```
> Secrets: pnpm command lines may be recorded verbatim (opt-in dev metrics) —
> pass sensitive values via env vars, never inline on the command line.
## Key Packages

View File

@ -1,30 +1,28 @@
---
name: n8n:create-instance-ai-eval
description: >-
Authors a new Instance AI workflow eval case — written locally as JSON,
calibrated against a real build, then pushed to the LangTracer suite CI runs
— build cases, behaviour/process cases, credential cases, and seeded
(mid-conversation) cases — with intent-driven expectations. Use when adding
or changing an Instance AI workflow eval, or debugging why one is flaky.
Authors a new Instance AI workflow eval case in
packages/@n8n/instance-ai/evaluations/data/workflows — build cases,
behaviour/process cases, credential cases, and seeded (mid-conversation)
cases — with intent-driven expectations calibrated against a real build. Use
when adding or changing an Instance AI workflow eval, or debugging why one is
flaky.
---
# Create an Instance AI workflow eval
Each eval is **one JSON case** — authored locally as a file in
`packages/@n8n/instance-ai/evaluations/data/workflows/` (the disk loader
auto-discovers `*.json`, no registration step), with a LangTracer suite as its
durable home. Cases validate against
[`harness/schema.ts`](../../../packages/@n8n/instance-ai/evaluations/harness/schema.ts)
(`.strict()` — unknown keys fail at load). The eval
Each eval is **one JSON file** in
`packages/@n8n/instance-ai/evaluations/data/workflows/`. The loader
auto-discovers `*.json` and validates against
[`schema.ts`](../../../packages/@n8n/instance-ai/evaluations/data/workflows/schema.ts)
(`.strict()` — unknown keys fail at load). No registration step. The eval
[README](../../../packages/@n8n/instance-ai/evaluations/README.md) is the
exhaustive field reference; this skill is the opinionated *how*.
> **Committing new case JSONs into the repo is no longer the recommended
> approach.** Author the file locally (uncommitted), calibrate it against a real
> build, then **push it to a lang-tracer suite** with `eval:langtracer-push`
> (see [Push to a lang-tracer suite](#push-to-a-lang-tracer-suite)) —
> `--suite baseline` for the consolidated corpus n8n CI runs, or a dedicated
> capability suite like `agents`.
> build, then **push it to a curated lang-tracer suite** with
> `eval:langtracer-push` (see [Push to a lang-tracer suite](#push-to-a-lang-tracer-suite)).
> The suite is the home for the case; the eval CLI reads it back via
> `--source langtracer`. You still write the JSON file — it's just the input to
> the push, not a committed artifact.
@ -35,52 +33,6 @@ exhaustive field reference; this skill is the opinionated *how*.
> `priorConversation` case isn't transient and has no suite home, so it's the one
> sanctioned exception — it lives as committed JSON. See [`case-shapes.md`](case-shapes.md).
## Set the autonomy level first
**Before you source, draft, or run anything, decide how hands-on the driver
wants to be — and say it back.** This skill runs at one of two autonomy levels.
If the request makes the level clear ("just author and calibrate it yourself" vs.
"stop me at each step", or an explicit mode), adopt it, state it in one line, and
note how to override (e.g. "say 'stop me at calibration' to add a checkpoint").
**If it's not clear, ask the driver one question** offering the two levels
*before* doing any work.
The skill has four natural decision **gates****selection** (which real
failure to encode), **shape + expectations** (archetype, must-haves, scope
trim), **calibration** (classify each red and resolve keep/loosen/drop), and
**push** (kind + tier). The level decides what happens at each gate:
| Level | Who decides when to stop | Behaviour |
|---|---|---|
| **autonomous** | agent | Runs all four gates start-to-finish; reports a **decision log** at the end for the driver to review. |
| **checkpoint** | driver, per gate | Stops at each gate with a compact **proposal + recommendation**; driver says "go" or redirects. At the **calibration** gate, hands the driver a link to the just-built thread on the live instance plus login credentials so they can review the real conversation and workflow themselves before confirming (below). |
**Calibration is special-cased at both levels.** A calibration verdict that
flips a case's *meaning* — a real capability-gap red vs. a harness-caused red, or
any loosening that would let a known-bad build pass — is **surfaced explicitly**
(interactively in checkpoint; in the decision log in autonomous), never silently
committed. It's the one call where a quiet mistake corrupts the suite, so it
never fully auto-commits.
**Checkpoint calibration — review the real thread on the instance.** Because the
calibration verdict is trust-critical, in checkpoint mode you don't ask the
driver to trust your reading of the run. You built the case against a live
instance with `--keep-workflows` (step 4), so the thread and the workflow are
still there — hand the driver a direct link and let them look:
- **Thread:** `<base-url>/assistant/<threadId>` — the exact conversation the case
ran (the run prints the `threadId`; the built workflow prints as `BUILT (<id>)`
and opens at `<base-url>/workflow/<id>`).
- **Login:** the email + password the eval signs in with (the owner you seeded on
the instance — see [`running-evals.md`](running-evals.md); the default local
seed is `nathan@n8n.io` / `PlaywrightTest123`).
Present, per red: the assertion, whether it went green/red, your proposed
classification (real capability gap / harness limitation / noise) and
keep/loosen/drop, and the review link. The driver logs in, reads the thread and
the workflow, and confirms or redirects before you write the verdict back into
the case `description`.
## Where the best cases come from
The strongest cases encode a **real** failure, not an invented premise. Two
@ -131,12 +83,6 @@ need + constraint ("I need field X and the built-in node doesn't expose it, so
pull it straight from the API") — not as an implementation spec ("use an HTTP
Request node").
**Write the conversation in English** unless the user asked otherwise (or the
case exists specifically to test non-English handling). Sourced real threads are
frequently non-English — translate the intent into English when you rewrite the
prompt in the user's voice; the failure mode is the anchor, not the original
language.
**Trim to the smallest multi-turn conversation that reproduces the issue.**
Real sourced threads are long (dozens of turns of setup, debugging, and
tangents) — do **not** transcribe them. Distill to the fewest turns that still
@ -163,15 +109,6 @@ the combinatorial bulk. A case that never builds tests nothing.
## Workflow
These steps map to the four gates from [Set the autonomy level first](#set-the-autonomy-level-first):
sourcing (before step 1) is the **selection** gate; steps 12 are the **shape +
expectations** gate; steps 56 are the **calibration** gate; step 7 is the
**push** gate. In *autonomous* mode you flow through all of them and summarize in
a decision log; in *checkpoint* mode you pause at each with a proposal, and at
calibration you hand the driver the thread link + login to review the real build
(see [Set the autonomy level first](#set-the-autonomy-level-first)). Calibration
(step 6) always surfaces meaning-flipping verdicts explicitly regardless of level.
1. **State the must-haves first.** From the conversation alone, list what every
correct workflow must do (trigger type, essential operations, gating
condition) — those become draft `outcomeExpectations`. Required fields:
@ -208,9 +145,7 @@ calibration you hand the driver the thread link + login to review the real build
(or delete it once it's in the suite). Committing new case JSONs into the repo
is no longer the approach. (Exception: seeded cases can't be pushed — a
`seedFile`/`priorConversation` case stays committed JSON, a `seedThread` case is
a local throwaway; see [`case-shapes.md`](case-shapes.md).) For a sourced case,
finish by **linking it to its source thread/finding** over the MCP — see
[Link the pushed case to its source](#link-the-pushed-case-to-its-source-provenance-step--always-do-this).
a local throwaway; see [`case-shapes.md`](case-shapes.md).)
`--iterations N` is available to measure flakiness (pass@k / pass^k) — reach for
it when you suspect a case is non-deterministic or before promoting it to a
@ -246,31 +181,19 @@ Calibration exists to right-size assertions, **not** to make a case pass. When a
run turns a scenario or expectation red, classify the red first — then keep it.
**First rule out the environment.** Before reading any red as a signal about a
case, check the shape of the failures across the run. If **every case fails the
same way** — every scenario with the *same* execution error while builds succeed,
*or* every **build** erroring identically before it starts (an `Agent error:
Something went wrong…` with **zero tool calls**) — that is almost never the cases;
it's a broken environment, most often a **stale dist** after a branch or worktree
switch. Two shapes to know:
- **Stale `packages/core` / `packages/cli` dist** — a refactor moved a runtime
export and the built dist still calls the old one, so *builds succeed but every
execution fails the same way* (e.g. `(0 , n8n_workflow_1.createDeferredPromise)
is not a function` after `createDeferredPromise` moved to `@n8n/utils`).
- **Stale/half-built `@n8n/instance-ai` dist** — every run errors *before building*
(`Agent error…`, zero tool calls) and the instance log shows `Cannot find module
'@/utils/...'` from `dist/skills/*.js`: the build's `tsc-alias` step (which
rewrites `@/` path aliases to relative requires) didn't complete, so the dist is
internally inconsistent.
Fix it, don't calibrate around it: run a full ordered `pnpm build` (a targeted
`--filter` build can fail on unrelated stale-dep type errors; for the instance-ai
shape, `cd packages/@n8n/instance-ai && pnpm build` runs `tsc && tsc-alias`), then
**restart the instance** — the running node process holds the old dist in memory,
so rebuilding on disk changes nothing until restart (and `kill` by env-var pattern
misses it — kill the actual `lsof -t -iTCP:<port>` PID). Re-probe one case, confirm
it builds and executes, then re-run the batch. Only once uniform environment
failures are excluded do the three categories below apply:
case, check the shape of the failures across the run. If **every scenario fails
with the *same* execution error** while the builds succeed and `outcomeExpectations`
pass, that is almost never the cases — it's a broken environment, most often a
**stale `packages/core` / `packages/cli` dist** after a branch or worktree switch
(a refactor moved a runtime export and the built dist still calls the old one;
e.g. `(0 , n8n_workflow_1.createDeferredPromise) is not a function` after
`createDeferredPromise` moved to `@n8n/utils`). Fix it, don't calibrate around it:
run a full ordered `pnpm build` (a targeted `--filter` build can fail on unrelated
stale-dep type errors), then **restart the instance** — the running node process
holds the old dist in memory, so rebuilding on disk changes nothing until restart
(and `kill` by env-var pattern misses it — kill the actual `lsof -t -iTCP:<port>`
PID). Re-probe one case, confirm executions run, then re-run the batch. Only once
uniform environment failures are excluded do the three categories below apply:
- **Real build / capability gap** — the agent's workflow is wrong or missing
something the user asked for (a miswired branch, a missing retry, wrong field
@ -287,13 +210,6 @@ failures are excluded do the three categories below apply:
This is the only real "noise". Confirm it with `--iterations N` before calling
it flaky, then de-tier and note it; deletion is the last resort.
**Annotate every kept red in the case `description` with a scannable prefix** so a
future reader tells the two apart at a glance. Use `Harness note: …` for a
harness-caused red (name the limitation and why the build is still correct), and
`Capability-gap finding: current build reds because <X> — a real builder bug
(flips to a regression guard once fixed)` for a real gap. Consistent prefixes keep
the corpus greppable and stop harness reds from being misread as product bugs.
The one move to never make is **working around a red by weakening what the case
checks** — deleting a failing scenario, loosening an assertion until a wrong
build would pass, or quietly converting to build-only. That makes the suite look
@ -302,17 +218,6 @@ harness gaps are the deliverable, so **highlight them, don't engineer around
them**. If you catch yourself editing a case so that a known-bad build would now
pass, stop.
**Who confirms the classification depends on the autonomy level.** In
*checkpoint* mode the keep/loosen/drop decision is the driver's to confirm: you
hand them the thread link + login (see [Set the autonomy level
first](#set-the-autonomy-level-first)) so they can review the real conversation
and workflow, then you write the agreed `Harness note:` / `Capability-gap
finding:` prefix back into the case `description`. In *autonomous* mode the agent
proposes it explicitly in the end-of-run decision log. Either way the
classification is stated in the open, never silently committed — misreading a
harness red as a real gap (or the reverse) is the one calibration mistake that
quietly corrupts the suite.
## Example
Minimal build case:
@ -382,8 +287,8 @@ What each piece is doing:
never spoken. Here it withholds values until asked and rejects a plan that
misses the label filter. Keep the whole script in one turn and encode ordering
inside it (don't fabricate assistant "done" turns to sequence steps — see
[`case-shapes.md`](case-shapes.md)). `applies-each-change-when-asked` (in the
`baseline` LangTracer suite) is a good real example.
[`case-shapes.md`](case-shapes.md)). `applies-each-change-when-asked` is a good
real example.
- **`dataSetup` describes only what external services return.** That's the layer
the harness controls (below).
@ -408,14 +313,7 @@ nodes get LLM-generated pin data). So:
byte-exact — don't assert exact values off them), and *writes/inserts* aren't
pinned (they hit the real per-thread table, recreated schema-only with **no
rows**), so read-after-write within one run isn't faithful — the read reflects
`dataSetup`, not what the run just wrote. A third caveat: only Data Table
*reads* are seedable this way — **dedup / change-detection built on workflow
static data** (`removeItemsSeenInPreviousExecutions`, `$getWorkflowStaticData`)
is **not** seedable, because static data starts empty every run, so such a
scenario reds vacuously (it sees everything as "new"). To get a seedable
change-detection scenario, steer the build toward a Data Table; otherwise
accept the static-data red as a harness limit and carry the logic in
`outcomeExpectations`. Note the agent may *choose* static-data dedup on its own.
`dataSetup`, not what the run just wrote.
- Don't assert exact counts that depend on mock generation ("exactly 7 posts").
Say "fewer than the original 10".
@ -442,18 +340,10 @@ red is harness-caused (per "A red is signal", above):
- **Mock response shape** — the LLM-generated mock response can omit the real
envelope, crashing a downstream parse/format node. Recurring, reproducible
shapes to expect (all produce a red on a *correct* build):
- **OpenAI structured output** — historically the mock returned a plain
`{content: "..."}` instead of the Responses envelope
(`output[0].content[0].text`), so a **Structured Output Parser** /
**Information Extractor** / **Text Classifier** got nothing and errored with
**`Model output doesn't fit required format`**. The Responses-envelope
normalizer (PR #33578, merged) fixes the flat-envelope case, so many of these
now execute cleanly. A **narrower residual red remains** for structured-output
schemas declared with strict **`additionalProperties: false`**: the normalized
`output` wrapper (and any extra fields the mock invents, e.g. `subject`/`date`)
violate the strict schema, so the node still rejects the mock output. Both the
old and residual forms are the *mock*, not the build — carry correctness in
`outcomeExpectations` and note the red as harness-caused.
- **OpenAI** mock returns a plain `{content: "..."}` instead of the Responses
API envelope (`output[0].content[0].text`), so a LangChain chain / **Structured
Output Parser** receives an empty response and crashes. Any build with an
OpenAI chat model feeding a structured-output/parser node can red on this.
- **Gmail** mock returns headers as top-level capitalized fields (`From`,
`Subject`) instead of under `payload.headers`, so a Code/Filter node reading
the sender/subject gets empty strings (e.g. a "drop no-reply senders" safety
@ -461,10 +351,6 @@ red is harness-caused (per "A red is signal", above):
`outcomeExpectations`, not its runtime effect in a scenario.
- A less-common API (e.g. Gemini's top-level `candidates`) can omit its envelope
the same way.
- **Google Drive resumable upload** — the initiate-upload mock omits the
`Location` header carrying the session URL, so a Drive file-upload node fails
with a 400. Any build that uploads a generated image/file to Drive can red on
this.
- **Agent-tool nodes can't be executed standalone.** An AI-Agent *tool* node
(`toolHttpRequest` and other `supplyData`-only LangChain nodes with no `execute`
method) only runs when the agent invokes it; the harness executing it directly
@ -472,12 +358,6 @@ red is harness-caused (per "A red is signal", above):
red for chat-trigger / AI-agent build cases whose tool is an HTTP-request tool —
the build is correct, so carry correctness in `outcomeExpectations` (agent wired
to trigger + model + tool) and note the execution red as harness-caused.
- **Poll/wait loops can't be fast-forwarded.** A workflow that submits an async
job then polls for completion (generate → poll status until ready → download)
can't advance the mocked status deterministically, and a `Wait` node runs in
real time, so the scenario reds with an execution timeout (`framework_issue`).
The build is correct — carry it in `outcomeExpectations` and note the red as
harness-caused.
- **A build can time out and produce no scored result at all** — the run reports
`BUILD FAILED: Run timed out` and zero graded expectations. Don't assume "spec
too big": the more common cause is a **single-prompt case where the agent asks
@ -486,14 +366,10 @@ red is harness-caused (per "A red is signal", above):
— only confirmations auto-approve). Before treating a timeout as spec size,
**classify it**: read the agent's final response in the report / trace (did it
ask a question? flag an infeasibility? or genuinely churn through a huge
build?), and **re-run the case solo (`--concurrency 1`)** — concurrency both
masks a stalled build (it hits the cap) *and* can time out a perfectly healthy
build purely by queueing it behind the per-instance build cap (default 4), so a
solo run either surfaces the real reason in seconds or simply passes outright.
Fix per cause: a solo run that now passes → it was **concurrency contention**,
not the case (split big batches across lanes — see
[`running-evals.md`](running-evals.md)); a clarifying-question stall → author
multi-turn with a director note that pre-answers it; a genuine infeasibility → it's an
build?), and **re-run the case solo (`--concurrency 1`)** — concurrency makes a
stalled build hit the cap and masks the real reason, which a solo run surfaces
in seconds. Fix per cause: a clarifying-question stall → author multi-turn with
a director note that pre-answers it; a genuine infeasibility → it's an
infeasibility/honesty behaviour case (`processExpectations`), not a build case;
a true oversized spec → the timeout is itself a finding, but note it so the
zero isn't mistaken for a scored failure.
@ -631,30 +507,20 @@ drifted, leaves the rest unchanged, and never prunes. It's the inverse of
```bash
cd packages/@n8n/instance-ai
# preview first — no writes (use `npx dotenvx`; the bare `dotenvx` binary is usually not on PATH):
npx dotenvx run -f .env.eval -- pnpm eval:langtracer-push --suite baseline --dry-run --changed
# preview first — no writes:
dotenvx run -f .env.eval -- pnpm eval:langtracer-push --suite workflow-building --dry-run --changed
# then push (drop --dry-run):
npx dotenvx run -f .env.eval -- pnpm eval:langtracer-push --suite baseline --changed
dotenvx run -f .env.eval -- pnpm eval:langtracer-push --suite workflow-building --changed
```
- **Selectors** (at least one required — no accidental push-all): positional
`<slugs...>` (exact file slugs), `--changed` (new/untracked + staged + modified
`data/workflows/*.json`, ideal right after authoring an uncommitted case),
`--filter`/`--tier` (with `--exclude` as a modifier).
- **Multiple positional slugs? Skip pnpm — call the script directly.** `pnpm
eval:langtracer-push … slugA slugB` forwards the slugs as one joined argument
(`"slugA slugB"`), so no case file matches and nothing is pushed. Either use a
no-positional selector through pnpm (`--changed`), or run the script directly so
each slug is its own argv: `npx dotenvx run -f .env.eval -- npx tsx
evaluations/cli/langtracer-push.ts --suite <slug> <slug1> <slug2> …`.
- **Env:** `LANGTRACER_URL` + `LANGTRACER_API_KEY` (an `lt_` bearer; one key works
for MCP + REST) — put them in `.env.eval` and run under `npx dotenvx`.
for MCP + REST) — put them in `.env.eval` and run under `dotenvx`.
- **Options:** `--set-kind regression|capability_gap` (default `regression`, must
match the suite's kind), `--contains-user-data` (default is `synthetic`). A case
whose **build is correct** (outcome expectations green) but that carries a
**currently-red execution scenario** from a builder bug is still a `regression`
case — it guards the fix; reserve `capability_gap` for cases where the *build
itself* is wrong.
match the suite's kind), `--contains-user-data` (default is `synthetic`).
- **Scenarios sync on update too:** `PATCH /cases/:id` reconciles
`executionScenarios` by name (update in place, insert new, delete missing —
lang-tracer #48), so scenario edits re-push like any other field. A lang-tracer
@ -668,35 +534,6 @@ npx dotenvx run -f .env.eval -- pnpm eval:langtracer-push --suite baseline --cha
case isn't transient and has no suite home, so it's the one exception to
"don't commit the JSON" — it lives as a committed artifact.
### Link the pushed case to its source (provenance step — always do this)
A sourced case that isn't linked back to the conversation/finding it encodes is
an orphan: six months later nobody can tell what real failure it guards. The
push CLI doesn't carry provenance, so after pushing, link the case over the
lang-tracer MCP with one **`update_test_case`** call on the new case id (the
push prints it):
1. **`sourceThreadId`** — the source conversation's thread id (plus
**`sourceRunId`** when the case anchors to one specific run/step within it).
This is the DB-level link every by-version rollup, conversation float, and
`?sourceThreadId=` query joins on — the tags/description below are the
human-readable layer on top, not a substitute. The thread must already be
imported into lang-tracer (running `get_conversation_analysis` on it, as the
sourcing flow does, is enough); `source_kind` is derived server-side, and
the link is only editable on authored cases — promotion-recorded provenance
is immutable.
2. **`expectedBehavior`** — the rule the case enforces, one paragraph — and
**`failurePattern`** — what actually happened in the source thread, with
turn references. Copy/adapt these from the analysis's `extractedCases`
entry when the case came from `get_conversation_analysis`.
Then **`add_case_tags`** (additive; targets the LT-side `tags` array, not
`evalTags`, so nothing round-trips into eval runs): add a capability tag (e.g.
`instruction-persistence`). Tag normalization is aggressive (lowercase, kebab);
colon-form tags get silently dropped. And keep the thread id + turn refs in
the case `description` too (the drafter's habit of "Sourced from thread <id>"
is the convention) — the description is the only field shown everywhere.
## Running
You need a running n8n instance with Instance AI enabled and a working sandbox;
@ -707,9 +544,7 @@ existing workflows). Narrow a run with `--filter <slug>` / `--tier <name>` /
`--exclude`. See [`running-evals.md`](running-evals.md) for the run recipes,
parallel lanes, tiers, and baselines, and the
[README](../../../packages/@n8n/instance-ai/evaluations/README.md) for the full
flag list. Run with `--keep-workflows` when you want to review a build by hand —
in *checkpoint* mode calibration this is how the driver opens the built thread
(`<base-url>/assistant/<threadId>`) and workflow on the instance.
flag list.
## Other eval harnesses (not this skill)

View File

@ -7,13 +7,12 @@ eval [README](../../../packages/@n8n/instance-ai/evaluations/README.md); this is
the opinionated *how* and the traps.
Example cases in the corpus get renamed and churned, so this file names as few
cases as possible — search the LangTracer suite by tag/field instead (the
`search_test_cases` MCP tool, or export the suite and grep). The one stable
pointer worth naming: **`applies-each-change-when-asked`** (in the
`baseline` suite) for a well-built director conversation.
files as possible — prefer `grep`-ing the corpus by tag/field. The one stable
pointer worth naming: **`applies-each-change-when-asked`** for a well-built
director conversation.
The schema
([`harness/schema.ts`](../../../packages/@n8n/instance-ai/evaluations/harness/schema.ts))
([`schema.ts`](../../../packages/@n8n/instance-ai/evaluations/data/workflows/schema.ts))
enforces the rules you must respect:
- `seedFile`, `priorConversation`, `seedThread` are **mutually exclusive** — pick
@ -33,7 +32,7 @@ These test *how the agent converses*, not just what it builds: does it ask the
right clarifying question, avoid re-asking, honour a mid-build correction,
respect plan approval, batch bundled changes? They're graded by
`processExpectations` and are often **build-only** (no `executionScenarios`).
Tag them `behaviour` and search the suite for that tag for patterns.
Tag them `behaviour` and grep that tag for patterns.
### How multi-turn works
@ -49,11 +48,7 @@ Mode is chosen automatically from `conversation`:
data source, delivery channel, or one-vs-two-workflow split), author it
**multi-turn** with a `[bracketed]` director note in turn 1 that pre-answers
those questions so the agent proceeds to build. A single-prompt build case
only works when the prompt leaves nothing the agent must ask about. Real sourced
prompts are frequently terse ("i want to create a webhook", "convert a topic
into a YouTube script") and almost always trigger a clarifying question —
**default a terse sourced prompt to multi-turn** with a director note that
pre-answers the setup/topology it omits.
only works when the prompt leaves nothing the agent must ask about.
- **Multi-turn:** anything else. A **user-proxy LLM** plays the user — answers
questions, audits the agent's plan against your script, and sends follow-ups
(capped by `messageBudget`).

View File

@ -41,7 +41,7 @@ instance's Instance AI config and the README's environment-variables section.
| Mode | How | Produces |
|---|---|---|
| **Direct driver** | no `LANGSMITH_API_KEY` | `eval-results.json` + HTML report locally — same pipeline and row order as the LangSmith driver (TRUST-261), row concurrency follows `--concurrency` |
| **Direct loop** | no `LANGSMITH_API_KEY` | `eval-results.json` + HTML report locally |
| **LangSmith** | `LANGSMITH_API_KEY` set | also records an experiment and auto-compares against the baseline |
| **Prebuilt** | `--prebuilt-workflows <manifest>` | skips the build; verifies existing workflows (score MCP/hand-built cohorts on the same verifier) |
@ -49,13 +49,6 @@ Narrow any run with `--filter <slug>` (filename substring, comma = OR),
`--tier <name>`, and `--exclude`. `--keep-workflows` leaves built workflows for
inspection; `--iterations N` runs each case N times for pass@k / pass^k.
## Case source: disk vs langtracer
| Source | When to use it |
|---|---|
| **`disk`** (default) | **Preferred for local development** — authoring and calibrating the case in front of you: drop the JSON into `data/workflows/`, `--filter` it, iterate. Also the only home of the `agents` tier and the seeded carve-out cases; since the corpus migration the directory holds only those, not the full suite. |
| **`langtracer`** (`--source langtracer --suite baseline`) | Bigger runs (the full corpus or a whole tier), re-running specific cases that already live in the suite, and CI — which always runs this way. Needs `LANGTRACER_URL`/`LANGTRACER_API_KEY` in your env. |
## Configuration & secrets
The harness reads its configuration from environment variables — how you supply
@ -132,15 +125,7 @@ your case's pass/fail.
The **build** is the slow step and is capped at **4 concurrent builds per
instance**, so throughput scales with the number of instances, not just
`--concurrency`.
**Watch for false timeouts under contention:** a batch larger than the cap can
queue a *healthy* case behind that limit until it hits the per-iteration timeout
and reports `BUILD FAILED: Run timed out` — a run-capacity artifact, not a case
defect (a case that builds in ~3 min solo can "time out" at 900s in a crowded
batch). Re-run the suspect solo (`--concurrency 1`) to confirm it builds in time,
and for batches beyond ~a dozen cases fan out across lanes rather than just
raising `--concurrency` on one instance. Two ways to fan out:
`--concurrency`. Two ways to fan out:
- **`scripts/run-eval-lanes.sh`** spins up N lanes as **docker containers**,
seeds a user on each, and runs the eval with the base-URLs wired together.
@ -168,16 +153,14 @@ groupings, propagated to LangSmith as example splits so `--tier <name>` maps to
server-side filter. The two that matter for CI:
- **`full`** — every case; nightly / full-suite runs.
- **`pr`** — curated thin set for the PR gate: high baseline reliability +
capability diversity.
- **`pr`** — curated thin set (~6 cases) for the PR gate: high baseline
reliability + capability diversity.
Other values group cases logically (e.g. `behaviour` for conversation-behaviour
cases, `seeded` for transient `seedThread` cases kept out of CI). For a new
local case, put the value in its `datasets` array before pushing; for a case
already in LangTracer, edit `datasets` there — `eval:langtracer-push`
deliberately does not re-sync tier-only edits to an existing case. **Only
promote to `pr` after `--iterations 5+` shows it's reliably green** — a flaky
case in the gate poisons it.
cases, `seeded` for transient `seedThread` cases kept out of CI). Add a case to a
tier by putting the value in its `datasets` array and re-syncing. **Only promote
to `pr` after `--iterations 5+` shows it's reliably green** — a flaky case in the
gate poisons it.
## Baselines & regression
@ -192,18 +175,14 @@ for low noise:
```bash
# with your env loaded and LANGSMITH_API_KEY set, from packages/@n8n/instance-ai/
# (--dataset/--baseline-prefix mirror CI's pins — langtracer mode otherwise
# derives suite-scoped names and later runs would never find this baseline)
pnpm eval:instance-ai --source langtracer --suite baseline \
--dataset instance-ai-workflow-evals --baseline-prefix instance-ai-baseline- \
--experiment-name instance-ai-baseline --iterations 10
pnpm eval:instance-ai --experiment-name instance-ai-baseline --iterations 10
```
LangSmith appends a random suffix; the most-recently-started `instance-ai-baseline-*`
becomes the next comparison target. In CI, the same is a workflow dispatch:
```bash
gh workflow run test-evals-instance-ai.yml -f experiment-name=instance-ai-baseline -f iterations=10
gh workflow run ci-instance-ai-evals.yml -f experiment-name=instance-ai-baseline -f iterations=10
gh workflow run ci-instance-ai-evals.yml -f pr=<number> # re-run evals against a PR's head
```

View File

@ -36,14 +36,7 @@ connected.)
real, recurring failure modes.
2. **Pull the conversations**`list_conversations` (e.g. `verdict:"bad"`,
`analyzed:"yes"`) → `get_conversation` (raw trace) + `get_conversation_analysis`
(findings). `get_linear_ticket_context` links a thread to its ticket. To target
**execution failures**, add `funnelDrop:"05"` (built + launched an execution
that never *succeeded*). **Caveat: the funnel drop is a *conversion* signal, not
a build-quality one** — most `funnelDrop:"05"` threads are healthy builds that
correctly routed to credential setup, or the user simply abandoned, so the drop
alone tells you nothing about the build. **Pair it with `verdict:"bad"`** to
filter down to threads where the analyser actually flagged a build/execution
defect (in one sample: 131 raw drops → 18 once `verdict:"bad"` was added).
(findings). `get_linear_ticket_context` links a thread to its ticket.
3. **Verify before trusting a finding.** The analyser keys off tool-call *spans*
(was `build-workflow` called on this turn?), which it reads reliably — but a
content-dependent claim ("invented ID", "missing node") can be wrong when it
@ -62,28 +55,6 @@ connected.)
its trace is pruned or deleted — so it has no durable home; that's exactly why
step 4 turns the confirmed failure into a durable synthetic case.
## Sourcing a regression baseline (successful builds)
The discover→verify→encode flow above hunts **failures**. The complementary need
— a broad **regression baseline** of things that already work — is sourced the
opposite way: from conversations where a workflow was **built and executed
without errors**. Use `list_conversations` with the **conversion-funnel** filter:
- `funnelStep: '03'` = built a workflow, `'04'` = launched an execution, `'05'` =
execution succeeded, `'06'` = published (each step is a strict subset — also
reached every earlier step). For "built + executed cleanly" cases, **`'05'`** is
the signal; add `language: 'eng'` to keep prompts English.
- The result is large — it spills to a file. Triage by first prompt:
`jq -r '.data[] | "\(.threadId)\t\(.firstUserPrompt[0:180])"'`. Skip "The
execution failed…" debugging threads (they didn't cleanly build) and off-topic
app-build requests.
- Author a **build case** per selected thread (prompt in the user's voice,
grounded in the real `firstUserPrompt`; note the source thread id in
`description`). These are `regression`-kind cases whose value is coverage of a
working capability, not a currently-red gap — you rarely need `get_conversation`
when the first prompt already specifies the build. Terse prompts almost always
need a multi-turn director note (see [`case-shapes.md`](case-shapes.md)).
## Two practical notes on `get_conversation_analysis`
- **It hands you draft cases.** The response's

View File

@ -1,116 +0,0 @@
---
name: n8n:nathan
description: Deploy a temporary n8n test instance (or generate a local docker run command) via the internal "Nathan" bot, from the repo instead of Slack. Use after opening a PR to offer the user a live test instance, or whenever someone asks to spin up / deploy a test instance for a branch.
allowed-tools: Bash(pnpm nathan:*), Bash(node scripts/nathan.mjs:*), Bash(git diff:*), Read
---
# Nathan — repo-local test instances
Nathan is n8n's internal bot that deploys throwaway test instances from a branch
or Docker image. It's normally driven from Slack (`/nathan ...`); this skill runs
the same commands from the repo via `pnpm nathan`.
## Prerequisites
- **No tunnel setup needed.** Nathan replies asynchronously through a short-lived
public tunnel that the script opens for you (`npx localtunnel`). A `deploy` to a
**new** `test-<name>` also polls that instance URL directly, so it still reports
success even if the tunnel drops. (Redeploying a name that's *already up* skips
the poll — it can't tell the old instance from the new — so it falls back to the
tunnel; prefer a fresh name when you need the reliable report.)
- **A token in `~/.n8n/dev/nathan-token`.** If a command reports no token, **ask the
user for one** — point them at the form
(`https://internal.users.n8n.cloud/form/d6d34a2f-4899-4ee8-afc8-f8c41a8a243d`),
where they log in with their n8n account and copy the token from the response —
then save it for them (the script's interactive paste prompt needs a real
terminal, so as an agent use the subcommand):
```bash
pnpm nathan set-token '<PASTED_TOKEN>'
```
## Offer a test instance
### Only when it's worth it
Use judgement — don't offer for every branch. **Offer** when the change is
something a person would actually want to click through in a running instance:
- New features / feature branches
- UI / editor changes, node changes, workflow-execution or behaviour changes
- Larger or user-facing diffs
**Skip the offer** (a test instance adds nothing) for:
- Dev tooling, CI, build config, scripts (like this one)
- Docs-only or tests-only changes
- Tiny bug fixes, no-behaviour-change refactors, dependency bumps
When skipping, don't nag — at most mention once that a test instance is available
on request.
### Offer after opening a PR, and re-offer on push
After you open a PR for a branch that warrants it, **offer a live test instance.**
Also **re-offer whenever you `git push` new commits** to such a branch — the
deployed instance reflects the pushed code, so a new push means a new build worth
redeploying. Don't just ask a bare yes/no — look at the diff and **propose a
sensible profile**, then let them confirm or adjust. For example:
> "Want a test instance for this? Based on the diff I'd deploy it with instance AI
> enabled (`--ai`) since it touches the AI assistant. Sound good, or a different
> license?"
### Pick the profile from the PR contents
Inspect what the PR changes (`git diff --stat origin/master...HEAD` and the file
paths / feature area), then choose:
| PR touches… | Suggest | Why |
|---|---|---|
| AI features — `@n8n/nodes-langchain`, `@n8n/instance-ai`, the AI assistant/builder, `N8N_AI_*`, "askAi"/agent code | `--ai` | Enables instance AI (and defaults the license to pro2) so the AI features actually run |
| License-gated / enterprise features — `.ee.ts` files or `/ee/` dirs, license checks (`@n8n_io/license-sdk`, `hasFeature`), SSO/SAML/OIDC/LDAP, RBAC/roles/scopes, projects, variables, external secrets, source control/environments, log streaming, insights, folders | `--enterprise` | The feature is gated behind a license and won't be testable on community |
| A specific gated feature/quota you want on/off | `--license pro2 --featureOverride <featureKey>:<value>` | Bakes the override into a generated license (community/enterprise can't be overridden) |
| Anything else — core nodes, generic UI, non-gated bug fixes | *(nothing — community default)* | No license needed |
If both AI and enterprise apply, combine them: `--ai --enterprise`. When unsure,
state your best guess and ask. Run `pnpm nathan help` for the full flag reference.
### Deploy
```bash
pnpm nathan deploy <branch-name> test-<short-name> [flags]
```
Nathan builds the branch image (a few minutes) and the command prints the instance
URL (`https://test-<short-name>.stage-app.n8n.cloud`, login `test@n8n.io` /
`helloWorld7`). Relay that URL to the user.
## Common commands
```bash
pnpm nathan help # full option reference
pnpm nathan deploy my-branch test-my-feature # community license
pnpm nathan deploy my-branch test-sso --enterprise # enterprise license
pnpm nathan deploy my-branch test-ai --ai # instance AI (license -> pro2)
pnpm nathan deploy nightly test-nightly # deploy the n8nio/n8n:nightly image
```
Key flags (after the deploy args): `--license community|enterprise|starter|pro1|pro2|trial`,
`--enterprise`, `--ai`, `-e KEY=value` (repeatable), `--featureOverride key:value`
(needs a generated license).
## `local` caveat
`pnpm nathan local ...` generates a runnable `docker run` bundle, but Nathan
delivers it as **Slack file attachments** (`run-n8n.sh` + `.env`), not to the
terminal — they land in **#updates-pnpm-nathan**
(https://n8nio.slack.com/archives/C0BGVHZ0SCW). `deploy` and `help` return fully
in the terminal.
**Do not invent a `NATHAN_SLACK_CHANNEL`.** Leave it unset (it defaults to
#updates-pnpm-nathan); only set it if the user explicitly gives you a channel id.
## Unsupported
Queue mode, multi-main, and non-SQLite databases are not supported by Nathan.

View File

@ -1,119 +0,0 @@
---
name: n8n:public-api
description: >-
Adds or updates n8n Public API v1 endpoints, OpenAPI specs, and handler wiring.
Use when creating public API handlers, registering paths in openapi.yml, or adding OpenAPI tags. Always use @PublicApiController for new endpoints (API-37+).
---
# Public API v1
Public API lives under `packages/cli/src/public-api/v1/`.
**Always use `@PublicApiController` for new endpoints (API-37+).** Do not add new business logic to `express-openapi-validator` handlers. Controllers use the same decorator style as internal `@RestController`, mounted at `/api/v1` with API-key auth and public errors via `PublicApiControllerRegistry`.
**Legacy (existing endpoints only):** `express-openapi-validator` handlers under `handlers/`; OpenAPI path specs are YAML under each handler's `spec/` directory.
When you touch a legacy endpoint, migrate it to `@PublicApiController` rather than extending the eov handler. Do not mix data-access styles within a new feature.
## Architecture
Convergence is at the **service layer**, not HTTP. Public and internal stay as
two sibling routes over one shared service — neither calls the other:
```
GET /rest/tags → TagsController ┐ JWT auth, internal shape
├─→ TagService
GET /api/v1/tags → TagsPublicController ┘ API-key auth, public DTO
```
## Adding an endpoint (required: controller pattern)
Reference: `v1/controllers/tags.public.controller.ts` (`GET /tags`).
1. **Public DTOs** in `@n8n/api-types` — input query/body + output resource DTO
(distinct from internal shapes when they diverge). Use `Z.class` so the
registry can validate/parse. Wrap list payloads as objects (e.g. `{ data: [...] }`),
same as `TagListPublicDto` / `WorkflowVersionHistoryListPublicDto`.
2. **Controller**`v1/controllers/<feature>.public.controller.ts`
```ts
@PublicApiController('/tags')
export class TagsPublicController {
constructor(private readonly tagService: TagService) {}
@Get('/')
@ApiKeyScope('tag:list')
@ApiResponse(TagListPublicDto)
async getTags(_req, _res, @Query q: ListTagsQueryDto) { /* call service */ }
}
```
- Reuse `@Get/@Post/@Body/@Query/@Param/@GlobalScope/@ProjectScope` as-is.
- For `@ProjectScope` on workflow/credential routes, name the path param
`workflowId` / `credentialId` (or `projectId` / `dataTableId`) — the
registry passes `req.params` to `userHasScopes`, which does not remap `id`.
- `@ApiKeyScope` — string, or `{ anyOf }` / `{ allOf }` (no bare arrays).
- `@ApiResponse(Dto)` — registry `.parse()`s the return value (strips
undeclared fields). Shape is provisional until API-39 (doc-gen).
- Delegate to the same service as the internal REST controller.
3. **Side-effect import** the controller from
`packages/cli/src/public-api/v1/controllers/index.ts` (re-exported via
`public-api/index.ts`) so metadata is registered before
`PublicApiControllerRegistry.activate`. Name the file
`*.public.controller.ts``public-api-controllers.test.ts` fails CI if a
controller file is missing from that barrel or lives outside `controllers/`.
4. **OpenAPI path spec** — still required for docs + `scope-parity.test.ts`
(`handlers/<feature>/spec/paths/…`, `$ref` in `openapi.yml`). Set
`operationId`, `x-required-scope` matching `@ApiKeyScope`. **Do not** set
`x-eov-operation-id` / `x-eov-operation-handler` — those are legacy eov-only;
scope-parity and discover read `@ApiKeyScope` from the controller by matching
method + path.
5. **Coverage manifest** — add every new OpenAPI endpoint to
`packages/nodes-base/nodes/N8n/n8n-api-coverage.json`.
## Legacy eov handlers (do not use for new endpoints)
Only for maintaining endpoints not yet migrated:
1. **Handler**`handlers/<feature>/<feature>.handler.ts`
- Export middleware arrays keyed by `x-eov-operation-id`.
- For scope-protected endpoints, use `publicApiScope()` or
`apiKeyHasScopeWithGlobalScopeFallback()` (they tag the scope-enforcement
middleware with `__apiKeyScope`) and add matching `x-required-scope` in the
path YAML; use `none` for endpoints without an API-key scope (see
`scope-parity.test.ts`).
- **Delegate to the same service layer as the internal REST API.**
Parse input with `@n8n/api-types` DTOs, call `Container.get(SomeService)`,
map errors — do not reach into repositories or duplicate business logic.
2. **OpenAPI path spec**`handlers/<feature>/spec/paths/<path>.yml`
- Set `tags: [<TagName>]` matching a top-level tag in `openapi.yml`.
3. **Register path** — add a `$ref` entry under `paths:` in `openapi.yml`.
4. **Request types** — add a namespace in `packages/cli/src/public-api/types.ts`
when the handler needs typed query/body params.
5. **Coverage manifest** — add every new OpenAPI endpoint to
`packages/nodes-base/nodes/N8n/n8n-api-coverage.json`.
## `tags` array in `openapi.yml`
When adding or editing the top-level `tags:` array in
`packages/cli/src/public-api/v1/openapi.yml`, **keep entries sorted
alphabetically by `name`**. Insert the new tag in order; do not append to the end.
```yaml
tags:
- name: Audit
description: Operations about security audit
- name: CommunityPackage
description: Operations about community packages
# … remaining tags in A→Z order by name
```
`scope-parity.test.ts` asserts this ordering — CI fails if tags drift out of
sort order.
## Reference
- **Controller pattern (required for new work):** `v1/controllers/tags.public.controller.ts`, `v1/controllers/workflows.public.controller.ts`
- **Registry:** `packages/cli/src/public-api/public-api-controller.registry.ts`
- Legacy eov examples (migration targets, not templates for new endpoints):
`handlers/insights/`, `handlers/variables/`, `handlers/folders/`,
`handlers/projects/`, `handlers/data-tables/`, `handlers/workflows/`
- Multipart: `handlers/n8n-packages/` (see also
`packages/cli/src/modules/n8n-packages/CLAUDE.md`)

View File

@ -1,70 +0,0 @@
---
name: n8n:telemetry
description: >-
Guides adding, changing, and reviewing telemetry through the `@n8n/telemetry`
event registry. Use when working on telemetry, analytics, tracking, product
events, `track()` calls, or RudderStack/PostHog product events, in frontend
or backend code — and whenever you need to find which registered telemetry
events exist, what an event means, or what properties it carries.
---
# Telemetry
## The registry
Events migrated to the registry live in `packages/@n8n/telemetry` as one entry per event — its exact emitted name, a description, and a zod schema typing its properties — organized per product domain in `src/events/` and composed into `TELEMETRY_EVENT.<DOMAIN>.<EVENT>`. The package defines registered events and never depends on transport SDKs.
**To find which events are registered, what they mean, or what properties they carry, run the catalog first:**
```bash
pnpm --filter @n8n/telemetry catalog # human-readable, grouped by domain
pnpm --filter @n8n/telemetry catalog --json # structured, for programmatic use
```
The registry is being adopted incrementally. Events not yet registered do not appear in the catalog, so search `track()` call sites when the catalog has no match.
Pass the entry itself to `track()` — it resolves the emitted name internally:
```ts
import { TELEMETRY_EVENT } from '@n8n/telemetry';
telemetry.track(TELEMETRY_EVENT.PLATFORM.USER_IS_PART_OF_EXPERIMENT, {
name: experimentName,
variant,
});
```
Both `track()` implementations accept registry entries and plain strings. Plain strings remain supported for events that have not yet migrated:
- Frontend: `packages/frontend/editor-ui/src/app/plugins/telemetry/index.ts`
- Backend: `packages/cli/src/telemetry/index.ts`
Entries get property autocomplete and compile-time checks — typo'd, missing, or wrongly typed properties fail typecheck. When the telemetry transport is initialized, `track()` additionally validates registered-event payloads via `getEventValidationError` (shared from `@n8n/telemetry`) and logs a warning on mismatch, including unrecognized properties that slipped past structural typing. A validation warning does not stop the event from being emitted.
## Adding an event
1. **Check the catalog first** (`pnpm --filter @n8n/telemetry catalog`). If an existing event covers the same user action from another surface, augment it with a property instead of adding a near-duplicate event.
2. **Pick the domain by the event's subject** — what the event is about, never the surface that triggered it. `User opened Credential modal` is CREDENTIALS whether opened from the NDV, template setup, or chat. The trigger context goes into a `source` property.
3. **Name it with the house grammar:** sentence case, actor first, past-tense verb, specific object (`User pinned node data`). No template interpolation in names — variability goes into properties. The name must snake_case cleanly into a BigQuery table name: no punctuation beyond spaces, no casing that collides after snake_casing.
4. **Write the entry `description`** stating what the event means and when it fires — a registry test rejects blank descriptions. Document individual properties with `.describe()` where the key alone is not obvious.
5. **Type the properties with zod (`import { z } from 'zod/v4'`):** `snake_case` keys, explicit `.optional()` where a call site may omit a value, `z.looseObject()`/`.catchall()` for genuinely dynamic remainders. Schemas must stay JSON-Schema-representable — no transforms, refinements, or `z.date()` (a registry test enforces this via `z.toJSONSchema()`).
6. **Place the emission:** frontend via `useTelemetry().track(...)`; backend either through a `RelayEventMap` handler in `packages/cli/src/events/relays/telemetry.event-relay.ts` (event-bus-driven) or a direct `Telemetry.track(...)` call — both reference the same registry entry.
## Hard rules
- **Never rename an emitted event.** BigQuery materializes one table per event name; a rename orphans downstream history. A rename is delete + create, names are never reused, and removals must be coordinated with the data team before deleting the registry entry.
- **Never duplicate an event name** — one entry per event across all domains, referenced by every call site (even FE + BE). CI fails on collision.
- **Properties evolve additively only.** Changing a property's type forks warehouse columns even under a stable name. Mark deprecations on the schema (`.meta({ deprecated: true })`) instead of removing.
- **Breaking changes need a data-team heads-up** in Slack plus a Notion note before they ship.
## Testing
Do not retype event-name literals in tests:
- In call-site tests, mock `useTelemetry().track` or the backend `Telemetry.track` service and expect the registry entry itself with the payload.
- In frontend transport tests, expect `window.rudderanalytics.track` to receive `entry.name` and the augmented payload.
- In backend transport tests, expect the RudderStack payload's `event` field to equal `entry.name` and its `properties` to include the event payload.
## Related
Experiment exposure and metric events follow `n8n:experiments` (`.agents/skills/experiments/SKILL.md`).

View File

@ -1,3 +0,0 @@
{
"issues": 169
}

View File

@ -1 +0,0 @@
../../../../.agents/skills/nathan

View File

@ -1 +0,0 @@
../../../../.agents/skills/public-api

View File

@ -1 +0,0 @@
../../../../.agents/skills/telemetry

View File

@ -12,7 +12,7 @@
"Bash(popd)",
"Bash(pushd:*)",
"Bash(mkdir -p .claude/plans)",
"Edit(.claude/plans/*)"
"Write(.claude/plans/*)"
]
},
"hooks": {

1
.github/CODEOWNERS vendored
View File

@ -3,4 +3,3 @@ packages/@n8n/db/src/migrations/ @n8n-io/migrations-review
.github/scripts @n8n-io/qa-dx
.github/actions @n8n-io/qa-dx
.github/poutine-rules @n8n-io/qa-dx
docker/get-n8n.sh @n8n-io/qa-dx

View File

@ -196,10 +196,7 @@ on every push made cost untenable; firing on every review approval cascaded
through the dismiss-stale-on-push → re-approve loop, which also blew up.
The current trigger fires once per `opened` / `reopened` / `ready_for_review`
on a non-fork PR touching the eval surface, and runs the `pr` test-case dataset
(a small set of high-reliability, capability-diverse cases) instead of the full
suite. Test cases are pulled at run time from the LangTracer suite
`baseline` — the source of truth; CI has no disk fallback (local runs
keep `--source disk` for authoring). To
(~6 high-reliability, capability-diverse cases) instead of the full ~14. To
re-run after pushing a fix, dispatch `ci-instance-ai-evals.yml` with the PR
number (optionally `tier: full` for broader coverage) — results post back to
the PR. The lighter `test-evals-discovery.yml` still runs on every push as part
@ -209,8 +206,8 @@ of `ci-pull-requests.yml`.
the lab bench.** The gate deliberately exposes only PR re-runs. Anything that
isn't PR gating — baselines, model experiments, arbitrary branch runs — goes
through `test-evals-instance-ai.yml`'s own dispatch form ("Instance AI
Evals: Experiments"): full knob set (branch, filter, tier, suite,
iterations, experiment-name, model), no per-PR cancellation (dispatches run in parallel, e.g. concurrent
Evals: Experiments"): full knob set (branch, filter, tier, iterations, experiment-name,
model), no per-PR cancellation (dispatches run in parallel, e.g. concurrent
model-comparison arms), and SHA-keyed docker cache hits on master. Evals never
run on fork PRs: the event trigger gates on `head.repo.fork`, and the `pr`
re-run path refuses fork PRs in `resolve` (dispatched runs carry secrets).

View File

@ -7,9 +7,9 @@ description: 'Configures Node.js with pnpm, installs Aikido SafeChain for supply
inputs:
node-version:
description: 'Node.js version to use. Pinned to 24.18.0 by default for reproducible builds.'
description: 'Node.js version to use. Pinned to 24.16.0 by default for reproducible builds.'
required: false
default: '24.18.0'
default: '24.16.0'
enable-docker-cache:
description: 'Whether to set up Blacksmith Buildx for Docker layer caching (Blacksmith runners only).'
required: false
@ -251,15 +251,8 @@ runs:
shell: bash
run: echo "running=${TURBOGHA_PORT:+true}" >> "$GITHUB_OUTPUT"
# Skipped on Windows: the turbogha server binds IPv4 while `localhost`
# resolves to IPv6 first there, so turbo can never reach it (the build
# logs `failed to contact remote cache` for every artifact and falls back
# to a local cache). The remote cache is inert, but the action's post-run
# still fetches the unreachable server to save it and dies with a bare
# `fetch failed`, turning the whole job red. Skip it so the one Windows
# build job stays green; Linux/Blacksmith jobs keep remote caching.
- name: Configure Turborepo Cache
if: steps.turbo-server.outputs.running != 'true' && runner.os != 'Windows'
if: steps.turbo-server.outputs.running != 'true'
uses: rharkor/caching-for-turbo@5d14fba18e450c09393333cfd4242e8b3cb455a6 # v2.4.2
with:
server-port: 0

View File

@ -10,7 +10,9 @@
"n8n-node-dev",
"n8n-nodes-base",
"n8n-playwright",
"n8n-workflow"
"n8n-workflow",
"typescript",
"@typescript/*"
]
}
}

View File

@ -78,7 +78,6 @@ class BuildContext {
sanitizeBranch(branch) {
if (!branch) return 'unknown';
return branch
.replace(/^refs\/heads\//, '')
.toLowerCase()
.replace(/[^a-z0-9._-]/g, '-')
.replace(/^[.-]/, '')

View File

@ -1,18 +1,7 @@
import semver from 'semver';
import { getMonorepoProjects } from './pnpm-utils.mjs';
const NPM_REGISTRY = 'https://registry.npmjs.org';
// Standalone packages release from master out-of-sync with the main pipeline
// (release-standalone-package.yml), so their `latest` follows the newest beta
// on npm instead of the version recorded in the stable checkout.
const STANDALONE_PACKAGES_FOLLOWING_BETA = new Set([
'@n8n/create-node',
'@n8n/eslint-plugin-community-nodes',
'@n8n/scan-community-package',
]);
/**
* @param {string} name
* @param {string} version
@ -34,30 +23,6 @@ async function setDistTag(name, version, tag, token) {
});
}
/** @param {string} name */
async function getDistTags(name) {
const res = await fetch(`${NPM_REGISTRY}/-/package/${encodeURIComponent(name)}/dist-tags`);
if (!res.ok) {
throw new Error(`Failed to fetch dist-tags for ${name}: HTTP ${res.status}`);
}
return await res.json();
}
/**
* Resolve the version `latest` should point at, or null if no move is needed.
* Standalone packages follow the npm `beta` dist-tag; a standalone release
* from master may already have pushed `latest` past beta, so never downgrade.
* @param {import('./pnpm-utils.mjs').PnpmPackage} pkg
*/
export async function resolveLatestVersion(pkg) {
if (!STANDALONE_PACKAGES_FOLLOWING_BETA.has(pkg.name)) return pkg.version;
const tags = await getDistTags(pkg.name);
const target = tags.beta ?? pkg.version;
if (tags.latest && semver.gte(tags.latest, target)) return null;
return target;
}
async function setLatestForMonorepoPackages() {
const token = process.env.NPM_TOKEN;
if (!token) {
@ -74,15 +39,10 @@ async function setLatestForMonorepoPackages() {
const failures = [];
for (const pkg of publishedPackages) {
try {
const version = await resolveLatestVersion(pkg);
if (version === null) {
console.log(`Skipped ${pkg.name}: latest is already at or ahead of beta`);
continue;
}
const versionName = `${pkg.name}@${pkg.version}`;
const versionName = `${pkg.name}@${version}`;
const res = await setDistTag(pkg.name, version, 'latest', token);
try {
const res = await setDistTag(pkg.name, pkg.version, 'latest', token);
if (res.ok) {
console.log(`Set ${versionName} as latest`);
@ -93,8 +53,8 @@ async function setLatestForMonorepoPackages() {
}
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
console.error(`Failed to set latest for ${pkg.name}: ${message}`);
failures.push(pkg.name);
console.error(`Failed to set ${versionName} as latest: ${message}`);
failures.push(versionName);
}
}

View File

@ -1,53 +0,0 @@
import { describe, it, before, afterEach } from 'node:test';
import assert from 'node:assert/strict';
/**
* Run these tests by running
*
* node --test --experimental-test-module-mocks ./.github/scripts/set-latest-for-monorepo-packages.test.mjs
* */
let resolveLatestVersion;
before(async () => {
({ resolveLatestVersion } = await import('./set-latest-for-monorepo-packages.mjs'));
});
const originalFetch = globalThis.fetch;
afterEach(() => {
globalThis.fetch = originalFetch;
});
function mockDistTags(tags) {
globalThis.fetch = async () => ({ ok: true, json: async () => tags });
}
describe('resolveLatestVersion', () => {
it('uses the checkout version for regular monorepo packages', async () => {
globalThis.fetch = async () => {
throw new Error('should not fetch dist-tags for regular packages');
};
const version = await resolveLatestVersion({ name: '@n8n/config', version: '1.2.3' });
assert.equal(version, '1.2.3');
});
it('pins standalone packages to the beta dist-tag', async () => {
mockDistTags({ beta: '0.40.1', latest: '0.39.3' });
const version = await resolveLatestVersion({ name: '@n8n/create-node', version: '0.39.3' });
assert.equal(version, '0.40.1');
});
it('never downgrades latest below a newer standalone release', async () => {
mockDistTags({ beta: '0.40.1', latest: '0.41.0' });
const version = await resolveLatestVersion({ name: '@n8n/create-node', version: '0.39.3' });
assert.equal(version, null);
});
it('skips standalone packages without a beta tag when latest is current', async () => {
mockDistTags({ latest: '0.25.0' });
const version = await resolveLatestVersion({
name: '@n8n/eslint-plugin-community-nodes',
version: '0.25.0',
});
assert.equal(version, null);
});
});

View File

@ -29,7 +29,7 @@ jobs:
# While we're on alpine 3.22 awaiting NODE-4184 (graphicsmagick → sharp
# migration that unblocks 3.23), Node 26 base builds can't succeed.
# Restore '26' to this matrix once 3.23 is back.
node_version: ['22', '24.18.0']
node_version: ['22', '24.16.0']
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

View File

@ -30,11 +30,11 @@ jobs:
strategy:
fail-fast: false
matrix:
node-version: [22.22.3, 24.18.0]
node-version: [22.22.3, 24.16.0]
with:
ref: ${{ github.sha }}
nodeVersion: ${{ matrix.node-version }}
collectCoverage: ${{ matrix.node-version == '24.18.0' }}
collectCoverage: ${{ matrix.node-version == '24.16.0' }}
secrets: inherit
lint:

View File

@ -69,5 +69,3 @@ jobs:
N8N_ENCRYPTION_KEY: ${{ secrets.N8N_ENCRYPTION_KEY }}
EVALS_LANGSMITH_ENDPOINT: ${{ secrets.EVALS_LANGSMITH_ENDPOINT }}
EVALS_LANGSMITH_API_KEY: ${{ secrets.EVALS_LANGSMITH_API_KEY }}
EVALS_LANGTRACER_URL: ${{ secrets.EVALS_LANGTRACER_URL }}
LANGTRACER_API_KEY: ${{ secrets.LANGTRACER_API_KEY }}

View File

@ -11,9 +11,9 @@ concurrency:
jobs:
install-and-build:
name: Install & Build
runs-on: ${{ vars.RUNNER_PROVIDER == 'github' && 'ubuntu-latest' || 'blacksmith-4vcpu-ubuntu-2204' }}
runs-on: ${{ vars.RUNNER_PROVIDER == 'github' && 'ubuntu-latest' || 'blacksmith-2vcpu-ubuntu-2204' }}
env:
NODE_OPTIONS: '--max-old-space-size=7168'
NODE_OPTIONS: '--max-old-space-size=6144'
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
QA_METRICS_WEBHOOK_URL: ${{ secrets.QA_METRICS_WEBHOOK_URL }}
QA_METRICS_WEBHOOK_USER: ${{ secrets.QA_METRICS_WEBHOOK_USER }}

View File

@ -58,7 +58,7 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.18.0
node-version: 24.16.0
- name: Fetch read-all live ledger from BigQuery
# Read-all (no ?package= param): one curl returns every row across
@ -179,16 +179,16 @@ jobs:
# source_file re-score path). Without it emit-payload falls back to git,
# which yields null churn/fix_density on this shallow clone.
run: |
signals_arg=()
signals_arg=""
if [ -f .mutation-health/signals.json ]; then
signals_arg=(--signals .mutation-health/signals.json)
signals_arg="--signals .mutation-health/signals.json"
else
echo "::notice::signals.json not present — churn/fix_density will fall back to git (null on shallow clone)."
fi
node scripts/mutation-health/emit-payload.mjs \
--summary "$REPORTS_DIR/summary.json" \
--package "$PACKAGE_NAME" \
"${signals_arg[@]}"
$signals_arg
- name: POST result payload
env:

View File

@ -25,7 +25,7 @@ jobs:
build-command: pnpm run build --filter=@n8n/utils --filter=@n8n/vitest-config --filter=@n8n/chat --filter=@n8n/design-system
- name: Publish to Chromatic
uses: chromaui/action@14cfaef73576e69f95f47f60058063f46ca38719 # v18.1.0
uses: chromaui/action@1cfa065cbdab28f6ca3afaeb3d761383076a35aa # v11
id: chromatic_tests
with:
workingDir: packages/frontend/@n8n/storybook

View File

@ -80,12 +80,9 @@ jobs:
ensure-correct-latest-version-on-npm:
name: Ensure correct latest version on npm
# Also runs on beta patches: standalone packages pin `latest` to the newest
# beta, so every beta publish needs a re-pin, not just stable promotions.
if: |
inputs.bump == 'minor' ||
(inputs.track == 'stable' && inputs.release_type != 'rc') ||
(inputs.track == 'beta' && inputs.release_type != 'rc')
(inputs.track == 'stable' && inputs.release_type != 'rc')
uses: ./.github/workflows/release-set-stable-npm-packages-to-latest.yml
secrets: inherit

View File

@ -253,4 +253,4 @@ jobs:
run: |
node .github/scripts/slack/notify.mjs \
--channel C036AELNMV0 \
--text '<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Release publish failed for n8n@${{ needs.determine-version-info.outputs.version }}>. Please go to the actions page and retry failed runs to recover a flake in the release pipeline. <!subteam^S08FYH9C9ME|@release-captain>'
--text '<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Release publish failed for n8n@${{ needs.determine-version-info.outputs.version }}>. Please Go to the actions page and retry failed runs to recover a flake in the release pipeline.'

View File

@ -75,7 +75,7 @@ jobs:
steps:
- uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: 24.18.0
node-version: 24.16.0
# Remove after https://github.com/npm/cli/issues/8547 gets resolved
- run: echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ~/.npmrc

View File

@ -8,19 +8,14 @@ on:
required: true
type: choice
options:
- '@n8n/codemirror-lang'
- '@n8n/codemirror-lang-html'
- '@n8n/codemirror-lang-sql'
- '@n8n/create-node'
- '@n8n/eslint-plugin-community-nodes'
- '@n8n/node-cli'
- '@n8n/scan-community-package'
bump:
description: 'Version bump type'
required: true
type: choice
options:
- patch
- minor
# This workflow publishes out-of-sync with the main release pipeline, so it uses
# token auth (secrets.NPM_DIST_TAG_AND_INITIAL_PUBLISH_TOKEN) rather than trusted
# publishing (OIDC) — the OIDC relationship is reserved for release-publish.yml.
# All packages listed above require OIDC enabled in NPM. https://docs.npmjs.com/trusted-publishers
concurrency:
group: release-package-${{ github.event.inputs.package }}
@ -30,14 +25,15 @@ env:
CACHE_KEY: ${{ github.sha }}-${{ github.event.inputs.package }}-build
jobs:
bump-and-push:
name: Bump version and push to master
publish-to-npm:
name: Publish to NPM
runs-on: ubuntu-latest
timeout-minutes: 10
environment: minor-release-tag-merge
outputs:
version: ${{ steps.bump.outputs.version }}
sha: ${{ steps.push.outputs.sha }}
timeout-minutes: 15
environment: npm
permissions:
id-token: write
env:
NPM_CONFIG_PROVENANCE: true
steps:
- name: Check branch
@ -46,88 +42,19 @@ jobs:
echo "::error::This workflow can only be run from the master branch"
exit 1
- name: Generate GitHub App Token
id: generate_token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with:
app-id: ${{ secrets.RELEASE_TAG_MERGE_APP_ID }}
private-key: ${{ secrets.RELEASE_TAG_MERGE_PRIVATE_KEY }}
skip-token-revoke: false
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: master
token: ${{ steps.generate_token.outputs.token }}
- name: Setup pnpm
uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4.3.0
- name: Setup Node.js
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
with:
node-version: '24.18.0'
# A version bump only edits one package.json, so no workspace install/build
# is needed. `pnpm ls -r --only-projects` reads the workspace config directly.
- name: Bump version
id: bump
env:
PACKAGE: ${{ github.event.inputs.package }}
BUMP: ${{ github.event.inputs.bump }}
run: |
PKG_PATH=$(pnpm ls -r --only-projects --json | jq -r --arg n "$PACKAGE" '.[] | select(.name==$n) | .path')
if [ -z "$PKG_PATH" ]; then
echo "::error::Could not resolve path for package '$PACKAGE'"
exit 1
fi
NEW_VERSION=$(cd "$PKG_PATH" && npm version "$BUMP" --no-git-tag-version)
NEW_VERSION=${NEW_VERSION#v}
echo "version=$NEW_VERSION" >> "$GITHUB_OUTPUT"
echo "Bumped $PACKAGE to $NEW_VERSION"
- name: Commit and push version bump
id: push
env:
PACKAGE: ${{ github.event.inputs.package }}
NEW_VERSION: ${{ steps.bump.outputs.version }}
run: |
git config user.name "n8n-release-tag-merge[bot]"
git config user.email "256767729+n8n-release-tag-merge[bot]@users.noreply.github.com"
git commit -am "build: release ${PACKAGE}@${NEW_VERSION} (no-changelog)"
git push origin HEAD:master
echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
publish-to-npm:
name: Publish to NPM
needs: bump-and-push
runs-on: ubuntu-latest
timeout-minutes: 15
environment: release
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
ref: ${{ needs.bump-and-push.outputs.sha }}
- name: Setup and Build
uses: ./.github/actions/setup-nodejs
with:
build-command: 'pnpm turbo build --filter=...${{ github.event.inputs.package }}'
build-command: 'pnpm turbo build --filter "...${{ github.event.inputs.package }}"'
- name: Pre publishing changes
run: |
node .github/scripts/ensure-provenance-fields.mjs
- name: Configure NPM token
env:
NPM_TOKEN: ${{ secrets.NPM_DIST_TAG_AND_INITIAL_PUBLISH_TOKEN }}
run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc
# If this job fails after the version bump was already pushed to master,
# re-run only this job (do not re-run the whole workflow — that double-bumps).
- name: Publish package
env:
PACKAGE: ${{ github.event.inputs.package }}
run: pnpm --filter "$PACKAGE" publish --access public --no-git-checks
run: pnpm --filter "$PACKAGE" publish --access public --no-git-checks --publish-branch master

View File

@ -248,11 +248,8 @@ jobs:
shell: bash
run: sleep 60
# Advisory only: a Codecov API hiccup (e.g. a 503) must not red the whole
# nightly nor block the impact-map refresh, which runs off the built map.
- name: Analyse Coverage Gaps
if: always()
continue-on-error: true
env:
CODECOV_API_TOKEN: ${{ secrets.CODECOV_API_TOKEN }}
run: |
@ -266,104 +263,3 @@ jobs:
name: coverage-gap-report
path: coverage-gaps.json
retention-days: 21
# Refresh the committed impact map PRs read for E2E selection. Without this the
# map only updates on manual commits and drifts, so newly-covered source→spec
# couplings get declared uncovered and their E2E specs skipped. Gated on ALL
# shards passing (complete map) + aggregate having built it — a partial shard
# set yields a degraded map, worse than a stale one.
commit-impact-map:
name: Commit refreshed impact map
needs: [e2e, aggregate]
if: needs.e2e.result == 'success' && needs.aggregate.result == 'success'
runs-on: ubuntu-latest
# Least-privilege GITHUB_TOKEN: checkout + download-artifact only need read;
# the branch push + PR are done with the scoped app token below, not this token.
permissions:
contents: read
actions: read
outputs:
pull-request-number: ${{ steps.create-pr.outputs.pull-request-number }}
steps:
- name: Generate GitHub App Token
id: generate-token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with:
app-id: ${{ secrets.N8N_ASSISTANT_APP_ID }}
private-key: ${{ secrets.N8N_ASSISTANT_PRIVATE_KEY }}
# Scope the token to only what the branch push + PR need.
permission-contents: write
permission-pull-requests: write
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
token: ${{ steps.generate-token.outputs.token }}
# Don't persist the token in .git/config (avoids leaking it via artifacts);
# create-pull-request pushes with its own token input, not the git remote creds.
persist-credentials: false
- name: Download coverage report artifact
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
with:
name: coverage-report
path: /tmp/coverage-report
- name: Copy impact map into place
run: |
MAP=/tmp/coverage-report/impact-map.json
# Guard: a missing/empty map is a build hiccup — keep the committed map
# rather than clobber it with a degraded one.
node -e '
const fs = require("fs");
const m = JSON.parse(fs.readFileSync(process.argv[1], "utf8"));
const n = Array.isArray(m.specs) ? m.specs.length : 0;
if (!n) { console.error("impact map has no specs — refusing to commit"); process.exit(1); }
console.log("impact map ok: " + n + " specs");
' "$MAP"
# Raw copy: the map is intentionally minified and biome-ignored
# (.github/test-metrics/**). Do NOT format it.
cp "$MAP" .github/test-metrics/e2e-impact-map.json
- name: Check for changes
id: check-changes
run: |
if git diff --quiet .github/test-metrics/e2e-impact-map.json; then
echo "Impact map unchanged"
echo "has_changes=false" >> "$GITHUB_OUTPUT"
else
echo "Impact map changed"
echo "has_changes=true" >> "$GITHUB_OUTPUT"
fi
- name: Create Pull Request
if: steps.check-changes.outputs.has_changes == 'true'
id: create-pr
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
with:
token: ${{ steps.generate-token.outputs.token }}
commit-message: 'chore: Update e2e impact map'
labels: 'automation:scheduled-update'
title: 'chore: Update e2e impact map'
body: |
Automated refresh of the committed E2E impact map from the latest
nightly coverage run.
PRs use this map to scope which E2E specs run; refreshing it keeps
newly-covered source→spec couplings visible so changes aren't
declared uncovered and their specs silently skipped.
_Generated by the E2E coverage nightly._
branch: update-e2e-impact-map
base: master
delete-branch: true
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
committer: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
approve-and-automerge:
needs: [commit-impact-map]
if: needs.commit-impact-map.outputs.pull-request-number != ''
uses: ./.github/workflows/util-approve-and-set-automerge.yml
secrets: inherit
with:
pull-request-number: ${{ needs.commit-impact-map.outputs.pull-request-number }}

View File

@ -18,11 +18,6 @@ on:
required: false
type: string
default: ''
suite:
description: 'LangTracer suite slug or id to pull test cases from.'
required: false
type: string
default: 'baseline'
sandbox-provider:
description: 'Sandbox provider (n8n-sandbox or daytona)'
required: false
@ -77,10 +72,6 @@ on:
description: 'Test-case dataset to run (e.g. "pr", "full"). Empty = no filter.'
required: false
default: ''
suite:
description: 'LangTracer suite slug or id to pull test cases from.'
required: false
default: 'baseline'
sandbox-provider:
description: 'Sandbox provider (n8n-sandbox or daytona)'
required: false
@ -101,19 +92,12 @@ on:
jobs:
run-evals:
name: 'Run Evals'
# 8vcpu/32GB: full-suite N=10 baselines need ~150 min of eval time and
# did not fit the 4vcpu tier at any timeout.
runs-on: blacksmith-8vcpu-ubuntu-2204
# Long ceiling only for high-N baseline captures; regular runs keep a
# tight guard so a wedged run fails fast. Plain comparison (not fromJSON):
# it coerces the string input to a number, and a malformed dispatch value
# (NaN) falls back to the 90-minute guard instead of erroring the job.
timeout-minutes: ${{ (inputs.iterations || '3') >= 5 && 240 || 90 }}
runs-on: blacksmith-4vcpu-ubuntu-2204
timeout-minutes: 90
env:
# Each port hosts an independent n8n container. The eval CLI's
# work-stealing allocator dispatches builds across them, capped per-lane.
# 10 lanes x 2.5 GB caps = 25 GB, leaving ~7 GB for sandbox + CLI + OS.
LANE_PORTS: '5678,5679,5680,5681,5682,5683,5684,5685,5686,5687'
LANE_PORTS: '5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688'
permissions:
contents: read
pull-requests: write
@ -138,25 +122,6 @@ jobs:
with:
cache-sha: ${{ inputs.cache-sha }}
# Host OOMs and disk exhaustion leave no application trace — sample host
# + container telemetry every 60s and ship it with the results artifact.
- name: Start host telemetry sampler
run: |
mkdir -p eval-diag
{ echo "=== disk at job start ==="; df -h /; docker system df; } > eval-diag/df-at-start.log
nohup bash -c 'while true; do
{
date -u +%FT%TZ
free -m | head -2
df -h / | tail -1
docker stats --no-stream --format "{{.Name}} cpu={{.CPUPerc}} mem={{.MemUsage}}"
ps -eo rss=,pid=,comm= --sort=-rss | head -5
echo
} >> eval-diag/host-samples.log 2>&1
sleep 60
done' > /dev/null 2>&1 &
echo $! > eval-diag/sampler.pid
- name: Start sandbox service
if: ${{ inputs.sandbox-provider == 'n8n-sandbox' }}
run: pnpm --filter n8n-containers services --services sandbox --network n8n-eval-net --name n8n-svc-sandbox
@ -209,17 +174,8 @@ jobs:
IFS=',' read -ra PORTS <<< "$LANE_PORTS"
for i in "${!PORTS[@]}"; do
port="${PORTS[$i]}"
# Bounded and self-healing: a lane that exhausts its capped heap is
# restarted by docker instead of staying dead; pruning + log caps
# keep per-lane disk and memory flat over a multi-hour run.
docker run -d --name "n8n-eval-$((i+1))" \
"${NETWORK_ARGS[@]}" \
--memory 2.5g --memory-swap 2.5g \
--restart on-failure \
--log-opt max-size=50m --log-opt max-file=2 \
-e NODE_OPTIONS=--max-old-space-size=2048 \
-e EXECUTIONS_DATA_PRUNE=true \
-e EXECUTIONS_DATA_MAX_AGE=1 \
-e E2E_TESTS=true \
-e N8N_ENABLED_MODULES=instance-ai \
-e N8N_AI_ENABLED=true \
@ -239,7 +195,7 @@ jobs:
n8nio/n8n:local
done
# 120s budget per port: containers booting in parallel on a shared
# runner contend for CPU/disk during n8n's startup (DB migrations,
# 4vcpu runner contend for CPU/disk during n8n's startup (DB migrations,
# license init), so each takes longer than a solo boot.
for port in "${PORTS[@]}"; do
ready=false
@ -321,25 +277,6 @@ jobs:
exit 1
fi
# Disk pressure develops during the eval (per-lane SQLite growth,
# verifier snapshots, logs), not at job start — so the runway check
# lives here, after the image load and lane startup, where "is there
# enough free disk for the next few hours" is a meaningful question.
# A run-A-style on-runner fallback build leaves tens of GB of builder
# cache that is safe to reclaim once every lane is up.
- name: Ensure disk runway for the eval run
shell: bash
run: |
free_gb=$(df -BG --output=avail / | tail -1 | tr -dc '0-9')
if [ "${free_gb:-0}" -lt 30 ]; then
echo "Only ${free_gb}GB free — reclaiming builder cache before the run accretes data"
# Best-effort: a prune failure must not skip the eval run itself.
docker builder prune -f || echo "::warning::builder prune failed — continuing with ${free_gb}GB free"
df -h / || true
else
echo "Disk runway OK: ${free_gb}GB free"
fi
- name: Run Instance AI Evals
continue-on-error: true
working-directory: packages/@n8n/instance-ai
@ -354,11 +291,6 @@ jobs:
LANGSMITH_PROJECT: instance-ai-evals
FILTER: ${{ inputs.filter }}
TIER: ${{ inputs.tier }}
SUITE: ${{ inputs.suite }}
# LangTracer is the test-case source of truth (TRUST-247); the CLI
# pulls the suite per run via its export API.
LANGTRACER_URL: ${{ secrets.EVALS_LANGTRACER_URL }}
LANGTRACER_API_KEY: ${{ secrets.LANGTRACER_API_KEY }}
ITERATIONS: ${{ inputs.iterations }}
EXPERIMENT_NAME: ${{ inputs.experiment-name }}
EVAL_PR_NUMBER: ${{ inputs.pr-number || github.event.pull_request.number }}
@ -370,12 +302,6 @@ jobs:
done
BASE_URLS=$(IFS=,; printf '%s' "${URLS[*]}")
ARGS=(--base-url "$BASE_URLS" --concurrency 32 --verbose --iterations "${ITERATIONS:-3}")
# LangTracer is the only CI case source (no disk fallback by design).
ARGS+=(--source langtracer --suite "${SUITE:-baseline}")
# Pin the LangSmith cohort: langtracer mode otherwise derives a
# suite-scoped dataset/baseline prefix, which would fork the KPI
# history and orphan the baseline comparison.
ARGS+=(--dataset instance-ai-workflow-evals --baseline-prefix instance-ai-baseline-)
[ -n "$FILTER" ] && ARGS+=(--filter "$FILTER")
[ -n "$TIER" ] && ARGS+=(--tier "$TIER")
[ -n "$EXPERIMENT_NAME" ] && ARGS+=(--experiment-name "$EXPERIMENT_NAME")
@ -420,22 +346,19 @@ jobs:
done
# Layer 1 — accuracy filter: only surface diagnostic signals.
# `tail -1000` after the filter so we get the LATEST matching lines
# `tail -100` after the filter so we get the LATEST matching lines
# (post-eval failure signal), not the earliest startup-time ones.
# -t keeps timestamps; the inspect line surfaces OOM kills/restarts,
# which leave no log line of their own.
SIGNALS='sandbox|builder|sandbox-service|daytona|instance.?ai|error|warn|reject|exception|fail'
for c in $(docker ps -aq --filter "name=n8n-eval-"); do
name=$(docker inspect --format '{{.Name}}' "$c" | sed 's|^/||')
echo ""
echo "============================================================"
echo "=== $name (filtered diagnostic signals, last 1000 lines) ==="
echo "=== $name (filtered diagnostic signals, last 100 lines) ==="
echo "============================================================"
docker inspect --format 'state: status={{.State.Status}} oomkilled={{.State.OOMKilled}} exitcode={{.State.ExitCode}} restarts={{.RestartCount}} started={{.State.StartedAt}} finished={{.State.FinishedAt}}' "$c" || true
docker logs -t "$c" 2>&1 \
docker logs "$c" 2>&1 \
| grep -ivE 'migration' \
| grep -iE "$SIGNALS" \
| tail -1000 \
| tail -100 \
|| true
done
@ -452,7 +375,6 @@ jobs:
- name: Stop n8n containers
if: ${{ always() }}
run: |
[ -f eval-diag/sampler.pid ] && kill "$(cat eval-diag/sampler.pid)" 2>/dev/null || true
mapfile -t ids < <(docker ps -aq --filter "name=n8n-eval-")
if [ "${#ids[@]}" -gt 0 ]; then
docker stop "${ids[@]}" 2>/dev/null || true
@ -498,20 +420,4 @@ jobs:
path: |
packages/@n8n/instance-ai/eval-results.json
packages/@n8n/instance-ai/.data/workflow-eval-report.html
eval-diag/
retention-days: 14
# The eval step runs with continue-on-error so the logs/artifacts above
# always land — but a run that never wrote eval-results.json (bad secret,
# unresolvable LangTracer suite, CLI crash before any results) must still
# fail the job rather than end green with zero evals. Per-case build
# failures DO write results and stay green by design. Mirrors the same
# guard in test-evals-mcp.yml.
- name: Fail when no results were produced
if: ${{ always() }}
working-directory: packages/@n8n/instance-ai
run: |
if [ ! -f eval-results.json ]; then
echo "::error::Eval run produced no eval-results.json — it failed before writing any results. Check the 'Run Instance AI Evals' step logs and the uploaded artifacts."
exit 1
fi

View File

@ -25,11 +25,6 @@ on:
required: false
type: string
default: 'mcp'
suite:
description: 'LangTracer suite slug or id to pull test cases from.'
required: false
type: string
default: 'baseline'
filter:
description: 'Only build + eval test cases whose slug matches (comma-separated; empty = whole tier)'
required: false
@ -76,11 +71,6 @@ on:
required: false
EVALS_LANGSMITH_API_KEY:
required: false
# The eval CLI pulls the test-case suite from LangTracer.
EVALS_LANGTRACER_URL:
required: false
LANGTRACER_API_KEY:
required: false
workflow_dispatch:
inputs:
branch:
@ -91,10 +81,6 @@ on:
description: 'Test-case dataset to build + eval (e.g. "mcp")'
required: false
default: 'mcp'
suite:
description: 'LangTracer suite slug or id to pull test cases from.'
required: false
default: 'baseline'
filter:
description: 'Only build + eval test cases whose slug matches (comma-separated; empty = whole tier)'
required: false
@ -268,9 +254,6 @@ jobs:
BASE_URLS: ${{ steps.lanes.outputs.base_urls }}
LANES: ${{ inputs.lanes || '6' }}
TIER: ${{ inputs.tier }}
SUITE: ${{ inputs.suite }}
LANGTRACER_URL: ${{ secrets.EVALS_LANGTRACER_URL }}
LANGTRACER_API_KEY: ${{ secrets.LANGTRACER_API_KEY }}
FILTER: ${{ inputs.filter }}
ITERATIONS: ${{ inputs.iterations }}
EVAL_CONCURRENCY: ${{ inputs.eval-concurrency }}
@ -283,16 +266,6 @@ jobs:
CONCURRENCY="${EVAL_CONCURRENCY:-$((LANES * 2))}"
echo "Lanes: $LANES | eval concurrency: $CONCURRENCY"
# Spawn the `claude` build subprocess from an empty directory outside
# the checkout. Inheriting the repo cwd would load the repo's Claude
# config into the builder (CLAUDE.md/AGENTS.md, .claude/settings.json
# with the n8n plugin's skills and hooks) and allow permissionless
# reads of repo files — including the eval harness and case corpus.
# The MCP config is unaffected: it is staged per lane and pinned with
# --strict-mcp-config either way.
BUILD_CWD="$RUNNER_TEMP/mcp-build-cwd"
mkdir -p "$BUILD_CWD"
# --dataset + --baseline-prefix keep the MCP cohort isolated from the
# Instance AI dataset/baseline in LangSmith (both halves required).
# --timeout-ms 25min: MCP-tier multi-agent cases with large mocked
@ -309,11 +282,8 @@ jobs:
--timeout-ms 1500000
--dataset mcp-workflow-evals
--baseline-prefix mcp-baseline-
--build-cwd "$BUILD_CWD"
--verbose
)
# LangTracer is the only CI case source (no disk fallback by design).
ARGS+=(--source langtracer --suite "${SUITE:-baseline}")
[ -n "$FILTER" ] && ARGS+=(--filter "$FILTER")
[ -n "$EXPERIMENT_NAME" ] && ARGS+=(--experiment-name "$EXPERIMENT_NAME")
pnpm eval:instance-ai "${ARGS[@]}"

View File

@ -12,7 +12,7 @@ on:
description: Version of node to use.
required: false
type: string
default: 24.18.0
default: 24.16.0
env:
NODE_OPTIONS: --max-old-space-size=7168

View File

@ -12,7 +12,7 @@ on:
description: Version of node to use.
required: false
type: string
default: 24.18.0
default: 24.16.0
collectCoverage:
required: false
default: false

View File

@ -12,7 +12,7 @@ on:
description: Version of node to use.
required: false
type: string
default: 24.18.0
default: 24.16.0
env:
NODE_OPTIONS: --max-old-space-size=7168

View File

@ -11,21 +11,11 @@ frontend, and extensible node-based workflow engine.
## General Guidelines
- Always use pnpm
- **Secrets on the command line:** if a developer opted into anonymous dev
metrics (`scripts/dev-metrics`), pnpm command arguments are recorded. Arguments
of secret-carrying words (`config`, `login`, `publish`, `token`) — whether a
subcommand or baked into a flag — are dropped, and the home dir is stripped from
paths, but other args are sent as-is — so never put secrets in a command. Pass
sensitive values via environment variables, which are never captured.
- When adding comments, keep them concise and to the point - explain the "why"
in a line or two; don't be overly verbose. Comments should be scoped and
relevant to the surrounding code, not just to the current task
- We use Linear as a ticket tracking system
- We use Posthog for feature flags
- To find registered telemetry events (names, descriptions, properties), run
`pnpm --filter @n8n/telemetry catalog` (`--json` for structured output). The
registry is being adopted incrementally, so search call sites if the catalog
has no match. The `n8n:telemetry` skill covers adding or changing events
- When starting to work on a new ticket create a new branch from fresh
master with the name specified in Linear ticket
- When creating a new branch for a ticket in Linear - use the branch name
@ -197,41 +187,6 @@ const children = getChildNodes(workflow.connections, 'NodeName', 'main', 1);
failed assertion) that developers need to fix.
- Import from appropriate error classes in each package
### Persistence layer & the TypeORM boundary
TypeORM (`@n8n/typeorm`) must stay in the **persistence layer** — the `@n8n/db`
package or a backend module's own `database/` folder (entity/repository files).
Business logic — services, controllers, handlers, commands, factories — must not
import from `@n8n/typeorm` (including `@n8n/typeorm/...` subpaths). In
`packages/cli` this is enforced by the `misplaced-n8n-typeorm-import` lint rule;
a new import (or an inline `eslint-disable` of the rule) fails CI.
- **Pattern:** when a query needs operators (`In`, `IsNull`, `LessThan`,
`FindOptionsWhere`, …), put it behind a **use-case-named repository method**
that takes plain parameters and returns domain-shaped values — not a generic
`find(options)` passthrough.
- **Transactions:** transaction orchestration belongs in the persistence layer.
Don't reach for `.manager` / `.manager.transaction(...)` or
`createQueryBuilder(...)` in business logic. Use the sanctioned primitive in
`@n8n/db`: inject the abstract `TransactionRunner` and wrap the unit of work in
`txRunner.run(ctx, async (ctx) => …)`. The callback receives an
`OperationContext` carrying the active transaction; thread that `ctx` into the
repository methods you call. `run` **requires** a context — pass an empty `{}`
at the operation entry point, and reuse the one you were handed everywhere
below it (a context that already carries a transaction is joined, not nested).
Repositories extend `BaseRepository` and resolve the right `EntityManager` with
`this.managerFor(ctx)`; the `Transaction` handle is opaque and never exposes a
driver type to business logic. See `oauth-token.service.ts` +
`oauth-*-token.repository.ts` for a worked example.
- **Anti-patterns reviewers reject** — they hide the dependency instead of
removing it:
- String-matching TypeORM errors, e.g. `error.name === 'QueryFailedError'`.
- Relabeling the import from `@n8n/typeorm` to `@n8n/db` to silence the rule
(`@n8n/db` re-exports several operators/types, but this relabels the
dependency rather than removing it).
- Pushing `.manager` / `createQueryBuilder` into business logic to avoid an
operator import — trades a visible leak for an invisible one.
### Frontend Development
- Refer to `packages/frontend/AGENTS.md`
- **All UI text must use i18n** - add translations to `@n8n/i18n` package
@ -257,7 +212,7 @@ What we use for testing and writing tests:
- **To iterate on a feature without docker rebuilds**, boot service containers
and run `pnpm dev` locally — `pnpm --filter n8n-containers services --services postgres,redis,mailpit,proxy`
then `pnpm dev`. See [Develop against running containers](packages/testing/playwright/README.md#develop-against-running-containers-avoid-docker-rebuilds).
- **For Playwright test maintenance/cleanup**, see `packages/testing/playwright/AGENTS.md` (includes janitor tool for static analysis, dead code removal, architecture enforcement, and TCR workflows).
- **For Playwright test maintenance/cleanup**, see @packages/testing/playwright/AGENTS.md (includes janitor tool for static analysis, dead code removal, architecture enforcement, and TCR workflows).
### Common Development Tasks

View File

@ -1,303 +1,48 @@
# [2.33.0](https://github.com/n8n-io/n8n/compare/n8n@2.32.0...n8n@2.33.0) (2026-07-28)
## [2.31.5](https://github.com/n8n-io/n8n/compare/n8n@2.31.4...n8n@2.31.5) (2026-07-22)
### Bug Fixes
* **ai-builder:** Halt workflow verification at send-and-wait gates on loops ([#34809](https://github.com/n8n-io/n8n/issues/34809)) ([e904939](https://github.com/n8n-io/n8n/commit/e904939db2d14091cf638be2d793a8430ba29621))
* **ai-builder:** Keep assistant replies in the user's language during tool-heavy turns ([#34761](https://github.com/n8n-io/n8n/issues/34761)) ([5a64744](https://github.com/n8n-io/n8n/commit/5a647443ada5a4d2424e4da46177e7f203c31f4d))
* **ai-builder:** Make channel config dropdown enabled - Linear and Telegram - in AIA agent builder ([#34706](https://github.com/n8n-io/n8n/issues/34706)) ([6b40211](https://github.com/n8n-io/n8n/commit/6b4021147b123c5f99de0301033132d1a357c119))
* **ai-builder:** Make labels be more specific about access token for Slack setup ([#34893](https://github.com/n8n-io/n8n/issues/34893)) ([490b722](https://github.com/n8n-io/n8n/commit/490b7220e115207b8f3001a2038755d8270e5b6b))
* **ai-builder:** MCP Connections failures are non-blocking for agents ([#34722](https://github.com/n8n-io/n8n/issues/34722)) ([3301e12](https://github.com/n8n-io/n8n/commit/3301e12014a7566b67aa952af68e3134d2151fbb))
* **ai-builder:** Preview chat link fix ([#34659](https://github.com/n8n-io/n8n/issues/34659)) ([54db083](https://github.com/n8n-io/n8n/commit/54db083953318a10e5529dc772371d6252901427))
* **ai-builder:** Provision agent prerequisites before build-agent delegation ([#34802](https://github.com/n8n-io/n8n/issues/34802)) ([fec6cee](https://github.com/n8n-io/n8n/commit/fec6ceef3c616c36fe76ba4576d9c4e7a6cbcf47))
* **Airtable Node:** Support matching array field values in update operation ([#31517](https://github.com/n8n-io/n8n/issues/31517)) ([e07eab8](https://github.com/n8n-io/n8n/commit/e07eab880aa6abd8829e2403cb2008a271ebd18c))
* **AMQP Trigger Node:** Cap concurrent executions at the configured messages per cycle ([#34787](https://github.com/n8n-io/n8n/issues/34787)) ([d2672a6](https://github.com/n8n-io/n8n/commit/d2672a63a65d775ec53c003bb71769c544d014dd))
* **Baserow Node:** Format Get Many date filter values for Baserow API ([#32723](https://github.com/n8n-io/n8n/issues/32723)) ([b5da074](https://github.com/n8n-io/n8n/commit/b5da0744c4d0642679b45980a6fdb8bbc06b6634))
* **Cohere Chat Model Node:** Route chat requests through the v2 endpoint ([#34878](https://github.com/n8n-io/n8n/issues/34878)) ([4006c22](https://github.com/n8n-io/n8n/commit/4006c226f88bf3092e96d3e757978a8849b86a91))
* **core:** Accept 5-field cron expressions in schedule trigger ([#35006](https://github.com/n8n-io/n8n/issues/35006)) ([27edc54](https://github.com/n8n-io/n8n/commit/27edc543560c5188e4f78da60c74d839a6144f2d))
* **core:** Advertise OAuth protected-resource metadata URL on MCP server 401 responses ([#34571](https://github.com/n8n-io/n8n/issues/34571)) ([37bb354](https://github.com/n8n-io/n8n/commit/37bb354b465cbc7f4115d251ae894b058b89405a))
* **core:** Avoid loading execution data during credentials security audit ([#34876](https://github.com/n8n-io/n8n/issues/34876)) ([4212fc2](https://github.com/n8n-io/n8n/commit/4212fc2202cade111fd15af31218bccb963fb98f))
* **core:** Classify masked Instance AI stream failures as quota exhaustion via credit re-check ([#34553](https://github.com/n8n-io/n8n/issues/34553)) ([bd89cfc](https://github.com/n8n-io/n8n/commit/bd89cfc04176f6b1442eb85a1486ed388443bf9e))
* **core:** Ensure license device fingerprint meets minimum length ([#33852](https://github.com/n8n-io/n8n/issues/33852)) ([9140a06](https://github.com/n8n-io/n8n/commit/9140a068b11aa393f3e3473377df725b48d01694))
* **core:** Expose workflowPublishingPolicy in the package import CLI command ([#34632](https://github.com/n8n-io/n8n/issues/34632)) ([3117e45](https://github.com/n8n-io/n8n/commit/3117e455c3608c7f3358c3a4f20b205e46505a85))
* **core:** Fail fast with a node error when a Data Table node references a missing table ([#34610](https://github.com/n8n-io/n8n/issues/34610)) ([68c7b55](https://github.com/n8n-io/n8n/commit/68c7b55f863c5446fe3ce50e5b1e8f1c4eca9cd3))
* **core:** Fall back to the run's resolved model for AI Assistant verification LLM calls ([#34627](https://github.com/n8n-io/n8n/issues/34627)) ([a8c90f8](https://github.com/n8n-io/n8n/commit/a8c90f84fe1cac7f4787a8a04e7eb27686e8e382))
* **core:** Fix MCP workflow update failing for active workflows on SQLite ([#34964](https://github.com/n8n-io/n8n/issues/34964)) ([bc88dc4](https://github.com/n8n-io/n8n/commit/bc88dc4bd2bfa3e2e6430c10a251fd274445a06b))
* **core:** Handle MCP OAuth2 token expiry and PKCE negotiation ([#34494](https://github.com/n8n-io/n8n/issues/34494)) ([c7b90d0](https://github.com/n8n-io/n8n/commit/c7b90d00518e587331d1f4b2ff5eb1901a56208a))
* **core:** Include RFC 9207 iss parameter on OAuth authorization error redirects ([#34751](https://github.com/n8n-io/n8n/issues/34751)) ([eca731c](https://github.com/n8n-io/n8n/commit/eca731c2de2e54424b8019e4850e71cc47cea656))
* **core:** Keep MCP server display names free-form in agent config ([#34931](https://github.com/n8n-io/n8n/issues/34931)) ([5339b5e](https://github.com/n8n-io/n8n/commit/5339b5e48a2b844958ba20cbc8c68f8256104604))
* **core:** Normalize workflow rollup timestamps ([#34670](https://github.com/n8n-io/n8n/issues/34670)) ([0316336](https://github.com/n8n-io/n8n/commit/03163367a324a499929756e53cbae608d0cd95c6))
* **core:** Preserve the underlying error as cause on Instance AI workspace file reads ([#34759](https://github.com/n8n-io/n8n/issues/34759)) ([206a258](https://github.com/n8n-io/n8n/commit/206a2581e4e2b5af9a49aea5d8d60eca9ccc5671))
* **core:** Prevent concurrent instance startups from racing database migrations ([#34685](https://github.com/n8n-io/n8n/issues/34685)) ([4d861d1](https://github.com/n8n-io/n8n/commit/4d861d16a65c3fa042bef92b5a775bc2d869184e))
* **core:** Prevent unsupported waiting operations in agent tools ([#34587](https://github.com/n8n-io/n8n/issues/34587)) ([3c278f0](https://github.com/n8n-io/n8n/commit/3c278f01674c4c702d04ab6fe50ef1a980ab3ac0))
* **core:** Publish workspace packages required by n8n at runtime ([#34886](https://github.com/n8n-io/n8n/issues/34886)) ([0c613b4](https://github.com/n8n-io/n8n/commit/0c613b44050b6752835fb726365189b7bedfeb19))
* **core:** Redact a sub-workflow's own execution record per its own policy ([#34621](https://github.com/n8n-io/n8n/issues/34621)) ([d8d89cc](https://github.com/n8n-io/n8n/commit/d8d89cc38106947025f06e458a8b6108436a4804))
* **core:** Redirect form-resume waiting requests to the form endpoint ([#34725](https://github.com/n8n-io/n8n/issues/34725)) ([5dfa49b](https://github.com/n8n-io/n8n/commit/5dfa49be6f332377c60cdd063cb06dedc1c52d8c))
* **core:** Reject workflow deletion while unpublish is still in progress ([#34836](https://github.com/n8n-io/n8n/issues/34836)) ([9e09ff4](https://github.com/n8n-io/n8n/commit/9e09ff4d23ede51ce71f69049ebdc394802b9703))
* **core:** Require row read scope for data table CSV export ([#34127](https://github.com/n8n-io/n8n/issues/34127)) ([8171aa8](https://github.com/n8n-io/n8n/commit/8171aa8261235093f4e5d6f821bf18be67924c0b))
* **core:** Resolve synthetic tool nodes to the requested version ([#34850](https://github.com/n8n-io/n8n/issues/34850)) ([6e12426](https://github.com/n8n-io/n8n/commit/6e124263dc654cdfe7c4947e747776f5d6daac8f))
* **core:** Return correct webhook URL in MCP get_workflow_details trigger info ([#34927](https://github.com/n8n-io/n8n/issues/34927)) ([5542c1b](https://github.com/n8n-io/n8n/commit/5542c1b3940b28fa65a9f0840eef6f67018864a6))
* **core:** Sanitize secret values before persisting to agent memory ([#34622](https://github.com/n8n-io/n8n/issues/34622)) ([edbed4f](https://github.com/n8n-io/n8n/commit/edbed4fc01eef9ffac43a0c7901ec678d48f6bb4))
* **core:** Serve RFC 9728 metadata at bare /.well-known/oauth-protected-resource ([#33776](https://github.com/n8n-io/n8n/issues/33776)) ([3e0188c](https://github.com/n8n-io/n8n/commit/3e0188cf2af284d448dccfb43abf9c0db2cf57ee))
* **core:** Sign S3 object paths with strict RFC 3986 encoding ([#34694](https://github.com/n8n-io/n8n/issues/34694)) ([8e5fdb4](https://github.com/n8n-io/n8n/commit/8e5fdb4b2d4bfa0eae046a54e79636a548e3fe0c))
* **core:** Skip Sentry reports for Instance AI errors that self-declare a warning level ([#34617](https://github.com/n8n-io/n8n/issues/34617)) ([3bb3835](https://github.com/n8n-io/n8n/commit/3bb3835db4126db20fa24b00abe257ab8038a989))
* **core:** Stop Instance AI follow-up runs from looping when they keep failing before the agent starts ([#34767](https://github.com/n8n-io/n8n/issues/34767)) ([5aac66d](https://github.com/n8n-io/n8n/commit/5aac66d8cb8a023ab97b1ead28da58237237f497))
* **core:** Strip null optional node fields from AI-generated workflows ([#34668](https://github.com/n8n-io/n8n/issues/34668)) ([94e505a](https://github.com/n8n-io/n8n/commit/94e505a972dc52ff2a7b3fa91e3fc4d95314c2f8))
* **core:** Support fractional community node versions with PostgreSQL ([#34717](https://github.com/n8n-io/n8n/issues/34717)) ([48c0e70](https://github.com/n8n-io/n8n/commit/48c0e70f14a77858379d795400ad9199126d7c78))
* **core:** Surface HITL suspend/resume content in Instance AI trace turns ([#34599](https://github.com/n8n-io/n8n/issues/34599)) ([d8c3fad](https://github.com/n8n-io/n8n/commit/d8c3fadef48d8bb0865265ee038d14e4f51b83af))
* **Databricks Node:** Change default tokenExpiredStatusCode from 401 to 403 ([#34325](https://github.com/n8n-io/n8n/issues/34325)) ([6f3d2b9](https://github.com/n8n-io/n8n/commit/6f3d2b9faab6174f6b483091345984092fb81d6c))
* **DeepSeek Node:** Preserve reasoning_content on tool-calling turns ([#34924](https://github.com/n8n-io/n8n/issues/34924)) ([4d247a1](https://github.com/n8n-io/n8n/commit/4d247a1176b9e66ea9113da640731e7037d336a1))
* **editor:** Add document title and adopt new settings layout on migration report pages ([#34609](https://github.com/n8n-io/n8n/issues/34609)) ([0164216](https://github.com/n8n-io/n8n/commit/016421680d5c8076d868936e53197f202cd3fd69))
* **editor:** Allow LDAP users to configure n8n 2FA in personal settings ([#34655](https://github.com/n8n-io/n8n/issues/34655)) ([2b1e4b8](https://github.com/n8n-io/n8n/commit/2b1e4b8910bcf6c7363a4031bec8ecc653cd7322))
* **editor:** Center empty state content vertically on short viewports ([#34820](https://github.com/n8n-io/n8n/issues/34820)) ([359d82f](https://github.com/n8n-io/n8n/commit/359d82fb0519737c2bf0e4e9fabd41fe8ac2f180))
* **editor:** Clamp persisted sidebar width when expanding the main sidebar ([#34923](https://github.com/n8n-io/n8n/issues/34923)) ([4f7c725](https://github.com/n8n-io/n8n/commit/4f7c725b837226503aef7133cca1918ecaca3469))
* **editor:** Debounce node creator search filtering ([#34828](https://github.com/n8n-io/n8n/issues/34828)) ([25c5a73](https://github.com/n8n-io/n8n/commit/25c5a7341edbd27fe757f7fa994eb662c0e15c7a))
* **editor:** Don't show quick connect for non-main auth fields ([#34449](https://github.com/n8n-io/n8n/issues/34449)) ([6195471](https://github.com/n8n-io/n8n/commit/6195471424d3f939ff35013a8bb8939fffaf37ea))
* **editor:** Fix an issue in some Safari versions that prevented copying invite links ([#34620](https://github.com/n8n-io/n8n/issues/34620)) ([e75e412](https://github.com/n8n-io/n8n/commit/e75e41205c6ee59d44e694d82304bf19ccc5ee19))
* **editor:** Fix focus parameter button breaking selection in credential dialog ([#34453](https://github.com/n8n-io/n8n/issues/34453)) ([ee029b8](https://github.com/n8n-io/n8n/commit/ee029b8df91f60387c72aed90d3d98e586e0b21b))
* **editor:** Html strings for table names are escaped ([#24522](https://github.com/n8n-io/n8n/issues/24522)) ([f4365b1](https://github.com/n8n-io/n8n/commit/f4365b1579d1c8039305c32814b8da35110c2c07))
* **editor:** Inject instance UTM parameters in all links to the templates website ([#34790](https://github.com/n8n-io/n8n/issues/34790)) ([d5b5d8e](https://github.com/n8n-io/n8n/commit/d5b5d8ead5802dea7527e7781dfd417a508efdf9))
* **editor:** Keep chat typing indicator visible until response arrives ([#34768](https://github.com/n8n-io/n8n/issues/34768)) ([4fdf3ed](https://github.com/n8n-io/n8n/commit/4fdf3ed633ef0fb855b7ad754c606f581c7bb42d))
* **editor:** Keep NDV node hints visible after execution and render them in a single pane ([#34920](https://github.com/n8n-io/n8n/issues/34920)) ([082b5d9](https://github.com/n8n-io/n8n/commit/082b5d9190f4bc81d93c6a94d6d4692bed4660ca))
* **editor:** Keep Switch fallback outputs available with unresolved expressions ([#34698](https://github.com/n8n-io/n8n/issues/34698)) ([a0f6861](https://github.com/n8n-io/n8n/commit/a0f6861e17d3a9b2ea1c3eebd71f369ea917084f))
* **editor:** Manage and other permissions checkboxs stuck in half-selected state during member selection ([#34726](https://github.com/n8n-io/n8n/issues/34726)) ([0e186ad](https://github.com/n8n-io/n8n/commit/0e186ad8d32db5df59d7150acd894cfd149f4dbb))
* **editor:** Preserve agent tool name translations ([#35039](https://github.com/n8n-io/n8n/issues/35039)) ([fd5bc7d](https://github.com/n8n-io/n8n/commit/fd5bc7da2801e4bf8cad6937e7e059accf5e9407))
* **editor:** Preserve canvas groups when converting a selection to a sub-workflow ([#34664](https://github.com/n8n-io/n8n/issues/34664)) ([1666f1e](https://github.com/n8n-io/n8n/commit/1666f1ec67956130a6021c1e4b5c263851849641))
* **editor:** Prevent reactive feedback loop when opening workflow diff ([#34897](https://github.com/n8n-io/n8n/issues/34897)) ([962ff56](https://github.com/n8n-io/n8n/commit/962ff564c434ad03954e508dd80d8fd790ce32ab))
* **editor:** Reassign users when deleting a custom instance role ([#34642](https://github.com/n8n-io/n8n/issues/34642)) ([fa0abd8](https://github.com/n8n-io/n8n/commit/fa0abd8ca80205f8fac7862fa674db5d0b4d6387))
* **editor:** Refresh subworkflow input schema from draft on parent open ([#34522](https://github.com/n8n-io/n8n/issues/34522)) ([734f957](https://github.com/n8n-io/n8n/commit/734f9573952c3a639518bfd42e03b4d7aa9fd436))
* **editor:** Remove episodic memory callout and knowledge base publish requirement ([#34888](https://github.com/n8n-io/n8n/issues/34888)) ([771d038](https://github.com/n8n-io/n8n/commit/771d038657b9965288852079c29637780145af69))
* **editor:** Rename preview AI Agent node to V1 ([#34714](https://github.com/n8n-io/n8n/issues/34714)) ([359e1fb](https://github.com/n8n-io/n8n/commit/359e1fba36776651dfdd87c6eca8469b888e4a86))
* **editor:** Replace invalid link ([#34652](https://github.com/n8n-io/n8n/issues/34652)) ([87115d6](https://github.com/n8n-io/n8n/commit/87115d6cb90bd6de717eaa2312a5e31e46e71361))
* **editor:** Restore agent channel credential setup ([#34737](https://github.com/n8n-io/n8n/issues/34737)) ([ac839bb](https://github.com/n8n-io/n8n/commit/ac839bb54a2b33a4d49ebf3f5adfb8289040bd2a))
* **editor:** Restore horizontal scrolling of NDV panel header controls ([#34824](https://github.com/n8n-io/n8n/issues/34824)) ([0745526](https://github.com/n8n-io/n8n/commit/0745526f6a7ba4deef80e8f734416164b9e7798e))
* **editor:** Stabilize icon picker scrolling ([#34596](https://github.com/n8n-io/n8n/issues/34596)) ([e67c119](https://github.com/n8n-io/n8n/commit/e67c119f8b3b5d3f37b3b14cc5bdc644f06e0ddf))
* **editor:** Update copy for executions tab empty state ([#34731](https://github.com/n8n-io/n8n/issues/34731)) ([1138f11](https://github.com/n8n-io/n8n/commit/1138f1196fee4d3fa5adff402a008928d8b9fee1))
* **Form Node:** Properly handle quotes in Form Trigger Node name ([#34650](https://github.com/n8n-io/n8n/issues/34650)) ([95c36b8](https://github.com/n8n-io/n8n/commit/95c36b8debbd6cdd87e731ea3fd6a2ee0f4e6505))
* **HTTP Request Node:** Include error body in continueOnFail mode ([#34729](https://github.com/n8n-io/n8n/issues/34729)) ([d0b254c](https://github.com/n8n-io/n8n/commit/d0b254cff8bec92545602b03e4784f567a92d65b))
* Keep agent preview streams responsive ([#35035](https://github.com/n8n-io/n8n/issues/35035)) ([8d46c6e](https://github.com/n8n-io/n8n/commit/8d46c6e67ab58b076b4efda03b5fc94417063d39))
* **MCP Client Tool Node:** Close cached MCP client sessions when their execution finishes ([#34397](https://github.com/n8n-io/n8n/issues/34397)) ([ec5f503](https://github.com/n8n-io/n8n/commit/ec5f5032a48abb348fcb108e921dd382c1c2673e))
* **Microsoft Teams Node:** Respect limit server-side in getAll operations ([#34851](https://github.com/n8n-io/n8n/issues/34851)) ([ded1697](https://github.com/n8n-io/n8n/commit/ded1697671379660bcf0368e4eec8863b971fafd))
* **N8n Node:** Update credential test to use an endpoint with no extra scopes ([#34605](https://github.com/n8n-io/n8n/issues/34605)) ([4622b35](https://github.com/n8n-io/n8n/commit/4622b3555739bda41f3e7686ec6085b23bb07c94))
* Parse structured output from content-block model responses in chain nodes ([#34928](https://github.com/n8n-io/n8n/issues/34928)) ([1713d9a](https://github.com/n8n-io/n8n/commit/1713d9a9bcf0ab6cb1d49aa9860be55b8756afbe))
* Report real exported entity counts in package export ([#34995](https://github.com/n8n-io/n8n/issues/34995)) ([f3fd559](https://github.com/n8n-io/n8n/commit/f3fd5599ca8a760b2f8d5d6a1e00201661c022bc))
* Return reversed array when calling `.reverse()` ([#34625](https://github.com/n8n-io/n8n/issues/34625)) ([cc4dbf9](https://github.com/n8n-io/n8n/commit/cc4dbf9439239d586bf54967294dc52da441e2f9))
* Serialize dates and route binary columns to output in database nodes ([#34124](https://github.com/n8n-io/n8n/issues/34124)) ([26ae903](https://github.com/n8n-io/n8n/commit/26ae903a2e457a5a4dad332c57a98cbc4b2196c0))
* **Slack Node:** Handle user-list rate limits and surface real load errors ([#34743](https://github.com/n8n-io/n8n/issues/34743)) ([2268149](https://github.com/n8n-io/n8n/commit/2268149b7cecbb3b4a23758262d76bee2769d61f))
* Treat blank optional enum form fields as unset in package import ([#35010](https://github.com/n8n-io/n8n/issues/35010)) ([4abbc89](https://github.com/n8n-io/n8n/commit/4abbc89df4b01c0ec3d1a34b78f72d2beedc8c8f))
* Validate loadOption parameter in GSheet and Notion nodes ([#34695](https://github.com/n8n-io/n8n/issues/34695)) ([1f82bee](https://github.com/n8n-io/n8n/commit/1f82beef47cfcd9598193f8e9afaa6f428b3d036))
* **Wikipedia Tool Node:** Surface tool errors as actionable node errors ([#34643](https://github.com/n8n-io/n8n/issues/34643)) ([3f1b35d](https://github.com/n8n-io/n8n/commit/3f1b35d669e7a44ed129621ff96bf69597fb2128))
* **Wordpress Node:** WordPress Get Many adds before filter for posts and pages ([#19790](https://github.com/n8n-io/n8n/issues/19790)) ([90f1430](https://github.com/n8n-io/n8n/commit/90f1430c5ebf91b1b720dec3343495841315d110))
* **core:** Coerce AWS request header values to strings before signing ([#34568](https://github.com/n8n-io/n8n/issues/34568)) ([6a8d4e9](https://github.com/n8n-io/n8n/commit/6a8d4e9a9b6ba75387647f4eae7ecdbbe4a266b5))
* **core:** Fix AI Agent not seeing tools connected through HITL tools ([#34434](https://github.com/n8n-io/n8n/issues/34434)) ([0a4ef52](https://github.com/n8n-io/n8n/commit/0a4ef520069245d6e60b6a73fc8a6a25976f3468))
* **editor:** Keep dropdown tooltips above menus ([#34555](https://github.com/n8n-io/n8n/issues/34555)) ([5b3b09d](https://github.com/n8n-io/n8n/commit/5b3b09d579b4934e3bf1357a3d75bea6cf8f4909))
### Features
* Add admin-managed instance credentials ([#34364](https://github.com/n8n-io/n8n/issues/34364)) ([7d8426f](https://github.com/n8n-io/n8n/commit/7d8426f05536aaa7232d685decd7d4dc6cf73077))
* Add require-files-array ESLint rule for community node packages ([#34792](https://github.com/n8n-io/n8n/issues/34792)) ([d0adaf7](https://github.com/n8n-io/n8n/commit/d0adaf7b5a9e8a8f1c119a572e4c4aaf065bb691))
* **ai-builder:** Add Fix with Assistant for failed agent preview tools - pass single execution context ([#34616](https://github.com/n8n-io/n8n/issues/34616)) ([9626891](https://github.com/n8n-io/n8n/commit/96268910d35112cb02363aef9ad184036d4b2dfd))
* **ai-builder:** Add support for verified community nodes as agent tools ([#34922](https://github.com/n8n-io/n8n/issues/34922)) ([3d281ec](https://github.com/n8n-io/n8n/commit/3d281ecc40dd3c6e78cb75a2fdf850af8f06926d))
* **ai-builder:** Agent session records direct to session chat, not trace ([#34997](https://github.com/n8n-io/n8n/issues/34997)) ([f62cc63](https://github.com/n8n-io/n8n/commit/f62cc6319a582982cde0091899922446fd01bba6))
* **ai-builder:** Format zod erros on agent config - better toast msg ([#34867](https://github.com/n8n-io/n8n/issues/34867)) ([bac8deb](https://github.com/n8n-io/n8n/commit/bac8debc0ef9c77e00bdba454cf3ae2f807dbca0))
* **ai-builder:** Single preview chat + trace modal ([#35033](https://github.com/n8n-io/n8n/issues/35033)) ([687a00e](https://github.com/n8n-io/n8n/commit/687a00e7eeb2c49f491d06a490dca0c92b90b79d))
* **ai-builder:** Support execution scenarios for first-class agents in evals ([#34384](https://github.com/n8n-io/n8n/issues/34384)) ([5fd800d](https://github.com/n8n-io/n8n/commit/5fd800de20e5be21e6ccb4599746c2c5d2088898))
* **ai-builder:** Tidy up tool names and agent builder tool UX ([#34646](https://github.com/n8n-io/n8n/issues/34646)) ([decb322](https://github.com/n8n-io/n8n/commit/decb3228c5e49b47ddc945c0bc067ea5a1a35ba7))
* Allow custom OAuth scopes for Microsoft Azure Monitor, Dynamics, Graph Security and Azure Storage ([#34612](https://github.com/n8n-io/n8n/issues/34612)) ([69c8633](https://github.com/n8n-io/n8n/commit/69c86333b28c6843e5469945625dd43e62575fe6))
* Allow custom OAuth scopes for the remaining Google credentials ([#34631](https://github.com/n8n-io/n8n/issues/34631)) ([4a8dd5b](https://github.com/n8n-io/n8n/commit/4a8dd5b81716de298bafaf991ef16eabe0ffb962))
* **API:** Add credentialResolverId, timeSavedMode & binaryMode properties to workflow settings schema ([#34330](https://github.com/n8n-io/n8n/issues/34330)) ([9ac95b6](https://github.com/n8n-io/n8n/commit/9ac95b68bee67e9d4d4fbed7085cf3f2df840c6c))
* **API:** Add endpoint to list workflow version history (GET /workflows/{id}/history) ([#34656](https://github.com/n8n-io/n8n/issues/34656)) ([91751c3](https://github.com/n8n-io/n8n/commit/91751c3ce26c9e90f17fe1b44fcec90fa6d0b487))
* **API:** Add public API endpoints for OpenTelemetry configuration ([#34429](https://github.com/n8n-io/n8n/issues/34429)) ([cd1e48e](https://github.com/n8n-io/n8n/commit/cd1e48e5f536f3e5d3e78ae6f272eb6be16751a4))
* **API:** Add workflow publish/unpublish public API endpoints ([#34745](https://github.com/n8n-io/n8n/issues/34745)) ([e9933bd](https://github.com/n8n-io/n8n/commit/e9933bd1c09e26f3eafc07ceb136196a3bfa4189))
* **API:** Deprecate workflow activate/deactivate public API endpoints ([#34771](https://github.com/n8n-io/n8n/issues/34771)) ([05c691b](https://github.com/n8n-io/n8n/commit/05c691b0b7849add3a3b8e81fa81fa000f064539))
* **AWS Bedrock Chat Model Node:** Surface inference-profile models in the default model picker ([#34983](https://github.com/n8n-io/n8n/issues/34983)) ([cb28555](https://github.com/n8n-io/n8n/commit/cb28555d55fd22444fc9deab120842aa9829eed7))
* Configure the AI Assistant through a redesigned instance settings page ([#34493](https://github.com/n8n-io/n8n/issues/34493)) ([4078318](https://github.com/n8n-io/n8n/commit/4078318cff167b4aa65c74485769943d778ecb60))
* **core:** Add `active_workflow_info` and make `workflow_info` leader-only ([#34987](https://github.com/n8n-io/n8n/issues/34987)) ([78e55b5](https://github.com/n8n-io/n8n/commit/78e55b5cbfbd0781b61e5bc9e1dc74de785a4542))
* **core:** Add availableInMCP column to agents ([#34665](https://github.com/n8n-io/n8n/issues/34665)) ([fdd4e33](https://github.com/n8n-io/n8n/commit/fdd4e33f9ca7d4faeac7d393234b22a47faafbd8))
* **core:** Add credential-unnecessary-password community node lint rule ([#34791](https://github.com/n8n-io/n8n/issues/34791)) ([95da849](https://github.com/n8n-io/n8n/commit/95da84912ffef514220772bb779830d11fa2e2cf))
* **core:** Add eligible-reviewer API types and reviewer ids to revie… ([#34703](https://github.com/n8n-io/n8n/issues/34703)) ([60112eb](https://github.com/n8n-io/n8n/commit/60112eb81c002aea2b61cb6439733c61b57a999d))
* **core:** Add instance credential database schema ([#34709](https://github.com/n8n-io/n8n/issues/34709)) ([13becf3](https://github.com/n8n-io/n8n/commit/13becf336c703a7e3c17bac3f61a2d66ae2d933e))
* **core:** Add N8N_SCHEDULER_MAX_ATTEMPTS to configure scheduler dead-letter threshold ([#34633](https://github.com/n8n-io/n8n/issues/34633)) ([29f2fac](https://github.com/n8n-io/n8n/commit/29f2facb48bfc62673be5b3e0fb8eec5424eb44a))
* **core:** Add storedAt column to agent_execution ([#34858](https://github.com/n8n-io/n8n/issues/34858)) ([0b4bbd0](https://github.com/n8n-io/n8n/commit/0b4bbd05b8956ef81db7f1ca66107c7460e1f6e9))
* **core:** Add telemetry events for agent publishing, builder capabilities, and interactive flows ([#34887](https://github.com/n8n-io/n8n/issues/34887)) ([8017b3d](https://github.com/n8n-io/n8n/commit/8017b3d85f44db019d1a47e472b4c2b2c8bf1cb1))
* **core:** Add workflow review request entities and migration scripts ([#34062](https://github.com/n8n-io/n8n/issues/34062)) ([156ac00](https://github.com/n8n-io/n8n/commit/156ac00120f2ac611d4da1d72484b2031f738b9c))
* **core:** Add workflow.deactivate external hook ([#34746](https://github.com/n8n-io/n8n/issues/34746)) ([697174f](https://github.com/n8n-io/n8n/commit/697174f3f8097d034e022f1df3ed64c1849f0717))
* **core:** Allow Storybook components to be viewed in light and dark mode ([#34361](https://github.com/n8n-io/n8n/issues/34361)) ([e592b21](https://github.com/n8n-io/n8n/commit/e592b210c1f439cb2ea68902c519b8a2cea246e3))
* **core:** Auto-include sub-workflows in package exports ([#34218](https://github.com/n8n-io/n8n/issues/34218)) ([09c90f9](https://github.com/n8n-io/n8n/commit/09c90f9bf4ca704725ed5621c0dedf7d0afab02f))
* **core:** Create reviews page and render inbox ([#34357](https://github.com/n8n-io/n8n/issues/34357)) ([b2cbcc1](https://github.com/n8n-io/n8n/commit/b2cbcc1b8199ad2e649d6497262a49e1a09dabd8))
* **core:** Detect and heal published-version skew in trigger reconciliation ([#34877](https://github.com/n8n-io/n8n/issues/34877)) ([3f2bc68](https://github.com/n8n-io/n8n/commit/3f2bc6884676cb31f664a2f67d8ab897e9a37f22))
* **core:** Emit agent run spans through the OTel module's tracer ([#34460](https://github.com/n8n-io/n8n/issues/34460)) ([e01e996](https://github.com/n8n-io/n8n/commit/e01e996649f1407296723f11612e20a57a09890b))
* **core:** Include acting user identity in workflow lifecycle external hooks ([#34769](https://github.com/n8n-io/n8n/issues/34769)) ([efa86c6](https://github.com/n8n-io/n8n/commit/efa86c697b163b3d8ac0520d1a18ca98db6cf959))
* **core:** Infer structured output from example JSON in AI Agent Node ([#34779](https://github.com/n8n-io/n8n/issues/34779)) ([0ec49b3](https://github.com/n8n-io/n8n/commit/0ec49b37353a0e8d0cc03ce550116833e06b8a47))
* **core:** Nest delegated sub-agent spans under the parent agent trace ([#34720](https://github.com/n8n-io/n8n/issues/34720)) ([bd6f617](https://github.com/n8n-io/n8n/commit/bd6f617efb751b8ad0a109254e010506e5f95077))
* **core:** Return open and closed counts for the review inbox tabs ([#34789](https://github.com/n8n-io/n8n/issues/34789)) ([f4edeeb](https://github.com/n8n-io/n8n/commit/f4edeeba312051fc8595c7276ba2f2af408adfaf))
* **core:** Review submission flow endpoints and toggle ([#34649](https://github.com/n8n-io/n8n/issues/34649)) ([6d38f2e](https://github.com/n8n-io/n8n/commit/6d38f2ee392ce32f19859dd21bd82dc6f14c1679))
* **core:** Store agent execution logs in blob storage ([#34796](https://github.com/n8n-io/n8n/issues/34796)) ([a647aef](https://github.com/n8n-io/n8n/commit/a647aeff2300558cf7f1a16d8e3bcb4966ba7981))
* **core:** Support legacy sub-workflow dependencies in package exports ([#34398](https://github.com/n8n-io/n8n/issues/34398)) ([41660d0](https://github.com/n8n-io/n8n/commit/41660d00679c524045d55aced4c3b5e5b9b2bcfa))
* **core:** Validate missing node types on package import ([#34598](https://github.com/n8n-io/n8n/issues/34598)) ([4044d58](https://github.com/n8n-io/n8n/commit/4044d58d130fd2f86e906a1f41cb561ff2c8e31b))
* Default package import workflowIdPolicy to source ([#34989](https://github.com/n8n-io/n8n/issues/34989)) ([1f4e654](https://github.com/n8n-io/n8n/commit/1f4e65419ab3bd2ef453324f5796d4e86434382a))
* **editor:** Add N8nStatusDot component ([#34963](https://github.com/n8n-io/n8n/issues/34963)) ([f758a4b](https://github.com/n8n-io/n8n/commit/f758a4bd05723b44acdf6786410c5da54a5936a2))
* **editor:** Add workflow review submission flow ([#34520](https://github.com/n8n-io/n8n/issues/34520)) ([5939eb5](https://github.com/n8n-io/n8n/commit/5939eb52e9c658419622e35a07e5914982b2e244))
* **editor:** Adds modal to see all projects a user can access in a list ([#34619](https://github.com/n8n-io/n8n/issues/34619)) ([2748e1a](https://github.com/n8n-io/n8n/commit/2748e1ac78207b471002a1de6f18602352f65608))
* **editor:** Keep review-required toggle synchronized with open reviews ([#34606](https://github.com/n8n-io/n8n/issues/34606)) ([ca0c5f4](https://github.com/n8n-io/n8n/commit/ca0c5f49382c383642b6b196acb7358f56b31f1d))
* **editor:** Migrate OpenTelemetry settings page to new instance settings UI ([#34965](https://github.com/n8n-io/n8n/issues/34965)) ([91e1276](https://github.com/n8n-io/n8n/commit/91e12764637c50698461452d586420537bf7c882))
* **editor:** Polish end-user credential setup modal and NDV states ([#34766](https://github.com/n8n-io/n8n/issues/34766)) ([01e0639](https://github.com/n8n-io/n8n/commit/01e06399d84cc738fde7846e5aedee73f222ccdc))
* **editor:** Revamp MCP settings view with instance settings components ([#34041](https://github.com/n8n-io/n8n/issues/34041)) ([e2840a7](https://github.com/n8n-io/n8n/commit/e2840a7443ca05073ffa4bb0b52cd0232dce1821))
* **editor:** Show confirmation modal when updating a custom instance role with assigned users ([#34544](https://github.com/n8n-io/n8n/issues/34544)) ([6dc2079](https://github.com/n8n-io/n8n/commit/6dc2079399e25334224104b0ed06acefdf79fb85))
* **editor:** Show reviewer and requester avatars and a status indicator on review inbox items ([#34885](https://github.com/n8n-io/n8n/issues/34885)) ([2ea7da2](https://github.com/n8n-io/n8n/commit/2ea7da29aca43acc7047807889cf762188fb865e))
* **editor:** Sync a new workflow version into an existing open review ([#34842](https://github.com/n8n-io/n8n/issues/34842)) ([5a97bd1](https://github.com/n8n-io/n8n/commit/5a97bd1a2e31b90be75fb604fd7f0a7e7a35a33f))
* **editor:** Track Instance AI entry point as action_source on builder messages ([#34671](https://github.com/n8n-io/n8n/issues/34671)) ([c0fe8ba](https://github.com/n8n-io/n8n/commit/c0fe8ba4dbb08266aad20c0ab09db3afbedd62bf))
* **Gmail Node:** Add warning notice when Simplify is disabled ([#34611](https://github.com/n8n-io/n8n/issues/34611)) ([72a311a](https://github.com/n8n-io/n8n/commit/72a311a6f38195c755ae1dce9612010688dc0a5c))
* **Microsoft Excel (SharePoint) Node:** Add node for Excel workbooks in SharePoint document libraries ([#34847](https://github.com/n8n-io/n8n/issues/34847)) ([d67b9cd](https://github.com/n8n-io/n8n/commit/d67b9cd0d163352e216361cc83dd0a7d0b76b7e7))
### Performance Improvements
* **core:** Skip allowed-methods lookup on successful production webhook requests ([#34833](https://github.com/n8n-io/n8n/issues/34833)) ([bf8f5d8](https://github.com/n8n-io/n8n/commit/bf8f5d85a3bc9efc24eebfe5c0e18cf9f3e21190))
# [2.32.0](https://github.com/n8n-io/n8n/compare/n8n@2.31.0...n8n@2.32.0) (2026-07-21)
## [2.31.4](https://github.com/n8n-io/n8n/compare/n8n@2.31.3...n8n@2.31.4) (2026-07-20)
### Bug Fixes
* **ai-builder:** Honor eq [@version](https://github.com/version) conditions in generated node type definitions ([#34232](https://github.com/n8n-io/n8n/issues/34232)) ([9a48bc5](https://github.com/n8n-io/n8n/commit/9a48bc5fa75976a0ffba93bde062fd0fb05a7b8c))
* **ai-builder:** Open agent chat preview on the same tab on instance AI ([#34441](https://github.com/n8n-io/n8n/issues/34441)) ([6d56cee](https://github.com/n8n-io/n8n/commit/6d56cee0f42af42f5b192b8b5ad378a1cc566472))
* **ai-builder:** Resurface channel edit modal on AIA agent builder's artifact mode ([#34257](https://github.com/n8n-io/n8n/issues/34257)) ([0984a1d](https://github.com/n8n-io/n8n/commit/0984a1d97a80c14a63fb31229092f6e8239aaddd))
* **ai-builder:** Scope ToolIoView synth execution under a synthetic document store ([#34588](https://github.com/n8n-io/n8n/issues/34588)) ([ab12ee5](https://github.com/n8n-io/n8n/commit/ab12ee534c0998558c9579562dec2f34b55cd640))
* **ai-builder:** Wire thread conversation history - with caps - for agents with slack channel ([#34354](https://github.com/n8n-io/n8n/issues/34354)) ([8c1d17f](https://github.com/n8n-io/n8n/commit/8c1d17ff5171d47c30220f96b83d85955ef4d5af))
* Allow devDependency imports in linter ([#34335](https://github.com/n8n-io/n8n/issues/34335)) ([26caaa8](https://github.com/n8n-io/n8n/commit/26caaa876f2b787cd665631ce9cf656fd4abca01))
* **API:** Fix broken public API playground server selection ([#34077](https://github.com/n8n-io/n8n/issues/34077)) ([f24570f](https://github.com/n8n-io/n8n/commit/f24570f21f11a370fba31dfa0b6b9206b066f51b))
* **AWS Bedrock Chat Model Node:** Default guardrail version to working draft when not set ([#33555](https://github.com/n8n-io/n8n/issues/33555)) ([013c34c](https://github.com/n8n-io/n8n/commit/013c34ccae502176275d55986fc92b405e2861e8))
* **core, editor:** Clarify credential setup outcomes and add requireUserSelection ([#34268](https://github.com/n8n-io/n8n/issues/34268)) ([65e267b](https://github.com/n8n-io/n8n/commit/65e267bce7b6d931656c6238fe518b0246f65189))
* **core:** Acquire expression isolate for MCP Trigger tool calls in queue mode ([#34491](https://github.com/n8n-io/n8n/issues/34491)) ([eed8f3f](https://github.com/n8n-io/n8n/commit/eed8f3f1424eb3686d34311822ff6a35071df8c4))
* **core:** Add a per-attempt timeout to AI assistant service calls ([#34341](https://github.com/n8n-io/n8n/issues/34341)) ([f191548](https://github.com/n8n-io/n8n/commit/f191548586f2af198d85b6afae1b1508378c945f))
* **core:** Add project ID and project name to log stream events ([#33854](https://github.com/n8n-io/n8n/issues/33854)) ([a89817d](https://github.com/n8n-io/n8n/commit/a89817dc92f41d351631926ca3827f0e56bcfceb))
* **core:** Alert on unusable Instance AI sandbox snapshots and gate the release on snapshot health ([#34344](https://github.com/n8n-io/n8n/issues/34344)) ([080c3cc](https://github.com/n8n-io/n8n/commit/080c3ccc8c4011b2f41e5e7460be3c6bdd4dae76))
* **core:** Allow publishing end-user credentials with Send-and-Wait nodes ([#34462](https://github.com/n8n-io/n8n/issues/34462)) ([c59f5d8](https://github.com/n8n-io/n8n/commit/c59f5d8b6a180c0ee17a1601c39a88e2baa72a81))
* **core:** Bind dynamic credential tokens to a user ID ([#34073](https://github.com/n8n-io/n8n/issues/34073)) ([fd261be](https://github.com/n8n-io/n8n/commit/fd261be97cf3d06aad753f69e8e099f60d09c699))
* **core:** Cancel Instance AI tool runs promptly when generation is stopped ([#34433](https://github.com/n8n-io/n8n/issues/34433)) ([4f8fef1](https://github.com/n8n-io/n8n/commit/4f8fef13cacf31163999bdddc46f4d2ae8bb0b6a))
* **core:** Cancel Instance AI workspace tools promptly on stop ([#34551](https://github.com/n8n-io/n8n/issues/34551)) ([267fd85](https://github.com/n8n-io/n8n/commit/267fd853cdc1669e869d280eae687eb6cad89abe))
* **core:** Close the durable scheduler's record-then-dispatch effect boundary ([#34014](https://github.com/n8n-io/n8n/issues/34014)) ([e22680b](https://github.com/n8n-io/n8n/commit/e22680b99f91d708e1a4d68335a3d38325266c40))
* **core:** Coerce AWS request header values to strings before signing ([#34534](https://github.com/n8n-io/n8n/issues/34534)) ([d6f26cf](https://github.com/n8n-io/n8n/commit/d6f26cfe7dec41f9f823abdb737301849e5d3d9d))
* **core:** Count AI assistant workflow test runs as manual executions in statistics ([#34145](https://github.com/n8n-io/n8n/issues/34145)) ([9842c2c](https://github.com/n8n-io/n8n/commit/9842c2c28cc156dc10049b15dfd98e7571aca584))
* **core:** Create proxied Instance AI sandboxes from snapshots only ([#34328](https://github.com/n8n-io/n8n/issues/34328)) ([29c5d72](https://github.com/n8n-io/n8n/commit/29c5d725c7b99727ed8a70e6398ef5f594e002d8))
* **core:** Delete executions in batches when removing workflows, projects and folders ([#34265](https://github.com/n8n-io/n8n/issues/34265)) ([0b809c9](https://github.com/n8n-io/n8n/commit/0b809c987a4df86155e98a9f0e2ac52257c8fc16))
* **core:** Exclude in-flight Instance AI groups from history reads on non-driving mains ([#34345](https://github.com/n8n-io/n8n/issues/34345)) ([50c3d88](https://github.com/n8n-io/n8n/commit/50c3d88af56ebb869f76f13a2417c528d90ffd4c))
* **core:** Fix AI Agent not seeing tools connected through HITL tools ([#34271](https://github.com/n8n-io/n8n/issues/34271)) ([bdff8f4](https://github.com/n8n-io/n8n/commit/bdff8f4be99f7b677d797f669376e61e46d9ebc2))
* **core:** Fix change in width of all dropdowns in UI ([#34249](https://github.com/n8n-io/n8n/issues/34249)) ([87cdf3d](https://github.com/n8n-io/n8n/commit/87cdf3d252ab6380ef0afeb1293882fb77931825))
* **core:** Lint community packages against their provenance-attested source ([#34214](https://github.com/n8n-io/n8n/issues/34214)) ([5f3d139](https://github.com/n8n-io/n8n/commit/5f3d139648df47c66ab0a9faea18af5c51ec8b84))
* **core:** Persist MCP servers when credential setup is skipped ([#34399](https://github.com/n8n-io/n8n/issues/34399)) ([7c7506d](https://github.com/n8n-io/n8n/commit/7c7506dc163449f2dfce22d308719951660a3a33))
* **core:** Prefer direct tools for agent capabilities ([#34466](https://github.com/n8n-io/n8n/issues/34466)) ([969a68e](https://github.com/n8n-io/n8n/commit/969a68e217c7aab8e6ac24543a234055b870a794))
* **core:** Preserve agent builder question answers ([#34414](https://github.com/n8n-io/n8n/issues/34414)) ([9882c5c](https://github.com/n8n-io/n8n/commit/9882c5c6cc8f20f715bca6938ca13142d8382edc))
* **core:** Preserve local credential fields absent from source contro… ([#34173](https://github.com/n8n-io/n8n/issues/34173)) ([0a4ddde](https://github.com/n8n-io/n8n/commit/0a4dddeb29e65ea6e10e7122fdf5df15cc4cf005))
* **core:** Preserve node aliases when generating AI tool variants ([#34162](https://github.com/n8n-io/n8n/issues/34162)) ([8284460](https://github.com/n8n-io/n8n/commit/8284460a5ade36b06a9b88fc71a8b13005f8b88b))
* **core:** Prevent getIncomingData from throwing on a missing connection type ([#34285](https://github.com/n8n-io/n8n/issues/34285)) ([9d05fbd](https://github.com/n8n-io/n8n/commit/9d05fbd5617d1740ee7a48eec4d27007baa7b344))
* **core:** Prevent sub-workflow failures after transferring a deleted user's workflows ([#33772](https://github.com/n8n-io/n8n/issues/33772)) ([7a56ade](https://github.com/n8n-io/n8n/commit/7a56ade6b2a73740a659149b3fe1e4b05c5658be))
* **core:** Replace https agent for 'Ignore SSL issues' OAuth2 requests with one that respects proxies ([#34234](https://github.com/n8n-io/n8n/issues/34234)) ([338f186](https://github.com/n8n-io/n8n/commit/338f186f0ba624a5425c9ec8c378c295298a219d))
* **core:** Require execution mode for MCP workflow executions ([#34155](https://github.com/n8n-io/n8n/issues/34155)) ([79012f6](https://github.com/n8n-io/n8n/commit/79012f66d7d5238d9937549cb8744331f430bdf3))
* **core:** Resolve @n8n/expression-runtime to its CJS build under Node ([#34463](https://github.com/n8n-io/n8n/issues/34463)) ([09f5ade](https://github.com/n8n-io/n8n/commit/09f5adec0d5481d89bb926eb3efecbf2b973e6f0))
* **core:** Retry transient AI assistant service errors during Instance AI environment setup ([#34324](https://github.com/n8n-io/n8n/issues/34324)) ([5b7df71](https://github.com/n8n-io/n8n/commit/5b7df71a050c05b628f56dcc6c85ab4cd064d7af))
* **core:** Retry transient sandbox file writes ([#34319](https://github.com/n8n-io/n8n/issues/34319)) ([80ea25b](https://github.com/n8n-io/n8n/commit/80ea25b76ea141e0a24f9a17fbd6049aab32af8a))
* **core:** Show a single error toast when a manual execution fails pre-flight validation ([#34541](https://github.com/n8n-io/n8n/issues/34541)) ([8d1fc02](https://github.com/n8n-io/n8n/commit/8d1fc022bb10b875ea71da2fa6a9aec9076e2e77))
* **core:** Sign SES requests with the ses service name ([#34270](https://github.com/n8n-io/n8n/issues/34270)) ([2e31230](https://github.com/n8n-io/n8n/commit/2e3123097e2065e5317bd58ea7621e6fdb5ddc02))
* **core:** Skip reporting axios errors thrown as unhandled node errors ([#34570](https://github.com/n8n-io/n8n/issues/34570)) ([33f1c36](https://github.com/n8n-io/n8n/commit/33f1c3611259a43de26e5f09569bd85212605220))
* **core:** Stop reporting quota-exhausted Instance AI runs to Sentry and isolate report request context ([#34549](https://github.com/n8n-io/n8n/issues/34549)) ([6f0804e](https://github.com/n8n-io/n8n/commit/6f0804e0e357811954b611abf1449fb61b7a8b1d))
* **core:** Update error message on file write ([#33833](https://github.com/n8n-io/n8n/issues/33833)) ([afe603f](https://github.com/n8n-io/n8n/commit/afe603fc00f816c38d01a65b5eaa17c36481a0ba))
* Correct build-command quoting in standalone package release ([#34258](https://github.com/n8n-io/n8n/issues/34258)) ([1301bba](https://github.com/n8n-io/n8n/commit/1301bbaf5341267037c146b2f74ba73c2e3585a7))
* Correct end-user credential validation, re-evaluation, and identity-hook recognition ([#34094](https://github.com/n8n-io/n8n/issues/34094)) ([65da749](https://github.com/n8n-io/n8n/commit/65da749ab3d118cd14a70ccf86c162a58790a71f))
* Default new agent MCP tool transport to httpStreamable ([#34092](https://github.com/n8n-io/n8n/issues/34092)) ([9c3f7fa](https://github.com/n8n-io/n8n/commit/9c3f7fa44b8441260be678525ebc5b7fc7f7626a))
* Do not lose scenario results on a budget/timeout abort ([#34419](https://github.com/n8n-io/n8n/issues/34419)) ([40c5b76](https://github.com/n8n-io/n8n/commit/40c5b7670869830b6a71f629963070cd872e51c1))
* **editor:** Allow self-hosted OpenAI credentials for episodic memory ([#34558](https://github.com/n8n-io/n8n/issues/34558)) ([e162724](https://github.com/n8n-io/n8n/commit/e162724baadcd59bd4c566b6f8d88ba5d0f9b99f))
* **editor:** Auto-ungroup invalid groups on workflow save ([#34456](https://github.com/n8n-io/n8n/issues/34456)) ([d5d3da6](https://github.com/n8n-io/n8n/commit/d5d3da67c1447606a74645dcd35cbfd4d5ae45b0))
* **editor:** Avoid next prev buttons from being disabled ([#33774](https://github.com/n8n-io/n8n/issues/33774)) ([a2fd7f7](https://github.com/n8n-io/n8n/commit/a2fd7f7e966c5734e473b6629652ce6f1c0d502b))
* **editor:** Decouple MCP redirect URI controls from env-lock flag ([#34184](https://github.com/n8n-io/n8n/issues/34184)) ([64318a8](https://github.com/n8n-io/n8n/commit/64318a810df1cc7fe27470db9f9b1930c6d12e20))
* **editor:** Dissolve single-node canvas group when converting its nodes to a sub-workflow ([#34334](https://github.com/n8n-io/n8n/issues/34334)) ([93e1b7f](https://github.com/n8n-io/n8n/commit/93e1b7fd6c55bf2fcd40d9770d7e03af812fe1e9))
* **editor:** Improve Message an Agent panels ([#34461](https://github.com/n8n-io/n8n/issues/34461)) ([e8b005e](https://github.com/n8n-io/n8n/commit/e8b005ee27f0e700e958dbbf09b1674e94fba163))
* **editor:** Include Chat, AI Assistant, and MCP settings under 'Instance settings: Manage' custom role permission ([#34455](https://github.com/n8n-io/n8n/issues/34455)) ([fa5476c](https://github.com/n8n-io/n8n/commit/fa5476c0cbd2e0a914a58f34d439179bbec89800))
* **editor:** Keep dropdown tooltips above menus ([#34547](https://github.com/n8n-io/n8n/issues/34547)) ([051eee1](https://github.com/n8n-io/n8n/commit/051eee194393f660cc6be41333cfb73e580c5ff0))
* **editor:** Link end-user credentials docs from credential modal ([#34406](https://github.com/n8n-io/n8n/issues/34406)) ([09d1e96](https://github.com/n8n-io/n8n/commit/09d1e96a1a7629caea6c51cc705d0970e822aba0))
* **editor:** Make AI assistant quota-exhausted error states explicit ([#33847](https://github.com/n8n-io/n8n/issues/33847)) ([4ef0d05](https://github.com/n8n-io/n8n/commit/4ef0d05f1cb45c9962dc7a166222aab9cfc6a767))
* **editor:** Make selector dropdowns usable in Instance AI workflow setup ([#33971](https://github.com/n8n-io/n8n/issues/33971)) ([487594c](https://github.com/n8n-io/n8n/commit/487594cfcdd77a9c6252a2ddb8d03e31d94f2b69))
* **editor:** Polish pass on the custom instance roles ([#34122](https://github.com/n8n-io/n8n/issues/34122)) ([297e252](https://github.com/n8n-io/n8n/commit/297e2529b3f695e10dde4653342374f75961bfef))
* **editor:** Prevent AI Agent from auto adding a chat connector on creation ([#34259](https://github.com/n8n-io/n8n/issues/34259)) ([865035d](https://github.com/n8n-io/n8n/commit/865035d5a008dd5786bbd158ccc76f1f66f188eb))
* **editor:** Prevent users from clicking workflows within insights that they do not have access to ([#34362](https://github.com/n8n-io/n8n/issues/34362)) ([e68fb3a](https://github.com/n8n-io/n8n/commit/e68fb3af52cba91f2a93979893c76afd3c9ac10d))
* **editor:** Prevent workflow actions menu from being cut off ([#34278](https://github.com/n8n-io/n8n/issues/34278)) ([8ba28dc](https://github.com/n8n-io/n8n/commit/8ba28dc7a9f397c8ca24c11ebb3b4257588d02e9))
* **editor:** Reconcile stale Instance AI run state on reload and stop ([#34432](https://github.com/n8n-io/n8n/issues/34432)) ([8879b87](https://github.com/n8n-io/n8n/commit/8879b879804fe0a187ea88777c37b9be5779a523))
* **editor:** Refresh editor checksum on workflow activation while editing ([#34095](https://github.com/n8n-io/n8n/issues/34095)) ([7ebeb1e](https://github.com/n8n-io/n8n/commit/7ebeb1e194aa74b6c6e536251a5b0bb543ea5274))
* **editor:** Refresh editor checksum on workflow deactivation while editing ([#34315](https://github.com/n8n-io/n8n/issues/34315)) ([c83eab0](https://github.com/n8n-io/n8n/commit/c83eab047c7256dfec8797e3db22f9b5dd5dc04e))
* **editor:** Remove extra top spacing in sticky note markdown ([#34116](https://github.com/n8n-io/n8n/issues/34116)) ([114c74d](https://github.com/n8n-io/n8n/commit/114c74d6bfd34eb4384720d7a313ecce662d2032))
* **editor:** Rename agent tasks to schedules ([#34326](https://github.com/n8n-io/n8n/issues/34326)) ([1ab30cb](https://github.com/n8n-io/n8n/commit/1ab30cb6097e132c9c7030197f94b14eb195b583))
* **editor:** Restore hosted chat Markdown styles ([#34176](https://github.com/n8n-io/n8n/issues/34176)) ([d6b9234](https://github.com/n8n-io/n8n/commit/d6b92343e1ec43431a3dafa18949043b8951bee2))
* **editor:** Restore previous route when closing session trace ([#34423](https://github.com/n8n-io/n8n/issues/34423)) ([e8922cb](https://github.com/n8n-io/n8n/commit/e8922cbadfdb5a5df40afffa41b91820845dab0c))
* **editor:** Restrict setup credential dropdown to pinned type ([#34252](https://github.com/n8n-io/n8n/issues/34252)) ([454e0d3](https://github.com/n8n-io/n8n/commit/454e0d3edd310f600523ce0f98e31ef3f16ff4d3))
* **editor:** Show only the latest node as executing during manual executions ([#34182](https://github.com/n8n-io/n8n/issues/34182)) ([6faca89](https://github.com/n8n-io/n8n/commit/6faca890d2e13a331f19931f3e557481524f9cd2))
* **editor:** Trigger options menu from node details header add button ([#34212](https://github.com/n8n-io/n8n/issues/34212)) ([3b6af51](https://github.com/n8n-io/n8n/commit/3b6af5199ab5a4526a86a40fcfafb4f20874a69c))
* **editor:** Wrap long keyboard shortcut tooltip labels within max-width ([#34135](https://github.com/n8n-io/n8n/issues/34135)) ([eb6a4a1](https://github.com/n8n-io/n8n/commit/eb6a4a1714201258146f2bf7ea9090b925b2365c))
* Even out workflow metadata divider spacing ([#34132](https://github.com/n8n-io/n8n/issues/34132)) ([90f25e2](https://github.com/n8n-io/n8n/commit/90f25e221d198179ec981aa7bca33d71f63af251))
* Extend orphan message cleanup to handle trailing orphans from memory trimming ([#34385](https://github.com/n8n-io/n8n/issues/34385)) ([96264a0](https://github.com/n8n-io/n8n/commit/96264a063bea5efee7caebb6460e44942d0eecc7))
* Gate agent knowledge base table on AI Assistant proxy availability ([#34366](https://github.com/n8n-io/n8n/issues/34366)) ([77880a3](https://github.com/n8n-io/n8n/commit/77880a3106d9bb0c997c887b4f8a72615fb63dce))
* **Gmail Node:** Handle multi-address Reply-To in the reply operation ([#34312](https://github.com/n8n-io/n8n/issues/34312)) ([0b8ad18](https://github.com/n8n-io/n8n/commit/0b8ad187578ecf59efea96a8b97102190aaeb194))
* **Google Workspace Admin Node:** Not able to reactivate the user ([#33937](https://github.com/n8n-io/n8n/issues/33937)) ([f43d723](https://github.com/n8n-io/n8n/commit/f43d723571afad77b79dddb8b520135497d6f3bb))
* **HTTP Request Node:** Sign non-standard AWS endpoint hosts with the correct region and service ([#34081](https://github.com/n8n-io/n8n/issues/34081)) ([0e8420b](https://github.com/n8n-io/n8n/commit/0e8420bbff4c386d19fa2587512131ae2dae4c38))
* **Microsoft Excel Node:** Resolve service principal target per input item ([#34112](https://github.com/n8n-io/n8n/issues/34112)) ([afc8a87](https://github.com/n8n-io/n8n/commit/afc8a87a604d221eb9b56e09c30b6f3fc5a47bda))
* **Microsoft OneDrive Node:** Resolve service principal target per input item ([#34111](https://github.com/n8n-io/n8n/issues/34111)) ([578545c](https://github.com/n8n-io/n8n/commit/578545c1e9a956199e59a2ac5f40c4e11236f51a))
* **Microsoft Outlook Node:** Resolve service principal mailbox per input item ([#34110](https://github.com/n8n-io/n8n/issues/34110)) ([831e054](https://github.com/n8n-io/n8n/commit/831e054e6e04fdbf0c0401aacdc3700727fb7624))
* **Microsoft Teams Node:** Validate Graph path IDs under all credential types ([#34065](https://github.com/n8n-io/n8n/issues/34065)) ([e43a162](https://github.com/n8n-io/n8n/commit/e43a162e4df8b80d79e05183f359b0b80a5b494c))
* **Microsoft To Do Node:** Resolve service principal target per input item ([#34109](https://github.com/n8n-io/n8n/issues/34109)) ([9b2479c](https://github.com/n8n-io/n8n/commit/9b2479c538ed17194978a872c009e7c78c064836))
* **Postgres Node:** Return DATE and date/time array columns as strings (v2.7) ([#34050](https://github.com/n8n-io/n8n/issues/34050)) ([17eb819](https://github.com/n8n-io/n8n/commit/17eb819517e0f41c506677fc5d56097795e16623))
* Provide provider-accurate response shapes for evals ([#34418](https://github.com/n8n-io/n8n/issues/34418)) ([1b173c7](https://github.com/n8n-io/n8n/commit/1b173c791ab76863cb3380d33fc6f3ae2c56570f))
* **QuickBooks Node:** Initialize headers object in quickBooksApiRequest ([#34291](https://github.com/n8n-io/n8n/issues/34291)) ([83dd194](https://github.com/n8n-io/n8n/commit/83dd194a893dce656a8044cf716c4191e04af2f2))
* Report an unverifiable unit as notVerified, not a silent pass ([#34421](https://github.com/n8n-io/n8n/issues/34421)) ([7d6fd4c](https://github.com/n8n-io/n8n/commit/7d6fd4ca9c6f55b7cef026d4a42e4ae9c115e153))
* Resolve modules on windows ([#34167](https://github.com/n8n-io/n8n/issues/34167)) ([9f0a6fa](https://github.com/n8n-io/n8n/commit/9f0a6fa68b48de0d013e49cf8f1236b49e6d7fdb))
* **Salesforce Node:** Pass ParentId when creating or updating a Case ([#33775](https://github.com/n8n-io/n8n/issues/33775)) ([fffee46](https://github.com/n8n-io/n8n/commit/fffee465a4c8a68432bc8ec1af06bce945fba719))
* Serialize date output in FTP, Set, IMAP and Unleashed nodes ([#34205](https://github.com/n8n-io/n8n/issues/34205)) ([391deb9](https://github.com/n8n-io/n8n/commit/391deb91af0cc31d41204d633df0e921193669e4))
* **Split Out Node:** Properly handle if "Fields to split out" is not a string ([#34148](https://github.com/n8n-io/n8n/issues/34148)) ([7998940](https://github.com/n8n-io/n8n/commit/79989407ffee587f6734ea6736269fc21ca8cac6))
* **editor:** Auto-ungroup invalid groups on workflow save ([#34513](https://github.com/n8n-io/n8n/issues/34513)) ([bb8dbed](https://github.com/n8n-io/n8n/commit/bb8dbedb8459f2c084b7f76e78c073f780da1c41))
### Features
## [2.31.3](https://github.com/n8n-io/n8n/compare/n8n@2.31.2...n8n@2.31.3) (2026-07-17)
* Add `showOnDeployment` option, show warning for read file node on cloud ([#34417](https://github.com/n8n-io/n8n/issues/34417)) ([f470230](https://github.com/n8n-io/n8n/commit/f47023066ef0f60f21b7bfa9c3c3295e912bd070))
* Add typed seed data tables with rows on execution scenarios ([#34420](https://github.com/n8n-io/n8n/issues/34420)) ([02af123](https://github.com/n8n-io/n8n/commit/02af1235747cdbc003fca0a199e9e0bdbc55affc))
* Adding agents tracing environment variable ([#34401](https://github.com/n8n-io/n8n/issues/34401)) ([b42aeee](https://github.com/n8n-io/n8n/commit/b42aeee50f522821ddcdf7d4de1bd789b8173e49))
* **ai-builder:** Allow AIA agent builder to publish and unpublish first-class agents ([#34368](https://github.com/n8n-io/n8n/issues/34368)) ([84ee063](https://github.com/n8n-io/n8n/commit/84ee0632a39601e010bdebc87d796dcd046f7937))
* **ai-builder:** Help AIA remove / adjust agent channels (sp Slack) via chat ([#34241](https://github.com/n8n-io/n8n/issues/34241)) ([f851863](https://github.com/n8n-io/n8n/commit/f851863090395b99345f31c89273015a824a678e))
* **ai-builder:** Refresh Instance AI agent artifact UI on channel setup success ([#34465](https://github.com/n8n-io/n8n/issues/34465)) ([2955d75](https://github.com/n8n-io/n8n/commit/2955d75b30e5a8be9f847ea257a0516585e696d3))
* **ai-builder:** Send agent preview chat context to AIA chat ([#34308](https://github.com/n8n-io/n8n/issues/34308)) ([9fad2ba](https://github.com/n8n-io/n8n/commit/9fad2ba510d3d14c209b35b8f79071f92c33cd2d))
* **API:** Add endpoint to retrieve SAML SSO configuration ([#34168](https://github.com/n8n-io/n8n/issues/34168)) ([e76b345](https://github.com/n8n-io/n8n/commit/e76b345fd85b87d6aa3edd3a393d6c0a1ad7234f))
* **API:** Add endpoint to set the SAML SSO configuration ([#34224](https://github.com/n8n-io/n8n/issues/34224)) ([cf8337a](https://github.com/n8n-io/n8n/commit/cf8337aeb12bab92a5ca8d23a79092968eca3d2e))
* **API:** Add public API endpoints for log streaming destinations ([#34251](https://github.com/n8n-io/n8n/issues/34251)) ([4a651dd](https://github.com/n8n-io/n8n/commit/4a651dd1aab62da3d0886140d7c31104eaf9b820))
* **API:** Add public API endpoints to trigger and cancel evaluation test runs ([#33979](https://github.com/n8n-io/n8n/issues/33979)) ([18b34ca](https://github.com/n8n-io/n8n/commit/18b34cab778f182e6081cf2c7d26789d276b2575))
* **API:** Allow creating a folder in the calling user's personal project ([#34091](https://github.com/n8n-io/n8n/issues/34091)) ([571e642](https://github.com/n8n-io/n8n/commit/571e6424edf4fc84ae753da7f77e8e4433f90396))
* **API:** Support placing workflows in folders via parentFolderId ([#32696](https://github.com/n8n-io/n8n/issues/32696)) ([a844d03](https://github.com/n8n-io/n8n/commit/a844d0336e5df55a6996a20e3d6112218d81c65c))
* **AWS Bedrock Chat Model Node:** Add Timeout option ([#34072](https://github.com/n8n-io/n8n/issues/34072)) ([a4738ea](https://github.com/n8n-io/n8n/commit/a4738eaf49dd54436a4340b10697fb5c271618c0))
* **core:** Add per-workflow execution data write bytes metric ([#34425](https://github.com/n8n-io/n8n/issues/34425)) ([f7496a5](https://github.com/n8n-io/n8n/commit/f7496a5aae1aa42f7d884dbbe554d417a09aa629))
* **core:** Add tracing, credit metering, and telemetry for the builder sub-agent ([#34151](https://github.com/n8n-io/n8n/issues/34151)) ([be35343](https://github.com/n8n-io/n8n/commit/be353431da9493a24495d84ebcba481a2d3dfa1f))
* **core:** Add variable bundling to package export ([#34040](https://github.com/n8n-io/n8n/issues/34040)) ([b637582](https://github.com/n8n-io/n8n/commit/b63758247ebd1a45d890370a21d70d4ab7a99349))
* **core:** Add workflow requirements to package exports ([#34217](https://github.com/n8n-io/n8n/issues/34217)) ([581e490](https://github.com/n8n-io/n8n/commit/581e4907293426f948f2840f43dd13604f1b5324))
* **core:** Adopt "n8n credits" wording and default to it in Instance AI ([#34426](https://github.com/n8n-io/n8n/issues/34426)) ([263ec69](https://github.com/n8n-io/n8n/commit/263ec699d6834a478673b4f1e931fc118be95b44))
* **core:** Enable n8n Connect usage in n8n MCP ([#33723](https://github.com/n8n-io/n8n/issues/33723)) ([4e4283b](https://github.com/n8n-io/n8n/commit/4e4283bf628a92ecd3030ca82808c21145b13e74))
* **core:** Enable prompt caching for the agent-builder sub-agent ([#34352](https://github.com/n8n-io/n8n/issues/34352)) ([a9357ef](https://github.com/n8n-io/n8n/commit/a9357ef5641222e561127ed60b7a059b1e72ea50))
* **core:** Include error workflows as export dependencies ([#34350](https://github.com/n8n-io/n8n/issues/34350)) ([7d23168](https://github.com/n8n-io/n8n/commit/7d231684d14233bcaa47cfb91d2cc3d9aa0a7f2e))
* **core:** Prefer MCP servers over node tools when available ([#34458](https://github.com/n8n-io/n8n/issues/34458)) ([078ee55](https://github.com/n8n-io/n8n/commit/078ee55890eddcb691fd9e8b6794b43e77ca3977))
* **core:** Support agent preview handoff in Instance AI ([#34171](https://github.com/n8n-io/n8n/issues/34171)) ([5a3394a](https://github.com/n8n-io/n8n/commit/5a3394aa34df80a2c90c5937a65f3bb0643ac323))
* **core:** Unify output schema mock generation and verify AI Assistant workflows with any trigger type ([#33896](https://github.com/n8n-io/n8n/issues/33896)) ([d33c282](https://github.com/n8n-io/n8n/commit/d33c282b951e5b8a1ae8017562945654449209cb))
* **editor:** Add descriptions to canvas groups ([#34219](https://github.com/n8n-io/n8n/issues/34219)) ([8477e58](https://github.com/n8n-io/n8n/commit/8477e5896ab805e6ee63f50be8de410f834d1c9f))
* **editor:** Add Mine/All tabs, search and filters to MCP connected clients ([#33857](https://github.com/n8n-io/n8n/issues/33857)) ([a2c19e4](https://github.com/n8n-io/n8n/commit/a2c19e46974990c39007ffe64ab2ae908fe2f1b9))
* **editor:** Add new Tags Input component to @n8n/design-system ([#34075](https://github.com/n8n-io/n8n/issues/34075)) ([bac57c4](https://github.com/n8n-io/n8n/commit/bac57c4ec11b4b11490cf5488181ed2b8e892c5a))
* **editor:** Add per-case compare tabs to eval collection compare view ([#33880](https://github.com/n8n-io/n8n/issues/33880)) ([dde77cb](https://github.com/n8n-io/n8n/commit/dde77cb7d39943ef6e6ae8e468c5ab772bdadef8))
* **editor:** Add scope selection to MCP OAuth consent screen ([#33710](https://github.com/n8n-io/n8n/issues/33710)) ([c3ca9a3](https://github.com/n8n-io/n8n/commit/c3ca9a36dafe3c7da084da5ceb325dbe9605dcb2))
* **editor:** Add sticky support for canvas groups ([#34317](https://github.com/n8n-io/n8n/issues/34317)) ([0fb07ca](https://github.com/n8n-io/n8n/commit/0fb07ca6ad9aaef5fe2366e96c69b5a52b7e8549))
* **editor:** Collapse AI Assistant thinking traces into thinking blocks ([#34274](https://github.com/n8n-io/n8n/issues/34274)) ([9744625](https://github.com/n8n-io/n8n/commit/97446258af4aaa91da6323d7599fb08a02ccef43))
* **editor:** Improve sub workflow extraction ([#34169](https://github.com/n8n-io/n8n/issues/34169)) ([318925a](https://github.com/n8n-io/n8n/commit/318925a4215e1eb431daf43f551a649dc4695b7f))
* **editor:** Rename N8nActionBox to N8nEmptyState and add icon-cards variant ([#34407](https://github.com/n8n-io/n8n/issues/34407)) ([a6b5462](https://github.com/n8n-io/n8n/commit/a6b54629c5f89b4c222fc59f0e679055f6a733db))
* **editor:** Save canvas group description pinned state in local storage ([#34220](https://github.com/n8n-io/n8n/issues/34220)) ([ecff317](https://github.com/n8n-io/n8n/commit/ecff317c577e46f42feb24e7c7413f4762041284))
* **editor:** Show access and client details in the connected MCP clients list ([#33714](https://github.com/n8n-io/n8n/issues/33714)) ([0ca24ba](https://github.com/n8n-io/n8n/commit/0ca24ba99655b0b0220c1f99a3641b14862b1593))
* **editor:** Show per-scope tool details on the MCP consent screen ([#33783](https://github.com/n8n-io/n8n/issues/33783)) ([cc515a7](https://github.com/n8n-io/n8n/commit/cc515a77c1d58f53b04587ce264899ad0a881a90))
* **Gmail Node:** Add advanced HITL configuration for Send and Wait ([#34255](https://github.com/n8n-io/n8n/issues/34255)) ([6194110](https://github.com/n8n-io/n8n/commit/61941103e6fb3ba7186bc9666145fbf3e55e0054))
* **Grist Node:** Use a single Grist URL field in the credential ([#34190](https://github.com/n8n-io/n8n/issues/34190)) ([d6d7d93](https://github.com/n8n-io/n8n/commit/d6d7d93df34075b4d55bf509855bd2411eda4eec))
* **Mailgun Node:** Add reply-to, custom headers, and tags ([#28558](https://github.com/n8n-io/n8n/issues/28558)) ([b9199e5](https://github.com/n8n-io/n8n/commit/b9199e5a964c0774bb9a5ad8c876ca54ce413c61))
* **Slack Node:** Add advanced HITL configuration for one-tap approval ([#34123](https://github.com/n8n-io/n8n/issues/34123)) ([d30e7b0](https://github.com/n8n-io/n8n/commit/d30e7b042c8ecb18aead1cdecd22145f382facbd))
* **Telegram Node:** Add advanced HITL configuration for one-tap in-chat approval ([#34009](https://github.com/n8n-io/n8n/issues/34009)) ([6db46bc](https://github.com/n8n-io/n8n/commit/6db46bc381d11f03d6ba24d8a66e8620efe92530))
* Validate agent configuration before publishing ([#34452](https://github.com/n8n-io/n8n/issues/34452)) ([5cb674e](https://github.com/n8n-io/n8n/commit/5cb674ed370561d5418dd02de0d4c1d58d11cce1))
### Bug Fixes
* **core:** Sign SES requests with the ses service name ([#34282](https://github.com/n8n-io/n8n/issues/34282)) ([4e72e25](https://github.com/n8n-io/n8n/commit/4e72e2536d9c78c668f9f71cbc8f01c507379fb2))
* Correct end-user credential validation, re-evaluation, and identity-hook recognition ([#34277](https://github.com/n8n-io/n8n/issues/34277)) ([d8c9e45](https://github.com/n8n-io/n8n/commit/d8c9e45a55fe851490ab8e406bafbec3f02550a7))
## [2.31.2](https://github.com/n8n-io/n8n/compare/n8n@2.31.1...n8n@2.31.2) (2026-07-16)
### Bug Fixes
* **core:** Fix change in width of all dropdowns in UI ([#34266](https://github.com/n8n-io/n8n/issues/34266)) ([953bbe5](https://github.com/n8n-io/n8n/commit/953bbe5b06e6948f5365ec45d9e440e540774c38))
* **core:** Require execution mode for MCP workflow executions ([#34280](https://github.com/n8n-io/n8n/issues/34280)) ([9aced71](https://github.com/n8n-io/n8n/commit/9aced71e1131c3e85233560b079bc1fdd89d9de0))
## [2.31.1](https://github.com/n8n-io/n8n/compare/n8n@2.31.0...n8n@2.31.1) (2026-07-15)
### Bug Fixes
* **core:** Bind dynamic credential tokens to a user ID ([#34134](https://github.com/n8n-io/n8n/issues/34134)) ([ab2acc8](https://github.com/n8n-io/n8n/commit/ab2acc81b3ee53bf8ec34fb3d72560cb71d7166b))
* **core:** Count AI assistant workflow test runs as manual executions in statistics ([#34152](https://github.com/n8n-io/n8n/issues/34152)) ([ea14067](https://github.com/n8n-io/n8n/commit/ea140677bbd40db9b2449b428c19274c3df2adbf))
* **core:** Preserve node aliases when generating AI tool variants ([#34194](https://github.com/n8n-io/n8n/issues/34194)) ([b01032c](https://github.com/n8n-io/n8n/commit/b01032cfe92f28d6afa7609cfee81ea58e25ce37))
* **editor:** Make AI assistant quota-exhausted error states explicit ([#34137](https://github.com/n8n-io/n8n/issues/34137)) ([e81d108](https://github.com/n8n-io/n8n/commit/e81d108eb6d4d0ac03e9919df965200b09812be3))
# [2.31.0](https://github.com/n8n-io/n8n/compare/n8n@2.30.0...n8n@2.31.0) (2026-07-14)

View File

@ -442,74 +442,29 @@ The full development mode (`pnpm dev`) runs multiple processes in parallel:
### Community PR Guidelines
We read and review every pull request by hand. These guidelines keep that sustainable, and they help you avoid building something we cannot accept. The fastest route to a merge is to agree on the change with us before you write code.
Our golden rule: a contribution should be worth more to the project than the time it takes us to review it.
#### **1. Start With an Issue or Forum Topic**
- **Ask before you start:**
- If you want to work on an existing issue, comment to ask first and wait for a team member to respond before you pick it up. This avoids two people, including us, building the same fix at the same time.
- **Bug fixes:**
- An issue must already exist that describes the problem and gives clear steps to reproduce it. If there is no issue, [open one](https://github.com/n8n-io/n8n/issues/new/choose) first.
- Bug-fix PRs with no linked issue will be returned so we can confirm and track the problem.
- **Features and enhancements:**
- Open a topic on the [n8n community forum](https://community.n8n.io/) first so we can discuss it before you build. This protects your time: we will tell you early whether we will accept the idea, and we will guide you on how we would want it handled.
- Feature PRs that arrive with no prior discussion will be closed with a pointer to the forum.
- **Refactoring or opinion-based changes:**
- Open an issue or forum topic first with a detailed rationale: what you want to change, why, and the concrete benefit. We do not merge "I prefer it this way" changes without that reasoning.
- **Core changes:**
- Contact n8n before starting any change under [/packages/core](/packages/core), as noted in the directory structure.
- **Identity, access, and credentials:**
- The n8n team handles changes to identity and access management and to the credentials system. These control how users sign in, what they reach, and how credentials get stored and used. A mistake here risks exposing sensitive data or locking users out, so we keep these in-house. If you spot a bug or have an idea, open an issue or forum topic to flag it and we will take it from there.
- **High-impact nodes:**
- The n8n team handles changes to the most widely used nodes, including HTTP Request, Code, Webhook Trigger, Form Trigger, and Schedule. A small change to one of these can break workflows for a large number of users, so we keep these in-house. If you spot a bug or have an idea for one of them, open an issue or forum topic to flag it and we will take it from there.
#### **2. Change Request/Comment**
#### **1. Change Request/Comment**
Please address the requested changes or provide feedback within 14 days. If there is no response or updates to the pull request during this time, it will be automatically closed. The PR can be reopened once the requested changes are applied.
#### **3. General Requirements**
#### **2. General Requirements**
- **Describe Your Change:**
- Every PR needs a clear description of what you changed, why, and why you took this approach over the alternatives. Link the issue or forum topic. Write the description in your own words. A PR with no real description will be closed.
- Where possible try to include a short video or screenshots. This is useful if you are working on a feature or updating a node.
- **Follow the Style Guide:**
- Ensure your code adheres to n8n's coding standards and conventions (e.g., formatting, naming, indentation). Use linting tools where applicable.
- **TypeScript Compliance:**
- Do not use `ts-ignore` or `ts-expect-error` to silence the compiler.
- Do not use `ts-ignore` .
- Ensure code adheres to TypeScript rules.
- **Avoid Repetitive Code:**
- Reuse existing components, parameters, and logic wherever possible instead of redefining or duplicating them.
- Before writing a constant or helper, check whether one already exists. For nodes, throw `NodeOperationError`/`NodeApiError` (from `n8n-workflow`) rather than raw errors, and use `jsonParse` (from `n8n-workflow`) instead of bare `JSON.parse`. More generally, `@n8n/constants` and `@n8n/utils` hold many reusable helpers — e.g. `Time` from `@n8n/constants` for time-unit math (`5 * Time.minutes.toMilliseconds` instead of `5 * 60 * 1000`).
- For nodes: Use the same parameter across multiple operations rather than defining a new parameter for each operation (if applicable).
- **Testing Requirements:**
- PRs **must include tests**:
- Unit tests
- Integration tests (if applicable)
- Workflow tests for nodes (example [here](https://github.com/n8n-io/n8n/tree/master/packages/nodes-base/nodes/Switch/V3/test))
- UI tests (if applicable)
- Detailed steps under the "How to test" section of the PR template to cover how to manually test the feature or bug fix.
- For a **bug fix**, include at least one regression test that **fails against the latest `master`** without your change and passes with it. Tell us in the description how to see it fail, so we can verify the fix actually fixes something.
- **Typos:**
- Use a spell-checking tool, such as [**Code Spell Checker**](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker), to avoid typos.
- **Verify that your PR contains only your intended changes:**
- Before opening or requesting review, check the *Files Changed* tab and confirm that all modifications are related to your fix/feature. If you see unrelated file changes, commits from other authors, or a large number of unexpected commits, rebase or recreate your branch against the current `master` branch and clean up the history before submitting.
#### **4. Using AI Tools**
We use AI tools ourselves and we welcome AI-assisted contributions. The problem is not the tool. The problem is code the author cannot stand behind.
- **Understand and own your code:**
- You must understand every line you submit and be able to explain what it does and how it fits the rest of the system, without the AI. If you cannot, do not open the PR yet.
- **Write the description in your own words:**
- Write your PR description, issue, and forum posts in your own words. Do not paste raw model output.
- **Same gates apply:**
- AI-assisted features and refactors still need an accepted issue or forum topic first, the same as any other change.
- **Disclosure:**
- We encourage you to note in the PR if AI tools did a meaningful part of the work, and which tools. It helps us calibrate review and it is not held against you.
#### **5. PR Specific Requirements**
#### **3. PR Specific Requirements**
- **Small PRs Only:**
- Focus on a single feature or fix per PR.
@ -517,24 +472,14 @@ We use AI tools ourselves and we welcome AI-assisted contributions. The problem
- Follow [n8n's PR Title Conventions](https://github.com/n8n-io/n8n/blob/master/.github/pull_request_title_conventions.md#L36).
- **New Nodes:**
- PRs that introduce new nodes will be **auto-closed** unless they are explicitly requested by the n8n team and aligned with an agreed project scope. However, you can still explore [building your own nodes](https://docs.n8n.io/integrations/creating-nodes/overview/), as n8n offers the flexibility to create your own custom nodes.
- **Existing Nodes:**
- If you are making changes to existing nodes that changes functionality, output data or anything that could cause existing workflows to change refer to our [node version guidelines](https://docs.n8n.io/connect/create-nodes/build-your-node/reference/versioning) to minimise impact.
- **Typo-Only PRs:**
- Typos are not sufficient justification for a PR and will be rejected. Fold typo fixes into a larger, related change.
- Typos are not sufficient justification for a PR and will be rejected.
#### **6. Workflow Summary for Non-Compliant PRs**
#### **4. Workflow Summary for Non-Compliant PRs**
- **No Linked Issue or Discussion:** Bug-fix PRs with no issue, and feature PRs with no forum topic, will be returned or closed per section 1.
- **No Tests:** If tests are not provided, the PR will be auto-closed after **14 days**.
- **Keep PRs small and focused.** Each PR should add no more than 1000 lines and cover one logical change. Larger or multifaceted PRs will be returned for segmentation.
- **Non-Small PRs:** Large or multifaceted PRs will be returned for segmentation.
- **New Nodes/Typo PRs:** Automatically rejected if not aligned with project scope or guidelines.
- **Low-Value or Automated PRs:** We close these, and may block accounts that repeat them. This covers:
- Whitespace, formatting, or reordering changes with no functional reason.
- Mass find-and-replace or renames submitted with no rationale.
- Dependency bumps with no explanation of why the bump is needed.
- README badges, comment tweaks, or restating the obvious.
- PRs whose main purpose is to earn a contribution credit, a mention, or event points. Hacktoberfest and similar events do not change the quality bar.
- Bulk or scripted submissions across many files or repositories.
---

View File

@ -1,3 +0,0 @@
#!/bin/sh
echo "Hello n8n!"

View File

@ -1,7 +1,7 @@
# Pinned to a multi-arch index digest (linux/amd64 + linux/arm64) for reproducible builds.
# The tag is the human-readable version; Docker resolves by the digest. Bump the tag and
# digest together when updating the base image.
FROM dhi.io/node:24.18.0-alpine3.24-dev@sha256:d508453231109fbe96a39045ecc794ac18f8b99ca218a0806833d65bb2750e03
FROM dhi.io/node:24.16.0-alpine3.24-dev@sha256:0fda302d7d6f2436b27edc9392bd6a4f8ae9ce86e9837c2b8676abdf26a4a7fb
# Install all dependencies in a single layer to minimize image size
RUN apk add --no-cache busybox-binsh && \

View File

@ -1,11 +1,11 @@
ARG NODE_VERSION=24.18.0
ARG NODE_VERSION=24.16.0
ARG N8N_VERSION=snapshot
# Builder stage exists because the runtime base image has no toolchain.
# Pinned to multi-arch index digest (linux/amd64 + linux/arm64) for reproducible builds.
# Bump the digest together with the tag when updating the base image.
# Digest pins to node:24.18.0-alpine3.24 (Node 24.18.0, Alpine 3.24).
FROM node:24.18.0-alpine3.24@sha256:a0b9bf06e4e6193cf7a0f58816cc935ff8c2a908f81e6f1a95432d679c54fbfd AS builder
# Digest pins to node:24.16.0-alpine3.24 (Node 24.16.0, Alpine 3.24).
FROM node:24.16.0-alpine3.24@sha256:21f403ab171f2dc89bad4dd69d7721bfd15f084ccb46cdd225f31f2bc59b5c9a AS builder
COPY ./compiled /usr/local/lib/node_modules/n8n
RUN apk add --no-cache python3 make g++ && \
cd /usr/local/lib/node_modules/n8n && \
@ -28,8 +28,8 @@ RUN apk add --no-cache python3 make g++ && \
# base change, so a base rebuild does not reach this image until the digest is
# manually re-pinned here. Bump the digest together with the tag whenever the base
# image is intentionally updated.
# Digest pins to n8nio/base:24.18.0 (Node 24.18.0, Alpine 3.24).
FROM n8nio/base:24.18.0@sha256:29d9c11f55f02442276512592b439ebb2a1d1043c1339ad5cea4e56862520d22
# Digest pins to n8nio/base:24.16.0 (Node 24.16.0, Alpine 3.24).
FROM n8nio/base:24.16.0@sha256:25e5671a1b3e11cd576bc9a4409ebf962baea993a4bc7414168dfd357e85a7e8
ARG N8N_VERSION
ARG N8N_RELEASE_TYPE=dev

View File

@ -10,18 +10,14 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| ---- | ------- | ------- | ---- |
| [public.agent_chat_subscriptions](public.agent_chat_subscriptions.md) | 6 | | BASE TABLE |
| [public.agent_checkpoints](public.agent_checkpoints.md) | 6 | | BASE TABLE |
| [public.agent_eval_dataset](public.agent_eval_dataset.md) | 10 | | BASE TABLE |
| [public.agent_eval_rating](public.agent_eval_rating.md) | 8 | | BASE TABLE |
| [public.agent_eval_result](public.agent_eval_result.md) | 15 | | BASE TABLE |
| [public.agent_eval_run](public.agent_eval_run.md) | 14 | | BASE TABLE |
| [public.agent_execution](public.agent_execution.md) | 19 | | BASE TABLE |
| [public.agent_execution](public.agent_execution.md) | 18 | | BASE TABLE |
| [public.agent_execution_threads](public.agent_execution_threads.md) | 17 | | BASE TABLE |
| [public.agent_files](public.agent_files.md) | 8 | | BASE TABLE |
| [public.agent_history](public.agent_history.md) | 9 | | BASE TABLE |
| [public.agent_task_definition](public.agent_task_definition.md) | 7 | | BASE TABLE |
| [public.agent_task_run_lock](public.agent_task_run_lock.md) | 6 | | BASE TABLE |
| [public.agent_task_snapshot](public.agent_task_snapshot.md) | 8 | | BASE TABLE |
| [public.agents](public.agents.md) | 12 | | BASE TABLE |
| [public.agents](public.agents.md) | 11 | | BASE TABLE |
| [public.agents_memory_entries](public.agents_memory_entries.md) | 13 | | BASE TABLE |
| [public.agents_memory_entry_cursors](public.agents_memory_entry_cursors.md) | 6 | | BASE TABLE |
| [public.agents_memory_entry_locks](public.agents_memory_entry_locks.md) | 6 | | BASE TABLE |
@ -44,7 +40,7 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| [public.chat_hub_sessions](public.chat_hub_sessions.md) | 13 | | BASE TABLE |
| [public.chat_hub_tools](public.chat_hub_tools.md) | 9 | | BASE TABLE |
| [public.credential_dependency](public.credential_dependency.md) | 5 | | BASE TABLE |
| [public.credentials_entity](public.credentials_entity.md) | 12 | | BASE TABLE |
| [public.credentials_entity](public.credentials_entity.md) | 11 | | BASE TABLE |
| [public.data_table](public.data_table.md) | 5 | | BASE TABLE |
| [public.data_table_column](public.data_table_column.md) | 7 | | BASE TABLE |
| [public.deployment_key](public.deployment_key.md) | 7 | | BASE TABLE |
@ -66,8 +62,7 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| [public.insights_raw](public.insights_raw.md) | 5 | | BASE TABLE |
| [public.installed_nodes](public.installed_nodes.md) | 4 | | BASE TABLE |
| [public.installed_packages](public.installed_packages.md) | 6 | | BASE TABLE |
| [public.instance_ai_checkpoints](public.instance_ai_checkpoints.md) | 9 | | BASE TABLE |
| [public.instance_ai_events](public.instance_ai_events.md) | 7 | | BASE TABLE |
| [public.instance_ai_checkpoints](public.instance_ai_checkpoints.md) | 8 | | BASE TABLE |
| [public.instance_ai_iteration_logs](public.instance_ai_iteration_logs.md) | 6 | | BASE TABLE |
| [public.instance_ai_mcp_registry_connections](public.instance_ai_mcp_registry_connections.md) | 7 | | BASE TABLE |
| [public.instance_ai_messages](public.instance_ai_messages.md) | 8 | | BASE TABLE |
@ -81,7 +76,6 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| [public.instance_ai_thread_grants](public.instance_ai_thread_grants.md) | 5 | | BASE TABLE |
| [public.instance_ai_threads](public.instance_ai_threads.md) | 7 | | BASE TABLE |
| [public.instance_ai_workflow_snapshots](public.instance_ai_workflow_snapshots.md) | 7 | | BASE TABLE |
| [public.instance_credential_assignment](public.instance_credential_assignment.md) | 4 | | BASE TABLE |
| [public.instance_version_history](public.instance_version_history.md) | 5 | | BASE TABLE |
| [public.invalid_auth_token](public.invalid_auth_token.md) | 2 | | BASE TABLE |
| [public.mcp_registry_server](public.mcp_registry_server.md) | 7 | | BASE TABLE |
@ -89,7 +83,7 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| [public.oauth_authorization_codes](public.oauth_authorization_codes.md) | 13 | | BASE TABLE |
| [public.oauth_clients](public.oauth_clients.md) | 9 | | BASE TABLE |
| [public.oauth_refresh_tokens](public.oauth_refresh_tokens.md) | 7 | | BASE TABLE |
| [public.oauth_user_consents](public.oauth_user_consents.md) | 5 | | BASE TABLE |
| [public.oauth_user_consents](public.oauth_user_consents.md) | 4 | | BASE TABLE |
| [public.processed_data](public.processed_data.md) | 5 | | BASE TABLE |
| [public.project](public.project.md) | 9 | | BASE TABLE |
| [public.project_relation](public.project_relation.md) | 5 | | BASE TABLE |
@ -99,7 +93,7 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| [public.role_mapping_rule_project](public.role_mapping_rule_project.md) | 2 | | BASE TABLE |
| [public.role_scope](public.role_scope.md) | 2 | | BASE TABLE |
| [public.scheduled_job](public.scheduled_job.md) | 19 | | BASE TABLE |
| [public.scheduled_task](public.scheduled_task.md) | 17 | | BASE TABLE |
| [public.scheduled_task](public.scheduled_task.md) | 16 | | BASE TABLE |
| [public.scope](public.scope.md) | 3 | | BASE TABLE |
| [public.secrets_provider_connection](public.secrets_provider_connection.md) | 7 | | BASE TABLE |
| [public.settings](public.settings.md) | 3 | | BASE TABLE |
@ -124,10 +118,6 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| [public.workflow_publication_trigger_status](public.workflow_publication_trigger_status.md) | 8 | | BASE TABLE |
| [public.workflow_publish_history](public.workflow_publish_history.md) | 6 | | BASE TABLE |
| [public.workflow_published_version](public.workflow_published_version.md) | 4 | | BASE TABLE |
| [public.workflow_review_request](public.workflow_review_request.md) | 12 | | BASE TABLE |
| [public.workflow_review_request_authors](public.workflow_review_request_authors.md) | 2 | | BASE TABLE |
| [public.workflow_review_request_reviewers](public.workflow_review_request_reviewers.md) | 2 | | BASE TABLE |
| [public.workflow_review_request_workflow](public.workflow_review_request_workflow.md) | 4 | | BASE TABLE |
| [public.workflow_statistics](public.workflow_statistics.md) | 7 | | BASE TABLE |
| [public.workflow_statistics_delta](public.workflow_statistics_delta.md) | 6 | | BASE TABLE |
| [public.workflows_tags](public.workflows_tags.md) | 2 | | BASE TABLE |
@ -155,13 +145,6 @@ erDiagram
"public.agent_chat_subscriptions" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_checkpoints" }o--o| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_eval_dataset" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_eval_dataset" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_eval_rating" }o--o| "public.user" : "FOREIGN KEY (#quot;ratedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_eval_rating" }o--|| "public.agent_eval_result" : "FOREIGN KEY (#quot;resultId#quot;) REFERENCES agent_eval_result(id) ON DELETE CASCADE"
"public.agent_eval_result" }o--|| "public.agent_eval_run" : "FOREIGN KEY (#quot;runId#quot;) REFERENCES agent_eval_run(id) ON DELETE CASCADE"
"public.agent_eval_run" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_eval_run" }o--|| "public.agent_eval_dataset" : "FOREIGN KEY (#quot;datasetId#quot;) REFERENCES agent_eval_dataset(id) ON DELETE CASCADE"
"public.agent_execution" }o--|| "public.agent_execution_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES agent_execution_threads(id) ON DELETE CASCADE"
"public.agent_execution_threads" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.agent_execution_threads" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
@ -244,7 +227,6 @@ erDiagram
"public.insights_raw" }o--|| "public.insights_metadata" : "FOREIGN KEY (#quot;metaId#quot;) REFERENCES insights_metadata(#quot;metaId#quot;) ON DELETE CASCADE"
"public.installed_nodes" }o--|| "public.installed_packages" : "FOREIGN KEY (package) REFERENCES installed_packages(#quot;packageName#quot;) ON UPDATE CASCADE ON DELETE CASCADE"
"public.instance_ai_checkpoints" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_events" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_iteration_logs" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_mcp_registry_connections" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.instance_ai_mcp_registry_connections" }o--|| "public.credentials_entity" : "FOREIGN KEY (#quot;credentialId#quot;) REFERENCES credentials_entity(id) ON DELETE CASCADE"
@ -263,7 +245,6 @@ erDiagram
"public.instance_ai_thread_grants" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.instance_ai_thread_grants" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_threads" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.instance_credential_assignment" }o--|| "public.credentials_entity" : "FOREIGN KEY (#quot;credentialId#quot;) REFERENCES credentials_entity(id) ON DELETE RESTRICT"
"public.oauth_access_tokens" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.oauth_access_tokens" }o--|| "public.oauth_clients" : "FOREIGN KEY (#quot;clientId#quot;) REFERENCES oauth_clients(id) ON DELETE CASCADE"
"public.oauth_authorization_codes" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
@ -314,17 +295,6 @@ erDiagram
"public.workflow_publish_history" }o--o| "public.workflow_history" : "FOREIGN KEY (#quot;versionId#quot;) REFERENCES workflow_history(#quot;versionId#quot;) ON DELETE SET NULL"
"public.workflow_published_version" |o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE RESTRICT"
"public.workflow_published_version" }o--|| "public.workflow_history" : "FOREIGN KEY (#quot;publishedVersionId#quot;) REFERENCES workflow_history(#quot;versionId#quot;) ON DELETE RESTRICT"
"public.workflow_review_request" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request" }o--o| "public.user" : "FOREIGN KEY (#quot;updatedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request" }o--o| "public.user" : "FOREIGN KEY (#quot;closedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.workflow_review_request_authors" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.workflow_review_request_authors" }o--|| "public.workflow_review_request" : "FOREIGN KEY (#quot;workflowReviewRequestId#quot;) REFERENCES workflow_review_request(id) ON DELETE CASCADE"
"public.workflow_review_request_reviewers" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.workflow_review_request_reviewers" }o--|| "public.workflow_review_request" : "FOREIGN KEY (#quot;workflowReviewRequestId#quot;) REFERENCES workflow_review_request(id) ON DELETE CASCADE"
"public.workflow_review_request_workflow" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.workflow_review_request_workflow" }o--o| "public.workflow_history" : "FOREIGN KEY (#quot;workflowVersionId#quot;) REFERENCES workflow_history(#quot;versionId#quot;) ON DELETE SET NULL"
"public.workflow_review_request_workflow" }o--|| "public.workflow_review_request" : "FOREIGN KEY (#quot;workflowReviewRequestId#quot;) REFERENCES workflow_review_request(id) ON DELETE CASCADE"
"public.workflows_tags" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.workflows_tags" }o--|| "public.tag_entity" : "FOREIGN KEY (#quot;tagId#quot;) REFERENCES tag_entity(id) ON DELETE CASCADE"
@ -344,61 +314,6 @@ erDiagram
text state
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_dataset" {
varchar_36_ agentId FK
json columnMapping
timestamp_3__with_time_zone createdAt
uuid createdById FK
json datasetRef
varchar_32_ datasetSource
text description
varchar_36_ id
varchar_128_ name
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_rating" {
text comment
json correction
timestamp_3__with_time_zone createdAt
varchar_36_ id
uuid ratedById FK
varchar_36_ resultId FK
timestamp_3__with_time_zone updatedAt
varchar_8_ vote
}
"public.agent_eval_result" {
timestamp_3__with_time_zone completedAt
timestamp_3__with_time_zone createdAt
varchar_255_ errorCode
json errorDetails
varchar_36_ id
json input
json metrics
json output
timestamp_3__with_time_zone runAt
varchar_36_ runId FK
integer runIndex
varchar_255_ sourceRowId
varchar status
json toolCalls
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_run" {
varchar_36_ agentVersionId
boolean cancelRequested
timestamp_3__with_time_zone completedAt
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ datasetId FK
varchar_255_ errorCode
json errorDetails
varchar_36_ id
json metrics
timestamp_3__with_time_zone runAt
varchar_255_ runningInstanceId
varchar status
timestamp_3__with_time_zone updatedAt
}
"public.agent_execution" {
integer completionTokens
double_precision cost
@ -413,7 +328,6 @@ erDiagram
timestamp_3__with_time_zone startedAt
varchar_16_ status
timestamp_3__with_time_zone stoppedAt
varchar_2_ storedAt
varchar_128_ threadId FK
json timeline
integer totalTokens
@ -489,7 +403,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations
@ -727,7 +640,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
"public.data_table" {
timestamp_3__with_time_zone createdAt
@ -889,7 +801,7 @@ erDiagram
bigint value
}
"public.installed_nodes" {
double_precision latestVersion
integer latestVersion
varchar_200_ name
varchar_241_ package FK
varchar_200_ type
@ -905,7 +817,6 @@ erDiagram
"public.instance_ai_checkpoints" {
timestamp_3__with_time_zone createdAt
timestamp_3__with_time_zone expiredAt
varchar_64_ hostRunId
varchar_255_ key
varchar_255_ resourceId
varchar_255_ runId
@ -913,15 +824,6 @@ erDiagram
uuid threadId FK
timestamp_3__with_time_zone updatedAt
}
"public.instance_ai_events" {
timestamp_3__with_time_zone createdAt
text payload
varchar_64_ runId
integer seq
uuid threadId FK
varchar_64_ type
timestamp_3__with_time_zone updatedAt
}
"public.instance_ai_iteration_logs" {
timestamp_3__with_time_zone createdAt
text entry
@ -1069,12 +971,6 @@ erDiagram
timestamp_3__with_time_zone updatedAt
varchar_255_ workflowName
}
"public.instance_credential_assignment" {
timestamp_3__with_time_zone createdAt
varchar_36_ credentialId FK
varchar_128_ credentialUseId
timestamp_3__with_time_zone updatedAt
}
"public.instance_version_history" {
timestamp_3__with_time_zone createdAt
integer id
@ -1139,7 +1035,6 @@ erDiagram
varchar clientId FK
bigint grantedAt
integer id
json scope
uuid userId FK
}
"public.processed_data" {
@ -1225,7 +1120,6 @@ erDiagram
integer attempts
varchar_255_ claimedBy
timestamp_3__with_time_zone createdAt
timestamp_3__with_time_zone dispatchedAt
text errorMessage
timestamp_3__with_time_zone finishedAt
bigint id
@ -1473,34 +1367,6 @@ erDiagram
timestamp_3__with_time_zone updatedAt
varchar_36_ workflowId FK
}
"public.workflow_review_request" {
timestamp_3__with_time_zone approvedAt
uuid closedById FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_50_ decision
text description
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ state
varchar_255_ title
timestamp_3__with_time_zone updatedAt
uuid updatedById FK
}
"public.workflow_review_request_authors" {
uuid userId FK
varchar_36_ workflowReviewRequestId FK
}
"public.workflow_review_request_reviewers" {
uuid userId FK
varchar_36_ workflowReviewRequestId FK
}
"public.workflow_review_request_workflow" {
varchar_36_ id
varchar_36_ workflowId FK
varchar_36_ workflowReviewRequestId FK
varchar_36_ workflowVersionId FK
}
"public.workflow_statistics" {
bigint count
integer id

View File

@ -48,7 +48,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -46,7 +46,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -1,113 +0,0 @@
# public.agent_eval_dataset
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| agentId | varchar(36) | | false | | [public.agents](public.agents.md) | |
| columnMapping | json | | true | | | Maps dataset columns onto input / expectedOutput / criteria roles |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| createdById | uuid | | true | | [public.user](public.user.md) | |
| datasetRef | json | | false | | | Pointer into the dataset backend (e.g. { dataTableId }); shape varies by datasetSource |
| datasetSource | varchar(32) | | false | | | Dataset backend the cases are read from |
| description | text | | true | | | |
| id | varchar(36) | | false | [public.agent_eval_run](public.agent_eval_run.md) | | |
| name | varchar(128) | | false | | | |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_agent_eval_dataset_datasetSource | CHECK | CHECK ((("datasetSource")::text = ANY ((ARRAY['data_table'::character varying, 'google_sheets'::character varying])::text[]))) |
| FK_9d3a6fd750f7746de453cf4d5ed | FOREIGN KEY | FOREIGN KEY ("agentId") REFERENCES agents(id) ON DELETE CASCADE |
| FK_eda9e5fa5558d3f16bc2f6c21b6 | FOREIGN KEY | FOREIGN KEY ("createdById") REFERENCES "user"(id) ON DELETE SET NULL |
| PK_ac887efbb3580a577f1442cfa89 | PRIMARY KEY | PRIMARY KEY (id) |
| agent_eval_dataset_agentId_not_null | n | NOT NULL "agentId" |
| agent_eval_dataset_createdAt_not_null | n | NOT NULL "createdAt" |
| agent_eval_dataset_datasetRef_not_null | n | NOT NULL "datasetRef" |
| agent_eval_dataset_datasetSource_not_null | n | NOT NULL "datasetSource" |
| agent_eval_dataset_id_not_null | n | NOT NULL id |
| agent_eval_dataset_name_not_null | n | NOT NULL name |
| agent_eval_dataset_updatedAt_not_null | n | NOT NULL "updatedAt" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_9d3a6fd750f7746de453cf4d5e | CREATE INDEX "IDX_9d3a6fd750f7746de453cf4d5e" ON public.agent_eval_dataset USING btree ("agentId") |
| PK_ac887efbb3580a577f1442cfa89 | CREATE UNIQUE INDEX "PK_ac887efbb3580a577f1442cfa89" ON public.agent_eval_dataset USING btree (id) |
## Relations
```mermaid
erDiagram
"public.agent_eval_dataset" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_eval_dataset" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_eval_run" }o--|| "public.agent_eval_dataset" : "FOREIGN KEY (#quot;datasetId#quot;) REFERENCES agent_eval_dataset(id) ON DELETE CASCADE"
"public.agent_eval_dataset" {
varchar_36_ agentId FK
json columnMapping
timestamp_3__with_time_zone createdAt
uuid createdById FK
json datasetRef
varchar_32_ datasetSource
text description
varchar_36_ id
varchar_128_ name
timestamp_3__with_time_zone updatedAt
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations
varchar_128_ name
varchar_255_ projectId FK
json schema
json skills
json tools
timestamp_3__with_time_zone updatedAt
varchar_36_ versionId
}
"public.user" {
timestamp_3__with_time_zone createdAt
boolean disabled
varchar_255_ email
varchar_32_ firstName
uuid id
date lastActiveAt
varchar_32_ lastName
boolean mfaEnabled
text mfaRecoveryCodes
text mfaSecret
varchar_255_ password
json personalizationAnswers
varchar_128_ roleSlug FK
json settings
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_run" {
varchar_36_ agentVersionId
boolean cancelRequested
timestamp_3__with_time_zone completedAt
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ datasetId FK
varchar_255_ errorCode
json errorDetails
varchar_36_ id
json metrics
timestamp_3__with_time_zone runAt
varchar_255_ runningInstanceId
varchar status
timestamp_3__with_time_zone updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -1,93 +0,0 @@
# public.agent_eval_rating
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| comment | text | | true | | | |
| correction | json | | true | | | Optional corrected/edited output supplied by the rater |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| id | varchar(36) | | false | | | |
| ratedById | uuid | | true | | [public.user](public.user.md) | |
| resultId | varchar(36) | | false | | [public.agent_eval_result](public.agent_eval_result.md) | |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| vote | varchar(8) | | false | | | Human feedback direction |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_agent_eval_rating_vote | CHECK | CHECK (((vote)::text = ANY ((ARRAY['up'::character varying, 'down'::character varying])::text[]))) |
| FK_9cadae6591c64498f1b58a2cef3 | FOREIGN KEY | FOREIGN KEY ("resultId") REFERENCES agent_eval_result(id) ON DELETE CASCADE |
| FK_e06a7408573a3e152e673977d2c | FOREIGN KEY | FOREIGN KEY ("ratedById") REFERENCES "user"(id) ON DELETE SET NULL |
| PK_04b7709a435e0c07520ceb37393 | PRIMARY KEY | PRIMARY KEY (id) |
| agent_eval_rating_createdAt_not_null | n | NOT NULL "createdAt" |
| agent_eval_rating_id_not_null | n | NOT NULL id |
| agent_eval_rating_resultId_not_null | n | NOT NULL "resultId" |
| agent_eval_rating_updatedAt_not_null | n | NOT NULL "updatedAt" |
| agent_eval_rating_vote_not_null | n | NOT NULL vote |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_9cadae6591c64498f1b58a2cef | CREATE INDEX "IDX_9cadae6591c64498f1b58a2cef" ON public.agent_eval_rating USING btree ("resultId") |
| PK_04b7709a435e0c07520ceb37393 | CREATE UNIQUE INDEX "PK_04b7709a435e0c07520ceb37393" ON public.agent_eval_rating USING btree (id) |
## Relations
```mermaid
erDiagram
"public.agent_eval_rating" }o--o| "public.user" : "FOREIGN KEY (#quot;ratedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_eval_rating" }o--|| "public.agent_eval_result" : "FOREIGN KEY (#quot;resultId#quot;) REFERENCES agent_eval_result(id) ON DELETE CASCADE"
"public.agent_eval_rating" {
text comment
json correction
timestamp_3__with_time_zone createdAt
varchar_36_ id
uuid ratedById FK
varchar_36_ resultId FK
timestamp_3__with_time_zone updatedAt
varchar_8_ vote
}
"public.user" {
timestamp_3__with_time_zone createdAt
boolean disabled
varchar_255_ email
varchar_32_ firstName
uuid id
date lastActiveAt
varchar_32_ lastName
boolean mfaEnabled
text mfaRecoveryCodes
text mfaSecret
varchar_255_ password
json personalizationAnswers
varchar_128_ roleSlug FK
json settings
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_result" {
timestamp_3__with_time_zone completedAt
timestamp_3__with_time_zone createdAt
varchar_255_ errorCode
json errorDetails
varchar_36_ id
json input
json metrics
json output
timestamp_3__with_time_zone runAt
varchar_36_ runId FK
integer runIndex
varchar_255_ sourceRowId
varchar status
json toolCalls
timestamp_3__with_time_zone updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -1,98 +0,0 @@
# public.agent_eval_result
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| completedAt | timestamp(3) with time zone | | true | | | |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| errorCode | varchar(255) | | true | | | |
| errorDetails | json | | true | | | |
| id | varchar(36) | | false | [public.agent_eval_rating](public.agent_eval_rating.md) | | |
| input | json | | true | | | Snapshot of the case input actually run (row may later change) |
| metrics | json | | true | | | Per-case judge scores |
| output | json | | true | | | Agent output for this case |
| runAt | timestamp(3) with time zone | | true | | | |
| runId | varchar(36) | | false | | [public.agent_eval_run](public.agent_eval_run.md) | |
| runIndex | integer | | true | | | Order of this case within the run |
| sourceRowId | varchar(255) | | true | | | Origin dataset row id; loose pointer, rows are external and mutable |
| status | varchar | | false | | | Per-case lifecycle |
| toolCalls | json | | true | | | Tool-call timeline captured during the run |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_agent_eval_result_status | CHECK | CHECK (((status)::text = ANY ((ARRAY['new'::character varying, 'running'::character varying, 'success'::character varying, 'error'::character varying, 'cancelled'::character varying])::text[]))) |
| FK_40a2d1248a6d984f442de2fac1b | FOREIGN KEY | FOREIGN KEY ("runId") REFERENCES agent_eval_run(id) ON DELETE CASCADE |
| PK_d40a22dc56dc200313c1f0e41ac | PRIMARY KEY | PRIMARY KEY (id) |
| agent_eval_result_createdAt_not_null | n | NOT NULL "createdAt" |
| agent_eval_result_id_not_null | n | NOT NULL id |
| agent_eval_result_runId_not_null | n | NOT NULL "runId" |
| agent_eval_result_status_not_null | n | NOT NULL status |
| agent_eval_result_updatedAt_not_null | n | NOT NULL "updatedAt" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_40a2d1248a6d984f442de2fac1 | CREATE INDEX "IDX_40a2d1248a6d984f442de2fac1" ON public.agent_eval_result USING btree ("runId") |
| PK_d40a22dc56dc200313c1f0e41ac | CREATE UNIQUE INDEX "PK_d40a22dc56dc200313c1f0e41ac" ON public.agent_eval_result USING btree (id) |
## Relations
```mermaid
erDiagram
"public.agent_eval_rating" }o--|| "public.agent_eval_result" : "FOREIGN KEY (#quot;resultId#quot;) REFERENCES agent_eval_result(id) ON DELETE CASCADE"
"public.agent_eval_result" }o--|| "public.agent_eval_run" : "FOREIGN KEY (#quot;runId#quot;) REFERENCES agent_eval_run(id) ON DELETE CASCADE"
"public.agent_eval_result" {
timestamp_3__with_time_zone completedAt
timestamp_3__with_time_zone createdAt
varchar_255_ errorCode
json errorDetails
varchar_36_ id
json input
json metrics
json output
timestamp_3__with_time_zone runAt
varchar_36_ runId FK
integer runIndex
varchar_255_ sourceRowId
varchar status
json toolCalls
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_rating" {
text comment
json correction
timestamp_3__with_time_zone createdAt
varchar_36_ id
uuid ratedById FK
varchar_36_ resultId FK
timestamp_3__with_time_zone updatedAt
varchar_8_ vote
}
"public.agent_eval_run" {
varchar_36_ agentVersionId
boolean cancelRequested
timestamp_3__with_time_zone completedAt
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ datasetId FK
varchar_255_ errorCode
json errorDetails
varchar_36_ id
json metrics
timestamp_3__with_time_zone runAt
varchar_255_ runningInstanceId
varchar status
timestamp_3__with_time_zone updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -1,119 +0,0 @@
# public.agent_eval_run
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| agentVersionId | varchar(36) | | true | | | Published agent version under test (agent_history.versionId); loose pointer, no FK so runs survive history pruning. The agent itself comes from the dataset. |
| cancelRequested | boolean | false | false | | | Fallback cancellation flag polled by the running main |
| completedAt | timestamp(3) with time zone | | true | | | |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| createdById | uuid | | true | | [public.user](public.user.md) | |
| datasetId | varchar(36) | | false | | [public.agent_eval_dataset](public.agent_eval_dataset.md) | |
| errorCode | varchar(255) | | true | | | |
| errorDetails | json | | true | | | |
| id | varchar(36) | | false | [public.agent_eval_result](public.agent_eval_result.md) | | |
| metrics | json | | true | | | Aggregated run-level scores |
| runAt | timestamp(3) with time zone | | true | | | |
| runningInstanceId | varchar(255) | | true | | | Main instance executing this run; used to coordinate cancellation |
| status | varchar | | false | | | Run lifecycle |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_agent_eval_run_status | CHECK | CHECK (((status)::text = ANY ((ARRAY['new'::character varying, 'running'::character varying, 'completed'::character varying, 'error'::character varying, 'cancelled'::character varying])::text[]))) |
| FK_39ca447735d378e365f4227abff | FOREIGN KEY | FOREIGN KEY ("datasetId") REFERENCES agent_eval_dataset(id) ON DELETE CASCADE |
| FK_54ee897f442cc7393a6d6165334 | FOREIGN KEY | FOREIGN KEY ("createdById") REFERENCES "user"(id) ON DELETE SET NULL |
| PK_280832ca3f1b43663cc0e25e77f | PRIMARY KEY | PRIMARY KEY (id) |
| agent_eval_run_cancelRequested_not_null | n | NOT NULL "cancelRequested" |
| agent_eval_run_createdAt_not_null | n | NOT NULL "createdAt" |
| agent_eval_run_datasetId_not_null | n | NOT NULL "datasetId" |
| agent_eval_run_id_not_null | n | NOT NULL id |
| agent_eval_run_status_not_null | n | NOT NULL status |
| agent_eval_run_updatedAt_not_null | n | NOT NULL "updatedAt" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_39ca447735d378e365f4227abf | CREATE INDEX "IDX_39ca447735d378e365f4227abf" ON public.agent_eval_run USING btree ("datasetId") |
| PK_280832ca3f1b43663cc0e25e77f | CREATE UNIQUE INDEX "PK_280832ca3f1b43663cc0e25e77f" ON public.agent_eval_run USING btree (id) |
## Relations
```mermaid
erDiagram
"public.agent_eval_run" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_eval_run" }o--|| "public.agent_eval_dataset" : "FOREIGN KEY (#quot;datasetId#quot;) REFERENCES agent_eval_dataset(id) ON DELETE CASCADE"
"public.agent_eval_result" }o--|| "public.agent_eval_run" : "FOREIGN KEY (#quot;runId#quot;) REFERENCES agent_eval_run(id) ON DELETE CASCADE"
"public.agent_eval_run" {
varchar_36_ agentVersionId
boolean cancelRequested
timestamp_3__with_time_zone completedAt
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ datasetId FK
varchar_255_ errorCode
json errorDetails
varchar_36_ id
json metrics
timestamp_3__with_time_zone runAt
varchar_255_ runningInstanceId
varchar status
timestamp_3__with_time_zone updatedAt
}
"public.user" {
timestamp_3__with_time_zone createdAt
boolean disabled
varchar_255_ email
varchar_32_ firstName
uuid id
date lastActiveAt
varchar_32_ lastName
boolean mfaEnabled
text mfaRecoveryCodes
text mfaSecret
varchar_255_ password
json personalizationAnswers
varchar_128_ roleSlug FK
json settings
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_dataset" {
varchar_36_ agentId FK
json columnMapping
timestamp_3__with_time_zone createdAt
uuid createdById FK
json datasetRef
varchar_32_ datasetSource
text description
varchar_36_ id
varchar_128_ name
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_result" {
timestamp_3__with_time_zone completedAt
timestamp_3__with_time_zone createdAt
varchar_255_ errorCode
json errorDetails
varchar_36_ id
json input
json metrics
json output
timestamp_3__with_time_zone runAt
varchar_36_ runId FK
integer runIndex
varchar_255_ sourceRowId
varchar status
json toolCalls
timestamp_3__with_time_zone updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -17,7 +17,6 @@
| startedAt | timestamp(3) with time zone | | true | | | |
| status | varchar(16) | | false | | | |
| stoppedAt | timestamp(3) with time zone | | true | | | |
| storedAt | varchar(2) | 'db'::character varying | false | | | |
| threadId | varchar(128) | | false | | [public.agent_execution_threads](public.agent_execution_threads.md) | |
| timeline | json | | true | | | |
| totalTokens | integer | | true | | | |
@ -30,14 +29,12 @@
| ---- | ---- | ---------- |
| CHK_agent_execution_hitlStatus | CHECK | CHECK ((("hitlStatus")::text = ANY ((ARRAY['suspended'::character varying, 'resumed'::character varying])::text[]))) |
| CHK_agent_execution_status | CHECK | CHECK (((status)::text = ANY ((ARRAY['success'::character varying, 'error'::character varying])::text[]))) |
| CHK_agent_execution_storedAt | CHECK | CHECK ((("storedAt")::text = ANY ((ARRAY['db'::character varying, 'fs'::character varying, 's3'::character varying, 'az'::character varying])::text[]))) |
| FK_add2432fb6034cc18b6af299dce | FOREIGN KEY | FOREIGN KEY ("threadId") REFERENCES agent_execution_threads(id) ON DELETE CASCADE |
| PK_ba438acc8532addc12d1ef17049 | PRIMARY KEY | PRIMARY KEY (id) |
| agent_execution_createdAt_not_null | n | NOT NULL "createdAt" |
| agent_execution_duration_not_null | n | NOT NULL duration |
| agent_execution_id_not_null | n | NOT NULL id |
| agent_execution_status_not_null | n | NOT NULL status |
| agent_execution_storedAt_not_null | n | NOT NULL "storedAt" |
| agent_execution_threadId_not_null | n | NOT NULL "threadId" |
| agent_execution_updatedAt_not_null | n | NOT NULL "updatedAt" |
@ -69,7 +66,6 @@ erDiagram
timestamp_3__with_time_zone startedAt
varchar_16_ status
timestamp_3__with_time_zone stoppedAt
varchar_2_ storedAt
varchar_128_ threadId FK
json timeline
integer totalTokens

View File

@ -82,7 +82,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations
@ -108,7 +107,6 @@ erDiagram
timestamp_3__with_time_zone startedAt
varchar_16_ status
timestamp_3__with_time_zone stoppedAt
varchar_2_ storedAt
varchar_128_ threadId FK
json timeline
integer totalTokens

View File

@ -56,7 +56,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -58,7 +58,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -51,7 +51,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -47,7 +47,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -5,9 +5,8 @@
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| activeVersionId | varchar(36) | | true | | [public.agent_history](public.agent_history.md) | |
| availableInMCP | boolean | false | false | | | Whether MCP clients granted agent scopes may operate on this agent |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| id | varchar(36) | | false | [public.agent_chat_subscriptions](public.agent_chat_subscriptions.md) [public.agent_checkpoints](public.agent_checkpoints.md) [public.agent_eval_dataset](public.agent_eval_dataset.md) [public.agent_execution_threads](public.agent_execution_threads.md) [public.agent_files](public.agent_files.md) [public.agent_history](public.agent_history.md) [public.agent_task_definition](public.agent_task_definition.md) [public.agent_task_run_lock](public.agent_task_run_lock.md) [public.agents_memory_entries](public.agents_memory_entries.md) [public.agents_memory_entry_cursors](public.agents_memory_entry_cursors.md) [public.agents_memory_entry_locks](public.agents_memory_entry_locks.md) [public.agents_memory_entry_sources](public.agents_memory_entry_sources.md) [public.agents_observation_cursors](public.agents_observation_cursors.md) [public.agents_observation_locks](public.agents_observation_locks.md) [public.agents_observations](public.agents_observations.md) | | |
| id | varchar(36) | | false | [public.agent_chat_subscriptions](public.agent_chat_subscriptions.md) [public.agent_checkpoints](public.agent_checkpoints.md) [public.agent_execution_threads](public.agent_execution_threads.md) [public.agent_files](public.agent_files.md) [public.agent_history](public.agent_history.md) [public.agent_task_definition](public.agent_task_definition.md) [public.agent_task_run_lock](public.agent_task_run_lock.md) [public.agents_memory_entries](public.agents_memory_entries.md) [public.agents_memory_entry_cursors](public.agents_memory_entry_cursors.md) [public.agents_memory_entry_locks](public.agents_memory_entry_locks.md) [public.agents_memory_entry_sources](public.agents_memory_entry_sources.md) [public.agents_observation_cursors](public.agents_observation_cursors.md) [public.agents_observation_locks](public.agents_observation_locks.md) [public.agents_observations](public.agents_observations.md) | | |
| integrations | json | '[]'::json | false | | | |
| name | varchar(128) | | false | | | |
| projectId | varchar(255) | | false | | [public.project](public.project.md) | |
@ -24,7 +23,6 @@
| FK_940597dfe9753375309ce6aeea0 | FOREIGN KEY | FOREIGN KEY ("activeVersionId") REFERENCES agent_history("versionId") ON DELETE SET NULL |
| FK_a30d560207c4071d98aa03c179c | FOREIGN KEY | FOREIGN KEY ("projectId") REFERENCES project(id) ON DELETE CASCADE |
| PK_9c653f28ae19c5884d5baf6a1d9 | PRIMARY KEY | PRIMARY KEY (id) |
| agents_availableInMCP_not_null | n | NOT NULL "availableInMCP" |
| agents_createdAt_not_null | n | NOT NULL "createdAt" |
| agents_id_not_null | n | NOT NULL id |
| agents_integrations_not_null | n | NOT NULL integrations |
@ -50,7 +48,6 @@ erDiagram
"public.agents" }o--o| "public.agent_history" : "FOREIGN KEY (#quot;activeVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE SET NULL"
"public.agent_chat_subscriptions" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_checkpoints" }o--o| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_eval_dataset" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_execution_threads" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_files" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_history" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
@ -67,7 +64,6 @@ erDiagram
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations
@ -106,18 +102,6 @@ erDiagram
text state
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_dataset" {
varchar_36_ agentId FK
json columnMapping
timestamp_3__with_time_zone createdAt
uuid createdById FK
json datasetRef
varchar_32_ datasetSource
text description
varchar_36_ id
varchar_128_ name
timestamp_3__with_time_zone updatedAt
}
"public.agent_execution_threads" {
varchar_36_ agentId FK
varchar_255_ agentName

View File

@ -74,7 +74,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -50,7 +50,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -50,7 +50,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -66,7 +66,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -50,7 +50,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -54,7 +54,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -73,7 +73,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations

View File

@ -80,7 +80,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
"public.chat_hub_agent_tools" {
uuid agentId FK

View File

@ -97,7 +97,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
"public.chat_hub_messages" {
uuid agentId FK

View File

@ -57,7 +57,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
```

View File

@ -6,7 +6,7 @@
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| data | text | | false | | | |
| id | varchar(36) | | false | [public.chat_hub_agents](public.chat_hub_agents.md) [public.chat_hub_sessions](public.chat_hub_sessions.md) [public.credential_dependency](public.credential_dependency.md) [public.dynamic_credential_entry](public.dynamic_credential_entry.md) [public.dynamic_credential_user_entry](public.dynamic_credential_user_entry.md) [public.instance_ai_mcp_registry_connections](public.instance_ai_mcp_registry_connections.md) [public.instance_credential_assignment](public.instance_credential_assignment.md) [public.shared_credentials](public.shared_credentials.md) | | |
| id | varchar(36) | | false | [public.chat_hub_agents](public.chat_hub_agents.md) [public.chat_hub_sessions](public.chat_hub_sessions.md) [public.credential_dependency](public.credential_dependency.md) [public.dynamic_credential_entry](public.dynamic_credential_entry.md) [public.dynamic_credential_user_entry](public.dynamic_credential_user_entry.md) [public.instance_ai_mcp_registry_connections](public.instance_ai_mcp_registry_connections.md) [public.shared_credentials](public.shared_credentials.md) | | |
| isGlobal | boolean | false | false | | | |
| isManaged | boolean | false | false | | | |
| isResolvable | boolean | false | false | | | |
@ -15,13 +15,11 @@
| resolverId | varchar(16) | | true | | [public.dynamic_credential_resolver](public.dynamic_credential_resolver.md) | |
| type | varchar(128) | | false | | | |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| usageScope | varchar(16) | 'project'::character varying | false | | | Where the credential may be consumed: a project-owned feature or an instance-level feature |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_credentials_entity_usageScope | CHECK | CHECK ((("usageScope")::text = ANY ((ARRAY['project'::character varying, 'instance'::character varying])::text[]))) |
| credentials_entity_createdAt_not_null | n | NOT NULL "createdAt" |
| credentials_entity_data_not_null | n | NOT NULL data |
| credentials_entity_id_not_null1 | n | NOT NULL id |
@ -34,7 +32,6 @@
| credentials_entity_resolverId_foreign | FOREIGN KEY | FOREIGN KEY ("resolverId") REFERENCES dynamic_credential_resolver(id) ON DELETE SET NULL |
| credentials_entity_type_not_null | n | NOT NULL type |
| credentials_entity_updatedAt_not_null | n | NOT NULL "updatedAt" |
| credentials_entity_usageScope_not_null | n | NOT NULL "usageScope" |
## Indexes
@ -56,7 +53,6 @@ erDiagram
"public.dynamic_credential_entry" }o--|| "public.credentials_entity" : "FOREIGN KEY (credential_id) REFERENCES credentials_entity(id) ON DELETE CASCADE"
"public.dynamic_credential_user_entry" }o--|| "public.credentials_entity" : "FOREIGN KEY (#quot;credentialId#quot;) REFERENCES credentials_entity(id) ON DELETE CASCADE"
"public.instance_ai_mcp_registry_connections" }o--|| "public.credentials_entity" : "FOREIGN KEY (#quot;credentialId#quot;) REFERENCES credentials_entity(id) ON DELETE CASCADE"
"public.instance_credential_assignment" }o--|| "public.credentials_entity" : "FOREIGN KEY (#quot;credentialId#quot;) REFERENCES credentials_entity(id) ON DELETE RESTRICT"
"public.shared_credentials" }o--|| "public.credentials_entity" : "FOREIGN KEY (#quot;credentialsId#quot;) REFERENCES credentials_entity(id) ON DELETE CASCADE"
"public.credentials_entity" }o--o| "public.dynamic_credential_resolver" : "FOREIGN KEY (#quot;resolverId#quot;) REFERENCES dynamic_credential_resolver(id) ON DELETE SET NULL"
@ -72,7 +68,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
"public.chat_hub_agents" {
timestamp_3__with_time_zone createdAt
@ -136,12 +131,6 @@ erDiagram
timestamp_3__with_time_zone updatedAt
uuid userId FK
}
"public.instance_credential_assignment" {
timestamp_3__with_time_zone createdAt
varchar_36_ credentialId FK
varchar_128_ credentialUseId
timestamp_3__with_time_zone updatedAt
}
"public.shared_credentials" {
timestamp_3__with_time_zone createdAt
varchar_36_ credentialsId FK

View File

@ -61,7 +61,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
"public.dynamic_credential_resolver" {
text config

View File

@ -59,7 +59,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
"public.dynamic_credential_entry" {
timestamp_3__with_time_zone createdAt

View File

@ -63,7 +63,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
"public.dynamic_credential_resolver" {
text config

View File

@ -4,7 +4,7 @@
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| latestVersion | double precision | 1 | false | | | |
| latestVersion | integer | 1 | false | | | |
| name | varchar(200) | | false | | | |
| package | varchar(241) | | false | | [public.installed_packages](public.installed_packages.md) | |
| type | varchar(200) | | false | | | |
@ -34,7 +34,7 @@ erDiagram
"public.installed_nodes" }o--|| "public.installed_packages" : "FOREIGN KEY (package) REFERENCES installed_packages(#quot;packageName#quot;) ON UPDATE CASCADE ON DELETE CASCADE"
"public.installed_nodes" {
double_precision latestVersion
integer latestVersion
varchar_200_ name
varchar_241_ package FK
varchar_200_ type

View File

@ -43,7 +43,7 @@ erDiagram
timestamp_3__with_time_zone updatedAt
}
"public.installed_nodes" {
double_precision latestVersion
integer latestVersion
varchar_200_ name
varchar_241_ package FK
varchar_200_ type

View File

@ -6,7 +6,6 @@
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| expiredAt | timestamp(3) with time zone | | true | | | Soft-delete timestamp: null means live; non-null marks the row as a tombstone. |
| hostRunId | varchar(64) | | true | | | Host (Instance AI) run id; distinct from the agent-SDK runId parsed from the checkpoint key. |
| key | varchar(255) | | false | [public.instance_ai_pending_confirmations](public.instance_ai_pending_confirmations.md) | | Opaque checkpoint key from the agent runtime. |
| resourceId | varchar(255) | | true | | | Resource ID recorded by the agent runtime. |
| runId | varchar(255) | | true | | | Run ID parsed from the checkpoint key when available. |
@ -46,7 +45,6 @@ erDiagram
"public.instance_ai_checkpoints" {
timestamp_3__with_time_zone createdAt
timestamp_3__with_time_zone expiredAt
varchar_64_ hostRunId
varchar_255_ key
varchar_255_ resourceId
varchar_255_ runId

View File

@ -1,65 +0,0 @@
# public.instance_ai_events
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| payload | text | | false | | | JSON of the canonical InstanceAiEvent |
| runId | varchar(64) | | false | | | Run that emitted the event — opaque ID from the agent runtime |
| seq | integer | | false | | | Per-thread monotonic sequence — the SSE replay cursor |
| threadId | uuid | | false | | [public.instance_ai_threads](public.instance_ai_threads.md) | |
| type | varchar(64) | | false | | | Event type discriminator, duplicated out of the payload |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| FK_35909c5576a4a6c1d6a6fb71caa | FOREIGN KEY | FOREIGN KEY ("threadId") REFERENCES instance_ai_threads(id) ON DELETE CASCADE |
| PK_12489cd6197feeac2089acc7ef6 | PRIMARY KEY | PRIMARY KEY ("threadId", seq) |
| instance_ai_events_createdAt_not_null | n | NOT NULL "createdAt" |
| instance_ai_events_payload_not_null | n | NOT NULL payload |
| instance_ai_events_runId_not_null | n | NOT NULL "runId" |
| instance_ai_events_seq_not_null | n | NOT NULL seq |
| instance_ai_events_threadId_not_null | n | NOT NULL "threadId" |
| instance_ai_events_type_not_null | n | NOT NULL type |
| instance_ai_events_updatedAt_not_null | n | NOT NULL "updatedAt" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_32cdd799675715fb1d2a8683e9 | CREATE INDEX "IDX_32cdd799675715fb1d2a8683e9" ON public.instance_ai_events USING btree ("threadId", "runId") |
| PK_12489cd6197feeac2089acc7ef6 | CREATE UNIQUE INDEX "PK_12489cd6197feeac2089acc7ef6" ON public.instance_ai_events USING btree ("threadId", seq) |
## Relations
```mermaid
erDiagram
"public.instance_ai_events" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_events" {
timestamp_3__with_time_zone createdAt
text payload
varchar_64_ runId
integer seq
uuid threadId FK
varchar_64_ type
timestamp_3__with_time_zone updatedAt
}
"public.instance_ai_threads" {
timestamp_3__with_time_zone createdAt
uuid id
json metadata
varchar_36_ projectId FK
varchar_255_ resourceId
text title
timestamp_3__with_time_zone updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -64,7 +64,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
"public.mcp_registry_server" {
timestamp_3__with_time_zone createdAt

View File

@ -70,7 +70,6 @@ erDiagram
"public.instance_ai_checkpoints" {
timestamp_3__with_time_zone createdAt
timestamp_3__with_time_zone expiredAt
varchar_64_ hostRunId
varchar_255_ key
varchar_255_ resourceId
varchar_255_ runId

View File

@ -5,7 +5,7 @@
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| id | uuid | | false | [public.ai_builder_temporary_workflow](public.ai_builder_temporary_workflow.md) [public.instance_ai_checkpoints](public.instance_ai_checkpoints.md) [public.instance_ai_events](public.instance_ai_events.md) [public.instance_ai_iteration_logs](public.instance_ai_iteration_logs.md) [public.instance_ai_messages](public.instance_ai_messages.md) [public.instance_ai_observation_cursors](public.instance_ai_observation_cursors.md) [public.instance_ai_observation_locks](public.instance_ai_observation_locks.md) [public.instance_ai_observational_memory](public.instance_ai_observational_memory.md) [public.instance_ai_observations](public.instance_ai_observations.md) [public.instance_ai_pending_confirmations](public.instance_ai_pending_confirmations.md) [public.instance_ai_run_snapshots](public.instance_ai_run_snapshots.md) [public.instance_ai_thread_grants](public.instance_ai_thread_grants.md) | | |
| id | uuid | | false | [public.ai_builder_temporary_workflow](public.ai_builder_temporary_workflow.md) [public.instance_ai_checkpoints](public.instance_ai_checkpoints.md) [public.instance_ai_iteration_logs](public.instance_ai_iteration_logs.md) [public.instance_ai_messages](public.instance_ai_messages.md) [public.instance_ai_observation_cursors](public.instance_ai_observation_cursors.md) [public.instance_ai_observation_locks](public.instance_ai_observation_locks.md) [public.instance_ai_observational_memory](public.instance_ai_observational_memory.md) [public.instance_ai_observations](public.instance_ai_observations.md) [public.instance_ai_pending_confirmations](public.instance_ai_pending_confirmations.md) [public.instance_ai_run_snapshots](public.instance_ai_run_snapshots.md) [public.instance_ai_thread_grants](public.instance_ai_thread_grants.md) | | |
| metadata | json | | true | | | |
| projectId | varchar(36) | | false | | [public.project](public.project.md) | Project this thread is scoped to |
| resourceId | varchar(255) | | false | | | |
@ -40,7 +40,6 @@ erDiagram
"public.ai_builder_temporary_workflow" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_checkpoints" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_events" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_iteration_logs" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_messages" }o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
"public.instance_ai_observation_cursors" |o--|| "public.instance_ai_threads" : "FOREIGN KEY (#quot;observationScopeId#quot;) REFERENCES instance_ai_threads(id) ON DELETE CASCADE"
@ -70,7 +69,6 @@ erDiagram
"public.instance_ai_checkpoints" {
timestamp_3__with_time_zone createdAt
timestamp_3__with_time_zone expiredAt
varchar_64_ hostRunId
varchar_255_ key
varchar_255_ resourceId
varchar_255_ runId
@ -78,15 +76,6 @@ erDiagram
uuid threadId FK
timestamp_3__with_time_zone updatedAt
}
"public.instance_ai_events" {
timestamp_3__with_time_zone createdAt
text payload
varchar_64_ runId
integer seq
uuid threadId FK
varchar_64_ type
timestamp_3__with_time_zone updatedAt
}
"public.instance_ai_iteration_logs" {
timestamp_3__with_time_zone createdAt
text entry

View File

@ -1,61 +0,0 @@
# public.instance_credential_assignment
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| credentialId | varchar(36) | | false | | [public.credentials_entity](public.credentials_entity.md) | Credential assigned to the registered use; repositories enforce instance usage scope |
| credentialUseId | varchar(128) | | false | | | Stable credential use registered with the instance credential broker |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| FK_instance_credential_assignment_credential | FOREIGN KEY | FOREIGN KEY ("credentialId") REFERENCES credentials_entity(id) ON DELETE RESTRICT |
| PK_984b0a98726485c9a330cde6b2f | PRIMARY KEY | PRIMARY KEY ("credentialUseId") |
| instance_credential_assignment_createdAt_not_null | n | NOT NULL "createdAt" |
| instance_credential_assignment_credentialId_not_null | n | NOT NULL "credentialId" |
| instance_credential_assignment_credentialUseId_not_null | n | NOT NULL "credentialUseId" |
| instance_credential_assignment_updatedAt_not_null | n | NOT NULL "updatedAt" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_9626b8dc1bee96a86a3ee09d73 | CREATE INDEX "IDX_9626b8dc1bee96a86a3ee09d73" ON public.instance_credential_assignment USING btree ("credentialId") |
| PK_984b0a98726485c9a330cde6b2f | CREATE UNIQUE INDEX "PK_984b0a98726485c9a330cde6b2f" ON public.instance_credential_assignment USING btree ("credentialUseId") |
## Relations
```mermaid
erDiagram
"public.instance_credential_assignment" }o--|| "public.credentials_entity" : "FOREIGN KEY (#quot;credentialId#quot;) REFERENCES credentials_entity(id) ON DELETE RESTRICT"
"public.instance_credential_assignment" {
timestamp_3__with_time_zone createdAt
varchar_36_ credentialId FK
varchar_128_ credentialUseId
timestamp_3__with_time_zone updatedAt
}
"public.credentials_entity" {
timestamp_3__with_time_zone createdAt
text data
varchar_36_ id
boolean isGlobal
boolean isManaged
boolean isResolvable
varchar_128_ name
boolean resolvableAllowFallback
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -87,7 +87,6 @@ erDiagram
varchar clientId FK
bigint grantedAt
integer id
json scope
uuid userId FK
}
```

View File

@ -7,7 +7,6 @@
| clientId | varchar | | false | | [public.oauth_clients](public.oauth_clients.md) | |
| grantedAt | bigint | | false | | | Unix timestamp in milliseconds |
| id | integer | | false | | | |
| scope | json | | false | | | OAuth scopes granted on the consent screen |
| userId | uuid | | false | | [public.user](public.user.md) | |
## Constraints
@ -21,7 +20,6 @@
| oauth_user_consents_clientId_not_null | n | NOT NULL "clientId" |
| oauth_user_consents_grantedAt_not_null | n | NOT NULL "grantedAt" |
| oauth_user_consents_id_not_null | n | NOT NULL id |
| oauth_user_consents_scope_not_null | n | NOT NULL scope |
| oauth_user_consents_userId_not_null | n | NOT NULL "userId" |
## Indexes
@ -43,7 +41,6 @@ erDiagram
varchar clientId FK
bigint grantedAt
integer id
json scope
uuid userId FK
}
"public.oauth_clients" {

View File

@ -9,7 +9,7 @@
| customTelemetryTags | json | '[]'::json | false | | | |
| description | varchar(512) | | true | | | |
| icon | json | | true | | | |
| id | varchar(36) | | false | [public.agent_execution_threads](public.agent_execution_threads.md) [public.agents](public.agents.md) [public.data_table](public.data_table.md) [public.folder](public.folder.md) [public.insights_metadata](public.insights_metadata.md) [public.instance_ai_threads](public.instance_ai_threads.md) [public.project_relation](public.project_relation.md) [public.project_secrets_provider_access](public.project_secrets_provider_access.md) [public.role_mapping_rule_project](public.role_mapping_rule_project.md) [public.shared_credentials](public.shared_credentials.md) [public.shared_workflow](public.shared_workflow.md) [public.variables](public.variables.md) [public.workflow_review_request](public.workflow_review_request.md) | | |
| id | varchar(36) | | false | [public.agent_execution_threads](public.agent_execution_threads.md) [public.agents](public.agents.md) [public.data_table](public.data_table.md) [public.folder](public.folder.md) [public.insights_metadata](public.insights_metadata.md) [public.instance_ai_threads](public.instance_ai_threads.md) [public.project_relation](public.project_relation.md) [public.project_secrets_provider_access](public.project_secrets_provider_access.md) [public.role_mapping_rule_project](public.role_mapping_rule_project.md) [public.shared_credentials](public.shared_credentials.md) [public.shared_workflow](public.shared_workflow.md) [public.variables](public.variables.md) | | |
| name | varchar(255) | | false | | | |
| type | varchar(36) | | false | | | |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
@ -51,7 +51,6 @@ erDiagram
"public.shared_credentials" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.shared_workflow" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.variables" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.workflow_review_request" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.project" {
timestamp_3__with_time_zone createdAt
@ -102,7 +101,6 @@ erDiagram
}
"public.agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
timestamp_3__with_time_zone createdAt
varchar_36_ id
json integrations
@ -184,20 +182,6 @@ erDiagram
varchar_50_ type
text value
}
"public.workflow_review_request" {
timestamp_3__with_time_zone approvedAt
uuid closedById FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_50_ decision
text description
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ state
varchar_255_ title
timestamp_3__with_time_zone updatedAt
uuid updatedById FK
}
```
---

View File

@ -89,7 +89,6 @@ erDiagram
integer attempts
varchar_255_ claimedBy
timestamp_3__with_time_zone createdAt
timestamp_3__with_time_zone dispatchedAt
text errorMessage
timestamp_3__with_time_zone finishedAt
bigint id

View File

@ -7,7 +7,6 @@
| attempts | integer | 0 | false | | | Execution attempts started so far; compared against maxAttempts. |
| claimedBy | varchar(255) | | true | | | Id of the instance currently holding the lease; NULL when unclaimed. |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| dispatchedAt | timestamp(3) with time zone | | true | | | When the current attempt handed off its effect; NULL until then. Splits dispatch-attempted (startedAt) from effect-happened, so the reaper completes a dispatched occurrence rather than redelivering it. |
| errorMessage | text | | true | | | Failure detail from the last attempt. |
| finishedAt | timestamp(3) with time zone | | true | | | When the occurrence reached a terminal state; drives retention pruning. |
| id | bigint | | false | | | |
@ -63,7 +62,6 @@ erDiagram
integer attempts
varchar_255_ claimedBy
timestamp_3__with_time_zone createdAt
timestamp_3__with_time_zone dispatchedAt
text errorMessage
timestamp_3__with_time_zone finishedAt
bigint id

View File

@ -56,7 +56,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_128_ type
timestamp_3__with_time_zone updatedAt
varchar_16_ usageScope
}
"public.project" {
timestamp_3__with_time_zone createdAt

View File

@ -8,7 +8,7 @@
| disabled | boolean | false | false | | | |
| email | varchar(255) | | true | | | |
| firstName | varchar(32) | | true | | | |
| id | uuid | gen_random_uuid() | false | [public.agent_eval_dataset](public.agent_eval_dataset.md) [public.agent_eval_rating](public.agent_eval_rating.md) [public.agent_eval_run](public.agent_eval_run.md) [public.agent_history](public.agent_history.md) [public.auth_identity](public.auth_identity.md) [public.chat_hub_agents](public.chat_hub_agents.md) [public.chat_hub_sessions](public.chat_hub_sessions.md) [public.chat_hub_tools](public.chat_hub_tools.md) [public.dynamic_credential_user_entry](public.dynamic_credential_user_entry.md) [public.evaluation_collection](public.evaluation_collection.md) [public.instance_ai_mcp_registry_connections](public.instance_ai_mcp_registry_connections.md) [public.instance_ai_pending_confirmations](public.instance_ai_pending_confirmations.md) [public.instance_ai_thread_grants](public.instance_ai_thread_grants.md) [public.oauth_access_tokens](public.oauth_access_tokens.md) [public.oauth_authorization_codes](public.oauth_authorization_codes.md) [public.oauth_refresh_tokens](public.oauth_refresh_tokens.md) [public.oauth_user_consents](public.oauth_user_consents.md) [public.project](public.project.md) [public.project_relation](public.project_relation.md) [public.user_api_keys](public.user_api_keys.md) [public.user_favorites](public.user_favorites.md) [public.workflow_builder_session](public.workflow_builder_session.md) [public.workflow_publish_history](public.workflow_publish_history.md) [public.workflow_review_request](public.workflow_review_request.md) [public.workflow_review_request_authors](public.workflow_review_request_authors.md) [public.workflow_review_request_reviewers](public.workflow_review_request_reviewers.md) | | |
| id | uuid | gen_random_uuid() | false | [public.agent_history](public.agent_history.md) [public.auth_identity](public.auth_identity.md) [public.chat_hub_agents](public.chat_hub_agents.md) [public.chat_hub_sessions](public.chat_hub_sessions.md) [public.chat_hub_tools](public.chat_hub_tools.md) [public.dynamic_credential_user_entry](public.dynamic_credential_user_entry.md) [public.evaluation_collection](public.evaluation_collection.md) [public.instance_ai_mcp_registry_connections](public.instance_ai_mcp_registry_connections.md) [public.instance_ai_pending_confirmations](public.instance_ai_pending_confirmations.md) [public.instance_ai_thread_grants](public.instance_ai_thread_grants.md) [public.oauth_access_tokens](public.oauth_access_tokens.md) [public.oauth_authorization_codes](public.oauth_authorization_codes.md) [public.oauth_refresh_tokens](public.oauth_refresh_tokens.md) [public.oauth_user_consents](public.oauth_user_consents.md) [public.project](public.project.md) [public.project_relation](public.project_relation.md) [public.user_api_keys](public.user_api_keys.md) [public.user_favorites](public.user_favorites.md) [public.workflow_builder_session](public.workflow_builder_session.md) [public.workflow_publish_history](public.workflow_publish_history.md) | | |
| lastActiveAt | date | | true | | | |
| lastName | varchar(32) | | true | | | |
| mfaEnabled | boolean | false | false | | | |
@ -47,9 +47,6 @@
```mermaid
erDiagram
"public.agent_eval_dataset" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_eval_rating" }o--o| "public.user" : "FOREIGN KEY (#quot;ratedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_eval_run" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_history" }o--o| "public.user" : "FOREIGN KEY (#quot;publishedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.auth_identity" }o--o| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id)"
"public.chat_hub_agents" }o--|| "public.user" : "FOREIGN KEY (#quot;ownerId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
@ -70,11 +67,6 @@ erDiagram
"public.user_favorites" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.workflow_builder_session" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.workflow_publish_history" }o--o| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request" }o--o| "public.user" : "FOREIGN KEY (#quot;updatedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request" }o--o| "public.user" : "FOREIGN KEY (#quot;closedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request_authors" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.workflow_review_request_reviewers" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.user" }o--|| "public.role" : "FOREIGN KEY (#quot;roleSlug#quot;) REFERENCES role(slug)"
"public.user" {
@ -94,44 +86,6 @@ erDiagram
json settings
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_dataset" {
varchar_36_ agentId FK
json columnMapping
timestamp_3__with_time_zone createdAt
uuid createdById FK
json datasetRef
varchar_32_ datasetSource
text description
varchar_36_ id
varchar_128_ name
timestamp_3__with_time_zone updatedAt
}
"public.agent_eval_rating" {
text comment
json correction
timestamp_3__with_time_zone createdAt
varchar_36_ id
uuid ratedById FK
varchar_36_ resultId FK
timestamp_3__with_time_zone updatedAt
varchar_8_ vote
}
"public.agent_eval_run" {
varchar_36_ agentVersionId
boolean cancelRequested
timestamp_3__with_time_zone completedAt
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ datasetId FK
varchar_255_ errorCode
json errorDetails
varchar_36_ id
json metrics
timestamp_3__with_time_zone runAt
varchar_255_ runningInstanceId
varchar status
timestamp_3__with_time_zone updatedAt
}
"public.agent_history" {
varchar_36_ agentId FK
varchar_255_ author
@ -273,7 +227,6 @@ erDiagram
varchar clientId FK
bigint grantedAt
integer id
json scope
uuid userId FK
}
"public.project" {
@ -330,28 +283,6 @@ erDiagram
varchar_36_ versionId FK
varchar_36_ workflowId FK
}
"public.workflow_review_request" {
timestamp_3__with_time_zone approvedAt
uuid closedById FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_50_ decision
text description
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ state
varchar_255_ title
timestamp_3__with_time_zone updatedAt
uuid updatedById FK
}
"public.workflow_review_request_authors" {
uuid userId FK
varchar_36_ workflowReviewRequestId FK
}
"public.workflow_review_request_reviewers" {
uuid userId FK
varchar_36_ workflowReviewRequestId FK
}
"public.role" {
timestamp_3__with_time_zone createdAt
text description

View File

@ -9,7 +9,7 @@
| connections | json | | false | | | |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| description | text | | true | | | |
| id | varchar(36) | | false | [public.ai_builder_temporary_workflow](public.ai_builder_temporary_workflow.md) [public.chat_hub_messages](public.chat_hub_messages.md) [public.chat_hub_sessions](public.chat_hub_sessions.md) [public.evaluation_collection](public.evaluation_collection.md) [public.evaluation_config](public.evaluation_config.md) [public.execution_entity](public.execution_entity.md) [public.insights_metadata](public.insights_metadata.md) [public.processed_data](public.processed_data.md) [public.shared_workflow](public.shared_workflow.md) [public.test_run](public.test_run.md) [public.webhook_entity](public.webhook_entity.md) [public.workflow_builder_session](public.workflow_builder_session.md) [public.workflow_dependency](public.workflow_dependency.md) [public.workflow_history](public.workflow_history.md) [public.workflow_publication_trigger_status](public.workflow_publication_trigger_status.md) [public.workflow_publish_history](public.workflow_publish_history.md) [public.workflow_published_version](public.workflow_published_version.md) [public.workflow_review_request_workflow](public.workflow_review_request_workflow.md) [public.workflows_tags](public.workflows_tags.md) | | |
| id | varchar(36) | | false | [public.ai_builder_temporary_workflow](public.ai_builder_temporary_workflow.md) [public.chat_hub_messages](public.chat_hub_messages.md) [public.chat_hub_sessions](public.chat_hub_sessions.md) [public.evaluation_collection](public.evaluation_collection.md) [public.evaluation_config](public.evaluation_config.md) [public.execution_entity](public.execution_entity.md) [public.insights_metadata](public.insights_metadata.md) [public.processed_data](public.processed_data.md) [public.shared_workflow](public.shared_workflow.md) [public.test_run](public.test_run.md) [public.webhook_entity](public.webhook_entity.md) [public.workflow_builder_session](public.workflow_builder_session.md) [public.workflow_dependency](public.workflow_dependency.md) [public.workflow_history](public.workflow_history.md) [public.workflow_publication_trigger_status](public.workflow_publication_trigger_status.md) [public.workflow_publish_history](public.workflow_publish_history.md) [public.workflow_published_version](public.workflow_published_version.md) [public.workflows_tags](public.workflows_tags.md) | | |
| isArchived | boolean | false | false | | | |
| meta | json | | true | | | |
| name | varchar(128) | | false | | | |
@ -83,7 +83,6 @@ erDiagram
"public.workflow_publication_trigger_status" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.workflow_publish_history" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.workflow_published_version" |o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE RESTRICT"
"public.workflow_review_request_workflow" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.workflows_tags" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.workflow_entity" }o--o| "public.folder" : "FOREIGN KEY (#quot;parentFolderId#quot;) REFERENCES folder(id) ON DELETE CASCADE"
@ -301,12 +300,6 @@ erDiagram
timestamp_3__with_time_zone updatedAt
varchar_36_ workflowId FK
}
"public.workflow_review_request_workflow" {
varchar_36_ id
varchar_36_ workflowId FK
varchar_36_ workflowReviewRequestId FK
varchar_36_ workflowVersionId FK
}
"public.workflows_tags" {
varchar_36_ tagId FK
varchar_36_ workflowId FK

View File

@ -13,7 +13,7 @@
| nodeGroups | json | '[]'::json | false | | | |
| nodes | json | | false | | | |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| versionId | varchar(36) | | false | [public.workflow_entity](public.workflow_entity.md) [public.workflow_publication_trigger_status](public.workflow_publication_trigger_status.md) [public.workflow_publish_history](public.workflow_publish_history.md) [public.workflow_published_version](public.workflow_published_version.md) [public.workflow_review_request_workflow](public.workflow_review_request_workflow.md) | | |
| versionId | varchar(36) | | false | [public.workflow_entity](public.workflow_entity.md) [public.workflow_publication_trigger_status](public.workflow_publication_trigger_status.md) [public.workflow_publish_history](public.workflow_publish_history.md) [public.workflow_published_version](public.workflow_published_version.md) | | |
| workflowId | varchar(36) | | false | | [public.workflow_entity](public.workflow_entity.md) | |
## Constraints
@ -48,7 +48,6 @@ erDiagram
"public.workflow_publication_trigger_status" }o--|| "public.workflow_history" : "FOREIGN KEY (#quot;versionId#quot;) REFERENCES workflow_history(#quot;versionId#quot;) ON DELETE CASCADE"
"public.workflow_publish_history" }o--o| "public.workflow_history" : "FOREIGN KEY (#quot;versionId#quot;) REFERENCES workflow_history(#quot;versionId#quot;) ON DELETE SET NULL"
"public.workflow_published_version" }o--|| "public.workflow_history" : "FOREIGN KEY (#quot;publishedVersionId#quot;) REFERENCES workflow_history(#quot;versionId#quot;) ON DELETE RESTRICT"
"public.workflow_review_request_workflow" }o--o| "public.workflow_history" : "FOREIGN KEY (#quot;workflowVersionId#quot;) REFERENCES workflow_history(#quot;versionId#quot;) ON DELETE SET NULL"
"public.workflow_history" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.workflow_history" {
@ -110,12 +109,6 @@ erDiagram
timestamp_3__with_time_zone updatedAt
varchar_36_ workflowId FK
}
"public.workflow_review_request_workflow" {
varchar_36_ id
varchar_36_ workflowId FK
varchar_36_ workflowReviewRequestId FK
varchar_36_ workflowVersionId FK
}
```
---

View File

@ -1,119 +0,0 @@
# public.workflow_review_request
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| approvedAt | timestamp(3) with time zone | | true | | | |
| closedById | uuid | | true | | [public.user](public.user.md) | |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| createdById | uuid | | true | | [public.user](public.user.md) | |
| decision | varchar(50) | 'pending'::character varying | false | | | Latest review outcome while the request is open |
| description | text | | true | | | |
| id | varchar(36) | | false | [public.workflow_review_request_authors](public.workflow_review_request_authors.md) [public.workflow_review_request_reviewers](public.workflow_review_request_reviewers.md) [public.workflow_review_request_workflow](public.workflow_review_request_workflow.md) | | |
| projectId | varchar(36) | | false | | [public.project](public.project.md) | |
| state | varchar(16) | 'open'::character varying | false | | | Review lifecycle: open reviews accept actions; closed reviews are done |
| title | varchar(255) | | false | | | |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| updatedById | uuid | | true | | [public.user](public.user.md) | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_workflow_review_request_decision | CHECK | CHECK (((decision)::text = ANY ((ARRAY['pending'::character varying, 'changes_requested'::character varying, 'approved'::character varying])::text[]))) |
| CHK_workflow_review_request_state | CHECK | CHECK (((state)::text = ANY ((ARRAY['open'::character varying, 'closed'::character varying])::text[]))) |
| FK_21d5f5a831d2e38960030bb4f60 | FOREIGN KEY | FOREIGN KEY ("createdById") REFERENCES "user"(id) ON DELETE SET NULL |
| FK_2817c3a0245197b498818c447cb | FOREIGN KEY | FOREIGN KEY ("updatedById") REFERENCES "user"(id) ON DELETE SET NULL |
| FK_c218d1df94adc3b169dee3cc06c | FOREIGN KEY | FOREIGN KEY ("projectId") REFERENCES project(id) ON DELETE CASCADE |
| FK_d53ef208e6055f328dd7b897e51 | FOREIGN KEY | FOREIGN KEY ("closedById") REFERENCES "user"(id) ON DELETE SET NULL |
| PK_ae17b90023bcd05e003cd8f64dc | PRIMARY KEY | PRIMARY KEY (id) |
| workflow_review_request_createdAt_not_null | n | NOT NULL "createdAt" |
| workflow_review_request_decision_not_null | n | NOT NULL decision |
| workflow_review_request_id_not_null | n | NOT NULL id |
| workflow_review_request_projectId_not_null | n | NOT NULL "projectId" |
| workflow_review_request_state_not_null | n | NOT NULL state |
| workflow_review_request_title_not_null | n | NOT NULL title |
| workflow_review_request_updatedAt_not_null | n | NOT NULL "updatedAt" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_workflow_review_request_project_state | CREATE INDEX "IDX_workflow_review_request_project_state" ON public.workflow_review_request USING btree ("projectId", state) |
| PK_ae17b90023bcd05e003cd8f64dc | CREATE UNIQUE INDEX "PK_ae17b90023bcd05e003cd8f64dc" ON public.workflow_review_request USING btree (id) |
## Relations
```mermaid
erDiagram
"public.workflow_review_request" }o--o| "public.user" : "FOREIGN KEY (#quot;closedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request_authors" }o--|| "public.workflow_review_request" : "FOREIGN KEY (#quot;workflowReviewRequestId#quot;) REFERENCES workflow_review_request(id) ON DELETE CASCADE"
"public.workflow_review_request_reviewers" }o--|| "public.workflow_review_request" : "FOREIGN KEY (#quot;workflowReviewRequestId#quot;) REFERENCES workflow_review_request(id) ON DELETE CASCADE"
"public.workflow_review_request_workflow" }o--|| "public.workflow_review_request" : "FOREIGN KEY (#quot;workflowReviewRequestId#quot;) REFERENCES workflow_review_request(id) ON DELETE CASCADE"
"public.workflow_review_request" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.workflow_review_request" }o--o| "public.user" : "FOREIGN KEY (#quot;updatedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.workflow_review_request" {
timestamp_3__with_time_zone approvedAt
uuid closedById FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_50_ decision
text description
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ state
varchar_255_ title
timestamp_3__with_time_zone updatedAt
uuid updatedById FK
}
"public.user" {
timestamp_3__with_time_zone createdAt
boolean disabled
varchar_255_ email
varchar_32_ firstName
uuid id
date lastActiveAt
varchar_32_ lastName
boolean mfaEnabled
text mfaRecoveryCodes
text mfaSecret
varchar_255_ password
json personalizationAnswers
varchar_128_ roleSlug FK
json settings
timestamp_3__with_time_zone updatedAt
}
"public.workflow_review_request_authors" {
uuid userId FK
varchar_36_ workflowReviewRequestId FK
}
"public.workflow_review_request_reviewers" {
uuid userId FK
varchar_36_ workflowReviewRequestId FK
}
"public.workflow_review_request_workflow" {
varchar_36_ id
varchar_36_ workflowId FK
varchar_36_ workflowReviewRequestId FK
varchar_36_ workflowVersionId FK
}
"public.project" {
timestamp_3__with_time_zone createdAt
uuid creatorId FK
json customTelemetryTags
varchar_512_ description
json icon
varchar_36_ id
varchar_255_ name
varchar_36_ type
timestamp_3__with_time_zone updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -1,73 +0,0 @@
# public.workflow_review_request_authors
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| userId | uuid | | false | | [public.user](public.user.md) | |
| workflowReviewRequestId | varchar(36) | | false | | [public.workflow_review_request](public.workflow_review_request.md) | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| FK_a9c79ab0c352aa0496c39ea56a4 | FOREIGN KEY | FOREIGN KEY ("userId") REFERENCES "user"(id) ON DELETE CASCADE |
| FK_c255ae5087010c1ab73ac8684af | FOREIGN KEY | FOREIGN KEY ("workflowReviewRequestId") REFERENCES workflow_review_request(id) ON DELETE CASCADE |
| PK_ae197bb5135d422f6392a879e0c | PRIMARY KEY | PRIMARY KEY ("workflowReviewRequestId", "userId") |
| workflow_review_request_author_workflowReviewRequestId_not_null | n | NOT NULL "workflowReviewRequestId" |
| workflow_review_request_authors_userId_not_null | n | NOT NULL "userId" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| PK_ae197bb5135d422f6392a879e0c | CREATE UNIQUE INDEX "PK_ae197bb5135d422f6392a879e0c" ON public.workflow_review_request_authors USING btree ("workflowReviewRequestId", "userId") |
## Relations
```mermaid
erDiagram
"public.workflow_review_request_authors" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.workflow_review_request_authors" }o--|| "public.workflow_review_request" : "FOREIGN KEY (#quot;workflowReviewRequestId#quot;) REFERENCES workflow_review_request(id) ON DELETE CASCADE"
"public.workflow_review_request_authors" {
uuid userId FK
varchar_36_ workflowReviewRequestId FK
}
"public.user" {
timestamp_3__with_time_zone createdAt
boolean disabled
varchar_255_ email
varchar_32_ firstName
uuid id
date lastActiveAt
varchar_32_ lastName
boolean mfaEnabled
text mfaRecoveryCodes
text mfaSecret
varchar_255_ password
json personalizationAnswers
varchar_128_ roleSlug FK
json settings
timestamp_3__with_time_zone updatedAt
}
"public.workflow_review_request" {
timestamp_3__with_time_zone approvedAt
uuid closedById FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_50_ decision
text description
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ state
varchar_255_ title
timestamp_3__with_time_zone updatedAt
uuid updatedById FK
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -1,74 +0,0 @@
# public.workflow_review_request_reviewers
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| userId | uuid | | false | | [public.user](public.user.md) | |
| workflowReviewRequestId | varchar(36) | | false | | [public.workflow_review_request](public.workflow_review_request.md) | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| FK_81d0a2584aa4e8e5e0d6aa68f32 | FOREIGN KEY | FOREIGN KEY ("userId") REFERENCES "user"(id) ON DELETE CASCADE |
| FK_ba29e1cc5cdba43ce7b810b3ddd | FOREIGN KEY | FOREIGN KEY ("workflowReviewRequestId") REFERENCES workflow_review_request(id) ON DELETE CASCADE |
| PK_4715c6035e0ebc4f3e8716f1e34 | PRIMARY KEY | PRIMARY KEY ("workflowReviewRequestId", "userId") |
| workflow_review_request_review_workflowReviewRequestId_not_null | n | NOT NULL "workflowReviewRequestId" |
| workflow_review_request_reviewers_userId_not_null | n | NOT NULL "userId" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_workflow_review_request_reviewers_user | CREATE INDEX "IDX_workflow_review_request_reviewers_user" ON public.workflow_review_request_reviewers USING btree ("userId", "workflowReviewRequestId") |
| PK_4715c6035e0ebc4f3e8716f1e34 | CREATE UNIQUE INDEX "PK_4715c6035e0ebc4f3e8716f1e34" ON public.workflow_review_request_reviewers USING btree ("workflowReviewRequestId", "userId") |
## Relations
```mermaid
erDiagram
"public.workflow_review_request_reviewers" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.workflow_review_request_reviewers" }o--|| "public.workflow_review_request" : "FOREIGN KEY (#quot;workflowReviewRequestId#quot;) REFERENCES workflow_review_request(id) ON DELETE CASCADE"
"public.workflow_review_request_reviewers" {
uuid userId FK
varchar_36_ workflowReviewRequestId FK
}
"public.user" {
timestamp_3__with_time_zone createdAt
boolean disabled
varchar_255_ email
varchar_32_ firstName
uuid id
date lastActiveAt
varchar_32_ lastName
boolean mfaEnabled
text mfaRecoveryCodes
text mfaSecret
varchar_255_ password
json personalizationAnswers
varchar_128_ roleSlug FK
json settings
timestamp_3__with_time_zone updatedAt
}
"public.workflow_review_request" {
timestamp_3__with_time_zone approvedAt
uuid closedById FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_50_ decision
text description
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ state
varchar_255_ title
timestamp_3__with_time_zone updatedAt
uuid updatedById FK
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -1,100 +0,0 @@
# public.workflow_review_request_workflow
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| id | varchar(36) | | false | | | |
| workflowId | varchar(36) | | false | | [public.workflow_entity](public.workflow_entity.md) | |
| workflowReviewRequestId | varchar(36) | | false | | [public.workflow_review_request](public.workflow_review_request.md) | |
| workflowVersionId | varchar(36) | | true | | [public.workflow_history](public.workflow_history.md) | Pinned workflow_history version for this review item |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| FK_0f6f0f2c6d46b806fee02962ac2 | FOREIGN KEY | FOREIGN KEY ("workflowVersionId") REFERENCES workflow_history("versionId") ON DELETE SET NULL |
| FK_619f5b0544bcec60c3387e82f2f | FOREIGN KEY | FOREIGN KEY ("workflowId") REFERENCES workflow_entity(id) ON DELETE CASCADE |
| FK_e44b652e6dc99ef1364a2d85504 | FOREIGN KEY | FOREIGN KEY ("workflowReviewRequestId") REFERENCES workflow_review_request(id) ON DELETE CASCADE |
| PK_be3bf4facb054cf2b2b116b3b9c | PRIMARY KEY | PRIMARY KEY (id) |
| workflow_review_request_workfl_workflowReviewRequestId_not_null | n | NOT NULL "workflowReviewRequestId" |
| workflow_review_request_workflow_id_not_null | n | NOT NULL id |
| workflow_review_request_workflow_workflowId_not_null | n | NOT NULL "workflowId" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_workflow_review_request_workflow_workflow_request | CREATE INDEX "IDX_workflow_review_request_workflow_workflow_request" ON public.workflow_review_request_workflow USING btree ("workflowId", "workflowReviewRequestId") |
| PK_be3bf4facb054cf2b2b116b3b9c | CREATE UNIQUE INDEX "PK_be3bf4facb054cf2b2b116b3b9c" ON public.workflow_review_request_workflow USING btree (id) |
| UQ_workflow_review_request_workflow_request_workflow | CREATE UNIQUE INDEX "UQ_workflow_review_request_workflow_request_workflow" ON public.workflow_review_request_workflow USING btree ("workflowReviewRequestId", "workflowId") |
## Relations
```mermaid
erDiagram
"public.workflow_review_request_workflow" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.workflow_review_request_workflow" }o--|| "public.workflow_review_request" : "FOREIGN KEY (#quot;workflowReviewRequestId#quot;) REFERENCES workflow_review_request(id) ON DELETE CASCADE"
"public.workflow_review_request_workflow" }o--o| "public.workflow_history" : "FOREIGN KEY (#quot;workflowVersionId#quot;) REFERENCES workflow_history(#quot;versionId#quot;) ON DELETE SET NULL"
"public.workflow_review_request_workflow" {
varchar_36_ id
varchar_36_ workflowId FK
varchar_36_ workflowReviewRequestId FK
varchar_36_ workflowVersionId FK
}
"public.workflow_entity" {
boolean active
varchar_36_ activeVersionId FK
json connections
timestamp_3__with_time_zone createdAt
text description
varchar_36_ id
boolean isArchived
json meta
varchar_128_ name
json nodeGroups
json nodes
varchar_36_ parentFolderId FK
json pinData
json settings
varchar sourceWorkflowId
json staticData
integer triggerCount
timestamp_3__with_time_zone updatedAt
integer versionCounter
character_36_ versionId
}
"public.workflow_review_request" {
timestamp_3__with_time_zone approvedAt
uuid closedById FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_50_ decision
text description
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ state
varchar_255_ title
timestamp_3__with_time_zone updatedAt
uuid updatedById FK
}
"public.workflow_history" {
varchar_255_ authors
boolean autosaved
json connections
timestamp_3__with_time_zone createdAt
text description
varchar_128_ name
json nodeGroups
json nodes
timestamp_3__with_time_zone updatedAt
varchar_36_ versionId
varchar_36_ workflowId FK
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -10,18 +10,14 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| ---- | ------- | ------- | ---- |
| [agent_chat_subscriptions](agent_chat_subscriptions.md) | 6 | | table |
| [agent_checkpoints](agent_checkpoints.md) | 6 | | table |
| [agent_eval_dataset](agent_eval_dataset.md) | 10 | | table |
| [agent_eval_rating](agent_eval_rating.md) | 8 | | table |
| [agent_eval_result](agent_eval_result.md) | 15 | | table |
| [agent_eval_run](agent_eval_run.md) | 14 | | table |
| [agent_execution](agent_execution.md) | 19 | | table |
| [agent_execution](agent_execution.md) | 18 | | table |
| [agent_execution_threads](agent_execution_threads.md) | 17 | | table |
| [agent_files](agent_files.md) | 8 | | table |
| [agent_history](agent_history.md) | 9 | | table |
| [agent_task_definition](agent_task_definition.md) | 7 | | table |
| [agent_task_run_lock](agent_task_run_lock.md) | 6 | | table |
| [agent_task_snapshot](agent_task_snapshot.md) | 8 | | table |
| [agents](agents.md) | 12 | | table |
| [agents](agents.md) | 11 | | table |
| [agents_memory_entries](agents_memory_entries.md) | 13 | | table |
| [agents_memory_entry_cursors](agents_memory_entry_cursors.md) | 6 | | table |
| [agents_memory_entry_locks](agents_memory_entry_locks.md) | 6 | | table |
@ -44,7 +40,7 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| [chat_hub_sessions](chat_hub_sessions.md) | 13 | | table |
| [chat_hub_tools](chat_hub_tools.md) | 9 | | table |
| [credential_dependency](credential_dependency.md) | 5 | | table |
| [credentials_entity](credentials_entity.md) | 12 | | table |
| [credentials_entity](credentials_entity.md) | 11 | | table |
| [data_table](data_table.md) | 5 | | table |
| [data_table_column](data_table_column.md) | 7 | | table |
| [deployment_key](deployment_key.md) | 7 | | table |
@ -66,8 +62,7 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| [insights_raw](insights_raw.md) | 5 | | table |
| [installed_nodes](installed_nodes.md) | 4 | | table |
| [installed_packages](installed_packages.md) | 6 | | table |
| [instance_ai_checkpoints](instance_ai_checkpoints.md) | 9 | | table |
| [instance_ai_events](instance_ai_events.md) | 7 | | table |
| [instance_ai_checkpoints](instance_ai_checkpoints.md) | 8 | | table |
| [instance_ai_iteration_logs](instance_ai_iteration_logs.md) | 6 | | table |
| [instance_ai_mcp_registry_connections](instance_ai_mcp_registry_connections.md) | 7 | | table |
| [instance_ai_messages](instance_ai_messages.md) | 8 | | table |
@ -81,7 +76,6 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| [instance_ai_thread_grants](instance_ai_thread_grants.md) | 5 | | table |
| [instance_ai_threads](instance_ai_threads.md) | 7 | | table |
| [instance_ai_workflow_snapshots](instance_ai_workflow_snapshots.md) | 7 | | table |
| [instance_credential_assignment](instance_credential_assignment.md) | 4 | | table |
| [instance_version_history](instance_version_history.md) | 5 | | table |
| [invalid_auth_token](invalid_auth_token.md) | 2 | | table |
| [mcp_registry_server](mcp_registry_server.md) | 7 | | table |
@ -89,7 +83,7 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| [oauth_authorization_codes](oauth_authorization_codes.md) | 13 | | table |
| [oauth_clients](oauth_clients.md) | 9 | | table |
| [oauth_refresh_tokens](oauth_refresh_tokens.md) | 7 | | table |
| [oauth_user_consents](oauth_user_consents.md) | 5 | | table |
| [oauth_user_consents](oauth_user_consents.md) | 4 | | table |
| [processed_data](processed_data.md) | 5 | | table |
| [project](project.md) | 9 | | table |
| [project_relation](project_relation.md) | 5 | | table |
@ -99,7 +93,7 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| [role_mapping_rule_project](role_mapping_rule_project.md) | 2 | | table |
| [role_scope](role_scope.md) | 2 | | table |
| [scheduled_job](scheduled_job.md) | 19 | | table |
| [scheduled_task](scheduled_task.md) | 17 | | table |
| [scheduled_task](scheduled_task.md) | 16 | | table |
| [scope](scope.md) | 3 | | table |
| [secrets_provider_connection](secrets_provider_connection.md) | 7 | | table |
| [settings](settings.md) | 3 | | table |
@ -124,10 +118,6 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| [workflow_publication_trigger_status](workflow_publication_trigger_status.md) | 8 | | table |
| [workflow_publish_history](workflow_publish_history.md) | 6 | | table |
| [workflow_published_version](workflow_published_version.md) | 4 | | table |
| [workflow_review_request](workflow_review_request.md) | 12 | | table |
| [workflow_review_request_authors](workflow_review_request_authors.md) | 2 | | table |
| [workflow_review_request_reviewers](workflow_review_request_reviewers.md) | 2 | | table |
| [workflow_review_request_workflow](workflow_review_request_workflow.md) | 4 | | table |
| [workflow_statistics](workflow_statistics.md) | 7 | | table |
| [workflows_tags](workflows_tags.md) | 2 | | table |
@ -138,13 +128,6 @@ erDiagram
"agent_chat_subscriptions" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_checkpoints" }o--o| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_eval_dataset" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_eval_dataset" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_eval_rating" }o--o| "user" : "FOREIGN KEY (ratedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_eval_rating" }o--|| "agent_eval_result" : "FOREIGN KEY (resultId) REFERENCES agent_eval_result (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_eval_result" }o--|| "agent_eval_run" : "FOREIGN KEY (runId) REFERENCES agent_eval_run (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_eval_run" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_eval_run" }o--|| "agent_eval_dataset" : "FOREIGN KEY (datasetId) REFERENCES agent_eval_dataset (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_execution" }o--|| "agent_execution_threads" : "FOREIGN KEY (threadId) REFERENCES agent_execution_threads (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_execution_threads" }o--o| "agent_history" : "FOREIGN KEY (taskVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_execution_threads" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -155,8 +138,8 @@ erDiagram
"agent_task_definition" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_task_run_lock" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_task_snapshot" |o--|| "agent_history" : "FOREIGN KEY (versionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents" }o--o| "agent_history" : "FOREIGN KEY (activeVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agents" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents" }o--o| "agent_history" : "FOREIGN KEY (activeVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agents_memory_entries" }o--o| "agents_memory_entries" : "FOREIGN KEY (supersededBy) REFERENCES agents_memory_entries (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"agents_memory_entries" }o--|| "agents_resources" : "FOREIGN KEY (resourceId) REFERENCES agents_resources (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents_memory_entries" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -227,7 +210,6 @@ erDiagram
"insights_raw" }o--|| "insights_metadata" : "FOREIGN KEY (metaId) REFERENCES insights_metadata (metaId) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"installed_nodes" }o--|| "installed_packages" : "FOREIGN KEY (package) REFERENCES installed_packages (packageName) ON UPDATE CASCADE ON DELETE CASCADE MATCH NONE"
"instance_ai_checkpoints" }o--|| "instance_ai_threads" : "FOREIGN KEY (threadId) REFERENCES instance_ai_threads (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"instance_ai_events" |o--|| "instance_ai_threads" : "FOREIGN KEY (threadId) REFERENCES instance_ai_threads (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"instance_ai_iteration_logs" }o--|| "instance_ai_threads" : "FOREIGN KEY (threadId) REFERENCES instance_ai_threads (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"instance_ai_mcp_registry_connections" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"instance_ai_mcp_registry_connections" }o--|| "mcp_registry_server" : "FOREIGN KEY (serverSlug) REFERENCES mcp_registry_server (slug) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -246,7 +228,6 @@ erDiagram
"instance_ai_thread_grants" |o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"instance_ai_thread_grants" |o--|| "instance_ai_threads" : "FOREIGN KEY (threadId) REFERENCES instance_ai_threads (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"instance_ai_threads" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"instance_credential_assignment" }o--|| "credentials_entity" : "FOREIGN KEY (credentialId) REFERENCES credentials_entity (id) ON UPDATE NO ACTION ON DELETE RESTRICT MATCH NONE"
"oauth_access_tokens" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"oauth_access_tokens" }o--|| "oauth_clients" : "FOREIGN KEY (clientId) REFERENCES oauth_clients (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"oauth_authorization_codes" }o--|| "oauth_clients" : "FOREIGN KEY (clientId) REFERENCES oauth_clients (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -301,17 +282,6 @@ erDiagram
"workflow_published_version" |o--|| "workflow_entity" : "FOREIGN KEY (workflowId) REFERENCES workflow_entity (id) ON UPDATE NO ACTION ON DELETE RESTRICT MATCH NONE"
"workflow_published_version" |o--|| "workflow_entity" : "FOREIGN KEY (workflowId) REFERENCES workflow_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_published_version" }o--|| "workflow_history" : "FOREIGN KEY (publishedVersionId) REFERENCES workflow_history (versionId) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_review_request" }o--o| "user" : "FOREIGN KEY (closedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"workflow_review_request" }o--o| "user" : "FOREIGN KEY (updatedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"workflow_review_request" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"workflow_review_request" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_review_request_authors" |o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_review_request_authors" |o--|| "workflow_review_request" : "FOREIGN KEY (workflowReviewRequestId) REFERENCES workflow_review_request (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_review_request_reviewers" |o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_review_request_reviewers" |o--|| "workflow_review_request" : "FOREIGN KEY (workflowReviewRequestId) REFERENCES workflow_review_request (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_review_request_workflow" }o--o| "workflow_history" : "FOREIGN KEY (workflowVersionId) REFERENCES workflow_history (versionId) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"workflow_review_request_workflow" }o--|| "workflow_entity" : "FOREIGN KEY (workflowId) REFERENCES workflow_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflow_review_request_workflow" }o--|| "workflow_review_request" : "FOREIGN KEY (workflowReviewRequestId) REFERENCES workflow_review_request (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflows_tags" |o--|| "tag_entity" : "FOREIGN KEY (tagId) REFERENCES tag_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"workflows_tags" |o--|| "workflow_entity" : "FOREIGN KEY (workflowId) REFERENCES workflow_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -331,61 +301,6 @@ erDiagram
TEXT state
datetime_3_ updatedAt
}
"agent_eval_dataset" {
varchar_36_ agentId FK
TEXT columnMapping
datetime_3_ createdAt
varchar createdById FK
TEXT datasetRef
varchar_32_ datasetSource
TEXT description
varchar_36_ id PK
varchar_128_ name
datetime_3_ updatedAt
}
"agent_eval_rating" {
TEXT comment
TEXT correction
datetime_3_ createdAt
varchar_36_ id PK
varchar ratedById FK
varchar_36_ resultId FK
datetime_3_ updatedAt
varchar_8_ vote
}
"agent_eval_result" {
datetime_3_ completedAt
datetime_3_ createdAt
varchar_255_ errorCode
TEXT errorDetails
varchar_36_ id PK
TEXT input
TEXT metrics
TEXT output
datetime_3_ runAt
varchar_36_ runId FK
INTEGER runIndex
varchar_255_ sourceRowId
varchar status
TEXT toolCalls
datetime_3_ updatedAt
}
"agent_eval_run" {
varchar_36_ agentVersionId
boolean cancelRequested
datetime_3_ completedAt
datetime_3_ createdAt
varchar createdById FK
varchar_36_ datasetId FK
varchar_255_ errorCode
TEXT errorDetails
varchar_36_ id PK
TEXT metrics
datetime_3_ runAt
varchar_255_ runningInstanceId
varchar status
datetime_3_ updatedAt
}
"agent_execution" {
INTEGER completionTokens
REAL cost
@ -400,7 +315,6 @@ erDiagram
datetime_3_ startedAt
varchar_16_ status
datetime_3_ stoppedAt
VARCHAR_2_ storedAt
varchar_128_ threadId FK
TEXT timeline
INTEGER totalTokens
@ -476,7 +390,6 @@ erDiagram
}
"agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
datetime_3_ createdAt
varchar_36_ id PK
TEXT integrations
@ -714,7 +627,6 @@ erDiagram
varchar_16_ resolverId FK
varchar_32_ type
datetime_3_ updatedAt
VARCHAR_16_ usageScope
}
"data_table" {
datetime_3_ createdAt
@ -876,7 +788,7 @@ erDiagram
bigint value
}
"installed_nodes" {
REAL latestVersion
INTEGER latestVersion
char_200_ name PK
char_214_ package FK
char_200_ type
@ -892,7 +804,6 @@ erDiagram
"instance_ai_checkpoints" {
datetime_3_ createdAt
datetime_3_ expiredAt
VARCHAR_64_ hostRunId
varchar_255_ key PK
varchar_255_ resourceId
varchar_255_ runId
@ -900,15 +811,6 @@ erDiagram
varchar threadId FK
datetime_3_ updatedAt
}
"instance_ai_events" {
datetime_3_ createdAt
TEXT payload
varchar_64_ runId
INTEGER seq PK
varchar threadId PK
varchar_64_ type
datetime_3_ updatedAt
}
"instance_ai_iteration_logs" {
datetime_3_ createdAt
TEXT entry
@ -1056,12 +958,6 @@ erDiagram
datetime_3_ updatedAt
varchar_255_ workflowName PK
}
"instance_credential_assignment" {
datetime_3_ createdAt
varchar_36_ credentialId FK
varchar_128_ credentialUseId PK
datetime_3_ updatedAt
}
"instance_version_history" {
datetime_3_ createdAt
INTEGER id
@ -1126,7 +1022,6 @@ erDiagram
varchar clientId FK
bigint grantedAt
INTEGER id
TEXT scope
varchar userId FK
}
"processed_data" {
@ -1212,7 +1107,6 @@ erDiagram
INTEGER attempts
varchar_255_ claimedBy
datetime_3_ createdAt
datetime_3_ dispatchedAt
TEXT errorMessage
datetime_3_ finishedAt
INTEGER id
@ -1462,34 +1356,6 @@ erDiagram
datetime_3_ updatedAt
varchar_36_ workflowId PK
}
"workflow_review_request" {
datetime_3_ approvedAt
varchar closedById FK
datetime_3_ createdAt
varchar createdById FK
varchar_50_ decision
TEXT description
varchar_36_ id PK
varchar_36_ projectId FK
varchar_16_ state
varchar_255_ title
datetime_3_ updatedAt
varchar updatedById FK
}
"workflow_review_request_authors" {
varchar userId PK
varchar_36_ workflowReviewRequestId PK
}
"workflow_review_request_reviewers" {
varchar userId PK
varchar_36_ workflowReviewRequestId PK
}
"workflow_review_request_workflow" {
varchar_36_ id PK
varchar_36_ workflowId FK
varchar_36_ workflowReviewRequestId FK
varchar_36_ workflowVersionId FK
}
"workflow_statistics" {
INTEGER count
INTEGER id

View File

@ -57,7 +57,6 @@ erDiagram
}
"agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
datetime_3_ createdAt
varchar_36_ id PK
TEXT integrations

View File

@ -54,7 +54,6 @@ erDiagram
}
"agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
datetime_3_ createdAt
varchar_36_ id PK
TEXT integrations

View File

@ -1,118 +0,0 @@
# agent_eval_dataset
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "agent_eval_dataset" ("id" varchar(36) PRIMARY KEY NOT NULL, "name" varchar(128) NOT NULL, "description" text, "agentId" varchar(36) NOT NULL, "datasetSource" varchar(32) NOT NULL, "datasetRef" text NOT NULL, "columnMapping" text, "createdById" varchar, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "updatedAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), CONSTRAINT "CHK_agent_eval_dataset_datasetSource" CHECK ("datasetSource" IN ('data_table', 'google_sheets')), CONSTRAINT "FK_9d3a6fd750f7746de453cf4d5ed" FOREIGN KEY ("agentId") REFERENCES "agents" ("id") ON DELETE CASCADE, CONSTRAINT "FK_eda9e5fa5558d3f16bc2f6c21b6" FOREIGN KEY ("createdById") REFERENCES "user" ("id") ON DELETE SET NULL)
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| agentId | varchar(36) | | false | | [agents](agents.md) | |
| columnMapping | TEXT | | true | | | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| createdById | varchar | | true | | [user](user.md) | |
| datasetRef | TEXT | | false | | | |
| datasetSource | varchar(32) | | false | | | |
| description | TEXT | | true | | | |
| id | varchar(36) | | false | [agent_eval_run](agent_eval_run.md) | | |
| name | varchar(128) | | false | | | |
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - | CHECK | CHECK ("datasetSource" IN ('data_table', 'google_sheets')) |
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE |
| - (Foreign key ID: 1) | FOREIGN KEY | FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| id | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_agent_eval_dataset_1 | PRIMARY KEY | PRIMARY KEY (id) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_9d3a6fd750f7746de453cf4d5e | CREATE INDEX "IDX_9d3a6fd750f7746de453cf4d5e" ON "agent_eval_dataset" ("agentId") |
| sqlite_autoindex_agent_eval_dataset_1 | PRIMARY KEY (id) |
## Relations
```mermaid
erDiagram
"agent_eval_dataset" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_eval_dataset" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_eval_run" }o--|| "agent_eval_dataset" : "FOREIGN KEY (datasetId) REFERENCES agent_eval_dataset (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_eval_dataset" {
varchar_36_ agentId FK
TEXT columnMapping
datetime_3_ createdAt
varchar createdById FK
TEXT datasetRef
varchar_32_ datasetSource
TEXT description
varchar_36_ id PK
varchar_128_ name
datetime_3_ updatedAt
}
"agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
datetime_3_ createdAt
varchar_36_ id PK
TEXT integrations
varchar_128_ name
varchar_255_ projectId FK
TEXT schema
TEXT skills
TEXT tools
datetime_3_ updatedAt
varchar_36_ versionId
}
"user" {
datetime_3_ createdAt
boolean disabled
varchar_255_ email
varchar_32_ firstName
varchar id PK
date lastActiveAt
varchar_32_ lastName
boolean mfaEnabled
TEXT mfaRecoveryCodes
TEXT mfaSecret
varchar password
TEXT personalizationAnswers
varchar_128_ roleSlug FK
TEXT settings
datetime_3_ updatedAt
}
"agent_eval_run" {
varchar_36_ agentVersionId
boolean cancelRequested
datetime_3_ completedAt
datetime_3_ createdAt
varchar createdById FK
varchar_36_ datasetId FK
varchar_255_ errorCode
TEXT errorDetails
varchar_36_ id PK
TEXT metrics
datetime_3_ runAt
varchar_255_ runningInstanceId
varchar status
datetime_3_ updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -1,100 +0,0 @@
# agent_eval_rating
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "agent_eval_rating" ("id" varchar(36) PRIMARY KEY NOT NULL, "resultId" varchar(36) NOT NULL, "vote" varchar(8) NOT NULL, "comment" text, "correction" text, "ratedById" varchar, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "updatedAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), CONSTRAINT "CHK_agent_eval_rating_vote" CHECK ("vote" IN ('up', 'down')), CONSTRAINT "FK_9cadae6591c64498f1b58a2cef3" FOREIGN KEY ("resultId") REFERENCES "agent_eval_result" ("id") ON DELETE CASCADE, CONSTRAINT "FK_e06a7408573a3e152e673977d2c" FOREIGN KEY ("ratedById") REFERENCES "user" ("id") ON DELETE SET NULL)
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| comment | TEXT | | true | | | |
| correction | TEXT | | true | | | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| id | varchar(36) | | false | | | |
| ratedById | varchar | | true | | [user](user.md) | |
| resultId | varchar(36) | | false | | [agent_eval_result](agent_eval_result.md) | |
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| vote | varchar(8) | | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - | CHECK | CHECK ("vote" IN ('up', 'down')) |
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (ratedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE |
| - (Foreign key ID: 1) | FOREIGN KEY | FOREIGN KEY (resultId) REFERENCES agent_eval_result (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| id | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_agent_eval_rating_1 | PRIMARY KEY | PRIMARY KEY (id) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_9cadae6591c64498f1b58a2cef | CREATE INDEX "IDX_9cadae6591c64498f1b58a2cef" ON "agent_eval_rating" ("resultId") |
| sqlite_autoindex_agent_eval_rating_1 | PRIMARY KEY (id) |
## Relations
```mermaid
erDiagram
"agent_eval_rating" }o--o| "user" : "FOREIGN KEY (ratedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_eval_rating" }o--|| "agent_eval_result" : "FOREIGN KEY (resultId) REFERENCES agent_eval_result (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_eval_rating" {
TEXT comment
TEXT correction
datetime_3_ createdAt
varchar_36_ id PK
varchar ratedById FK
varchar_36_ resultId FK
datetime_3_ updatedAt
varchar_8_ vote
}
"user" {
datetime_3_ createdAt
boolean disabled
varchar_255_ email
varchar_32_ firstName
varchar id PK
date lastActiveAt
varchar_32_ lastName
boolean mfaEnabled
TEXT mfaRecoveryCodes
TEXT mfaSecret
varchar password
TEXT personalizationAnswers
varchar_128_ roleSlug FK
TEXT settings
datetime_3_ updatedAt
}
"agent_eval_result" {
datetime_3_ completedAt
datetime_3_ createdAt
varchar_255_ errorCode
TEXT errorDetails
varchar_36_ id PK
TEXT input
TEXT metrics
TEXT output
datetime_3_ runAt
varchar_36_ runId FK
INTEGER runIndex
varchar_255_ sourceRowId
varchar status
TEXT toolCalls
datetime_3_ updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -1,105 +0,0 @@
# agent_eval_result
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "agent_eval_result" ("id" varchar(36) PRIMARY KEY NOT NULL, "runId" varchar(36) NOT NULL, "sourceRowId" varchar(255), "runIndex" integer, "status" varchar NOT NULL, "input" text, "output" text, "toolCalls" text, "metrics" text, "runAt" datetime(3), "completedAt" datetime(3), "errorCode" varchar(255), "errorDetails" text, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), "updatedAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), CONSTRAINT "CHK_agent_eval_result_status" CHECK ("status" IN ('new', 'running', 'success', 'error', 'cancelled')), CONSTRAINT "FK_40a2d1248a6d984f442de2fac1b" FOREIGN KEY ("runId") REFERENCES "agent_eval_run" ("id") ON DELETE CASCADE)
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| completedAt | datetime(3) | | true | | | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| errorCode | varchar(255) | | true | | | |
| errorDetails | TEXT | | true | | | |
| id | varchar(36) | | false | [agent_eval_rating](agent_eval_rating.md) | | |
| input | TEXT | | true | | | |
| metrics | TEXT | | true | | | |
| output | TEXT | | true | | | |
| runAt | datetime(3) | | true | | | |
| runId | varchar(36) | | false | | [agent_eval_run](agent_eval_run.md) | |
| runIndex | INTEGER | | true | | | |
| sourceRowId | varchar(255) | | true | | | |
| status | varchar | | false | | | |
| toolCalls | TEXT | | true | | | |
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - | CHECK | CHECK ("status" IN ('new', 'running', 'success', 'error', 'cancelled')) |
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (runId) REFERENCES agent_eval_run (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| id | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_agent_eval_result_1 | PRIMARY KEY | PRIMARY KEY (id) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_40a2d1248a6d984f442de2fac1 | CREATE INDEX "IDX_40a2d1248a6d984f442de2fac1" ON "agent_eval_result" ("runId") |
| sqlite_autoindex_agent_eval_result_1 | PRIMARY KEY (id) |
## Relations
```mermaid
erDiagram
"agent_eval_rating" }o--|| "agent_eval_result" : "FOREIGN KEY (resultId) REFERENCES agent_eval_result (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_eval_result" }o--|| "agent_eval_run" : "FOREIGN KEY (runId) REFERENCES agent_eval_run (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_eval_result" {
datetime_3_ completedAt
datetime_3_ createdAt
varchar_255_ errorCode
TEXT errorDetails
varchar_36_ id PK
TEXT input
TEXT metrics
TEXT output
datetime_3_ runAt
varchar_36_ runId FK
INTEGER runIndex
varchar_255_ sourceRowId
varchar status
TEXT toolCalls
datetime_3_ updatedAt
}
"agent_eval_rating" {
TEXT comment
TEXT correction
datetime_3_ createdAt
varchar_36_ id PK
varchar ratedById FK
varchar_36_ resultId FK
datetime_3_ updatedAt
varchar_8_ vote
}
"agent_eval_run" {
varchar_36_ agentVersionId
boolean cancelRequested
datetime_3_ completedAt
datetime_3_ createdAt
varchar createdById FK
varchar_36_ datasetId FK
varchar_255_ errorCode
TEXT errorDetails
varchar_36_ id PK
TEXT metrics
datetime_3_ runAt
varchar_255_ runningInstanceId
varchar status
datetime_3_ updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

Some files were not shown because too many files have changed in this diff Show More