UNPKG

@net3/queuer

Version:

166 lines (147 loc) 5.27 kB
import { createAction, Property, ActionContext, } from '@activepieces/pieces-framework'; import { QueueManager } from '../common/queue-manager'; import { MCPManager } from '../common/mcp-manager'; export const listQueueItems = createAction({ name: 'list_queue_items', displayName: 'List Queue Items', description: 'Show all queued items for a specific queue', props: { queueId: Property.Dropdown({ displayName: 'Select Queue', description: 'Select the queue to list 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 list items from' }; } catch (error) { console.error('Failed to fetch MCP tools:', error); return { options: [], placeholder: 'Failed to connect to MCP server' }; } }, }), includeDetails: Property.Checkbox({ displayName: 'Include Full Details', description: 'Include complete action configuration and parameters for each item', required: false, defaultValue: false, }), }, async run(context: ActionContext) { try { const { queueId, includeDetails } = context.propsValue; if (!queueId) { throw new Error('Queue ID is required'); } // Verify queue exists let queue; try { 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.`); } } catch (error: any) { throw new Error(`Failed to get queue configuration: ${error.message}`); } // Get queue status let status; try { status = await QueueManager.getQueueStatus(context, queueId as string); if (!status) { throw new Error(`Failed to get queue status for "${queueId}"`); } } catch (error: any) { throw new Error(`Failed to get queue status: ${error.message}`); } // Get all items in the queue let items; try { items = await QueueManager.listQueueItems(context, queueId as string); if (!Array.isArray(items)) { throw new Error('Invalid queue items data received'); } } catch (error: any) { throw new Error(`Failed to get queue items: ${error.message}`); } // Format items for output let formattedItems; try { formattedItems = items.map(item => { if (!item || !item.id) { throw new Error('Invalid item data found in queue'); } const baseInfo = { id: item.id, status: item.status, releaseTime: new Date(item.releaseTime).toISOString(), createdAt: new Date(item.createdAt).toISOString(), targetAction: item.targetAction, lastError: item.lastError || null, }; if (includeDetails) { return { ...baseInfo, actionConfig: item.actionConfig, }; } return baseInfo; }); } catch (error: any) { throw new Error(`Failed to format queue items: ${error.message}`); } // Group items by status for summary let statusSummary; try { statusSummary = items.reduce((acc, item) => { acc[item.status] = (acc[item.status] || 0) + 1; return acc; }, {} as Record<string, number>); } catch (error: any) { throw new Error(`Failed to create status summary: ${error.message}`); } return { success: true, queueId: queueId as string, queueName: queue.mcpToolName, totalItems: items.length, statusSummary, items: formattedItems, queueStatus: status, retrievedAt: new Date().toISOString(), message: `Successfully retrieved ${items.length} items from queue "${queue.mcpToolName}"`, }; } catch (error: any) { throw new Error(`List Queue Items Action Failed: ${error.message}`); } }, });