Skip to content

feat(desktop): add side conversation dock with multi-tab, quick prompts and i18n#3196

Open
taekchef wants to merge 1 commit into
iOfficeAI:mainfrom
taekchef:feat/side-conversation
Open

feat(desktop): add side conversation dock with multi-tab, quick prompts and i18n#3196
taekchef wants to merge 1 commit into
iOfficeAI:mainfrom
taekchef:feat/side-conversation

Conversation

@taekchef

@taekchef taekchef commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Description

Adds the side conversation dock: a lightweight parallel conversation panel that lets users ask follow-up questions without interrupting the main thread.

Core features

  • Multi-tab side dock: a parent conversation can own multiple side tabs; closing a tab discards only that child conversation, while collapsing only hides the panel. Tabs are restored through GET /api/conversations/{id}/side.
  • Backend fork modes: claude / opencode / vibe use agent_fork; codex, aionrs, and ACP backends without session/fork use text_snapshot; unsupported parent types do not show the side entry.
  • Quick prompts: 26 short side-thinking prompts, rotating every 30 seconds, shown as 4 chips and prefilled into the side input without auto-sending.
  • IPC and HTTP bridge: renderer/main bridge and HTTP bridge now cover side create/list lifecycle.
  • Selection to side: selected main-thread text can be sent to "Ask in side" as composer prefill.
  • /side command: opens the side dock from the main composer without recursively opening side conversations inside the side composer.
  • Theme/i18n coverage: dark mode styles and all supported locales are covered.

Dependency

Depends on backend PR: iOfficeAI/AionCore#383

This frontend PR should be reviewed after #383, because the side dock needs:

  • POST /api/conversations/{id}/side
  • GET /api/conversations/{id}/side
  • fork_mode in the create response

i18n

Updated all 9 supported locales from i18n-config.json:

zh-CN, en-US, ja-JP, zh-TW, ko-KR, tr-TR, ru-RU, uk-UA, pt-BR

New key range: conversation.sideConversation.*, including all quick prompt labels.

Testing

  • bun run lint -- --quiet
  • bun run format:check
  • bunx tsc --noEmit
  • bun run i18n:types
  • node scripts/check-i18n.js
  • bun run test - 1127 passed, 3 skipped
  • bun run test:coverage - 1127 passed, 3 skipped
  • AIONUI_BACKEND_BIN=/private/tmp/AionCore-pr383/target/debug/aioncore AIONUI_DATA_DIR=/private/tmp/aionui-policy-db.kdsq8G VERIFY_PORT=25999 node scripts/verify-side-fork-policy.mjs

Coverage highlights for the new side-conversation logic:

File Line coverage Branch coverage Function coverage
buildCreateSideConversationParams.ts 100.0% 68.2% 100.0%
resolveParentForkMsgId.ts 100.0% 66.7% 100.0%
sideConversation.ts 100.0% 100.0% 100.0%
sideConversationState.ts 100.0% 50.0% 100.0%
useSideConversation.ts 93.2% 69.5% 92.7%
ChatConversation.tsx 53.3% 60.6% 35.5%
SelectionReplyButton.tsx 78.3% 45.9% 84.6%
SideConversationDock.tsx 88.9% 100.0% 75.0%
SideConversationHeader.tsx 100.0% 100.0% 100.0%
SideConversationTabBar.tsx 100.0% 100.0% 100.0%
SideQuickPrompts.tsx 100.0% - 100.0%
renderPlatformChat.tsx 100.0% 92.3% 100.0%
Local diff+lcov patch estimate 78.22% - -

Side-fork policy verification:

  • codex -> text_snapshot
  • aionrs -> text_snapshot
  • claude -> agent_fork
  • openclaw skipped locally because the copied dev DB had no OpenClaw parent conversation

Screenshots

Main thread + side dock

AionUi side conversation overview

Side dock detail

AionUi side conversation dock detail

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 89ba75ece8

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +334 to +336
if (side.tabs.length > 0) {
void side.openNewTab();
return;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Avoid creating a new tab when reopening the side dock

When a parent already has side tabs, the main composer side button/shortcut and bare /side command call this onOpenSide path with no question, but this branch always calls openNewTab(). In the collapsed/hidden-panel case this creates an extra empty side conversation and issues another POST /side instead of simply showing the existing active tab; side.open() already focuses existing tabs and only creates when none exist.

Useful? React with 👍 / 👎.

@taekchef taekchef force-pushed the feat/side-conversation branch 4 times, most recently from 6ac55b1 to ca1ee64 Compare June 8, 2026 15:24
@taekchef taekchef force-pushed the feat/side-conversation branch from ca1ee64 to 740f3f1 Compare June 11, 2026 02:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant