Sync provider/plugin upstream behaviors#33
Merged
Conversation
8 tasks
Astro-Han
added a commit
that referenced
this pull request
May 9, 2026
Slice 10 of issue #440 — full composer + dock + model picker rewrite. 38 commits squashed. ## Highlights - **Composer joined-card shell**: new DockCard + DockSegment primitives in @opencode-ai/ui, dock widgets share the L34 joined-card layout. Hybrid composer shell renders permission UI inline. - **prompt-input.tsx 1602 → ~570 lines**: split into prompt-input/{store-types, editor-serialize, editor-imperatives, comment-routing, history-navigation, popover-controllers, editor-input, keydown, model-controls}. No behavior change — all factories injected via deps; popover↔editor-input cycle resolved via mutable forward-ref. - **DockWidgetHeader unified**: single 36px collapsed header with 30px chev IconButton (3+3 breathing) — consolidates Followup, Revert, Todo widgets. - **DOCK_MOTION contract**: composer/dock/widgets share `{ visualDuration: 0.3, bounce: 0 }` via packages/app/src/pages/session/composer/motion.ts. Aligns with global useSpring convention. - **Model picker rewrite**: variant control merged into model trigger; thinking-level promoted from separate popover to inline section. `[data-picker-content]` guard prevents nested popover dismiss. - **Send button + ContextUsage parity**: 30px outer / 16px inner glyph, theme-locked colors, larger stop glyph. - **Followup defaults to queue mode**: drops the legacy steer override. - **Control heights**: single 30px dense tier across composer; sidebar trailing actions step down to 26 per nesting rule. - **Picker contracts**: tighter padding, narrower width (340), dropped sticky labels. ## Post-review fixes (CI + 2 review rounds) - Critical: DockCard manual classList merge (single key with spaces) was throwing DOMException InvalidCharacterError — replaced with Solid native class+classList co-rendering. - CI typecheck: PopoverControllers types aligned with upstream solid-list `Accessor<string | null>` (was `undefined`). - CI e2e: dropped stale `prompt-variant-control` selector (variant folded into model picker). - Send button e2e contract: 32 → 30px to match dense tier. - Editor serialize: fixed double-newline regression for blank rows. - Keydown: removed dead `if (stopping())` branches (both arms identical). - Custom slash command id includes source to prevent workspace+user collision. - Model trigger label: pinned to `min-w-[80px] max-w-[180px]` to balance short names ("GPT-5.5") vs long ("DeepSeek V4 Pro") without jiggling the workspace control. ## Systemic finding (tracked under #34) PawWork sets `html { font: var(--type-body) }` → root font-size 13px. This means **Tailwind rem-based units render at 81% of their pixel-named values**: `h-9` = 29.25px, not 36px. Multiple visual bugs in this slice (chev clipping, header height) traced back to this. Remediation: use absolute pixels (`h-[36px]`) for grid-pinned heights; avoid Tailwind's pixel-named scale for 4pt-grid alignment. DESIGN.md docs debt to be filed under #34. ## Hand-test backlog (open after merge) - #32 dark theme regression sweep - #33 single-prompt E2E ## Files of note - packages/ui/src/components/dock-card.tsx (new) - packages/app/src/pages/session/composer/{motion.ts, use-dock-collapse.ts, dock-widget-header.tsx, session-composer-region.tsx, session-todo-dock.tsx} - packages/app/src/components/prompt-input/* (9 new files) - packages/app/e2e/composer/composer-slice-10.spec.ts (new) Closes part of #440.
11 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Align the PR3 provider/plugin slice of issue #27 with upstream
v1.4.11behavior, while keeping the diff inside provider/plugin-owned files and tests.This PR:
maxOutputTokensfor OpenAI reasoning models oncloudflare-ai-gatewaymodels.devprovider entries so required response fields get safe defaultsstore=trueprovider behavior and locks it with a regression test so this sync item is explicit in PR3 instead of implicit in later driftghostty-webto an immutable Git commit sobun install --frozen-lockfilestays reproducible in CIWhy
Issue #27 was split so PR3 only owns provider/plugin behavior work and directly owned tests. This keeps the review surface honest after PR #31 instead of hiding runtime bridge migration inside a provider/plugin-named PR.
The CI follow-up is intentionally small: this repo cannot use a moving Git dependency ref like
github:anomalyco/ghostty-web#mainwhile enforcing a frozen lockfile, because upstream branch movement makes installs non-reproducible.Related Issue
Refs #27
How To Verify
bun install --frozen-lockfile bun --cwd packages/opencode test test/provider test/plugin bun run --cwd packages/opencode typecheck bun run --cwd packages/opencode build bun turbo typecheck bun turbo test:ciScreenshots or Recordings
N/A, no visible UI changes.
Checklist
devbranch