71 lines
2.3 KiB
Ruby
71 lines
2.3 KiB
Ruby
class Captain::Tools::Copilot::SearchConversationsService < Captain::Tools::BaseService
|
|
def name
|
|
'search_conversations'
|
|
end
|
|
|
|
def description
|
|
'Search conversations based on parameters'
|
|
end
|
|
|
|
def parameters
|
|
{
|
|
type: 'object',
|
|
properties: properties,
|
|
required: []
|
|
}
|
|
end
|
|
|
|
def execute(arguments)
|
|
status = arguments['status']
|
|
contact_id = arguments['contact_id']
|
|
priority = arguments['priority']
|
|
labels = arguments['labels']
|
|
|
|
conversations = get_conversations(status, contact_id, priority, labels)
|
|
|
|
return 'No conversations found' unless conversations.exists?
|
|
|
|
total_count = conversations.count
|
|
conversations = conversations.limit(100)
|
|
|
|
<<~RESPONSE
|
|
#{total_count > 100 ? "Found #{total_count} conversations (showing first 100)" : "Total number of conversations: #{total_count}"}
|
|
#{conversations.map { |conversation| conversation.to_llm_text(include_contact_details: true) }.join("\n---\n")}
|
|
RESPONSE
|
|
end
|
|
|
|
def active?
|
|
user_has_permission('conversation_manage') ||
|
|
user_has_permission('conversation_unassigned_manage') ||
|
|
user_has_permission('conversation_participating_manage')
|
|
end
|
|
|
|
private
|
|
|
|
def get_conversations(status, contact_id, priority, labels)
|
|
conversations = permissible_conversations
|
|
conversations = conversations.where(contact_id: contact_id) if contact_id.present?
|
|
conversations = conversations.where(status: status) if status.present?
|
|
conversations = conversations.where(priority: priority) if priority.present?
|
|
conversations = conversations.tagged_with(labels, any: true) if labels.present?
|
|
conversations
|
|
end
|
|
|
|
def permissible_conversations
|
|
Conversations::PermissionFilterService.new(
|
|
@assistant.account.conversations,
|
|
@user,
|
|
@assistant.account
|
|
).perform
|
|
end
|
|
|
|
def properties
|
|
{
|
|
contact_id: { type: 'number', description: 'Filter conversations by contact ID' },
|
|
status: { type: 'string', enum: %w[open resolved pending snoozed], description: 'Filter conversations by status' },
|
|
priority: { type: 'string', enum: %w[low medium high urgent], description: 'Filter conversations by priority' },
|
|
labels: { type: 'array', items: { type: 'string' }, description: 'Filter conversations by labels' }
|
|
}
|
|
end
|
|
end
|