Compare commits

...

248 Commits

Author SHA1 Message Date
n8n-assistant[bot]
d2dc2f9ce5
chore: Update e2e impact map (#41339)
Some checks are pending
CI: Master (Build, Test, Lint) / Build & format (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (24.18.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (26.5.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Lint (push) Waiting to run
CI: Master (Build, Test, Lint) / Verify single-instance deps (npm-install) (push) Waiting to run
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Blocked by required conditions
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-18 08:18:22 +00:00
Ricardo Espinoza
84943adc6c
fix(editor): Show which reference blocks a skill save (no-changelog) (#41298) 2026-10-18 07:50:57 +00:00
Riqwan Thamir
ff975f1b9e
perf(core): Stop writing Instance AI skills to the sandbox (no-changelog) (#41220)
Some checks are pending
CI: Master (Build, Test, Lint) / Build & format (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (24.18.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (26.5.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Lint (push) Waiting to run
CI: Master (Build, Test, Lint) / Verify single-instance deps (npm-install) (push) Waiting to run
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Blocked by required conditions
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-17 14:02:07 +00:00
n8n-assistant[bot]
936349a9c7
chore: Update e2e impact map (#41317)
Some checks are pending
CI: Master (Build, Test, Lint) / Build & format (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (24.18.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (26.5.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Lint (push) Waiting to run
CI: Master (Build, Test, Lint) / Verify single-instance deps (npm-install) (push) Waiting to run
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Blocked by required conditions
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-17 08:18:42 +00:00
Olivier
842ec5b62d
fix(core): Turn off expression spans by default (#41211)
Some checks are pending
CI: Master (Build, Test, Lint) / Build & format (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (24.18.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (26.5.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Lint (push) Waiting to run
CI: Master (Build, Test, Lint) / Verify single-instance deps (npm-install) (push) Waiting to run
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Blocked by required conditions
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 22:23:07 +00:00
n8n-cat-bot[bot]
ec074519d9
feat: Add policy attachment read endpoints (no-changelog) (#41122)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 16:13:10 +00:00
Rúben Castro
6f3b397a1e
feat(editor): Mark community packages with blocked node types (no-changelog) (#41105)
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Guillaume Jacquart <jacquart.guillaume@gmail.com>
2026-10-16 15:43:39 +00:00
n8n-cat-bot[bot]
21221adc78
fix: Validate attendee values (#40953)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-16 14:56:23 +00:00
Guillaume Jacquart
532e8ef930
fix(core): Save policy rules that name uninstalled packages (no-changelog) (#41210)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-10-16 14:48:56 +00:00
n8n-cat-bot[bot]
24621ad4ca
chore: Add review/lint rule to discourage open-ended fields in nodes (warn level) (#39959)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-16 14:47:15 +00:00
n8n-cat-bot[bot]
8ee5cf1845
chore: Flaky test: frontend.service.test.ts (3 master or merge-queue commits in 72 h) (#41279)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-16 14:44:01 +00:00
Stephen Wright
7f16040253
feat(Databricks Node): Add the Lakebase Delete operation (no-changelog) (#40543) 2026-10-16 14:42:03 +00:00
Csaba Tuncsik
ddc97694b5
fix(Microsoft Teams Node): Add the TeamMember.Read.All scope and correct the Trigger scope notice (#39819) 2026-10-16 14:27:44 +00:00
Rúben Castro
eaf47cfe39
fix(editor): Improve destination validation and surface save errors (#40897)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Guillaume Jacquart <jacquart.guillaume@gmail.com>
2026-10-16 14:14:55 +00:00
Ricardo Espinoza
986b82fa28
feat: Add telemetry events to the skills hub (no-changelog) (#41234) 2026-10-16 14:12:37 +00:00
Jan
76cce99626
fix(editor): Unify documentation links across settings pages (#40289)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-16 13:57:10 +00:00
Jaakko Husso
f34c093f08
feat(core): Add an optional model for n8n Assistant memory tasks (#41137)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:55:06 +00:00
Mike Repeć
158152496a
fix(core): Reuse connections in the log streaming webhook destination (#41261)
Co-authored-by: Theo Nastos <theodore.nastos@n8n.io>
2026-10-16 13:54:34 +00:00
Jan
1f223c85f8
fix(editor): Start the empty-state icon cards cycling on load and use them on the MCP and external secrets pages (#40232)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-16 13:53:32 +00:00
Ricardo Espinoza
6a015ecb18
fix(core): Check the delete permission when the agent page moves a skill (no-changelog) (#41222) 2026-10-16 13:52:18 +00:00
n8n-cat-bot[bot]
033ec05bff
chore: Bump handlebars 4.7.9 → 4.7.10 (patch) to clear 6 Aikido findings (#41277)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-16 13:46:42 +00:00
Theodore Nastos
dd79a610c5
feat(core): Enable node and credential type policies by default (#41022) 2026-10-16 13:44:56 +00:00
Martin Rechenberger
a63a8edb55
fix(editor): Hide the Community Plus enrollment modal on Cloud (no-changelog) (#41251) 2026-10-16 13:40:37 +00:00
symbiote15
f5dc06f753
fix(Postgres Node): Keep comma-containing values as one query parameter (#40240) 2026-10-16 13:28:55 +00:00
Jaakko Husso
b78913f75d
fix(core): Keep the workflow source file when n8n Assistant sends blank source (#41201)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:28:54 +00:00
Guillaume Jacquart
dfec6dee81
fix(editor): Allow copy and cut of a selection with a restricted node (no-changelog) (#41276)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 13:25:51 +00:00
Uddish Verma
f92b4c11d6
feat(API): Limit Public API requests for each API key (no-changelog) (#41008)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:19:34 +00:00
Luigi Gubello
5120d25cbc
fix(editor): Count missing input apart in the QuickJS shadow report (no-changelog) (#41214)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 13:15:19 +00:00
Bernhard Wittmann
a6719b8db7
fix(Email Trigger (IMAP) Node): Check the mailbox when the trigger activates (#41013) 2026-10-16 13:10:25 +00:00
Bernhard Wittmann
7001886432
fix(core): Give each new Microsoft Teams sign-in credential a unique name (no-changelog) (#41256) 2026-10-16 13:04:21 +00:00
Sam Wooler
a906d2fdfc
feat(API): Return the parent folder on workflow read endpoints (#40981)
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-16 12:48:25 +00:00
Anne Aguirre
683fd11259
fix(core): Pass reasoning effort on open router model node (#41179) 2026-10-16 12:43:58 +00:00
Mike Repeć
1b02863c00
fix(core): Hand node reference results without an item shape to the engine (no-changelog) (#41083) 2026-10-16 12:25:04 +00:00
n8n-cat-bot[bot]
d0cb582163
chore: Bump fast-uri 3.1.5 → 3.1.8 (patch) to clear 12 Aikido findings (#41255)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-16 12:21:08 +00:00
Anne Aguirre
ea98bd0600
fix(AI Agent Node): Replay Anthropic thinking turns with their tool arguments (#41241) 2026-10-16 12:09:01 +00:00
Predrag Ristic
1405d4a351
feat(core): Add self-healing results to Inbox (#40741) 2026-10-16 12:07:09 +00:00
Anne Aguirre
f84413516a
fix(core): Web search misconfigs in agents as UserError (#41257) 2026-10-16 12:00:35 +00:00
Sandra Zollner
333a010112
feat(core): Store promotion exports in n8n directory (#40863)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-16 12:00:28 +00:00
Ali Elkhateeb
b7b3d72737
feat(API): Honor Idempotency-Key on Public API POST requests (#40978)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-16 11:58:36 +00:00
n8n-cat-bot[bot]
5a3fc39972
fix: Skip dependency files and continue after custom node load (#41117)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-16 11:53:13 +00:00
Rúben Castro
d460eb28ca
fix(editor): Explain why copy, cut, duplicate and pin refuse a restricted node (no-changelog) (#40997)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-10-16 11:51:01 +00:00
Francesca Sargent
4a5fdd5b68
fix(editor): Return to the requested page after SSO sign-in (#41151) 2026-10-16 11:42:25 +00:00
MHMD
e7f0607bf1
fix(core): Allow switching a node back to a credential the user cannot use after a save (#41198) 2026-10-16 11:39:13 +00:00
Sandra Zollner
64d8a3ad19
feat(core): Add promotion run and review data model (no-changelog) (#40794)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-16 11:28:06 +00:00
James Martin
c70b5d49b3
fix(core): Redact a parent execution if any sub-workflows have redaction enabled (#41129)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 11:02:43 +00:00
Stephen Wright
c28d130c6c
feat(Databricks Node): Explain Lakebase setup failures (no-changelog) (#40523) 2026-10-16 10:49:36 +00:00
MHMD
ca9661c091
fix(editor): Keep the used-in rows on the credential sharing tab when personal-space sharing is disabled (#41207) 2026-10-16 10:40:31 +00:00
Emre Caglar
a94f5dc8b7
feat(editor): Move the check rule and delete actions in the agent check row (no-changelog) (#41170)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 10:26:51 +00:00
Emre Caglar
fffea4c0c0
fix(editor): Remove the warning badge from the needs-work agent avatar (no-changelog) (#41164)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 10:26:41 +00:00
Emre Caglar
14e633d481
fix(editor): Keep rounded corners on a single row in the agent checks list (no-changelog) (#41166)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 10:26:28 +00:00
Emre Caglar
575eb6fa43
fix(editor): Show the check conversation stripes in dark mode (no-changelog) (#41167)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 10:26:19 +00:00
Emre Caglar
3ea0a3da98
fix(editor): Join the check conversation box to the practice-run strip (no-changelog) (#41168)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 10:26:06 +00:00
Emre Caglar
fed8b1ec69
feat(editor): Use a segment control for the agent checks status filter (no-changelog) (#41169)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 10:09:00 +00:00
Jan Kalkan
eba25caa70
feat(core): Require credential:create scope for create-with-values package imports (no-changelog) (#41131)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 09:55:56 +00:00
Sam Wooler
fe3627914a
fix(API): Log errors before returning generic 500 in Public API (#41186)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 09:54:41 +00:00
Jaakko Husso
aba5258930
feat(core): Add the scope column to the agents table (no-changelog) (#41165)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 09:52:52 +00:00
Bernhard Wittmann
aadbb7c498
fix(editor): Let the Assistant chat finish the Microsoft Teams setup (no-changelog) (#41188) 2026-10-16 09:38:51 +00:00
Predrag Ristic
8bee1eeb20
refactor(core): Prepare the shared Inbox (#40739)
Co-authored-by: kgrhartlage <kai.hartlage@n8n.io>
2026-10-16 09:37:52 +00:00
Eugene
2eab299dfa
fix(core): Pass Agent stop signals to foreground workflow tools (no-changelog) (#40776) 2026-10-16 09:21:44 +00:00
João Almeida
fc9f9575e2
fix(editor): Keep workflow name in edit mode after Rename menu action (#41120)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 09:04:26 +00:00
João Almeida
116a81e06e
fix(editor): Keep pending navigation when workflows list query is unchanged (#41125)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 09:04:20 +00:00
João Almeida
b36f6c0baf
test: Fix flaky zoom after route changes e2e test (#41130)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 09:04:09 +00:00
Riqwan Thamir
fa88c3e251
feat(core): Write finish_setup credentials into node tools (no-changelog) (#41219)
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-10-16 08:49:51 +00:00
Dominik
8120328661
fix(editor): Rename Admin Panel to Cloud console (#41187) 2026-10-16 08:38:56 +00:00
Ricardo Espinoza
1ee29b2875
fix(editor): Lock the skill scope for users who cannot delete the skill (no-changelog) (#41221) 2026-10-16 08:28:41 +00:00
Ricardo Espinoza
f553331100
fix(editor): Keep the builder skill modal open on a taken name (no-changelog) (#41227) 2026-10-16 08:28:19 +00:00
Ricardo Espinoza
1a6b6a65d4
feat(editor): Name the project in the skill "available to" options (no-changelog) (#41229) 2026-10-16 08:27:34 +00:00
Ricardo Espinoza
88a2426947
fix(core): Trim skill names and refuse a name of only spaces (no-changelog) (#41223) 2026-10-16 08:18:55 +00:00
n8n-assistant[bot]
f5febab84d
chore: Update e2e impact map (#41245)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-16 08:18:15 +00:00
Ricardo Espinoza
dde9871497
feat(editor): Link to the skills settings page from the agent skill picker (no-changelog) (#41228) 2026-10-16 08:18:13 +00:00
Bernhard Wittmann
cc83b5bd77
feat(core): Use the agent's icon in the Microsoft Teams app package (no-changelog) (#40322) 2026-10-16 08:14:01 +00:00
Guillaume Jacquart
1ea18e9ef9
feat(editor): Show policy-blocked items in the source control pull modal (#40604)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-16 08:04:25 +00:00
n8n-cat-bot[bot]
1ba56b6579
chore: Bug - Credentials sharing tab placeholder text misleading (#41239)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
Co-authored-by: kgrhartlage <kai.hartlage@n8n.io>
2026-10-16 07:47:39 +00:00
Jaakko Husso
baa38dbdc6
feat(core): Add owned-session queries to the Agents thread repositories (no-changelog) (#40615)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 07:45:16 +00:00
Jaakko Husso
601f6ac0da
feat(editor): Let the Agents chat host render host events by placement (no-changelog) (#40720)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 07:40:56 +00:00
OrdoAbChao
e29c3a4085
fix(Splunk Node): Preserve errors when continuing after failed items (#40368) 2026-10-16 07:35:28 +00:00
Jaakko Husso
447fc866bb
feat(core): Add hidden turns, turn options and a system kind to the Agents queue (no-changelog) (#40614)
Some checks failed
CI: Master (Build, Test, Lint) / Build & format (push) Has been cancelled
CI: Master (Build, Test, Lint) / Unit tests (24.18.1) (push) Has been cancelled
CI: Master (Build, Test, Lint) / Unit tests (26.5.1) (push) Has been cancelled
CI: Master (Build, Test, Lint) / Lint (push) Has been cancelled
CI: Master (Build, Test, Lint) / Verify single-instance deps (npm-install) (push) Has been cancelled
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Has been cancelled
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:25:36 +00:00
Ricardo Espinoza
860f1273eb
feat(editor): Add the Skills page to Context settings (no-changelog) (#41031) 2026-10-15 15:35:20 +00:00
Jan Kalkan
deed9a2f32
feat(core): Report credentials created with partial package data separately (no-changelog) (#41156)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 15:29:25 +00:00
nvonahsen
a32c652c09
fix(editor): Prevent doubled base path when opening folders with N8N_PATH set (#33065)
Signed-off-by: Niclas von Ahsen <niclas.vonahsen@elementx.ai>
Signed-off-by: James Gee <1285296+geemanjs@users.noreply.github.com>
Co-authored-by: James Gee <1285296+geemanjs@users.noreply.github.com>
2026-10-15 15:25:39 +00:00
Ricardo Espinoza
1903d53bc0
fix(editor): Save only the OpenTelemetry status when enabling or disabling (#41142) 2026-10-15 14:43:53 +00:00
n8n-cat-bot[bot]
131e9c8679
fix: Keep free-floating sticky notes clear of workflow nodes (#41195)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-15 14:41:40 +00:00
Bernhard Wittmann
236220b248
fix(Email Trigger (IMAP) Node): Find new mail on servers with a broken IMAP4rev2 mode (#41018) 2026-10-15 14:33:49 +00:00
Toni Devine
af0202d840
feat(editor): Rework the WhatsApp channel setup to match the new design (#40923)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:33:41 +00:00
yehorkardash
adc6d35388
feat: Update Slack Bot to n8n rebrand (no-changelog) (#41203) 2026-10-15 14:25:48 +00:00
Svetoslav Dekov
b2b2a8641a
feat(editor): Attach skills hub skills from a picker in the agent builder (no-changelog) (#41104)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 14:14:18 +00:00
James Martin
952b1e73b2
fix(core): Display an error message when failing to connect to oauth credentials (#41058) 2026-10-15 14:03:47 +00:00
Anne Aguirre
f596162dc7
fix(core): Close agent after run when invoked from workflow (#41128) 2026-10-15 13:44:45 +00:00
MHMD
378847ae1e
refactor(core): Share the inbound admission steps between protected-resource surfaces (#41162) 2026-10-15 13:32:58 +00:00
n8n-cat-bot[bot]
9e3b52cbbb
fix: Restore command bar focus and standardize creation icons (#41185)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-15 12:58:16 +00:00
Checo
054288e488
fix(GitlabTrigger): use NodeApiError.httpCode and safe description access in webhook checkExists (#35486)
Signed-off-by: sergioperezcheco <checo520@outlook.com>
2026-10-15 12:53:34 +00:00
Mike Repeć
c839d6cd49
fix(core): Remove unused N8N_SCHEDULER_MIN_INTERVAL setting (#41194) 2026-10-15 12:29:35 +00:00
Nour Alhadi Mahmoud
154cd63bbc
feat(editor): Add GitLab promotion connector setup (no-changelog) (#41019) 2026-10-15 11:58:24 +00:00
Ricardo Espinoza
3c447b42a7
fix(core): Key each OAuth authorization request to its own session (#39930)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-10-15 11:43:45 +00:00
Yen Su
1659fa3737
feat(Databricks Node): Refuse the Vector Store metadata filter on non-standard endpoints (no-changelog) (#41047) 2026-10-15 11:18:08 +00:00
Luigi Gubello
9806798e89
chore: Update @langchain/langgraph to 1.4.21 (#40680)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 11:14:29 +00:00
Charlie Kolb
cdeb405948
refactor(core): Extract Workflow Builder session persistence into a backend module (#41075) 2026-10-15 10:56:13 +00:00
Dimitri Lavrenük
e45a65a9bf
fix(core): Improve base URL check for declarative nodes (#40778) 2026-10-15 10:51:15 +00:00
Charlie Kolb
b68bd3129b
refactor(core): Move auth registries and OAuth proxies into shared packages (#41088) 2026-10-15 10:32:13 +00:00
Lukas
e8ded61fe1
build: Update eslint-plugin-n8n-nodes-base to 2.0.0 for ESLint 10 (#38653)
Co-authored-by: Bernhard Wittmann <bernhard.wittmann@n8n.io>
2026-10-15 10:28:37 +00:00
Bernhard Wittmann
d046047dd0
feat(editor): Update the Microsoft Teams setup copy and give both flows a Done step (no-changelog) (#41010) 2026-10-15 10:10:06 +00:00
Srinjoy
f483ebd9d1
fix(MCP Trigger Node): Pass through MCP content arrays instead of double-wrapping tool results (#39131) 2026-10-15 10:08:42 +00:00
Luigi Gubello
fddef57734
chore: Update toml to 4.2.0 (#40672)
Some checks failed
CI: Master (Build, Test, Lint) / Build & format (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (24.18.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (26.5.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Lint (push) Waiting to run
CI: Master (Build, Test, Lint) / Verify single-instance deps (npm-install) (push) Waiting to run
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Blocked by required conditions
Build: Benchmark Image / build (push) Has been cancelled
Util: Publish API Schema / Cloudflare Pages (push) Has been cancelled
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 09:34:39 +00:00
Sebastien Powell
ba97e46afc
fix(editor): Cleanup legacy button variants (#41175) 2026-10-15 09:31:34 +00:00
Anne Aguirre
4cb7a6ee3d
fix(core): Clear agent runtime cache when credential is updated (#40961) 2026-10-15 09:26:22 +00:00
Luigi Gubello
8ed8607a52
chore: Update simple-git to 4.0.2 (#40675)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 09:24:16 +00:00
Yen Su
67c1981f2f
fix(core): Let LLM failed-attempt handling retry and honour Retry-After (#41002) 2026-10-15 09:13:44 +00:00
Luigi Gubello
a8880cb449
chore: Update pdfjs-dist to 6.3.289 (#40677)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 09:13:43 +00:00
Stephen Wright
d411a44be0
feat(Databricks Node): Add the Lakebase Insert operation (no-changelog) (#40520) 2026-10-15 09:12:26 +00:00
Ricardo Espinoza
0c0b38e3cb
feat(core): Turn the skills hub on with an environment variable instead of a PostHog flag (no-changelog) (#41143) 2026-10-15 08:59:25 +00:00
Mayank SIngh
315e0a5377
fix(Convert to File Node): Decode data URIs and validate Base64 input (#38554)
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-10-15 08:57:21 +00:00
Gigi
efd4e21aad
fix(core): Evict idle mcp-browser sessions to prevent connection leak (#36850)
Signed-off-by: Luigi Colluto <luigicolluto2006@gmail.com>
2026-10-15 08:56:27 +00:00
Jaakko Husso
bab83634ce
perf(core): Reuse the prebaked runtime skills bundle in the sandbox (no-changelog) (#41027)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 08:35:34 +00:00
n8n-assistant[bot]
d6c9b9fba3
chore: Update e2e impact map (#41163)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-15 08:18:58 +00:00
Luigi Gubello
b36befcb75
chore: Update nodemailer to 10.0.14 (#40674)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 08:09:12 +00:00
Charlie Kolb
ed2500ffb2
refactor(core): Move feature provider proxies into backend services (#41087) 2026-10-15 08:00:25 +00:00
n8n-cat-bot[bot]
9c0b546a30
chore: Bug - Delete project confirmation dialog button misaligned (#41160)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-15 07:54:00 +00:00
Charlie Kolb
07595a0007
ci: Respect pnpm workspace exclusions in dependency verifier (#41159) 2026-10-15 07:48:25 +00:00
Nour Alhadi Mahmoud
1e67d0315d
feat(API): Add GitLab promotion repository and branch discovery (no-changelog) (#40788) 2026-10-15 07:15:40 +00:00
Charlie Kolb
338b0ca3fd
refactor(core): Move published workflow data into backend services (#41086) 2026-10-15 07:13:46 +00:00
Jaakko Husso
48edbef643
fix(core): Keep Observer detail lines instead of discarding the response (#41134)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 07:13:19 +00:00
Charlie Kolb
5d79c16f51
test(core): Stabilize transport timeout test (#41150) 2026-10-15 07:03:20 +00:00
Theodore Nastos
40094e363b
chore: Assign policy and OpenTelemetry code to Governance & Observability in OWNERS (no-changelog) (#41050) 2026-10-15 06:30:12 +00:00
Alex Antoniuk
e2529a8494
perf(editor): Load prettier only when the user formats code (#41014)
Some checks are pending
CI: Master (Build, Test, Lint) / Build & format (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (24.18.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Unit tests (26.5.1) (push) Waiting to run
CI: Master (Build, Test, Lint) / Lint (push) Waiting to run
CI: Master (Build, Test, Lint) / Verify single-instance deps (npm-install) (push) Waiting to run
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Blocked by required conditions
2026-10-14 21:48:42 +00:00
Raúl Gómez Morales
50c4ced224
fix(core): Keep pending setup for nodes that n8n Assistant added in an earlier build (#41070) 2026-10-14 16:52:18 +00:00
Bernhard Wittmann
b7a5500d16
feat(editor): Align the Microsoft Teams channel settings with the new design (no-changelog) (#41054) 2026-10-14 16:52:09 +00:00
Mayank SIngh
f6b24d0ae9
fix(editor): Display custom evaluation metrics correctly (#40852) 2026-10-14 16:15:34 +00:00
Raúl Gómez Morales
3c7dcf902d
feat(ai-builder): Write LangTracer results from the routing evals (no-changelog) (#40954) 2026-10-14 15:42:42 +00:00
Mike Repeć
fbe743b9df
fix(core): Charge element content for comparing array methods in native evaluation (no-changelog) (#41079) 2026-10-14 15:40:38 +00:00
Andreas Fitzek
f5924004ca
feat(core): Accept OAuth2 bearers on the public API through the trusted-source pipeline (no-changelog) (#41127)
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-14 15:34:39 +00:00
Mike Repeć
b270d48686
fix(core): Charge node reference calls against the native evaluation work budget (no-changelog) (#41080) 2026-10-14 15:19:55 +00:00
Mike Repeć
3277f8c3b5
test(core): Give node reference parity cases a slim fixture item (no-changelog) (#41081) 2026-10-14 15:19:46 +00:00
Yuliia Pominchuk
a57c8f3aba
fix(core): Redact the parent execution when a sub-workflow uses a credential the viewer cannot use (#41085)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 15:15:42 +00:00
Ricardo Espinoza
dcd312c5a9
feat(core): Copy inline agent skills into the skills hub at startup (no-changelog) (#41030)
Co-authored-by: Roman Makowiak <roman.makowiak@n8n.io>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 15:08:50 +00:00
Mike Repeć
a6d5b4de3f
test(core): Pin the quickjs nested -0 conversion in native evaluation parity (no-changelog) (#41092) 2026-10-14 15:04:02 +00:00
Temo
3968a60bf7
fix(ERPNext Node): Return each row once and tolerate empty Get Many options (#36860) 2026-10-14 14:51:43 +00:00
Theodore Nastos
17fb3c0e17
docs(API): Label type availability policy endpoints as Preview (no-changelog) (#41101) 2026-10-14 14:26:59 +00:00
Nikhil Kuriakose
b965e90307
test: Move Adore-owned specs to Knowledge and retire the Adore owner (#40933)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-10-14 14:18:23 +00:00
Bernhard Wittmann
38135e1f83
feat: Read files attached in Microsoft Teams channels and group chats (no-changelog) (#41001) 2026-10-14 13:51:02 +00:00
Anne Aguirre
616062487a
feat(editor): Show agent personalisation icon in subagent modal (#41094) 2026-10-14 13:47:36 +00:00
Mike Repeć
1950434a27
fix(core): Create an XML parser for each webhook request body (#41098) 2026-10-14 13:42:48 +00:00
Anne Aguirre
b3e8b7d9ce
fix(editor): Use the deployment name on the Az Foundry path (#41103) 2026-10-14 13:35:40 +00:00
Jaakko Husso
56eac665c3
fix(core): Make the Assistant check the n8n side before it names a failure cause (no-changelog) (#41097)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:26:37 +00:00
Luigi Gubello
8bc7161ab1
feat(editor): Compare the QuickJS expression engine with legacy behind a flag (no-changelog) (#40496)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:24:09 +00:00
Uddish Verma
57e26feda4
feat(API): Add the Public API rate limit environment variables (no-changelog) (#41003)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:21:34 +00:00
n8n-cat-bot[bot]
9c42a76b1a
test: Stabilize user select email-filtering tests (#41095)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-14 13:17:45 +00:00
Irénée
ae374e79ab
feat(core): Add a credential conflict policy to package import (no-changelog) (#40963)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 13:11:32 +00:00
n8n-cat-bot[bot]
ef8d61bda7
fix(API): Check scope version when replacing policy attachments (no-changelog) (#40964)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-14 13:06:15 +00:00
Ilfat Mindubaev
caeaff7230
feat(editor): Show the model that answered in the AI log header (#40988)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:58:13 +00:00
Johannes Nicolai
a3f47117cf
fix(OpenAI Node): Report token usage for image operations (#38463)
Co-authored-by: Claude <noreply@anthropic.com>
2026-10-14 12:56:44 +00:00
Toni Devine
9a524e7c21
feat(core): Add WhatsApp credential check and webhook handshake status (#40921)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:48:31 +00:00
Toni Devine
adedbbf560
feat(core): Add typing indicator, media download and media retention … (#40920)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:48:20 +00:00
Bernhard Wittmann
4eb63d6f41
feat: Update Browser Use extension to n8n rebrand (no-changelog) (#41096) 2026-10-14 12:38:28 +00:00
Charlie Kolb
b6d39e2d30
refactor(core): Move JWT support into backend services (#41089) 2026-10-14 12:10:59 +00:00
Sam Wooler
7920e6cf6b
refactor(API): Retire the express-openapi-validator stack from the Public API (no-changelog) (#40801)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:07:18 +00:00
Charlie Kolb
76c43094cd
refactor(core): Extract Quick Connect into a backend package (#41076) 2026-10-14 12:04:16 +00:00
Jaakko Husso
898701b05b
fix(core): Skip resource mapper validation when the mapped value is null (#41069)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:00:20 +00:00
Kai
f63111202f
fix(core): Confirm project deletions before instance apply (#40941) 2026-10-14 11:50:52 +00:00
Mike Repeć
633eacaae6
fix(editor): Use an outline button for bulk notify in the migration report (no-changelog) (#41084) 2026-10-14 11:29:29 +00:00
José Braulio González Valido
1b0cdd5998
fix(ai-builder): Report eval helper model failures as infrastructure, not as bad JSON (no-changelog) (#40415)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 11:23:25 +00:00
Raúl Gómez Morales
578eea403d
fix(core): Stop asking to set up a node when n8n Assistant only adds a step next to it (#41067) 2026-10-14 11:20:43 +00:00
José Braulio González Valido
7c38974070
fix(ai-builder): Keep eval mock notes to data, not response layouts (no-changelog) (#40818)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:20:06 +00:00
Mike Repeć
d68ad7e97b
feat(core): Evaluate pure expression extensions in native expression evaluation (no-changelog) (#40865) 2026-10-14 10:49:37 +00:00
Declan Carroll
0650b9cce0
refactor: Move idle memory baselines to efficiency (#41037) 2026-10-14 10:32:11 +00:00
Mike Repeć
df7b3a19c6
fix(editor): Use outline buttons for secondary actions in the migration report (no-changelog) (#41072) 2026-10-14 10:28:04 +00:00
Mike Repeć
de42c9515d
feat(editor): Let admins notify workflow owners in bulk from the migration rule detail (#41060) 2026-10-14 10:26:05 +00:00
Jaakko Husso
d26f914e3d
fix(editor): Cancel the Assistant thread when the hand-off navigation fails (#41056)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:12:32 +00:00
Johannes Nicolai
8b5ea6d9e0
fix(editor): Stop auto-selecting the Evaluation Trigger over other triggers (#38883)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Bernhard Wittmann <bernhard.wittmann@n8n.io>
2026-10-14 09:57:23 +00:00
Charlie Kolb
bfd4885026
ci: Automate get-n8n fallback version updates (#40973) 2026-10-14 09:53:55 +00:00
Stephen Wright
3800bce812
feat(Text Classifier Node): Add opt-in confidence scores to the output (#40743) 2026-10-14 09:42:05 +00:00
Mike Repeć
aae8eb63d7
docs: Add env-var-docs skill for JSDoc on @Env config properties (#41053) 2026-10-14 09:19:42 +00:00
Mutasem Aldmour
0b4c99f10d
fix(core): Pick output schemas by parameter value for Gmail and Notion (no-changelog) (#40757)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 09:11:49 +00:00
n8n-cat-bot[bot]
066480d8db
fix: Check provisioning license on Users settings page (#41048)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-14 08:59:23 +00:00
Florian Gareis
b8780d8fee
fix(HomeAssistant Node): Only sent Home Assistant attributes on upsert if set (#36298) 2026-10-14 08:58:22 +00:00
Anne Aguirre
e47940eecd
feat(editor): Publish agent modal and modal for warning about unpublished workflows (#40987)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 08:47:05 +00:00
Jaakko Husso
e3b2603d7b
chore(core): Remove activation-capped AI Assistant trial variant (no-changelog) (#41036)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 08:21:20 +00:00
Jaakko Husso
726a5829c8
fix(core): Use the module registry to decide if the Assistant has the Agents features (#41026)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 08:19:48 +00:00
n8n-assistant[bot]
54f1670791
chore: Update e2e impact map (#41051)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-10-14 08:18:31 +00:00
Jan
b3e8634c83
fix(editor): Apply the standard settings layout to the Context preferences page (#40716)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-14 08:02:30 +00:00
Rick Gale
1643a8598b
chore: Assign evaluation code to the AI Trust team (no-changelog) (#40918)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-10-14 08:01:17 +00:00
Anne Aguirre
9498088256
feat(core): Apply budget alerts and stops to sub-agent run (#40884)
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-10-14 07:56:27 +00:00
Yuliia Pominchuk
da3491fc87
feat(editor): Link to the credential sharing tab when execution data is redacted (#40976) 2026-10-14 07:48:34 +00:00
Yen Su
d83f95b377
fix(Databricks Node): Mark the MLflow tool span ERROR when the tool returned an error string (no-changelog) (#40990) 2026-10-14 07:27:56 +00:00
n8n-assistant[bot]
46761a60a9
chore: Bundle/2.x (#41035)
Co-authored-by: Matsu <matias.huhta@n8n.io>
Co-authored-by: Bernhard Wittmann <bernhard.wittmann@n8n.io>
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Elias Meire <elias@meire.dev>
Co-authored-by: n8n-assistant[bot] <n8n-assistant[bot]@users.noreply.github.com>
Co-authored-by: João Almeida <jg.almeida56@gmail.com>
Co-authored-by: Savelii <savelii.sychov@n8n.io>
Co-authored-by: Rick Gale <richardgale90@gmail.com>
Co-authored-by: Emilia <100027345+sovietspaceship@users.noreply.github.com>
Co-authored-by: oleg <me@olegivaniv.com>
Co-authored-by: RomanDavydchuk <roman.davydchuk@n8n.io>
Co-authored-by: Stephen Wright <sjw948@gmail.com>
Co-authored-by: Yuliia Pominchuk <31064937+yuliia-pominchuk@users.noreply.github.com>
Co-authored-by: Shireen Missi <94372015+ShireenMissi@users.noreply.github.com>
Co-authored-by: Miguel Ángel Moreno <1411774+miguelsaddress@users.noreply.github.com>
Co-authored-by: Anne Aguirre <anne.aguirre@n8n.io>
Co-authored-by: Dimitri Lavrenük <20122620+dlavrenuek@users.noreply.github.com>
Co-authored-by: Kai <kai.hartlage@n8n.io>
Co-authored-by: Luigi Gubello <27034386+luigigubello@users.noreply.github.com>
Co-authored-by: Danny Martini <danny@n8n.io>
Co-authored-by: MHMD <45968454+dou-mhmd@users.noreply.github.com>
Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: Charlie Kolb <charlie@n8n.io>
2026-10-14 06:33:56 +00:00
Bernhard Wittmann
ccf42e3213
fix(ai-builder): Make browser credential-setup evals grade the right thing (no-changelog) (#40858) 2026-10-14 06:24:28 +00:00
Svetoslav Dekov
94bdf85a8a
feat(core): Switch agent skills to the skills hub (no-changelog) (#40860)
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>
Co-authored-by: Roman Makowiak <roman.makowiak@n8n.io>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 00:12:36 +00:00
José Braulio González Valido
29de1c63ae
fix(ai-builder): Remove the Context7 docs lookup from the eval mock (no-changelog) (#40021)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 21:30:08 +00:00
José Braulio González Valido
92f8eb51b3
chore(Message an Agent Node): Add output schemas (no-changelog) (#40821)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:29:33 +00:00
José Braulio González Valido
146d7804af
fix(ai-builder): Count eval runs that read another build's workflow as framework issues (no-changelog) (#40717)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 21:29:00 +00:00
José Braulio González Valido
88de3cac20
feat(ai-builder): Move eval judges to Sonnet 5.5 and add per-role eval LLM settings (no-changelog) (#40330)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 21:28:25 +00:00
Roman Makowiak
04f4afe3dc
feat(core): Add skills repository, service and REST API (no-changelog) (#40653)
Co-authored-by: Ricardo Espinoza <ricardo@n8n.io>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 20:28:55 +00:00
Nikhil Kuriakose
6924027e93
test: Move Adore-owned specs for Context features to Context (#40932)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-10-13 19:41:28 +00:00
Nikhil Kuriakose
ef183e632d
test: Move Adore-owned specs for the updates panel to Cloud Growth (#40931)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-10-13 19:41:27 +00:00
Nikhil Kuriakose
ed1c1e561a
test: Move Adore-owned specs for node features to NODES (#40930)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-10-13 19:41:27 +00:00
Nikhil Kuriakose
a3a014422f
test: Move Adore-owned specs for Catalysts features to Catalysts (#40929)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-10-13 19:41:26 +00:00
Ricardo Espinoza
f1fecf97e9
feat(core): Add skills hub tables (no-changelog) (#40464) 2026-10-13 19:03:23 +00:00
Andreas Fitzek
5da4d19e50
feat(core): Add the trusted sources management API (no-changelog) (#40975)
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-13 18:24:34 +00:00
Uddish Verma
2019ea5593
feat(API): Expose the API key ID on the token grant (no-changelog) (#40986)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 18:16:50 +00:00
Guillaume Jacquart
4419fc4ba2
feat(core): Add the blocking project and opt-in state to policy violations (#40985)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 17:49:51 +00:00
yehorkardash
52aed7ac97
fix(Execute Command Node): Don't spawn console on Windows (#40909) 2026-10-13 16:07:56 +00:00
n8n-cat-bot[bot]
1d2c879fab
fix: Pass structured inputs to OpenAI Responses tools (#40638)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-13 16:07:14 +00:00
Rob Hough
bffe7d8392
feat(editor): Update UI with n8n rebrand (#40342)
Co-authored-by: Bob Hough <15361982+heymynameisrob@users.noreply.github.com>
Co-authored-by: linear-code[bot] <222613912+linear-code[bot]@users.noreply.github.com>
Co-authored-by: Sebastien Powell <sebpowell@users.noreply.github.com>
Co-authored-by: Tuukka Kantola <tuukka@n8n.io>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:06:30 +00:00
n8n-cat-bot[bot]
d245b17b89
fix: Allow skipping table initialization (#40437)
Co-authored-by: n8n-cat-bot[bot] <n8n-cat-bot[bot]@users.noreply.github.com>
2026-10-13 16:03:37 +00:00
daniel-hai
8977833ee2
feat(Monday.com Node): Add V2 with full V1 parity as the default (#35515)
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Stephen Wright <sjw948@gmail.com>
2026-10-13 15:53:55 +00:00
Alexander Gekov
acf5291d80
feat: Show Gemini models by name and list prioritized models first in model pickers (#40965)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-10-13 15:41:36 +00:00
Rob Hough
ebf078b64c
fix(editor): Restore the new session shortcut in agent chat (#40907)
Co-authored-by: Bob Hough <15361982+heymynameisrob@users.noreply.github.com>
Co-authored-by: linear-code[bot] <222613912+linear-code[bot]@users.noreply.github.com>
2026-10-13 15:29:20 +00:00
Charlie Kolb
9052f8ff3e
test(editor): Reduce publish timeline paging test work (#40993) 2026-10-13 15:05:18 +00:00
Kai
e0fe04084e
fix(core): Allow project promotion without an instance export (#40939) 2026-10-13 14:31:19 +00:00
Yen Su
e859abaf18
fix(Databricks Node): Bring the AI Agent panel to parity with AI Agent 2.2 (#40989) 2026-10-13 14:10:45 +00:00
Mike Repeć
a972eebe51
feat(editor): Let admins notify workflow owners from the migration rule detail (#40949) 2026-10-13 13:57:26 +00:00
yehorkardash
739c59e991
feat(core): Implement automated migrations for removed nodes (#40877) 2026-10-13 13:45:24 +00:00
Mike Repeć
de090cb2a0
feat(core): Evaluate primitive reads off $now and $today natively (no-changelog) (#40945) 2026-10-13 13:31:32 +00:00
MHMD
b97fe7c7d4
fix(core): Hide personal credentials from agents until they are fully supported (no-changelog) (#40789) 2026-10-13 13:31:17 +00:00
Riqwan Thamir
38e4aebfc8
perf(core): Reduce Agent Builder round trips in an initial build (no-changelog) (#40719)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 13:29:11 +00:00
Mike Repeć
d8a06666da
feat(core): Add an endpoint that notifies workflow owners about migration findings (#40952) 2026-10-13 13:07:59 +00:00
Bernhard Wittmann
60e0cb1e7b
feat(core): Publish the Microsoft Teams app to the organisation (no-changelog) (#40697)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-13 13:01:48 +00:00
Rup Sarmah
b09efb706c
fix(core): Handle every escaped closing bracket in an expression (#40487) 2026-10-13 12:58:10 +00:00
Tomi Turtiainen
f090f53480
refactor(core): Select CLI start trigger for workflow runs (#40375)
Co-authored-by: Danny Martini <danny@n8n.io>
2026-10-13 12:35:36 +00:00
Mike Repeć
347385b07b
feat(core): Treat notified migration findings as unresolved (#40951) 2026-10-13 12:19:30 +00:00
Guillaume Jacquart
bb45bca5ff
feat(editor): Show the policy reason when an agent tool call is refused (#40673)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 12:19:29 +00:00
Sam Wooler
3075b60576
fix(API): Apply projectId filter to executions for member API keys (#40887)
Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
2026-10-13 12:03:20 +00:00
Sam Wooler
4fcb628fca
refactor(API): Migrate n8n-packages export endpoint to PublicApiController (no-changelog) (#40756)
Some checks failed
Build: Benchmark Image / build (push) Has been cancelled
CI: Master (Build, Test, Lint) / Build & format (push) Has been cancelled
CI: Master (Build, Test, Lint) / Unit tests (24.18.1) (push) Has been cancelled
CI: Master (Build, Test, Lint) / Unit tests (26.5.1) (push) Has been cancelled
CI: Master (Build, Test, Lint) / Lint (push) Has been cancelled
CI: Master (Build, Test, Lint) / Verify single-instance deps (npm-install) (push) Has been cancelled
Util: Publish API Schema / Cloudflare Pages (push) Has been cancelled
CI: Master (Build, Test, Lint) / Notify Slack on failure (push) Has been cancelled
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:56:11 +00:00
Bernhard Wittmann
1ee379898b
feat(core): Add the recommended Microsoft Teams channel setup (no-changelog) (#40696)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-13 11:55:56 +00:00
Lorent Lempereur
366ed6ed0e
refactor(core): Declare system tasks with a typed schedule and target (no-changelog) (#40703) 2026-10-13 11:42:37 +00:00
Anne Aguirre
248c86355b
fix(core): Describe MCP servers only from user or registry text in Agent Builder (#40974) 2026-10-13 11:19:46 +00:00
Stephen Wright
e5866ac6c1
feat(Kafka Node): Make version 2 the default for new Kafka nodes and triggers (#40744) 2026-10-13 11:07:10 +00:00
Jaakko Husso
2bc3265e63
perf(ai-builder): Trust a matching prebaked bundle manifest in the sandbox (no-changelog) (#40820)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:04:18 +00:00
Lorent Lempereur
f6861fe494
feat(core): Enable the durable scheduler by default (#40891)
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-10-13 10:47:35 +00:00
Anne Aguirre
632d8b9eb0
feat(editor): Update budget panel when agent executes (#40971)
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-10-13 10:44:26 +00:00
Declan Carroll
5549374241
chore: Upgrade agent harness to 0.6.0 (no-changelog) (#40967) 2026-10-13 10:28:40 +00:00
Alex Grozav
cba16247b9
feat(editor): Open the migration workflow from its name (no-changelog) (#40895)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 10:24:15 +00:00
Alex Grozav
e528f948ce
fix(editor): Use full width for the migration rule header (no-changelog) (#40890)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 10:24:02 +00:00
James Gee
d3bc2754b4
feat(core): Add create-with-values credential missing mode to package import (#36767) 2026-10-13 10:21:33 +00:00
Jaakko Husso
ffda639b3f
fix(editor): Show follow-up run events in the Assistant after a reconnect (#40883)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 10:12:33 +00:00
Declan Carroll
97e5ae56e4
test: Add Dive checks and reusable Playwright CLI fixtures (#40831) 2026-10-13 10:02:00 +00:00
yehorkardash
bda9118168
feat: Overhaul MCP tool permissions for Agents (#39878)
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-10-13 09:54:46 +00:00
Csaba Tuncsik
96eff1efb9
fix(core): Reflect failed publications in the active workflows endpoints (#40641) 2026-10-13 09:49:33 +00:00
Guillaume Jacquart
eb66e1bde0
docs(API): Mark type availability policy endpoints as beta (#40959)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 09:04:12 +00:00
Tomi Turtiainen
a8a028e2dc
docs: Clarify primary key selection order in migration skill (#40958)
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-10-13 09:03:31 +00:00
Yen Su
44c8a312c3
feat(core): Append node tool attributions to agent replies and add Genie attribution and deep links to the Databricks node (#40765) 2026-10-13 08:42:57 +00:00
Declan Carroll
7bad46ee7e
chore: Upgrade agent harness to 0.5.1 (no-changelog) (#40956) 2026-10-13 08:34:04 +00:00
Veljko Terzic
45eea1bc35
feat(core): Remove the startup pass from workflow history compaction (#40886) 2026-10-13 08:02:51 +00:00
Stephen Wright
c8c8c3a81e
feat(Databricks Node): Add the Lakebase Get Many operation (no-changelog) (#40508) 2026-10-13 07:52:26 +00:00
Florian Gößler
e74f1c19da
fix(core): Log custom data truncation only above the 512-character limit (#40899)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-13 07:49:13 +00:00
Alex Grozav
f16c1375b1
feat(editor): Add bulk migration to the migration rule detail (no-changelog) (#40896)
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 07:48:53 +00:00
n8n-release-tag-merge[bot]
5146e3960f Merge tag 'n8n@2.44.0' 2026-10-13 07:44:08 +00:00
Yen Su
14c77900df
fix(Databricks Node): Rename Genie resource labels to Genie Agent and the MCP tile to Databricks Genie One (#40760) 2026-10-13 07:21:37 +00:00
Mike Repeć
f3e2bd83b3
feat(core): Suspend in-flight production executions at worker shutdown (#40568) 2026-10-13 07:04:07 +00:00
3618 changed files with 150428 additions and 28951 deletions

View File

@ -110,6 +110,7 @@ Run through this before requesting review. Each item is a real, recurring review
- [ ] Identifiers go through **`escape.tableName(...)` / `escape.columnName(...)`**. Never hand-write `n8n_table` prefixes. — [Always escape identifiers](#always-escape-identifiers) - [ ] Identifiers go through **`escape.tableName(...)` / `escape.columnName(...)`**. Never hand-write `n8n_table` prefixes. — [Always escape identifiers](#always-escape-identifiers)
- [ ] **Match column type to value semantics.** Native `uuid` for UUIDs, `timestampTimezone()` for timestamps, a numeric type for numbers, `bool` for booleans, `json` for structured data. Never `varchar` as a catch-all. — [Column types](#column-types) - [ ] **Match column type to value semantics.** Native `uuid` for UUIDs, `timestampTimezone()` for timestamps, a numeric type for numbers, `bool` for booleans, `json` for structured data. Never `varchar` as a catch-all. — [Column types](#column-types)
- [ ] **Pick the narrowest sane type within that category:** `int`/`smallint` not `bigint` when range allows; `text` not `varchar(255)` for unbounded strings; never `double` for version numbers. — [Column types](#column-types) - [ ] **Pick the narrowest sane type within that category:** `int`/`smallint` not `bigint` when range allows; `text` not `varchar(255)` for unbounded strings; never `double` for version numbers. — [Column types](#column-types)
- [ ] **A generated `id` key is an integer** (`int.primary.autoGenerate2`). A UUID key is a UUIDv7. For a UUID or string key, write the reason in the PR description. A join table uses its foreign-key columns as the key, not an `id` column. — [Primary Keys](#primary-keys)
- [ ] **Default `notNull`**, relax only when justified. PK is implicitly NOT NULL. Migration's `notNull` matches the entity's nullability. — [NOT NULL and entity parity](#not-null-and-entity-parity) - [ ] **Default `notNull`**, relax only when justified. PK is implicitly NOT NULL. Migration's `notNull` matches the entity's nullability. — [NOT NULL and entity parity](#not-null-and-entity-parity)
- [ ] **Enum-like columns** carry `.withEnumCheck([...])` AND `.comment('explains values')`. Opaque IDs / unix timestamps / JSON shapes also get `.comment()`. — [Constrain enum-like strings](#constrain-enum-like-strings), [Add comments on columns](#add-comments-on-columns) - [ ] **Enum-like columns** carry `.withEnumCheck([...])` AND `.comment('explains values')`. Opaque IDs / unix timestamps / JSON shapes also get `.comment()`. — [Constrain enum-like strings](#constrain-enum-like-strings), [Add comments on columns](#add-comments-on-columns)
- [ ] **Every reference column has an explicit FK** with deliberate `onDelete`. Name FKs explicitly when SQLite recreate cycles risk duplicating them. Avoid polymorphic `(typeCol, idCol)` patterns. — [Foreign Key Constraints](#foreign-key-constraints), [General Design Guidance](#general-design-guidance) - [ ] **Every reference column has an explicit FK** with deliberate `onDelete`. Name FKs explicitly when SQLite recreate cycles risk duplicating them. Avoid polymorphic `(typeCol, idCol)` patterns. — [Foreign Key Constraints](#foreign-key-constraints), [General Design Guidance](#general-design-guidance)
@ -439,11 +440,32 @@ Don't set the default of a `status` column to a terminal value — `"running"` m
### Primary Keys ### Primary Keys
Every table needs a primary key. Choose the type in this order: Every table needs a primary key. **Use an integer key by default.** Read the options below in order. Use the first option that fits. Do not skip an option only because you like a later one better.
1. **Integer** — `column('id').int.primary.autoGenerate2`. Preferred for new tables: compact, fast joins, no ordering surprises. `autoGenerate2` uses Postgres `IDENTITY` (preferred over the deprecated `serial`-based `autoGenerate`). 1. **Integer (default)** — `column('id').int.primary.autoGenerate2`. Use this for every new table. Use a different option only when one of its conditions is true. Integer keys are small and make joins fast. `autoGenerate2` uses Postgres `IDENTITY`. Do not use `autoGenerate`. It uses `serial`, which is deprecated.
2. **UUID** — `column('id').uuid.primary`. Use when IDs are generated client-side, exposed in URLs, or need to be unguessable. Generate UUIDs in application code via `randomUUID()` from `node:crypto`; do **not** chain `.autoGenerate2` on `.uuid` (the DSL throws — `DEFAULT uuid_generate_v4()` fails on managed Postgres like Supabase because it needs the `uuid-ossp` extension in `public`). Use `.uuid` instead of `.varchar(36)`. 2. **UUID** — `column('id').uuid.primary`. Use this only when one of these conditions is true:
3. **String** — `column('id').varchar(36).primary` for IDs whose format isn't a UUID (e.g. nanoid-style IDs). Convention: nanoid length 16 for entity IDs. - The application must know the ID before the insert. For example, the client makes the ID.
- The ID is in a URL or a public API. Users must not see how many rows exist or guess other IDs.
**You must use UUIDv7.** Make the ID in application code with the `uuid` package: `import { v7 as uuidv7 } from 'uuid'`.
Why: a UUIDv7 starts with a timestamp. Thus, new rows go near the end of the index. A UUIDv4 is random, for example `randomUUID()` from `node:crypto`. New rows go to random positions in the index. This splits index pages and makes the index larger.
A UUIDv7 does not give an exact creation order. Two IDs made in the same millisecond can sort in the wrong order. Clock differences between hosts can also cause this. If you need the exact order, sort by a timestamp column.
Do **not** chain `.autoGenerate2` on `.uuid`. The DSL throws an error. The database default makes a UUIDv4. Also, `uuid_generate_v4()` needs the `uuid-ossp` extension. Some managed Postgres services, such as Supabase, do not have it. Use `.uuid`, not `.varchar(36)`.
3. **String** — `column('id').varchar(36).primary`. Use this only when one of these conditions is true:
- The entity already uses IDs in a format that is not a UUID. For example, the public API or the UI already shows nanoid IDs for this entity.
- The UI shows the ID to users. A UUID is too long to read, copy, or type.
Entity IDs are usually nanoids with 16 characters.
**Give a reason for every key that is not an integer.** Write the reason in the PR description. Reviewers will ask for it. These reasons are not sufficient:
- "Other tables use string IDs."
- "This module already does it this way."
- "We might need it later."
**These options apply to a generated `id` column only.** A join table that only links other tables does not need an `id` column. Use its foreign-key columns as a composite key (see below). A foreign-key column always has the same type as the key that it refers to.
**Keep ID-column types consistent across related tables.** Mixing `uuid` and `varchar(36)` for what is "the same kind of ID" creates JOIN footguns. **Keep ID-column types consistent across related tables.** Mixing `uuid` and `varchar(36)` for what is "the same kind of ID" creates JOIN footguns.
@ -696,7 +718,7 @@ If only Postgres needs the change, just put the file in `postgresdb/`; don't wri
### Postgres-version-aware UUID generation ### Postgres-version-aware UUID generation
`gen_random_uuid()` requires Postgres ≥ 13. n8n dropped Postgres 12 — prefer it over `uuid_generate_v4()` (which needs the `uuid-ossp` extension and breaks on managed services like Supabase). For UUID PKs, generate at the application level with `randomUUID()` — see [Primary Keys](#primary-keys). `gen_random_uuid()` requires Postgres ≥ 13. n8n dropped Postgres 12 — prefer it over `uuid_generate_v4()` (which needs the `uuid-ossp` extension and breaks on managed services like Supabase). For UUID PKs, make a UUIDv7 in application code — see [Primary Keys](#primary-keys).
### SQLite doesn't enforce `varchar(N)` length ### SQLite doesn't enforce `varchar(N)` length

View File

@ -0,0 +1,158 @@
---
name: n8n:env-var-docs
description: >-
Writes and reviews the JSDoc on `@Env(...)` config properties. The docs team
extracts these comments from source into the public environment variable
reference, so they are user documentation, not code comments. Use when adding
or changing an `@Env` property, a config class, or reviewing a PR that touches
one.
---
# Environment variable docs
The JSDoc above every `@Env('...')` property is exported almost verbatim into
the [environment variables reference](https://docs.n8n.io/deploy/host-n8n/configure-n8n/basic-configuration/use-environment-variables)
on docs.n8n.io. The generated table has four columns: variable name,
description, data type, default. Your JSDoc is the description column. The
reader is a self-hosting operator, not an n8n developer.
Follow the [n8n docs style guide](https://docs.n8n.io/contribute/contribution-guide-for-n8n-docs/style-guide-for-n8n-docs)
for these comments. It overrides the ASD-STE100 rule in `AGENTS.md` for this
one case. The rules below are the parts of that guide that matter for a
one-paragraph description.
## Rules
- **Every `@Env` property has a JSDoc.** No exceptions. A missing comment
ships as an empty description cell.
- **Write for the operator.** Say what the setting does, when to change it,
and what happens when it's unset or wrong. Don't explain why the code is
written the way it is.
- **No code references.** No file names, class names, function names,
constants, license keys, or other internals the reader can't open. Values
the operator types into the variable are fine and often needed, for example
a credential type ID like `googleOAuth2Api` or a mode like `postgresdb`.
The test: would the operator paste this into a config file, or would they
need the source to know what it means? Details for developers go in a
regular `//` comment on the implementation, not in the JSDoc.
- **No attack scenarios.** Say what the setting protects, not how an
attacker would exploit it. This is a public page.
- **Don't repeat the default.** The default renders in its own column. Don't
write "Defaults to true" or "Default: 1 hour". Do say what the unset state
means when it's not obvious, for example "When unset, n8n uses the Redis
host".
- **State units and formats.** Say "in milliseconds", "in bytes", "a
comma-separated list", "a JSON object". The data type column only says
`Number` or `String`.
- **Use allowed values when the set is small.** "One of `sqlite`,
`postgresdb`." For a list, show one inline example in the sentence.
- **No JSDoc tags.** No `@example`, `@default`, `@see`, `@deprecated`. The
exporter copies the tag name into the docs. Put the example or the
deprecation notice in a sentence instead.
- **Product names:** "Gateway credits", not "n8n Connect" or "AI Gateway".
"Publish a workflow", not "activate". `n8n` is always lowercase.
- **Style:** present tense, active voice, second person. Use contractions.
No em dashes, use a comma or a new sentence. No "e.g." or "i.e.", write
"for example" and "that is". Spell out zero to nine, numerals from 10.
Values the operator types stay numerals, for example "Set to 0".
Sentence case. One idea per sentence. End every sentence with a period.
- **Plain words:** "use" not "utilize", "lets you" not "allows you to", cut
"powerful", "seamless", "simply", "it's important to note".
- **Length:** one to three sentences. If the setting needs more, the extra
belongs in a docs page the comment can't link to yet; keep the comment to
what fits a table cell.
## Examples
Bad, as found in the generated docs:
```ts
/**
* Instance-level enablement for n8n Connect (AI Gateway). Licensed instances
* are enabled by default; false opts out. Budget / free allowance still comes
* from the license (`quota:aiGatewayBudget`).
*/
```
Wrong product name, a restated default, and an internal license key. Good:
```ts
/**
* Whether Gateway credits are available on this instance. Set to false to
* turn them off on a licensed instance. The credit allowance comes from your
* license.
*/
```
Bad:
```ts
/**
* Time to live in milliseconds for Redis cache entries. Set to 0 to disable
* expiry. Default: 1 hour.
*/
```
The default is already in the table. Good:
```ts
/**
* Time to live in milliseconds for Redis cache entries. Set to 0 to keep
* entries until Redis evicts them.
*/
```
Bad:
```ts
/**
* Comma-separated list of credential types for which overwrites are skipped
* when the credential has been customized.
* @example `N8N_SKIP_CREDENTIAL_OVERWRITE=zohoOAuth2Api,salesforceOAuth2Api`
*/
```
The `@example` tag lands in the description as literal text. Good:
```ts
/**
* Comma-separated list of credential types to skip when applying credential
* overwrites, for example `zohoOAuth2Api,salesforceOAuth2Api`. n8n skips an
* overwrite only when a user has already changed one of its fields.
*/
```
Bad:
```ts
/**
* Bind OAuth credential callbacks to the browser that initiated the flow.
* When enabled, a session-scoped `n8n-oauth-binding` cookie is set on flow
* initiation and verified on callback. Defeats phishing attacks where an
* attacker injects an OAuth authorize URL into a victim's browser to land
* tokens on the attacker's credential.
*/
```
Attack narrative and an internal cookie name on a public page. Good:
```ts
/**
* Whether an OAuth credential connection must finish in the same browser
* that started it. When enabled, n8n rejects the callback if it arrives
* from a different browser.
*/
```
## Review checklist
When you review a PR that adds or changes an `@Env` property, check each
comment against this list and quote the fix in the review:
1. JSDoc present.
2. No code identifiers, file names, or internal keys.
3. No default restated.
4. Units, format, or allowed values stated.
5. No JSDoc tags.
6. No em dashes, Latin abbreviations, or filler words.
7. Reads correctly as a sentence in a table cell with no surrounding context.

View File

@ -21,8 +21,7 @@ check the code, not license to drop a team default.
## Non-negotiable rules ## Non-negotiable rules
- New endpoints are `@PublicApiController` classes under `v1/controllers/`, one - New endpoints are `@PublicApiController` classes under `v1/controllers/`, one
`*.public.controller.ts` per feature. A controller is a class — never `*.public.controller.ts` per feature.
`export =` (the legacy tuple style; `require-public-api-controller` flags it).
- Public API and internal REST are separate HTTP surfaces. A public controller - Public API and internal REST are separate HTTP surfaces. A public controller
never calls an internal controller/endpoint; both reuse the same service. never calls an internal controller/endpoint; both reuse the same service.
- Controllers and handlers delegate to a service — never import a repository or - Controllers and handlers delegate to a service — never import a repository or
@ -31,7 +30,6 @@ check the code, not license to drop a team default.
`@ApiResponse(Dto)`. `@ApiResponse(Dto)`.
- Register each controller via a side-effect import in `v1/controllers/index.ts` - Register each controller via a side-effect import in `v1/controllers/index.ts`
(`public-api-controllers.test.ts` fails otherwise). (`public-api-controllers.test.ts` fails otherwise).
- Don't add business logic to legacy `express-openapi-validator` (EOV) handlers.
- Migrating a legacy endpoint must not change its public contract. - Migrating a legacy endpoint must not change its public contract.
These are `n8n-local-rules` ESLint rules (see `packages/cli/eslint.config.mjs`) These are `n8n-local-rules` ESLint rules (see `packages/cli/eslint.config.mjs`)
@ -200,6 +198,5 @@ existing tests.
- [Test-before-save endpoints](reference.md#test-before-save-endpoints) - [Test-before-save endpoints](reference.md#test-before-save-endpoints)
- [Errors](reference.md#errors) - [Errors](reference.md#errors)
- [Testing matrix](reference.md#testing-matrix) - [Testing matrix](reference.md#testing-matrix)
- [Migrating legacy EOV endpoints](reference.md#migrating-legacy-eov-endpoints)
- [Verifying a migration](reference.md#verifying-a-migration) - [Verifying a migration](reference.md#verifying-a-migration)
- [CI and merging](reference.md#ci-and-merging) - [CI and merging](reference.md#ci-and-merging)

View File

@ -122,11 +122,10 @@ app-wide `bodyParser` before the registry sees it. Declaring
- An unknown field (one the DTO doesn't declare, on a `{ strict: true }` DTO) - An unknown field (one the DTO doesn't declare, on a `{ strict: true }` DTO)
fails with `Unexpected form field "<name>"` — not the default "unrecognized fails with `Unexpected form field "<name>"` — not the default "unrecognized
keys" wording. keys" wording.
- Multer's own parsing errors map to the same statuses express-openapi-validator - Multer parsing errors map to these statuses: `413` for a size or count limit,
used: `413` for a size/count limit, `400` for any other multer error, `500` `500` for `LIMIT_UNEXPECTED_FILE`, `400` for any other multer error, and `500`
— unmasked, since this is a `ResponseError` — for anything else (a for anything else (a malformed body). The `500` is not masked, because it is a
malformed body; a missing boundary gives `400` with `multipart file(s) `ResponseError`. A missing boundary gives `400` with `multipart file(s) required`.
required`).
- The body is parsed **after** every auth/scope/license/quota gate and - The body is parsed **after** every auth/scope/license/quota gate and
**before** controller/route middlewares — a caller those gates would reject **before** controller/route middlewares — a caller those gates would reject
never has their (possibly huge) body read off the socket, and a middleware never has their (possibly huge) body read off the socket, and a middleware
@ -175,58 +174,6 @@ example an `application/gzip` stream. The framework treats options whose
The runtime part is `sendBinaryResponse` in The runtime part is `sendBinaryResponse` in
`packages/cli/src/public-api/media-types/binary-response.ts`. `packages/cli/src/public-api/media-types/binary-response.ts`.
## Migrating legacy EOV endpoints
Legacy `express-openapi-validator` endpoints live under
`v1/handlers/`, wired through `openapi.yml` with `x-eov-operation-*` and request
types in `packages/cli/src/public-api/types.ts`. Treat these as migration targets,
not templates.
- Prefer migrating to `@PublicApiController` over extending the handler.
- Preserve the public contract: path, method, scopes, status codes, response
shape, and pagination.
- Move HTTP concerns into the controller and business orchestration into the
shared service; keep the controller a thin HTTP boundary. If the legacy
handler was itself already just a thin wrapper around an internal
`@RestController` (calling its methods directly, e.g.
`Container.get(SomeController).createThing(req, res, payload)`), the new
public controller can call that same internal controller directly — no need
to duplicate its validation/business logic.
- A route must be served by either the EOV handler or a controller, not both —
the build's `mergeDecoratorDocument` (`v1/openapi-gen/generate.ts`) throws on
a path+method declared by both sides. Remove the legacy wiring (its path's
`$ref` entry in `openapi.yml`, the `x-eov-operation-*` handler, and its
`handler.ts`) only after the new controller is registered, `pnpm build`
regenerates the spec cleanly, and tests are updated.
- Fully delete the migrated legacy files: the handler's `.ts`, its
`spec/paths/*.yml` and `spec/schemas/*.yml`, and any now-dead request type
in `packages/cli/src/public-api/types.ts`. Then check
`v1/shared/spec/schemas/_index.yml` and `v1/shared/spec/parameters/_index.yml`
for entries that `$ref` one of the deleted schema/parameter files — those are
separate from the path's own `$ref` in `openapi.yml` and are easy to miss;
left dangling, the next bundle fails on a broken `$ref`.
- If the legacy handler gated on a license (`isLicensed('feat:x')` middleware),
`@Licensed('feat:x')` now replicates that for a controller route (see the
decorator table in [SKILL.md](SKILL.md#declaring-a-controller)) — but only for
a single feature. If the legacy check was an any-of/all-of over several flags
(e.g. `LicenseState.isProvisioningLicensed()`), `@Licensed` can't express
that; replicate it manually in the controller instead, don't drop it - this
is exactly what the internal `provisioning.controller.ee.ts` and
`role-mapping-rule.controller.ee.ts` already do, since neither uses
`@Licensed` for that reason.
- As a legacy file drops repository access / the `export =` tuple, remove its
entry from the `off` allowlists for `no-repository-in-public-api-handler` and
`require-public-api-controller` in `packages/cli/eslint.config.mjs` (shrink-only
— never extend them).
- A `multipart/form-data` legacy endpoint migrates onto `@Body({ mediaType:
'multipart/form-data', uploadLimits })` — see
[Request body media types](#request-body-media-types). For any other
non-standard endpoint, study the nearest existing handler first.
- Keep each field in its original position when you extract a request shape shared
by two routes, and destructure out the ones a route doesn't take. The generator
emits properties in shape order, so a moved field rewrites the `*.generated.yml`
of a route the PR wasn't changing.
## Verifying a migration ## Verifying a migration
Tests are written against the new code, so they can't show that the old behavior Tests are written against the new code, so they can't show that the old behavior

View File

@ -0,0 +1 @@
../../../../.agents/skills/env-var-docs

View File

@ -85,6 +85,7 @@ return 'blacksmith';
| Accessibility buckets | `packages/quality/testing/playwright/reporters/a11y-reporter.ts` | Per-bucket axe score, violated rules, violating elements | | Accessibility buckets | `packages/quality/testing/playwright/reporters/a11y-reporter.ts` | Per-bucket axe score, violated rules, violating elements |
| Build stats | `.github/scripts/send-build-stats.mjs` | Per-package build duration, cache hit/miss, run total | | Build stats | `.github/scripts/send-build-stats.mjs` | Per-package build duration, cache hit/miss, run total |
| Docker stats | `.github/scripts/send-docker-stats.mjs` | Image size per platform, docker build duration | | Docker stats | `.github/scripts/send-docker-stats.mjs` | Image size per platform, docker build duration |
| Dive image efficiency | `packages/quality/efficiency/images/image-efficiency.spec.ts` | Layer content size, estimated waste, efficiency score, and layer count through the shared Playwright reporter |
| Container stack | `packages/quality/environments/containers/telemetry.ts` | E2E stack startup times per service | | Container stack | `packages/quality/environments/containers/telemetry.ts` | E2E stack startup times per service |
## Secrets ## Secrets

View File

@ -411,6 +411,7 @@ Run-workflow dropdown, which only a user with write access can pick.
|-----------------------------|---------------------------------------------------------| |-----------------------------|---------------------------------------------------------|
| `util-codespace-preview.yml`| Wake, re-serve or delete a PR preview instance by hand | | `util-codespace-preview.yml`| Wake, re-serve or delete a PR preview instance by hand |
| `util-data-tooling.yml` | SQLite/PostgreSQL export/import validation (manual) | | `util-data-tooling.yml` | SQLite/PostgreSQL export/import validation (manual) |
| `test-image-efficiency.yml` | Measure n8n and runners image size and layer waste with Dive |
| `util-probe-registry.yml` | Diagnose slow npm metadata fetches (temporary) | | `util-probe-registry.yml` | Diagnose slow npm metadata fetches (temporary) |
| `sec-sync-bundle-branches.yml` | Sync both bundle branches on demand, including before a bundle cut | | `sec-sync-bundle-branches.yml` | Sync both bundle branches on demand, including before a bundle cut |
@ -586,7 +587,7 @@ Push to master
| Daily 03:00 | `sec-sync-bundle-branches.yml` | Merge the base into `bundle/*` | | Daily 03:00 | `sec-sync-bundle-branches.yml` | Merge the base into `bundle/*` |
| Daily 00:00 | `docker-build-push.yml` | Nightly Docker images | | Daily 00:00 | `docker-build-push.yml` | Nightly Docker images |
| Daily 00:00 | `test-db.yml` | Database compatibility | | Daily 00:00 | `test-db.yml` | Database compatibility |
| Daily 00:00 | `test-e2e-performance-reusable.yml`| Performance E2E | | Daily 00:00 | `test-e2e-performance-reusable.yml`| Browser performance and idle memory baselines |
| Daily 00:00 | `release-storybook.yml` | Storybook deploy | | Daily 00:00 | `release-storybook.yml` | Storybook deploy |
| Daily 00:00 | `release-chromatic.yml` | Visual regression | | Daily 00:00 | `release-chromatic.yml` | Visual regression |
| Daily 00:00 | `util-check-docs-urls.yml` | Doc link validation | | Daily 00:00 | `util-check-docs-urls.yml` | Doc link validation |
@ -599,6 +600,7 @@ Push to master
| Daily 08:00 | `build-v3-nightly.yml` | Nightly v3 Docker images | | Daily 08:00 | `build-v3-nightly.yml` | Nightly v3 Docker images |
| Monday 00:00 | `util-update-node-popularity.yml` | Node usage stats | | Monday 00:00 | `util-update-node-popularity.yml` | Node usage stats |
| Monday 02:00 | `test-e2e-coverage-weekly.yml` | Weekly E2E coverage | | Monday 02:00 | `test-e2e-coverage-weekly.yml` | Weekly E2E coverage |
| Wednesday 04:00 | `util-update-get-n8n-versions.yml` | get-n8n stable versions |
| Saturday 22:00 | `test-evals-ai.yml` | AI workflow evals | | Saturday 22:00 | `test-evals-ai.yml` | AI workflow evals |
| 1st of month 04:00 | `util-refresh-cubic-schema.yml` | Refresh vendored cubic schema | | 1st of month 04:00 | `util-refresh-cubic-schema.yml` | Refresh vendored cubic schema |

View File

@ -747,8 +747,8 @@ packages:
fast-deep-equal@3.1.3: fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
fast-uri@3.1.5: fast-uri@3.1.8:
resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==}
fd-package-json@2.0.0: fd-package-json@2.0.0:
resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==}
@ -1694,7 +1694,7 @@ snapshots:
ajv@8.20.0: ajv@8.20.0:
dependencies: dependencies:
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
fast-uri: 3.1.5 fast-uri: 3.1.8
json-schema-traverse: 1.0.0 json-schema-traverse: 1.0.0
require-from-string: 2.0.2 require-from-string: 2.0.2
@ -1994,7 +1994,7 @@ snapshots:
fast-deep-equal@3.1.3: {} fast-deep-equal@3.1.3: {}
fast-uri@3.1.5: {} fast-uri@3.1.8: {}
fd-package-json@2.0.0: fd-package-json@2.0.0:
dependencies: dependencies:

File diff suppressed because one or more lines are too long

View File

@ -80,6 +80,7 @@ jobs:
!**/*.test.ts !**/*.test.ts
!**/*.spec.ts !**/*.spec.ts
!packages/quality/testing/playwright/** !packages/quality/testing/playwright/**
!packages/quality/efficiency/**
!packages/frontend/@n8n/storybook/** !packages/frontend/@n8n/storybook/**
!.devcontainer/** !.devcontainer/**
!scripts/agent-setup.mjs !scripts/agent-setup.mjs
@ -146,10 +147,17 @@ jobs:
cubic.yaml cubic.yaml
.agents/review-rules/** .agents/review-rules/**
e2e-performance: e2e-performance:
packages/quality/efficiency/memory/idle/**
packages/quality/efficiency/playwright.config.ts
packages/quality/efficiency/package.json
packages/quality/testing/playwright/package.json
packages/quality/testing/playwright/quality-*.ts
packages/quality/testing/playwright/fixtures/**
packages/quality/testing/playwright/tests/performance/** packages/quality/testing/playwright/tests/performance/**
packages/quality/testing/playwright/utils/performance-helper.ts packages/quality/testing/playwright/utils/performance-helper.ts
packages/quality/environments/containers/** packages/quality/environments/containers/**
.github/workflows/test-e2e-performance-reusable.yml .github/workflows/test-e2e-performance-reusable.yml
.github/workflows/test-e2e-reusable.yml
# Whole directories, not the `engine-*` files alone. Engine v2 # Whole directories, not the `engine-*` files alone. Engine v2
# routing lives in ordinary control plane code: `workflow-runner.ts` # routing lives in ordinary control plane code: `workflow-runner.ts`
# and the webhook and trigger paths decide whether a run reaches the # and the webhook and trigger paths decide whether a run reaches the

View File

@ -9,6 +9,16 @@ name: 'Prepare n8n Docker (reusable)'
on: on:
workflow_call: workflow_call:
secrets:
QA_METRICS_WEBHOOK_URL:
description: 'QA metrics webhook URL.'
required: false
QA_METRICS_WEBHOOK_USER:
description: 'QA metrics webhook username.'
required: false
QA_METRICS_WEBHOOK_PASSWORD:
description: 'QA metrics webhook password.'
required: false
inputs: inputs:
build-variant: build-variant:
description: 'standard, coverage, or pc' description: 'standard, coverage, or pc'

View File

@ -1,5 +1,8 @@
name: 'Test: E2E Performance' name: 'Test: E2E Performance'
permissions:
contents: read
on: on:
workflow_call: workflow_call:
workflow_dispatch: workflow_dispatch:
@ -24,6 +27,17 @@ jobs:
artifact-prefix: performance artifact-prefix: performance
secrets: inherit secrets: inherit
idle-memory-baselines:
needs: [prepare-docker]
uses: ./.github/workflows/test-e2e-reusable.yml
with:
test-mode: docker-artifact
test-command: pnpm --filter=@n8n/efficiency test:memory
workers: '1'
currents-project-id: 'O9BJaN'
artifact-prefix: memory-performance
secrets: inherit
canvas-perf-sentinels: canvas-perf-sentinels:
name: Canvas Perf Sentinels name: Canvas Perf Sentinels
# Sentinels are nightly only — wall-clock browser perf has 15-30% variance, # Sentinels are nightly only — wall-clock browser perf has 15-30% variance,

View File

@ -195,9 +195,10 @@ jobs:
with: with:
name: ${{ inputs.artifact-prefix }}-shard-${{ matrix.shard }} name: ${{ inputs.artifact-prefix }}-shard-${{ matrix.shard }}
path: | path: |
packages/quality/testing/playwright/test-results/ packages/quality/*/test-results*
packages/quality/testing/playwright/test-results.json packages/quality/*/playwright-report/
packages/quality/testing/playwright/playwright-report/ packages/quality/*/*/test-results*
packages/quality/*/*/playwright-report/
packages/quality/testing/playwright/coverage/lcov.info packages/quality/testing/playwright/coverage/lcov.info
packages/quality/testing/playwright/coverage/by-spec/ packages/quality/testing/playwright/coverage/by-spec/
packages/quality/testing/playwright/coverage/index.html packages/quality/testing/playwright/coverage/index.html

View File

@ -0,0 +1,71 @@
name: 'Test: Image Efficiency'
on:
workflow_dispatch:
permissions:
contents: read
jobs:
prepare-docker:
uses: ./.github/workflows/prepare-docker-reusable.yml
secrets:
QA_METRICS_WEBHOOK_URL: ${{ secrets.QA_METRICS_WEBHOOK_URL }}
QA_METRICS_WEBHOOK_USER: ${{ secrets.QA_METRICS_WEBHOOK_USER }}
QA_METRICS_WEBHOOK_PASSWORD: ${{ secrets.QA_METRICS_WEBHOOK_PASSWORD }}
image-efficiency:
name: Image Efficiency
needs: prepare-docker
runs-on: ${{ vars.RUNNER_PROVIDER == 'github' && 'ubuntu-latest' || 'blacksmith-2vcpu-ubuntu-2204' }}
timeout-minutes: 20
env:
CURRENTS_RECORD_KEY: ${{ secrets.CURRENTS_RECORD_KEY }}
CURRENTS_PROJECT_ID: 'nHHLA5'
CURRENTS_CI_BUILD_ID: ${{ github.repository }}-${{ github.run_id }}-${{ github.run_attempt }}-images
QA_METRICS_WEBHOOK_URL: ${{ secrets.QA_METRICS_WEBHOOK_URL }}
QA_METRICS_WEBHOOK_USER: ${{ secrets.QA_METRICS_WEBHOOK_USER }}
QA_METRICS_WEBHOOK_PASSWORD: ${{ secrets.QA_METRICS_WEBHOOK_PASSWORD }}
steps:
- name: Checkout
uses: useblacksmith/checkout@bcec731f1eb1367240608d1c889a75b96db6ec53 # v1.5.0
- name: Setup Environment
uses: ./.github/actions/setup-nodejs
with:
build-command: pnpm turbo run build --filter=@n8n/utils...
- name: Load images from cache
uses: ./.github/actions/load-n8n-docker
- name: Install Dive
shell: bash
run: |
set -euo pipefail
# Keep this version in sync with efficiency/images/dive-results.ts.
VERSION=0.13.1
DIR=$(mktemp -d "$RUNNER_TEMP/dive.XXXXXX")
ARCHIVE="$DIR/dive.tar.gz"
curl --fail --location --retry 3 \
"https://github.com/wagoodman/dive/releases/download/v${VERSION}/dive_${VERSION}_linux_amd64.tar.gz" \
--output "$ARCHIVE"
echo "0970549eb4a306f8825a84145a2534153badb4d7dcf3febd1967c706367c3d0e $ARCHIVE" | sha256sum --check
tar -xzf "$ARCHIVE" -C "$DIR" dive
echo "$DIR" >> "$GITHUB_PATH"
- name: Measure image layer efficiency
run: >-
pnpm --filter=@n8n/efficiency exec playwright test
--project=image-efficiency:n8n --project=image-efficiency:runners
- name: Upload image efficiency reports
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: image-efficiency-${{ github.run_attempt }}
path: |
packages/quality/efficiency/test-results/
packages/quality/efficiency/test-results.json
packages/quality/efficiency/playwright-report/
retention-days: 7
if-no-files-found: ignore

View File

@ -0,0 +1,118 @@
name: 'Util: Update get-n8n Versions'
on:
schedule:
# Run every Wednesday at 04:00 UTC.
- cron: '0 4 * * 3'
workflow_dispatch:
permissions: {}
concurrency:
group: update-get-n8n-versions
cancel-in-progress: false
jobs:
update-versions:
name: Update get-n8n versions
if: >-
github.ref_name == github.event.repository.default_branch &&
(github.event_name == 'workflow_dispatch' ||
(github.event_name == 'schedule' && github.repository == 'n8n-io/n8n'))
runs-on: ubuntu-latest
timeout-minutes: 25
permissions:
contents: read
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 }}
permission-contents: write
permission-pull-requests: write
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Resolve stable versions
id: versions
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
run: |
n8n_version="$(gh api repos/n8n-io/n8n/releases/latest --jq '.tag_name | sub("^n8n@"; "")')"
registry_token="$(curl -fsSL --retry 3 'https://ghcr.io/token?scope=repository:n8n-io/n8n-sandbox-service-api:pull' | jq -er '.token')"
stable_digest="$(docker buildx imagetools inspect \
'ghcr.io/n8n-io/n8n-sandbox-service-api:stable' \
--format '{{json .Manifest}}' | jq -er '.digest')"
sandbox_version=''
while IFS= read -r version; do
version_digest="$(docker buildx imagetools inspect \
"ghcr.io/n8n-io/n8n-sandbox-service-api:${version}" \
--format '{{json .Manifest}}' | jq -er '.digest')"
if [ "$version_digest" = "$stable_digest" ]; then
sandbox_version="$version"
break
fi
done < <(curl -fsSL --retry 3 \
-H "Authorization: Bearer $registry_token" \
'https://ghcr.io/v2/n8n-io/n8n-sandbox-service-api/tags/list?n=1000' |
jq -r '.tags[]' |
grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' |
sort -Vr)
printf '%s\n' "$n8n_version" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'
printf '%s\n' "$sandbox_version" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'
for image in api runner-dind sandbox; do
docker manifest inspect "ghcr.io/n8n-io/n8n-sandbox-service-${image}:${sandbox_version}" >/dev/null
done
sed -i "s/^FALLBACK_N8N_VERSION=.*/FALLBACK_N8N_VERSION=\"${n8n_version}\"/" docker/get-n8n.sh
sed -i "s/^SANDBOX_VERSION=.*/SANDBOX_VERSION=\"${sandbox_version}\"/" docker/get-n8n.sh
echo "n8n_version=$n8n_version" >> "$GITHUB_OUTPUT"
echo "sandbox_version=$sandbox_version" >> "$GITHUB_OUTPUT"
- name: Check for changes
id: changes
run: |
if git diff --quiet -- docker/get-n8n.sh; then
echo 'has-changes=false' >> "$GITHUB_OUTPUT"
else
echo 'has-changes=true' >> "$GITHUB_OUTPUT"
fi
- name: Test installer upgrade
if: steps.changes.outputs.has-changes == 'true'
run: |
shellcheck docker/get-n8n.sh docker/test-get-n8n.sh
dash -n docker/get-n8n.sh
dash -n docker/test-get-n8n.sh
sh docker/test-get-n8n.sh --e2e
- name: Create pull request
if: steps.changes.outputs.has-changes == 'true'
uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 # v8.1.0
with:
token: ${{ steps.generate-token.outputs.token }}
add-paths: docker/get-n8n.sh
commit-message: 'chore: Update get-n8n fallback versions'
labels: 'automation:scheduled-update'
title: 'chore: Update get-n8n fallback versions'
body: |
This automated PR updates the get-n8n fallback release to ${{ steps.versions.outputs.n8n_version }}.
It also updates the sandbox service release to ${{ steps.versions.outputs.sandbox_version }}.
The workflow verified that all sandbox images use the same release. It also upgraded a legacy installation to these versions and checked the running stack.
_Generated by the weekly get-n8n version update workflow._
branch: update-get-n8n-versions
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>

View File

@ -14,6 +14,11 @@ frontend, and extensible node-based workflow engine.
- Write all technical text (code comments, PR descriptions, issue and ticket - Write all technical text (code comments, PR descriptions, issue and ticket
descriptions, docs) in ASD-STE100 Simplified Technical English: use short descriptions, docs) in ASD-STE100 Simplified Technical English: use short
sentences, the active voice, and one instruction for each sentence sentences, the active voice, and one instruction for each sentence
- **JSDoc on `@Env(...)` config properties is public documentation.** The
docs team exports these comments into the environment variable reference on
docs.n8n.io. Write them for a self-hosting operator and follow the
`n8n:env-var-docs` skill, which applies the n8n docs style guide and
overrides the ASD-STE100 rule above for these comments
- **Secrets on the command line:** if a developer opted into anonymous dev - **Secrets on the command line:** if a developer opted into anonymous dev
metrics (`scripts/dev-metrics`), pnpm command arguments are recorded. Arguments metrics (`scripts/dev-metrics`), pnpm command arguments are recorded. Arguments
of secret-carrying words (`config`, `login`, `publish`, `token`) — whether a of secret-carrying words (`config`, `login`, `publish`, `token`) — whether a

45
OWNERS
View File

@ -30,6 +30,7 @@ packages/@n8n/backend-network/ @n8n-io/catalysts
packages/@n8n/backend-services/ @n8n-io/catalysts packages/@n8n/backend-services/ @n8n-io/catalysts
packages/@n8n/backend-services/src/services/role.service.ts @n8n-io/iam packages/@n8n/backend-services/src/services/role.service.ts @n8n-io/iam
packages/@n8n/backend-services/src/services/role-cache.service.ts @n8n-io/iam packages/@n8n/backend-services/src/services/role-cache.service.ts @n8n-io/iam
packages/@n8n/backend-services/src/services/jwt.service.ts @n8n-io/iam
packages/@n8n/backend-test-utils/ @n8n-io/catalysts packages/@n8n/backend-test-utils/ @n8n-io/catalysts
packages/@n8n/di/ @n8n-io/catalysts packages/@n8n/di/ @n8n-io/catalysts
packages/@n8n/errors/ @n8n-io/catalysts packages/@n8n/errors/ @n8n-io/catalysts
@ -84,7 +85,6 @@ packages/cli/src/security-audit/ @n8n-io/catalysts
packages/cli/src/modules/workflow-index/ @n8n-io/catalysts packages/cli/src/modules/workflow-index/ @n8n-io/catalysts
packages/cli/src/modules/breaking-changes/ @n8n-io/catalysts packages/cli/src/modules/breaking-changes/ @n8n-io/catalysts
packages/cli/src/workflows/publication/ @n8n-io/catalysts required packages/cli/src/workflows/publication/ @n8n-io/catalysts required
packages/cli/src/modules/otel/ @n8n-io/ligo
packages/cli/src/auth/ @n8n-io/iam packages/cli/src/auth/ @n8n-io/iam
packages/cli/src/credentials/ @n8n-io/iam packages/cli/src/credentials/ @n8n-io/iam
@ -115,14 +115,15 @@ packages/cli/src/binary-data/ @n8n-io/catalysts
packages/cli/src/posthog/ @n8n-io/growth packages/cli/src/posthog/ @n8n-io/growth
packages/cli/src/modules/data-table/ @n8n-io/knowledge packages/cli/src/modules/data-table/ @n8n-io/knowledge
packages/cli/src/evaluation.ee/ @n8n-io/ai packages/cli/src/evaluation.ee/ @n8n-io/ai-trust
packages/cli/src/chat/ @n8n-io/ai packages/cli/src/chat/ @n8n-io/ai
packages/cli/src/tool-generation/ @n8n-io/ai packages/cli/src/tool-generation/ @n8n-io/ai
packages/cli/src/modules/workflow-builder/ @n8n-io/ai-assistant packages/modules/workflow-builder/ @n8n-io/ai-assistant
packages/cli/src/modules/mcp/ @n8n-io/context packages/cli/src/modules/mcp/ @n8n-io/context
packages/cli/src/modules/quick-connect/ @n8n-io/ai packages/modules/quick-connect/ @n8n-io/ai
packages/cli/src/modules/chat-hub/ @n8n-io/ai-assistant packages/cli/src/modules/chat-hub/ @n8n-io/ai-assistant
packages/cli/src/modules/instance-ai/ @n8n-io/ai-assistant packages/cli/src/modules/instance-ai/ @n8n-io/ai-assistant
packages/modules/inbox/ @n8n-io/ligo
packages/cli/src/modules/community-packages/ @n8n-io/nodes packages/cli/src/modules/community-packages/ @n8n-io/nodes
@ -154,7 +155,6 @@ packages/cli/src/controllers/dynamic-node-parameters.controller.ts @n8n-io/node
packages/cli/src/controllers/e2e.controller.ts @n8n-io/qa-dx packages/cli/src/controllers/e2e.controller.ts @n8n-io/qa-dx
# CLI services # CLI services
packages/cli/src/services/jwt.service.ts @n8n-io/iam
packages/cli/src/services/user.service.ts @n8n-io/iam packages/cli/src/services/user.service.ts @n8n-io/iam
packages/cli/src/services/password.utility.ts @n8n-io/iam packages/cli/src/services/password.utility.ts @n8n-io/iam
packages/cli/src/services/public-api-key.service.ts @n8n-io/iam packages/cli/src/services/public-api-key.service.ts @n8n-io/iam
@ -166,7 +166,7 @@ packages/cli/src/services/ai-usage.service.ts @n8n-io/ai-assistant
packages/cli/src/services/__tests__/ai-usage.service.test.ts @n8n-io/ai-assistant packages/cli/src/services/__tests__/ai-usage.service.test.ts @n8n-io/ai-assistant
packages/cli/src/controllers/__tests__/ai.controller.test.ts @n8n-io/ai-assistant packages/cli/src/controllers/__tests__/ai.controller.test.ts @n8n-io/ai-assistant
packages/cli/src/services/ai-workflow-builder.service.ts @n8n-io/ai-assistant packages/cli/src/services/ai-workflow-builder.service.ts @n8n-io/ai-assistant
packages/cli/src/services/annotation-tag.service.ee.ts @n8n-io/ai packages/cli/src/services/annotation-tag.service.ee.ts @n8n-io/context
packages/cli/src/services/folder.service.ts @n8n-io/context packages/cli/src/services/folder.service.ts @n8n-io/context
packages/cli/src/services/tag.service.ts @n8n-io/context packages/cli/src/services/tag.service.ts @n8n-io/context
packages/cli/src/services/cta.service.ts @n8n-io/knowledge packages/cli/src/services/cta.service.ts @n8n-io/knowledge
@ -255,6 +255,27 @@ packages/@n8n/inbound-auth/ @n8n-io/iam
packages/modules/type-availability-policies/ @n8n-io/governance-and-observability packages/modules/type-availability-policies/ @n8n-io/governance-and-observability
packages/cli/src/modules/type-availability-policies/ @n8n-io/governance-and-observability packages/cli/src/modules/type-availability-policies/ @n8n-io/governance-and-observability
packages/modules/otel/ @n8n-io/governance-and-observability
packages/cli/src/modules/otel/ @n8n-io/governance-and-observability
packages/cli/src/public-api/v1/controllers/otel.public.controller.ts @n8n-io/governance-and-observability
packages/cli/src/public-api/v1/shared/otel.mapper.ts @n8n-io/governance-and-observability
packages/cli/src/public-api/v1/controllers/node-type-policies.public.controller.ts @n8n-io/governance-and-observability
packages/cli/src/public-api/v1/controllers/credential-type-policies.public.controller.ts @n8n-io/governance-and-observability
packages/cli/src/public-api/v1/handlers/node-type-policies/ @n8n-io/governance-and-observability
packages/cli/src/public-api/v1/handlers/credential-type-policies/ @n8n-io/governance-and-observability
packages/cli/src/modules/policy-infrastructure/ @n8n-io/governance-and-observability
packages/cli/src/policy/ @n8n-io/governance-and-observability
packages/@n8n/decorators/src/policy-check/ @n8n-io/governance-and-observability
packages/@n8n/api-types/src/dto/otel/ @n8n-io/governance-and-observability
packages/@n8n/api-types/src/dto/type-availability-policies/ @n8n-io/governance-and-observability
packages/@n8n/api-types/src/node-type-availability.ts @n8n-io/governance-and-observability
packages/@n8n/api-types/src/credential-type-availability.ts @n8n-io/governance-and-observability
packages/@n8n/api-types/src/schemas/policy-check-failure.schema.ts @n8n-io/governance-and-observability
packages/@n8n/api-types/src/schemas/policy-violation.schema.ts @n8n-io/governance-and-observability
packages/@n8n/telemetry/src/events/policies.ts @n8n-io/governance-and-observability
packages/@n8n/telemetry/src/events/type-availability-policies.ts @n8n-io/governance-and-observability
packages/workflow/src/errors/policy-refusal.ts @n8n-io/governance-and-observability
packages/frontend/editor-ui/src/app/composables/usePolicyViolationToast.ts @n8n-io/governance-and-observability
# CI/CD # CI/CD
@ -282,3 +303,15 @@ packages/@n8n/db/src/entities/deployment-key.ts @n8n-io/iam required
packages/@n8n/db/src/repositories/deployment-key.repository.ts @n8n-io/iam required packages/@n8n/db/src/repositories/deployment-key.repository.ts @n8n-io/iam required
packages/@n8n/eslint-config/src/configs/encryption-boundary.ts @n8n-io/iam required packages/@n8n/eslint-config/src/configs/encryption-boundary.ts @n8n-io/iam required
packages/@n8n/eslint-config/src/rules/no-encryption-guardrail-disable.ts @n8n-io/iam required packages/@n8n/eslint-config/src/rules/no-encryption-guardrail-disable.ts @n8n-io/iam required
# AI Trust (evaluations)
# Placed last so these rules override the broader package rules above.
packages/@n8n/instance-ai/evaluations/ @n8n-io/ai-trust
packages/cli/src/modules/instance-ai/eval/ @n8n-io/ai-trust
packages/quality/testing/playwright/tests/evals/instance-ai/ @n8n-io/ai-trust
.agents/skills/create-instance-ai-eval/ @n8n-io/ai-trust
.agents/skills/create-agent-builder-eval/ @n8n-io/ai-trust
packages/cli/src/modules/agent-evals/ @n8n-io/ai-trust
packages/@n8n/agents/src/evals/ @n8n-io/ai-trust
packages/frontend/editor-ui/src/features/ai/evaluation.ee/ @n8n-io/ai-trust

View File

@ -1,6 +1,6 @@
{ {
"repository": "n8n-io/cat-bot", "repository": "n8n-io/cat-bot",
"releaseTag": "harness-v0.3.0", "releaseTag": "harness-v0.6.0",
"version": "0.3.0", "version": "0.6.0",
"assetName": "n8n-opencode-harness-0.3.0.tgz" "assetName": "n8n-opencode-harness-0.6.0.tgz"
} }

View File

@ -15,11 +15,11 @@ set -eu
SCRIPT_VERSION="1.4.0" SCRIPT_VERSION="1.4.0"
# The version to install is derived from the latest stable GitHub release in # The version to install is derived from the latest stable GitHub release in
# resolve_n8n_version(); this fallback only applies when that lookup fails. # resolve_n8n_version(); this fallback only applies when that lookup fails.
FALLBACK_N8N_VERSION="2.32.0" FALLBACK_N8N_VERSION="2.43.4"
# Sandbox service release (API, runner and sandbox images ship together). # Sandbox service release (API, runner and sandbox images ship together).
# Pinned here, not resolved at run time: the stack definition must match it. # Pinned here, not resolved at run time: the stack definition must match it.
# --upgrade moves existing installs to this pin. # --upgrade moves existing installs to this pin.
SANDBOX_VERSION="1.3.4" SANDBOX_VERSION="1.8.1"
N8N_DIR="${N8N_DIR:-./n8n}" N8N_DIR="${N8N_DIR:-./n8n}"
N8N_PORT=5678 N8N_PORT=5678
SOURCE_URL="https://github.com/n8n-io/n8n/blob/master/docker/get-n8n.sh" SOURCE_URL="https://github.com/n8n-io/n8n/blob/master/docker/get-n8n.sh"

View File

@ -29,12 +29,14 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| [public.agent_message_queue](public.agent_message_queue.md) | 10 | | BASE TABLE | | [public.agent_message_queue](public.agent_message_queue.md) | 10 | | BASE TABLE |
| [public.agent_plan](public.agent_plan.md) | 8 | | BASE TABLE | | [public.agent_plan](public.agent_plan.md) | 8 | | BASE TABLE |
| [public.agent_plan_history](public.agent_plan_history.md) | 6 | | BASE TABLE | | [public.agent_plan_history](public.agent_plan_history.md) | 6 | | BASE TABLE |
| [public.agent_skill_dependency](public.agent_skill_dependency.md) | 4 | | BASE TABLE |
| [public.agent_task_definition](public.agent_task_definition.md) | 8 | | BASE TABLE | | [public.agent_task_definition](public.agent_task_definition.md) | 8 | | BASE TABLE |
| [public.agent_task_run_lock](public.agent_task_run_lock.md) | 6 | | 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) | 9 | | BASE TABLE | | [public.agent_task_snapshot](public.agent_task_snapshot.md) | 9 | | BASE TABLE |
| [public.agent_thread_grants](public.agent_thread_grants.md) | 4 | | BASE TABLE | | [public.agent_thread_grants](public.agent_thread_grants.md) | 4 | | BASE TABLE |
| [public.agent_version_skill_dependency](public.agent_version_skill_dependency.md) | 4 | | BASE TABLE |
| [public.agent_workflow_dependency](public.agent_workflow_dependency.md) | 3 | | BASE TABLE | | [public.agent_workflow_dependency](public.agent_workflow_dependency.md) | 3 | | BASE TABLE |
| [public.agents](public.agents.md) | 14 | | BASE TABLE | | [public.agents](public.agents.md) | 15 | | BASE TABLE |
| [public.agents_memory_entries](public.agents_memory_entries.md) | 13 | | BASE TABLE | | [public.agents_memory_entries](public.agents_memory_entries.md) | 13 | | BASE TABLE |
| [public.agents_memory_entry_candidates](public.agents_memory_entry_candidates.md) | 14 | | BASE TABLE | | [public.agents_memory_entry_candidates](public.agents_memory_entry_candidates.md) | 14 | | BASE TABLE |
| [public.agents_memory_entry_locks](public.agents_memory_entry_locks.md) | 6 | | BASE TABLE | | [public.agents_memory_entry_locks](public.agents_memory_entry_locks.md) | 6 | | BASE TABLE |
@ -119,6 +121,8 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| [public.promotion_connection](public.promotion_connection.md) | 7 | | BASE TABLE | | [public.promotion_connection](public.promotion_connection.md) | 7 | | BASE TABLE |
| [public.promotion_connection_project](public.promotion_connection_project.md) | 4 | | BASE TABLE | | [public.promotion_connection_project](public.promotion_connection_project.md) | 4 | | BASE TABLE |
| [public.promotion_provider](public.promotion_provider.md) | 8 | | BASE TABLE | | [public.promotion_provider](public.promotion_provider.md) | 8 | | BASE TABLE |
| [public.promotion_review](public.promotion_review.md) | 10 | | BASE TABLE |
| [public.promotion_run](public.promotion_run.md) | 8 | | BASE TABLE |
| [public.role](public.role.md) | 7 | | BASE TABLE | | [public.role](public.role.md) | 7 | | BASE TABLE |
| [public.role_mapping_rule](public.role_mapping_rule.md) | 7 | | BASE TABLE | | [public.role_mapping_rule](public.role_mapping_rule.md) | 7 | | BASE TABLE |
| [public.role_mapping_rule_project](public.role_mapping_rule_project.md) | 2 | | BASE TABLE | | [public.role_mapping_rule_project](public.role_mapping_rule_project.md) | 2 | | BASE TABLE |
@ -131,6 +135,9 @@ Auto-generated from the PostgreSQL migrations in @n8n/db. Do not edit by hand.
| [public.settings](public.settings.md) | 3 | | BASE TABLE | | [public.settings](public.settings.md) | 3 | | BASE TABLE |
| [public.shared_credentials](public.shared_credentials.md) | 5 | | BASE TABLE | | [public.shared_credentials](public.shared_credentials.md) | 5 | | BASE TABLE |
| [public.shared_workflow](public.shared_workflow.md) | 5 | | BASE TABLE | | [public.shared_workflow](public.shared_workflow.md) | 5 | | BASE TABLE |
| [public.skill](public.skill.md) | 7 | | BASE TABLE |
| [public.skill_file](public.skill_file.md) | 5 | | BASE TABLE |
| [public.skill_version](public.skill_version.md) | 11 | | BASE TABLE |
| [public.tag_entity](public.tag_entity.md) | 4 | | BASE TABLE | | [public.tag_entity](public.tag_entity.md) | 4 | | BASE TABLE |
| [public.test_case_execution](public.test_case_execution.md) | 14 | | BASE TABLE | | [public.test_case_execution](public.test_case_execution.md) | 14 | | BASE TABLE |
| [public.test_run](public.test_run.md) | 16 | | BASE TABLE | | [public.test_run](public.test_run.md) | 16 | | BASE TABLE |
@ -223,13 +230,19 @@ erDiagram
"public.agent_message_queue" }o--|| "public.agent_execution_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES agent_execution_threads(id) ON DELETE CASCADE" "public.agent_message_queue" }o--|| "public.agent_execution_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES agent_execution_threads(id) ON DELETE CASCADE"
"public.agent_plan" }o--|| "public.agent_execution_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES agent_execution_threads(id) ON DELETE CASCADE" "public.agent_plan" }o--|| "public.agent_execution_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES agent_execution_threads(id) ON DELETE CASCADE"
"public.agent_plan_history" }o--|| "public.agent_plan" : "FOREIGN KEY (#quot;planId#quot;) REFERENCES agent_plan(id) ON DELETE CASCADE" "public.agent_plan_history" }o--|| "public.agent_plan" : "FOREIGN KEY (#quot;planId#quot;) REFERENCES agent_plan(id) ON DELETE CASCADE"
"public.agent_skill_dependency" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_skill_dependency" }o--|| "public.skill" : "FOREIGN KEY (#quot;skillId#quot;) REFERENCES skill(id) ON DELETE CASCADE"
"public.agent_skill_dependency" }o--o| "public.skill_version" : "FOREIGN KEY (#quot;skillVersionId#quot;) REFERENCES skill_version(id)"
"public.agent_task_definition" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agent_task_definition" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_task_run_lock" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agent_task_run_lock" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_task_snapshot" }o--|| "public.agent_history" : "FOREIGN KEY (#quot;versionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE CASCADE" "public.agent_task_snapshot" }o--|| "public.agent_history" : "FOREIGN KEY (#quot;versionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE CASCADE"
"public.agent_thread_grants" }o--|| "public.agent_execution_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES agent_execution_threads(id) ON DELETE CASCADE" "public.agent_thread_grants" }o--|| "public.agent_execution_threads" : "FOREIGN KEY (#quot;threadId#quot;) REFERENCES agent_execution_threads(id) ON DELETE CASCADE"
"public.agent_version_skill_dependency" }o--|| "public.agent_history" : "FOREIGN KEY (#quot;agentVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE CASCADE"
"public.agent_version_skill_dependency" }o--|| "public.skill" : "FOREIGN KEY (#quot;skillId#quot;) REFERENCES skill(id) ON DELETE CASCADE"
"public.agent_version_skill_dependency" }o--|| "public.skill_version" : "FOREIGN KEY (#quot;skillVersionId#quot;) REFERENCES skill_version(id)"
"public.agent_workflow_dependency" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE" "public.agent_workflow_dependency" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.agent_workflow_dependency" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agent_workflow_dependency" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agents" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.agents" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.agents" }o--o| "public.agent_history" : "FOREIGN KEY (#quot;activeVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE SET NULL" "public.agents" }o--o| "public.agent_history" : "FOREIGN KEY (#quot;activeVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE SET NULL"
"public.agents_memory_entries" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agents_memory_entries" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agents_memory_entries" }o--|| "public.agents_resources" : "FOREIGN KEY (#quot;resourceId#quot;) REFERENCES agents_resources(id) ON DELETE CASCADE" "public.agents_memory_entries" }o--|| "public.agents_resources" : "FOREIGN KEY (#quot;resourceId#quot;) REFERENCES agents_resources(id) ON DELETE CASCADE"
@ -354,6 +367,12 @@ erDiagram
"public.promotion_connection" }o--|| "public.promotion_provider" : "FOREIGN KEY (#quot;providerId#quot;) REFERENCES promotion_provider(id) ON DELETE RESTRICT" "public.promotion_connection" }o--|| "public.promotion_provider" : "FOREIGN KEY (#quot;providerId#quot;) REFERENCES promotion_provider(id) ON DELETE RESTRICT"
"public.promotion_connection_project" |o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.promotion_connection_project" |o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.promotion_connection_project" }o--|| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE CASCADE" "public.promotion_connection_project" }o--|| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE CASCADE"
"public.promotion_review" }o--o| "public.user" : "FOREIGN KEY (#quot;approvedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.promotion_review" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.promotion_review" }o--o| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE SET NULL"
"public.promotion_run" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.promotion_run" }o--o| "public.promotion_config" : "FOREIGN KEY (#quot;configId#quot;) REFERENCES promotion_config(id) ON DELETE SET NULL"
"public.promotion_run" }o--o| "public.promotion_review" : "FOREIGN KEY (#quot;reviewId#quot;) REFERENCES promotion_review(id) ON DELETE SET NULL"
"public.role_mapping_rule" }o--|| "public.role" : "FOREIGN KEY (role) REFERENCES role(slug) ON UPDATE CASCADE ON DELETE CASCADE" "public.role_mapping_rule" }o--|| "public.role" : "FOREIGN KEY (role) REFERENCES role(slug) ON UPDATE CASCADE ON DELETE CASCADE"
"public.role_mapping_rule_project" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.role_mapping_rule_project" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.role_mapping_rule_project" }o--|| "public.role_mapping_rule" : "FOREIGN KEY (#quot;roleMappingRuleId#quot;) REFERENCES role_mapping_rule(id) ON DELETE CASCADE" "public.role_mapping_rule_project" }o--|| "public.role_mapping_rule" : "FOREIGN KEY (#quot;roleMappingRuleId#quot;) REFERENCES role_mapping_rule(id) ON DELETE CASCADE"
@ -369,6 +388,12 @@ erDiagram
"public.shared_credentials" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.shared_credentials" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.shared_workflow" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE" "public.shared_workflow" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
"public.shared_workflow" }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.skill" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.skill" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.skill" }o--o| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.skill_file" }o--|| "public.skill_version" : "FOREIGN KEY (#quot;skillVersionId#quot;) REFERENCES skill_version(id) ON DELETE CASCADE"
"public.skill_version" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.skill_version" }o--|| "public.skill" : "FOREIGN KEY (#quot;skillId#quot;) REFERENCES skill(id) ON DELETE CASCADE"
"public.test_case_execution" }o--o| "public.execution_entity" : "FOREIGN KEY (#quot;executionId#quot;) REFERENCES execution_entity(id) ON DELETE SET NULL" "public.test_case_execution" }o--o| "public.execution_entity" : "FOREIGN KEY (#quot;executionId#quot;) REFERENCES execution_entity(id) ON DELETE SET NULL"
"public.test_case_execution" }o--|| "public.test_run" : "FOREIGN KEY (#quot;testRunId#quot;) REFERENCES test_run(id) ON DELETE CASCADE" "public.test_case_execution" }o--|| "public.test_run" : "FOREIGN KEY (#quot;testRunId#quot;) REFERENCES test_run(id) ON DELETE CASCADE"
"public.test_run" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE" "public.test_run" }o--|| "public.workflow_entity" : "FOREIGN KEY (#quot;workflowId#quot;) REFERENCES workflow_entity(id) ON DELETE CASCADE"
@ -679,6 +704,12 @@ erDiagram
uuid planId FK uuid planId FK
integer revision integer revision
} }
"public.agent_skill_dependency" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
"public.agent_task_definition" { "public.agent_task_definition" {
varchar_36_ agentId FK varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt timestamp_3__with_time_zone createdAt
@ -714,6 +745,12 @@ erDiagram
varchar_128_ threadId FK varchar_128_ threadId FK
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
} }
"public.agent_version_skill_dependency" {
varchar_36_ agentVersionId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
"public.agent_workflow_dependency" { "public.agent_workflow_dependency" {
varchar_36_ agentId FK varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt timestamp_3__with_time_zone createdAt
@ -729,6 +766,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools
@ -1527,6 +1565,28 @@ erDiagram
varchar_32_ type varchar_32_ type
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
} }
"public.promotion_review" {
timestamp_3__with_time_zone approvedAt
uuid approvedById FK
varchar_36_ connectionId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
uuid id
timestamp_3__with_time_zone lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
"public.promotion_run" {
varchar_36_ configId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
json details
varchar_16_ direction
uuid id
uuid reviewId FK
varchar_16_ type
}
"public.role" { "public.role" {
timestamp_3__with_time_zone createdAt timestamp_3__with_time_zone createdAt
text description text description
@ -1651,6 +1711,35 @@ erDiagram
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
varchar_36_ workflowId FK varchar_36_ workflowId FK
} }
"public.skill" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ source
timestamp_3__with_time_zone updatedAt
}
"public.skill_file" {
text content
timestamp_3__with_time_zone createdAt
varchar_512_ path
uuid skillVersionId FK
timestamp_3__with_time_zone updatedAt
}
"public.skill_version" {
varchar_64_ contentHash
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_1024_ description
json frontmatter
uuid id
text instructions
varchar_128_ name
varchar_36_ skillId FK
timestamp_3__with_time_zone updatedAt
integer version
}
"public.tag_entity" { "public.tag_entity" {
timestamp_3__with_time_zone createdAt timestamp_3__with_time_zone createdAt
varchar_36_ id varchar_36_ id

View File

@ -95,6 +95,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -70,6 +70,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -75,6 +75,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -56,6 +56,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -58,6 +58,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -49,6 +49,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -69,6 +69,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -102,6 +102,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -70,6 +70,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -12,7 +12,7 @@
| skills | json | | true | | | Frozen map of `skillId → AgentSkill` at publish time | | skills | json | | true | | | Frozen map of `skillId → AgentSkill` at publish time |
| tools | json | | true | | | Frozen map of `toolId → { code, descriptor }` at publish time | | tools | json | | true | | | Frozen map of `toolId → { code, descriptor }` at publish time |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | | | updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| versionId | varchar(36) | | false | [public.agent_execution_threads](public.agent_execution_threads.md) [public.agent_task_snapshot](public.agent_task_snapshot.md) [public.agents](public.agents.md) | | | | versionId | varchar(36) | | false | [public.agent_execution_threads](public.agent_execution_threads.md) [public.agent_task_snapshot](public.agent_task_snapshot.md) [public.agent_version_skill_dependency](public.agent_version_skill_dependency.md) [public.agents](public.agents.md) | | |
## Constraints ## Constraints
@ -43,6 +43,7 @@ erDiagram
"public.agent_history" }o--o| "public.user" : "FOREIGN KEY (#quot;publishedById#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.agent_execution_threads" }o--o| "public.agent_history" : "FOREIGN KEY (#quot;taskVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE SET NULL" "public.agent_execution_threads" }o--o| "public.agent_history" : "FOREIGN KEY (#quot;taskVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE SET NULL"
"public.agent_task_snapshot" }o--|| "public.agent_history" : "FOREIGN KEY (#quot;versionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE CASCADE" "public.agent_task_snapshot" }o--|| "public.agent_history" : "FOREIGN KEY (#quot;versionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE CASCADE"
"public.agent_version_skill_dependency" }o--|| "public.agent_history" : "FOREIGN KEY (#quot;agentVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE CASCADE"
"public.agents" }o--o| "public.agent_history" : "FOREIGN KEY (#quot;activeVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE SET NULL" "public.agents" }o--o| "public.agent_history" : "FOREIGN KEY (#quot;activeVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE SET NULL"
"public.agent_history" { "public.agent_history" {
@ -66,6 +67,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools
@ -121,6 +123,12 @@ erDiagram
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
varchar_36_ versionId FK varchar_36_ versionId FK
} }
"public.agent_version_skill_dependency" {
varchar_36_ agentVersionId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
``` ```
--- ---

View File

@ -0,0 +1,89 @@
# public.agent_skill_dependency
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| agentId | varchar(36) | | false | | [public.agents](public.agents.md) | |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| skillId | varchar(36) | | false | | [public.skill](public.skill.md) | |
| skillVersionId | uuid | | true | | [public.skill_version](public.skill_version.md) | Set when the agent draft pins a saved version. NULL = follows the latest saved version |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| FK_068f21aefba31ae621482f396dc | FOREIGN KEY | FOREIGN KEY ("skillId") REFERENCES skill(id) ON DELETE CASCADE |
| FK_72325bb13511a51847c53fcb377 | FOREIGN KEY | FOREIGN KEY ("agentId") REFERENCES agents(id) ON DELETE CASCADE |
| FK_7676571bd6f41d9e32f0d066fe9 | FOREIGN KEY | FOREIGN KEY ("skillVersionId") REFERENCES skill_version(id) |
| PK_18a54f60491d3e2aa2200b70f4a | PRIMARY KEY | PRIMARY KEY ("agentId", "skillId") |
| agent_skill_dependency_agentId_not_null | n | NOT NULL "agentId" |
| agent_skill_dependency_createdAt_not_null | n | NOT NULL "createdAt" |
| agent_skill_dependency_skillId_not_null | n | NOT NULL "skillId" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_068f21aefba31ae621482f396d | CREATE INDEX "IDX_068f21aefba31ae621482f396d" ON public.agent_skill_dependency USING btree ("skillId") |
| PK_18a54f60491d3e2aa2200b70f4a | CREATE UNIQUE INDEX "PK_18a54f60491d3e2aa2200b70f4a" ON public.agent_skill_dependency USING btree ("agentId", "skillId") |
## Relations
```mermaid
erDiagram
"public.agent_skill_dependency" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_skill_dependency" }o--|| "public.skill" : "FOREIGN KEY (#quot;skillId#quot;) REFERENCES skill(id) ON DELETE CASCADE"
"public.agent_skill_dependency" }o--o| "public.skill_version" : "FOREIGN KEY (#quot;skillVersionId#quot;) REFERENCES skill_version(id)"
"public.agent_skill_dependency" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
"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
integer revision
json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt
json skills
json tools
timestamp_3__with_time_zone updatedAt
varchar_36_ versionId
}
"public.skill" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ source
timestamp_3__with_time_zone updatedAt
}
"public.skill_version" {
varchar_64_ contentHash
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_1024_ description
json frontmatter
uuid id
text instructions
varchar_128_ name
varchar_36_ skillId FK
timestamp_3__with_time_zone updatedAt
integer version
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -61,6 +61,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -55,6 +55,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -0,0 +1,85 @@
# public.agent_version_skill_dependency
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| agentVersionId | varchar(36) | | false | | [public.agent_history](public.agent_history.md) | |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| skillId | varchar(36) | | false | | [public.skill](public.skill.md) | |
| skillVersionId | uuid | | false | | [public.skill_version](public.skill_version.md) | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| FK_97472baf9196d914d9cd9de6201 | FOREIGN KEY | FOREIGN KEY ("agentVersionId") REFERENCES agent_history("versionId") ON DELETE CASCADE |
| FK_c494292243a7e510acd0331c3d1 | FOREIGN KEY | FOREIGN KEY ("skillId") REFERENCES skill(id) ON DELETE CASCADE |
| FK_df63badfd7d3f2aa622ece471c4 | FOREIGN KEY | FOREIGN KEY ("skillVersionId") REFERENCES skill_version(id) |
| PK_df0a2577371b94f3c7008d81822 | PRIMARY KEY | PRIMARY KEY ("agentVersionId", "skillId") |
| agent_version_skill_dependency_agentVersionId_not_null | n | NOT NULL "agentVersionId" |
| agent_version_skill_dependency_createdAt_not_null | n | NOT NULL "createdAt" |
| agent_version_skill_dependency_skillId_not_null | n | NOT NULL "skillId" |
| agent_version_skill_dependency_skillVersionId_not_null | n | NOT NULL "skillVersionId" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_c494292243a7e510acd0331c3d | CREATE INDEX "IDX_c494292243a7e510acd0331c3d" ON public.agent_version_skill_dependency USING btree ("skillId") |
| IDX_df63badfd7d3f2aa622ece471c | CREATE INDEX "IDX_df63badfd7d3f2aa622ece471c" ON public.agent_version_skill_dependency USING btree ("skillVersionId") |
| PK_df0a2577371b94f3c7008d81822 | CREATE UNIQUE INDEX "PK_df0a2577371b94f3c7008d81822" ON public.agent_version_skill_dependency USING btree ("agentVersionId", "skillId") |
## Relations
```mermaid
erDiagram
"public.agent_version_skill_dependency" }o--|| "public.agent_history" : "FOREIGN KEY (#quot;agentVersionId#quot;) REFERENCES agent_history(#quot;versionId#quot;) ON DELETE CASCADE"
"public.agent_version_skill_dependency" }o--|| "public.skill" : "FOREIGN KEY (#quot;skillId#quot;) REFERENCES skill(id) ON DELETE CASCADE"
"public.agent_version_skill_dependency" }o--|| "public.skill_version" : "FOREIGN KEY (#quot;skillVersionId#quot;) REFERENCES skill_version(id)"
"public.agent_version_skill_dependency" {
varchar_36_ agentVersionId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
"public.agent_history" {
varchar_36_ agentId FK
varchar_255_ author
timestamp_3__with_time_zone createdAt
uuid publishedById FK
json schema
json skills
json tools
timestamp_3__with_time_zone updatedAt
varchar_36_ versionId
}
"public.skill" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ source
timestamp_3__with_time_zone updatedAt
}
"public.skill_version" {
varchar_64_ contentHash
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_1024_ description
json frontmatter
uuid id
text instructions
varchar_128_ name
varchar_36_ skillId FK
timestamp_3__with_time_zone updatedAt
integer version
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -49,6 +49,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -7,12 +7,13 @@
| activeVersionId | varchar(36) | | true | | [public.agent_history](public.agent_history.md) | | | 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 | | 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 | | | | | createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| id | varchar(36) | | false | [public.agent_background_job](public.agent_background_job.md) [public.agent_channel_status](public.agent_channel_status.md) [public.agent_chat_attachments](public.agent_chat_attachments.md) [public.agent_chat_subscriptions](public.agent_chat_subscriptions.md) [public.agent_checkpoints](public.agent_checkpoints.md) [public.agent_credential_dependency](public.agent_credential_dependency.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.agent_workflow_dependency](public.agent_workflow_dependency.md) [public.agents_memory_entries](public.agents_memory_entries.md) [public.agents_memory_entry_candidates](public.agents_memory_entry_candidates.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_background_job](public.agent_background_job.md) [public.agent_channel_status](public.agent_channel_status.md) [public.agent_chat_attachments](public.agent_chat_attachments.md) [public.agent_chat_subscriptions](public.agent_chat_subscriptions.md) [public.agent_checkpoints](public.agent_checkpoints.md) [public.agent_credential_dependency](public.agent_credential_dependency.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_skill_dependency](public.agent_skill_dependency.md) [public.agent_task_definition](public.agent_task_definition.md) [public.agent_task_run_lock](public.agent_task_run_lock.md) [public.agent_workflow_dependency](public.agent_workflow_dependency.md) [public.agents_memory_entries](public.agents_memory_entries.md) [public.agents_memory_entry_candidates](public.agents_memory_entry_candidates.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) [public.skill](public.skill.md) | | |
| integrations | json | '[]'::json | false | | | | | integrations | json | '[]'::json | false | | | |
| name | varchar(128) | | false | | | | | name | varchar(128) | | false | | | |
| projectId | varchar(255) | | false | | [public.project](public.project.md) | | | projectId | varchar(255) | | true | | [public.project](public.project.md) | |
| revision | integer | 0 | false | | | | | revision | integer | 0 | false | | | |
| schema | json | | true | | | | | schema | json | | true | | | |
| scope | varchar(16) | 'project'::character varying | false | | | project: belongs to projectId; instance: code-defined, belongs to no project (projectId is null) |
| setupCompletedAt | timestamp(3) with time zone | | true | | | When this agent first reached a complete, publishable setup | | setupCompletedAt | timestamp(3) with time zone | | true | | | When this agent first reached a complete, publishable setup |
| skills | json | '{}'::json | false | | | | | skills | json | '{}'::json | false | | | |
| tools | json | '{}'::json | false | | | | | tools | json | '{}'::json | false | | | |
@ -23,6 +24,8 @@
| Name | Type | Definition | | Name | Type | Definition |
| ---- | ---- | ---------- | | ---- | ---- | ---------- |
| CHK_agents_scope | CHECK | CHECK (((scope)::text = ANY ((ARRAY['project'::character varying, 'instance'::character varying])::text[]))) |
| CHK_agents_scope_project | CHECK | CHECK ((((scope)::text = 'instance'::text) = ("projectId" IS NULL))) |
| FK_940597dfe9753375309ce6aeea0 | FOREIGN KEY | FOREIGN KEY ("activeVersionId") REFERENCES agent_history("versionId") ON DELETE SET NULL | | 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 | | FK_a30d560207c4071d98aa03c179c | FOREIGN KEY | FOREIGN KEY ("projectId") REFERENCES project(id) ON DELETE CASCADE |
| PK_9c653f28ae19c5884d5baf6a1d9 | PRIMARY KEY | PRIMARY KEY (id) | | PK_9c653f28ae19c5884d5baf6a1d9 | PRIMARY KEY | PRIMARY KEY (id) |
@ -31,8 +34,8 @@
| agents_id_not_null | n | NOT NULL id | | agents_id_not_null | n | NOT NULL id |
| agents_integrations_not_null | n | NOT NULL integrations | | agents_integrations_not_null | n | NOT NULL integrations |
| agents_name_not_null | n | NOT NULL name | | agents_name_not_null | n | NOT NULL name |
| agents_projectId_not_null | n | NOT NULL "projectId" |
| agents_revision_not_null | n | NOT NULL revision | | agents_revision_not_null | n | NOT NULL revision |
| agents_scope_not_null | n | NOT NULL scope |
| agents_skills_not_null | n | NOT NULL skills | | agents_skills_not_null | n | NOT NULL skills |
| agents_tools_not_null | n | NOT NULL tools | | agents_tools_not_null | n | NOT NULL tools |
| agents_updatedAt_not_null | n | NOT NULL "updatedAt" | | agents_updatedAt_not_null | n | NOT NULL "updatedAt" |
@ -61,6 +64,7 @@ erDiagram
"public.agent_execution_threads" }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_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" "public.agent_history" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_skill_dependency" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_task_definition" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agent_task_definition" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_task_run_lock" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agent_task_run_lock" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agent_workflow_dependency" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agent_workflow_dependency" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
@ -71,7 +75,8 @@ erDiagram
"public.agents_observation_cursors" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agents_observation_cursors" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agents_observation_locks" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agents_observation_locks" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agents_observations" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE" "public.agents_observations" }o--|| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agents" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.skill" }o--o| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.agents" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.agents" { "public.agents" {
varchar_36_ activeVersionId FK varchar_36_ activeVersionId FK
@ -83,6 +88,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools
@ -216,6 +222,12 @@ erDiagram
varchar_2_ storedAt varchar_2_ storedAt
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
} }
"public.agent_skill_dependency" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
"public.agent_task_definition" { "public.agent_task_definition" {
varchar_36_ agentId FK varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt timestamp_3__with_time_zone createdAt
@ -320,6 +332,15 @@ erDiagram
integer tokenCount integer tokenCount
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
} }
"public.skill" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ source
timestamp_3__with_time_zone updatedAt
}
"public.project" { "public.project" {
timestamp_3__with_time_zone createdAt timestamp_3__with_time_zone createdAt
uuid creatorId FK uuid creatorId FK

View File

@ -82,6 +82,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -91,6 +91,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -58,6 +58,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -80,6 +80,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -58,6 +58,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -62,6 +62,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -81,6 +81,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools

View File

@ -9,7 +9,7 @@
| customTelemetryTags | json | '[]'::json | false | | | | | customTelemetryTags | json | '[]'::json | false | | | |
| description | varchar(512) | | true | | | | | description | varchar(512) | | true | | | |
| icon | json | | true | | | | | icon | json | | true | | | |
| id | varchar(36) | | false | [public.activity_event](public.activity_event.md) [public.agent_chat_attachments](public.agent_chat_attachments.md) [public.agent_execution_threads](public.agent_execution_threads.md) [public.agents](public.agents.md) [public.ai_preference](public.ai_preference.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_pool_settings](public.project_pool_settings.md) [public.project_relation](public.project_relation.md) [public.project_secrets_provider_access](public.project_secrets_provider_access.md) [public.promotion_connection_project](public.promotion_connection_project.md) [public.role_mapping_rule_project](public.role_mapping_rule_project.md) [public.self_healing_result](public.self_healing_result.md) [public.shared_credentials](public.shared_credentials.md) [public.shared_workflow](public.shared_workflow.md) [public.type_availability_policy_scope](public.type_availability_policy_scope.md) [public.variables](public.variables.md) [public.workflow_review_request](public.workflow_review_request.md) [public.workflow_suggestion](public.workflow_suggestion.md) | | | | id | varchar(36) | | false | [public.activity_event](public.activity_event.md) [public.agent_chat_attachments](public.agent_chat_attachments.md) [public.agent_execution_threads](public.agent_execution_threads.md) [public.agents](public.agents.md) [public.ai_preference](public.ai_preference.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_pool_settings](public.project_pool_settings.md) [public.project_relation](public.project_relation.md) [public.project_secrets_provider_access](public.project_secrets_provider_access.md) [public.promotion_connection_project](public.promotion_connection_project.md) [public.role_mapping_rule_project](public.role_mapping_rule_project.md) [public.self_healing_result](public.self_healing_result.md) [public.shared_credentials](public.shared_credentials.md) [public.shared_workflow](public.shared_workflow.md) [public.skill](public.skill.md) [public.type_availability_policy_scope](public.type_availability_policy_scope.md) [public.variables](public.variables.md) [public.workflow_review_request](public.workflow_review_request.md) [public.workflow_suggestion](public.workflow_suggestion.md) | | |
| name | varchar(255) | | false | | | | | name | varchar(255) | | false | | | |
| type | varchar(36) | | false | | | | | type | varchar(36) | | false | | | |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | | | updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
@ -42,7 +42,7 @@ erDiagram
"public.activity_event" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.activity_event" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.agent_chat_attachments" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.agent_chat_attachments" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(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.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.agents" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.agents" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.ai_preference" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.ai_preference" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.data_table" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.data_table" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.folder" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.folder" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
@ -56,6 +56,7 @@ erDiagram
"public.self_healing_result" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.self_healing_result" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.shared_credentials" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "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.shared_workflow" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.skill" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.type_availability_policy_scope" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE" "public.type_availability_policy_scope" }o--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.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.workflow_review_request" }o--|| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
@ -147,6 +148,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
integer revision integer revision
json schema json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt timestamp_3__with_time_zone setupCompletedAt
json skills json skills
json tools json tools
@ -255,6 +257,15 @@ erDiagram
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
varchar_36_ workflowId FK varchar_36_ workflowId FK
} }
"public.skill" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ source
timestamp_3__with_time_zone updatedAt
}
"public.type_availability_policy_scope" { "public.type_availability_policy_scope" {
timestamp_3__with_time_zone createdAt timestamp_3__with_time_zone createdAt
varchar_16_ defaultAction varchar_16_ defaultAction

View File

@ -7,7 +7,7 @@
| connectionId | varchar(36) | | false | | [public.promotion_connection](public.promotion_connection.md) | | | connectionId | varchar(36) | | false | | [public.promotion_connection](public.promotion_connection.md) | |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | | | createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| direction | varchar(16) | | false | | | PromotionDirection enum: "apply", "promote". Cannot change after creation. | | direction | varchar(16) | | false | | | PromotionDirection enum: "apply", "promote". Cannot change after creation. |
| id | varchar(36) | | false | | | Also the name of the local checkout directory. | | id | varchar(36) | | false | [public.promotion_run](public.promotion_run.md) | | Also the name of the local checkout directory. |
| name | varchar(128) | | false | | | | | name | varchar(128) | | false | | | |
| settings | json | | false | | | Branch settings for this direction, with their own schemaVersion. Validated in code. | | settings | json | | false | | | Branch settings for this direction, with their own schemaVersion. Validated in code. |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | | | updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
@ -40,6 +40,7 @@
erDiagram erDiagram
"public.promotion_config" }o--|| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE CASCADE" "public.promotion_config" }o--|| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE CASCADE"
"public.promotion_run" }o--o| "public.promotion_config" : "FOREIGN KEY (#quot;configId#quot;) REFERENCES promotion_config(id) ON DELETE SET NULL"
"public.promotion_config" { "public.promotion_config" {
varchar_36_ connectionId FK varchar_36_ connectionId FK
@ -59,6 +60,16 @@ erDiagram
json target json target
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
} }
"public.promotion_run" {
varchar_36_ configId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
json details
varchar_16_ direction
uuid id
uuid reviewId FK
varchar_16_ type
}
``` ```
--- ---

View File

@ -5,7 +5,7 @@
| Name | Type | Default | Nullable | Children | Parents | Comment | | Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- | | ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | | | createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| id | varchar(36) | | false | [public.promotion_config](public.promotion_config.md) [public.promotion_connection_project](public.promotion_connection_project.md) | | | | id | varchar(36) | | false | [public.promotion_config](public.promotion_config.md) [public.promotion_connection_project](public.promotion_connection_project.md) [public.promotion_review](public.promotion_review.md) | | |
| name | varchar(128) | | false | | | | | name | varchar(128) | | false | | | |
| providerId | varchar(36) | | false | | [public.promotion_provider](public.promotion_provider.md) | The provider whose credentials this connection uses. | | providerId | varchar(36) | | false | | [public.promotion_provider](public.promotion_provider.md) | The provider whose credentials this connection uses. |
| scope | varchar(16) | | false | | | PromotionConnectionScope enum: "instance", "projects". Cannot change after creation. | | scope | varchar(16) | | false | | | PromotionConnectionScope enum: "instance", "projects". Cannot change after creation. |
@ -42,6 +42,7 @@ erDiagram
"public.promotion_config" }o--|| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE CASCADE" "public.promotion_config" }o--|| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE CASCADE"
"public.promotion_connection_project" }o--|| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE CASCADE" "public.promotion_connection_project" }o--|| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE CASCADE"
"public.promotion_review" }o--o| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE SET NULL"
"public.promotion_connection" }o--|| "public.promotion_provider" : "FOREIGN KEY (#quot;providerId#quot;) REFERENCES promotion_provider(id) ON DELETE RESTRICT" "public.promotion_connection" }o--|| "public.promotion_provider" : "FOREIGN KEY (#quot;providerId#quot;) REFERENCES promotion_provider(id) ON DELETE RESTRICT"
"public.promotion_connection" { "public.promotion_connection" {
@ -68,6 +69,18 @@ erDiagram
varchar_36_ projectId FK varchar_36_ projectId FK
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
} }
"public.promotion_review" {
timestamp_3__with_time_zone approvedAt
uuid approvedById FK
varchar_36_ connectionId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
uuid id
timestamp_3__with_time_zone lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
"public.promotion_provider" { "public.promotion_provider" {
text auth text auth
varchar_32_ authType varchar_32_ authType

View File

@ -0,0 +1,104 @@
# public.promotion_review
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| approvedAt | timestamp(3) with time zone | | true | | | When the n8n user approved the review. |
| approvedById | uuid | | true | | [public.user](public.user.md) | The one n8n user who approved the review in n8n. NULL until then. n8n does not copy an approver from the host. |
| connectionId | varchar(36) | | true | | [public.promotion_connection](public.promotion_connection.md) | The connection that remoteReviewId resolves through. NULL after the connection is deleted. |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| createdById | uuid | | true | | [public.user](public.user.md) | The n8n user whose Promote opened this review. NULL after that user is deleted. |
| id | uuid | | false | [public.promotion_run](public.promotion_run.md) | | |
| lastStateChangeAt | timestamp(3) with time zone | | true | | | Time of the latest state change. Covers every transition, including changes_requested and a reopened review. NULL until the first change. |
| remoteReviewId | varchar(255) | | true | | | Host reference for type. GitLab stores "\<projectId\>!\<iid\>". NULL when the review lives in n8n. |
| state | varchar(32) | 'open'::character varying | false | | | PromotionReviewState enum: "open", "changes_requested", "merged", "closed". "merged" and "closed" are terminal. |
| type | varchar(16) | | false | | | PromotionReviewType enum: "gitlab". |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_promotion_review_state | CHECK | CHECK (((state)::text = ANY ((ARRAY['open'::character varying, 'changes_requested'::character varying, 'merged'::character varying, 'closed'::character varying])::text[]))) |
| CHK_promotion_review_type | CHECK | CHECK (((type)::text = 'gitlab'::text)) |
| FK_promotion_review_approvedById | FOREIGN KEY | FOREIGN KEY ("approvedById") REFERENCES "user"(id) ON DELETE SET NULL |
| FK_promotion_review_connectionId | FOREIGN KEY | FOREIGN KEY ("connectionId") REFERENCES promotion_connection(id) ON DELETE SET NULL |
| FK_promotion_review_createdById | FOREIGN KEY | FOREIGN KEY ("createdById") REFERENCES "user"(id) ON DELETE SET NULL |
| PK_fe93e2f1add228dc14d3330c8e5 | PRIMARY KEY | PRIMARY KEY (id) |
| promotion_review_createdAt_not_null | n | NOT NULL "createdAt" |
| promotion_review_id_not_null | n | NOT NULL id |
| promotion_review_state_not_null | n | NOT NULL state |
| promotion_review_type_not_null | n | NOT NULL type |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_82d6930410e9e6c7d04c515079 | CREATE INDEX "IDX_82d6930410e9e6c7d04c515079" ON public.promotion_review USING btree (state, "createdAt") |
| IDX_93e4ec34f4091a0333af0076b6 | CREATE INDEX "IDX_93e4ec34f4091a0333af0076b6" ON public.promotion_review USING btree ("connectionId") |
| IDX_promotion_review_connectionId_remoteReviewId | CREATE UNIQUE INDEX "IDX_promotion_review_connectionId_remoteReviewId" ON public.promotion_review USING btree ("connectionId", "remoteReviewId") WHERE ("remoteReviewId" IS NOT NULL) |
| PK_fe93e2f1add228dc14d3330c8e5 | CREATE UNIQUE INDEX "PK_fe93e2f1add228dc14d3330c8e5" ON public.promotion_review USING btree (id) |
## Relations
```mermaid
erDiagram
"public.promotion_review" }o--o| "public.user" : "FOREIGN KEY (#quot;approvedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.promotion_review" }o--o| "public.promotion_connection" : "FOREIGN KEY (#quot;connectionId#quot;) REFERENCES promotion_connection(id) ON DELETE SET NULL"
"public.promotion_review" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.promotion_run" }o--o| "public.promotion_review" : "FOREIGN KEY (#quot;reviewId#quot;) REFERENCES promotion_review(id) ON DELETE SET NULL"
"public.promotion_review" {
timestamp_3__with_time_zone approvedAt
uuid approvedById FK
varchar_36_ connectionId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
uuid id
timestamp_3__with_time_zone lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
"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.promotion_connection" {
timestamp_3__with_time_zone createdAt
varchar_36_ id
varchar_128_ name
varchar_36_ providerId FK
varchar_16_ scope
json target
timestamp_3__with_time_zone updatedAt
}
"public.promotion_run" {
varchar_36_ configId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
json details
varchar_16_ direction
uuid id
uuid reviewId FK
varchar_16_ type
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -0,0 +1,100 @@
# public.promotion_run
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| configId | varchar(36) | | true | | [public.promotion_config](public.promotion_config.md) | The config this run used. NULL after the config is deleted. |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| createdById | uuid | | true | | [public.user](public.user.md) | The user who ran Promote or Apply. |
| details | json | | true | | | Payload for type. A git run stores schemaVersion, branchName and commitSha. NULL when the type has no details. |
| direction | varchar(16) | | false | | | PromotionDirection enum: "promote" pushes to the remote, "apply" imports from it. Copied from the config when the run is written. |
| id | uuid | | false | | | |
| reviewId | uuid | | true | | [public.promotion_review](public.promotion_review.md) | The review this run belongs to. NULL when the push has no review. Not unique: an amend adds another run. |
| type | varchar(16) | | false | | | PromotionRunType enum: "git". Git covers GitHub, GitLab and plain Git. |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_promotion_run_direction | CHECK | CHECK (((direction)::text = ANY ((ARRAY['promote'::character varying, 'apply'::character varying])::text[]))) |
| CHK_promotion_run_type | CHECK | CHECK (((type)::text = 'git'::text)) |
| FK_promotion_run_configId | FOREIGN KEY | FOREIGN KEY ("configId") REFERENCES promotion_config(id) ON DELETE SET NULL |
| FK_promotion_run_createdById | FOREIGN KEY | FOREIGN KEY ("createdById") REFERENCES "user"(id) ON DELETE SET NULL |
| FK_promotion_run_reviewId | FOREIGN KEY | FOREIGN KEY ("reviewId") REFERENCES promotion_review(id) ON DELETE SET NULL |
| PK_f5b941d810bf2eb7a5f8327f446 | PRIMARY KEY | PRIMARY KEY (id) |
| promotion_run_createdAt_not_null | n | NOT NULL "createdAt" |
| promotion_run_direction_not_null | n | NOT NULL direction |
| promotion_run_id_not_null | n | NOT NULL id |
| promotion_run_type_not_null | n | NOT NULL type |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_5c00951cc85ac1bc6f120b1e69 | CREATE INDEX "IDX_5c00951cc85ac1bc6f120b1e69" ON public.promotion_run USING btree ("configId") |
| IDX_b24c3e6b803dc496c8702f12ab | CREATE INDEX "IDX_b24c3e6b803dc496c8702f12ab" ON public.promotion_run USING btree ("reviewId") |
| PK_f5b941d810bf2eb7a5f8327f446 | CREATE UNIQUE INDEX "PK_f5b941d810bf2eb7a5f8327f446" ON public.promotion_run USING btree (id) |
## Relations
```mermaid
erDiagram
"public.promotion_run" }o--o| "public.promotion_config" : "FOREIGN KEY (#quot;configId#quot;) REFERENCES promotion_config(id) ON DELETE SET NULL"
"public.promotion_run" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.promotion_run" }o--o| "public.promotion_review" : "FOREIGN KEY (#quot;reviewId#quot;) REFERENCES promotion_review(id) ON DELETE SET NULL"
"public.promotion_run" {
varchar_36_ configId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
json details
varchar_16_ direction
uuid id
uuid reviewId FK
varchar_16_ type
}
"public.promotion_config" {
varchar_36_ connectionId FK
timestamp_3__with_time_zone createdAt
varchar_16_ direction
varchar_36_ id
varchar_128_ name
json settings
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.promotion_review" {
timestamp_3__with_time_zone approvedAt
uuid approvedById FK
varchar_36_ connectionId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
uuid id
timestamp_3__with_time_zone lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -0,0 +1,132 @@
# public.skill
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| agentId | varchar(36) | | true | | [public.agents](public.agents.md) | Set when only this agent can use the skill. projectId is then NULL: the agent holds the project |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| createdById | uuid | | true | | [public.user](public.user.md) | Author. NULL after the author is deleted |
| id | varchar(36) | | false | [public.agent_skill_dependency](public.agent_skill_dependency.md) [public.agent_version_skill_dependency](public.agent_version_skill_dependency.md) [public.skill_version](public.skill_version.md) | | skill_\<nanoid\>, the same format agents use |
| projectId | varchar(36) | | true | | [public.project](public.project.md) | Set for a project skill, team or personal. NULL otherwise |
| source | varchar(16) | | false | | | How the skill was created, set by the server: "ui" (the skills hub) or "agent" (the agent builder or the copy of agent skills) |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_skill_single_target | CHECK | CHECK ((("agentId" IS NULL) OR ("projectId" IS NULL))) |
| FK_402ed37bff0d3134f6e782455ed | FOREIGN KEY | FOREIGN KEY ("projectId") REFERENCES project(id) ON DELETE CASCADE |
| FK_4de4501583cd1fcd6f5ea85f547 | FOREIGN KEY | FOREIGN KEY ("createdById") REFERENCES "user"(id) ON DELETE SET NULL |
| FK_7d4fb6af107e507d9a86293cf9d | FOREIGN KEY | FOREIGN KEY ("agentId") REFERENCES agents(id) ON DELETE CASCADE |
| PK_a0d33334424e64fb78dc3ce7196 | PRIMARY KEY | PRIMARY KEY (id) |
| skill_createdAt_not_null | n | NOT NULL "createdAt" |
| skill_id_not_null | n | NOT NULL id |
| skill_source_not_null | n | NOT NULL source |
| skill_updatedAt_not_null | n | NOT NULL "updatedAt" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_402ed37bff0d3134f6e782455e | CREATE INDEX "IDX_402ed37bff0d3134f6e782455e" ON public.skill USING btree ("projectId") |
| IDX_7d4fb6af107e507d9a86293cf9 | CREATE INDEX "IDX_7d4fb6af107e507d9a86293cf9" ON public.skill USING btree ("agentId") |
| PK_a0d33334424e64fb78dc3ce7196 | CREATE UNIQUE INDEX "PK_a0d33334424e64fb78dc3ce7196" ON public.skill USING btree (id) |
## Relations
```mermaid
erDiagram
"public.skill" }o--o| "public.agents" : "FOREIGN KEY (#quot;agentId#quot;) REFERENCES agents(id) ON DELETE CASCADE"
"public.skill" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_skill_dependency" }o--|| "public.skill" : "FOREIGN KEY (#quot;skillId#quot;) REFERENCES skill(id) ON DELETE CASCADE"
"public.agent_version_skill_dependency" }o--|| "public.skill" : "FOREIGN KEY (#quot;skillId#quot;) REFERENCES skill(id) ON DELETE CASCADE"
"public.skill_version" }o--|| "public.skill" : "FOREIGN KEY (#quot;skillId#quot;) REFERENCES skill(id) ON DELETE CASCADE"
"public.skill" }o--o| "public.project" : "FOREIGN KEY (#quot;projectId#quot;) REFERENCES project(id) ON DELETE CASCADE"
"public.skill" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ source
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
integer revision
json schema
varchar_16_ scope
timestamp_3__with_time_zone setupCompletedAt
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_skill_dependency" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
"public.agent_version_skill_dependency" {
varchar_36_ agentVersionId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
"public.skill_version" {
varchar_64_ contentHash
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_1024_ description
json frontmatter
uuid id
text instructions
varchar_128_ name
varchar_36_ skillId FK
timestamp_3__with_time_zone updatedAt
integer version
}
"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

@ -0,0 +1,62 @@
# public.skill_file
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| content | text | | false | | | |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| path | varchar(512) | | false | | | Relative path, references/*.md in v1 |
| skillVersionId | uuid | | false | | [public.skill_version](public.skill_version.md) | |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| FK_e9ab50b795ec8858702b7333d13 | FOREIGN KEY | FOREIGN KEY ("skillVersionId") REFERENCES skill_version(id) ON DELETE CASCADE |
| PK_160721f9e4c22026c16138af2a1 | PRIMARY KEY | PRIMARY KEY ("skillVersionId", path) |
| skill_file_content_not_null | n | NOT NULL content |
| skill_file_createdAt_not_null | n | NOT NULL "createdAt" |
| skill_file_path_not_null | n | NOT NULL path |
| skill_file_skillVersionId_not_null | n | NOT NULL "skillVersionId" |
| skill_file_updatedAt_not_null | n | NOT NULL "updatedAt" |
## Indexes
| Name | Definition |
| ---- | ---------- |
| PK_160721f9e4c22026c16138af2a1 | CREATE UNIQUE INDEX "PK_160721f9e4c22026c16138af2a1" ON public.skill_file USING btree ("skillVersionId", path) |
## Relations
```mermaid
erDiagram
"public.skill_file" }o--|| "public.skill_version" : "FOREIGN KEY (#quot;skillVersionId#quot;) REFERENCES skill_version(id) ON DELETE CASCADE"
"public.skill_file" {
text content
timestamp_3__with_time_zone createdAt
varchar_512_ path
uuid skillVersionId FK
timestamp_3__with_time_zone updatedAt
}
"public.skill_version" {
varchar_64_ contentHash
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_1024_ description
json frontmatter
uuid id
text instructions
varchar_128_ name
varchar_36_ skillId FK
timestamp_3__with_time_zone updatedAt
integer version
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -0,0 +1,118 @@
# public.skill_version
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| contentHash | varchar(64) | | false | | | sha256 of name, description, instructions, frontmatter and files. Save creates no version when the content matches the latest one |
| createdAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| createdById | uuid | | true | | [public.user](public.user.md) | Author. NULL after the author is deleted |
| description | varchar(1024) | | false | | | |
| frontmatter | json | | true | | | SKILL.md frontmatter fields other than name and description, e.g. allowed-tools |
| id | uuid | | false | [public.agent_skill_dependency](public.agent_skill_dependency.md) [public.agent_version_skill_dependency](public.agent_version_skill_dependency.md) [public.skill_file](public.skill_file.md) | | |
| instructions | text | | false | | | |
| name | varchar(128) | | false | | | Free-text skill name, as it was when this version was saved |
| skillId | varchar(36) | | false | | [public.skill](public.skill.md) | |
| updatedAt | timestamp(3) with time zone | CURRENT_TIMESTAMP(3) | false | | | |
| version | integer | | false | | | 1..n per skill. A Save that changes the content adds one; none ever changes |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| CHK_skill_version_version | CHECK | CHECK ((version > 0)) |
| FK_9565d0fbf32cd463f9b47c7adab | FOREIGN KEY | FOREIGN KEY ("createdById") REFERENCES "user"(id) ON DELETE SET NULL |
| FK_f87064c0a29efd2d5195328d91a | FOREIGN KEY | FOREIGN KEY ("skillId") REFERENCES skill(id) ON DELETE CASCADE |
| PK_05167d59ac7599128e22400172d | PRIMARY KEY | PRIMARY KEY (id) |
| UQ_93bb78a1eb4e0890fac6b69df95 | UNIQUE | UNIQUE ("skillId", version) |
| skill_version_contentHash_not_null | n | NOT NULL "contentHash" |
| skill_version_createdAt_not_null | n | NOT NULL "createdAt" |
| skill_version_description_not_null | n | NOT NULL description |
| skill_version_id_not_null | n | NOT NULL id |
| skill_version_instructions_not_null | n | NOT NULL instructions |
| skill_version_name_not_null | n | NOT NULL name |
| skill_version_skillId_not_null | n | NOT NULL "skillId" |
| skill_version_updatedAt_not_null | n | NOT NULL "updatedAt" |
| skill_version_version_not_null | n | NOT NULL version |
## Indexes
| Name | Definition |
| ---- | ---------- |
| PK_05167d59ac7599128e22400172d | CREATE UNIQUE INDEX "PK_05167d59ac7599128e22400172d" ON public.skill_version USING btree (id) |
| UQ_93bb78a1eb4e0890fac6b69df95 | CREATE UNIQUE INDEX "UQ_93bb78a1eb4e0890fac6b69df95" ON public.skill_version USING btree ("skillId", version) |
## Relations
```mermaid
erDiagram
"public.skill_version" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.agent_skill_dependency" }o--o| "public.skill_version" : "FOREIGN KEY (#quot;skillVersionId#quot;) REFERENCES skill_version(id)"
"public.agent_version_skill_dependency" }o--|| "public.skill_version" : "FOREIGN KEY (#quot;skillVersionId#quot;) REFERENCES skill_version(id)"
"public.skill_file" }o--|| "public.skill_version" : "FOREIGN KEY (#quot;skillVersionId#quot;) REFERENCES skill_version(id) ON DELETE CASCADE"
"public.skill_version" }o--|| "public.skill" : "FOREIGN KEY (#quot;skillId#quot;) REFERENCES skill(id) ON DELETE CASCADE"
"public.skill_version" {
varchar_64_ contentHash
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_1024_ description
json frontmatter
uuid id
text instructions
varchar_128_ name
varchar_36_ skillId FK
timestamp_3__with_time_zone updatedAt
integer version
}
"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_skill_dependency" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
"public.agent_version_skill_dependency" {
varchar_36_ agentVersionId FK
timestamp_3__with_time_zone createdAt
varchar_36_ skillId FK
uuid skillVersionId FK
}
"public.skill_file" {
text content
timestamp_3__with_time_zone createdAt
varchar_512_ path
uuid skillVersionId FK
timestamp_3__with_time_zone updatedAt
}
"public.skill" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ source
timestamp_3__with_time_zone updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -8,7 +8,7 @@
| disabled | boolean | false | false | | | | | disabled | boolean | false | false | | | |
| email | varchar(255) | | true | | | | | email | varchar(255) | | true | | | |
| firstName | varchar(32) | | true | | | | | firstName | varchar(32) | | true | | | |
| id | uuid | gen_random_uuid() | false | [public.activity_event](public.activity_event.md) [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_execution_threads](public.agent_execution_threads.md) [public.agent_history](public.agent_history.md) [public.ai_preference](public.ai_preference.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.idempotency_key](public.idempotency_key.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.instance_ai_thread_tabs](public.instance_ai_thread_tabs.md) [public.migration_workflow_owner](public.migration_workflow_owner.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.self_healing_result](public.self_healing_result.md) [public.trusted_source_identity](public.trusted_source_identity.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_activity](public.workflow_review_activity.md) [public.workflow_review_activity_comment](public.workflow_review_activity_comment.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) [public.workflow_suggestion](public.workflow_suggestion.md) [public.workflow_suggestion_activity](public.workflow_suggestion_activity.md) | | | | id | uuid | gen_random_uuid() | false | [public.activity_event](public.activity_event.md) [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_execution_threads](public.agent_execution_threads.md) [public.agent_history](public.agent_history.md) [public.ai_preference](public.ai_preference.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.idempotency_key](public.idempotency_key.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.instance_ai_thread_tabs](public.instance_ai_thread_tabs.md) [public.migration_workflow_owner](public.migration_workflow_owner.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.promotion_review](public.promotion_review.md) [public.promotion_run](public.promotion_run.md) [public.self_healing_result](public.self_healing_result.md) [public.skill](public.skill.md) [public.skill_version](public.skill_version.md) [public.trusted_source_identity](public.trusted_source_identity.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_activity](public.workflow_review_activity.md) [public.workflow_review_activity_comment](public.workflow_review_activity_comment.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) [public.workflow_suggestion](public.workflow_suggestion.md) [public.workflow_suggestion_activity](public.workflow_suggestion_activity.md) | | |
| lastActiveAt | date | | true | | | | | lastActiveAt | date | | true | | | |
| lastName | varchar(32) | | true | | | | | lastName | varchar(32) | | true | | | |
| mfaEnabled | boolean | false | false | | | | | mfaEnabled | boolean | false | false | | | |
@ -74,8 +74,13 @@ erDiagram
"public.oauth_user_consents" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE" "public.oauth_user_consents" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.project" }o--o| "public.user" : "FOREIGN KEY (#quot;creatorId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL" "public.project" }o--o| "public.user" : "FOREIGN KEY (#quot;creatorId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.project_relation" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE" "public.project_relation" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.promotion_review" }o--o| "public.user" : "FOREIGN KEY (#quot;approvedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.promotion_review" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.promotion_run" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.self_healing_result" }o--|| "public.user" : "FOREIGN KEY (#quot;backgroundUserId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE" "public.self_healing_result" }o--|| "public.user" : "FOREIGN KEY (#quot;backgroundUserId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.self_healing_result" }o--o| "public.user" : "FOREIGN KEY (#quot;dismissedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL" "public.self_healing_result" }o--o| "public.user" : "FOREIGN KEY (#quot;dismissedById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.skill" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.skill_version" }o--o| "public.user" : "FOREIGN KEY (#quot;createdById#quot;) REFERENCES #quot;user#quot;(id) ON DELETE SET NULL"
"public.trusted_source_identity" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE" "public.trusted_source_identity" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.user_api_keys" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE" "public.user_api_keys" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
"public.user_favorites" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE" "public.user_favorites" }o--|| "public.user" : "FOREIGN KEY (#quot;userId#quot;) REFERENCES #quot;user#quot;(id) ON DELETE CASCADE"
@ -381,6 +386,28 @@ erDiagram
timestamp_3__with_time_zone updatedAt timestamp_3__with_time_zone updatedAt
uuid userId FK uuid userId FK
} }
"public.promotion_review" {
timestamp_3__with_time_zone approvedAt
uuid approvedById FK
varchar_36_ connectionId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
uuid id
timestamp_3__with_time_zone lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
"public.promotion_run" {
varchar_36_ configId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
json details
varchar_16_ direction
uuid id
uuid reviewId FK
varchar_16_ type
}
"public.self_healing_result" { "public.self_healing_result" {
uuid backgroundUserId FK uuid backgroundUserId FK
timestamp_3__with_time_zone completedAt timestamp_3__with_time_zone completedAt
@ -398,6 +425,28 @@ erDiagram
json usage json usage
varchar_36_ workflowId FK varchar_36_ workflowId FK
} }
"public.skill" {
varchar_36_ agentId FK
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_36_ id
varchar_36_ projectId FK
varchar_16_ source
timestamp_3__with_time_zone updatedAt
}
"public.skill_version" {
varchar_64_ contentHash
timestamp_3__with_time_zone createdAt
uuid createdById FK
varchar_1024_ description
json frontmatter
uuid id
text instructions
varchar_128_ name
varchar_36_ skillId FK
timestamp_3__with_time_zone updatedAt
integer version
}
"public.trusted_source_identity" { "public.trusted_source_identity" {
timestamp_3__with_time_zone createdAt timestamp_3__with_time_zone createdAt
timestamp_3__with_time_zone lastSeenAt timestamp_3__with_time_zone lastSeenAt

View File

@ -29,12 +29,14 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| [agent_message_queue](agent_message_queue.md) | 10 | | table | | [agent_message_queue](agent_message_queue.md) | 10 | | table |
| [agent_plan](agent_plan.md) | 8 | | table | | [agent_plan](agent_plan.md) | 8 | | table |
| [agent_plan_history](agent_plan_history.md) | 6 | | table | | [agent_plan_history](agent_plan_history.md) | 6 | | table |
| [agent_skill_dependency](agent_skill_dependency.md) | 4 | | table |
| [agent_task_definition](agent_task_definition.md) | 8 | | table | | [agent_task_definition](agent_task_definition.md) | 8 | | table |
| [agent_task_run_lock](agent_task_run_lock.md) | 6 | | table | | [agent_task_run_lock](agent_task_run_lock.md) | 6 | | table |
| [agent_task_snapshot](agent_task_snapshot.md) | 9 | | table | | [agent_task_snapshot](agent_task_snapshot.md) | 9 | | table |
| [agent_thread_grants](agent_thread_grants.md) | 4 | | table | | [agent_thread_grants](agent_thread_grants.md) | 4 | | table |
| [agent_version_skill_dependency](agent_version_skill_dependency.md) | 4 | | table |
| [agent_workflow_dependency](agent_workflow_dependency.md) | 3 | | table | | [agent_workflow_dependency](agent_workflow_dependency.md) | 3 | | table |
| [agents](agents.md) | 14 | | table | | [agents](agents.md) | 15 | | table |
| [agents_memory_entries](agents_memory_entries.md) | 13 | | table | | [agents_memory_entries](agents_memory_entries.md) | 13 | | table |
| [agents_memory_entry_candidates](agents_memory_entry_candidates.md) | 14 | | table | | [agents_memory_entry_candidates](agents_memory_entry_candidates.md) | 14 | | table |
| [agents_memory_entry_locks](agents_memory_entry_locks.md) | 6 | | table | | [agents_memory_entry_locks](agents_memory_entry_locks.md) | 6 | | table |
@ -119,6 +121,8 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| [promotion_connection](promotion_connection.md) | 7 | | table | | [promotion_connection](promotion_connection.md) | 7 | | table |
| [promotion_connection_project](promotion_connection_project.md) | 4 | | table | | [promotion_connection_project](promotion_connection_project.md) | 4 | | table |
| [promotion_provider](promotion_provider.md) | 8 | | table | | [promotion_provider](promotion_provider.md) | 8 | | table |
| [promotion_review](promotion_review.md) | 10 | | table |
| [promotion_run](promotion_run.md) | 8 | | table |
| [role](role.md) | 7 | | table | | [role](role.md) | 7 | | table |
| [role_mapping_rule](role_mapping_rule.md) | 7 | | table | | [role_mapping_rule](role_mapping_rule.md) | 7 | | table |
| [role_mapping_rule_project](role_mapping_rule_project.md) | 2 | | table | | [role_mapping_rule_project](role_mapping_rule_project.md) | 2 | | table |
@ -131,6 +135,9 @@ Auto-generated from the SQLite migrations in @n8n/db. Do not edit by hand.
| [settings](settings.md) | 3 | | table | | [settings](settings.md) | 3 | | table |
| [shared_credentials](shared_credentials.md) | 5 | | table | | [shared_credentials](shared_credentials.md) | 5 | | table |
| [shared_workflow](shared_workflow.md) | 5 | | table | | [shared_workflow](shared_workflow.md) | 5 | | table |
| [skill](skill.md) | 7 | | table |
| [skill_file](skill_file.md) | 5 | | table |
| [skill_version](skill_version.md) | 11 | | table |
| [tag_entity](tag_entity.md) | 4 | | table | | [tag_entity](tag_entity.md) | 4 | | table |
| [test_case_execution](test_case_execution.md) | 16 | | table | | [test_case_execution](test_case_execution.md) | 16 | | table |
| [test_run](test_run.md) | 16 | | table | | [test_run](test_run.md) | 16 | | table |
@ -205,13 +212,19 @@ erDiagram
"agent_message_queue" }o--o| "agent_execution" : "FOREIGN KEY (steeringExecutionId) REFERENCES agent_execution (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE" "agent_message_queue" }o--o| "agent_execution" : "FOREIGN KEY (steeringExecutionId) REFERENCES agent_execution (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"agent_plan" }o--|| "agent_execution_threads" : "FOREIGN KEY (threadId) REFERENCES agent_execution_threads (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_plan" }o--|| "agent_execution_threads" : "FOREIGN KEY (threadId) REFERENCES agent_execution_threads (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_plan_history" |o--|| "agent_plan" : "FOREIGN KEY (planId) REFERENCES agent_plan (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_plan_history" |o--|| "agent_plan" : "FOREIGN KEY (planId) REFERENCES agent_plan (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_skill_dependency" }o--o| "skill_version" : "FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"agent_skill_dependency" |o--|| "skill" : "FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_skill_dependency" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_task_definition" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "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_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" "agent_task_snapshot" |o--|| "agent_history" : "FOREIGN KEY (versionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_thread_grants" |o--|| "agent_execution_threads" : "FOREIGN KEY (threadId) REFERENCES agent_execution_threads (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_thread_grants" |o--|| "agent_execution_threads" : "FOREIGN KEY (threadId) REFERENCES agent_execution_threads (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_version_skill_dependency" }o--|| "skill_version" : "FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"agent_version_skill_dependency" |o--|| "skill" : "FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_version_skill_dependency" |o--|| "agent_history" : "FOREIGN KEY (agentVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_workflow_dependency" |o--|| "workflow_entity" : "FOREIGN KEY (workflowId) REFERENCES workflow_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_workflow_dependency" |o--|| "workflow_entity" : "FOREIGN KEY (workflowId) REFERENCES workflow_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_workflow_dependency" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_workflow_dependency" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agents" }o--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" }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--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_resources" : "FOREIGN KEY (resourceId) REFERENCES agents_resources (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -336,6 +349,12 @@ erDiagram
"promotion_connection" }o--|| "promotion_provider" : "FOREIGN KEY (providerId) REFERENCES promotion_provider (id) ON UPDATE NO ACTION ON DELETE RESTRICT MATCH NONE" "promotion_connection" }o--|| "promotion_provider" : "FOREIGN KEY (providerId) REFERENCES promotion_provider (id) ON UPDATE NO ACTION ON DELETE RESTRICT MATCH NONE"
"promotion_connection_project" }o--|| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "promotion_connection_project" }o--|| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"promotion_connection_project" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "promotion_connection_project" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"promotion_review" }o--o| "user" : "FOREIGN KEY (approvedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_review" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_review" }o--o| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_run" }o--o| "promotion_review" : "FOREIGN KEY (reviewId) REFERENCES promotion_review (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_run" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_run" }o--o| "promotion_config" : "FOREIGN KEY (configId) REFERENCES promotion_config (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"role_mapping_rule" }o--|| "role" : "FOREIGN KEY (role) REFERENCES role (slug) ON UPDATE CASCADE ON DELETE CASCADE MATCH NONE" "role_mapping_rule" }o--|| "role" : "FOREIGN KEY (role) REFERENCES role (slug) ON UPDATE CASCADE ON DELETE CASCADE MATCH NONE"
"role_mapping_rule_project" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "role_mapping_rule_project" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"role_mapping_rule_project" |o--|| "role_mapping_rule" : "FOREIGN KEY (roleMappingRuleId) REFERENCES role_mapping_rule (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "role_mapping_rule_project" |o--|| "role_mapping_rule" : "FOREIGN KEY (roleMappingRuleId) REFERENCES role_mapping_rule (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -351,6 +370,12 @@ erDiagram
"shared_credentials" |o--|| "credentials_entity" : "FOREIGN KEY (credentialsId) REFERENCES credentials_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "shared_credentials" |o--|| "credentials_entity" : "FOREIGN KEY (credentialsId) REFERENCES credentials_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"shared_workflow" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "shared_workflow" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"shared_workflow" |o--|| "workflow_entity" : "FOREIGN KEY (workflowId) REFERENCES workflow_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "shared_workflow" |o--|| "workflow_entity" : "FOREIGN KEY (workflowId) REFERENCES workflow_entity (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"skill" }o--o| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill_file" |o--|| "skill_version" : "FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill_version" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"skill_version" }o--|| "skill" : "FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"test_case_execution" }o--|| "test_run" : "FOREIGN KEY (testRunId) REFERENCES test_run (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "test_case_execution" }o--|| "test_run" : "FOREIGN KEY (testRunId) REFERENCES test_run (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"test_case_execution" }o--o| "execution_entity" : "FOREIGN KEY (pastExecutionId) REFERENCES execution_entity (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE" "test_case_execution" }o--o| "execution_entity" : "FOREIGN KEY (pastExecutionId) REFERENCES execution_entity (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"test_case_execution" }o--o| "execution_entity" : "FOREIGN KEY (executionId) REFERENCES execution_entity (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE" "test_case_execution" }o--o| "execution_entity" : "FOREIGN KEY (executionId) REFERENCES execution_entity (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
@ -665,6 +690,12 @@ erDiagram
varchar planId PK varchar planId PK
INTEGER revision PK INTEGER revision PK
} }
"agent_skill_dependency" {
varchar_36_ agentId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
"agent_task_definition" { "agent_task_definition" {
varchar_36_ agentId FK varchar_36_ agentId FK
datetime_3_ createdAt datetime_3_ createdAt
@ -700,6 +731,12 @@ erDiagram
varchar_128_ threadId PK varchar_128_ threadId PK
datetime_3_ updatedAt datetime_3_ updatedAt
} }
"agent_version_skill_dependency" {
varchar_36_ agentVersionId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
"agent_workflow_dependency" { "agent_workflow_dependency" {
varchar_36_ agentId PK varchar_36_ agentId PK
datetime_3_ createdAt datetime_3_ createdAt
@ -715,6 +752,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools
@ -1513,6 +1551,28 @@ erDiagram
varchar_32_ type varchar_32_ type
datetime_3_ updatedAt datetime_3_ updatedAt
} }
"promotion_review" {
datetime_3_ approvedAt
varchar approvedById FK
varchar_36_ connectionId FK
datetime_3_ createdAt
varchar createdById FK
varchar id PK
datetime_3_ lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
"promotion_run" {
varchar_36_ configId FK
datetime_3_ createdAt
varchar createdById FK
TEXT details
varchar_16_ direction
varchar id PK
varchar reviewId FK
varchar_16_ type
}
"role" { "role" {
datetime_3_ createdAt datetime_3_ createdAt
TEXT description TEXT description
@ -1637,6 +1697,35 @@ erDiagram
datetime_3_ updatedAt datetime_3_ updatedAt
varchar_36_ workflowId PK varchar_36_ workflowId PK
} }
"skill" {
varchar_36_ agentId FK
datetime_3_ createdAt
varchar createdById FK
varchar_36_ id PK
varchar_36_ projectId FK
varchar_16_ source
datetime_3_ updatedAt
}
"skill_file" {
TEXT content
datetime_3_ createdAt
varchar_512_ path PK
varchar skillVersionId PK
datetime_3_ updatedAt
}
"skill_version" {
varchar_64_ contentHash
datetime_3_ createdAt
varchar createdById FK
varchar_1024_ description
TEXT frontmatter
varchar id PK
TEXT instructions
varchar_128_ name
varchar_36_ skillId FK
datetime_3_ updatedAt
INTEGER version
}
"tag_entity" { "tag_entity" {
datetime_3_ createdAt datetime_3_ createdAt
varchar_36_ id PK varchar_36_ id PK

View File

@ -97,6 +97,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -77,6 +77,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -77,6 +77,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -65,6 +65,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -66,6 +66,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -59,6 +59,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -74,6 +74,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -102,6 +102,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -73,6 +73,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -23,7 +23,7 @@ CREATE TABLE "agent_history" ("versionId" varchar(36) PRIMARY KEY NOT NULL, "age
| skills | TEXT | | true | | | | | skills | TEXT | | true | | | |
| tools | TEXT | | true | | | | | tools | TEXT | | true | | | |
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | | | updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| versionId | varchar(36) | | false | [agent_execution_threads](agent_execution_threads.md) [agent_task_snapshot](agent_task_snapshot.md) [agents](agents.md) | | | | versionId | varchar(36) | | false | [agent_execution_threads](agent_execution_threads.md) [agent_task_snapshot](agent_task_snapshot.md) [agent_version_skill_dependency](agent_version_skill_dependency.md) [agents](agents.md) | | |
## Constraints ## Constraints
@ -50,6 +50,7 @@ erDiagram
"agent_history" }o--o| "user" : "FOREIGN KEY (publishedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE" "agent_history" }o--o| "user" : "FOREIGN KEY (publishedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL 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--o| "agent_history" : "FOREIGN KEY (taskVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_task_snapshot" |o--|| "agent_history" : "FOREIGN KEY (versionId) REFERENCES agent_history (versionId) 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"
"agent_version_skill_dependency" |o--|| "agent_history" : "FOREIGN KEY (agentVersionId) 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--o| "agent_history" : "FOREIGN KEY (activeVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_history" { "agent_history" {
@ -73,6 +74,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools
@ -128,6 +130,12 @@ erDiagram
datetime_3_ updatedAt datetime_3_ updatedAt
varchar_36_ versionId PK varchar_36_ versionId PK
} }
"agent_version_skill_dependency" {
varchar_36_ agentVersionId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
``` ```
--- ---

View File

@ -0,0 +1,99 @@
# agent_skill_dependency
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "agent_skill_dependency" ("agentId" varchar(36) NOT NULL, "skillId" varchar(36) NOT NULL, "skillVersionId" varchar, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), CONSTRAINT "FK_72325bb13511a51847c53fcb377" FOREIGN KEY ("agentId") REFERENCES "agents" ("id") ON DELETE CASCADE, CONSTRAINT "FK_068f21aefba31ae621482f396dc" FOREIGN KEY ("skillId") REFERENCES "skill" ("id") ON DELETE CASCADE, CONSTRAINT "FK_7676571bd6f41d9e32f0d066fe9" FOREIGN KEY ("skillVersionId") REFERENCES "skill_version" ("id") ON DELETE NO ACTION, PRIMARY KEY ("agentId", "skillId"))
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| agentId | varchar(36) | | false | | [agents](agents.md) | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| skillId | varchar(36) | | false | | [skill](skill.md) | |
| skillVersionId | varchar | | true | | [skill_version](skill_version.md) | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE |
| - (Foreign key ID: 1) | FOREIGN KEY | FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| - (Foreign key ID: 2) | FOREIGN KEY | FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| agentId | PRIMARY KEY | PRIMARY KEY (agentId) |
| skillId | PRIMARY KEY | PRIMARY KEY (skillId) |
| sqlite_autoindex_agent_skill_dependency_1 | PRIMARY KEY | PRIMARY KEY (agentId, skillId) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_068f21aefba31ae621482f396d | CREATE INDEX "IDX_068f21aefba31ae621482f396d" ON "agent_skill_dependency" ("skillId") |
| sqlite_autoindex_agent_skill_dependency_1 | PRIMARY KEY (agentId, skillId) |
## Relations
```mermaid
erDiagram
"agent_skill_dependency" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_skill_dependency" |o--|| "skill" : "FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_skill_dependency" }o--o| "skill_version" : "FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"agent_skill_dependency" {
varchar_36_ agentId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
"agents" {
varchar_36_ activeVersionId FK
boolean availableInMCP
datetime_3_ createdAt
varchar_36_ id PK
TEXT integrations
varchar_128_ name
varchar_255_ projectId FK
INTEGER revision
TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt
TEXT skills
TEXT tools
datetime_3_ updatedAt
varchar_36_ versionId
}
"skill" {
varchar_36_ agentId FK
datetime_3_ createdAt
varchar createdById FK
varchar_36_ id PK
varchar_36_ projectId FK
varchar_16_ source
datetime_3_ updatedAt
}
"skill_version" {
varchar_64_ contentHash
datetime_3_ createdAt
varchar createdById FK
varchar_1024_ description
TEXT frontmatter
varchar id PK
TEXT instructions
varchar_128_ name
varchar_36_ skillId FK
datetime_3_ updatedAt
INTEGER version
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -66,6 +66,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -62,6 +62,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -0,0 +1,94 @@
# agent_version_skill_dependency
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "agent_version_skill_dependency" ("agentVersionId" varchar(36) NOT NULL, "skillId" varchar(36) NOT NULL, "skillVersionId" varchar NOT NULL, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), CONSTRAINT "FK_97472baf9196d914d9cd9de6201" FOREIGN KEY ("agentVersionId") REFERENCES "agent_history" ("versionId") ON DELETE CASCADE, CONSTRAINT "FK_c494292243a7e510acd0331c3d1" FOREIGN KEY ("skillId") REFERENCES "skill" ("id") ON DELETE CASCADE, CONSTRAINT "FK_df63badfd7d3f2aa622ece471c4" FOREIGN KEY ("skillVersionId") REFERENCES "skill_version" ("id") ON DELETE NO ACTION, PRIMARY KEY ("agentVersionId", "skillId"))
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| agentVersionId | varchar(36) | | false | | [agent_history](agent_history.md) | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| skillId | varchar(36) | | false | | [skill](skill.md) | |
| skillVersionId | varchar | | false | | [skill_version](skill_version.md) | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE |
| - (Foreign key ID: 1) | FOREIGN KEY | FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| - (Foreign key ID: 2) | FOREIGN KEY | FOREIGN KEY (agentVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| agentVersionId | PRIMARY KEY | PRIMARY KEY (agentVersionId) |
| skillId | PRIMARY KEY | PRIMARY KEY (skillId) |
| sqlite_autoindex_agent_version_skill_dependency_1 | PRIMARY KEY | PRIMARY KEY (agentVersionId, skillId) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_c494292243a7e510acd0331c3d | CREATE INDEX "IDX_c494292243a7e510acd0331c3d" ON "agent_version_skill_dependency" ("skillId") |
| IDX_df63badfd7d3f2aa622ece471c | CREATE INDEX "IDX_df63badfd7d3f2aa622ece471c" ON "agent_version_skill_dependency" ("skillVersionId") |
| sqlite_autoindex_agent_version_skill_dependency_1 | PRIMARY KEY (agentVersionId, skillId) |
## Relations
```mermaid
erDiagram
"agent_version_skill_dependency" |o--|| "agent_history" : "FOREIGN KEY (agentVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_version_skill_dependency" |o--|| "skill" : "FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_version_skill_dependency" }o--|| "skill_version" : "FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"agent_version_skill_dependency" {
varchar_36_ agentVersionId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
"agent_history" {
varchar_36_ agentId FK
varchar_255_ author
datetime_3_ createdAt
varchar publishedById FK
TEXT schema
TEXT skills
TEXT tools
datetime_3_ updatedAt
varchar_36_ versionId PK
}
"skill" {
varchar_36_ agentId FK
datetime_3_ createdAt
varchar createdById FK
varchar_36_ id PK
varchar_36_ projectId FK
varchar_16_ source
datetime_3_ updatedAt
}
"skill_version" {
varchar_64_ contentHash
datetime_3_ createdAt
varchar createdById FK
varchar_1024_ description
TEXT frontmatter
varchar id PK
TEXT instructions
varchar_128_ name
varchar_36_ skillId FK
datetime_3_ updatedAt
INTEGER version
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -59,6 +59,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -6,7 +6,7 @@
<summary><strong>Table Definition</strong></summary> <summary><strong>Table Definition</strong></summary>
```sql ```sql
CREATE TABLE "agents" ("id" varchar(36) PRIMARY KEY NOT NULL, "name" varchar(128) NOT NULL, "projectId" varchar(255) NOT NULL, "integrations" text NOT NULL DEFAULT ('[]'), "schema" text, "tools" text NOT NULL DEFAULT ('{}'), "skills" text NOT NULL DEFAULT ('{}'), "versionId" varchar(36), "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')), "activeVersionId" varchar(36), "availableInMCP" boolean NOT NULL DEFAULT (false), "setupCompletedAt" datetime(3), "revision" integer NOT NULL DEFAULT 0, CONSTRAINT "FK_940597dfe9753375309ce6aeea0" FOREIGN KEY ("activeVersionId") REFERENCES "agent_history" ("versionId") ON DELETE SET NULL ON UPDATE NO ACTION, CONSTRAINT "FK_a30d560207c4071d98aa03c179c" FOREIGN KEY ("projectId") REFERENCES "project" ("id") ON DELETE CASCADE ON UPDATE NO ACTION) CREATE TABLE "agents" ("id" varchar(36) PRIMARY KEY NOT NULL, "name" varchar(128) NOT NULL, "projectId" varchar(255), "integrations" text NOT NULL DEFAULT ('[]'), "schema" text, "tools" text NOT NULL DEFAULT ('{}'), "skills" text NOT NULL DEFAULT ('{}'), "versionId" varchar(36), "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')), "activeVersionId" varchar(36), "availableInMCP" boolean NOT NULL DEFAULT (false), "setupCompletedAt" datetime(3), "revision" integer NOT NULL DEFAULT (0), "scope" varchar(16) NOT NULL DEFAULT ('project'), CONSTRAINT "CHK_agents_scope" CHECK (("scope" IN ('project', 'instance'))), CONSTRAINT "CHK_agents_scope_project" CHECK (("scope" = 'instance') = ("projectId" IS NULL)), CONSTRAINT "FK_940597dfe9753375309ce6aeea0" FOREIGN KEY ("activeVersionId") REFERENCES "agent_history" ("versionId") ON DELETE SET NULL ON UPDATE NO ACTION, CONSTRAINT "FK_a30d560207c4071d98aa03c179c" FOREIGN KEY ("projectId") REFERENCES "project" ("id") ON DELETE CASCADE ON UPDATE NO ACTION)
``` ```
</details> </details>
@ -18,12 +18,13 @@ CREATE TABLE "agents" ("id" varchar(36) PRIMARY KEY NOT NULL, "name" varchar(128
| activeVersionId | varchar(36) | | true | | [agent_history](agent_history.md) | | | activeVersionId | varchar(36) | | true | | [agent_history](agent_history.md) | |
| availableInMCP | boolean | false | false | | | | | availableInMCP | boolean | false | false | | | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | | | createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| id | varchar(36) | | false | [agent_background_job](agent_background_job.md) [agent_channel_status](agent_channel_status.md) [agent_chat_attachments](agent_chat_attachments.md) [agent_chat_subscriptions](agent_chat_subscriptions.md) [agent_checkpoints](agent_checkpoints.md) [agent_credential_dependency](agent_credential_dependency.md) [agent_eval_dataset](agent_eval_dataset.md) [agent_execution_threads](agent_execution_threads.md) [agent_files](agent_files.md) [agent_history](agent_history.md) [agent_task_definition](agent_task_definition.md) [agent_task_run_lock](agent_task_run_lock.md) [agent_workflow_dependency](agent_workflow_dependency.md) [agents_memory_entries](agents_memory_entries.md) [agents_memory_entry_candidates](agents_memory_entry_candidates.md) [agents_memory_entry_locks](agents_memory_entry_locks.md) [agents_memory_entry_sources](agents_memory_entry_sources.md) [agents_observation_cursors](agents_observation_cursors.md) [agents_observation_locks](agents_observation_locks.md) [agents_observations](agents_observations.md) | | | | id | varchar(36) | | false | [agent_background_job](agent_background_job.md) [agent_channel_status](agent_channel_status.md) [agent_chat_attachments](agent_chat_attachments.md) [agent_chat_subscriptions](agent_chat_subscriptions.md) [agent_checkpoints](agent_checkpoints.md) [agent_credential_dependency](agent_credential_dependency.md) [agent_eval_dataset](agent_eval_dataset.md) [agent_execution_threads](agent_execution_threads.md) [agent_files](agent_files.md) [agent_history](agent_history.md) [agent_skill_dependency](agent_skill_dependency.md) [agent_task_definition](agent_task_definition.md) [agent_task_run_lock](agent_task_run_lock.md) [agent_workflow_dependency](agent_workflow_dependency.md) [agents_memory_entries](agents_memory_entries.md) [agents_memory_entry_candidates](agents_memory_entry_candidates.md) [agents_memory_entry_locks](agents_memory_entry_locks.md) [agents_memory_entry_sources](agents_memory_entry_sources.md) [agents_observation_cursors](agents_observation_cursors.md) [agents_observation_locks](agents_observation_locks.md) [agents_observations](agents_observations.md) [skill](skill.md) | | |
| integrations | TEXT | '[]' | false | | | | | integrations | TEXT | '[]' | false | | | |
| name | varchar(128) | | false | | | | | name | varchar(128) | | false | | | |
| projectId | varchar(255) | | false | | [project](project.md) | | | projectId | varchar(255) | | true | | [project](project.md) | |
| revision | INTEGER | 0 | false | | | | | revision | INTEGER | 0 | false | | | |
| schema | TEXT | | true | | | | | schema | TEXT | | true | | | |
| scope | varchar(16) | 'project' | false | | | |
| setupCompletedAt | datetime(3) | | true | | | | | setupCompletedAt | datetime(3) | | true | | | |
| skills | TEXT | '{}' | false | | | | | skills | TEXT | '{}' | false | | | |
| tools | TEXT | '{}' | false | | | | | tools | TEXT | '{}' | false | | | |
@ -34,6 +35,8 @@ CREATE TABLE "agents" ("id" varchar(36) PRIMARY KEY NOT NULL, "name" varchar(128
| Name | Type | Definition | | Name | Type | Definition |
| ---- | ---- | ---------- | | ---- | ---- | ---------- |
| - | CHECK | CHECK (("scope" IN ('project', 'instance'))) |
| - | CHECK | CHECK (("scope" = 'instance') = ("projectId" IS NULL)) |
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE | | - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| - (Foreign key ID: 1) | FOREIGN KEY | FOREIGN KEY (activeVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE | | - (Foreign key ID: 1) | FOREIGN KEY | FOREIGN KEY (activeVersionId) REFERENCES agent_history (versionId) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE |
| id | PRIMARY KEY | PRIMARY KEY (id) | | id | PRIMARY KEY | PRIMARY KEY (id) |
@ -63,6 +66,7 @@ erDiagram
"agent_execution_threads" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_execution_threads" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_files" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_files" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_history" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_history" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_skill_dependency" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_task_definition" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "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_run_lock" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_workflow_dependency" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_workflow_dependency" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -73,7 +77,8 @@ erDiagram
"agents_observation_cursors" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agents_observation_cursors" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents_observation_locks" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agents_observation_locks" |o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents_observations" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agents_observations" }o--|| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "skill" }o--o| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents" { "agents" {
varchar_36_ activeVersionId FK varchar_36_ activeVersionId FK
@ -85,6 +90,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools
@ -218,6 +224,12 @@ erDiagram
varchar_2_ storedAt varchar_2_ storedAt
datetime_3_ updatedAt datetime_3_ updatedAt
} }
"agent_skill_dependency" {
varchar_36_ agentId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
"agent_task_definition" { "agent_task_definition" {
varchar_36_ agentId FK varchar_36_ agentId FK
datetime_3_ createdAt datetime_3_ createdAt
@ -322,6 +334,15 @@ erDiagram
INTEGER tokenCount INTEGER tokenCount
datetime_3_ updatedAt datetime_3_ updatedAt
} }
"skill" {
varchar_36_ agentId FK
datetime_3_ createdAt
varchar createdById FK
varchar_36_ id PK
varchar_36_ projectId FK
varchar_16_ source
datetime_3_ updatedAt
}
"project" { "project" {
datetime_3_ createdAt datetime_3_ createdAt
varchar creatorId FK varchar creatorId FK

View File

@ -85,6 +85,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -90,6 +90,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -65,6 +65,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -84,6 +84,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -65,6 +65,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -69,6 +69,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -84,6 +84,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools

View File

@ -20,7 +20,7 @@ CREATE TABLE "project" ("id" varchar(36) PRIMARY KEY NOT NULL, "name" varchar(25
| customTelemetryTags | TEXT | '[]' | false | | | | | customTelemetryTags | TEXT | '[]' | false | | | |
| description | varchar(512) | | true | | | | | description | varchar(512) | | true | | | |
| icon | TEXT | | true | | | | | icon | TEXT | | true | | | |
| id | varchar(36) | | false | [activity_event](activity_event.md) [agent_chat_attachments](agent_chat_attachments.md) [agent_execution_threads](agent_execution_threads.md) [agents](agents.md) [ai_preference](ai_preference.md) [data_table](data_table.md) [folder](folder.md) [insights_metadata](insights_metadata.md) [instance_ai_threads](instance_ai_threads.md) [project_pool_settings](project_pool_settings.md) [project_relation](project_relation.md) [project_secrets_provider_access](project_secrets_provider_access.md) [promotion_connection_project](promotion_connection_project.md) [role_mapping_rule_project](role_mapping_rule_project.md) [self_healing_result](self_healing_result.md) [shared_credentials](shared_credentials.md) [shared_workflow](shared_workflow.md) [type_availability_policy_scope](type_availability_policy_scope.md) [variables](variables.md) [workflow_review_request](workflow_review_request.md) [workflow_suggestion](workflow_suggestion.md) | | | | id | varchar(36) | | false | [activity_event](activity_event.md) [agent_chat_attachments](agent_chat_attachments.md) [agent_execution_threads](agent_execution_threads.md) [agents](agents.md) [ai_preference](ai_preference.md) [data_table](data_table.md) [folder](folder.md) [insights_metadata](insights_metadata.md) [instance_ai_threads](instance_ai_threads.md) [project_pool_settings](project_pool_settings.md) [project_relation](project_relation.md) [project_secrets_provider_access](project_secrets_provider_access.md) [promotion_connection_project](promotion_connection_project.md) [role_mapping_rule_project](role_mapping_rule_project.md) [self_healing_result](self_healing_result.md) [shared_credentials](shared_credentials.md) [shared_workflow](shared_workflow.md) [skill](skill.md) [type_availability_policy_scope](type_availability_policy_scope.md) [variables](variables.md) [workflow_review_request](workflow_review_request.md) [workflow_suggestion](workflow_suggestion.md) | | |
| name | varchar(255) | | false | | | | | name | varchar(255) | | false | | | |
| type | varchar(36) | | false | | | | | type | varchar(36) | | false | | | |
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | | | updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
@ -48,7 +48,7 @@ erDiagram
"activity_event" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "activity_event" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_chat_attachments" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_chat_attachments" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_execution_threads" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agent_execution_threads" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agents" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "agents" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"ai_preference" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "ai_preference" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"data_table" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "data_table" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"folder" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "folder" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -62,6 +62,7 @@ erDiagram
"self_healing_result" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "self_healing_result" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"shared_credentials" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "shared_credentials" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"shared_workflow" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "shared_workflow" |o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"type_availability_policy_scope" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "type_availability_policy_scope" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"variables" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "variables" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE 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" }o--|| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -153,6 +154,7 @@ erDiagram
varchar_255_ projectId FK varchar_255_ projectId FK
INTEGER revision INTEGER revision
TEXT schema TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt datetime_3_ setupCompletedAt
TEXT skills TEXT skills
TEXT tools TEXT tools
@ -261,6 +263,15 @@ erDiagram
datetime_3_ updatedAt datetime_3_ updatedAt
varchar_36_ workflowId PK varchar_36_ workflowId PK
} }
"skill" {
varchar_36_ agentId FK
datetime_3_ createdAt
varchar createdById FK
varchar_36_ id PK
varchar_36_ projectId FK
varchar_16_ source
datetime_3_ updatedAt
}
"type_availability_policy_scope" { "type_availability_policy_scope" {
datetime_3_ createdAt datetime_3_ createdAt
varchar_16_ defaultAction varchar_16_ defaultAction

View File

@ -18,7 +18,7 @@ CREATE TABLE "promotion_config" ("id" varchar(36) PRIMARY KEY NOT NULL, "connect
| connectionId | varchar(36) | | false | | [promotion_connection](promotion_connection.md) | | | connectionId | varchar(36) | | false | | [promotion_connection](promotion_connection.md) | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | | | createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| direction | varchar(16) | | false | | | | | direction | varchar(16) | | false | | | |
| id | varchar(36) | | false | | | | | id | varchar(36) | | false | [promotion_run](promotion_run.md) | | |
| name | varchar(128) | | false | | | | | name | varchar(128) | | false | | | |
| settings | TEXT | | false | | | | | settings | TEXT | | false | | | |
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | | | updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
@ -45,6 +45,7 @@ CREATE TABLE "promotion_config" ("id" varchar(36) PRIMARY KEY NOT NULL, "connect
erDiagram erDiagram
"promotion_config" }o--|| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "promotion_config" }o--|| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"promotion_run" }o--o| "promotion_config" : "FOREIGN KEY (configId) REFERENCES promotion_config (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_config" { "promotion_config" {
varchar_36_ connectionId FK varchar_36_ connectionId FK
@ -64,6 +65,16 @@ erDiagram
TEXT target TEXT target
datetime_3_ updatedAt datetime_3_ updatedAt
} }
"promotion_run" {
varchar_36_ configId FK
datetime_3_ createdAt
varchar createdById FK
TEXT details
varchar_16_ direction
varchar id PK
varchar reviewId FK
varchar_16_ type
}
``` ```
--- ---

View File

@ -16,7 +16,7 @@ CREATE TABLE "promotion_connection" ("id" varchar(36) PRIMARY KEY NOT NULL, "nam
| Name | Type | Default | Nullable | Children | Parents | Comment | | Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- | | ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | | | createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| id | varchar(36) | | false | [promotion_config](promotion_config.md) [promotion_connection_project](promotion_connection_project.md) | | | | id | varchar(36) | | false | [promotion_config](promotion_config.md) [promotion_connection_project](promotion_connection_project.md) [promotion_review](promotion_review.md) | | |
| name | varchar(128) | | false | | | | | name | varchar(128) | | false | | | |
| providerId | varchar(36) | | false | | [promotion_provider](promotion_provider.md) | | | providerId | varchar(36) | | false | | [promotion_provider](promotion_provider.md) | |
| scope | varchar(16) | | false | | | | | scope | varchar(16) | | false | | | |
@ -47,6 +47,7 @@ erDiagram
"promotion_config" }o--|| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "promotion_config" }o--|| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"promotion_connection_project" }o--|| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "promotion_connection_project" }o--|| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"promotion_review" }o--o| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_connection" }o--|| "promotion_provider" : "FOREIGN KEY (providerId) REFERENCES promotion_provider (id) ON UPDATE NO ACTION ON DELETE RESTRICT MATCH NONE" "promotion_connection" }o--|| "promotion_provider" : "FOREIGN KEY (providerId) REFERENCES promotion_provider (id) ON UPDATE NO ACTION ON DELETE RESTRICT MATCH NONE"
"promotion_connection" { "promotion_connection" {
@ -73,6 +74,18 @@ erDiagram
varchar_36_ projectId PK varchar_36_ projectId PK
datetime_3_ updatedAt datetime_3_ updatedAt
} }
"promotion_review" {
datetime_3_ approvedAt
varchar approvedById FK
varchar_36_ connectionId FK
datetime_3_ createdAt
varchar createdById FK
varchar id PK
datetime_3_ lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
"promotion_provider" { "promotion_provider" {
TEXT auth TEXT auth
varchar_32_ authType varchar_32_ authType

View File

@ -0,0 +1,112 @@
# promotion_review
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "promotion_review" ("id" varchar PRIMARY KEY NOT NULL, "connectionId" varchar(36), "type" varchar(16) NOT NULL, "remoteReviewId" varchar(255), "state" varchar(32) NOT NULL DEFAULT ('open'), "lastStateChangeAt" datetime(3), "createdById" varchar, "approvedById" varchar, "approvedAt" datetime(3), "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), CONSTRAINT "CHK_promotion_review_type" CHECK ("type" IN ('gitlab')), CONSTRAINT "CHK_promotion_review_state" CHECK ("state" IN ('open', 'changes_requested', 'merged', 'closed')), CONSTRAINT "FK_promotion_review_connectionId" FOREIGN KEY ("connectionId") REFERENCES "promotion_connection" ("id") ON DELETE SET NULL, CONSTRAINT "FK_promotion_review_createdById" FOREIGN KEY ("createdById") REFERENCES "user" ("id") ON DELETE SET NULL, CONSTRAINT "FK_promotion_review_approvedById" FOREIGN KEY ("approvedById") REFERENCES "user" ("id") ON DELETE SET NULL)
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| approvedAt | datetime(3) | | true | | | |
| approvedById | varchar | | true | | [user](user.md) | |
| connectionId | varchar(36) | | true | | [promotion_connection](promotion_connection.md) | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| createdById | varchar | | true | | [user](user.md) | |
| id | varchar | | false | [promotion_run](promotion_run.md) | | |
| lastStateChangeAt | datetime(3) | | true | | | |
| remoteReviewId | varchar(255) | | true | | | |
| state | varchar(32) | 'open' | false | | | |
| type | varchar(16) | | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - | CHECK | CHECK ("type" IN ('gitlab')) |
| - | CHECK | CHECK ("state" IN ('open', 'changes_requested', 'merged', 'closed')) |
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (approvedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE |
| - (Foreign key ID: 1) | FOREIGN KEY | FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE |
| - (Foreign key ID: 2) | FOREIGN KEY | FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE |
| id | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_promotion_review_1 | PRIMARY KEY | PRIMARY KEY (id) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_82d6930410e9e6c7d04c515079 | CREATE INDEX "IDX_82d6930410e9e6c7d04c515079" ON "promotion_review" ("state", "createdAt") |
| IDX_93e4ec34f4091a0333af0076b6 | CREATE INDEX "IDX_93e4ec34f4091a0333af0076b6" ON "promotion_review" ("connectionId") |
| IDX_promotion_review_connectionId_remoteReviewId | CREATE UNIQUE INDEX "IDX_promotion_review_connectionId_remoteReviewId" ON "promotion_review" ("connectionId", "remoteReviewId") WHERE "remoteReviewId" IS NOT NULL |
| sqlite_autoindex_promotion_review_1 | PRIMARY KEY (id) |
## Relations
```mermaid
erDiagram
"promotion_review" }o--o| "user" : "FOREIGN KEY (approvedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_review" }o--o| "promotion_connection" : "FOREIGN KEY (connectionId) REFERENCES promotion_connection (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_review" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_run" }o--o| "promotion_review" : "FOREIGN KEY (reviewId) REFERENCES promotion_review (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_review" {
datetime_3_ approvedAt
varchar approvedById FK
varchar_36_ connectionId FK
datetime_3_ createdAt
varchar createdById FK
varchar id PK
datetime_3_ lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
"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
}
"promotion_connection" {
datetime_3_ createdAt
varchar_36_ id PK
varchar_128_ name
varchar_36_ providerId FK
varchar_16_ scope
TEXT target
datetime_3_ updatedAt
}
"promotion_run" {
varchar_36_ configId FK
datetime_3_ createdAt
varchar createdById FK
TEXT details
varchar_16_ direction
varchar id PK
varchar reviewId FK
varchar_16_ type
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -0,0 +1,108 @@
# promotion_run
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "promotion_run" ("id" varchar PRIMARY KEY NOT NULL, "configId" varchar(36), "direction" varchar(16) NOT NULL, "type" varchar(16) NOT NULL, "createdById" varchar, "details" text, "reviewId" varchar, "createdAt" datetime(3) NOT NULL DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), CONSTRAINT "CHK_promotion_run_direction" CHECK ("direction" IN ('promote', 'apply')), CONSTRAINT "CHK_promotion_run_type" CHECK ("type" IN ('git')), CONSTRAINT "FK_promotion_run_configId" FOREIGN KEY ("configId") REFERENCES "promotion_config" ("id") ON DELETE SET NULL, CONSTRAINT "FK_promotion_run_createdById" FOREIGN KEY ("createdById") REFERENCES "user" ("id") ON DELETE SET NULL, CONSTRAINT "FK_promotion_run_reviewId" FOREIGN KEY ("reviewId") REFERENCES "promotion_review" ("id") ON DELETE SET NULL)
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| configId | varchar(36) | | true | | [promotion_config](promotion_config.md) | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| createdById | varchar | | true | | [user](user.md) | |
| details | TEXT | | true | | | |
| direction | varchar(16) | | false | | | |
| id | varchar | | false | | | |
| reviewId | varchar | | true | | [promotion_review](promotion_review.md) | |
| type | varchar(16) | | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - | CHECK | CHECK ("direction" IN ('promote', 'apply')) |
| - | CHECK | CHECK ("type" IN ('git')) |
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (reviewId) REFERENCES promotion_review (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE |
| - (Foreign key ID: 1) | FOREIGN KEY | FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE |
| - (Foreign key ID: 2) | FOREIGN KEY | FOREIGN KEY (configId) REFERENCES promotion_config (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE |
| id | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_promotion_run_1 | PRIMARY KEY | PRIMARY KEY (id) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_5c00951cc85ac1bc6f120b1e69 | CREATE INDEX "IDX_5c00951cc85ac1bc6f120b1e69" ON "promotion_run" ("configId") |
| IDX_b24c3e6b803dc496c8702f12ab | CREATE INDEX "IDX_b24c3e6b803dc496c8702f12ab" ON "promotion_run" ("reviewId") |
| sqlite_autoindex_promotion_run_1 | PRIMARY KEY (id) |
## Relations
```mermaid
erDiagram
"promotion_run" }o--o| "promotion_config" : "FOREIGN KEY (configId) REFERENCES promotion_config (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_run" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_run" }o--o| "promotion_review" : "FOREIGN KEY (reviewId) REFERENCES promotion_review (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_run" {
varchar_36_ configId FK
datetime_3_ createdAt
varchar createdById FK
TEXT details
varchar_16_ direction
varchar id PK
varchar reviewId FK
varchar_16_ type
}
"promotion_config" {
varchar_36_ connectionId FK
datetime_3_ createdAt
varchar_16_ direction
varchar_36_ id PK
varchar_128_ name
TEXT settings
datetime_3_ updatedAt
}
"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
}
"promotion_review" {
datetime_3_ approvedAt
varchar approvedById FK
varchar_36_ connectionId FK
datetime_3_ createdAt
varchar createdById FK
varchar id PK
datetime_3_ lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

140
docs/generated/sqlite-schema/skill.md generated Normal file
View File

@ -0,0 +1,140 @@
# skill
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "skill" ("id" varchar(36) PRIMARY KEY NOT NULL, "projectId" varchar(36), "agentId" varchar(36), "source" varchar(16) NOT NULL, "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_skill_single_target" CHECK ("agentId" IS NULL OR "projectId" IS NULL), CONSTRAINT "FK_402ed37bff0d3134f6e782455ed" FOREIGN KEY ("projectId") REFERENCES "project" ("id") ON DELETE CASCADE, CONSTRAINT "FK_7d4fb6af107e507d9a86293cf9d" FOREIGN KEY ("agentId") REFERENCES "agents" ("id") ON DELETE CASCADE, CONSTRAINT "FK_4de4501583cd1fcd6f5ea85f547" FOREIGN KEY ("createdById") REFERENCES "user" ("id") ON DELETE SET NULL)
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| agentId | varchar(36) | | true | | [agents](agents.md) | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| createdById | varchar | | true | | [user](user.md) | |
| id | varchar(36) | | false | [agent_skill_dependency](agent_skill_dependency.md) [agent_version_skill_dependency](agent_version_skill_dependency.md) [skill_version](skill_version.md) | | |
| projectId | varchar(36) | | true | | [project](project.md) | |
| source | varchar(16) | | false | | | |
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - | CHECK | CHECK ("agentId" IS NULL OR "projectId" IS NULL) |
| - (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 |
| - (Foreign key ID: 2) | FOREIGN KEY | FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| id | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_skill_1 | PRIMARY KEY | PRIMARY KEY (id) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| IDX_402ed37bff0d3134f6e782455e | CREATE INDEX "IDX_402ed37bff0d3134f6e782455e" ON "skill" ("projectId") |
| IDX_7d4fb6af107e507d9a86293cf9 | CREATE INDEX "IDX_7d4fb6af107e507d9a86293cf9" ON "skill" ("agentId") |
| sqlite_autoindex_skill_1 | PRIMARY KEY (id) |
## Relations
```mermaid
erDiagram
"skill" }o--o| "agents" : "FOREIGN KEY (agentId) REFERENCES agents (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_skill_dependency" |o--|| "skill" : "FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"agent_version_skill_dependency" |o--|| "skill" : "FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill_version" }o--|| "skill" : "FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill" }o--o| "project" : "FOREIGN KEY (projectId) REFERENCES project (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill" {
varchar_36_ agentId FK
datetime_3_ createdAt
varchar createdById FK
varchar_36_ id PK
varchar_36_ projectId FK
varchar_16_ source
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
INTEGER revision
TEXT schema
varchar_16_ scope
datetime_3_ setupCompletedAt
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_skill_dependency" {
varchar_36_ agentId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
"agent_version_skill_dependency" {
varchar_36_ agentVersionId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
"skill_version" {
varchar_64_ contentHash
datetime_3_ createdAt
varchar createdById FK
varchar_1024_ description
TEXT frontmatter
varchar id PK
TEXT instructions
varchar_128_ name
varchar_36_ skillId FK
datetime_3_ updatedAt
INTEGER version
}
"project" {
datetime_3_ createdAt
varchar creatorId FK
TEXT customTelemetryTags
varchar_512_ description
TEXT icon
varchar_36_ id PK
varchar_255_ name
varchar_36_ type
datetime_3_ updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -0,0 +1,70 @@
# skill_file
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "skill_file" ("skillVersionId" varchar NOT NULL, "path" varchar(512) NOT NULL, "content" text NOT NULL, "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 "FK_e9ab50b795ec8858702b7333d13" FOREIGN KEY ("skillVersionId") REFERENCES "skill_version" ("id") ON DELETE CASCADE, PRIMARY KEY ("skillVersionId", "path"))
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| content | TEXT | | false | | | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| path | varchar(512) | | false | | | |
| skillVersionId | varchar | | false | | [skill_version](skill_version.md) | |
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - (Foreign key ID: 0) | FOREIGN KEY | FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| path | PRIMARY KEY | PRIMARY KEY (path) |
| skillVersionId | PRIMARY KEY | PRIMARY KEY (skillVersionId) |
| sqlite_autoindex_skill_file_1 | PRIMARY KEY | PRIMARY KEY (skillVersionId, path) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| sqlite_autoindex_skill_file_1 | PRIMARY KEY (skillVersionId, path) |
## Relations
```mermaid
erDiagram
"skill_file" |o--|| "skill_version" : "FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill_file" {
TEXT content
datetime_3_ createdAt
varchar_512_ path PK
varchar skillVersionId PK
datetime_3_ updatedAt
}
"skill_version" {
varchar_64_ contentHash
datetime_3_ createdAt
varchar createdById FK
varchar_1024_ description
TEXT frontmatter
varchar id PK
TEXT instructions
varchar_128_ name
varchar_36_ skillId FK
datetime_3_ updatedAt
INTEGER version
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -0,0 +1,121 @@
# skill_version
## Description
<details>
<summary><strong>Table Definition</strong></summary>
```sql
CREATE TABLE "skill_version" ("id" varchar PRIMARY KEY NOT NULL, "skillId" varchar(36) NOT NULL, "version" integer NOT NULL, "name" varchar(128) NOT NULL, "description" varchar(1024) NOT NULL, "instructions" text NOT NULL, "frontmatter" text, "contentHash" varchar(64) NOT NULL, "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 "UQ_93bb78a1eb4e0890fac6b69df95" UNIQUE ("skillId", "version"), CONSTRAINT "CHK_skill_version_version" CHECK ("version" > 0), CONSTRAINT "FK_f87064c0a29efd2d5195328d91a" FOREIGN KEY ("skillId") REFERENCES "skill" ("id") ON DELETE CASCADE, CONSTRAINT "FK_9565d0fbf32cd463f9b47c7adab" FOREIGN KEY ("createdById") REFERENCES "user" ("id") ON DELETE SET NULL)
```
</details>
## Columns
| Name | Type | Default | Nullable | Children | Parents | Comment |
| ---- | ---- | ------- | -------- | -------- | ------- | ------- |
| contentHash | varchar(64) | | false | | | |
| createdAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| createdById | varchar | | true | | [user](user.md) | |
| description | varchar(1024) | | false | | | |
| frontmatter | TEXT | | true | | | |
| id | varchar | | false | [agent_skill_dependency](agent_skill_dependency.md) [agent_version_skill_dependency](agent_version_skill_dependency.md) [skill_file](skill_file.md) | | |
| instructions | TEXT | | false | | | |
| name | varchar(128) | | false | | | |
| skillId | varchar(36) | | false | | [skill](skill.md) | |
| updatedAt | datetime(3) | STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') | false | | | |
| version | INTEGER | | false | | | |
## Constraints
| Name | Type | Definition |
| ---- | ---- | ---------- |
| - | CHECK | CHECK ("version" > 0) |
| - (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 (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE |
| id | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_skill_version_1 | PRIMARY KEY | PRIMARY KEY (id) |
| sqlite_autoindex_skill_version_2 | UNIQUE | UNIQUE (skillId, version) |
## Indexes
| Name | Definition |
| ---- | ---------- |
| sqlite_autoindex_skill_version_1 | PRIMARY KEY (id) |
| sqlite_autoindex_skill_version_2 | UNIQUE (skillId, version) |
## Relations
```mermaid
erDiagram
"skill_version" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"agent_skill_dependency" }o--o| "skill_version" : "FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"agent_version_skill_dependency" }o--|| "skill_version" : "FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE NO ACTION MATCH NONE"
"skill_file" |o--|| "skill_version" : "FOREIGN KEY (skillVersionId) REFERENCES skill_version (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill_version" }o--|| "skill" : "FOREIGN KEY (skillId) REFERENCES skill (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill_version" {
varchar_64_ contentHash
datetime_3_ createdAt
varchar createdById FK
varchar_1024_ description
TEXT frontmatter
varchar id PK
TEXT instructions
varchar_128_ name
varchar_36_ skillId FK
datetime_3_ updatedAt
INTEGER version
}
"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_skill_dependency" {
varchar_36_ agentId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
"agent_version_skill_dependency" {
varchar_36_ agentVersionId PK
datetime_3_ createdAt
varchar_36_ skillId PK
varchar skillVersionId FK
}
"skill_file" {
TEXT content
datetime_3_ createdAt
varchar_512_ path PK
varchar skillVersionId PK
datetime_3_ updatedAt
}
"skill" {
varchar_36_ agentId FK
datetime_3_ createdAt
varchar createdById FK
varchar_36_ id PK
varchar_36_ projectId FK
varchar_16_ source
datetime_3_ updatedAt
}
```
---
> Generated by [tbls](https://github.com/k1LoW/tbls)

View File

@ -19,7 +19,7 @@ CREATE TABLE "user" ("id" varchar PRIMARY KEY, "email" varchar(255), "firstName"
| disabled | boolean | FALSE | false | | | | | disabled | boolean | FALSE | false | | | |
| email | varchar(255) | | true | | | | | email | varchar(255) | | true | | | |
| firstName | varchar(32) | | true | | | | | firstName | varchar(32) | | true | | | |
| id | varchar | | true | [activity_event](activity_event.md) [agent_eval_dataset](agent_eval_dataset.md) [agent_eval_rating](agent_eval_rating.md) [agent_eval_run](agent_eval_run.md) [agent_execution_threads](agent_execution_threads.md) [agent_history](agent_history.md) [ai_preference](ai_preference.md) [auth_identity](auth_identity.md) [chat_hub_agents](chat_hub_agents.md) [chat_hub_sessions](chat_hub_sessions.md) [chat_hub_tools](chat_hub_tools.md) [dynamic_credential_user_entry](dynamic_credential_user_entry.md) [evaluation_collection](evaluation_collection.md) [idempotency_key](idempotency_key.md) [instance_ai_mcp_registry_connections](instance_ai_mcp_registry_connections.md) [instance_ai_pending_confirmations](instance_ai_pending_confirmations.md) [instance_ai_thread_grants](instance_ai_thread_grants.md) [instance_ai_thread_tabs](instance_ai_thread_tabs.md) [migration_workflow_owner](migration_workflow_owner.md) [oauth_access_tokens](oauth_access_tokens.md) [oauth_authorization_codes](oauth_authorization_codes.md) [oauth_refresh_tokens](oauth_refresh_tokens.md) [oauth_user_consents](oauth_user_consents.md) [project](project.md) [project_relation](project_relation.md) [self_healing_result](self_healing_result.md) [trusted_source_identity](trusted_source_identity.md) [user_api_keys](user_api_keys.md) [user_favorites](user_favorites.md) [workflow_builder_session](workflow_builder_session.md) [workflow_publish_history](workflow_publish_history.md) [workflow_review_activity](workflow_review_activity.md) [workflow_review_activity_comment](workflow_review_activity_comment.md) [workflow_review_request](workflow_review_request.md) [workflow_review_request_authors](workflow_review_request_authors.md) [workflow_review_request_reviewers](workflow_review_request_reviewers.md) [workflow_suggestion](workflow_suggestion.md) [workflow_suggestion_activity](workflow_suggestion_activity.md) | | | | id | varchar | | true | [activity_event](activity_event.md) [agent_eval_dataset](agent_eval_dataset.md) [agent_eval_rating](agent_eval_rating.md) [agent_eval_run](agent_eval_run.md) [agent_execution_threads](agent_execution_threads.md) [agent_history](agent_history.md) [ai_preference](ai_preference.md) [auth_identity](auth_identity.md) [chat_hub_agents](chat_hub_agents.md) [chat_hub_sessions](chat_hub_sessions.md) [chat_hub_tools](chat_hub_tools.md) [dynamic_credential_user_entry](dynamic_credential_user_entry.md) [evaluation_collection](evaluation_collection.md) [idempotency_key](idempotency_key.md) [instance_ai_mcp_registry_connections](instance_ai_mcp_registry_connections.md) [instance_ai_pending_confirmations](instance_ai_pending_confirmations.md) [instance_ai_thread_grants](instance_ai_thread_grants.md) [instance_ai_thread_tabs](instance_ai_thread_tabs.md) [migration_workflow_owner](migration_workflow_owner.md) [oauth_access_tokens](oauth_access_tokens.md) [oauth_authorization_codes](oauth_authorization_codes.md) [oauth_refresh_tokens](oauth_refresh_tokens.md) [oauth_user_consents](oauth_user_consents.md) [project](project.md) [project_relation](project_relation.md) [promotion_review](promotion_review.md) [promotion_run](promotion_run.md) [self_healing_result](self_healing_result.md) [skill](skill.md) [skill_version](skill_version.md) [trusted_source_identity](trusted_source_identity.md) [user_api_keys](user_api_keys.md) [user_favorites](user_favorites.md) [workflow_builder_session](workflow_builder_session.md) [workflow_publish_history](workflow_publish_history.md) [workflow_review_activity](workflow_review_activity.md) [workflow_review_activity_comment](workflow_review_activity_comment.md) [workflow_review_request](workflow_review_request.md) [workflow_review_request_authors](workflow_review_request_authors.md) [workflow_review_request_reviewers](workflow_review_request_reviewers.md) [workflow_suggestion](workflow_suggestion.md) [workflow_suggestion_activity](workflow_suggestion_activity.md) | | |
| lastActiveAt | date | | true | | | | | lastActiveAt | date | | true | | | |
| lastName | varchar(32) | | true | | | | | lastName | varchar(32) | | true | | | |
| mfaEnabled | boolean | FALSE | false | | | | | mfaEnabled | boolean | FALSE | false | | | |
@ -80,8 +80,13 @@ erDiagram
"oauth_user_consents" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "oauth_user_consents" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"project" }o--o| "user" : "FOREIGN KEY (creatorId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE" "project" }o--o| "user" : "FOREIGN KEY (creatorId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"project_relation" |o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "project_relation" |o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"promotion_review" }o--o| "user" : "FOREIGN KEY (approvedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_review" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"promotion_run" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"self_healing_result" }o--o| "user" : "FOREIGN KEY (dismissedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE" "self_healing_result" }o--o| "user" : "FOREIGN KEY (dismissedById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"self_healing_result" }o--|| "user" : "FOREIGN KEY (backgroundUserId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "self_healing_result" }o--|| "user" : "FOREIGN KEY (backgroundUserId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"skill" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"skill_version" }o--o| "user" : "FOREIGN KEY (createdById) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE SET NULL MATCH NONE"
"trusted_source_identity" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "trusted_source_identity" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"user_api_keys" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "user_api_keys" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
"user_favorites" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE" "user_favorites" }o--|| "user" : "FOREIGN KEY (userId) REFERENCES user (id) ON UPDATE NO ACTION ON DELETE CASCADE MATCH NONE"
@ -387,6 +392,28 @@ erDiagram
datetime_3_ updatedAt datetime_3_ updatedAt
varchar userId PK varchar userId PK
} }
"promotion_review" {
datetime_3_ approvedAt
varchar approvedById FK
varchar_36_ connectionId FK
datetime_3_ createdAt
varchar createdById FK
varchar id PK
datetime_3_ lastStateChangeAt
varchar_255_ remoteReviewId
varchar_32_ state
varchar_16_ type
}
"promotion_run" {
varchar_36_ configId FK
datetime_3_ createdAt
varchar createdById FK
TEXT details
varchar_16_ direction
varchar id PK
varchar reviewId FK
varchar_16_ type
}
"self_healing_result" { "self_healing_result" {
varchar backgroundUserId FK varchar backgroundUserId FK
datetime_3_ completedAt datetime_3_ completedAt
@ -404,6 +431,28 @@ erDiagram
TEXT usage TEXT usage
varchar_36_ workflowId FK varchar_36_ workflowId FK
} }
"skill" {
varchar_36_ agentId FK
datetime_3_ createdAt
varchar createdById FK
varchar_36_ id PK
varchar_36_ projectId FK
varchar_16_ source
datetime_3_ updatedAt
}
"skill_version" {
varchar_64_ contentHash
datetime_3_ createdAt
varchar createdById FK
varchar_1024_ description
TEXT frontmatter
varchar id PK
TEXT instructions
varchar_128_ name
varchar_36_ skillId FK
datetime_3_ updatedAt
INTEGER version
}
"trusted_source_identity" { "trusted_source_identity" {
datetime_3_ createdAt datetime_3_ createdAt
datetime_3_ lastSeenAt datetime_3_ lastSeenAt

View File

@ -753,6 +753,27 @@ describe('createDelegateSubAgentTool', () => {
expect(runSubAgent.mock.calls[0]?.[0]).not.toHaveProperty('parentAbortSignal'); expect(runSubAgent.mock.calls[0]?.[0]).not.toHaveProperty('parentAbortSignal');
expect(runSubAgent.mock.calls[0]?.[0]).not.toHaveProperty('parentExecutionCounter'); expect(runSubAgent.mock.calls[0]?.[0]).not.toHaveProperty('parentExecutionCounter');
expect(runSubAgent.mock.calls[0]?.[0]).not.toHaveProperty('parentTelemetry'); expect(runSubAgent.mock.calls[0]?.[0]).not.toHaveProperty('parentTelemetry');
expect(runSubAgent.mock.calls[0]?.[0]).not.toHaveProperty('parentOnGuardrailNotice');
});
it('forwards the guardrail notice sink from the tool context to the runner callback', async () => {
const runSubAgent = vi
.fn<DelegateSubAgentRunner>()
.mockResolvedValue({ status: 'completed', taskPath: '/root/research_api', answer: 'done' });
const tool = createDelegateSubAgentTool({ runSubAgent });
const parentOnGuardrailNotice = vi.fn();
await tool.handler?.(input, {
runId: 'parent-run-1',
onGuardrailNotice: parentOnGuardrailNotice,
});
expect(runSubAgent).toHaveBeenCalledWith(
expect.objectContaining({ parentOnGuardrailNotice }),
expect.objectContaining({
runInlineSubAgent: expect.any(Function),
}),
);
}); });
it('forwards the parent telemetry from the tool context to the runner callback', async () => { it('forwards the parent telemetry from the tool context to the runner callback', async () => {
@ -1203,6 +1224,66 @@ describe('generateResultToDelegateSubAgentOutput', () => {
}); });
}); });
it('maps a guardrail stop to failed with the session cap reason', () => {
const result: GenerateResult = {
runId: 'child-run-6',
messages: [],
finishReason: 'guardrail',
guardrail: { code: 'budget.session' },
getState: () => ({
status: 'failed',
messageList: { messages: [], historyIds: [], inputIds: [], responseIds: [] },
pendingToolCalls: {},
}),
};
expect(generateResultToDelegateSubAgentOutput('/root/x_0', result)).toMatchObject({
status: 'failed',
finishReason: 'guardrail',
error: 'The sub-agent run was stopped: the session cost cap is spent.',
});
});
it('maps a monthly budget stop to failed with the monthly reason', () => {
const result: GenerateResult = {
runId: 'child-run-7',
messages: [],
finishReason: 'guardrail',
guardrail: { code: 'budget.monthly' },
getState: () => ({
status: 'failed',
messageList: { messages: [], historyIds: [], inputIds: [], responseIds: [] },
pendingToolCalls: {},
}),
};
expect(generateResultToDelegateSubAgentOutput('/root/x_0', result)).toMatchObject({
status: 'failed',
finishReason: 'guardrail',
error: 'The sub-agent run was stopped: the monthly budget is spent.',
});
});
it('keeps a recorded error over the guardrail stop reason', () => {
const result: GenerateResult = {
runId: 'child-run-8',
messages: [],
finishReason: 'guardrail',
guardrail: { code: 'budget.session' },
error: new Error('boom'),
getState: () => ({
status: 'failed',
messageList: { messages: [], historyIds: [], inputIds: [], responseIds: [] },
pendingToolCalls: {},
}),
};
expect(generateResultToDelegateSubAgentOutput('/root/x_0', result)).toMatchObject({
status: 'failed',
error: 'boom',
});
});
it('maps a cancelled child run to cancelled, even though it also reports an error', () => { it('maps a cancelled child run to cancelled, even though it also reports an error', () => {
const result: GenerateResult = { const result: GenerateResult = {
runId: 'child-run-5', runId: 'child-run-5',

View File

@ -625,4 +625,37 @@ describe('McpConnection — approval declaration', () => {
expect(conn.declaresApproval()).toBe(true); expect(conn.declaresApproval()).toBe(true);
}); });
it('does not declare approval for non-interrupting tool configuration', () => {
const conn = new McpConnection({
name: 's1',
url: 'https://example.test/mcp',
configureTools: () => ({ toolFilter: { mode: 'exclude', tools: ['x'] } }),
configureToolsNonInterrupting: true,
});
expect(conn.declaresApproval()).toBe(false);
});
it('ignores the non-interrupting flag when there is no tool configuration', () => {
const conn = new McpConnection({
name: 's1',
url: 'https://example.test/mcp',
configureToolsNonInterrupting: true,
});
expect(conn.declaresApproval()).toBe(false);
});
it('still declares approval for a static requireApproval with non-interrupting tool configuration', () => {
const conn = new McpConnection({
name: 's1',
url: 'https://example.test/mcp',
configureTools: () => ({}),
configureToolsNonInterrupting: true,
requireApproval: ['delete'],
});
expect(conn.declaresApproval()).toBe(true);
});
}); });

View File

@ -873,6 +873,19 @@ describe('createModel', () => {
expect(model.useDeploymentBasedUrls).toBeUndefined(); expect(model.useDeploymentBasedUrls).toBeUndefined();
}); });
it('should use the deployment name on a Foundry endpoint when provided', () => {
// A Foundry deployment can be named differently from the model it
// serves, so the user's deployment name must reach the request path.
const model = createModel({
id: 'azure-openai/gpt-4.1-nano',
apiKey: 'az-key',
endpointType: 'foundry',
baseURL: 'https://my-resource.services.ai.azure.com/openai/v1',
deploymentName: 'my-chat-model',
}) as unknown as Record<string, unknown>;
expect(model.modelId).toBe('my-chat-model');
});
it('should treat a foundry endpoint without resourceName as valid', () => { it('should treat a foundry endpoint without resourceName as valid', () => {
expect(() => expect(() =>
createModel({ createModel({
@ -993,6 +1006,19 @@ describe('createModel', () => {
expect(mockClientOAuth2.credentials.getToken).toHaveBeenCalledTimes(1); expect(mockClientOAuth2.credentials.getToken).toHaveBeenCalledTimes(1);
}); });
it('uses the deployment name on the Foundry Entra path when provided', () => {
// The deployment name can differ from the model it serves; it reaches
// the OpenAI-compatible path as the model id.
const model = createModel({
id: 'azure-openai/gpt-4.1-nano',
endpointType: 'foundry',
baseURL: 'https://my-resource.services.ai.azure.com/openai/v1',
deploymentName: 'my-chat-model',
...entraCreds,
}) as unknown as Record<string, unknown>;
expect(model.modelId).toBe('my-chat-model');
});
it('rejects credentials that supply both apiKey and Entra', () => { it('rejects credentials that supply both apiKey and Entra', () => {
expect(() => expect(() =>
createModel({ createModel({

View File

@ -237,6 +237,68 @@ describe('parseObservationLogMarkdown', () => {
]); ]);
expect(parsed.skippedLines).toEqual(['not a bullet']); expect(parsed.skippedLines).toEqual(['not a bullet']);
}); });
it('appends indented unmarked detail lines to the entry above', () => {
const parsed = parseObservationLogMarkdown(
[
"* CRITICAL (15:09) User's invoice rules:",
' * Count only invoices with status paid or pending.',
' - Status void means cancelled.',
'* IMPORTANT (15:10) Open questions for the user',
' * INFO (15:10) Setup is blocked on two answers.',
' 1. Which bridge do they use?',
' 2. Which webhook URL?',
].join('\n'),
);
expect(parsed.entries).toEqual([
{
marker: 'critical',
text: "User's invoice rules: Count only invoices with status paid or pending. Status void means cancelled.",
parentIndex: null,
},
{ marker: 'important', text: 'Open questions for the user', parentIndex: null },
{
marker: 'info',
text: 'Setup is blocked on two answers. 1. Which bridge do they use? 2. Which webhook URL?',
parentIndex: 1,
},
]);
expect(parsed.skippedLines).toEqual([]);
});
it('joins a detail line with a semicolon when the entry has no closing punctuation', () => {
const parsed = parseObservationLogMarkdown(
['* INFO (10:02) Published version 90f4e3d6', ' * Current draft fbda5a15'].join('\n'),
);
expect(parsed.entries).toEqual([
{
marker: 'info',
text: 'Published version 90f4e3d6; Current draft fbda5a15',
parentIndex: null,
},
]);
});
it('keeps detail lines that start with an uppercase word', () => {
const parsed = parseObservationLogMarkdown(
[
'* INFO (10:02) Endpoints checked:',
' * GET /orders returns 200.',
' * API key rotated.',
].join('\n'),
);
expect(parsed.entries).toEqual([
{
marker: 'info',
text: 'Endpoints checked: GET /orders returns 200. API key rotated.',
parentIndex: null,
},
]);
expect(parsed.skippedLines).toEqual([]);
});
}); });
describe('renderObserverTranscript', () => { describe('renderObserverTranscript', () => {
@ -520,6 +582,43 @@ describe('runObservationLogObserver', () => {
}, },
); );
it('writes observations with indented detail lists and advances the cursor', async () => {
const store = new InMemoryMemory();
await store.saveThread({ id: 'thread-1', resourceId: 'user-1' });
await store.saveMessages({
threadId: 'thread-1',
resourceId: 'user-1',
messages: [message('m1', 'user', 'Remember my rules.', new Date(2026, 4, 12, 14, 30))],
});
const result = await runObservationLogObserver({
memory: store,
observationScopeId: 'thread-1',
observationLogTailLimit: 20,
tokenCounter: () => 10,
now: new Date(2026, 4, 12, 14, 31),
observe: async () =>
await Promise.resolve(
[
'* CRITICAL (14:31) User rules:',
' * Count paid invoices.',
' * Skip void ones.',
].join('\n'),
),
});
expect(result).toMatchObject({
status: 'ran',
observationsWritten: 1,
cursorAdvanced: true,
skippedLines: [],
});
expect(await store.getActiveObservationLog({ observationScopeId: 'thread-1' })).toMatchObject([
{ marker: 'critical', text: 'User rules: Count paid invoices. Skip void ones.' },
]);
expect(await store.getCursor('thread-1')).toMatchObject({ lastObservedMessageId: 'm1' });
});
it('writes parsed observations and advances the cursor after observing', async () => { it('writes parsed observations and advances the cursor after observing', async () => {
const store = new InMemoryMemory(); const store = new InMemoryMemory();
const parentText = 'User needs the current request remembered.'; const parentText = 'User needs the current request remembered.';
@ -610,6 +709,12 @@ describe('runObservationLogObserver', () => {
'```\nNO_OBSERVATIONS\n```', '```\nNO_OBSERVATIONS\n```',
'NO_OBSERVATIONS\n* CRITICAL Keep this fact.', 'NO_OBSERVATIONS\n* CRITICAL Keep this fact.',
'* CRITICAL Keep this fact.\nUnformatted detail.', '* CRITICAL Keep this fact.\nUnformatted detail.',
' Indented detail before any entry.\n* CRITICAL Keep this fact.',
'* CRITICAL Keep this fact.\n * COMPLETED (14:31) Unknown marker.',
'* CRITICAL Keep this fact.\n * COMPLETED Deploy is set for noon.',
'* CRITICAL Keep this fact.\n * INFO: Marker with a colon.',
'* CRITICAL Keep this fact.\n ```\n code\n ```',
'* CRITICAL Keep this fact.\n NO_OBSERVATIONS',
'* INFO ', '* INFO ',
'```\n* CRITICAL Keep this fact.\n```', '```\n* CRITICAL Keep this fact.\n```',
])('rejects an invalid response without changing memory: %j', async (output) => { ])('rejects an invalid response without changing memory: %j', async (output) => {

View File

@ -302,9 +302,9 @@ export class McpConnection {
* without requiring a network connection. * without requiring a network connection.
*/ */
declaresApproval(): boolean { declaresApproval(): boolean {
const { configureTools, requireApproval } = this.config; const { configureTools, configureToolsNonInterrupting, requireApproval } = this.config;
return ( return (
configureTools !== undefined || (configureTools !== undefined && !configureToolsNonInterrupting) ||
requireApproval === true || requireApproval === true ||
(Array.isArray(requireApproval) && requireApproval.length > 0) (Array.isArray(requireApproval) && requireApproval.length > 0)
); );

View File

@ -42,6 +42,8 @@ A valid response has exactly one of these forms:
Use only one indentation level. A child attaches to the preceding top-level bullet in this response. Never omit the \`*\` prefix. Use only one indentation level. A child attaches to the preceding top-level bullet in this response. Never omit the \`*\` prefix.
Every line is one observation with its own marker. To add details to an observation, write each detail as a marked child, or put the details on the same line separated by semicolons. Never write a plain sub-list, a numbered list, or any line without a marker.
2. Exactly this marker when there is nothing durable to record: 2. Exactly this marker when there is nothing durable to record:
NO_OBSERVATIONS NO_OBSERVATIONS
@ -90,6 +92,16 @@ GOOD:
* CRITICAL (14:30) User approved the data migration. Deployment requires separate approval. * CRITICAL (14:30) User approved the data migration. Deployment requires separate approval.
* IMPORTANT (14:31) Agent plans to start the migration; completion is not verified. * IMPORTANT (14:31) Agent plans to start the migration; completion is not verified.
Details go on marked lines
BAD:
* CRITICAL (15:09) User's invoice rules:
* Count only invoices with status paid or pending.
- Status void means cancelled.
GOOD:
* CRITICAL (15:09) User's invoice rules: count only invoices with status paid or pending; status void means cancelled.
Keep verification evidence together Keep verification evidence together
Transcript: Transcript:

View File

@ -29,6 +29,12 @@ const MARKER_BY_TOKEN: Record<string, ObservationLogMarker> = {
const BULLET_PATTERN = const BULLET_PATTERN =
/^(\s*)[*-]\s+(CRITICAL|IMPORTANT|INFO|COMPLETION)(?:\s+\(\d{2}:\d{2}\))?\s+(.+)$/iu; /^(\s*)[*-]\s+(CRITICAL|IMPORTANT|INFO|COMPLETION)(?:\s+\(\d{2}:\d{2}\))?\s+(.+)$/iu;
/**
* Indented lines that are malformed structure, not detail: a fence, the sentinel, a timed
* unknown marker, or a misspelled marker. Other uppercase words (API, GET) stay detail.
*/
const NON_DETAIL_PATTERN =
/^(?:```|NO_OBSERVATIONS$|(?:[*-]\s+)?(?:[A-Z_]+\s+\(\d{2}:\d{2}\)|(?:COMPLET|CRITIC|IMPORTAN|INFO)[A-Z]*\b))/u;
const DEFAULT_MAX_SERIALIZED_CHARS = 2_000; const DEFAULT_MAX_SERIALIZED_CHARS = 2_000;
const DEFAULT_MAX_STRING_CHARS = 500; const DEFAULT_MAX_STRING_CHARS = 500;
const DEFAULT_MAX_ARRAY_ITEMS = 20; const DEFAULT_MAX_ARRAY_ITEMS = 20;
@ -119,6 +125,13 @@ export function parseObservationLogMarkdown(markdown: string): ParseObservationL
const match = BULLET_PATTERN.exec(rawLine); const match = BULLET_PATTERN.exec(rawLine);
if (!match) { if (!match) {
// Models often add an indented detail list under an observation. Keep
// that detail on the entry above instead of rejecting the response.
const previous = entries.at(-1);
if (previous && /^\s/.test(rawLine) && !NON_DETAIL_PATTERN.test(trimmed)) {
previous.text = appendObservationDetail(previous.text, trimmed);
continue;
}
skippedLines.push(rawLine); skippedLines.push(rawLine);
continue; continue;
} }
@ -141,6 +154,12 @@ export function parseObservationLogMarkdown(markdown: string): ParseObservationL
return { entries, skippedLines }; return { entries, skippedLines };
} }
/** Joins a detail line onto one line, so the rendered log keeps one entry per line. */
function appendObservationDetail(text: string, detailLine: string): string {
const detail = detailLine.replace(/^[*-]\s+/, '');
return /[:;.!?]$/.test(text) ? `${text} ${detail}` : `${text}; ${detail}`;
}
export function renderObserverTranscript( export function renderObserverTranscript(
messages: AgentDbMessage[], messages: AgentDbMessage[],
options: RenderObserverTranscriptOptions = {}, options: RenderObserverTranscriptOptions = {},

View File

@ -412,6 +412,9 @@ const LANGUAGE_PROVIDERS: ProviderRegistry = {
// `…/openai/v1/openai`. Drive it as a plain OpenAI-compatible endpoint // `…/openai/v1/openai`. Drive it as a plain OpenAI-compatible endpoint
// so the configured base is used verbatim. // so the configured base is used verbatim.
if (endpointType === 'foundry') { if (endpointType === 'foundry') {
// The path segment Foundry matches against is the user-chosen
// deployment name, which can differ from the model it serves.
const deploymentId = deploymentName ?? model;
if (isEntra) { if (isEntra) {
// `buildOpenAiCompatible` has no `tokenProvider` slot, so wrap the // `buildOpenAiCompatible` has no `tokenProvider` slot, so wrap the
// transport to inject `Authorization: Bearer <token>` per request. // transport to inject `Authorization: Bearer <token>` per request.
@ -420,11 +423,17 @@ const LANGUAGE_PROVIDERS: ProviderRegistry = {
'azure-openai', 'azure-openai',
undefined, undefined,
{ baseURL }, { baseURL },
model, deploymentId,
withBearerAuth(fetch, tokenProvider), withBearerAuth(fetch, tokenProvider),
); );
} }
return buildOpenAiCompatible('azure-openai', undefined, { apiKey, baseURL }, model, fetch); return buildOpenAiCompatible(
'azure-openai',
undefined,
{ apiKey, baseURL },
deploymentId,
fetch,
);
} }
// Classic Azure OpenAI (`*.openai.azure.com`, or `resourceName` only). // Classic Azure OpenAI (`*.openai.azure.com`, or `resourceName` only).
@ -435,9 +444,10 @@ const LANGUAGE_PROVIDERS: ProviderRegistry = {
// selects the Responses API + the `/v1/` path, which Azure rejects with // selects the Responses API + the `/v1/` path, which Azure rejects with
// "API version not supported" for date-based versions. // "API version not supported" for date-based versions.
// //
// Azure deployments are user-named and surfaced in the deployment-based // Azure deployments are user-named and surfaced in the URL path on
// URL path. The catalog model id is not the deployment id, so prefer the // both endpoint types. The catalog model id is not the deployment id,
// user's `deploymentName` when provided and fall back to the model id. // so prefer the user's `deploymentName` when provided and fall back to
// the model id.
const { createAzure } = require('@ai-sdk/azure') as typeof import('@ai-sdk/azure'); const { createAzure } = require('@ai-sdk/azure') as typeof import('@ai-sdk/azure');
let normalizedBaseURL = baseURL; let normalizedBaseURL = baseURL;
// SDK expects url like `https://resourceName.openai.azure.com/openai` // SDK expects url like `https://resourceName.openai.azure.com/openai`

View File

@ -75,9 +75,10 @@ export const PROVIDER_CREDENTIAL_SCHEMAS = {
*/ */
endpointType: z.enum(['classic', 'foundry']).optional(), endpointType: z.enum(['classic', 'foundry']).optional(),
/** /**
* User-defined Azure deployment name for classic endpoints. The catalog * User-defined Azure deployment name. The catalog model id is not the
* model id is not the deployment id, so the agent flow must carry this * deployment id, so the agent flow must carry this separately. Used by
* separately. Only used by the classic branch. * both the classic and Foundry branches; on Foundry it overrides the
* model id in the request path.
*/ */
deploymentName: z.string().optional(), deploymentName: z.string().optional(),
/** /**

View File

@ -240,6 +240,9 @@ function createDelegateSubAgentRequest(
? { parentExecutionCounter: withoutMessageCount(ctx.executionCounter) } ? { parentExecutionCounter: withoutMessageCount(ctx.executionCounter) }
: {}), : {}),
...(ctx.parentTelemetry !== undefined ? { parentTelemetry: ctx.parentTelemetry } : {}), ...(ctx.parentTelemetry !== undefined ? { parentTelemetry: ctx.parentTelemetry } : {}),
...(ctx.onGuardrailNotice !== undefined
? { parentOnGuardrailNotice: ctx.onGuardrailNotice }
: {}),
...(policy !== undefined ? { policy } : {}), ...(policy !== undefined ? { policy } : {}),
}; };
} }
@ -477,6 +480,10 @@ function resolveDelegateSubAgentStatus(
// error, so the state decides which of the two this really was. // error, so the state decides which of the two this really was.
return result.getState().status === 'cancelled' ? 'cancelled' : 'failed'; return result.getState().status === 'cancelled' ? 'cancelled' : 'failed';
} }
// A child agent hit a guardrail stop.
if (result.finishReason === 'guardrail') {
return 'failed';
}
if (result.pendingSuspend !== undefined && result.pendingSuspend.length > 0) { if (result.pendingSuspend !== undefined && result.pendingSuspend.length > 0) {
return 'suspended'; return 'suspended';
} }
@ -497,6 +504,17 @@ export function failedDelegatedChildSuspendOutput(
}; };
} }
function guardrailStopMessage(code: string | undefined): string {
switch (code) {
case 'budget.session':
return 'The sub-agent run was stopped: the session cost cap is spent.';
case 'budget.monthly':
return 'The sub-agent run was stopped: the monthly budget is spent.';
default:
return `The sub-agent run was stopped by a guardrail (${code ?? 'unknown code'}).`;
}
}
/** Map an agent {@link GenerateResult} into the delegate tool's output shape. */ /** Map an agent {@link GenerateResult} into the delegate tool's output shape. */
export function generateResultToDelegateSubAgentOutput( export function generateResultToDelegateSubAgentOutput(
taskPath: SubAgentTaskPath, taskPath: SubAgentTaskPath,
@ -518,7 +536,11 @@ export function generateResultToDelegateSubAgentOutput(
} }
: {}), : {}),
...(result.finishReason !== undefined ? { finishReason: result.finishReason } : {}), ...(result.finishReason !== undefined ? { finishReason: result.finishReason } : {}),
...(result.error !== undefined ? { error: stringifyUnknown(result.error) } : {}), ...(result.error !== undefined
? { error: stringifyUnknown(result.error) }
: result.finishReason === 'guardrail'
? { error: guardrailStopMessage(result.guardrail?.code) }
: {}),
...(status === 'suspended' && result.pendingSuspend !== undefined ...(status === 'suspended' && result.pendingSuspend !== undefined
? { pendingSuspend: result.pendingSuspend } ? { pendingSuspend: result.pendingSuspend }
: {}), : {}),

View File

@ -170,6 +170,7 @@ function createToolContext(
abortSignal: executionContext.abortSignal, abortSignal: executionContext.abortSignal,
executionCounter: executionContext.executionCounter, executionCounter: executionContext.executionCounter,
approvalContext: executionContext.approvalContext, approvalContext: executionContext.approvalContext,
onGuardrailNotice: executionContext.onGuardrailNotice,
}; };
} }

View File

@ -401,6 +401,7 @@ export class ToolCallRunner {
continuation, continuation,
resumeSchema, resumeSchema,
onSuspend, onSuspend,
onGuardrailNotice: params.guardrails?.onNotice,
}), }),
abortSignal, abortSignal,
), ),

View File

@ -191,8 +191,9 @@ export class McpClient {
/** /**
* Returns true when any configured server declares per-server approval * Returns true when any configured server declares per-server approval
* requirements (`requireApproval: true` or a non-empty `requireApproval` * requirements (`requireApproval: true`, a non-empty `requireApproval`
* string array). Does NOT require a network connection. * string array, or a `configureTools` callback that is not marked
* `configureToolsNonInterrupting`). Does NOT require a network connection.
* *
* Used by the Agent builder to validate checkpoint configuration before * Used by the Agent builder to validate checkpoint configuration before
* attempting to connect. * attempting to connect.

View File

@ -475,21 +475,52 @@ Use the workflow SDK.`,
await Promise.resolve(); await Promise.resolve();
source.registry = { source.registry = {
...source.registry, ...source.registry,
skills: source.registry.skills.map((skill) => ({ skills: source.registry.skills.map((skill) => ({ ...skill, hash: 'prepared-hash' })),
...skill,
path: '/workspace/skills/summarize_notes/SKILL.md',
directory: '/workspace/skills/summarize_notes',
})),
}; };
}); });
source.prepare = prepare; source.prepare = prepare;
const loadTool = createSkillLoadTool(source); const loadTool = createSkillLoadTool(source);
const loaded = skillLoadText(await loadTool.handler?.({ skillId: 'summarize_notes' }, {})); const loaded = skillLoadText(await loadTool.handler?.({ skillId: 'summarize_notes' }, {}));
expect(loaded).toContain('/workspace/skills/summarize_notes'); expect(loaded).toContain('[Skill hash: "prepared-hash"]');
expect(prepare).toHaveBeenCalledTimes(1); expect(prepare).toHaveBeenCalledTimes(1);
}); });
it('does not show server file paths to the model', async () => {
const source = createRuntimeSkillSource([
{
id: 'summarize_notes',
name: 'Summarize notes',
description: 'Use for meeting notes.',
instructions: 'Extract decisions.',
path: '/usr/local/lib/node_modules/n8n/skills/summarize_notes/SKILL.md',
sourcePath: '/usr/local/lib/node_modules/n8n/skills/summarize_notes/SKILL.md',
directory: '/usr/local/lib/node_modules/n8n/skills/summarize_notes',
linkedFiles: {
references: [{ path: 'references/guide.md', bytes: 5, sha256: 'abc' }],
templates: [],
scripts: [],
assets: [],
examples: [],
other: [],
},
},
]);
source.loadFile = async (skillId, filePath) =>
await Promise.resolve({ skillId, filePath, content: 'Guide' });
const loadTool = createSkillLoadTool(source);
const skill = skillLoadText(await loadTool.handler?.({ skillId: 'summarize_notes' }, {}));
const file = await loadTool.handler?.(
{ skillId: 'summarize_notes', filePath: 'references/guide.md' },
{},
);
expect(skill).toContain('Extract decisions.');
expect(file).toMatchObject({ success: true, content: 'Guide' });
expect(JSON.stringify([skill, file])).not.toContain('/usr/local/lib');
});
it('injects the agent skill catalog without preparing the runtime skill source', async () => { it('injects the agent skill catalog without preparing the runtime skill source', async () => {
const source = createRuntimeSkillSource([ const source = createRuntimeSkillSource([
{ {

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