Skip to content

fix: pin subagent model and unify desktop UI - #211

Merged
elkaix merged 5 commits into
mainfrom
fix/enforce-selected-subagent-model
Aug 27, 2026
Merged

fix: pin subagent model and unify desktop UI#211
elkaix merged 5 commits into
mainfrom
fix/enforce-selected-subagent-model

Conversation

@elkaix

@elkaix elkaix commented Aug 26, 2026

Copy link
Copy Markdown
Member

Related Issue

Resolve #209
Resolve #210

Problem

The subagent-model setting looked authoritative, but it configured only a default. An explicit primary-model request could still override it.

The shared sidebar selected different banner assets by theme instead of using the approved dark banner across browser and desktop builds.

The desktop updater did not match the approved prompt and progress design. Electron's differential download could also fail and fall back to a second full transfer, which restarted the visible progress.

What changed

  • Add an accessible switch that writes the canonical v2 defaultModel and force fields while reading legacy model values.
  • Use pythinker_banner_dark.svg in the shared web, macOS, and Windows sidebar, and remove the unused light code-banner asset.
  • Match the reference updater prompt and progress layout with Pythinker branding.
  • Force one full update transfer and ignore late progress events after the update is ready.
  • Keep an available update downloadable when automatic checks are enabled.
  • Add regression coverage and rebuild the committed web bundle.

Verification

  • pnpm test apps/pythinker-web/test — 84 files, 999 tests passed.
  • pnpm test apps/desktop/tests — 14 files, 170 tests passed.
  • Web and desktop typechecks, tsgo, and pnpm lint — passed with 0 errors.
  • pnpm run build:web and pnpm run check:web — 673 bundle entries verified at source hash f88e4160eddd.
  • Built-browser security checks — Mermaid and Monaco sanitization passed.
  • The signed macOS package passed strict codesign verification and contains a byte-identical copy of the rebuilt web bundle.
  • Available and downloading states were visually inspected against the supplied desktop references.

Checklist

  • I have read the CONTRIBUTING document.
  • I have linked related issues.
  • I have added tests that prove the changes work.
  • Ran gen-changesets skill.
  • This PR needs no documentation update.

Summary by CodeRabbit

  • New Features

    • Added options to select and force a default model for subagents.
    • Added support for additional diagram types and editor languages.
    • Added automatic update-check controls and clearer update download progress.
  • Improvements

    • Updated the update dialog with release dates, branded styling, and responsive layout.
    • Standardized the sidebar with a consistent dark banner.
    • Improved update state handling and download reliability.
  • Bug Fixes

    • Prevented update progress events from showing incorrect download states.

elkaix added 2 commits August 26, 2026 16:46
Expose the canonical force option so a selected subagent model cannot be overridden by primary-model requests. Keep reading legacy model config while writing v2 defaultModel fields.
Use the dark Pythinker banner in the shared sidebar so the web, macOS, and Windows interfaces display the same brand asset.
@elkaix elkaix added the bug Something isn't working label Aug 26, 2026
@coderabbitai

coderabbitai Bot commented Aug 26, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

Next included review available in 5 minutes.

View limit details

Limit details: You’ve used all 10 included reviews currently available.

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d07a2e46-a3d7-4575-bcf6-cddf0c5760c6

📥 Commits

Reviewing files that changed from the base of the PR and between bd0eadd and 5c45e7e.

⛔ Files ignored due to path filters (4)
  • apps/pythinker-code/dist-web/brand/pythinker_banner_dark.svg is excluded by !**/*.svg
  • apps/pythinker-code/dist-web/brand/pythinker_code_banner_light.svg is excluded by !**/*.svg
  • apps/pythinker-web/public/brand/pythinker_banner_dark.svg is excluded by !**/*.svg
  • apps/pythinker-web/public/brand/pythinker_code_banner_light.svg is excluded by !**/*.svg
📒 Files selected for processing (110)
  • .changeset/pin-subagent-model.md
  • apps/desktop/src/updater.ts
  • apps/desktop/tests/updater.spec.ts
  • apps/pythinker-code/dist-web/.web-bundle-manifest.json
  • apps/pythinker-code/dist-web/assets/CodeBlockNode-DnsxSWob.js
  • apps/pythinker-code/dist-web/assets/DesignSystemView-DpGFNOXe.js
  • apps/pythinker-code/dist-web/assets/Tooltip-By4TAfdP.js
  • apps/pythinker-code/dist-web/assets/abnfDiagram-VCTEODGH-EEgTRrll.js
  • apps/pythinker-code/dist-web/assets/arc-Cp2Tq9Un.js
  • apps/pythinker-code/dist-web/assets/architectureDiagram-5GKGNRK7-DDQUOID1.js
  • apps/pythinker-code/dist-web/assets/blockDiagram-NRAW4CY4-RT6je87u.js
  • apps/pythinker-code/dist-web/assets/c4Diagram-UCG6FXSJ-XLrjHNvT.js
  • apps/pythinker-code/dist-web/assets/channel-CmhBP93Z.js
  • apps/pythinker-code/dist-web/assets/channel-Ct_VL6Jd.js
  • apps/pythinker-code/dist-web/assets/chunk-2Q5K7J3B-Q7uLHEi3.js
  • apps/pythinker-code/dist-web/assets/chunk-5VM5RSS4-CvdFeUuk.js
  • apps/pythinker-code/dist-web/assets/chunk-F27PBJKO-B44NyAwP.js
  • apps/pythinker-code/dist-web/assets/chunk-G27WJ6UU-D1Pwyo2j.js
  • apps/pythinker-code/dist-web/assets/chunk-JWPE2WC7-hOKEODHD.js
  • apps/pythinker-code/dist-web/assets/chunk-LCL6LL3I-B7SdCmHP.js
  • apps/pythinker-code/dist-web/assets/chunk-POPQ4Y6H-DlvFauOr.js
  • apps/pythinker-code/dist-web/assets/chunk-SVP7TREG-BAS6Oghf.js
  • apps/pythinker-code/dist-web/assets/chunk-XXDRQBXY-BLYpYNiV.js
  • apps/pythinker-code/dist-web/assets/classDiagram-DTDB5LWJ-BwIIqipv.js
  • apps/pythinker-code/dist-web/assets/classDiagram-DTDB5LWJ-DvUknTFi.js
  • apps/pythinker-code/dist-web/assets/classDiagram-v2-JRS7N3AN-BwIIqipv.js
  • apps/pythinker-code/dist-web/assets/classDiagram-v2-JRS7N3AN-DvUknTFi.js
  • apps/pythinker-code/dist-web/assets/cose-bilkent-JH36ORCC-CsIt1RbY.js
  • apps/pythinker-code/dist-web/assets/cssMode-C-yJ4pHm.js
  • apps/pythinker-code/dist-web/assets/cynefin-OW5HDTMX-BI3IHLsT.js
  • apps/pythinker-code/dist-web/assets/cynefinDiagram-5FMLGOSQ-hkOGJzqC.js
  • apps/pythinker-code/dist-web/assets/dagre-3AP2YEHR-BGJ1WthS.js
  • apps/pythinker-code/dist-web/assets/diagram-S7CK7UJ4-GtAnlW_Z.js
  • apps/pythinker-code/dist-web/assets/diagram-UQ7AKVKN-CtUDpCIF.js
  • apps/pythinker-code/dist-web/assets/diagram-VSXAHHWV-4xuHqcE4.js
  • apps/pythinker-code/dist-web/assets/diagram-VX7I27RA-CVdlYzm3.js
  • apps/pythinker-code/dist-web/assets/diagram-Z3DM3KII-C0Qdba2H.js
  • apps/pythinker-code/dist-web/assets/ebnfDiagram-PWID7BFC-B-gqYfTB.js
  • apps/pythinker-code/dist-web/assets/editor.main-DZYCJ8oZ.js
  • apps/pythinker-code/dist-web/assets/erDiagram-SSCWMZ5O-B2_xB01-.js
  • apps/pythinker-code/dist-web/assets/flowDiagram-A5DVABFB-dCHX1Lj1.js
  • apps/pythinker-code/dist-web/assets/freemarker2-C-KVj_hz.js
  • apps/pythinker-code/dist-web/assets/ganttDiagram-EL5Y4UJY-kZBgrFaU.js
  • apps/pythinker-code/dist-web/assets/gitGraphDiagram-WWUBYQGX-Dg6I5QPU.js
  • apps/pythinker-code/dist-web/assets/handlebars-BE2IAV35.js
  • apps/pythinker-code/dist-web/assets/html-DOI6tlZE.js
  • apps/pythinker-code/dist-web/assets/htmlMode-DH-7pcQj.js
  • apps/pythinker-code/dist-web/assets/index-BH4qUqEf.css
  • apps/pythinker-code/dist-web/assets/index-BuR2U4rb.js
  • apps/pythinker-code/dist-web/assets/index-DG_QruLv.css
  • apps/pythinker-code/dist-web/assets/index-DMSSuBT0.js
  • apps/pythinker-code/dist-web/assets/index-Dy86id8U.js
  • apps/pythinker-code/dist-web/assets/index-pAs3rhRE.js
  • apps/pythinker-code/dist-web/assets/index10-CYs98xhR.js
  • apps/pythinker-code/dist-web/assets/index11-BviyZK_W.js
  • apps/pythinker-code/dist-web/assets/index5-BzOS0JHS.js
  • apps/pythinker-code/dist-web/assets/index6--epi8aXQ.js
  • apps/pythinker-code/dist-web/assets/index7-C-hn76UC.js
  • apps/pythinker-code/dist-web/assets/index8-Vm0-AI-w.js
  • apps/pythinker-code/dist-web/assets/infoDiagram-RXCK75RN-Bir4C_AF.js
  • apps/pythinker-code/dist-web/assets/ishikawaDiagram-5VMMS53U-CRqUnF5g.js
  • apps/pythinker-code/dist-web/assets/javascript-DSRweWsR.js
  • apps/pythinker-code/dist-web/assets/journeyDiagram-EYS64GPL-OrqHb1qJ.js
  • apps/pythinker-code/dist-web/assets/jsonMode-DN9Wjzyw.js
  • apps/pythinker-code/dist-web/assets/kanban-definition-3QL26DDD-bFPWOCX_.js
  • apps/pythinker-code/dist-web/assets/layout-ebJn31K5.js
  • apps/pythinker-code/dist-web/assets/linear-BSp-CSDl.js
  • apps/pythinker-code/dist-web/assets/liquid-C3CDPM0B.js
  • apps/pythinker-code/dist-web/assets/lspLanguageFeatures-B3IZkqc8.js
  • apps/pythinker-code/dist-web/assets/mdx-BMkChx2q.js
  • apps/pythinker-code/dist-web/assets/mermaid.core-DVaKhp2z.js
  • apps/pythinker-code/dist-web/assets/mindmap-definition-FBJOCRG2-b3jExicz.js
  • apps/pythinker-code/dist-web/assets/pegDiagram-XKGWAZYB-pAKSPZwZ.js
  • apps/pythinker-code/dist-web/assets/pieDiagram-E7YTZNPT-H0uAk132.js
  • apps/pythinker-code/dist-web/assets/python-BuyflZRt.js
  • apps/pythinker-code/dist-web/assets/quadrantDiagram-AXDQQJYC-LK-3q4Wx.js
  • apps/pythinker-code/dist-web/assets/railroadDiagram-O6MQD6OU-BgpDBXhW.js
  • apps/pythinker-code/dist-web/assets/razor-1P83rbMf.js
  • apps/pythinker-code/dist-web/assets/requirementDiagram-EFPCY7ZU-ym_VBa8H.js
  • apps/pythinker-code/dist-web/assets/sankeyDiagram-P5KCCOFB-C7ops5z4.js
  • apps/pythinker-code/dist-web/assets/sequenceDiagram-WJ2MYXX4-B6lvLO6m.js
  • apps/pythinker-code/dist-web/assets/sizeCapture-X5ZJPWSS-Dty1YCxn.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-HBIQ2CUA-m8-8In7n.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-v2-4QOOHH4V-BtylU25o.js
  • apps/pythinker-code/dist-web/assets/stateDiagram-v2-4QOOHH4V-CFYDGcOf.js
  • apps/pythinker-code/dist-web/assets/swimlanes-XN3QIQJK-Dk-FK0ed.js
  • apps/pythinker-code/dist-web/assets/swimlanesDiagram-VK2B7HYN-BMpwbzu7.js
  • apps/pythinker-code/dist-web/assets/swimlanesDiagram-VK2B7HYN-CWrytj96.js
  • apps/pythinker-code/dist-web/assets/timeline-definition-24CTP7MA-COI3VwQn.js
  • apps/pythinker-code/dist-web/assets/tsMode-d7IoTWKq.js
  • apps/pythinker-code/dist-web/assets/typescript-BAHBkVzJ.js
  • apps/pythinker-code/dist-web/assets/vennDiagram-4TSXK5OY-DExge3I1.js
  • apps/pythinker-code/dist-web/assets/vue.runtime.esm-bundler-B5t68QHF.js
  • apps/pythinker-code/dist-web/assets/wardleyDiagram-VM6X3IG4-CeFlji_5.js
  • apps/pythinker-code/dist-web/assets/xml-DU5xGX-L.js
  • apps/pythinker-code/dist-web/assets/xychartDiagram-S5SC5T6Z-BZMhA1hR.js
  • apps/pythinker-code/dist-web/assets/yaml-BDK9yNmX.js
  • apps/pythinker-code/dist-web/index.html
  • apps/pythinker-web/src/api/daemon/wire.ts
  • apps/pythinker-web/src/api/types.ts
  • apps/pythinker-web/src/components/Sidebar.vue
  • apps/pythinker-web/src/components/UpdateDialog.vue
  • apps/pythinker-web/src/components/settings/SettingsDialog.vue
  • apps/pythinker-web/src/components/ui/Dialog.vue
  • apps/pythinker-web/src/composables/useDesktopUpdate.ts
  • apps/pythinker-web/src/i18n/locales/en/settings.ts
  • apps/pythinker-web/src/i18n/locales/en/update.ts
  • apps/pythinker-web/test/app-shell-contracts.test.ts
  • apps/pythinker-web/test/settings-ui.test.ts
  • apps/pythinker-web/test/update-dialog.test.ts

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

@pkg-pr-new

pkg-pr-new Bot commented Aug 26, 2026

Copy link
Copy Markdown
pnpm dlx https://pkg.pr.new/@pymodel/pythinker-code@5c45e7e
npx https://pkg.pr.new/@pymodel/pythinker-code@5c45e7e

commit: 5c45e7e

Comment thread apps/pythinker-code/dist-web/assets/chunk-G27WJ6UU-BvpUKacG.js Fixed
Comment thread apps/pythinker-code/dist-web/assets/chunk-G27WJ6UU-BvpUKacG.js Fixed
elkaix added 3 commits August 26, 2026 17:00
Use the complete Pythinker wordmark as the canonical dark banner and keep the committed web bundle in sync.
Remove the obsolete light code banner from the canonical web source and committed desktop bundle.
@elkaix elkaix changed the title fix: pin subagent model and unify sidebar banner fix: pin subagent model and unify desktop UI Aug 26, 2026
Comment thread apps/pythinker-code/dist-web/assets/chunk-G27WJ6UU-D1Pwyo2j.js
Comment thread apps/pythinker-code/dist-web/assets/chunk-G27WJ6UU-D1Pwyo2j.js
@elkaix
elkaix merged commit 7040eed into main Aug 27, 2026
32 checks passed
@elkaix
elkaix deleted the fix/enforce-selected-subagent-model branch August 27, 2026 00:30
elkaix pushed a commit that referenced this pull request Aug 27, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @pymodel/pythinker-code@1.4.0

### Minor Changes

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Remove the
`--allow-remote-terminals` flag from `pythinker web`; PTY terminal
routes now stay available on loopback binds only.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Add
`PYTHINKER_CODE_INFINITE_RETRY=1` to retry every failed model request
indefinitely with backoff instead of failing the turn, for long
unattended runs.

- [#208](#208)
[`bd0eadd`](bd0eadd)
Thanks [@elkaix](https://github.com/elkaix)! - Add an option to reveal
saved plan files in your file manager. Select Reveal in file manager
from a saved plan.

### Patch Changes

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Silence the
MaxListenersExceededWarning that could appear during long agent turns
with many parallel tool calls.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Fix messages sent from
one web client not appearing on other clients connected to the same
session.

- [#207](#207)
[`3a1d761`](3a1d761)
Thanks [@elkaix](https://github.com/elkaix)! - Fix context usage updates
in interactive clients.

- [#214](#214)
[`48510be`](48510be)
Thanks [@elkaix](https://github.com/elkaix)! - Complete a Codex sign-in
as soon as the browser tab becomes visible again, not only when the
window regains focus.

- [#201](#201)
[`5f087d8`](5f087d8)
Thanks [@elkaix](https://github.com/elkaix)! - Make the chat prompt
anchor a compact line index that opens prompt and response previews.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Persist a picked thinking
effort as the default only up to the model's own default effort; a more
expensive pick stays session-only.

- [#204](#204)
[`2d76cad`](2d76cad)
Thanks [@elkaix](https://github.com/elkaix)! - Fix prompt anchor
selection when a conversation has two prompts.

- [#198](#198)
[`6be446e`](6be446e)
Thanks [@elkaix](https://github.com/elkaix)! - Wrap narrow Changes
editor lines while keeping line numbers visible.

- [#207](#207)
[`3a1d761`](3a1d761)
Thanks [@elkaix](https://github.com/elkaix)! - Fix session history after
steering or undoing a turn.

- [#211](#211)
[`7040eed`](7040eed)
Thanks [@elkaix](https://github.com/elkaix)! - Add a setting to pin
every subagent to the selected model, use the dark banner in every
sidebar, and show Pythinker desktop updates as one continuous download.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Show the /plugins
marketplace catalog as soon as it loads, with latest-version lookups
running in the background.

- [#192](#192)
[`8b6cc70`](8b6cc70)
Thanks [@elkaix](https://github.com/elkaix)! - Preserve subagent model
aliases when provider models refresh.

- [#215](#215)
[`e4ed37f`](e4ed37f)
Thanks [@elkaix](https://github.com/elkaix)! - Fix a resumed session
showing a stale "manually stopped" or failed state when its last turn
had actually completed.

- [#198](#198)
[`6be446e`](6be446e)
Thanks [@elkaix](https://github.com/elkaix)! - Show available desktop
updates as a sidebar button with release notes and update controls.

- [#192](#192)
[`8b6cc70`](8b6cc70)
Thanks [@elkaix](https://github.com/elkaix)! - Stop goal turns when
automatic context compaction is cancelled or fails.

- [#192](#192)
[`8b6cc70`](8b6cc70)
Thanks [@elkaix](https://github.com/elkaix)! - Let subagents inherit the
calling agent model from the Agent settings tab.

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Fix foreground subagents
being reported as background tasks on the task list.

- [#201](#201)
[`5f087d8`](5f087d8)
Thanks [@elkaix](https://github.com/elkaix)! - Use theme-matched
Pythinker banners in the sidebar.

- [#207](#207)
[`3a1d761`](3a1d761)
Thanks [@elkaix](https://github.com/elkaix)! - Fix loss of large tool
outputs in long conversations.

- [#213](#213)
[`0753f13`](0753f13)
Thanks [@elkaix](https://github.com/elkaix)! - Fix the "manually
stopped" state lingering after undoing the interrupted turn.

- [#198](#198)
[`6be446e`](6be446e)
Thanks [@elkaix](https://github.com/elkaix)! - Replace the sidebar robot
icon with the Pythinker Code banner.
## pythinker@0.9.6

### Patch Changes

- [#188](#188)
[`0097afc`](0097afc)
Thanks [@elkaix](https://github.com/elkaix)! - Persist a picked thinking
effort as the default only up to the model's own default effort; a more
expensive pick stays session-only.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Use the dark Pythinker banner in every sidebar Subagent model setting allows primary-model overrides

1 participant