diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index a9c862e2e9b6c..ede6993f4aab3 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -286,6 +286,11 @@
'OCP\\Contacts\\ContactsMenu\\IProvider' => $baseDir . '/lib/public/Contacts/ContactsMenu/IProvider.php',
'OCP\\Contacts\\Events\\ContactInteractedWithEvent' => $baseDir . '/lib/public/Contacts/Events/ContactInteractedWithEvent.php',
'OCP\\Contacts\\IManager' => $baseDir . '/lib/public/Contacts/IManager.php',
+ 'OCP\\ContextChat\\ContentItem' => $baseDir . '/lib/public/ContextChat/ContentItem.php',
+ 'OCP\\ContextChat\\Events\\ContentProviderRegisterEvent' => $baseDir . '/lib/public/ContextChat/Events/ContentProviderRegisterEvent.php',
+ 'OCP\\ContextChat\\IContentManager' => $baseDir . '/lib/public/ContextChat/IContentManager.php',
+ 'OCP\\ContextChat\\IContentProvider' => $baseDir . '/lib/public/ContextChat/IContentProvider.php',
+ 'OCP\\ContextChat\\Type\\UpdateAccessOp' => $baseDir . '/lib/public/ContextChat/Type/UpdateAccessOp.php',
'OCP\\DB\\Events\\AddMissingColumnsEvent' => $baseDir . '/lib/public/DB/Events/AddMissingColumnsEvent.php',
'OCP\\DB\\Events\\AddMissingIndicesEvent' => $baseDir . '/lib/public/DB/Events/AddMissingIndicesEvent.php',
'OCP\\DB\\Events\\AddMissingPrimaryKeyEvent' => $baseDir . '/lib/public/DB/Events/AddMissingPrimaryKeyEvent.php',
@@ -1216,6 +1221,7 @@
'OC\\Contacts\\ContactsMenu\\Providers\\EMailProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\LocalTimeProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\ProfileProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php',
+ 'OC\\ContextChat\\ContentManager' => $baseDir . '/lib/private/ContextChat/ContentManager.php',
'OC\\Core\\AppInfo\\Application' => $baseDir . '/core/AppInfo/Application.php',
'OC\\Core\\BackgroundJobs\\BackgroundCleanupUpdaterBackupsJob' => $baseDir . '/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php',
'OC\\Core\\BackgroundJobs\\CheckForUserCertificates' => $baseDir . '/core/BackgroundJobs/CheckForUserCertificates.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 6217566aa716b..27e832438db09 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -327,6 +327,11 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Contacts\\ContactsMenu\\IProvider' => __DIR__ . '/../../..' . '/lib/public/Contacts/ContactsMenu/IProvider.php',
'OCP\\Contacts\\Events\\ContactInteractedWithEvent' => __DIR__ . '/../../..' . '/lib/public/Contacts/Events/ContactInteractedWithEvent.php',
'OCP\\Contacts\\IManager' => __DIR__ . '/../../..' . '/lib/public/Contacts/IManager.php',
+ 'OCP\\ContextChat\\ContentItem' => __DIR__ . '/../../..' . '/lib/public/ContextChat/ContentItem.php',
+ 'OCP\\ContextChat\\Events\\ContentProviderRegisterEvent' => __DIR__ . '/../../..' . '/lib/public/ContextChat/Events/ContentProviderRegisterEvent.php',
+ 'OCP\\ContextChat\\IContentManager' => __DIR__ . '/../../..' . '/lib/public/ContextChat/IContentManager.php',
+ 'OCP\\ContextChat\\IContentProvider' => __DIR__ . '/../../..' . '/lib/public/ContextChat/IContentProvider.php',
+ 'OCP\\ContextChat\\Type\\UpdateAccessOp' => __DIR__ . '/../../..' . '/lib/public/ContextChat/Type/UpdateAccessOp.php',
'OCP\\DB\\Events\\AddMissingColumnsEvent' => __DIR__ . '/../../..' . '/lib/public/DB/Events/AddMissingColumnsEvent.php',
'OCP\\DB\\Events\\AddMissingIndicesEvent' => __DIR__ . '/../../..' . '/lib/public/DB/Events/AddMissingIndicesEvent.php',
'OCP\\DB\\Events\\AddMissingPrimaryKeyEvent' => __DIR__ . '/../../..' . '/lib/public/DB/Events/AddMissingPrimaryKeyEvent.php',
@@ -1257,6 +1262,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Contacts\\ContactsMenu\\Providers\\EMailProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\LocalTimeProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\ProfileProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php',
+ 'OC\\ContextChat\\ContentManager' => __DIR__ . '/../../..' . '/lib/private/ContextChat/ContentManager.php',
'OC\\Core\\AppInfo\\Application' => __DIR__ . '/../../..' . '/core/AppInfo/Application.php',
'OC\\Core\\BackgroundJobs\\BackgroundCleanupUpdaterBackupsJob' => __DIR__ . '/../../..' . '/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php',
'OC\\Core\\BackgroundJobs\\CheckForUserCertificates' => __DIR__ . '/../../..' . '/core/BackgroundJobs/CheckForUserCertificates.php',
diff --git a/lib/private/ContextChat/ContentManager.php b/lib/private/ContextChat/ContentManager.php
new file mode 100644
index 0000000000000..3324ce6c7007e
--- /dev/null
+++ b/lib/private/ContextChat/ContentManager.php
@@ -0,0 +1,56 @@
+contentManager !== null;
+ }
+
+ public function registerContentProvider(string $appId, string $providerId, string $providerClass): void {
+ $this->contentManager?->registerContentProvider($appId, $providerId, $providerClass);
+ }
+
+ public function collectAllContentProviders(): void {
+ $this->contentManager?->collectAllContentProviders();
+ }
+
+ public function submitContent(string $appId, array $items): void {
+ $this->contentManager?->submitContent($appId, $items);
+ }
+
+ public function updateAccess(string $appId, string $providerId, string $itemId, string $op, array $userIds): void {
+ $this->contentManager?->updateAccess($appId, $providerId, $itemId, $op, $userIds);
+ }
+
+ public function updateAccessProvider(string $appId, string $providerId, string $op, array $userIds): void {
+ $this->contentManager?->updateAccessProvider($appId, $providerId, $op, $userIds);
+ }
+
+ public function updateAccessDeclarative(string $appId, string $providerId, string $itemId, array $userIds): void {
+ $this->contentManager?->updateAccessDeclarative($appId, $providerId, $itemId, $op, $userIds);
+ }
+
+ public function deleteProvider(string $appId, string $providerId): void {
+ $this->contentManager?->deleteProvider($appId, $providerId);
+ }
+
+ public function deleteContent(string $appId, string $providerId, array $itemIds): void {
+ $this->contentManager?->deleteContent($appId, $providerId, $itemIds);
+ }
+}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 4b88a446405a5..1e1ba2a1ad36d 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -277,6 +277,8 @@ public function __construct($webRoot, \OC\Config $config) {
$this->registerAlias(\OCP\Contacts\IManager::class, \OC\ContactsManager::class);
+ $this->registerAlias(\OCP\ContextChat\IContentManager::class, \OC\ContextChat\ContentManager::class);
+
$this->registerAlias(\OCP\DirectEditing\IManager::class, \OC\DirectEditing\Manager::class);
$this->registerAlias(ITemplateManager::class, TemplateManager::class);
$this->registerAlias(\OCP\Template\ITemplateManager::class, \OC\Template\TemplateManager::class);
diff --git a/lib/public/ContextChat/ContentItem.php b/lib/public/ContextChat/ContentItem.php
new file mode 100644
index 0000000000000..2b5289ba3506b
--- /dev/null
+++ b/lib/public/ContextChat/ContentItem.php
@@ -0,0 +1,57 @@
+ $providerClass
+ * @return void
+ * @since 32.0.0
+ */
+ public function registerContentProvider(string $appId, string $providerId, string $providerClass): void {
+ $this->contentManager->registerContentProvider($appId, $providerId, $providerClass);
+ }
+}
diff --git a/lib/public/ContextChat/IContentManager.php b/lib/public/ContextChat/IContentManager.php
new file mode 100644
index 0000000000000..54e4880929115
--- /dev/null
+++ b/lib/public/ContextChat/IContentManager.php
@@ -0,0 +1,115 @@
+ $providerClass
+ * @return void
+ * @since 32.0.0
+ */
+ public function registerContentProvider(string $appId, string $providerId, string $providerClass): void;
+
+ /**
+ * Emits an event to collect all content providers
+ *
+ * @return void
+ * @since 32.0.0
+ */
+ public function collectAllContentProviders(): void;
+
+ /**
+ * Providers can use this to submit content for indexing in context chat
+ *
+ * @param string $appId
+ * @param ContentItem[] $items
+ * @return void
+ * @since 32.0.0
+ */
+ public function submitContent(string $appId, array $items): void;
+
+ /**
+ * Update access for a content item for specified users.
+ * This modifies the access list for the content item,
+ * allowing or denying access to the specified users.
+ * If no user has access to the content item, it will be removed from the knowledge base.
+ *
+ * @param string $appId
+ * @param string $providerId
+ * @param string $itemId
+ * @param Type\UpdateAccessOp::* $op
+ * @param array $userIds
+ * @return void
+ * @since 32.0.0
+ */
+ public function updateAccess(string $appId, string $providerId, string $itemId, string $op, array $userIds): void;
+
+ /**
+ * Update access for content items from the given provider for specified users.
+ * If no user has access to the content item, it will be removed from the knowledge base.
+ *
+ * @param string $appId
+ * @param string $providerId
+ * @param Type\UpdateAccessOp::* $op
+ * @param array $userIds
+ * @return void
+ * @since 32.0.0
+ */
+ public function updateAccessProvider(string $appId, string $providerId, string $op, array $userIds): void;
+
+ /**
+ * Update access for a content item for specified users declaratively.
+ * This overwrites the access list for the content item,
+ * allowing only the specified users access to it.
+ *
+ * @param string $appId
+ * @param string $providerId
+ * @param string $itemId
+ * @param array $userIds
+ * @return void
+ * @since 32.0.0
+ */
+ public function updateAccessDeclarative(string $appId, string $providerId, string $itemId, array $userIds): void;
+
+ /**
+ * Delete all content items and access lists for a provider.
+ * This does not unregister the provider itself.
+ *
+ * @param string $appId
+ * @param string $providerId
+ * @return void
+ * @since 32.0.0
+ */
+ public function deleteProvider(string $appId, string $providerId): void;
+
+ /**
+ * Remove a content item from the knowledge base of context chat.
+ *
+ * @param string $appId
+ * @param string $providerId
+ * @param string[] $itemIds
+ * @return void
+ * @since 32.0.0
+ */
+ public function deleteContent(string $appId, string $providerId, array $itemIds): void;
+}
diff --git a/lib/public/ContextChat/IContentProvider.php b/lib/public/ContextChat/IContentProvider.php
new file mode 100644
index 0000000000000..b0c736e3c8855
--- /dev/null
+++ b/lib/public/ContextChat/IContentProvider.php
@@ -0,0 +1,49 @@
+
+