@net3/queuer
Version:
166 lines (147 loc) • 5.27 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 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}`);
}
},
});