Skip to content

feat(frontend): Switch, rename, and archive playground sessions from the keyboard - #6005

Merged
mmabrouk merged 6 commits into
release/v0.112.1from
feat/age-4109-session-keyboard-shortcuts
Aug 13, 2026
Merged

feat(frontend): Switch, rename, and archive playground sessions from the keyboard#6005
mmabrouk merged 6 commits into
release/v0.112.1from
feat/age-4109-session-keyboard-shortcuts

Conversation

@ashrafchowdury

@ashrafchowdury ashrafchowdury commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Context

Working across several open playground sessions means reaching for the mouse every time. Switching is a click on a chip or a rail row. Renaming, archiving, creating and closing all need a hover button or a right-click menu, and stopping a run or answering a tool approval needs a click too. Issue #5981 asks for keyboard equivalents that behave the same on macOS, Windows, and Linux.

The one-hand rule

Every binding has to be reachable with the left hand alone, resting on Alt/Option, without the hand leaving the bottom-left of the keyboard. Thumb on the modifier, finger on the key. Nothing on the right half, nothing that needs a second hand, nothing that needs you to look down.

That constraint did most of the design work. It ruled out arrow keys, [ and ], and , and . for prev/next, all of which sit on the right while the modifier sits on the left. What survives is the digit row and the left letter block: Q W E T, S D F G, Z X C V B.

The shortcuts

Keys (macOS) Keys (Win/Linux) Action Why this key
⌥1⌥9 Alt+1Alt+9 Jump to the Nth open session The universal "go to item N" pattern (browser tabs, Slack, VS Code). The digit row is the one place a number key is unambiguous.
⌥Z / ⌥X Alt+Z / Alt+X Previous / next session, wrapping Not a global convention. Chosen for the hand: Z and X sit directly above Alt/Option, so stepping repeatedly costs no movement. Left key goes back, right key goes forward.
⌥C Alt+C New session The convention here is ⌘T/⌘N, both of which break the one-hand rule (and ⌥N is a dead key on macOS, see below). C keeps the hand in the same cluster as the step keys.
⌥W Alt+W Close the active session ⌘W/Ctrl+W is the near-universal close-tab binding, so the letter transfers directly. Refuses to close the last remaining session.
⌥R Alt+R Rename the active session Mnemonic. Opens the same inline editor a double-click already opens.
⌥A Alt+A Archive the active session Mnemonic, and adjacent to the rest of the set on the home row.
⌥F Alt+F Toggle the session list, caret in the search box "Find". ⌘K is the industry-standard search binding but Chrome owns it for the address bar, so it was unavailable.
⌥B Alt+B Toggle the config panel ⌘B is the sidebar toggle in VS Code and many editors, so the letter carries over.
Esc Esc Stop the running response Universal, no modifier, and the key people already press by reflex to cancel.
⌥G Alt+G Approve the pending tool call No convention exists for this. G for "go", on the left home row. Approves one gate only, never "Approve all".

After any switch the caret lands in the destination session's composer, so you can keep typing.

Why Alt, and why physical keys

Why Alt. Every browser reserves ⌘/Ctrl+1-9 for its own tab switching, so that family was unavailable for the positional jumps, and splitting the set across two modifiers would have been worse. Alt (Option on macOS) is free on all three platforms, which gives one binding everywhere instead of a per-OS table. This also matches how the rest of the codebase binds shortcuts: the key is the same on every platform and only the printed label changes.

Why physical keys. The matcher reads event.code, not event.key. On macOS, Option+1 produces ¡ and Option+R produces ®, so matching characters would break on exactly the platform the hints are written for. Reading positions also keeps the one-handed reach identical on AZERTY and other non-QWERTY layouts, where the letters move but the physical keys do not.

Two macOS traps that shaped the choices. ⌥N is a dead key (it types ñ on the next vowel), which is why new session is not ⌥N despite being the obvious pick. ⌥E, ⌥U and ⌥I are dead keys too, and are avoided for the same reason. Every other Option combo here merely shadows a symbol nobody types in a chat composer: ⌥C is ç, ⌥F is ƒ, ⌥G is ©.

Typing is never swallowed. Ctrl+Alt is excluded from every binding, because that is what AltGr reports on European layouts. AltGr+3 still types ³ and AltGr+E still types . The shortcuts do fire while the composer has focus, which is the point of a modifier combo here, and they stay quiet while a modal or confirm dialog is open. Esc is the only unmodified binding, and it acts only while a run is in flight.

How it is wired

The verbs the panel cannot perform itself travel as requests on scope-tagged atoms, the same shape pendingSessionOpen already uses:

{scope: "drawer:abc" | "<appId>", sessionId: "…", nonce: 1734}

The composer's input handle lives in AgentConversation and the tab label's edit mode is local state inside each row, so neither is reachable from where the keypress is heard. The scope field matters because the revision drawer mounts a second AgentChatPanel over the playground's; consumers match on both fields, so a drawer request cannot reach a playground pane. For the same reason exactly one panel holds the listener: the drawer's while it is open, the playground's the rest of the time.

Stop and approve are the exception. They live with AgentConversation, because only it knows whether a run is in flight and what it is waiting on. Esc binds on the bubble phase so an open picker, dialog, or the inline rename editor answers it first.

Archive reuses useSessionActions().setArchived, the same path the sidebar and the sessions page call, so the local tab cache and the server stay in step.

Tests

  • pnpm lint-fix clean, type check clean, and the slice suite passes.
  • 21 cases in useSessionShortcuts.test.ts: every binding, both wrap edges, a stale active id, single-session and empty-list guards, and the refusal to close the last session.
  • The negative cases are deliberate. Ctrl+Alt, Alt+Shift and Alt+Cmd must not match, or European layouts lose characters.

What to QA

  • Open three sessions in an agent playground. ⌥X and ⌥Z step through them in tab order and wrap at the ends, and the caret is in the composer each time.
  • ⌥2 on a tab you have never opened. It still lands focused (antd mounts that pane lazily, so this is the case most likely to break).
  • ⌥C opens a session, ⌥W closes it. ⌥W on the last remaining session does nothing.
  • ⌥R opens the inline rename on the active chip. Enter commits, Escape reverts. ⌥A archives and the next tab takes over.
  • ⌥F opens the session list with the caret in the search box, and ⌥F again puts it away. ⌥B toggles the config panel both ways.
  • Send a long message, then press Esc mid-stream. The run stops. Press Esc with no run in flight and nothing happens.
  • Trigger a tool that needs approval, then press ⌥G. One gate is approved. If the turn requested several, the others still wait.
  • Open the rename confirm from a chip's right-click menu, then press ⌥2 while it is up. Nothing happens.
  • Open the workflow revision drawer over the playground. The shortcuts drive the drawer's sessions, not the ones behind it.
  • Regression, European layout on Windows or Linux: AltGr+3 and AltGr+E still type ³ and in the composer.
  • Regression, Firefox on Windows: Alt+1 does not drop the menu bar and does not switch a browser tab.

Notes for the reviewer

  • There are no visible shortcut hints beyond the two that already existed (the ⌥R/⌥A suffixes in the right-click menu and the pencil tooltip). That was a deliberate call to keep the tab strip clean.
  • The "is a dialog open" guard is a DOM probe (.ant-modal-wrap:not([style*="display: none"])). There is no global dialog state to ask, and these dialogs come from antd's modal.confirm. It is worth one look in a browser against antd v6, because a false positive would silently disable the shortcuts after the first modal close.
  • useAltKey resolves its label in a mount effect, which is what platform.ts documents. Its older twin useModifierKey resolves during render. Aligning them touches three existing consumers, so it is left for a separate change.
  • Decline has no binding. ⌥D is free next to ⌥G if we want the pair, though a keyboard decline is much safer than a keyboard approve.

Closes #5981

…sessions

Alt+1..9 switches to the Nth open session and puts the caret in its composer,
Alt+R opens the inline rename on the active session, Alt+A archives it.

One binding for every OS. Matched on `event.code`, since macOS reports Option+1
as a glyph, and Ctrl+Alt is excluded so European AltGr keeps typing. Cmd/Ctrl+digit
is left alone - every browser reserves it for tab switching.

The switch and rename verbs live inside per-session components, so the panel asks
for them through scope-tagged request atoms, mirroring pendingSessionOpen. The
listener sits in a null-rendering SessionShortcuts so its subscriptions cannot
re-render every conversation pane, and only one of the two live panels owns it
(the drawer while open, the playground otherwise).
Alt+Z and Alt+X move to the previous/next open session, wrapping at both ends,
so switching no longer needs the digit row or a target position in mind.

Z and X sit directly above Alt/Option: thumb on the modifier, index finger on the
key, hand never leaves the bottom-left corner. Bound by physical position
(event.code) like the rest, so the reach is the same on a non-QWERTY layout.

Stepping reuses the jump path, so the caret still lands in the destination
session's composer. Key repeat stays blocked - holding the key would tear through
sessions and mount a conversation pane for each.
@linear-code

linear-code Bot commented Aug 13, 2026

Copy link
Copy Markdown

AGE-4109

@vercel

vercel Bot commented Aug 13, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agenta-documentation Error Error Aug 13, 2026 1:49pm

Request Review

@coderabbitai

coderabbitai Bot commented Aug 13, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Added keyboard shortcuts for switching, creating, closing, renaming, archiving, searching, and configuring sessions.
    • Added direct session selection and wraparound navigation.
    • Added inline renaming, keyboard-driven search and composer focus, and platform-specific shortcut hints.
    • Added Escape to stop active runs and Alt/Option+G to approve pending approvals.
  • Bug Fixes

    • Prevented shortcuts from triggering during overlays, text entry, onboarding, repeated keypresses, or inactive panels.
  • Tests

    • Added coverage for shortcuts, focus handling, rename requests, and scope isolation.

Walkthrough

The PR adds cross-platform session keyboard shortcuts, scoped UI request atoms, composer focus handling, inline rename routing, search focus handling, and shortcut metadata for session surfaces.

Changes

Session shortcut workflow

Layer / File(s) Summary
Shortcut and request contracts
web/oss/src/components/AgentChatSlice/hooks/useSessionShortcuts.ts, web/oss/src/components/AgentChatSlice/state/uiRequests.ts, web/oss/src/components/AgentChatSlice/state/scope.tsx, web/packages/agenta-shared/src/hooks/*, web/packages/agenta-shared/src/utils/*
Adds shortcut parameters, Alt-key detection, drawer-scope detection, session UI request atoms, and platform-specific Alt labels.
Scoped shortcut dispatch
web/oss/src/components/AgentChatSlice/hooks/useSessionShortcuts.ts, web/oss/src/components/AgentChatSlice/AgentChatPanel.tsx
Handles session selection, stepping, creation, closing, rename, archive, search, and configuration-panel shortcuts within the active drawer scope.
Focus and rename request routing
web/oss/src/components/AgentChatSlice/AgentConversation.tsx, web/oss/src/components/AgentChatSlice/components/SessionRail.tsx, web/oss/src/components/AgentChatSlice/hooks/useInlineRenameRequest.ts
Consumes matching requests for composer focus, inline rename, and session-search focus. Nonces prevent duplicate request handling.
Shortcut presentation and validation
web/oss/src/components/AgentChatSlice/components/SessionTagBar.tsx, web/oss/src/components/AgentChatSlice/components/SessionTabLabel.tsx, web/oss/src/components/AgentChatSlice/hooks/useSessionActions.tsx, web/oss/src/components/AgentChatSlice/hooks/useSessionShortcuts.test.ts
Adds platform-specific shortcut hints, native label tooltips, action-menu shortcuts, and tests for filtering, navigation, action handling, scope isolation, and request routing.

Estimated code review effort: 4 (Complex) | ~45 minutes

Mergeability Score: 🟡 Moderate · up to d9b20

The PR adds keyboard controls for playground sessions, but the Alt+F search binding conflicts with browser or OS menu behavior on Windows and Linux, so search may not work reliably there; this needs owner follow-up before merge.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant useSessionShortcuts
  participant AgentChatPanel
  participant UIRequestAtoms
  participant AgentConversation
  User->>useSessionShortcuts: Press an accepted Alt shortcut
  useSessionShortcuts->>AgentChatPanel: Invoke the mapped session action
  AgentChatPanel->>UIRequestAtoms: Publish a scoped focus or rename request
  UIRequestAtoms->>AgentConversation: Deliver the matching composer-focus request
  AgentConversation->>AgentConversation: Consume the nonce and focus the composer
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The implementation meets the linked issue objectives except it intentionally allows shortcuts while the composer has focus, contrary to the editable-control requirement [#5981]. Prevent session shortcuts while focus is in editable controls, or update issue #5981 to explicitly allow modifier shortcuts in the composer.
✅ Passed checks (4 passed)
Check name Status Explanation
Out of Scope Changes check ✅ Passed The additional shortcuts and scope-aware UI handling remain related to keyboard-based playground session management.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 60.00%.
Title check ✅ Passed The title clearly summarizes the main change: keyboard-based switching, renaming, and archiving for playground sessions.
Description check ✅ Passed The description directly explains the keyboard shortcuts, cross-platform behavior, scope handling, implementation, tests, and QA plan.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/age-4109-session-keyboard-shortcuts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…needs

The first pass added structure the feature did not ask for. This removes it.

- SessionShortcuts, a null-rendering component, existed to avoid a re-render that
  was never measured. The hook now sits in the panel.
- useComposerFocusRequest was a 12-line effect extracted only to be testable. It
  is back inline in AgentConversation, keeping the nonce-in-the-frame ordering
  that StrictMode requires.
- ownsSessionShortcuts was a one-line boolean with its own test file, and
  shortcutPosition bounds-checked a constant that will not change. Both inlined.
- Four test files collapse into one, and a test for a one-line platform ternary
  goes away.

21 files to 15, and roughly 590 lines removed against 330 added. Behaviour is
unchanged: same bindings, same focus handling, same single-owner rule.
Closes the gaps a keyboard user hits most: creating and closing sessions, finding
one in a long list, stopping a run, and answering a tool approval.

  Alt+C  new session          Alt+F  toggle the session list, caret in search
  Alt+W  close active session Alt+B  toggle the config panel
  Esc    stop the running response
  Alt+G  approve the pending tool call

Stop and approve live with the conversation rather than the panel hook, because
only it knows whether a run is in flight and what it waits on. Escape binds on the
bubble phase so an open picker or dialog answers it first, and Alt+G approves a
single gate, never the dock's "Approve all" - a mis-press must not grant a tool
the user never read.

Alt+W refuses to close the last session, and Alt+C respects the onboarding lock.
@ashrafchowdury
ashrafchowdury changed the base branch from main to release/v0.112.1 August 13, 2026 12:23
@ashrafchowdury
ashrafchowdury marked this pull request as ready for review August 13, 2026 12:24
@dosubot dosubot Bot added size:L This PR changes 100-499 lines, ignoring generated files. enhancement New feature or request frontend tests labels Aug 13, 2026
@ashrafchowdury

Copy link
Copy Markdown
Contributor Author

@mmabrouk Let me know if you have any suggestions

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🔇 Additional comments (12)
web/oss/src/components/AgentChatSlice/state/scope.tsx (1)

42-43: LGTM!

web/packages/agenta-shared/src/utils/platform.ts (1)

19-21: LGTM!

web/packages/agenta-shared/src/utils/index.ts (1)

16-16: LGTM!

web/oss/src/components/AgentChatSlice/AgentChatPanel.tsx (1)

210-215: 🗄️ Data Integrity & Integration

⚠️ Unverified finding
Sandbox verification was unavailable.

Verify the archive identifier for drawer sessions.

Line 213 passes scope as appId. A drawer scope has the form drawer:${entityId}. Confirm that setArchived accepts this scope key. If the archive request requires the raw application ID, pass entityId instead.

web/oss/src/components/AgentChatSlice/hooks/useSessionShortcuts.test.ts (1)

72-278: LGTM!

web/packages/agenta-shared/src/hooks/useAltKey.ts (1)

1-10: LGTM!

web/packages/agenta-shared/src/hooks/index.ts (1)

12-12: LGTM!

web/oss/src/components/AgentChatSlice/hooks/useInlineRenameRequest.ts (1)

1-34: LGTM!

web/oss/src/components/AgentChatSlice/components/SessionRail.tsx (1)

1-1: LGTM!

Also applies to: 12-18, 37-37, 83-83, 340-340

web/oss/src/components/AgentChatSlice/components/SessionTagBar.tsx (1)

3-3: LGTM!

Also applies to: 12-14, 139-163, 265-268, 393-403, 589-589

web/oss/src/components/AgentChatSlice/components/SessionTabLabel.tsx (1)

22-32: LGTM!

Also applies to: 86-86

web/oss/src/components/AgentChatSlice/hooks/useSessionActions.tsx (1)

11-11: LGTM!


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: d5ebb82e-bd83-4cc9-b8b6-8ea22928597a

📥 Commits

Reviewing files that changed from the base of the PR and between 7d94ed7 and a652521.

📒 Files selected for processing (15)
  • web/oss/src/components/AgentChatSlice/AgentChatPanel.tsx
  • web/oss/src/components/AgentChatSlice/AgentConversation.tsx
  • web/oss/src/components/AgentChatSlice/components/SessionRail.tsx
  • web/oss/src/components/AgentChatSlice/components/SessionTabLabel.tsx
  • web/oss/src/components/AgentChatSlice/components/SessionTagBar.tsx
  • web/oss/src/components/AgentChatSlice/hooks/useInlineRenameRequest.ts
  • web/oss/src/components/AgentChatSlice/hooks/useSessionActions.tsx
  • web/oss/src/components/AgentChatSlice/hooks/useSessionShortcuts.test.ts
  • web/oss/src/components/AgentChatSlice/hooks/useSessionShortcuts.ts
  • web/oss/src/components/AgentChatSlice/state/scope.tsx
  • web/oss/src/components/AgentChatSlice/state/uiRequests.ts
  • web/packages/agenta-shared/src/hooks/index.ts
  • web/packages/agenta-shared/src/hooks/useAltKey.ts
  • web/packages/agenta-shared/src/utils/index.ts
  • web/packages/agenta-shared/src/utils/platform.ts

Comment thread web/oss/src/components/AgentChatSlice/AgentConversation.tsx
Comment thread web/oss/src/components/AgentChatSlice/AgentConversation.tsx
Comment thread web/oss/src/components/AgentChatSlice/components/SessionTagBar.tsx
Comment thread web/oss/src/components/AgentChatSlice/hooks/useSessionShortcuts.ts
Comment thread web/oss/src/components/AgentChatSlice/state/uiRequests.ts Outdated
@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Railway Preview Environment

Status Destroyed (PR closed)

Updated at 2026-08-13T14:23:36.016Z

@mmabrouk

Copy link
Copy Markdown
Member

This is awesome! Thanks @ashrafchowdury ! I guess follow up is to make this configurable in the user preference

@mmabrouk mmabrouk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@ashrafchowdury please address coderabbit review comments

@ashrafchowdury
ashrafchowdury changed the base branch from release/v0.112.1 to main August 13, 2026 13:35
@dosubot dosubot Bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Aug 13, 2026
@ashrafchowdury
ashrafchowdury changed the base branch from main to release/v0.112.1 August 13, 2026 13:37
@dosubot dosubot Bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Aug 13, 2026
- Keyboard approve went straight to addToolApprovalResponse, skipping the
  markLiveGate call the dock button makes. A restored pending approval could stay
  blocked by the queue resume gate. Routed through handleApprovalResponse.
- The session-search request carried only a nonce, so the drawer panel and the
  playground panel could each answer the other. It now carries its scope, like the
  focus and rename requests.
- Escape stopped a run while an IME composition was active, where it means "cancel
  composition". Guarded with isComposing.
- Shortcut hints printed "Alt1" and "AltR" off macOS. The separator now lives in
  altKeyPrefix (was altKeyLabel), so every call site gets "Alt+1" or the macOS "⌥1"
  without repeating the conditional.
@ashrafchowdury
ashrafchowdury changed the base branch from release/v0.112.1 to main August 13, 2026 13:48
@dosubot dosubot Bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Aug 13, 2026
@ashrafchowdury
ashrafchowdury changed the base branch from main to release/v0.112.1 August 13, 2026 13:49
@dosubot dosubot Bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Aug 13, 2026
@ashrafchowdury
ashrafchowdury changed the base branch from release/v0.112.1 to main August 13, 2026 13:49
@dosubot dosubot Bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Aug 13, 2026
@ashrafchowdury
ashrafchowdury force-pushed the feat/age-4109-session-keyboard-shortcuts branch from a652521 to d9b20a3 Compare August 13, 2026 13:49
@ashrafchowdury
ashrafchowdury changed the base branch from main to release/v0.112.1 August 13, 2026 13:50
@dosubot dosubot Bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Aug 13, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 1e35f144-702a-4404-819a-7e259ea93c2a

📥 Commits

Reviewing files that changed from the base of the PR and between a652521 and d9b20a3.

📒 Files selected for processing (8)
  • web/oss/src/components/AgentChatSlice/AgentChatPanel.tsx
  • web/oss/src/components/AgentChatSlice/AgentConversation.tsx
  • web/oss/src/components/AgentChatSlice/components/SessionRail.tsx
  • web/oss/src/components/AgentChatSlice/components/SessionTagBar.tsx
  • web/oss/src/components/AgentChatSlice/state/uiRequests.ts
  • web/packages/agenta-shared/src/hooks/useAltKey.ts
  • web/packages/agenta-shared/src/utils/index.ts
  • web/packages/agenta-shared/src/utils/platform.ts
🚧 Files skipped from review as they are similar to previous changes (7)
  • web/packages/agenta-shared/src/utils/index.ts
  • web/packages/agenta-shared/src/hooks/useAltKey.ts
  • web/oss/src/components/AgentChatSlice/state/uiRequests.ts
  • web/oss/src/components/AgentChatSlice/components/SessionRail.tsx
  • web/oss/src/components/AgentChatSlice/AgentConversation.tsx
  • web/oss/src/components/AgentChatSlice/components/SessionTagBar.tsx
  • web/oss/src/components/AgentChatSlice/AgentChatPanel.tsx

Comment thread web/packages/agenta-shared/src/utils/platform.ts
@mmabrouk
mmabrouk merged commit de4e3ea into release/v0.112.1 Aug 13, 2026
69 of 74 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request frontend size:L This PR changes 100-499 lines, ignoring generated files. tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] Add cross-platform keyboard shortcuts for playground sessions

2 participants