From bc942ea1aeb34cca3788a72375c9185a6a566632 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 17 Aug 2026 22:27:43 +0000 Subject: [PATCH] ci: release packages --- .changeset/catalog-rest-and-skill-toggle.md | 5 -- .changeset/derive-model-capabilities.md | 5 -- .changeset/desktop-server-conflict.md | 5 -- .changeset/desktop-update-toast.md | 5 -- .changeset/desktop-window-chrome.md | 5 -- .changeset/inline-settings-route.md | 5 -- .changeset/mac-dmg-signing.md | 5 -- .changeset/pr-review-fixes.md | 5 -- .changeset/preserve-provider-ids.md | 5 -- .changeset/session-capability-wiring.md | 5 -- .changeset/snapshot-stall.md | 5 -- .changeset/web-account-section.md | 5 -- .changeset/web-capability-menu-a11y.md | 5 -- .changeset/web-capability-menu.md | 5 -- .changeset/web-codex-login.md | 5 -- .changeset/web-composer-shell.md | 5 -- .../web-connectors-form-and-dialog-corners.md | 5 -- .changeset/web-connectors-menu-cleanup.md | 5 -- .changeset/web-empty-suggestions.md | 5 -- .changeset/web-mcp-server-crud.md | 5 -- .changeset/web-message-actions.md | 5 -- .changeset/web-model-badges.md | 5 -- .changeset/web-provider-routes.md | 5 -- .changeset/web-settings-tokens.md | 5 -- .changeset/web-sidebar-rows.md | 5 -- .changeset/web-snapshot-recovery.md | 5 -- .changeset/web-tools-settings-page.md | 5 -- .changeset/web-ui-primitives.md | 5 -- .changeset/windows-browser-url.md | 5 -- apps/pythinker-code/CHANGELOG.md | 64 +++++++++++++++++++ apps/pythinker-code/package.json | 2 +- 31 files changed, 65 insertions(+), 146 deletions(-) delete mode 100644 .changeset/catalog-rest-and-skill-toggle.md delete mode 100644 .changeset/derive-model-capabilities.md delete mode 100644 .changeset/desktop-server-conflict.md delete mode 100644 .changeset/desktop-update-toast.md delete mode 100644 .changeset/desktop-window-chrome.md delete mode 100644 .changeset/inline-settings-route.md delete mode 100644 .changeset/mac-dmg-signing.md delete mode 100644 .changeset/pr-review-fixes.md delete mode 100644 .changeset/preserve-provider-ids.md delete mode 100644 .changeset/session-capability-wiring.md delete mode 100644 .changeset/snapshot-stall.md delete mode 100644 .changeset/web-account-section.md delete mode 100644 .changeset/web-capability-menu-a11y.md delete mode 100644 .changeset/web-capability-menu.md delete mode 100644 .changeset/web-codex-login.md delete mode 100644 .changeset/web-composer-shell.md delete mode 100644 .changeset/web-connectors-form-and-dialog-corners.md delete mode 100644 .changeset/web-connectors-menu-cleanup.md delete mode 100644 .changeset/web-empty-suggestions.md delete mode 100644 .changeset/web-mcp-server-crud.md delete mode 100644 .changeset/web-message-actions.md delete mode 100644 .changeset/web-model-badges.md delete mode 100644 .changeset/web-provider-routes.md delete mode 100644 .changeset/web-settings-tokens.md delete mode 100644 .changeset/web-sidebar-rows.md delete mode 100644 .changeset/web-snapshot-recovery.md delete mode 100644 .changeset/web-tools-settings-page.md delete mode 100644 .changeset/web-ui-primitives.md delete mode 100644 .changeset/windows-browser-url.md diff --git a/.changeset/catalog-rest-and-skill-toggle.md b/.changeset/catalog-rest-and-skill-toggle.md deleted file mode 100644 index 45ca3312..00000000 --- a/.changeset/catalog-rest-and-skill-toggle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": minor ---- - -Add server endpoints that list installed plugins, enable or disable one, and list subagent profiles, and let a named skill be turned off so it is hidden from the model, the slash menu and the API. diff --git a/.changeset/derive-model-capabilities.md b/.changeset/derive-model-capabilities.md deleted file mode 100644 index 41498147..00000000 --- a/.changeset/derive-model-capabilities.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": minor ---- - -Report each model's real capabilities in the catalog. Until now `capabilities` carried only what a user had typed into their config file by hand, so for almost every model it was empty. It is now derived from the model itself when the config says nothing, while an explicit list in the config still wins. A provider whose capabilities are genuinely unknown keeps omitting the field rather than claiming the model can do nothing. diff --git a/.changeset/desktop-server-conflict.md b/.changeset/desktop-server-conflict.md deleted file mode 100644 index 5ec20f32..00000000 --- a/.changeset/desktop-server-conflict.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': patch ---- - -Say why the desktop app cannot start when another Pythinker server is already running. It now names the process, port and start time and offers Retry or Quit, in place of an exit code that explained nothing. Stopping the other server stays the user's choice. diff --git a/.changeset/desktop-update-toast.md b/.changeset/desktop-update-toast.md deleted file mode 100644 index c77f0945..00000000 --- a/.changeset/desktop-update-toast.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": minor ---- - -Prompt for desktop updates with a toast that offers install or skip, centre the settings button in the sidebar footer, and start a new session when the sidebar brand is clicked. diff --git a/.changeset/desktop-window-chrome.md b/.changeset/desktop-window-chrome.md deleted file mode 100644 index 6ef2658d..00000000 --- a/.changeset/desktop-window-chrome.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': patch ---- - -Repaint the desktop chrome. The sidebar footer now carries a pill button, so Settings and the way back out of it match New Session and stay visible. The transcript reserves room for the floating work chips instead of letting them sit on the last line. Windows gets round window controls on the trailing edge, in place of the native caption buttons that could not be styled. diff --git a/.changeset/inline-settings-route.md b/.changeset/inline-settings-route.md deleted file mode 100644 index b00ce16a..00000000 --- a/.changeset/inline-settings-route.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": minor ---- - -Open the web settings inside the app shell instead of over it, and add pages for plugins, skills, subagents, connectors, hooks and usage statistics. diff --git a/.changeset/mac-dmg-signing.md b/.changeset/mac-dmg-signing.md deleted file mode 100644 index f02b09f3..00000000 --- a/.changeset/mac-dmg-signing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': patch ---- - -Sign, notarize and staple the macOS disk image, so a downloaded desktop build no longer opens with a Gatekeeper warning, and keep the update metadata in step with the finished file. The install window also gets a deliberate icon layout in place of the stock one. diff --git a/.changeset/pr-review-fixes.md b/.changeset/pr-review-fixes.md deleted file mode 100644 index 7f5a1767..00000000 --- a/.changeset/pr-review-fixes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Keep provider and model ids exactly as you type them, open the ChatGPT sign-in window reliably, stop a second sign-in attempt from holding the callback port, hide provider errors behind a safe message, and finish writing the event journals during shutdown. diff --git a/.changeset/preserve-provider-ids.md b/.changeset/preserve-provider-ids.md deleted file mode 100644 index 87065181..00000000 --- a/.changeset/preserve-provider-ids.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Keep provider and model ids exactly as written when a config patch is saved, so an id containing an underscore still resolves. diff --git a/.changeset/session-capability-wiring.md b/.changeset/session-capability-wiring.md deleted file mode 100644 index 1b446240..00000000 --- a/.changeset/session-capability-wiring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": minor ---- - -Make `agent_config.tools` and `agent_config.mcp_servers` reach the running agent. A session profile update now persists the selection, merges each field independently so supplying one half does not clear the other, resumes an inactive session before the mutation, and applies the result through a single `setActiveTools` call. MCP server names are turned into tool patterns with the shared naming helper, so a server whose name needs sanitizing still matches its tools. diff --git a/.changeset/snapshot-stall.md b/.changeset/snapshot-stall.md deleted file mode 100644 index 42ef6687..00000000 --- a/.changeset/snapshot-stall.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': patch ---- - -Stop the session snapshot request from timing out on busy sessions. Each recorded event no longer pays a fresh file open and close, the watermark is read without waiting for pending writes, and the session list is scanned in parallel, so opening or refreshing a session stays fast even with a long history. This was most visible on Windows, where the per-event file cost is highest. diff --git a/.changeset/web-account-section.md b/.changeset/web-account-section.md deleted file mode 100644 index 8e8f228d..00000000 --- a/.changeset/web-account-section.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Show the sign-in state, the provider, and the model as separate fields in the web settings account section, and label the button for what it opens. diff --git a/.changeset/web-capability-menu-a11y.md b/.changeset/web-capability-menu-a11y.md deleted file mode 100644 index 0f742ce1..00000000 --- a/.changeset/web-capability-menu-a11y.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Fix web capability and retry controls: the capability panel takes keyboard focus when it opens, Retry stays reachable with Tab, rapid capability toggles reach the daemon in order, and retrying a prompt keeps its attachments. diff --git a/.changeset/web-capability-menu.md b/.changeset/web-capability-menu.md deleted file mode 100644 index 1e9252f0..00000000 --- a/.changeset/web-capability-menu.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": minor ---- - -Add a capability menu to the composer. It picks which tools and MCP servers the current session may use, lists the session's skills, and turns plugins on or off. Each group states how far its change reaches, because the three differ: tool and MCP changes apply to this session at once, skills are read-only here, and plugin changes are global to the daemon. Selected tools and servers appear as chips beside the composer controls. diff --git a/.changeset/web-codex-login.md b/.changeset/web-codex-login.md deleted file mode 100644 index d6da292e..00000000 --- a/.changeset/web-codex-login.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': minor ---- - -Add OpenAI Codex sign-in to the web and desktop app. The provider dialog now offers "Sign in with ChatGPT" next to the API-key form: the server runs the OAuth exchange, writes the credentials, and reports only which model it selected. When port 1455 is taken, the dialog asks for the redirect URL instead. diff --git a/.changeset/web-composer-shell.md b/.changeset/web-composer-shell.md deleted file mode 100644 index cc0a9107..00000000 --- a/.changeset/web-composer-shell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Widen the chat reading column to 928px and restyle the composer card: a 24px radius, a translucent blurred surface, a border that strengthens on hover and focus, and an input that grows to 384px before it scrolls. The toolbar controls are 30px circles with a divider after the attachment button. diff --git a/.changeset/web-connectors-form-and-dialog-corners.md b/.changeset/web-connectors-form-and-dialog-corners.md deleted file mode 100644 index de9bd004..00000000 --- a/.changeset/web-connectors-form-and-dialog-corners.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Lay the MCP server form out in even rows instead of a ragged grid, and stop the provider manager header and footer from squaring off the dialog corners. diff --git a/.changeset/web-connectors-menu-cleanup.md b/.changeset/web-connectors-menu-cleanup.md deleted file mode 100644 index 3fae4e2d..00000000 --- a/.changeset/web-connectors-menu-cleanup.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Clean up the web composer capability control: the selected tools no longer render as chips in the toolbar, the button reads "Connectors", and the menu panel stays inside the window when its content loads. diff --git a/.changeset/web-empty-suggestions.md b/.changeset/web-empty-suggestions.md deleted file mode 100644 index 7aff4b08..00000000 --- a/.changeset/web-empty-suggestions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': minor ---- - -Add starter suggestions to the empty conversation screen in the web UI. Each suggestion fills the composer for editing and does not send the message. diff --git a/.changeset/web-mcp-server-crud.md b/.changeset/web-mcp-server-crud.md deleted file mode 100644 index b51459d2..00000000 --- a/.changeset/web-mcp-server-crud.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": minor ---- - -Add, edit, and remove your own MCP servers from the connectors page in the web UI; a new or edited server starts with your next session. diff --git a/.changeset/web-message-actions.md b/.changeset/web-message-actions.md deleted file mode 100644 index 65f8d717..00000000 --- a/.changeset/web-message-actions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': minor ---- - -Add a Retry action to the last assistant reply and a copy button to user messages in the web UI. Retry asks for confirmation, then sends the original prompt again. diff --git a/.changeset/web-model-badges.md b/.changeset/web-model-badges.md deleted file mode 100644 index 5ad63da9..00000000 --- a/.changeset/web-model-badges.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Show model capabilities as badges in the model picker instead of a comma-separated string, and bring its rows and search field onto the app's row metrics, sized from `--ui-font-size` so the font-size setting still scales them. A model that reasons adaptively is now distinguishable from one that exposes an explicit thinking capability, and an unrecognised capability still renders rather than being dropped. diff --git a/.changeset/web-provider-routes.md b/.changeset/web-provider-routes.md deleted file mode 100644 index 14c09b3f..00000000 --- a/.changeset/web-provider-routes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": minor ---- - -Point the web provider calls at routes that exist. Adding a provider now writes through `POST /config`, refreshing reads `GET /providers/{id}`, and a new `DELETE /providers/{provider_id}` route removes a provider together with the model aliases that referenced it. diff --git a/.changeset/web-settings-tokens.md b/.changeset/web-settings-tokens.md deleted file mode 100644 index c938b8d4..00000000 --- a/.changeset/web-settings-tokens.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': patch ---- - -Make the web settings surface use the app design tokens: token corner radii, a theme-aware switch shadow, and control sizes that grow with the UI font size. diff --git a/.changeset/web-sidebar-rows.md b/.changeset/web-sidebar-rows.md deleted file mode 100644 index d97d6551..00000000 --- a/.changeset/web-sidebar-rows.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Quieten the sidebar session rows. Hover becomes a translucent wash instead of a solid fill, the selected row becomes a faint tint instead of a solid accent, and the radius and sizing match the shared menu row, so the row scales with the UI font-size setting. The same change is applied to the per-theme overrides, so all three themes agree. diff --git a/.changeset/web-snapshot-recovery.md b/.changeset/web-snapshot-recovery.md deleted file mode 100644 index be16ad9c..00000000 --- a/.changeset/web-snapshot-recovery.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': patch ---- - -Recover the web and desktop app when a session snapshot request fails. It is now retried with a growing delay instead of leaving the todo list and the sub-agent list frozen until a reload, and a failed task refresh reports itself rather than failing in silence. diff --git a/.changeset/web-tools-settings-page.md b/.changeset/web-tools-settings-page.md deleted file mode 100644 index 06a558c6..00000000 --- a/.changeset/web-tools-settings-page.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": minor ---- - -Move the web tool picker out of the composer menu into a Tools page in settings, where the full list fits. Every tool stays on until you turn one off, and the selection still applies to the current session only. diff --git a/.changeset/web-ui-primitives.md b/.changeset/web-ui-primitives.md deleted file mode 100644 index 52279761..00000000 --- a/.changeset/web-ui-primitives.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@pymodel/pythinker-code": patch ---- - -Add four shared UI primitives to the web app: `Popover`, `MenuRow`, `SwitchToggle` and `Chip`. `Popover` holds the anchored-menu positioning that each menu used to write for itself, including the flip above the trigger and the viewport clamp. `MenuRow` carries the standard list row, sized from `--ui-font-size` so the font-size setting still scales it. All four style themselves only from theme tokens, and a guard test fails on any colour literal. diff --git a/.changeset/windows-browser-url.md b/.changeset/windows-browser-url.md deleted file mode 100644 index fe6d8441..00000000 --- a/.changeset/windows-browser-url.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@pymodel/pythinker-code': patch ---- - -Open the browser on Windows through `rundll32` instead of `cmd /c start`. `cmd` cut every URL at the first `&`, so OAuth logins reached the provider with only the first query parameter and failed with an invalid authorize request. diff --git a/apps/pythinker-code/CHANGELOG.md b/apps/pythinker-code/CHANGELOG.md index 588b706d..c3ad641b 100644 --- a/apps/pythinker-code/CHANGELOG.md +++ b/apps/pythinker-code/CHANGELOG.md @@ -1,5 +1,69 @@ # @pymodel/pythinker-code +## 0.21.0 + +### Minor Changes + +- [#100](https://github.com/PyModel/pythinker-code/pull/100) [`cba1341`](https://github.com/PyModel/pythinker-code/commit/cba13413dd3606f218cc6f1dca59a75641371c85) - Add server endpoints that list installed plugins, enable or disable one, and list subagent profiles, and let a named skill be turned off so it is hidden from the model, the slash menu and the API. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Report each model's real capabilities in the catalog. Until now `capabilities` carried only what a user had typed into their config file by hand, so for almost every model it was empty. It is now derived from the model itself when the config says nothing, while an explicit list in the config still wins. A provider whose capabilities are genuinely unknown keeps omitting the field rather than claiming the model can do nothing. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Prompt for desktop updates with a toast that offers install or skip, centre the settings button in the sidebar footer, and start a new session when the sidebar brand is clicked. + +- [#100](https://github.com/PyModel/pythinker-code/pull/100) [`cba1341`](https://github.com/PyModel/pythinker-code/commit/cba13413dd3606f218cc6f1dca59a75641371c85) - Open the web settings inside the app shell instead of over it, and add pages for plugins, skills, subagents, connectors, hooks and usage statistics. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Make `agent_config.tools` and `agent_config.mcp_servers` reach the running agent. A session profile update now persists the selection, merges each field independently so supplying one half does not clear the other, resumes an inactive session before the mutation, and applies the result through a single `setActiveTools` call. MCP server names are turned into tool patterns with the shared naming helper, so a server whose name needs sanitizing still matches its tools. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Add a capability menu to the composer. It picks which tools and MCP servers the current session may use, lists the session's skills, and turns plugins on or off. Each group states how far its change reaches, because the three differ: tool and MCP changes apply to this session at once, skills are read-only here, and plugin changes are global to the daemon. Selected tools and servers appear as chips beside the composer controls. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Add OpenAI Codex sign-in to the web and desktop app. The provider dialog now offers "Sign in with ChatGPT" next to the API-key form: the server runs the OAuth exchange, writes the credentials, and reports only which model it selected. When port 1455 is taken, the dialog asks for the redirect URL instead. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Add starter suggestions to the empty conversation screen in the web UI. Each suggestion fills the composer for editing and does not send the message. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Add, edit, and remove your own MCP servers from the connectors page in the web UI; a new or edited server starts with your next session. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Add a Retry action to the last assistant reply and a copy button to user messages in the web UI. Retry asks for confirmation, then sends the original prompt again. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Point the web provider calls at routes that exist. Adding a provider now writes through `POST /config`, refreshing reads `GET /providers/{id}`, and a new `DELETE /providers/{provider_id}` route removes a provider together with the model aliases that referenced it. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Move the web tool picker out of the composer menu into a Tools page in settings, where the full list fits. Every tool stays on until you turn one off, and the selection still applies to the current session only. + +### Patch Changes + +- [#121](https://github.com/PyModel/pythinker-code/pull/121) [`cb2ecdc`](https://github.com/PyModel/pythinker-code/commit/cb2ecdcdadb874ea30156db237461ca8f79c076e) - Say why the desktop app cannot start when another Pythinker server is already running. It now names the process, port and start time and offers Retry or Quit, in place of an exit code that explained nothing. Stopping the other server stays the user's choice. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Repaint the desktop chrome. The sidebar footer now carries a pill button, so Settings and the way back out of it match New Session and stay visible. The transcript reserves room for the floating work chips instead of letting them sit on the last line. Windows gets round window controls on the trailing edge, in place of the native caption buttons that could not be styled. + +- [#121](https://github.com/PyModel/pythinker-code/pull/121) [`cb2ecdc`](https://github.com/PyModel/pythinker-code/commit/cb2ecdcdadb874ea30156db237461ca8f79c076e) - Sign, notarize and staple the macOS disk image, so a downloaded desktop build no longer opens with a Gatekeeper warning, and keep the update metadata in step with the finished file. The install window also gets a deliberate icon layout in place of the stock one. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Keep provider and model ids exactly as you type them, open the ChatGPT sign-in window reliably, stop a second sign-in attempt from holding the callback port, hide provider errors behind a safe message, and finish writing the event journals during shutdown. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Keep provider and model ids exactly as written when a config patch is saved, so an id containing an underscore still resolves. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Stop the session snapshot request from timing out on busy sessions. Each recorded event no longer pays a fresh file open and close, the watermark is read without waiting for pending writes, and the session list is scanned in parallel, so opening or refreshing a session stays fast even with a long history. This was most visible on Windows, where the per-event file cost is highest. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Show the sign-in state, the provider, and the model as separate fields in the web settings account section, and label the button for what it opens. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Fix web capability and retry controls: the capability panel takes keyboard focus when it opens, Retry stays reachable with Tab, rapid capability toggles reach the daemon in order, and retrying a prompt keeps its attachments. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Widen the chat reading column to 928px and restyle the composer card: a 24px radius, a translucent blurred surface, a border that strengthens on hover and focus, and an input that grows to 384px before it scrolls. The toolbar controls are 30px circles with a divider after the attachment button. + +- [#122](https://github.com/PyModel/pythinker-code/pull/122) [`5f51b83`](https://github.com/PyModel/pythinker-code/commit/5f51b83531fdc3a39ae1e5c9d9adba2cb24eb658) - Lay the MCP server form out in even rows instead of a ragged grid, and stop the provider manager header and footer from squaring off the dialog corners. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Clean up the web composer capability control: the selected tools no longer render as chips in the toolbar, the button reads "Connectors", and the menu panel stays inside the window when its content loads. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Show model capabilities as badges in the model picker instead of a comma-separated string, and bring its rows and search field onto the app's row metrics, sized from `--ui-font-size` so the font-size setting still scales them. A model that reasons adaptively is now distinguishable from one that exposes an explicit thinking capability, and an unrecognised capability still renders rather than being dropped. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Make the web settings surface use the app design tokens: token corner radii, a theme-aware switch shadow, and control sizes that grow with the UI font size. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Quieten the sidebar session rows. Hover becomes a translucent wash instead of a solid fill, the selected row becomes a faint tint instead of a solid accent, and the radius and sizing match the shared menu row, so the row scales with the UI font-size setting. The same change is applied to the per-theme overrides, so all three themes agree. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Recover the web and desktop app when a session snapshot request fails. It is now retried with a growing delay instead of leaving the todo list and the sub-agent list frozen until a reload, and a failed task refresh reports itself rather than failing in silence. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Add four shared UI primitives to the web app: `Popover`, `MenuRow`, `SwitchToggle` and `Chip`. `Popover` holds the anchored-menu positioning that each menu used to write for itself, including the flip above the trigger and the viewport clamp. `MenuRow` carries the standard list row, sized from `--ui-font-size` so the font-size setting still scales it. All four style themselves only from theme tokens, and a guard test fails on any colour literal. + +- [#119](https://github.com/PyModel/pythinker-code/pull/119) [`0871533`](https://github.com/PyModel/pythinker-code/commit/08715330b820800414345991f9dc616aa15ca824) - Open the browser on Windows through `rundll32` instead of `cmd /c start`. `cmd` cut every URL at the first `&`, so OAuth logins reached the provider with only the first query parameter and failed with an invalid authorize request. + ## 0.20.0 ### Minor Changes diff --git a/apps/pythinker-code/package.json b/apps/pythinker-code/package.json index a826846d..75f2fe4b 100644 --- a/apps/pythinker-code/package.json +++ b/apps/pythinker-code/package.json @@ -1,6 +1,6 @@ { "name": "@pymodel/pythinker-code", - "version": "0.20.0", + "version": "0.21.0", "description": "The Starting Point for Next-Gen Agents", "license": "MIT", "author": "Pythoughts",