n8n
Version:
n8n Workflow Automation Tool
137 lines • 6.21 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
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;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.InstanceAiTemporaryWorkflowService = void 0;
const backend_common_1 = require("@n8n/backend-common");
const db_1 = require("@n8n/db");
const di_1 = require("@n8n/di");
const instance_ai_adapter_service_1 = require("./instance-ai.adapter.service");
const instance_ai_thread_repository_1 = require("./repositories/instance-ai-thread.repository");
function getErrorMessage(error) {
return error instanceof Error ? error.message : String(error);
}
let InstanceAiTemporaryWorkflowService = class InstanceAiTemporaryWorkflowService {
constructor(logger, adapterService, threadRepo, userRepository, aiBuilderTemporaryWorkflowRepository) {
this.adapterService = adapterService;
this.threadRepo = threadRepo;
this.userRepository = userRepository;
this.aiBuilderTemporaryWorkflowRepository = aiBuilderTemporaryWorkflowRepository;
this.logger = logger.scoped('instance-ai');
}
async reapForRun(threadId, user, createdWorkflowIds, runningTaskCount) {
if (runningTaskCount > 0) {
this.logger.debug('Deferring AI-builder temporary workflow cleanup until tasks settle', {
threadId,
runningTaskCount,
});
return [];
}
let markedWorkflows = [];
try {
markedWorkflows = await this.aiBuilderTemporaryWorkflowRepository.findByThread(threadId);
}
catch (error) {
this.logger.warn('Failed to inspect AI-builder temporary workflows during run finish', {
threadId,
error: getErrorMessage(error),
});
}
const workflowIds = new Set([
...markedWorkflows.map(({ workflowId }) => workflowId),
...(createdWorkflowIds ?? []),
]);
if (workflowIds.size === 0)
return [];
return await this.archive(threadId, user, workflowIds);
}
async reapForThreadCleanup(threadId) {
let markedWorkflows;
try {
markedWorkflows = await this.aiBuilderTemporaryWorkflowRepository.findByThread(threadId);
}
catch (error) {
this.logger.warn('Failed to inspect AI-builder temporary workflows during thread cleanup', {
threadId,
error: getErrorMessage(error),
});
return;
}
if (markedWorkflows.length === 0)
return;
let thread;
try {
thread = await this.threadRepo.findOneBy({ id: threadId });
}
catch (error) {
this.logger.warn('Failed to load thread owner for AI-builder temporary workflow cleanup', {
threadId,
markedWorkflowCount: markedWorkflows.length,
error: getErrorMessage(error),
});
return;
}
if (!thread?.resourceId) {
this.logger.warn('Skipping AI-builder temporary workflow cleanup for thread without owner', {
threadId,
markedWorkflowCount: markedWorkflows.length,
});
return;
}
let user;
try {
user = await this.userRepository.findOneBy({ id: thread.resourceId });
}
catch (error) {
this.logger.warn('Failed to load user for AI-builder temporary workflow cleanup', {
threadId,
userId: thread.resourceId,
markedWorkflowCount: markedWorkflows.length,
error: getErrorMessage(error),
});
return;
}
if (!user) {
this.logger.warn('Skipping AI-builder temporary workflow cleanup for missing thread owner', {
threadId,
userId: thread.resourceId,
markedWorkflowCount: markedWorkflows.length,
});
return;
}
await this.archive(threadId, user, new Set(markedWorkflows.map(({ workflowId }) => workflowId)));
}
async archive(threadId, user, workflowIds) {
const configEvalsEnabled = await this.adapterService.isConfigEvalsEnabled(user);
const adapter = this.adapterService.createContext(user, { threadId, configEvalsEnabled });
const archived = [];
for (const workflowId of workflowIds) {
try {
const didArchive = await adapter.workflowService.archiveIfAiTemporary(workflowId);
if (didArchive)
archived.push(workflowId);
}
catch (error) {
this.logger.warn('Failed to reap AI-builder temporary workflow', {
threadId,
workflowId,
error: getErrorMessage(error),
});
}
}
return archived;
}
};
exports.InstanceAiTemporaryWorkflowService = InstanceAiTemporaryWorkflowService;
exports.InstanceAiTemporaryWorkflowService = InstanceAiTemporaryWorkflowService = __decorate([
(0, di_1.Service)(),
__metadata("design:paramtypes", [backend_common_1.Logger, instance_ai_adapter_service_1.InstanceAiAdapterService, instance_ai_thread_repository_1.InstanceAiThreadRepository, db_1.UserRepository, db_1.AiBuilderTemporaryWorkflowRepository])
], InstanceAiTemporaryWorkflowService);
//# sourceMappingURL=instance-ai-temporary-workflow.service.js.map