diff --git a/apps/web/package.json b/apps/web/package.json index 07823f0a29..75b42478c1 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -40,6 +40,7 @@ "@deepseek-ai/dsh-client-web": "workspace:^", "@deepseek-ai/dsh-cmdline": "workspace:^", "@deepseek-ai/dsh-pwsh-local": "workspace:^", + "@deepseek-ai/dsh-experimental-agent-team": "workspace:^", "@deepseek-ai/dsh-experimental-webworker-packer": "workspace:^", "@deepseek-ai/dsh-experimental-webworker-runtime": "workspace:^", "@deepseek-ai/dsh-remote-mock": "workspace:^", diff --git a/apps/web/tests/agent-team-panel.e2e.ts b/apps/web/tests/agent-team-panel.e2e.ts index 2a01f64382..3e5ad5e0c2 100644 --- a/apps/web/tests/agent-team-panel.e2e.ts +++ b/apps/web/tests/agent-team-panel.e2e.ts @@ -113,6 +113,7 @@ describe('web e2e: Agent Teams panel', () => { }, 60_000) it('keeps the panel inside the viewport and closes on outside click or Escape', async () => { + onTestFailed(() => saveFailureShot(page, 'web-e2e-agent-team-panel-keyboard')) const panel = page.getByRole('dialog', { name: 'Agent Team', exact: true }) const trigger = page.locator('[data-team-action]').getByRole('button', { name: /Agent Team/iu }) const viewport = page.viewportSize()! @@ -157,8 +158,10 @@ describe('web e2e: Agent Teams panel', () => { expect(await trigger.evaluate(element => element === document.activeElement)).toBe(true) await page.keyboard.press('Enter') await panel.waitFor() - await page.keyboard.press('Shift+Tab') + const outside = page.getByRole('button', { name: 'Settings', exact: true }) + await outside.focus() await panel.waitFor({ state: 'detached' }) + expect(await outside.evaluate(element => element === document.activeElement)).toBe(true) } finally { await page.setViewportSize(viewport) } diff --git a/packages/experimental/client-ui-agent-team/src/client/TeamAction.tsx b/packages/experimental/client-ui-agent-team/src/client/TeamAction.tsx index cec47b1b78..bce5aa56e0 100644 --- a/packages/experimental/client-ui-agent-team/src/client/TeamAction.tsx +++ b/packages/experimental/client-ui-agent-team/src/client/TeamAction.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useRef, useState } from 'react' +import { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react' import { createPortal } from 'react-dom' import type { SessionId } from '@deepseek-ai/dsh-session/types' import type { @@ -99,7 +99,7 @@ export function TeamAction({ setError(null) }, [sessionId]) - useEffect(() => { + useLayoutEffect(() => { if (open && positioned) panelRef.current?.focus() }, [open, positioned]) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae39745257..563f481c4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -675,6 +675,9 @@ importers: '@deepseek-ai/dsh-cmdline': specifier: workspace:^ version: link:../../packages/boot/cmdline + '@deepseek-ai/dsh-experimental-agent-team': + specifier: workspace:^ + version: link:../../packages/experimental/agent-team '@deepseek-ai/dsh-experimental-auto-review': specifier: workspace:^ version: link:../../packages/experimental/auto-review