n8n 2.38.0 → 2.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/build.tsbuildinfo +1 -1
  2. package/dist/controllers/invitation.controller.d.ts +1 -5
  3. package/dist/controllers/invitation.controller.js +3 -32
  4. package/dist/controllers/invitation.controller.js.map +1 -1
  5. package/dist/controllers/users.controller.d.ts +2 -27
  6. package/dist/controllers/users.controller.js +6 -132
  7. package/dist/controllers/users.controller.js.map +1 -1
  8. package/dist/evaluation.ee/evaluation-test-run.service.d.ts +46 -0
  9. package/dist/evaluation.ee/evaluation-test-run.service.js +65 -0
  10. package/dist/evaluation.ee/evaluation-test-run.service.js.map +1 -0
  11. package/dist/evaluation.ee/insights/insights-context-builder.js +4 -2
  12. package/dist/evaluation.ee/insights/insights-context-builder.js.map +1 -1
  13. package/dist/evaluation.ee/test-runs.controller.ee.d.ts +1 -1
  14. package/dist/evaluation.ee/test-runs.controller.ee.js +5 -2
  15. package/dist/evaluation.ee/test-runs.controller.ee.js.map +1 -1
  16. package/dist/modules/agents/agent-interrupted-execution-sweeper.d.ts +5 -1
  17. package/dist/modules/agents/agent-interrupted-execution-sweeper.js +14 -2
  18. package/dist/modules/agents/agent-interrupted-execution-sweeper.js.map +1 -1
  19. package/dist/modules/agents/agent-runtime-reconstruction.service.d.ts +1 -0
  20. package/dist/modules/agents/agent-runtime-reconstruction.service.js +35 -2
  21. package/dist/modules/agents/agent-runtime-reconstruction.service.js.map +1 -1
  22. package/dist/modules/agents/agents.module.d.ts +1 -1
  23. package/dist/modules/agents/agents.module.js +3 -0
  24. package/dist/modules/agents/agents.module.js.map +1 -1
  25. package/dist/modules/agents/background/agent-background-job.service.d.ts +34 -0
  26. package/dist/modules/agents/background/agent-background-job.service.js +168 -0
  27. package/dist/modules/agents/background/agent-background-job.service.js.map +1 -0
  28. package/dist/modules/agents/background/background-job-tools.d.ts +21 -0
  29. package/dist/modules/agents/background/background-job-tools.js +157 -0
  30. package/dist/modules/agents/background/background-job-tools.js.map +1 -0
  31. package/dist/modules/agents/background/sub-agent-background-runner.d.ts +27 -0
  32. package/dist/modules/agents/background/sub-agent-background-runner.js +123 -0
  33. package/dist/modules/agents/background/sub-agent-background-runner.js.map +1 -0
  34. package/dist/modules/agents/builder/get-resource-locator-options.tool.d.ts +2 -2
  35. package/dist/modules/agents/entities/agent-background-job.entity.d.ts +18 -0
  36. package/dist/modules/agents/entities/agent-background-job.entity.js +78 -0
  37. package/dist/modules/agents/entities/agent-background-job.entity.js.map +1 -0
  38. package/dist/modules/agents/repositories/agent-background-job.repository.d.ts +37 -0
  39. package/dist/modules/agents/repositories/agent-background-job.repository.js +61 -0
  40. package/dist/modules/agents/repositories/agent-background-job.repository.js.map +1 -0
  41. package/dist/modules/agents/sub-agents/delegate-sub-agent-tool.d.ts +4 -5
  42. package/dist/modules/agents/sub-agents/delegate-sub-agent-tool.js +4 -14
  43. package/dist/modules/agents/sub-agents/delegate-sub-agent-tool.js.map +1 -1
  44. package/dist/modules/agents/sub-agents/format-sub-agent-tool-output.d.ts +3 -0
  45. package/dist/modules/agents/sub-agents/format-sub-agent-tool-output.js +14 -0
  46. package/dist/modules/agents/sub-agents/format-sub-agent-tool-output.js.map +1 -0
  47. package/dist/modules/agents/sub-agents/{sub-agent-foreground-runner.d.ts → sub-agent-runner.d.ts} +5 -5
  48. package/dist/modules/agents/sub-agents/{sub-agent-foreground-runner.js → sub-agent-runner.js} +8 -11
  49. package/dist/modules/agents/sub-agents/sub-agent-runner.js.map +1 -0
  50. package/dist/public-api/v1/handlers/evaluations/evaluations.handler.js +11 -35
  51. package/dist/public-api/v1/handlers/evaluations/evaluations.handler.js.map +1 -1
  52. package/dist/public-api/v1/handlers/users/users.handler.ee.d.ts +1 -1
  53. package/dist/public-api/v1/handlers/users/users.handler.ee.js +16 -18
  54. package/dist/public-api/v1/handlers/users/users.handler.ee.js.map +1 -1
  55. package/dist/public-api/v1/handlers/users/users.mapper.d.ts +12 -0
  56. package/dist/public-api/v1/handlers/users/users.mapper.js +27 -0
  57. package/dist/public-api/v1/handlers/users/users.mapper.js.map +1 -0
  58. package/dist/scaling/constants.d.ts +2 -2
  59. package/dist/scaling/constants.js +1 -0
  60. package/dist/scaling/constants.js.map +1 -1
  61. package/dist/scaling/pubsub/pubsub.event-map.d.ts +3 -0
  62. package/dist/scaling/pubsub/pubsub.types.d.ts +2 -1
  63. package/dist/services/project.service.ee.d.ts +1 -0
  64. package/dist/services/project.service.ee.js +3 -0
  65. package/dist/services/project.service.ee.js.map +1 -1
  66. package/dist/services/user.service.d.ts +41 -8
  67. package/dist/services/user.service.js +174 -8
  68. package/dist/services/user.service.js.map +1 -1
  69. package/package.json +22 -22
  70. package/dist/modules/agents/sub-agents/sub-agent-foreground-runner.js.map +0 -1
  71. package/dist/public-api/v1/handlers/users/users.service.ee.d.ts +0 -21
  72. package/dist/public-api/v1/handlers/users/users.service.ee.js +0 -68
  73. package/dist/public-api/v1/handlers/users/users.service.ee.js.map +0 -1
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSpawnBackgroundSubAgentTool = createSpawnBackgroundSubAgentTool;
4
+ exports.createCheckBackgroundJobsTool = createCheckBackgroundJobsTool;
5
+ exports.createCancelBackgroundJobTool = createCancelBackgroundJobTool;
6
+ const agents_1 = require("@n8n/agents");
7
+ const tool_1 = require("@n8n/agents/tool");
8
+ const api_types_1 = require("@n8n/api-types");
9
+ const zod_1 = require("zod");
10
+ const agent_sandbox_principal_1 = require("../agent-sandbox-principal");
11
+ const RESULT_ECHO_MAX_CHARS = 8000;
12
+ function threadIdOf(ctx) {
13
+ return ctx.persistence?.threadId;
14
+ }
15
+ function createSpawnBackgroundSubAgentTool(options) {
16
+ const roster = options.availableSubAgents
17
+ .map((agent) => `- ${agent.id}: ${agent.name}${agent.useWhen ? ` — ${agent.useWhen}` : ''}`)
18
+ .join('\n');
19
+ return new tool_1.Tool('spawn_background_subagent')
20
+ .description('Dispatch a sub-agent as a detached background job. Returns a receipt immediately; the ' +
21
+ 'sub-agent keeps working after your turn ends. Pass "inline" as subAgentId to spawn a ' +
22
+ 'copy of yourself for a self-contained subtask.' +
23
+ (roster ? ` Available configured sub-agents:\n${roster}` : ''))
24
+ .systemInstruction('Prefer spawn_background_subagent for independent pieces of work that can run in parallel ' +
25
+ 'while you continue. After spawning, either continue with non-overlapping work or end ' +
26
+ 'your turn telling the user that work continues in the background — never poll ' +
27
+ 'check_background_jobs in a loop waiting for jobs to finish; check once in a later turn ' +
28
+ 'instead. The final answer is the contract; never expect the full trace. Instruct ' +
29
+ 'sub-agents producing large outputs to write them to the shared workspace and return a ' +
30
+ 'summary.')
31
+ .input(zod_1.z.object({
32
+ subAgentId: zod_1.z
33
+ .string()
34
+ .describe('Id of a configured sub-agent from the roster, or "inline" for a copy of yourself'),
35
+ taskName: zod_1.z
36
+ .string()
37
+ .min(1)
38
+ .max(255)
39
+ .describe('Short label for the job, echoed in status checks'),
40
+ goal: zod_1.z.string().describe('What the sub-agent should accomplish'),
41
+ context: zod_1.z.string().optional().describe('Background information the sub-agent needs'),
42
+ expectedOutput: zod_1.z.string().optional().describe('Shape of the answer to return'),
43
+ difficulty: zod_1.z
44
+ .enum(api_types_1.SUB_AGENT_TASK_DIFFICULTIES)
45
+ .optional()
46
+ .describe('Inline spawns only: picks the model tier configured for this difficulty'),
47
+ }))
48
+ .output(zod_1.z.object({
49
+ status: zod_1.z.enum(['started', 'limit-reached', 'rejected']),
50
+ jobId: zod_1.z.string().optional(),
51
+ note: zod_1.z.string().optional(),
52
+ }))
53
+ .handler(async (input, ctx) => {
54
+ const parentThreadId = threadIdOf(ctx);
55
+ const parentResourceId = ctx.persistence?.resourceId;
56
+ if (!parentThreadId || !parentResourceId) {
57
+ return {
58
+ status: 'rejected',
59
+ note: 'Background jobs need a persisted conversation thread; none is active.',
60
+ };
61
+ }
62
+ const isSelfDelegation = input.subAgentId === agents_1.INLINE_SUB_AGENT_ID;
63
+ const source = isSelfDelegation
64
+ ? { agentId: options.parentAgentId }
65
+ : options.sourcesById[input.subAgentId];
66
+ if (!source) {
67
+ const ids = [...options.availableSubAgents.map((agent) => agent.id), 'inline'].join(', ');
68
+ return {
69
+ status: 'rejected',
70
+ note: `No sub-agent matched "${input.subAgentId}". Available: ${ids}.`,
71
+ };
72
+ }
73
+ const sandboxScope = (0, agent_sandbox_principal_1.decodeAgentSandboxHostMetadata)(ctx.persistence?.hostMetadata);
74
+ const receipt = await options.backgroundRunner.spawn({
75
+ subAgentId: source.agentId,
76
+ source,
77
+ taskName: input.taskName,
78
+ goal: input.goal,
79
+ context: input.context,
80
+ expectedOutput: input.expectedOutput,
81
+ ...(isSelfDelegation && input.difficulty !== undefined
82
+ ? { difficulty: input.difficulty }
83
+ : {}),
84
+ parentThreadId,
85
+ parentResourceId,
86
+ ...(sandboxScope?.projectId === options.projectId
87
+ ? { parentSandboxPrincipalHash: sandboxScope.principalHash }
88
+ : {}),
89
+ }, {
90
+ projectId: options.projectId,
91
+ parentAgentId: options.parentAgentId,
92
+ ...options.runContext,
93
+ });
94
+ if (receipt.status === 'started') {
95
+ return {
96
+ status: 'started',
97
+ jobId: receipt.jobId,
98
+ note: 'Job dispatched. Check on it later with check_background_jobs.',
99
+ };
100
+ }
101
+ return {
102
+ status: 'limit-reached',
103
+ note: 'This conversation already has the maximum number of running background jobs. Wait for one to finish or cancel one.',
104
+ };
105
+ })
106
+ .build();
107
+ }
108
+ function createCheckBackgroundJobsTool(jobService) {
109
+ return new tool_1.Tool('check_background_jobs')
110
+ .description('List the background jobs of this conversation with their status and, once settled, ' +
111
+ 'their result or error. Pass an empty object {} to list all jobs (required — do not pass null). ' +
112
+ 'Call this at most once per turn: when jobs are still running, tell the user and end your ' +
113
+ 'turn — repeated checks within one turn only burn time and tokens.')
114
+ .input(zod_1.z.object({
115
+ jobIds: zod_1.z.array(zod_1.z.string()).max(50).optional().describe('Limit the check to these job ids'),
116
+ }))
117
+ .handler(async (input, ctx) => {
118
+ const parentThreadId = threadIdOf(ctx);
119
+ if (!parentThreadId) {
120
+ return { jobs: [], note: 'No persisted conversation thread is active.' };
121
+ }
122
+ const jobs = await jobService.listForThread(parentThreadId, input.jobIds);
123
+ return {
124
+ jobs: jobs.map((job) => ({
125
+ jobId: job.id,
126
+ kind: job.kind,
127
+ title: job.title,
128
+ status: job.status,
129
+ ...(job.result !== null ? { result: truncateResult(job.result) } : {}),
130
+ ...(job.error !== null ? { error: truncateResult(job.error) } : {}),
131
+ startedAt: job.createdAt.toISOString(),
132
+ ...(job.timeoutAt !== null ? { timeoutAt: job.timeoutAt.toISOString() } : {}),
133
+ })),
134
+ runningCount: jobs.filter((job) => job.status === 'running').length,
135
+ };
136
+ })
137
+ .build();
138
+ }
139
+ function createCancelBackgroundJobTool(jobService) {
140
+ return new tool_1.Tool('cancel_background_job')
141
+ .description('Cancel a running background job of this conversation by its job id.')
142
+ .input(zod_1.z.object({ jobId: zod_1.z.string() }))
143
+ .output(zod_1.z.object({ status: zod_1.z.enum(['cancelled', 'not-found', 'already-settled']) }))
144
+ .handler(async (input, ctx) => {
145
+ const parentThreadId = threadIdOf(ctx);
146
+ if (!parentThreadId)
147
+ return { status: 'not-found' };
148
+ return { status: await jobService.cancel(parentThreadId, input.jobId) };
149
+ })
150
+ .build();
151
+ }
152
+ function truncateResult(result) {
153
+ if (result.length <= RESULT_ECHO_MAX_CHARS)
154
+ return result;
155
+ return `${result.slice(0, RESULT_ECHO_MAX_CHARS)}\n[... truncated, ${result.length} characters total]`;
156
+ }
157
+ //# sourceMappingURL=background-job-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-job-tools.js","sourceRoot":"","sources":["../../../../src/modules/agents/background/background-job-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { SubAgentSource, SubAgentTaskDifficulty } from '@n8n/api-types';
2
+ import { Logger } from '@n8n/backend-common';
3
+ import { AgentBackgroundJobService, type BackgroundJobReceipt } from './agent-background-job.service';
4
+ import { SubAgentRunner, type SubAgentRunContext } from '../sub-agents/sub-agent-runner';
5
+ export interface BackgroundSpawnRequest {
6
+ subAgentId: string;
7
+ source: SubAgentSource;
8
+ taskName: string;
9
+ goal: string;
10
+ context?: string;
11
+ expectedOutput?: string;
12
+ difficulty?: SubAgentTaskDifficulty;
13
+ parentThreadId: string;
14
+ parentResourceId: string;
15
+ parentSandboxPrincipalHash?: string;
16
+ }
17
+ export declare class SubAgentBackgroundRunner {
18
+ private readonly runner;
19
+ private readonly jobService;
20
+ private readonly logger;
21
+ private dispatchCounter;
22
+ constructor(runner: SubAgentRunner, jobService: AgentBackgroundJobService, logger: Logger);
23
+ spawn(request: BackgroundSpawnRequest, context: {
24
+ projectId: string;
25
+ parentAgentId: string;
26
+ } & Pick<SubAgentRunContext, 'credentialProvider' | 'runType' | 'workflowToolExecutionMode' | 'user' | 'instrumentation'>): Promise<BackgroundJobReceipt>;
27
+ }
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SubAgentBackgroundRunner = void 0;
13
+ const agents_1 = require("@n8n/agents");
14
+ const backend_common_1 = require("@n8n/backend-common");
15
+ const di_1 = require("@n8n/di");
16
+ const uuid_1 = require("uuid");
17
+ const agent_background_job_service_1 = require("./agent-background-job.service");
18
+ const format_sub_agent_tool_output_1 = require("../sub-agents/format-sub-agent-tool-output");
19
+ const sub_agent_runner_1 = require("../sub-agents/sub-agent-runner");
20
+ let SubAgentBackgroundRunner = class SubAgentBackgroundRunner {
21
+ constructor(runner, jobService, logger) {
22
+ this.runner = runner;
23
+ this.jobService = jobService;
24
+ this.logger = logger;
25
+ this.dispatchCounter = 0;
26
+ this.logger = this.logger.scoped('agents');
27
+ }
28
+ async spawn(request, context) {
29
+ const taskPath = (0, agents_1.createChildSubAgentTaskPath)(request.taskName, this.dispatchCounter++);
30
+ const jobId = (0, uuid_1.v4)();
31
+ const childThreadId = (0, uuid_1.v4)();
32
+ const receipt = await this.jobService.registerSubAgentJob({
33
+ id: jobId,
34
+ parentAgentId: context.parentAgentId,
35
+ parentThreadId: request.parentThreadId,
36
+ title: request.taskName,
37
+ subAgentId: request.subAgentId,
38
+ childThreadId,
39
+ });
40
+ if (receipt.status !== 'started')
41
+ return receipt;
42
+ const abortController = new AbortController();
43
+ this.jobService.registerAbortController(jobId, abortController);
44
+ const timeout = setTimeout(() => {
45
+ void this.jobService
46
+ .settle(jobId, {
47
+ status: 'failed',
48
+ error: `Timed out after ${Math.round(agent_background_job_service_1.SUB_AGENT_BACKGROUND_TIMEOUT_MS / 60_000)} minutes`,
49
+ })
50
+ .catch((error) => {
51
+ this.logger.error('Failed to settle timed-out background job', { jobId, error });
52
+ })
53
+ .finally(() => abortController.abort());
54
+ }, agent_background_job_service_1.SUB_AGENT_BACKGROUND_TIMEOUT_MS);
55
+ timeout.unref();
56
+ void this.runner
57
+ .run({
58
+ goal: request.goal,
59
+ source: request.source,
60
+ ...(request.context !== undefined ? { context: request.context } : {}),
61
+ ...(request.expectedOutput !== undefined
62
+ ? { expectedOutput: request.expectedOutput }
63
+ : {}),
64
+ parentThreadId: request.parentThreadId,
65
+ parentResourceId: request.parentResourceId,
66
+ ...(request.parentSandboxPrincipalHash !== undefined
67
+ ? { parentSandboxPrincipalHash: request.parentSandboxPrincipalHash }
68
+ : {}),
69
+ childThreadId,
70
+ taskPath,
71
+ }, {
72
+ projectId: context.projectId,
73
+ parentAgentId: context.parentAgentId,
74
+ credentialProvider: context.credentialProvider,
75
+ runType: context.runType,
76
+ workflowToolExecutionMode: context.workflowToolExecutionMode,
77
+ user: context.user,
78
+ instrumentation: context.instrumentation,
79
+ abortSignal: abortController.signal,
80
+ ...(request.difficulty !== undefined
81
+ ? { selfDelegationDifficulty: request.difficulty }
82
+ : {}),
83
+ })
84
+ .then((result) => settlementFor(result))
85
+ .catch((error) => ({
86
+ status: 'failed',
87
+ error: error instanceof Error ? error.message : String(error),
88
+ }))
89
+ .then(async (settlement) => {
90
+ const settled = await this.jobService.settle(jobId, settlement);
91
+ if (settled && settlement.status === 'failed') {
92
+ this.logger.warn('Background sub-agent job failed', { jobId, error: settlement.error });
93
+ }
94
+ })
95
+ .catch((error) => {
96
+ this.logger.error('Failed to settle background sub-agent job', { jobId, error });
97
+ })
98
+ .finally(() => clearTimeout(timeout));
99
+ return receipt;
100
+ }
101
+ };
102
+ exports.SubAgentBackgroundRunner = SubAgentBackgroundRunner;
103
+ exports.SubAgentBackgroundRunner = SubAgentBackgroundRunner = __decorate([
104
+ (0, di_1.Service)(),
105
+ __metadata("design:paramtypes", [sub_agent_runner_1.SubAgentRunner, agent_background_job_service_1.AgentBackgroundJobService, backend_common_1.Logger])
106
+ ], SubAgentBackgroundRunner);
107
+ function settlementFor(result) {
108
+ const output = (0, format_sub_agent_tool_output_1.formatSubAgentToolOutput)(result);
109
+ if (output.status === 'completed') {
110
+ return { status: 'completed', result: output.answer };
111
+ }
112
+ if (output.status === 'suspended') {
113
+ return {
114
+ status: 'failed',
115
+ error: 'Sub-agent suspended awaiting human input, which background runs do not support',
116
+ };
117
+ }
118
+ return {
119
+ status: output.status === 'cancelled' ? 'cancelled' : 'failed',
120
+ error: output.error ?? null,
121
+ };
122
+ }
123
+ //# sourceMappingURL=sub-agent-background-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sub-agent-background-runner.js","sourceRoot":"","sources":["../../../../src/modules/agents/background/sub-agent-background-runner.ts"],"names":[],"mappings":"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"}
@@ -69,9 +69,9 @@ export declare function resolveResourceLocatorOptions({ nodeType, nodeTypeVersio
69
69
  message: string;
70
70
  credentialSlots: import("@n8n/ai-utilities/node-catalog").RequiredNodeCredentialSlot[];
71
71
  } | {
72
- dynamicParameters?: undefined;
73
72
  code?: undefined;
74
73
  message?: undefined;
74
+ dynamicParameters?: undefined;
75
75
  credentialSlots?: undefined;
76
76
  ok: boolean;
77
77
  kind: "resourceLocator";
@@ -87,9 +87,9 @@ export declare function resolveResourceLocatorOptions({ nodeType, nodeTypeVersio
87
87
  paginationToken: string | undefined;
88
88
  builderHint?: string | undefined;
89
89
  } | {
90
- dynamicParameters?: undefined;
91
90
  code?: undefined;
92
91
  message?: undefined;
92
+ dynamicParameters?: undefined;
93
93
  credentialSlots?: undefined;
94
94
  ok: boolean;
95
95
  kind: "loadOptionsMethod" | "loadOptionsRouting";
@@ -0,0 +1,18 @@
1
+ import { WithTimestampsAndStringId } from '@n8n/db';
2
+ export type AgentBackgroundJobKind = 'subagent' | 'workflow';
3
+ export type AgentBackgroundJobStatus = 'running' | 'completed' | 'failed' | 'cancelled';
4
+ export declare class AgentBackgroundJob extends WithTimestampsAndStringId {
5
+ kind: AgentBackgroundJobKind;
6
+ status: AgentBackgroundJobStatus;
7
+ parentAgentId: string;
8
+ parentThreadId: string;
9
+ title: string;
10
+ subAgentId: string | null;
11
+ childThreadId: string | null;
12
+ childExecutionId: string | null;
13
+ workflowId: string | null;
14
+ timeoutAt: Date | null;
15
+ result: string | null;
16
+ error: string | null;
17
+ settledAt: Date | null;
18
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AgentBackgroundJob = void 0;
13
+ const db_1 = require("@n8n/db");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ let AgentBackgroundJob = class AgentBackgroundJob extends db_1.WithTimestampsAndStringId {
16
+ };
17
+ exports.AgentBackgroundJob = AgentBackgroundJob;
18
+ __decorate([
19
+ (0, typeorm_1.Column)({ type: 'varchar', length: 16 }),
20
+ __metadata("design:type", String)
21
+ ], AgentBackgroundJob.prototype, "kind", void 0);
22
+ __decorate([
23
+ (0, typeorm_1.Column)({ type: 'varchar', length: 16 }),
24
+ __metadata("design:type", String)
25
+ ], AgentBackgroundJob.prototype, "status", void 0);
26
+ __decorate([
27
+ (0, typeorm_1.Column)({ type: 'varchar', length: 36 }),
28
+ __metadata("design:type", String)
29
+ ], AgentBackgroundJob.prototype, "parentAgentId", void 0);
30
+ __decorate([
31
+ (0, typeorm_1.Column)({ type: 'varchar', length: 128 }),
32
+ __metadata("design:type", String)
33
+ ], AgentBackgroundJob.prototype, "parentThreadId", void 0);
34
+ __decorate([
35
+ (0, typeorm_1.Column)({ type: 'varchar', length: 255 }),
36
+ __metadata("design:type", String)
37
+ ], AgentBackgroundJob.prototype, "title", void 0);
38
+ __decorate([
39
+ (0, typeorm_1.Column)({ type: 'varchar', length: 36, nullable: true }),
40
+ __metadata("design:type", Object)
41
+ ], AgentBackgroundJob.prototype, "subAgentId", void 0);
42
+ __decorate([
43
+ (0, typeorm_1.Column)({ type: 'varchar', length: 128, nullable: true }),
44
+ __metadata("design:type", Object)
45
+ ], AgentBackgroundJob.prototype, "childThreadId", void 0);
46
+ __decorate([
47
+ (0, typeorm_1.Column)({ type: 'varchar', length: 36, nullable: true }),
48
+ __metadata("design:type", Object)
49
+ ], AgentBackgroundJob.prototype, "childExecutionId", void 0);
50
+ __decorate([
51
+ (0, typeorm_1.Column)({ type: 'varchar', length: 36, nullable: true }),
52
+ __metadata("design:type", Object)
53
+ ], AgentBackgroundJob.prototype, "workflowId", void 0);
54
+ __decorate([
55
+ (0, db_1.DateTimeColumn)({ precision: 3, nullable: true }),
56
+ __metadata("design:type", Object)
57
+ ], AgentBackgroundJob.prototype, "timeoutAt", void 0);
58
+ __decorate([
59
+ (0, typeorm_1.Column)({ type: 'text', nullable: true }),
60
+ __metadata("design:type", Object)
61
+ ], AgentBackgroundJob.prototype, "result", void 0);
62
+ __decorate([
63
+ (0, typeorm_1.Column)({ type: 'text', nullable: true }),
64
+ __metadata("design:type", Object)
65
+ ], AgentBackgroundJob.prototype, "error", void 0);
66
+ __decorate([
67
+ (0, db_1.DateTimeColumn)({ precision: 3, nullable: true }),
68
+ __metadata("design:type", Object)
69
+ ], AgentBackgroundJob.prototype, "settledAt", void 0);
70
+ exports.AgentBackgroundJob = AgentBackgroundJob = __decorate([
71
+ (0, typeorm_1.Entity)({ name: 'agent_background_job' }),
72
+ (0, typeorm_1.Index)(['parentThreadId', 'status']),
73
+ (0, typeorm_1.Index)(['parentAgentId']),
74
+ (0, typeorm_1.Index)(['settledAt']),
75
+ (0, typeorm_1.Index)(['childExecutionId'], { unique: true, where: '"childExecutionId" IS NOT NULL' }),
76
+ (0, typeorm_1.Index)(['timeoutAt'], { where: '"status" = \'running\'' })
77
+ ], AgentBackgroundJob);
78
+ //# sourceMappingURL=agent-background-job.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-background-job.entity.js","sourceRoot":"","sources":["../../../../src/modules/agents/entities/agent-background-job.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAoE;AACpE,0CAAqD;AAkB9C,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,8BAAyB;CAiDhE,CAAA;;AA/CA;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;gDACX;AAG7B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;kDACP;AAGjC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;;yDAClB;AAMtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;0DAClB;AAIvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;iDAC3B;AAId;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDAC9B;AAI1B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yDAC5B;AAI7B;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4DACxB;AAIhC;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDAC9B;AAI1B;IADC,IAAA,mBAAc,EAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDAC1B;AAIvB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACnB;AAGtB;IADC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDACpB;AAGrB;IADC,IAAA,mBAAc,EAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDAC1B;6BAhDX,kBAAkB;IAN9B,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;IACxC,IAAA,eAAK,EAAC,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IACnC,IAAA,eAAK,EAAC,CAAC,eAAe,CAAC,CAAC;IACxB,IAAA,eAAK,EAAC,CAAC,WAAW,CAAC,CAAC;IACpB,IAAA,eAAK,EAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;IACtF,IAAA,eAAK,EAAC,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;GAC7C,kBAAkB,CAiD9B"}
@@ -0,0 +1,37 @@
1
+ import { DataSource, Repository } from '@n8n/typeorm';
2
+ import { AgentBackgroundJob, type AgentBackgroundJobKind, type AgentBackgroundJobStatus } from '../entities/agent-background-job.entity';
3
+ type NewAgentBackgroundJobBase = {
4
+ id: string;
5
+ parentAgentId: string;
6
+ parentThreadId: string;
7
+ title: string;
8
+ };
9
+ export type NewSubAgentJob = NewAgentBackgroundJobBase & {
10
+ kind: 'subagent';
11
+ subAgentId: string;
12
+ childThreadId: string;
13
+ timeoutAt: Date;
14
+ };
15
+ export type NewWorkflowJob = NewAgentBackgroundJobBase & {
16
+ kind: 'workflow';
17
+ workflowId: string;
18
+ childExecutionId: string;
19
+ };
20
+ export type NewAgentBackgroundJob = NewSubAgentJob | NewWorkflowJob;
21
+ export type AgentBackgroundJobSettlement = {
22
+ status: Exclude<AgentBackgroundJobStatus, 'running'>;
23
+ result?: string | null;
24
+ error?: string | null;
25
+ };
26
+ export declare class AgentBackgroundJobRepository extends Repository<AgentBackgroundJob> {
27
+ constructor(dataSource: DataSource);
28
+ insertJob(job: NewAgentBackgroundJob): Promise<void>;
29
+ countRunningByParentThread(parentThreadId: string): Promise<number>;
30
+ findByParentThread(parentThreadId: string, ids?: string[]): Promise<AgentBackgroundJob[]>;
31
+ findRunningWorkflowJobByExecutionId(executionId: string): Promise<AgentBackgroundJob | null>;
32
+ findRunningJobs(kind?: AgentBackgroundJobKind): Promise<AgentBackgroundJob[]>;
33
+ findRunningPastTimeout(now: Date): Promise<AgentBackgroundJob[]>;
34
+ settleIfRunning(id: string, settlement: AgentBackgroundJobSettlement): Promise<boolean>;
35
+ deleteSettledBefore(cutoff: Date): Promise<void>;
36
+ }
37
+ export {};
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AgentBackgroundJobRepository = void 0;
13
+ const di_1 = require("@n8n/di");
14
+ const typeorm_1 = require("@n8n/typeorm");
15
+ const agent_background_job_entity_1 = require("../entities/agent-background-job.entity");
16
+ let AgentBackgroundJobRepository = class AgentBackgroundJobRepository extends typeorm_1.Repository {
17
+ constructor(dataSource) {
18
+ super(agent_background_job_entity_1.AgentBackgroundJob, dataSource.manager);
19
+ }
20
+ async insertJob(job) {
21
+ await this.insert({ ...job, status: 'running' });
22
+ }
23
+ async countRunningByParentThread(parentThreadId) {
24
+ return await this.count({ where: { parentThreadId, status: 'running' } });
25
+ }
26
+ async findByParentThread(parentThreadId, ids) {
27
+ return await this.find({
28
+ where: ids?.length ? { parentThreadId, id: (0, typeorm_1.In)(ids) } : { parentThreadId },
29
+ order: { createdAt: 'ASC' },
30
+ });
31
+ }
32
+ async findRunningWorkflowJobByExecutionId(executionId) {
33
+ return await this.findOne({
34
+ where: { kind: 'workflow', status: 'running', childExecutionId: executionId },
35
+ });
36
+ }
37
+ async findRunningJobs(kind) {
38
+ return await this.find({ where: kind ? { status: 'running', kind } : { status: 'running' } });
39
+ }
40
+ async findRunningPastTimeout(now) {
41
+ return await this.find({ where: { status: 'running', timeoutAt: (0, typeorm_1.LessThan)(now) } });
42
+ }
43
+ async settleIfRunning(id, settlement) {
44
+ const result = await this.update({ id, status: 'running' }, {
45
+ status: settlement.status,
46
+ result: settlement.result ?? null,
47
+ error: settlement.error ?? null,
48
+ settledAt: new Date(),
49
+ });
50
+ return result.affected === 1;
51
+ }
52
+ async deleteSettledBefore(cutoff) {
53
+ await this.delete({ status: (0, typeorm_1.Not)('running'), settledAt: (0, typeorm_1.LessThan)(cutoff) });
54
+ }
55
+ };
56
+ exports.AgentBackgroundJobRepository = AgentBackgroundJobRepository;
57
+ exports.AgentBackgroundJobRepository = AgentBackgroundJobRepository = __decorate([
58
+ (0, di_1.Service)(),
59
+ __metadata("design:paramtypes", [typeorm_1.DataSource])
60
+ ], AgentBackgroundJobRepository);
61
+ //# sourceMappingURL=agent-background-job.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-background-job.repository.js","sourceRoot":"","sources":["../../../../src/modules/agents/repositories/agent-background-job.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAAkC;AAClC,0CAAyE;AAEzE,yFAIiD;AA+B1C,IAAM,4BAA4B,GAAlC,MAAM,4BAA6B,SAAQ,oBAA8B;IAC/E,YAAY,UAAsB;QACjC,KAAK,CAAC,gDAAkB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAA0B;QACzC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,cAAsB;QACtD,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,cAAsB,EAAE,GAAc;QAC9D,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC;YACtB,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE;YACzE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;SAC3B,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mCAAmC,CACxC,WAAmB;QAEnB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACzB,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE;SAC7E,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAA6B;QAClD,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;IAGD,KAAK,CAAC,sBAAsB,CAAC,GAAS;QACrC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAA,kBAAQ,EAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IAOD,KAAK,CAAC,eAAe,CAAC,EAAU,EAAE,UAAwC;QACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAC/B,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EACzB;YACC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI;YACjC,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,IAAI;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE;SACrB,CACD,CAAC;QACF,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC9B,CAAC;IAGD,KAAK,CAAC,mBAAmB,CAAC,MAAY;QACrC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAA,aAAG,EAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAA,kBAAQ,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;CACD,CAAA;;uCA3DY,4BAA4B;IADxC,IAAA,YAAO,GAAE;qCAEe,oBAAU;GADtB,4BAA4B,CA2DxC"}
@@ -1,8 +1,8 @@
1
- import { type DelegateSubAgentToolOutput, type InlineSubAgentProviderToolsResolver, type ModelConfig, type SubAgentTaskDifficulty } from '@n8n/agents';
1
+ import { type InlineSubAgentProviderToolsResolver, type ModelConfig, type SubAgentTaskDifficulty } from '@n8n/agents';
2
2
  import type { SubAgentRunPolicy, SubAgentSource } from '@n8n/api-types';
3
- import type { SubAgentForegroundRunContext, SubAgentForegroundResult, SubAgentForegroundRunner } from './sub-agent-foreground-runner';
4
- export interface CreateN8nDelegateSubAgentToolOptions extends SubAgentForegroundRunContext {
5
- runner: SubAgentForegroundRunner;
3
+ import type { SubAgentRunContext, SubAgentRunner } from './sub-agent-runner';
4
+ export interface CreateN8nDelegateSubAgentToolOptions extends SubAgentRunContext {
5
+ runner: SubAgentRunner;
6
6
  sourcesById: Record<string, SubAgentSource>;
7
7
  availableSubAgents?: Array<{
8
8
  id: string;
@@ -14,4 +14,3 @@ export interface CreateN8nDelegateSubAgentToolOptions extends SubAgentForeground
14
14
  resolveInlineSubAgentProviderTools?: InlineSubAgentProviderToolsResolver;
15
15
  }
16
16
  export declare function createN8nDelegateSubAgentTool(options: CreateN8nDelegateSubAgentToolOptions): import("@n8n/agents").BuiltTool;
17
- export declare function formatSubAgentToolOutput(result: SubAgentForegroundResult): DelegateSubAgentToolOutput;
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createN8nDelegateSubAgentTool = createN8nDelegateSubAgentTool;
4
- exports.formatSubAgentToolOutput = formatSubAgentToolOutput;
5
4
  const agents_1 = require("@n8n/agents");
6
5
  const n8n_workflow_1 = require("n8n-workflow");
7
6
  const response_error_1 = require("../../../errors/response-errors/abstract/response.error");
8
7
  const agent_sandbox_principal_1 = require("../agent-sandbox-principal");
8
+ const format_sub_agent_tool_output_1 = require("./format-sub-agent-tool-output");
9
9
  function createN8nDelegateSubAgentTool(options) {
10
10
  const { runner, sourcesById, availableSubAgents, policy, inlineSubAgentModelsByDifficulty, resolveInlineSubAgentProviderTools, ...runContext } = options;
11
11
  return (0, agents_1.createDelegateSubAgentTool)({
@@ -32,10 +32,9 @@ function createN8nDelegateSubAgentTool(options) {
32
32
  };
33
33
  }
34
34
  const parentSandboxScope = (0, agent_sandbox_principal_1.decodeAgentSandboxHostMetadata)(request.parentHostMetadata);
35
- const result = await runner.runForeground({
35
+ const result = await runner.run({
36
36
  goal: request.goal,
37
37
  source: selectedSource,
38
- executionMode: 'foreground',
39
38
  ...(request.context !== undefined ? { context: request.context } : {}),
40
39
  ...(request.expectedOutput !== undefined
41
40
  ? { expectedOutput: request.expectedOutput }
@@ -65,7 +64,7 @@ function createN8nDelegateSubAgentTool(options) {
65
64
  ? { selfDelegationDifficulty: request.difficulty }
66
65
  : {}),
67
66
  });
68
- return formatSubAgentToolOutput(result);
67
+ return (0, format_sub_agent_tool_output_1.formatSubAgentToolOutput)(result);
69
68
  },
70
69
  resumeSubAgent: async (request, helpers) => {
71
70
  if (request.childThreadId === undefined || request.resumeContext === undefined) {
@@ -93,7 +92,7 @@ function createN8nDelegateSubAgentTool(options) {
93
92
  const result = request.subAgentId === agents_1.INLINE_SUB_AGENT_ID
94
93
  ? await runner.resumeForeground(request, context, resolveExpectedSourceAgentId(request.subAgentId, runContext.parentAgentId))
95
94
  : await runner.resumeForeground(request, context);
96
- return formatSubAgentToolOutput(result);
95
+ return (0, format_sub_agent_tool_output_1.formatSubAgentToolOutput)(result);
97
96
  },
98
97
  cancelSubAgent: async (request) => {
99
98
  if (request.resumeContext === undefined) {
@@ -129,13 +128,4 @@ function resolveExpectedSourceAgentId(subAgentId, parentAgentId) {
129
128
  }
130
129
  return parentAgentId;
131
130
  }
132
- function formatSubAgentToolOutput(result) {
133
- const output = (0, agents_1.generateResultToDelegateSubAgentOutput)(result.taskPath, result.result, result.threadId);
134
- return {
135
- ...output,
136
- ...(output.status === 'suspended' && result.resumeContext !== undefined
137
- ? { resumeContext: result.resumeContext }
138
- : {}),
139
- };
140
- }
141
131
  //# sourceMappingURL=delegate-sub-agent-tool.js.map