LibreChat/.github/workflows
Danny Avila e1ac7d2bda
ci: Settle the E2E Reply Before the Double-Click Quote (#14840)
* test(e2e): grant MULTI_CONVO.USE in the mock e2e config

`agent-skills-added.spec.ts` drives the composer's `+` command, which opens the
added-model popover. That path is gated on MULTI_CONVO.USE:

    if (!hasMultiConvoAccess || !plusCommandEnabled || isAssistantsEndpoint(endpoint)) return;

The mock config never sets `interface.multiConvo`, so the permission falls
through to the seeded role default and `handlePlusCommand` returns before
opening the popover. The spec then fails on a popover that is absent from the
DOM entirely, which reads as a selector or timing problem rather than a missing
permission.

Set it explicitly, the same way `contextCost` is set just above for the usage
gauge — the mock config's job is to make each exercised feature's gate explicit
rather than inherit a default.

* test(e2e): wait for the reply to settle before the double-click quote

`quotes.spec.ts` › 'summons the popup from a native double-click word
selection' double-clicks a word as soon as `mockReply` becomes visible. But
`sendMessage` resolves on the stream *response*, not on the final render, so the
reply can still be re-rendering.

A streaming markdown re-render swaps out the text node the selection points at,
which collapses the selection — the same mechanism the sibling
`selectionchange` test documents deliberately. A double-click landing mid-stream
therefore loses its selection before the popup can be clicked, and because the
whole gesture is wrapped in `toPass`, every retry re-runs into the same
still-streaming reply rather than recovering from a one-off.

This is a different race from the one #14777 fixed. That one is the *selection*
still settling (touch long-press, native handle drags, block-granularity
gestures) and is handled inside QuoteButton. This one is the *reply* still
streaming, which no amount of component-side settling can absorb.

Observed on a downstream fork running this suite on slower hardware: the test
fails all three attempts, deterministically on the in-memory stream store while
the Redis lane passes the same shard — the in-memory store's final re-renders
land late enough to outlive the gesture. Four separate runs, same split.

Wait for the reply text to hold steady before selecting.

* ci(e2e): install ffmpeg so first-retry video actually records (#14841)

`playwright.config.mock.ts` sets `video: 'on-first-retry'`, but the runner only
installs `install-deps chrome`, which does not include ffmpeg. Without it the
first retry fails inside `browserContext.newPage` while setting up video
recording — before the test body runs.

The cost is the retry itself: a genuinely flaky test loses the attempt that
would have recovered it, and the reported failure is a video-setup error rather
than the original symptom.

Bounded and non-fatal on purpose. The CLI has been observed hanging after the
download completes on these runners, so the step is wrapped in `timeout` and
its failure is swallowed — if ffmpeg cannot be installed the job proceeds
exactly as it does today, and no lane is blocked on it.

Applied to both jobs that run Playwright (`e2e_shards` and
`mcp_tool_list_changed`), since both configure retries.
2026-08-15 10:48:11 -04:00
..
a11y.yml 🚦 ci: Reduce GitHub Actions Runner Pressure (#14716) 2026-08-09 07:41:00 -04:00
agents-integration-tests.yml 🧩 ci: Close Workflow Path-Filter Gaps (#14728) 2026-08-10 17:26:50 -04:00
backend-review.yml 🧩 ci: Close Workflow Path-Filter Gaps (#14728) 2026-08-10 17:26:50 -04:00
build.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
cache-integration-tests.yml 🧩 ci: Close Workflow Path-Filter Gaps (#14728) 2026-08-10 17:26:50 -04:00
client.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
data-provider.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
data-schemas.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
deploy.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
dev-branch-images.yml 🧩 ci: Close Workflow Path-Filter Gaps (#14728) 2026-08-10 17:26:50 -04:00
dev-images.yml 🧩 ci: Close Workflow Path-Filter Gaps (#14728) 2026-08-10 17:26:50 -04:00
dev-staging-images.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
docker-smoke.yml 🧩 ci: Close Workflow Path-Filter Gaps (#14728) 2026-08-10 17:26:50 -04:00
frontend-review.yml 🧩 ci: Close Workflow Path-Filter Gaps (#14728) 2026-08-10 17:26:50 -04:00
frontend-windows-nightly.yml 🧩 ci: Close Workflow Path-Filter Gaps (#14728) 2026-08-10 17:26:50 -04:00
gitnexus-cleanup-pr.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
gitnexus-deploy.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
gitnexus-index.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
gitnexus-pr-command.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
helmcharts.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
langfuse-fanout.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
locize-i18n-sync.yml 🌍 ci: Harden Locize Translation Sync (#14784) 2026-08-13 07:29:29 -04:00
main-image-workflow.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00
playwright-bombadil.yml 👷 ci: Stop Optional Playwright Fonts From Failing E2E (#14852) 2026-08-14 20:35:37 -04:00
playwright-mock.yml ci: Settle the E2E Reply Before the Double-Click Quote (#14840) 2026-08-15 10:48:11 -04:00
retry-docker-builds.yml 🧱 ci: Retry Failed Docker Builds (#13935) 2026-06-24 10:09:36 -04:00
static-checks.yml 🛻 ci: Move the ESLint Config Sweep Into Its Own Job (#14742) 2026-08-11 08:26:42 -04:00
sync-helm-chart-tags.yml 🧾 ci: Skip Workflows for Markdown-Only Changes (#14378) 2026-07-21 20:35:59 -04:00
tag-images.yml ⚙️ ci: Bump GitHub Actions to Node.js 24 Runtimes (#14689) 2026-08-07 11:25:29 -04:00