Skip to content

feat: Nextcloud Assistant integration#9431

Merged
Rello merged 43 commits intomasterfrom
feature/AiIntegration
Feb 17, 2026
Merged

feat: Nextcloud Assistant integration#9431
Rello merged 43 commits intomasterfrom
feature/AiIntegration

Conversation

@Rello
Copy link
Collaborator

@Rello Rello commented Feb 6, 2026

No description provided.

@Rello Rello added this to the 33.0.0 milestone Feb 6, 2026
@Rello Rello self-assigned this Feb 6, 2026
@Rello Rello moved this to 🏗️ In progress in 💻 Desktop Clients team Feb 6, 2026
@Rello
Copy link
Collaborator Author

Rello commented Feb 10, 2026

Bildschirmfoto 2026-02-10 um 14 16 49

@Rello Rello marked this pull request as ready for review February 17, 2026 08:29
Copy link
Member

@nilsding nilsding left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some comments -- the Talk cleanup and potential refactoring can be done in a follow-up PR.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this change seems unrelated to this PR

trayWindowHeader.currentAccountHeaderButton.accountMenu.close();
trayWindowHeader.appsMenu.close();
trayWindowHeader.openLocalFolderButton.closeMenu()
UserModel.refreshSyncErrorUsers()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is missing in the updated version

|| trayWindowUnifiedSearchInputContainer.activateSearchFocus

anchors.fill: parent
anchors.margins: Style.trayWindowBorderWidth
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is missing in the updated version, not sure if it was intentional that this got removed


bool User::isFeaturedAppEnabled() const
{
return isNcAssistantEnabled() || serverHasTalk();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so the Talk button is no more, even if assistant is disabled?

in that case we should clean up references to that as well (remove talk-app.svg and other methods in here since they're no longer used)

Comment on lines 336 to 338
anchors.top: trayWindowSyncWarning.visible
? trayWindowSyncWarning.bottom
: trayWindowHeader.bottom
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is missing in the updated version

Comment on lines 364 to 671
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would rather move these to a separate component outside of MainWindow for better maintainability where possible

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

100% agree. Good next step

Comment on lines +119 to +136
const auto textValue = nestedObject.value("text"_L1);
if (textValue.isString()) {
return textValue.toString();
}
const auto answerValue = nestedObject.value("answer"_L1);
if (answerValue.isString()) {
return answerValue.toString();
}
}

const auto textValue = outputObject.value("text"_L1);
if (textValue.isString()) {
return textValue.toString();
}
const auto answerValue = outputObject.value("answer"_L1);
if (answerValue.isString()) {
return answerValue.toString();
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const auto textValue = nestedObject.value("text"_L1);
if (textValue.isString()) {
return textValue.toString();
}
const auto answerValue = nestedObject.value("answer"_L1);
if (answerValue.isString()) {
return answerValue.toString();
}
}
const auto textValue = outputObject.value("text"_L1);
if (textValue.isString()) {
return textValue.toString();
}
const auto answerValue = outputObject.value("answer"_L1);
if (answerValue.isString()) {
return answerValue.toString();
}
if (const auto textValue = nestedObject.value("text"_L1); textValue.isString()) {
return textValue.toString();
}
if (const auto answerValue = nestedObject.value("answer"_L1); answerValue.isString()) {
return answerValue.toString();
}
}
if (const auto textValue = outputObject.value("text"_L1); textValue.isString()) {
return textValue.toString();
}
if (const auto answerValue = outputObject.value("answer"_L1); answerValue.isString()) {
return answerValue.toString();
}

Comment on lines +140 to +141
Q_INVOKABLE void submitAssistantQuestion(const QString &question);
Q_INVOKABLE void clearAssistantResponse();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These could be moved to public slots:, that way there's no need for Q_INVOKABLE

Rello and others added 15 commits February 17, 2026 13:08
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
known issue is that we forget to wait long enough for the reply

we also probably would fail to handle more than one request in parallel

so we should prevent submitting more than one at a time

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
delete completed tasks being success or error should not matter

in case of error assistant reply is empty

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Removed the check for NcAssistant feature and its associated URL opening.

Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Rello and others added 21 commits February 17, 2026 13:12
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Tamás Bari <adaorcpp@gmail.com>
Signed-off-by: Tamás Bari <adaorcpp@gmail.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Tamás Bari <adaorcpp@gmail.com>
Signed-off-by: Tamás Bari <adaorcpp@gmail.com>
Signed-off-by: Tamás Bari <adaorcpp@gmail.com>
Signed-off-by: Tamás Bari <adaorcpp@gmail.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Rello <Rello@users.noreply.github.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
otherwise the window would be empty

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
@nilsding nilsding force-pushed the feature/AiIntegration branch from 1249397 to 39ebd52 Compare February 17, 2026 12:47
@nilsding
Copy link
Member

rebased on master (with the help of git rebase --strategy-option renormalize + git mergetool), now the diff for MainWindow.qml is a lot easier to review -- even some missed changes from merge conflict resolutions are back again.

noticed some minor bugs with the assistant view regarding the sync-error-display and unified-search

@github-actions
Copy link

Artifact containing the AppImage: nextcloud-appimage-pr-9431.zip

Digest: sha256:2400535470aa09383d30a16ad8e1e05c66ba76b807ba6612400e313f12c0829e

To test this change/fix you can download the above artifact file, unzip it, and run it.

Please make sure to quit your existing Nextcloud app and backup your data.

@sonarqubecloud
Copy link

Quality Gate Failed Quality Gate failed

Failed conditions
1 Security Hotspot
2.1% Coverage on New Code (required ≥ 80%)
5.2% Duplication on New Code (required ≤ 3%)
68 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

Copy link
Member

@nilsding nilsding left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fine for now, let's do further cleanup/refactorings in followup-PRs to avoid this PR from growing too large

@Rello Rello merged commit 2b7b422 into master Feb 17, 2026
22 of 24 checks passed
@Rello Rello deleted the feature/AiIntegration branch February 17, 2026 14:58
@github-project-automation github-project-automation bot moved this from 🏗️ In progress to ☑️ Done in 💻 Desktop Clients team Feb 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: ☑️ Done

Development

Successfully merging this pull request may close these issues.

4 participants

Comments