@circus_sh/n8n-nodes-circus 1.3.0

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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/credentials/CircusAnthropicApi.credentials.d.ts +24 -0
  4. package/dist/credentials/CircusAnthropicApi.credentials.js +43 -0
  5. package/dist/credentials/CircusAnthropicApi.credentials.js.map +1 -0
  6. package/dist/credentials/CircusApi.credentials.d.ts +13 -0
  7. package/dist/credentials/CircusApi.credentials.js +50 -0
  8. package/dist/credentials/CircusApi.credentials.js.map +1 -0
  9. package/dist/credentials/CircusGoogleApi.credentials.d.ts +18 -0
  10. package/dist/credentials/CircusGoogleApi.credentials.js +33 -0
  11. package/dist/credentials/CircusGoogleApi.credentials.js.map +1 -0
  12. package/dist/credentials/CircusOpenaiApi.credentials.d.ts +21 -0
  13. package/dist/credentials/CircusOpenaiApi.credentials.js +36 -0
  14. package/dist/credentials/CircusOpenaiApi.credentials.js.map +1 -0
  15. package/dist/credentials/CircusXaiApi.credentials.d.ts +21 -0
  16. package/dist/credentials/CircusXaiApi.credentials.js +36 -0
  17. package/dist/credentials/CircusXaiApi.credentials.js.map +1 -0
  18. package/dist/credentials/icons/circus.dark.svg +5 -0
  19. package/dist/credentials/icons/circus.svg +5 -0
  20. package/dist/nodes/CircusAgent/CircusAgent.node.d.ts +5 -0
  21. package/dist/nodes/CircusAgent/CircusAgent.node.js +455 -0
  22. package/dist/nodes/CircusAgent/CircusAgent.node.js.map +1 -0
  23. package/dist/nodes/CircusAgent/CircusAgent.node.json +18 -0
  24. package/dist/nodes/CircusAgent/circusAgent.dark.svg +5 -0
  25. package/dist/nodes/CircusAgent/circusAgent.svg +5 -0
  26. package/dist/nodes/CircusComplete/CircusComplete.node.d.ts +5 -0
  27. package/dist/nodes/CircusComplete/CircusComplete.node.js +128 -0
  28. package/dist/nodes/CircusComplete/CircusComplete.node.js.map +1 -0
  29. package/dist/nodes/CircusComplete/CircusComplete.node.json +18 -0
  30. package/dist/nodes/CircusComplete/circusComplete.dark.svg +5 -0
  31. package/dist/nodes/CircusComplete/circusComplete.svg +5 -0
  32. package/dist/nodes/CircusInit/CircusInit.node.d.ts +5 -0
  33. package/dist/nodes/CircusInit/CircusInit.node.js +74 -0
  34. package/dist/nodes/CircusInit/CircusInit.node.js.map +1 -0
  35. package/dist/nodes/CircusInit/CircusInit.node.json +18 -0
  36. package/dist/nodes/CircusInit/circusInit.dark.svg +4 -0
  37. package/dist/nodes/CircusInit/circusInit.svg +4 -0
  38. package/dist/nodes/CircusLog/CircusLog.node.d.ts +5 -0
  39. package/dist/nodes/CircusLog/CircusLog.node.js +244 -0
  40. package/dist/nodes/CircusLog/CircusLog.node.js.map +1 -0
  41. package/dist/nodes/CircusLog/CircusLog.node.json +18 -0
  42. package/dist/nodes/CircusLog/circusLog.dark.svg +8 -0
  43. package/dist/nodes/CircusLog/circusLog.svg +8 -0
  44. package/dist/nodes/CircusTerminate/CircusTerminate.node.d.ts +5 -0
  45. package/dist/nodes/CircusTerminate/CircusTerminate.node.js +104 -0
  46. package/dist/nodes/CircusTerminate/CircusTerminate.node.js.map +1 -0
  47. package/dist/nodes/CircusTerminate/CircusTerminate.node.json +18 -0
  48. package/dist/nodes/CircusTerminate/circusTerminate.dark.svg +6 -0
  49. package/dist/nodes/CircusTerminate/circusTerminate.svg +6 -0
  50. package/dist/nodes/shared/circusContext.d.ts +10 -0
  51. package/dist/nodes/shared/circusContext.js +24 -0
  52. package/dist/nodes/shared/circusContext.js.map +1 -0
  53. package/dist/package.json +62 -0
  54. package/dist/tsconfig.tsbuildinfo +1 -0
  55. package/package.json +62 -0
@@ -0,0 +1,455 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CircusAgent = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const n8n_workflow_1 = require("n8n-workflow");
6
+ const circusContext_1 = require("../shared/circusContext");
7
+ function buildProviderRequest(provider, modelName, systemContext, promptText, inputText, temperature, maxTokens, baseUrl, apiKey) {
8
+ const headers = {
9
+ 'Content-Type': 'application/json',
10
+ };
11
+ let url = baseUrl;
12
+ let body;
13
+ const userMessages = [
14
+ { role: 'user', content: promptText },
15
+ ];
16
+ if (inputText) {
17
+ userMessages.push({ role: 'user', content: inputText });
18
+ }
19
+ switch (provider) {
20
+ case 'anthropic': {
21
+ headers['x-api-key'] = apiKey;
22
+ headers['anthropic-version'] = '2023-06-01';
23
+ body = {
24
+ model: modelName,
25
+ messages: userMessages,
26
+ max_tokens: maxTokens,
27
+ };
28
+ if (modelName !== 'claude-opus-4-8') {
29
+ body.temperature = temperature;
30
+ }
31
+ if (systemContext) {
32
+ body.system = systemContext;
33
+ }
34
+ break;
35
+ }
36
+ case 'google': {
37
+ url = `${baseUrl}${baseUrl.includes('?') ? '&' : '?'}key=${apiKey}`;
38
+ body = {
39
+ contents: userMessages.map((m) => ({
40
+ role: 'user',
41
+ parts: [{ text: m.content }],
42
+ })),
43
+ generationConfig: {
44
+ temperature,
45
+ maxOutputTokens: maxTokens,
46
+ },
47
+ };
48
+ if (systemContext) {
49
+ body.system_instruction = { parts: [{ text: systemContext }] };
50
+ }
51
+ break;
52
+ }
53
+ default: {
54
+ headers.Authorization = `Bearer ${apiKey}`;
55
+ const messages = [];
56
+ if (systemContext) {
57
+ messages.push({ role: 'system', content: systemContext });
58
+ }
59
+ messages.push(...userMessages);
60
+ body = {
61
+ model: modelName,
62
+ messages,
63
+ temperature,
64
+ max_tokens: maxTokens,
65
+ };
66
+ break;
67
+ }
68
+ }
69
+ return { body, headers, url };
70
+ }
71
+ function parseProviderResponse(provider, responseData) {
72
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
73
+ switch (provider) {
74
+ case 'anthropic': {
75
+ const content = responseData.content;
76
+ const usage = responseData.usage;
77
+ return {
78
+ responseText: (_b = (_a = content === null || content === void 0 ? void 0 : content[0]) === null || _a === void 0 ? void 0 : _a.text) !== null && _b !== void 0 ? _b : '',
79
+ inputTokens: (_c = usage === null || usage === void 0 ? void 0 : usage.input_tokens) !== null && _c !== void 0 ? _c : 0,
80
+ outputTokens: (_d = usage === null || usage === void 0 ? void 0 : usage.output_tokens) !== null && _d !== void 0 ? _d : 0,
81
+ };
82
+ }
83
+ case 'google': {
84
+ const candidates = responseData.candidates;
85
+ const usageMetadata = responseData.usageMetadata;
86
+ return {
87
+ responseText: (_j = (_h = (_g = (_f = (_e = candidates === null || candidates === void 0 ? void 0 : candidates[0]) === null || _e === void 0 ? void 0 : _e.content) === null || _f === void 0 ? void 0 : _f.parts) === null || _g === void 0 ? void 0 : _g[0]) === null || _h === void 0 ? void 0 : _h.text) !== null && _j !== void 0 ? _j : '',
88
+ inputTokens: (_k = usageMetadata === null || usageMetadata === void 0 ? void 0 : usageMetadata.promptTokenCount) !== null && _k !== void 0 ? _k : 0,
89
+ outputTokens: (_l = usageMetadata === null || usageMetadata === void 0 ? void 0 : usageMetadata.candidatesTokenCount) !== null && _l !== void 0 ? _l : 0,
90
+ };
91
+ }
92
+ default: {
93
+ const choices = responseData.choices;
94
+ const usage = responseData.usage;
95
+ return {
96
+ responseText: (_p = (_o = (_m = choices === null || choices === void 0 ? void 0 : choices[0]) === null || _m === void 0 ? void 0 : _m.message) === null || _o === void 0 ? void 0 : _o.content) !== null && _p !== void 0 ? _p : '',
97
+ inputTokens: (_q = usage === null || usage === void 0 ? void 0 : usage.prompt_tokens) !== null && _q !== void 0 ? _q : 0,
98
+ outputTokens: (_r = usage === null || usage === void 0 ? void 0 : usage.completion_tokens) !== null && _r !== void 0 ? _r : 0,
99
+ };
100
+ }
101
+ }
102
+ }
103
+ class CircusAgent {
104
+ constructor() {
105
+ this.description = {
106
+ displayName: 'Circus Agent',
107
+ name: 'circusAgent',
108
+ icon: { light: 'file:circusAgent.svg', dark: 'file:circusAgent.dark.svg' },
109
+ group: ['output'],
110
+ version: 1,
111
+ subtitle: '={{$parameter["agentSlug"]}}',
112
+ description: 'Execute AI agent calls using operator-configured models and prompts from the Circus platform',
113
+ defaults: {
114
+ name: 'Circus Agent',
115
+ },
116
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
117
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
118
+ usableAsTool: true,
119
+ credentials: [
120
+ {
121
+ name: 'circusApi',
122
+ required: true,
123
+ displayName: 'Circus Platform API',
124
+ },
125
+ {
126
+ name: 'circusOpenaiApi',
127
+ displayName: 'OpenAI API Key',
128
+ },
129
+ {
130
+ name: 'circusAnthropicApi',
131
+ displayName: 'Anthropic API Key',
132
+ },
133
+ {
134
+ name: 'circusGoogleApi',
135
+ displayName: 'Google AI API Key',
136
+ },
137
+ {
138
+ name: 'circusXaiApi',
139
+ displayName: 'xAI API Key',
140
+ },
141
+ ],
142
+ properties: [
143
+ {
144
+ displayName: 'Agent Slug',
145
+ name: 'agentSlug',
146
+ type: 'string',
147
+ required: true,
148
+ default: '',
149
+ description: 'Agent slug matching an entry in the workflow configuration snapshot',
150
+ },
151
+ {
152
+ displayName: 'Input Text',
153
+ name: 'inputText',
154
+ type: 'string',
155
+ typeOptions: {
156
+ rows: 4,
157
+ },
158
+ default: '',
159
+ description: 'The work item to process. Supports n8n expressions. Sent as a separate user message after the prompt.',
160
+ },
161
+ {
162
+ displayName: 'Include System Context',
163
+ name: 'includeSystemContext',
164
+ type: 'boolean',
165
+ default: false,
166
+ description: 'Whether to include system context entries in the prompt',
167
+ },
168
+ {
169
+ displayName: 'System Context Entries',
170
+ name: 'systemContextEntries',
171
+ type: 'string',
172
+ default: '',
173
+ description: 'Comma-separated list of system context keys to include. Leave empty to include all.',
174
+ displayOptions: {
175
+ show: {
176
+ includeSystemContext: [true],
177
+ },
178
+ },
179
+ },
180
+ {
181
+ displayName: 'Missing Context Behavior',
182
+ name: 'missingContextBehavior',
183
+ type: 'options',
184
+ options: [
185
+ {
186
+ name: 'Fail',
187
+ value: 'fail',
188
+ },
189
+ {
190
+ name: 'Ignore',
191
+ value: 'ignore',
192
+ },
193
+ {
194
+ name: 'Ignore and Report',
195
+ value: 'ignore_and_report',
196
+ },
197
+ ],
198
+ default: 'ignore',
199
+ description: 'How to handle missing system context entries',
200
+ displayOptions: {
201
+ show: {
202
+ includeSystemContext: [true],
203
+ },
204
+ },
205
+ },
206
+ ],
207
+ };
208
+ }
209
+ async execute() {
210
+ var _a, _b, _c, _d, _e, _f, _g, _h;
211
+ const items = this.getInputData();
212
+ const returnData = [];
213
+ for (let i = 0; i < items.length; i++) {
214
+ try {
215
+ const startTime = Date.now();
216
+ const agentSlug = this.getNodeParameter('agentSlug', i);
217
+ const inputText = this.getNodeParameter('inputText', i, '');
218
+ const includeSystemContext = this.getNodeParameter('includeSystemContext', i, false);
219
+ const circus = await (0, circusContext_1.getCircusContext)(this);
220
+ const nodeName = this.getNode().name;
221
+ const callCircusApi = async (path, body) => {
222
+ try {
223
+ return (await this.helpers.httpRequestWithAuthentication.call(this, 'circusApi', {
224
+ method: 'POST',
225
+ url: `${circus.baseUrl}${path}`,
226
+ body,
227
+ json: true,
228
+ }));
229
+ }
230
+ catch {
231
+ return undefined;
232
+ }
233
+ };
234
+ const logError = async (message) => {
235
+ await callCircusApi('/logs', {
236
+ idempotency_key: (0, node_crypto_1.randomUUID)(),
237
+ external_execution_id: circus.externalExecutionId,
238
+ node_name: nodeName,
239
+ worker_type: 'internal',
240
+ worker_slug: 'system',
241
+ status: 'error',
242
+ error_message: message,
243
+ });
244
+ };
245
+ const terminate = async (reason) => {
246
+ await callCircusApi('/terminate', {
247
+ reason,
248
+ external_execution_id: circus.externalExecutionId,
249
+ });
250
+ };
251
+ const throwValidationError = async (message) => {
252
+ await logError(message);
253
+ await terminate(message);
254
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), message, {
255
+ itemIndex: i,
256
+ });
257
+ };
258
+ const workflowConfigSnapshot = (0, circusContext_1.getSnapshot)(this, circus.initNodeName, 'workflow_config_snapshot', i);
259
+ const agentAssignments = (_a = workflowConfigSnapshot === null || workflowConfigSnapshot === void 0 ? void 0 : workflowConfigSnapshot.agent_assignments) !== null && _a !== void 0 ? _a : [];
260
+ const agentConfig = agentAssignments.find((a) => a.agent_slug === agentSlug);
261
+ if (!agentConfig) {
262
+ await throwValidationError(`Agent slug '${agentSlug}' not found in workflow configuration snapshot`);
263
+ return [[]];
264
+ }
265
+ if (!agentConfig.model_provider) {
266
+ await throwValidationError('model_provider is missing or empty in agent snapshot');
267
+ return [[]];
268
+ }
269
+ if (!agentConfig.model_name) {
270
+ await throwValidationError('model_name is missing or empty in agent snapshot');
271
+ return [[]];
272
+ }
273
+ if (!agentConfig.model_base_url) {
274
+ await throwValidationError('model_base_url is missing or empty in agent snapshot');
275
+ return [[]];
276
+ }
277
+ if (!agentConfig.max_tokens || agentConfig.max_tokens <= 0) {
278
+ await throwValidationError('max_tokens must be a positive integer');
279
+ return [[]];
280
+ }
281
+ if (agentConfig.temperature < 0 ||
282
+ agentConfig.temperature > 2) {
283
+ await throwValidationError('temperature must be between 0 and 2 (inclusive)');
284
+ return [[]];
285
+ }
286
+ const providerCapitalized = agentConfig.model_provider.charAt(0).toUpperCase() +
287
+ agentConfig.model_provider.slice(1);
288
+ const credentialName = `circus${providerCapitalized}Api`;
289
+ let providerApiKey;
290
+ try {
291
+ const providerCredentials = await this.getCredentials(credentialName, i);
292
+ providerApiKey = providerCredentials.apiKey;
293
+ }
294
+ catch {
295
+ await throwValidationError(`AI provider credential '${credentialName}' not found. Configure it in n8n's credential manager.`);
296
+ return [[]];
297
+ }
298
+ let systemContext;
299
+ if (includeSystemContext) {
300
+ const systemSnapshot = (0, circusContext_1.getSnapshot)(this, circus.initNodeName, 'system_snapshot', i);
301
+ const allContext = (_b = systemSnapshot === null || systemSnapshot === void 0 ? void 0 : systemSnapshot.system_context) !== null && _b !== void 0 ? _b : {};
302
+ const systemContextEntriesRaw = this.getNodeParameter('systemContextEntries', i, '');
303
+ const requestedKeys = systemContextEntriesRaw
304
+ ? systemContextEntriesRaw
305
+ .split(',')
306
+ .map((k) => k.trim())
307
+ .filter((k) => k)
308
+ : [];
309
+ const missingContextBehavior = this.getNodeParameter('missingContextBehavior', i, 'ignore');
310
+ let contextEntries;
311
+ if (requestedKeys.length === 0) {
312
+ contextEntries = allContext;
313
+ }
314
+ else {
315
+ contextEntries = {};
316
+ for (const key of requestedKeys) {
317
+ if (key in allContext) {
318
+ contextEntries[key] = allContext[key];
319
+ }
320
+ else {
321
+ switch (missingContextBehavior) {
322
+ case 'fail':
323
+ await throwValidationError(`System context key '${key}' not found in system snapshot`);
324
+ return [[]];
325
+ case 'ignore_and_report':
326
+ await callCircusApi('/logs', {
327
+ idempotency_key: (0, node_crypto_1.randomUUID)(),
328
+ external_execution_id: circus.externalExecutionId,
329
+ node_name: nodeName,
330
+ worker_type: 'agent',
331
+ worker_slug: agentSlug,
332
+ status: 'error',
333
+ error_message: `System context key '${key}' not found in system snapshot`,
334
+ });
335
+ break;
336
+ default:
337
+ break;
338
+ }
339
+ }
340
+ }
341
+ }
342
+ const contextParts = Object.entries(contextEntries).map(([key, value]) => `${key}: ${value}`);
343
+ if (contextParts.length > 0) {
344
+ systemContext = contextParts.join('\n');
345
+ }
346
+ }
347
+ const providerRequest = buildProviderRequest(agentConfig.model_provider, agentConfig.model_name, systemContext, agentConfig.prompt_text, inputText || undefined, agentConfig.temperature, agentConfig.max_tokens, agentConfig.model_base_url, providerApiKey);
348
+ let aiResponse;
349
+ let aiError;
350
+ try {
351
+ const requestOptions = {
352
+ method: 'POST',
353
+ url: providerRequest.url,
354
+ headers: providerRequest.headers,
355
+ body: providerRequest.body,
356
+ json: true,
357
+ };
358
+ aiResponse = (await this.helpers.httpRequest(requestOptions));
359
+ }
360
+ catch (error) {
361
+ const axiosError = error;
362
+ const responseData = ((_c = axiosError.response) === null || _c === void 0 ? void 0 : _c.data)
363
+ ? JSON.stringify(axiosError.response.data)
364
+ : '';
365
+ const statusCode = (_e = (_d = axiosError.response) === null || _d === void 0 ? void 0 : _d.status) !== null && _e !== void 0 ? _e : '';
366
+ aiError = new Error(`${axiosError.message} [${statusCode}]${responseData ? ` | ${responseData}` : ''}`);
367
+ }
368
+ let parsed;
369
+ if (aiResponse && !aiError) {
370
+ parsed = parseProviderResponse(agentConfig.model_provider, aiResponse);
371
+ }
372
+ const durationSeconds = (Date.now() - startTime) / 1000;
373
+ const logStatus = aiError ? 'error' : 'success';
374
+ const logBody = {
375
+ idempotency_key: (0, node_crypto_1.randomUUID)(),
376
+ external_execution_id: circus.externalExecutionId,
377
+ node_name: nodeName,
378
+ worker_type: 'agent',
379
+ worker_slug: agentSlug,
380
+ model: agentConfig.model_name,
381
+ model_provider: agentConfig.model_provider,
382
+ status: logStatus,
383
+ duration_seconds: durationSeconds,
384
+ input_size: (_f = parsed === null || parsed === void 0 ? void 0 : parsed.inputTokens) !== null && _f !== void 0 ? _f : 0,
385
+ output_size: (_g = parsed === null || parsed === void 0 ? void 0 : parsed.outputTokens) !== null && _g !== void 0 ? _g : 0,
386
+ request_payload: providerRequest.body,
387
+ response_payload: aiResponse !== null && aiResponse !== void 0 ? aiResponse : null,
388
+ };
389
+ if (aiError) {
390
+ logBody.error_message = aiError.message;
391
+ }
392
+ const logResponse = await callCircusApi('/logs', logBody);
393
+ const logData = logResponse === null || logResponse === void 0 ? void 0 : logResponse.data;
394
+ if (logData === null || logData === void 0 ? void 0 : logData.abort) {
395
+ const reason = 'Execution aborted: cost or time threshold exceeded';
396
+ await terminate(reason);
397
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), reason, {
398
+ itemIndex: i,
399
+ });
400
+ }
401
+ if (aiError) {
402
+ const continueOnFail = this.continueOnFail();
403
+ const retryOnFail = this.getNode().retryOnFail;
404
+ if (!continueOnFail && retryOnFail) {
405
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), aiError, { message: aiError.message, itemIndex: i });
406
+ }
407
+ await terminate(`AI API call failed: ${aiError.message}`);
408
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), aiError, {
409
+ message: `AI API call failed: ${aiError.message}`,
410
+ itemIndex: i,
411
+ });
412
+ }
413
+ let parsedResponse = parsed.responseText;
414
+ try {
415
+ parsedResponse = JSON.parse(parsed.responseText);
416
+ }
417
+ catch {
418
+ }
419
+ returnData.push({
420
+ json: {
421
+ response: parsedResponse,
422
+ model: agentConfig.model_name,
423
+ model_provider: agentConfig.model_provider,
424
+ agent_slug: agentSlug,
425
+ input_tokens: parsed.inputTokens,
426
+ output_tokens: parsed.outputTokens,
427
+ duration_seconds: durationSeconds,
428
+ cost_consumed: (_h = logData === null || logData === void 0 ? void 0 : logData.cost_consumed) !== null && _h !== void 0 ? _h : 0,
429
+ abort: false,
430
+ },
431
+ pairedItem: { item: i },
432
+ });
433
+ }
434
+ catch (error) {
435
+ if (error instanceof n8n_workflow_1.NodeApiError ||
436
+ error instanceof n8n_workflow_1.NodeOperationError) {
437
+ throw error;
438
+ }
439
+ if (this.continueOnFail()) {
440
+ returnData.push({
441
+ json: { error: error.message },
442
+ pairedItem: { item: i },
443
+ });
444
+ continue;
445
+ }
446
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, {
447
+ itemIndex: i,
448
+ });
449
+ }
450
+ }
451
+ return [returnData];
452
+ }
453
+ }
454
+ exports.CircusAgent = CircusAgent;
455
+ //# sourceMappingURL=CircusAgent.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircusAgent.node.js","sourceRoot":"","sources":["../../../nodes/CircusAgent/CircusAgent.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ {
2
+ "node": "n8n-nodes-circus.circusAgent",
3
+ "nodeVersion": "1.0",
4
+ "codexVersion": "1.0",
5
+ "categories": ["Development", "Developer Tools"],
6
+ "resources": {
7
+ "credentialDocumentation": [
8
+ {
9
+ "url": "https://circus.sh/docs/n8n-nodes#credentials"
10
+ }
11
+ ],
12
+ "primaryDocumentation": [
13
+ {
14
+ "url": "https://circus.sh/docs/n8n-nodes#agent"
15
+ }
16
+ ]
17
+ }
18
+ }
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#7ab8ff"
2
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
3
+ <circle cx="12" cy="8" r="5"></circle>
4
+ <path d="M20 21a8 8 0 1 0-16 0"></path>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="#4a90d9"
2
+ stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
3
+ <circle cx="12" cy="8" r="5"></circle>
4
+ <path d="M20 21a8 8 0 1 0-16 0"></path>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class CircusComplete implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CircusComplete = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const n8n_workflow_1 = require("n8n-workflow");
6
+ const circusContext_1 = require("../shared/circusContext");
7
+ class CircusComplete {
8
+ constructor() {
9
+ this.description = {
10
+ displayName: 'Circus Complete',
11
+ name: 'circusComplete',
12
+ icon: { light: 'file:circusComplete.svg', dark: 'file:circusComplete.dark.svg' },
13
+ group: ['output'],
14
+ version: 1,
15
+ subtitle: 'Complete workflow execution',
16
+ description: 'Mark a workflow execution as successfully completed and transmit result artifacts to the Circus platform',
17
+ defaults: {
18
+ name: 'Circus Complete',
19
+ },
20
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
21
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
22
+ usableAsTool: true,
23
+ credentials: [
24
+ {
25
+ name: 'circusApi',
26
+ required: true,
27
+ },
28
+ ],
29
+ properties: [
30
+ {
31
+ displayName: 'Result Payload',
32
+ name: 'resultPayload',
33
+ type: 'json',
34
+ required: true,
35
+ default: '{}',
36
+ description: 'JSON object containing the workflow output. Structure is plugin-specific — the node does not validate its contents.',
37
+ },
38
+ ],
39
+ };
40
+ }
41
+ async execute() {
42
+ const items = this.getInputData();
43
+ const returnData = [];
44
+ for (let i = 0; i < items.length; i++) {
45
+ try {
46
+ const resultPayloadRaw = this.getNodeParameter('resultPayload', i);
47
+ const resultPayload = JSON.parse(resultPayloadRaw);
48
+ const circus = await (0, circusContext_1.getCircusContext)(this);
49
+ try {
50
+ await this.helpers.httpRequestWithAuthentication.call(this, 'circusApi', {
51
+ method: 'POST',
52
+ url: `${circus.baseUrl}/complete`,
53
+ body: {
54
+ result_payload: resultPayload,
55
+ external_execution_id: circus.externalExecutionId,
56
+ },
57
+ json: true,
58
+ });
59
+ }
60
+ catch (completeError) {
61
+ const errorDetails = completeError.message;
62
+ try {
63
+ await this.helpers.httpRequestWithAuthentication.call(this, 'circusApi', {
64
+ method: 'POST',
65
+ url: `${circus.baseUrl}/logs`,
66
+ body: {
67
+ idempotency_key: (0, node_crypto_1.randomUUID)(),
68
+ node_name: 'circus-complete',
69
+ worker_type: 'internal',
70
+ worker_slug: 'system',
71
+ status: 'error',
72
+ error_message: `Complete endpoint failed: ${errorDetails}`,
73
+ external_execution_id: circus.externalExecutionId,
74
+ },
75
+ json: true,
76
+ });
77
+ }
78
+ catch {
79
+ }
80
+ const continueOnFail = this.continueOnFail();
81
+ const retryOnFail = this.getNode().retryOnFail;
82
+ if (!continueOnFail && retryOnFail) {
83
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), completeError, { message: `Failed to complete execution: ${errorDetails}`, itemIndex: i });
84
+ }
85
+ try {
86
+ await this.helpers.httpRequestWithAuthentication.call(this, 'circusApi', {
87
+ method: 'POST',
88
+ url: `${circus.baseUrl}/terminate`,
89
+ body: {
90
+ reason: `Failed to complete execution: ${errorDetails}`,
91
+ external_execution_id: circus.externalExecutionId,
92
+ },
93
+ json: true,
94
+ });
95
+ }
96
+ catch {
97
+ }
98
+ throw new n8n_workflow_1.NodeApiError(this.getNode(), completeError, { message: `Failed to complete execution: ${errorDetails}`, itemIndex: i });
99
+ }
100
+ returnData.push({
101
+ json: {
102
+ completed: true,
103
+ message: 'Execution completed successfully',
104
+ },
105
+ pairedItem: { item: i },
106
+ });
107
+ }
108
+ catch (error) {
109
+ if (error instanceof n8n_workflow_1.NodeApiError || error instanceof n8n_workflow_1.NodeOperationError) {
110
+ throw error;
111
+ }
112
+ if (this.continueOnFail()) {
113
+ returnData.push({
114
+ json: { error: error.message },
115
+ pairedItem: { item: i },
116
+ });
117
+ continue;
118
+ }
119
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), error, {
120
+ itemIndex: i,
121
+ });
122
+ }
123
+ }
124
+ return [returnData];
125
+ }
126
+ }
127
+ exports.CircusComplete = CircusComplete;
128
+ //# sourceMappingURL=CircusComplete.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircusComplete.node.js","sourceRoot":"","sources":["../../../nodes/CircusComplete/CircusComplete.node.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AAQzC,+CAAqF;AACrF,2DAA2D;AAE3D,MAAa,cAAc;IAA3B;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,iBAAiB;YAC9B,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,8BAA8B,EAAE;YAChF,KAAK,EAAE,CAAC,QAAQ,CAAC;YACjB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,6BAA6B;YACvC,WAAW,EACV,0GAA0G;YAC3G,QAAQ,EAAE;gBACT,IAAI,EAAE,iBAAiB;aACvB;YACD,MAAM,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YAClC,OAAO,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YACnC,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE;gBACZ;oBACC,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,IAAI;iBACd;aACD;YACD,UAAU,EAAE;gBACX;oBACC,WAAW,EAAE,gBAAgB;oBAC7B,IAAI,EAAE,eAAe;oBACrB,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,IAAI;oBACd,OAAO,EAAE,IAAI;oBACb,WAAW,EACV,qHAAqH;iBACtH;aACD;SACD,CAAC;IAyHH,CAAC;IAvHA,KAAK,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC;gBACJ,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAC7C,eAAe,EACf,CAAC,CACS,CAAC;gBACZ,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAW,CAAC;gBAC7D,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAgB,EAAC,IAAI,CAAC,CAAC;gBAE5C,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CACpD,IAAI,EACJ,WAAW,EACX;wBACC,MAAM,EAAE,MAAM;wBACd,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,WAAW;wBACjC,IAAI,EAAE;4BACL,cAAc,EAAE,aAAa;4BAC7B,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;yBACjD;wBACD,IAAI,EAAE,IAAI;qBACV,CACD,CAAC;gBACH,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACxB,MAAM,YAAY,GAAI,aAAuB,CAAC,OAAO,CAAC;oBAGtD,IAAI,CAAC;wBACJ,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CACpD,IAAI,EACJ,WAAW,EACX;4BACC,MAAM,EAAE,MAAM;4BACd,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,OAAO;4BAC7B,IAAI,EAAE;gCACL,eAAe,EAAE,IAAA,wBAAU,GAAE;gCAC7B,SAAS,EAAE,iBAAiB;gCAC5B,WAAW,EAAE,UAAU;gCACvB,WAAW,EAAE,QAAQ;gCACrB,MAAM,EAAE,OAAO;gCACf,aAAa,EAAE,6BAA6B,YAAY,EAAE;gCAC1D,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;6BACjD;4BACD,IAAI,EAAE,IAAI;yBACV,CACD,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;oBAET,CAAC;oBAED,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,CAAC;oBAE/C,IAAI,CAAC,cAAc,IAAI,WAAW,EAAE,CAAC;wBAEpC,MAAM,IAAI,2BAAY,CACrB,IAAI,CAAC,OAAO,EAAE,EACd,aAAsC,EACtC,EAAE,OAAO,EAAE,iCAAiC,YAAY,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAC1E,CAAC;oBACH,CAAC;oBAGD,IAAI,CAAC;wBACJ,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,CACpD,IAAI,EACJ,WAAW,EACX;4BACC,MAAM,EAAE,MAAM;4BACd,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,YAAY;4BAClC,IAAI,EAAE;gCACL,MAAM,EAAE,iCAAiC,YAAY,EAAE;gCACvD,qBAAqB,EAAE,MAAM,CAAC,mBAAmB;6BACjD;4BACD,IAAI,EAAE,IAAI;yBACV,CACD,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;oBAET,CAAC;oBAED,MAAM,IAAI,2BAAY,CACrB,IAAI,CAAC,OAAO,EAAE,EACd,aAAsC,EACtC,EAAE,OAAO,EAAE,iCAAiC,YAAY,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAC1E,CAAC;gBACH,CAAC;gBAED,UAAU,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE;wBACL,SAAS,EAAE,IAAI;wBACf,OAAO,EAAE,kCAAkC;qBAC3C;oBACD,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;iBACvB,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,KAAK,YAAY,2BAAY,IAAI,KAAK,YAAY,iCAAkB,EAAE,CAAC;oBAE1E,MAAM,KAAK,CAAC;gBACb,CAAC;gBACD,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE;wBACzC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;qBACvB,CAAC,CAAC;oBACH,SAAS;gBACV,CAAC;gBACD,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAc,EAAE;oBAC5D,SAAS,EAAE,CAAC;iBACZ,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QAED,OAAO,CAAC,UAAU,CAAC,CAAC;IACrB,CAAC;CACD;AA1JD,wCA0JC"}