@net3/queuer
Version:
129 lines (113 loc) • 4.17 kB
text/typescript
import {
createAction,
Property,
ActionContext,
} from '@activepieces/pieces-framework';
import { QueueManager } from '../common/queue-manager';
import { MCPManager } from '../common/mcp-manager';
export const clearQueue = createAction({
name: 'clear_queue',
displayName: 'Clear Queue',
description: 'Clear all items from a queue',
props: {
queueId: Property.Dropdown({
displayName: 'Select Queue',
description: 'Select the queue to clear all items from',
required: true,
refreshers: [],
options: async ({ auth }) => {
const authConfig = auth as { mcpServerUrl?: string };
if (!authConfig.mcpServerUrl) {
return {
options: [],
placeholder: 'MCP Server URL required in auth configuration'
};
}
try {
const config = { mcpServerUrl: authConfig.mcpServerUrl };
const tools = await MCPManager.listMCPTools(config);
if (tools.length === 0) {
return {
options: [],
placeholder: 'No MCP tools found'
};
}
// Generate queue options based on available tools
const queueOptions = tools.map((tool: any) => ({
label: `Queue: ${tool.name} - ${tool.description || 'No description'}`,
value: `mcp_${tool.name}_queue`,
}));
return {
options: queueOptions,
placeholder: 'Select a queue to clear'
};
} catch (error) {
console.error('Failed to fetch MCP tools:', error);
return {
options: [],
placeholder: 'Failed to connect to MCP server'
};
}
},
}),
},
async run(context: ActionContext) {
try {
const { queueId } = context.propsValue;
if (!queueId) {
throw new Error('Queue ID is required');
}
// Verify queue exists
const queue = await QueueManager.getQueueConfiguration(context, queueId as string);
if (!queue) {
throw new Error(`Queue "${queueId}" not found. Make sure the queue was created using Create/Update Queue action.`);
}
// Get current status before clearing
let statusBefore;
try {
statusBefore = await QueueManager.getQueueStatus(context, queueId as string);
if (!statusBefore) {
throw new Error(`Failed to get queue status for "${queueId}"`);
}
} catch (error: any) {
throw new Error(`Failed to get queue status before clearing: ${error.message}`);
}
// Clear the queue
let result;
try {
result = await QueueManager.clearQueue(context, queueId as string);
if (!result) {
throw new Error('Clear queue operation returned no result');
}
} catch (error: any) {
throw new Error(`Failed to clear queue: ${error.message}`);
}
// Get updated status
let statusAfter;
try {
statusAfter = await QueueManager.getQueueStatus(context, queueId as string);
if (!statusAfter) {
throw new Error(`Failed to get queue status after clearing`);
}
} catch (error: any) {
throw new Error(`Failed to get queue status after clearing: ${error.message}`);
}
// Verify the clear operation was successful
if (statusAfter.pendingItems > 0) {
throw new Error(`Clear operation may have failed - ${statusAfter.pendingItems} items still remain in queue`);
}
return {
success: true,
queueId: result.queueId,
clearedCount: result.clearedCount,
queueName: queue.mcpToolName,
statusBefore,
statusAfter,
clearedAt: new Date().toISOString(),
message: `Successfully cleared ${result.clearedCount} items from queue "${queue.mcpToolName}"`,
};
} catch (error: any) {
throw new Error(`Clear Queue Action Failed: ${error.message}`);
}
},
});