Title: Add an expand / collapse (maximize) toggle to the chat composer by DragonnZhang · Pull Request #49 · modelstudioai/openwork · GitHub
Open Graph Title: Add an expand / collapse (maximize) toggle to the chat composer by DragonnZhang · Pull Request #49 · modelstudioai/openwork
X Title: Add an expand / collapse (maximize) toggle to the chat composer by DragonnZhang · Pull Request #49 · modelstudioai/openwork
Description: Closes #48 What & why OpenWork's chat composer (FreeFormInput) auto-grows as you type, but only up to a fixed cap — min(66% of window height, 540px). There was no way to deliberately give the input a large editing area, so drafting or editing a long prompt meant writing and scrolling inside a small box even with a tall window. Comparable desktop chat surfaces (Claude's desktop app, ChatGPT desktop, Codex desktop) all offer a maximize / expand affordance on the composer. OpenWork's toolbar already has a model picker, a thinking-level picker, a context-usage indicator and an attach control, but no expand toggle — this adds one. This adds a small expand / collapse toggle to the composer's right-side controls, next to the thinking-level and model pickers and following the same !compactMode rule: A Maximize2 icon when collapsed / Minimize2 when expanded, with a tooltip ("Expand composer" / "Collapse composer") and aria-pressed reflecting state. Clicking it maximizes the input to max(78% of window height, 560px) — applied as both minHeight and maxHeight on the editable area so the box is genuinely large even when empty — recomputed on window resize alongside the existing cap. Clicking again collapses back to the normal auto-grow cap. The maximized state resets on session switch, so a new conversation starts compact. Frontend-only. It only toggles renderer layout state (isComposerExpanded) and the inline height style already applied to RichTextInput. No backend / qwen-code change. Two new i18n keys (chat.expandComposer, chat.collapseComposer) added to all locales for the tooltip. Changes components/app-shell/input/FreeFormInput.tsx — isComposerExpanded state, expandedMaxHeight computed in the existing resize effect, a reset-on-session effect, the toolbar toggle button, and the conditional input height. packages/shared/src/i18n/locales/*.json — chat.expandComposer / chat.collapseComposer in all 7 locales, inserted in sorted position. e2e/assertions/composer-expand.assert.ts — new CDP assertion (below). Verification (DoD) bun run typecheck:all — introduces no new errors. Delta vs main is zero: the only errors are the 11 pre-existing ones in apps/electron (auto-update.ts owner/repo, a settings-default-thinking test tuple, two test files importing vitest) — none in the files this PR touches. bun test — the set of failing tests is byte-for-byte identical to main (verified by diffing the sorted, timing-stripped failure lists from a clean-main run and this branch: 56 pre-existing failures, e.g. BrowserCDP, BrowserPaneManager, RPC registration profiles, RoutedClient, startWebuiHttpServer, resource-bundle, and the i18n sorted checks whose first out-of-order key is menu.homepage — far from the chat.* keys added here). This change adds zero new failures. (The raw N fail total is order-dependent/flaky when the whole suite runs unisolated, which is why the repo splits *.isolated.ts; the deterministic signal is the failing-test set, which is unchanged.) bun run lint:i18n:parity — OK (6 locales, 1544 keys each). The two new keys are added to every locale in sorted position. Renderer build (bun run electron:build:renderer, where this change lives) — ✅ builds cleanly. CDP assertion transpiles (bun build e2e/assertions/composer-expand.assert.ts) — ✅. CDP e2e assertion (composer-expand.assert.ts) Drives the real built app over CDP entirely in the draft (no-session) state — no seeded conversation needed: The composer renders the expand toggle, initially aria-pressed="false". Measures the input area's height (collapsed). Clicks the toggle → asserts the input height grows to >= 2× the collapsed height and the toggle flips to aria-pressed="true". Clicks again → asserts the input height collapses back to roughly its start height and the toggle returns to aria-pressed="false". The height measurements prove the toggle actually resizes the composer, not merely swaps an icon. ⚠️ Local CDP run was blocked by this sandbox's egress policy, not by the feature. electron:build:main cannot resolve the libsignal GitHub dependency (pulled in transitively by the WhatsApp/Baileys worker), and the Electron binary download 403s from the egress proxy, so the app can't be built or launched here (xvfb is present; only those network fetches fail). The assertion transpiles and is included so CI / a reviewer can run bun run e2e in an environment with normal network access. Everything that doesn't require launching Electron (typecheck, unit tests, i18n parity, renderer build) passes with zero delta vs main. Part of the autonomous desktop-feature loop (loop-bot). Generated by Claude Code
Open Graph Description: Closes #48 What & why OpenWork's chat composer (FreeFormInput) auto-grows as you type, but only up to a fixed cap — min(66% of window height, 540px). There was no way to deliberately give t...
X Description: Closes #48 What & why OpenWork's chat composer (FreeFormInput) auto-grows as you type, but only up to a fixed cap — min(66% of window height, 540px). There was no way to deliberatel...
Opengraph URL: https://github.com/modelstudioai/openwork/pull/49
X: @github
Domain: github.com
| route-pattern | /:user_id/:repository/pull/:id/files(.:format) |
| route-controller | pull_requests |
| route-action | files |
| fetch-nonce | v2:7b0ca7d4-4ac9-b722-a96c-705ec7543001 |
| current-catalog-service-hash | ae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b |
| request-id | A568:1BF8C0:2A2CB7:38594B:6A528C0D |
| html-safe-nonce | 584c8876b9c3cb8395009d879a49e2ba20151f40eb5db4132873e0e9ee58ffa9 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJBNTY4OjFCRjhDMDoyQTJDQjc6Mzg1OTRCOjZBNTI4QzBEIiwidmlzaXRvcl9pZCI6IjIxODIzNjg0NjA3ODg2MzI1ODkiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | 6eb99227fd2ec66bc5bb62db2ae57f9695c73bf2ec28cdd1ca9ccbe6ac5ae634 |
| hovercard-subject-tag | pull_request:3982530481 |
| github-keyboard-shortcuts | repository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/modelstudioai/openwork/pull/49/files |
| twitter:image | https://avatars.githubusercontent.com/u/52599892?s=400&v=4 |
| twitter:card | summary_large_image |
| og:image | https://avatars.githubusercontent.com/u/52599892?s=400&v=4 |
| og:image:alt | Closes #48 What & why OpenWork's chat composer (FreeFormInput) auto-grows as you type, but only up to a fixed cap — min(66% of window height, 540px). There was no way to deliberately give t... |
| og:site_name | GitHub |
| og:type | object |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| diff-view | unified |
| go-import | github.com/modelstudioai/openwork git https://github.com/modelstudioai/openwork.git |
| octolytics-dimension-user_id | 283556804 |
| octolytics-dimension-user_login | modelstudioai |
| octolytics-dimension-repository_id | 1256697754 |
| octolytics-dimension-repository_nwo | modelstudioai/openwork |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1256697754 |
| octolytics-dimension-repository_network_root_nwo | modelstudioai/openwork |
| turbo-body-classes | logged-out env-production page-responsive full-width |
| disable-turbo | true |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 07a982c1d40157c619b364352b704c3ce66bb332 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width