feat(server): adapt gemini3.1 preview (#14583)

#### PR Dependency Tree


* **PR #14583** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added Gemini 3.1 Pro Preview support (text, image, audio) and new
GPT‑5 variants as defaults; centralized persistent telemetry state for
more reliable client identity.

* **UX**
  * Improved model submenu placement in chat preferences.
* More robust mindmap parsing, preview, regeneration and replace
behavior.

* **Chores**
  * Bumped AI SDK and related dependencies.

* **Tests**
  * Expanded/updated tests and increased timeouts for flaky flows.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2026-03-08 00:53:16 +08:00
committed by GitHub
parent 9742e9735e
commit 9c55edeb62
36 changed files with 980 additions and 375 deletions
@@ -90,17 +90,34 @@ export class EditorUtils {
return answer;
}
private static createAction(page: Page, action: () => Promise<void>) {
private static createAction(
page: Page,
action: () => Promise<void>,
options?: { responseTimeoutMs?: number }
) {
return async () => {
const responseTimeoutMs = options?.responseTimeoutMs ?? 60000;
await action();
await this.waitForAiAnswer(page);
await page.getByTestId('ai-generating').waitFor({
state: 'hidden',
timeout: 2 * 60000,
});
const responses = new Set<string>();
const answer = await this.waitForAiAnswer(page);
const responsesMenu = answer.getByTestId('answer-responses');
await responsesMenu.isVisible();
await responsesMenu.scrollIntoViewIfNeeded({ timeout: 60000 });
await responsesMenu.waitFor({
state: 'visible',
timeout: responseTimeoutMs,
});
await responsesMenu.scrollIntoViewIfNeeded({
timeout: responseTimeoutMs,
});
await responsesMenu
.getByTestId('answer-insert-below-loading')
.waitFor({ state: 'hidden' });
.waitFor({ state: 'hidden', timeout: responseTimeoutMs });
if (await responsesMenu.getByTestId('answer-insert-below').isVisible()) {
responses.add('insert-below');
@@ -458,8 +475,10 @@ export class EditorUtils {
generateOutline: this.createAction(page, () =>
page.getByTestId('action-generate-outline').click()
),
generatePresentation: this.createAction(page, () =>
page.getByTestId('action-generate-presentation').click()
generatePresentation: this.createAction(
page,
() => page.getByTestId('action-generate-presentation').click(),
{ responseTimeoutMs: 120000 }
),
imageProcessing: this.createAction(page, () =>
page.getByTestId('action-image-processing').click()
@@ -634,8 +653,10 @@ export class EditorUtils {
generateOutline: this.createAction(page, () =>
page.getByTestId('action-generate-outline').click()
),
generatePresentation: this.createAction(page, () =>
page.getByTestId('action-generate-presentation').click()
generatePresentation: this.createAction(
page,
() => page.getByTestId('action-generate-presentation').click(),
{ responseTimeoutMs: 120000 }
),
imageProcessing: this.createAction(page, () =>
page.getByTestId('action-image-processing').click()