Skip to content

Feat/2625 - #616

Merged
conradmugabe merged 26 commits into
mainfrom
feat/2625
Nov 2, 2026
Merged

conradmugabe merged 26 commits into
mainfrom
feat/2625

Conversation

@razasaddiqi

@razasaddiqi razasaddiqi commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Checklist

  • Tests were added/updated according to the feature/bugfix/change made
  • Version was rolled according to semver requirements
  • API endpoints openapi schema was updated if applicable

Changes

Description

Brings iblai/iblai-platform#2625 / #2725 to the OS: MCP connectors are now switched on and off per chat from the composer's "+" menu, and the agent settings MCP tab is the SDK's reworked one (iblai/iblai-web-frontend#2190, shipped in @iblai/iblai-js 2.58.0). The app's own copy of the connector screens is deleted; the OS keeps only the wiring.

Chat composer

  • The "+" menu gains an MCP row after Memory, rendered by the SDK's composer; the app adds the two menu labels (mcp, mcpServers) in all four locales. The row shows only when the agent uses at least one connector the organization has on. Its badge counts the connectors on for this chat, leaving out one still waiting for the person's own sign-in.
  • Each row in the panel has one switch: on or off for this chat, applied from the next message. A required connector shows a lock. A connector that needs the person's own sign-in shows off, and turning it on opens the sign-in in the same click (a short explainer the first time).
  • use-overflow-fit.ts: a composer pill whose own popover is open (Memory, MCP) keeps its last width until it closes. Re-fitting on its grown width could collapse it into "•••" and unmount the popover mid-use. Covered by two new unit tests.

Agent settings → MCP tab

  • tabs/mcp-tab/index.tsx now mounts the SDK's McpTab inside AgentSettingsProvider, passing the tenant, agent, user, enableRBAC, the Redux RBAC permissions and the free-trial gate. connector-management-content.tsx, connector-dialogs.tsx and their tests (≈29k lines) are deleted; the tab's copy comes from the SDK's catalog, so the mcpTab* and tabsMcpTab namespaces leave messages/*.json.
  • What people get from the SDK tab: Featured / Directory sub-tabs, cards with one switch plus a gear and a bin, the "Add / Configure MCP Connector" form with Allow Users to Turn Off, Authentication Scope (User / Agent / Organization) and App Credentials when automatic setup can't finish, and errors under their field.

OAuth callback page (/google-oauth-callback/)

  • A failed sign-in no longer shows raw backend text and closes the tab 3s later. The tab stays open with one plain sentence from lib/oauth-callback-failure.ts (expired or used link, refused credentials, no app credentials saved, no answer in time, or a generic one); the backend's words stay in the console.
  • The one-time code is sent once: React's double-run of the effect in development used to send it twice (useRef instead of state). Unit tests for the page and the helper.

Settings tab

  • settings-tab.tsx passes the labels the SDK 2.58.0 settings tab now renders: the Context Limits section (Chat History Messages, Chat History Tokens, Document Chunks) with tooltips, placeholders and the shared "Enter 1 or more." error, in en/es/fr/zh. The catalog-parity unit test checks the new keys.

E2E

  • Journey 25 (agent settings MCP tab) rewritten: 7 live checkpoints on a fresh agent each (card, switch on/off with the mcp tool following, Configure form, Allow Users to Turn Off round trip, OAuth scope options, Remove Connector). The old file had two test.fixmes and one || true assertion marked as covered.
  • Journey 96 (chat MCP servers), new, numbered after main's 94 and 95: 17 checkpoints covering the row and badge, per-chat switches surviving a reload and a new chat, the required lock, phone sheet, keyboard, load failure + Retry, and the non-admin (student) side with mocked servers: sign-in explainer, popup, panel staying open during a sign-in, switch back off on an abandoned window, a sign-in that completes end to end, a shared-scope server, the callback page's failure text, and a student switching a server off for this chat and then sending a message in it.
  • New page objects (chat-mcp-menu.page.ts, rewritten mcp.tab.ts) and utils/mcp-servers.ts (API create/attach/delete, sign-in mocks). Every dialog is resolved by role + exact name first and queried inside it; no fixed sleeps.
  • All 24 MCP checkpoints are marked pending until they run green on staging; coverage.json / COVERAGE.md recounted (1040 checkpoints, 969 covered, 37 pending, 103 journeys).

Docs

  • AGENTS.md gains the "UI simplicity" rules from Miguel's review (on means working, one control per decision, words or icons carried through, hide what isn't allowed, one form, ask only when the automatic way fails).

🤖 Generated with Claude Code

image image image image image image

E2E test fixes for SDK 2.59.0 (merged in from #619)

SDK 2.59.0 reads tenant and user metadata from the copy stored at login instead of calling the API, which broke several journeys on every PR. These commits change tests only (e2e/), no app code:

  • 02, 70, 72, 80 — the tenant-metadata helper reads the stored tenants / current_tenant instead of waiting for GET /api/core/orgs/<org>/metadata/, which the app no longer sends.
  • 86 — the accessibility button is turned on in the stored tenant and in the platforms-list response, which the app re-saves after load.
  • 83 wss-09 — the user's name is seeded in the stored user_metadata.
  • 78 — the Expires column moved to the 4th cell (new Mode column), and Submit starts disabled on an empty name.

Still failing, needs SDK fixes: journey 57 (saved tenant settings aren't written back to the stored copy) and, intermittently, journey 90 rlc-10 (a slower chat-history response for the previously open conversation can overwrite the linked one).

@razasaddiqi
razasaddiqi requested a review from mamigot as a code owner October 29, 2026 19:47
@razasaddiqi
razasaddiqi requested review from conradmugabe and removed request for mamigot October 29, 2026 19:49
@razasaddiqi razasaddiqi added the run-tests Trigger PR validation pipeline label Oct 29, 2026
@razasaddiqi

Copy link
Copy Markdown
Collaborator Author

/stop

@razasaddiqi razasaddiqi added run-tests Trigger PR validation pipeline and removed run-tests Trigger PR validation pipeline labels Oct 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR E2E - unknown

result unknown
central run 40945249951
commit 24393fe6

No test report was produced (result: unknown). The run did not finish a suite — usually because another PR's run took the shared environment, a newer commit/label superseded this one, or it was abandoned before completing. This says nothing about your code.

Re-trigger it yourself: comment /retest (or /retest <spec> to re-run a single file in minutes). /status shows the queue. (Avoid Re-run jobs — that replays the old merge ref instead of recomputing it against current main.)

@github-actions

Copy link
Copy Markdown
Contributor

PR E2E - FAILED

Full report, traces and screenshots

result FAILED
central run 40947370806
commit ccd9b67f
suite mentor - mode full - env stg1
tested against prod release 1.340.0 (env was synced to it first)
failed 3
new failures 3

@github-actions

Copy link
Copy Markdown
Contributor

PR E2E - FAILED

Full report, traces and screenshots

result FAILED
central run 40961417292
commit c208c91f
suite mentor - mode full - env stg1
tested against prod release 1.340.0 (env was synced to it first)
failed 63
new failures 63

conradmugabe and others added 7 commits October 30, 2026 17:28
SDK 2.59.0 resolves tenant metadata from the stored tenants list instead of
GET /api/core/orgs/<org>/metadata/, so journeys 02, 70, 72 and 80 timed out
waiting for a request that no longer fires.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRNve5cAav4H2fVHpaXfK8
The metadata GET that journey 86 rewrote is gone in SDK 2.59.0; patch
accessibility_menu in localStorage tenants and current_tenant instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRNve5cAav4H2fVHpaXfK8
The welcome heading reads user_metadata from localStorage in SDK 2.59.0, so
the metadata proxy mock alone no longer reaches it (wss-09).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRNve5cAav4H2fVHpaXfK8
… disabled Submit

The API tab gained a Mode column and disables Submit until a name is typed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRNve5cAav4H2fVHpaXfK8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRNve5cAav4H2fVHpaXfK8
@github-actions

Copy link
Copy Markdown
Contributor

❌ PR E2E failed

26 tests failed against prod 1.340.0.

Open the report: every failure has a screenshot and a trace. Comment /retest <spec> to re-run one file in minutes.

Tests What went wrong Example
6 Check failed: Error: Could not observe the tenant org-metadata GET (`/api/core/orgs/<org>/metadata/`) that the app itself fires on load via `providers/index.tsx`'s `useTenantMetadata`. This must FAIL, not skip — it is not gated by DM_URL or any per-environment setup. Underlying error: TimeoutError: page.waitForRe newly registered user goes to sidebar and clicks the help button to open docs link · screenshot · trace
1 Check failed: Error: expect(locator).toBeHidden() failed Locator: getByRole('dialog', { name: 'Configure MCP Connector', exact: true }) mcp-05: the gear opens Configure MCP Connector with the connector filled in, and turning Allow Users to Turn Off off is kept after Update · screenshot · trace
1 Check failed: Error: expect(locator).toHaveText(expected) failed Locator: getByRole('dialog').filter({ hasText: 'Edit Agent' }).getByRole('table').locator('tbody tr').filter({ has: getByRole('cell', { name: 'e2e-apikey-1793398137816-6rxzk', exact: true }) }).locator('td').nth(2) admin creates an API key with an expiration date picked via the calendar, and the row shows that exact date · screenshot · trace
1 Check failed: Error: expect(locator).toHaveText(expected) failed Locator: getByTestId('welcome-heading') wss-09: a user whose full name is "#​12345" is greeted with no name, never a # tag · screenshot · trace
1 Check failed: Error: expect(locator).toBeVisible() failed Locator: getByRole('button', { name: 'Attach file' }) chat-mcp-04: the MCP row counts the servers on for this chat and drops the count when one is switched off · screenshot · trace

Full report, traces and screenshots

812 passed · 26 failed · 4 flaky · 200 skipped

Details
  • Where it stopped: running the tests

Pipeline run, for maintainers: 41118928986

commit 77f6ff43 · suite mentor (full) on stg1 · tested against prod 1.340.0 · How to read this

@github-actions

Copy link
Copy Markdown
Contributor

❌ PR E2E failed

23 tests failed against prod 1.340.0.

Open the report: every failure has a screenshot and a trace. Comment /retest <spec> to re-run one file in minutes.

Tests What went wrong Example
1 Check failed: Error: expect(locator).toHaveText(expected) failed Locator: getByRole('dialog').filter({ hasText: 'Edit Agent' }).getByRole('table').locator('tbody tr').filter({ has: getByRole('cell', { name: 'e2e-apikey-1793416047477-a9ah0', exact: true }) }).locator('td').nth(2) admin creates an API key with an expiration date picked via the calendar, and the row shows that exact date · screenshot · trace
1 Check failed: Error: iblai: TTS audio arrived within 30s (still pending after 30s) admin hears Read Aloud on every voice source, then again on Browser · screenshot · trace
13 Check failed: Error: expect(locator).toBeVisible() failed Locator: getByRole('button', { name: 'Open Accessibility Menu' }) — also failing on os#​619, os#​620, probably not yours user clicks the accessibility button to open the menu, a drag does not open it, and a click after a drag does · screenshot · trace
6 Check failed: Error: Could not observe the tenant org-metadata GET (`/api/core/orgs/<org>/metadata/`) that the app itself fires on load via `providers/index.tsx`'s `useTenantMetadata`. This must FAIL, not skip — it is not gated by DM_URL or any per-environment setup. Underlying error: TimeoutError: page.waitForRe — also failing on os#​620, probably not yours newly registered user goes to sidebar and clicks the help button to open docs link · screenshot · trace
1 Check failed: Error: expect(locator).toHaveAttribute(expected) failed Locator: getByRole('dialog', { name: 'User Profile' }).getByRole('switch', { name: /^Chat History Export/i }) — also failing on os#​615, os#​619, os#​620, probably not yours admin opens the tenant Advanced tab and the Chat History Export switch is present, ON by default, and persists when toggled · screenshot · trace

Full report, traces and screenshots

816 passed · 23 failed · 2 flaky · 201 skipped

Details
  • Where it stopped: running the tests

Pipeline run, for maintainers: 41157099334

commit 9b529acd · suite mentor (full) on stg1 · tested against prod 1.340.0 (env synced to it first) · How to read this

conradmugabe and others added 2 commits October 31, 2026 12:37
… refresh

The app re-saves the stored tenants from /api/core/users/platforms/ after
load, wiping the seeded accessibility_menu on a tenant that has it off, so
that response is patched too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRNve5cAav4H2fVHpaXfK8
@github-actions

Copy link
Copy Markdown
Contributor

❌ PR E2E failed

1 test failed against prod 1.340.0.

Open the report: every failure has a screenshot and a trace. Comment /retest <spec> to re-run one file in minutes.

Tests What went wrong Example
1 Check failed: Error: expect(locator).toHaveAttribute(expected) failed Locator: getByRole('dialog', { name: 'User Profile' }).getByRole('switch', { name: /^Chat History Export/i }) — also failing on os#​615, os#​619, os#​620, probably not yours admin opens the tenant Advanced tab and the Chat History Export switch is present, ON by default, and persists when toggled · screenshot · trace

Full report, traces and screenshots

846 passed · 1 failed · 3 flaky · 192 skipped

Details
  • Where it stopped: running the tests

Pipeline run, for maintainers: 41223466423

commit e9ea02fb · suite mentor (full) on stg1 · tested against prod 1.340.0 (env synced to it first) · How to read this

# Conflicts:
#	e2e/COVERAGE.md
#	e2e/journeys/72-sidebar-support-link-and-help-center.spec.ts
#	e2e/journeys/78-mentor-api-tab.spec.ts
#	e2e/journeys/83-settings-welcome-screen.spec.ts
#	e2e/page-objects/accessibility-fab.page.ts
#	e2e/page-objects/edit-mentor/api-tab.ts
#	e2e/utils/tenant-metadata-observed.ts
@github-actions

Copy link
Copy Markdown
Contributor

❌ PR E2E failed

1 test failed against prod 1.340.0.

Open the report: every failure has a screenshot and a trace. Comment /retest <spec> to re-run one file in minutes.

Tests What went wrong Example
1 Check failed: Error: Report generation did not complete: neither CSV editor nor deferred-notification toast appeared within 60s — also failing on os#​615, os#​619, os#​620, probably not yours admin goes to Data Reports tab and verifies other download buttons are disabled while generating · trace

Full report, traces and screenshots

853 passed · 1 failed · 1 flaky · 187 skipped

Details
  • Where it stopped: running the tests

Pipeline run, for maintainers: 41241263855

commit 8e2214f9 · suite mentor (full) on stg1 · tested against prod 1.340.0 · How to read this

conradmugabe and others added 2 commits November 1, 2026 22:21
Picks up iblai-web-frontend#2202: chat history that arrives for a replaced
session no longer overwrites the linked conversation (journey 90 rlc-10).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRNve5cAav4H2fVHpaXfK8
@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

❌ PR E2E failed

2 tests failed against prod 1.340.0.

Open the report: every failure has a screenshot and a trace. Comment /retest <spec> to re-run one file in minutes.

Tests What went wrong Example
1 Check failed: Error: expect(locator).toHaveText(expected) failed Locator: locator('[data-testid="composer-plus-menu"][data-state="open"]').or(locator('[data-testid="composer-plus-sheet"][data-state="open"]')).getByTestId('chat-mcp-button').filter({ hasText: /^MCP/ }).getByTestId('composer-count-badge') chat-mcp-05: admin switches a server off and back on for this chat and each state survives a reload · screenshot · trace
1 Check failed: Error: iblai: TTS audio arrived within 30s (still pending after 30s) — also failing on os#​615, probably not yours admin hears Read Aloud on every voice source, then again on Browser · screenshot · trace

Full report, traces and screenshots

849 passed · 2 failed · 2 flaky · 189 skipped

Details
  • Where it stopped: running the tests

Pipeline run, for maintainers: 41354705622

commit f2f09b7a · suite mentor (full) on stg1 · tested against prod 1.340.0 (env synced to it first) · How to read this

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

❌ PR E2E failed

The backend returned an error in 2 of 3 failing tests: 502 from GET /login

Open the report: every failure has a screenshot and a trace. Comment /retest <spec> to re-run one file in minutes.

Tests What went wrong Example
2 Server error: 502 from GET /login authenticate non-admin · screenshot · trace
1 Check failed: Error: ENOENT: no such file or directory, open 'playwright/.auth/user-chrome.json' reap and assert run residue · trace

Full report, traces and screenshots

0 passed · 3 failed · 1039 skipped

Details
  • Where it stopped: running the tests

Pipeline run, for maintainers: 41369682177

commit cbb68d6f · suite mentor (full) on stg1 · tested against prod 1.340.0 · How to read this

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

❌ PR E2E failed

3 tests failed against prod 1.340.0.

Open the report: every failure has a screenshot and a trace. Comment /retest <spec> to re-run one file in minutes.

Tests What went wrong Example
1 Check failed: Error: expect(locator).toBeVisible() failed Locator: locator('#embed-harness-iframe').contentFrame().locator('.chat-user-message-query').filter({ hasText: 'Hello from the embed conversation test' }) embed conversation: sending a message renders the reply and hides the suggested-prompt rows · screenshot · trace
1 Check failed: Error: expect(locator).toBeVisible() failed Locator: locator('#embed-harness-iframe').contentFrame().locator('.chat-ai-message-response').first() embed header: hairline once chatting, New chat resets, the ? menu holds Incognito/Help/Support, and the hamburger opens the minimal sidebar · screenshot · trace
1 Check failed: Error: Report generation did not complete: neither CSV editor nor deferred-notification toast appeared within 60s — also failing on os#​615, probably not yours admin goes to Data Reports tab and verifies other download buttons are disabled while generating · trace

Full report, traces and screenshots

849 passed · 3 failed · 3 flaky · 187 skipped

Details
  • Where it stopped: running the tests

Pipeline run, for maintainers: 41371431321

commit a868bda5 · suite mentor (full) on stg1 · tested against prod 1.340.0 · How to read this

conradmugabe and others added 2 commits November 2, 2026 06:31
The embed's composer mounts before the session history arrives, and the
history replaces the whole chat when it lands, so a message sent in that
window was wiped (CI on #616: no reply after a 354 ms history response).
gotoEmbedHarness now waits for the history; logged-out visitors skip it
since they have none.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRNve5cAav4H2fVHpaXfK8
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

✅ PR E2E passed

All 850 tests passed against prod 1.340.0 (3 tests passed only on retry).

Full report, traces and screenshots

850 passed · 0 failed · 3 flaky · 189 skipped

Details
  • Where it stopped: running the tests

Pipeline run, for maintainers: 41395483978

commit d63557be · suite mentor (full) on stg1 · tested against prod 1.340.0 (env synced to it first) · How to read this

@conradmugabe
conradmugabe merged commit c6af6f7 into main Nov 2, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run-tests Trigger PR validation pipeline

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants