Commit Graph

97 Commits

Author SHA1 Message Date
Yuliia Pominchuk
88e6a4cd15
docs: Say the identity section plainly
The previous pass was shorter but not clearer: it opened by announcing its own
importance, then leaned on "a run at 3am has nobody to ask" to carry the point.

Rewritten in the register the Storage section already uses — state the fact,
then the reason. The two cases are labelled rather than narrated, so the
structure is visible without prose holding it together.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 14:49:00 +02:00
Yuliia Pominchuk
5fb7c303bb
docs: Tighten the catalog's identity section
Same three ideas, roughly half the words: a live request proves who is asking, a
3am run has nobody to ask, and a minted token has to be re-checked because it
only proves who was named when it was issued.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 14:46:22 +02:00
Yuliia Pominchuk
42336c22e7
docs: Describe the workflow catalog
A feature description for people who did not follow the work: what the catalog
is for, the decision it rests on, how identity and scheduling actually work, and
where it is still thin.

Separate from the handoff notes, which are a working log. This one leads with
the problem — a workflow is shared, but the accounts it runs on are the
builder's, and a Schedule Trigger belongs to the workflow rather than to a
person.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 14:27:25 +02:00
Yuliia Pominchuk
7cbba6f149
fix(core): Offer a workflow that accepts any input, rather than none
A trigger set to "Accept all data" was excluded for declaring no contract. But
declaring nothing is not the same as being unofferable: the workflow simply
takes no input, which is exactly where a declared contract with no fields in it
lands — and that one was offered. So was a manual trigger, which carries less of
the builder's intent than any Execute Workflow Trigger does.

The line was in the wrong place. Three cases that all render an empty form and
start with `{}` now behave alike.

This also takes the pre-1.1 trigger with it: it has no mode to set, reads as
passthrough, and was excluded for the same wrong reason. A builder whose node
predates 1.1 sees no dropdown to fix and no explanation, so excluding it bought
nothing.

`own-schedule` and `no-start-node` remain, and both say something a builder can
act on.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 14:08:05 +02:00
Yuliia Pominchuk
8670414dc8
fix(core): Show the catalog what was shared, not what may be administered
`findAllWhere` skips its per-user narrowing whenever the caller holds the scope
globally, so `findAllWorkflowsForUser(user, ['workflow:execute'])` returned every
`shared_workflow` row on the instance to anyone with global execute — an
instance owner, for one. Their catalog was every workflow there is, other
people's personal ones included, and the listing handed out those names.

Not a lie in RBAC terms — an owner may run any of them — but the catalog asks a
different question. It offers "the workflows you were given", and a global scope
is an administrative capability, not a grant of a particular workflow.

`findAllWorkflowsForUser` takes a `sharedWithUserOnly` option that keeps the
narrowing on regardless, and the catalog passes it. Default behaviour is
unchanged for every other caller. An owner still sees their own workflows —
membership of their personal project is what puts them there.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 13:46:44 +02:00
Yuliia Pominchuk
ce73861ba8
fix(core): Run a catalog workflow with the caller's own credentials
The catalog's run endpoint never attached a credential context. `execution-
context.ts` only picks one up when `encryptedRunnerIdentity` is set, and nothing
set it, so a dynamic credential had no end user to resolve to and the workflow
quietly ran on whatever it stores itself — the opposite of the point.

It affected every run from the catalog, not any particular trigger. The
scheduled path had identity from the day it was written, because that one mints
a token; the attended path, where the identity was sitting right there in the
request, had none. The design note claiming manual runs take identity from the
session described an intention, not the code.

Now the controller reads the session token off the request and the run service
encrypts it, the same way the editor's manual execution has always done. A
minted identity still wins when one is supplied, so the unattended path is
unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 15:25:54 +02:00
Yuliia Pominchuk
f0b71fd1f3
feat(core): Require a declared trigger before a workflow can be scheduled
Running a workflow now and putting it on a schedule were held to the same bar,
and they should not be. Running once is bounded — the person is there, it
happens once, they see the result — and anyone with execute access could have
run it from the editor anyway, so a manual trigger is enough to justify it. A
schedule is unattended, recurring, and acts with that person's accounts for as
long as it stands.

That is too large a commitment to infer from the mere presence of a start node.
The Execute Workflow Trigger is the builder saying "this is meant to be called
by something other than me"; a manual trigger says the opposite. Subscriptions
now require the former, on create and on update — the trigger can be taken back
out after someone subscribed, and changing a schedule must not quietly re-bless
it.

Manual-trigger workflows stay in the catalog and stay runnable. Their schedule
button is disabled with the reason on it rather than hidden, so nobody is left
looking for an option that silently vanished.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 14:18:19 +02:00
Yuliia Pominchuk
af797b24d1
refactor(core): Remove the catalog runs endpoint
Nothing calls it: the catalog now sends people to the workflow's own execution
list, which shows the same runs with their data instead of a name, a time and a
status. Takes `CatalogService.listRuns`, its limit and its response types with
it, and drops the `ExecutionService` dependency that existed only for it.

The `catalogRunUserId` metadata the run service writes stays. It is the only
record of which person a run belongs to — a scheduled run has no session behind
it, so nothing else on the execution says whose it is — and unlike a query, it
cannot be reconstructed once it is not written.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 13:10:24 +02:00
Yuliia Pominchuk
032f914a28
docs: Add the workflow catalog handoff
Records the architectural decision the feature rests on — one workflow with an
Execute Workflow Trigger, not a generated wrapper per subscriber — the reasons
the wrapper approach was rejected, and what a live walkthrough confirmed and
found. Open decisions that need the scheduler owners are called out, as is the
missing offline OAuth refresh that blocks shipping schedules.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 12:19:19 +02:00
Yuliia Pominchuk
7237095654
feat(core): Store catalog consent and personal schedules
Two tables behind running a catalog workflow on your own schedule. They are
split because the keys differ: consent is one grant per (workflow, person),
while one person may want several schedules for the same workflow. The
subscription hangs off the grant by composite foreign key, so withdrawing
consent takes the schedules with it.

The scheduler side needed widening to hold them. A job was identified by
`(workflowId, nodeId)`, which is what provisioning diffs and deprovisioning
deletes by, and a per-person schedule has no node — several people hold their
own schedules for the same workflow. `scheduled_job` gains a nullable, opaque
`ownerId` that the scheduler only ever pairs with `taskType` and never
interprets, so a feature can own jobs without the scheduler learning about the
feature.

An owner-scoped job deliberately records no `workflowId`: that column is a
foreign key onto `workflow_published_version`, so it means "belongs to a
published trigger", which these do not. The type makes passing one impossible.
It also means nothing in the database removes these jobs when their owner goes,
so callers must deprovision explicitly.

The column is added with a raw `ALTER TABLE`: on SQLite the schema builder
rebuilds the table, and `scheduled_task` cascades from it, so the rebuild would
delete every queued occurrence on the instance.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 12:14:48 +02:00
Robin Braumann
89c9be6266
feat(core): Emit once-per-agent setup completion telemetry (#35359)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-03 11:00:37 +00:00
Eugene
0932806c05
feat: Support inbound binary attachments for agents (no-changelog) (#34869)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 14:20:06 +00:00
Emilia
8672d9567c
feat(core): Add a misfire policy to the durable scheduler (#35075)
Some checks are pending
CI: Master (Build, Test, Lint) / Build for Github Cache (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (22.22.3) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (24.18.0) (push) Waiting to run
CI: Master (Build, Test, Lint) / Lint (push) Waiting to run
CI: Master (Build, Test, Lint) / Performance (push) Waiting to run
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Blocked by required conditions
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 10:10:31 +00:00
Robin Braumann
4a05044bf5
refactor(core): Replace agent knowledge base binary data storage with blob storage (no-changelog) (#34985)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-28 13:36:27 +00:00
Andreas Fitzek
4f0a218e2d
feat(core): Add on-demand OAuth clients and protected resources for form triggers (no-changelog) (#34903) 2026-07-28 12:46:57 +00:00
RomanDavydchuk
48c0e70f14
fix(core): Support fractional community node versions with PostgreSQL (#34717) 2026-07-27 15:36:08 +00:00
Svetoslav Dekov
fdd4e33f9c
feat(core): Add availableInMCP column to agents (#34665)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 14:09:04 +00:00
Arvin A
e5bb60f663
feat(core): Add agent-scoped eval data model and migration (no-changelog) (#34657) 2026-07-24 12:37:53 +00:00
Albert Alises
13becf336c
feat(core): Add instance credential database schema (#34709)
Co-authored-by: Danny Martini <danny@n8n.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 09:37:33 +00:00
Robin Braumann
0b4bbd05b8
feat(core): Add storedAt column to agent_execution (#34858)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 08:57:18 +00:00
Sandra Zollner
156ac00120
feat(core): Add workflow review request entities and migration scripts (#34062)
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: James Gee <1285296+geemanjs@users.noreply.github.com>
Co-authored-by: kgrhartlage <kai.hartlage@n8n.io>
2026-07-21 12:57:39 +00:00
Raúl Gómez Morales
865142f5da
feat(core): Sweep interrupted Instance AI runs to a terminal state (no-changelog) (#34183)
Co-authored-by: Danny Martini <danny@n8n.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 10:37:28 +00:00
Lorent Lempereur
e22680b99f
fix(core): Close the durable scheduler's record-then-dispatch effect boundary (#34014)
Co-authored-by: Emilia <100027345+sovietspaceship@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 09:47:10 +00:00
mfsiega
c761c4da9b
feat(core): Add trigger reconciliation to recover missed activations (no-changelog) (#33577)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Danny Martini <danny@n8n.io>
2026-07-14 14:40:33 +00:00
Ricardo Espinoza
c3ca9a36da
feat(editor): Add scope selection to MCP OAuth consent screen (#33710)
Co-authored-by: Danny Martini <danny@n8n.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 13:21:14 +00:00
Raúl Gómez Morales
05b412cd28
feat(core): Add the Instance AI durable event-log store and writer (no-changelog) (#33910)
Co-authored-by: Danny Martini <danny@n8n.io>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 11:12:31 +00:00
Lorent Lempereur
fa7e97130b
feat(core): Add recurring_cron schedule kind to the durable scheduler (no-changelog) (#33858) 2026-07-10 12:48:20 +00:00
Iván Ovejero
6509d774aa
perf(core): Reduce DB reads for global credentials check (#33918) 2026-07-09 13:31:51 +00:00
Iván Ovejero
378710072f
perf(core): Aggregate workflow statistics to avoid hot-row contention (#33045) 2026-07-06 11:11:18 +00:00
Lorent Lempereur
f008844d75
feat(core): Add durable scheduler database schema (no-changelog) (#33315)
Co-authored-by: Emilia <100027345+sovietspaceship@users.noreply.github.com>
2026-07-01 13:12:59 +00:00
Savelii
4290e8461a
feat(editor): Show private credential icon on execution list runs (#32957)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-30 14:06:54 +00:00
mfsiega
4979df1970
feat(core): Persist per-trigger workflow publication status (no-changelog) (#33191)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 09:02:00 +00:00
yehorkardash
bc3fe3eaa6
refactor(core): Drop redundant agent execution columns (#32862) 2026-06-30 07:36:26 +00:00
bjorger
4231ae8124
refactor(core): Remove top-level agent description (no-changelog) (#32922)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 14:41:43 +00:00
Jaakko Husso
0c8955e793
feat(core): Persist IAI 'always allow' execute permissions on DB (no-changelog) (#32599) 2026-06-23 06:58:15 +00:00
bjorger
3ae74f10b0
feat(core): Add knowledge file storage for agents (#31956)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-22 11:49:50 +00:00
Iván Ovejero
1d6415cd59
feat(core): Add Azure storage mode for execution data (#32368) 2026-06-18 11:33:04 +00:00
Mike Repeć
10856a4f4d
feat(core): Track binary data size on execution entity rows (no-changelog) (#32387)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 15:14:27 +00:00
Tomi Turtiainen
711f8abc57
chore(core): Make DB schema docs generation deterministic (#32373) 2026-06-16 11:35:33 +00:00
Savelii
3b53949792
perf(core): Add partial index on execution_entity to fix executions list CPU spike (#32116)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-15 13:02:24 +00:00
Michael Drury
86b7234f81
fix(core): Persist agent subscription lists for threads to DB for multi-main configurations (no-changelog) (#31614)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 11:16:20 +00:00
Mike Repeć
612cb772c2
feat(core): Add sizeBytes and workflowVersionId to executions (no-changelog) (#32067)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
2026-06-12 09:44:19 +00:00
Tomi Turtiainen
f5ced2faf9
feat(core): Add auto-generated database schema documentation (no-changelog) (#32069) 2026-06-12 07:44:01 +00:00
Jan Oberhauser
62612d0ad4 📚 Removed docs-folders as they moved to n8n-io/n8n-docs 2020-07-05 13:03:50 +02:00
Sven Schmidt
bdd63fd54d
📚 Fix typo in create-node docs (#693) 2020-06-30 18:02:26 +02:00
Jan Oberhauser
4d5c166414 🚀 Switch to new docs 2020-06-29 14:39:43 +02:00
Patrick Wellever
49ea7e2739
✨ Make server listen address configurable (#618) 2020-06-04 09:36:10 +02:00
Scott Hutchens
3267006921
⚡ Corrected typo. (#557) 2020-05-11 20:29:32 +02:00
Tanay Pant
2694f03dbb 💻 Add troubleshooting page in the docs 2020-04-21 16:03:19 +02:00
Jan Oberhauser
bc448ac046 📚 Improve Server-Setup 2020-04-20 14:49:17 +02:00