f7cloud_client/apps/assistant/lib/Capabilities.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

155 lines
5.0 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2024 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Assistant;
use OCA\Assistant\AppInfo\Application;
use OCP\App\IAppManager;
use OCP\Capabilities\IPublicCapability;
use OCP\IAppConfig;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\TaskProcessing\IManager;
use OCP\TaskProcessing\TaskTypes\AudioToText;
use OCP\TaskProcessing\TaskTypes\TextToTextSummary;
class Capabilities implements IPublicCapability {
public function __construct(
private IAppManager $appManager,
private IConfig $config,
private IAppConfig $appConfig,
private IManager $taskProcessingManager,
private IL10N $l,
private IUrlGenerator $urlGenerator,
private ?string $userId,
) {
}
/**
* @return array{
* assistant: array{
* version: string,
* enabled?: bool
* },
* client_integration?: array<string, array{
* version: float,
* context-menu: list<array{
* name: string,
* url: string,
* method: string,
* mimetype_filters: string,
* icon: string,
* }>
* }>,
* }
*/
public function getCapabilities(): array {
// App version
$appVersion = $this->appManager->getAppVersion(Application::APP_ID);
$capabilities = [
Application::APP_ID => [
'version' => $appVersion,
],
];
if ($this->userId === null) {
return $capabilities;
}
$adminAssistantEnabled = $this->appConfig->getValueString(Application::APP_ID, 'assistant_enabled', '1') === '1';
$userAssistantEnabled = $this->config->getUserValue($this->userId, Application::APP_ID, 'assistant_enabled', '1') === '1';
$assistantEnabled = $adminAssistantEnabled && $userAssistantEnabled;
$capabilities[Application::APP_ID]['enabled'] = $assistantEnabled;
// client integration UI
$availableTaskTypes = $this->taskProcessingManager->getAvailableTaskTypes();
$summarizeAvailable = array_key_exists(TextToTextSummary::ID, $availableTaskTypes);
$sttAvailable = array_key_exists(AudioToText::ID, $availableTaskTypes);
$ttsAvailable = false;
if (class_exists('OCP\\TaskProcessing\\TaskTypes\\TextToSpeech')) {
if (array_key_exists(\OCP\TaskProcessing\TaskTypes\TextToSpeech::ID, $availableTaskTypes)) {
$ttsAvailable = true;
}
}
if ($summarizeAvailable || $sttAvailable || $ttsAvailable) {
$capabilities['client_integration'] = [
Application::APP_ID => [
'version' => 0.1,
'context-menu' => [],
],
];
$textMimeTypes = [
'text/',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.oasis.opendocument.text',
'application/pdf',
];
if ($summarizeAvailable) {
$url = $this->urlGenerator->linkToOCSRouteAbsolute(Application::APP_ID . '.assistantApi.runFileAction', [
'apiVersion' => 'v1',
'fileId' => '123456789',
'taskTypeId' => TextToTextSummary::ID,
]);
$url = str_replace($this->urlGenerator->getBaseUrl(), '', $url);
$url = str_replace('123456789', '{fileId}', $url);
$endpoint = [
'name' => $this->l->t('Summarize using AI'),
'url' => $url,
'method' => 'POST',
'mimetype_filters' => implode(', ', $textMimeTypes),
'icon' => $this->urlGenerator->imagePath(Application::APP_ID, 'client_integration/summarize.svg'),
];
$capabilities['client_integration'][Application::APP_ID]['context-menu'][] = $endpoint;
}
if ($sttAvailable) {
$url = $this->urlGenerator->linkToOCSRouteAbsolute(Application::APP_ID . '.assistantApi.runFileAction', [
'apiVersion' => 'v1',
'fileId' => '123456789',
'taskTypeId' => AudioToText::ID,
]);
$url = str_replace($this->urlGenerator->getBaseUrl(), '', $url);
$url = str_replace('123456789', '{fileId}', $url);
$endpoint = [
'name' => $this->l->t('Transcribe audio using AI'),
'url' => $url,
'method' => 'POST',
'mimetype_filters' => 'audio/',
'icon' => $this->urlGenerator->imagePath(Application::APP_ID, 'client_integration/speech_to_text.svg'),
];
$capabilities['client_integration'][Application::APP_ID]['context-menu'][] = $endpoint;
}
if ($ttsAvailable) {
$url = $this->urlGenerator->linkToOCSRouteAbsolute(Application::APP_ID . '.assistantApi.runFileAction', [
'apiVersion' => 'v1',
'fileId' => '123456789',
'taskTypeId' => \OCP\TaskProcessing\TaskTypes\TextToSpeech::ID,
]);
$url = str_replace($this->urlGenerator->getBaseUrl(), '', $url);
$url = str_replace('123456789', '{fileId}', $url);
$endpoint = [
'name' => $this->l->t('Text-To-Speech using AI'),
'url' => $url,
'method' => 'POST',
'mimetype_filters' => implode(', ', $textMimeTypes),
'icon' => $this->urlGenerator->imagePath(Application::APP_ID, 'client_integration/text_to_speech.svg'),
];
$capabilities['client_integration'][Application::APP_ID]['context-menu'][] = $endpoint;
}
}
return $capabilities;
}
}