Uh oh!
There was an error while loading. Please reload this page.
fix(brand): regenerate all pythinker icons from the unclipped vector master - #131
Conversation
…resh Continue the 2026-08 upstream sync branch: brand refresh for the CLI terminal interface (welcome panel, animated robot mark, Braille activity indicators, shimmer thinking states, headless output flushing), web app brand and i18n cleanup (drop zh locales - Pythinker ships English-only), and post-merge test reconciliation across packages.
Resolve 75 conflicts per scripts/upstream-sync/README.md: vendor wins dist-web bundle, docs/zh, and changeset removal; regenerated wire/state manifests; fork keeps web entrypoint, vscode 0.9.2 (0.7.1 changelog entry spliced), and identity sections of AGENTS.md merged with upstream's new project map. Audits pass (residue, brand, English-only, managed-service, web test tooling). Known non-green gates are pre-existing or vendor-inherited: 2 typecheck errors and 8 sherif mismatches reproduce at pre-merge HEAD; 8 test failures (fullCompaction/loop/tool) reproduce on the pristine vendor snapshot.
Pythinker ships as a fresh app with no existing users, so the Kimi-era migration story is dead code: drop packages/migration-legacy, the CLI migrate command, startup migration detection, the migration screen and badge, and their tests and docs. Update flake.nix workspace lists and regenerate the lockfile.
The sessionLegacy/authLegacy directories carried live product surface,
not compat code: the /auth, /sessions/{id}/status, and /sessions/{id}/goal
REST endpoints and the session wire schemas kap-server types on. Move the
schemas to app/auth and app/sessionManager, rename the services to
SessionStatusService and AuthStatusService (identical behavior, DI scope,
and wire contract), repoint kap-server, and delete the legacy-named
directories. No legacy-named identifiers remain outside the external ACP
terminalAuthLegacyCommand protocol field.Rename the runtime package to agent-gateway and update every build, transport, client, workspace, Nix, and validation reference so the package identity is consistent.
Add agent-driven Dynamic Workflow state, session administration surfaces, transcript replay coverage, provider fixes, and the matching generated web bundle.
Track release guidance and PR gates, remove machine-specific hook paths, align the supported Node version, and normalize remaining workspace tool versions.
Restore the error-severity mapping for session warnings, the collapsed thinking "(N more lines, ctrl+o to expand)" hint, and the narrow-terminal welcome Model line the upstream port dropped; restore the exhaustive provider-type guard in the ACP auth gate. Move the reworked custom-theme token table to the loaded agent-core-v2 skill copy and revert the dead v1 copy to its vendor state. Remove dead code (renderDanceWelcomeHeader, moon-spinner aliases, unused device-headers export) and stale X-Msh header comments.
…, and CDN capability installers
…install/banner endpoints
Fork from a turn passes turnIndex instead of misusing it as the new session id; resume requests subagent replay records; the replay adapter matches the engine's AgentDynamicWorkflow tool and renders shell_command and plugin_command origins as user turns again; MCP list calls carry the workspace cwd and strip nested plugin origin details; the login context recognizes OAuth-only providers; a model's top thinking tier stays session-only and alias overrides resolve through effectiveModelAlias. Replace the any-typed SDK aliases in the four carrier files with the real @pymodel/pythinker-code-sdk types so the compiler enforces these contracts, and cover each repair with a host test that fails on the unfixed source.
Phase 1 of the reference composer/status UI port: replace the diverged token layer in style.css with the reference values wholesale (Inter font stack kept), drop the dead deepseek-vendored styles/ files, add WorkPill, WorkPanelHead, and FilterControl primitives, and add the i18n keys the dock/composer port needs.
Phase 2 of the reference composer/status UI port: ChatDock now renders the collapsed WorkPill bar (goal/plan/bash/subagent/todos) with pop-up work panels, typed panel heads with task filters, and goal/plan as dock panels; GoalStrip is replaced by the goal pill + panel. Adds GoalPanel, PlanPanel, and SubagentGrid, aligns TasksPane/TodoCard with the reference, and wires planArmed, sessionPlans, dynamicWorkflowIndex, and dock-panel state through the client composable and panes.
Phase 3 of the reference composer/status UI port: Composer now matches the reference structure — data-driven add menu with scroll thumb, inline wm-pill work-mode chip with textarea indent, permission pill/dropdown with measured description width, workflow chip, context ring group, model pill with starred/provider/thinking/cache dropdown sections, and working-gated stop button. StatusPanel regains the workflow-mode row. Adds the missing permission/trash icons and the xs segmented size.
The confirm dialog showed the raw dynamic_workflow identifier and merged title+message into one string; the reference splits them.
The rebase onto the advanced sync branch auto-merged both sides' TaskItem additions; keep one declaration and prefer the wire-provided index over the synthetic per-session numbering.
Dynamic Workflow no longer has a manual composer toggle: the add-menu row and dismiss control are gone, /workflow routes to the daemon like any command, and the chip renders read-only from the agent-set session state. The subagent dock panel test now guards the SubagentGrid panel surface.
# Conflicts: # apps/pythinker-code/dist-web/assets/CodeBlockNode-EUGAgT_h.js # apps/pythinker-code/dist-web/assets/Tooltip-82qTSfby.js # apps/pythinker-code/dist-web/assets/Tooltip-OrMK9Tfr.js # apps/pythinker-code/dist-web/assets/Tooltip-YQT_xjmY.js # apps/pythinker-code/dist-web/assets/abnfDiagram-VRR7QNED-BN8tpheJ.js # apps/pythinker-code/dist-web/assets/arc-myf2kRJl.js # apps/pythinker-code/dist-web/assets/architectureDiagram-ZJ3FMSHR-C9XZJvH9.js # apps/pythinker-code/dist-web/assets/blockDiagram-677ZJIJ3-DAH71x1Q.js # apps/pythinker-code/dist-web/assets/c4Diagram-AAUBKEIU-Bn66tWHC.js # apps/pythinker-code/dist-web/assets/c4Diagram-LMCZKHZV-COaaUOdd.js # apps/pythinker-code/dist-web/assets/c4Diagram-LMCZKHZV-Pb2vyZDT.js # apps/pythinker-code/dist-web/assets/chunk-2J33WTMH-GPvYA67k.js # apps/pythinker-code/dist-web/assets/chunk-2Q5K7J3B-BGw8VEOT.js # apps/pythinker-code/dist-web/assets/chunk-2Q5K7J3B-vvrZ7MG7.js # apps/pythinker-code/dist-web/assets/chunk-32BRIVSS-CZoTGle4.js # apps/pythinker-code/dist-web/assets/chunk-32BRIVSS-OEA_sg25.js # apps/pythinker-code/dist-web/assets/chunk-4BX2VUAB-N1-cCPJQ.js # apps/pythinker-code/dist-web/assets/chunk-55IACEB6-CQ6leVBO.js # apps/pythinker-code/dist-web/assets/chunk-5VM5RSS4-BxdGGlTY.js # apps/pythinker-code/dist-web/assets/chunk-5VM5RSS4-KnT0i4wx.js # apps/pythinker-code/dist-web/assets/chunk-727SXJPM-DR7QQbym.js # apps/pythinker-code/dist-web/assets/chunk-EX3LRPZG-CfpEIqXB.js # apps/pythinker-code/dist-web/assets/chunk-FMBD7UC4-BSILBHwL.js # apps/pythinker-code/dist-web/assets/chunk-JWPE2WC7-D0FrOBtU.js # apps/pythinker-code/dist-web/assets/chunk-JWPE2WC7-DYhWNXPR.js # apps/pythinker-code/dist-web/assets/chunk-MOJQB5TN-BWl8WxOI.js # apps/pythinker-code/dist-web/assets/chunk-ND2GUHAM-mqzqn2fR.js # apps/pythinker-code/dist-web/assets/chunk-QZHKN3VN-BLVPTWQo.js # apps/pythinker-code/dist-web/assets/chunk-RYQCIY6F-DPVXfp-M.js # apps/pythinker-code/dist-web/assets/chunk-V7JOEXUC-CfSRFy1I.js # apps/pythinker-code/dist-web/assets/chunk-V7JOEXUC-CySsnTrI.js # apps/pythinker-code/dist-web/assets/chunk-VR4S4FIN-CTR9P-lT.js # apps/pythinker-code/dist-web/assets/chunk-VR4S4FIN-Co_Tl-Vk.js # apps/pythinker-code/dist-web/assets/chunk-XXDRQBXY-BeefoqH0.js # apps/pythinker-code/dist-web/assets/chunk-XXDRQBXY-oeuDpJ1n.js # apps/pythinker-code/dist-web/assets/cose-bilkent-JH36ORCC-Br_qiVSQ.js # apps/pythinker-code/dist-web/assets/cynefin-VYW2F7L2-BGL2vhde.js # apps/pythinker-code/dist-web/assets/cynefinDiagram-TSTJHNR4-qBwjxYIX.js # apps/pythinker-code/dist-web/assets/dagre-VKFMJZFB-LDM5VIAI.js # apps/pythinker-code/dist-web/assets/diagram-FQU43EPY-Cz_FyLQ0.js # apps/pythinker-code/dist-web/assets/diagram-FQU43EPY-D5pIW94l.js # apps/pythinker-code/dist-web/assets/diagram-G47NLZAW-Xp-lqyAs.js # apps/pythinker-code/dist-web/assets/diagram-KO2AKTUF-C1Qlam7D.js # apps/pythinker-code/dist-web/assets/diagram-NH7WQ7WH-arIhWcCl.js # apps/pythinker-code/dist-web/assets/diagram-OA4YK3LP-DRlqkiV7.js # apps/pythinker-code/dist-web/assets/diagram-WEI45ONY-zMSIhP2J.js # apps/pythinker-code/dist-web/assets/ebnfDiagram-CCIWWBDH-CxhfT5Dk.js # apps/pythinker-code/dist-web/assets/erDiagram-Q63AITRT-qDRc-Mjq.js # apps/pythinker-code/dist-web/assets/flowDiagram-23GEKE2U-CLFIXYkh.js # apps/pythinker-code/dist-web/assets/ganttDiagram-NO4QXBWP-CWQOrsH8.js # apps/pythinker-code/dist-web/assets/gitGraphDiagram-IHSO6WYX-DT7ncN8L.js # apps/pythinker-code/dist-web/assets/index-B1Lv4fZ5.js # apps/pythinker-code/dist-web/assets/index-C10HMhsQ.js # apps/pythinker-code/dist-web/assets/index-C6iX4-LJ.js # apps/pythinker-code/dist-web/assets/index-CDF-FRTI.js # apps/pythinker-code/dist-web/assets/index-DXophRCW.js # apps/pythinker-code/dist-web/assets/index10-BY9KLppN.js # apps/pythinker-code/dist-web/assets/index10-D6em_7oU.js # apps/pythinker-code/dist-web/assets/index10-D7kxh5_1.js # apps/pythinker-code/dist-web/assets/index11-D6nykIM1.js # apps/pythinker-code/dist-web/assets/index5-BMbNtxz8.js # apps/pythinker-code/dist-web/assets/index5-BqWCpPta.js # apps/pythinker-code/dist-web/assets/index5-D0Y6cLP4.js # apps/pythinker-code/dist-web/assets/index6-BxhYzglI.js # apps/pythinker-code/dist-web/assets/index6-Df7o-fck.js # apps/pythinker-code/dist-web/assets/index6-It9n1WlQ.js # apps/pythinker-code/dist-web/assets/index7-3cymNRfD.js # apps/pythinker-code/dist-web/assets/index7-CK_1qBRq.js # apps/pythinker-code/dist-web/assets/index7-Dq7w6Ou1.js # apps/pythinker-code/dist-web/assets/index8-A6tHiYNy.js # apps/pythinker-code/dist-web/assets/index8-CdUxL-Tk.js # apps/pythinker-code/dist-web/assets/index8-Cvw_4o5s.js # apps/pythinker-code/dist-web/assets/infoDiagram-FWYZ7A6U-DmW-BDHY.js # apps/pythinker-code/dist-web/assets/ishikawaDiagram-FXEZZL3T-Cj6vMwhM.js # apps/pythinker-code/dist-web/assets/ishikawaDiagram-FXEZZL3T-DJxuDwZK.js # apps/pythinker-code/dist-web/assets/ishikawaDiagram-YF4QCWOH-C5OstRVV.js # apps/pythinker-code/dist-web/assets/journeyDiagram-5HDEW3XC-BXVdGyDj.js # apps/pythinker-code/dist-web/assets/journeyDiagram-5HDEW3XC-CSITOLjm.js # apps/pythinker-code/dist-web/assets/journeyDiagram-JHISSGLW-C6fIxrE1.js # apps/pythinker-code/dist-web/assets/kanban-definition-HUTT4EX6-B6mC5age.js # apps/pythinker-code/dist-web/assets/kanban-definition-HUTT4EX6-UFjkX9sE.js # apps/pythinker-code/dist-web/assets/kanban-definition-UN3LZRKU-CxBCv27E.js # apps/pythinker-code/dist-web/assets/linear-DFIFDLPn.js # apps/pythinker-code/dist-web/assets/linear-W1Q9_YQy.js # apps/pythinker-code/dist-web/assets/linear-oD38CRgN.js # apps/pythinker-code/dist-web/assets/mermaid.core-BKBZnrB_.js # apps/pythinker-code/dist-web/assets/mindmap-definition-LN4V7U3C-BJ3IKEAm.js # apps/pythinker-code/dist-web/assets/mindmap-definition-LN4V7U3C-dirTUANL.js # apps/pythinker-code/dist-web/assets/mindmap-definition-RKZ34NQL-Pv1eAiXf.js # apps/pythinker-code/dist-web/assets/pegDiagram-2B236MQR-D_Imjl5d.js # apps/pythinker-code/dist-web/assets/pieDiagram-ENE6RG2P-Bma7UCRc.js # apps/pythinker-code/dist-web/assets/quadrantDiagram-ABIIQ3AL-AdbtQLWr.js # apps/pythinker-code/dist-web/assets/quadrantDiagram-ABIIQ3AL-Bsu7wK7n.js # apps/pythinker-code/dist-web/assets/quadrantDiagram-W4KKPZXB-CeDZakkt.js # apps/pythinker-code/dist-web/assets/railroadDiagram-RFXS5EU6-DFGDBfNL.js # apps/pythinker-code/dist-web/assets/requirementDiagram-4Y6WPE33-CZrxH1Y2.js # apps/pythinker-code/dist-web/assets/requirementDiagram-TGXJPOKE-BM1jojUv.js # apps/pythinker-code/dist-web/assets/requirementDiagram-TGXJPOKE-BZvHmdwX.js # apps/pythinker-code/dist-web/assets/sankeyDiagram-HTMAVEWB-CVUG-8BS.js # apps/pythinker-code/dist-web/assets/sequenceDiagram-DBY2YBRQ-UDhAaHfs.js # apps/pythinker-code/dist-web/assets/sizeCapture-X5ZJPWSS-DkAB-D09.js # apps/pythinker-code/dist-web/assets/stateDiagram-2N3HPSRC-C83-b98K.js # apps/pythinker-code/dist-web/assets/swimlanes-5IMT3BWC-CfDcaFta.js # apps/pythinker-code/dist-web/assets/timeline-definition-FHXFAJF6-B-aR9mhp.js # apps/pythinker-code/dist-web/assets/timeline-definition-FHXFAJF6-XtYhpb6F.js # apps/pythinker-code/dist-web/assets/timeline-definition-PNZ67QCA-DsVZdrZa.js # apps/pythinker-code/dist-web/assets/vennDiagram-L72KCM5P-55dVqqaA.js # apps/pythinker-code/dist-web/assets/vue.runtime.esm-bundler-BkbLUR3B.js # apps/pythinker-code/dist-web/assets/vue.runtime.esm-bundler-C_QWhoww.js # apps/pythinker-code/dist-web/assets/vue.runtime.esm-bundler-GBqFmpyQ.js # apps/pythinker-code/dist-web/assets/wardleyDiagram-EHGQE667-Ip7Q1iRO.js # apps/pythinker-code/dist-web/assets/wardleyDiagram-EHGQE667-ihWsF2Mb.js # apps/pythinker-code/dist-web/assets/wardleyDiagram-YWT4CUSO-BFmt5JeZ.js # apps/pythinker-code/dist-web/assets/xychartDiagram-FW5EYKEG-D5HV8EjG.js # apps/pythinker-code/dist-web/index.html # apps/vscode/webview-ui/src/components/QuestionDialog.tsx # packages/agent-core-v2/docs/state-manifest.d.ts # packages/agent-core-v2/docs/wire-manifest.d.ts # packages/agent-core-v2/test/agent/fullCompaction/fullCompaction.test.ts # packages/agent-core-v2/test/agent/loop/loop.test.ts # packages/agent-core-v2/test/tool/tool.test.ts # packages/agent-gateway/src/routes/action-dispatch.ts # packages/agent-gateway/src/routes/modelCatalog.ts # packages/agent-gateway/src/routes/sessions.ts
(cherry picked from commit 583eed8)
… 0.37.2 vendor merge
Rename @pymodel/kaos to @pymodel/pyaos repo-wide: package directory,
symbol families (Pyaos/LocalPyaos/SSHPyaos/PyaosError, ALS shims),
PYAOS_* env vars, build configs, flake.nix, and docs.
Back-compat: the mcp.json stdio executor value 'kaos' stays accepted as
a deprecated alias normalized to 'pyaos' in all three schemas, and the
SDK createSession/resumeSession still accept legacy {kaos,
persistenceKaos} params, each covered by unit tests.
Add kaos->pyaos RENAME rules to scripts/upstream-sync/rebrand.mjs so
future vendor snapshots arrive pre-renamed, and a residue guard in
check-managed.mjs allowing only the alias surfaces. pnpm-lock.yaml
regenerated; flake pnpmDeps hash verified unchanged via nix build.…ll deltas P5 of the replica plan (report kimirep-1 §4): - W1: self-host Schibsted Grotesk Variable (regular+italic woff2 from the reference bundle), swap --font-ui-latin/--font-kbd; drop Inter imports - W2: mention model ([name](encoded-path) wire format) + ComposerText pill renderer with per-extension file icons, openFile wiring, copy-as-text; composer @-select now inserts serialized mentions - ApprovalCard plan/diff/file expand-collapse fold (approval.expandPlan/ collapsePlan), DiffView file-count plurals, ModelPicker localized capability chips, MentionMenu i18n additions - Onboarding dialog: real brand asset replaces the placeholder glyph; theme labels renamed Moon Bright/Moon Dark -> Light/Dark - fix pre-existing gate breaks: two oxlint errors (eqeqeq, no-useless- spread) and the unclosed @Keyframes block at style.css EOF that broke vite dev Verified: web suite 717 tests, vue-tsc, check:style, root lint 0 errors, visual boot on vite dev (fonts loaded, console clean).
Update the official datasource plugin to 3.4.0: wider description in the plugin manifest, refreshed skill doc, and extra sources in the launch script.
Narrow engines.node to the supported Node 24 release line, update the AGENTS/README requirement notes and the dependabot comment, and reflect the range in flake.nix nodejs_24 pinning.
Switch the pinned runtime from nodejs_26 to nodejs_24 and fail evaluation when the pinned nixpkgs is outside the supported 24.x range.
Advance agent-core-v2 to 0.4.1 and node-sdk to 0.19.1 with their changelog entries, refresh the agent-core-v2/agent-core/gateway AGENTS notes, and regenerate the pnpm lockfile.
Record the CLI 0.38.0 changelog and web manifest refresh; pin the full- screen TUI off in the CLI vitest env so message-flow tests run stably.
Update the en/zh configuration and env-vars docs for the region-aware endpoints, keyboard reference, server API surface (session grouping, archived/workspace events), plugin docs, and the zh release notes.
Re-bundle apps/pythinker-web into dist-web with the transcript, session, settings and composer parity work plus the neutral grey dark theme, update index.html entry, and add the light welcome-panel hero image for the refreshed CLI home screen.
Drop a stale scoped css rule, use a ReadonlySet for color-scheme values, and tighten surrogate-pair indexing in the inline-math highlighter.
Re-render the state and wire manifests after the goal/token-counting/ usage moves (agent keys 99→94, session/token/usage surface reshuffled) and fix the generator output.
Remove the eleven changesets already consumed by the v0.38.0 release and add the eleven new ones for the remaining port work (web session/ settings/transcript/composer parity and fixes, marketplace entries, git-bash path bridge, archive-missing-workspace, subagent inspector and fork context, task notifications, mobile shell, model/perm/composer fixes).
Re-bundle pythinker-web into dist-web (new asset hashes, entry index updated in index.html) so the CLI ships the latest transcript/session/ settings/composer surface.
Add the straggler provider-setup form component (handles the app provider catalog minus managed pythinker/pythoughts entries) and its passing test, left over in the working tree.
…sed ids Late buffered progress and queued re-spawns must not resurrect a completed subagent task: the projector keeps the terminal status when a running patch arrives for a finished id, and the reducer clears accumulated output when an explicit spawn starts a new run for a terminal id.
The component imported AppProviderSetup from ../api/types, which no longer exists. Declare a local structural ProviderSetupCatalogItem interface for the catalog prop instead.
Refresh the prebuilt web bundle for the subagent status fix and ProviderSetupForm change (commits for the web source land separately).
Replace the inflight-write counter with a single-flight queued writer so concurrent register/update calls serialize their disk writes and the latest port always wins, and the heartbeat test is deterministic via fake timers.
…ojection Drop the subagent lifecycle types from TRANSCRIPT_PROJECTED_EVENT_TYPES so spawn/start/suspend/complete/fail keep flowing to transcript-graded connections as session events, and cover terminal delivery after a running snapshot with a test.
…on field The timed and settled result shapes declare reason, but the rejection paths were populating error; align the emitted objects with the declared types.
Add unit tests for mime alias canonicalization, byte sniffing over a wrong label, and the unsupported-format text replacement.
…master The raster set was derived from a logo.png whose artwork was clipped at all four edges (navy outline touching the canvas). Regenerate favicon.ico (16/32/48), apple-touch-icon, icon-192/512, the square logo.png, and the vscode/desktop copies from brand/icon.svg with one sizing policy: content at 88% of a transparent square. Add site.webmanifest and standard head links. Note: dist-web bundle is intentionally not included here; it lands as its own chore(web) rebuild commit.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Important Review skippedToo many files! This PR contains 1996 files, which is 1696 over the limit of 300. To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (123)
📒 Files selected for processing (1996)
You can disable this status message by setting the |
commit: |
Uh oh!
There was an error while loading. Please reload this page.
…og (#136) ## Related Issue None — continuation of the brand-icons line merged in #131 (same author, internal PR). ## Problem The remaining work on the `fix/modelsdev-provider-refresh` line had no PR: nine commits layered on the #131 tip plus uncommitted follow-up work. It carries the models.dev provider-refresh fix, web UI polish (thinking block, composer, onboarding/providers), file-type icons for the transcript, and an LLM stream-idle watchdog. ## What changed - Cherry-picked the nine branch commits onto current main: models.dev-sourced provider refresh on the scheduled catalog pass, thinking-block rework, dynamic-workflow toggle, permission glyph, mono accent + mascot indicator, brand icons in the bundle, and bundle rebuilds. - Added the uncommitted follow-up work: file-type icons (`fileIcons` library + `material-icon-theme` mapping + generator script), onboarding/providers panel rework, and a configurable LLM stream-idle watchdog (`requestIdleTimeoutMs`, default 180s) that aborts stalled provider streams with a timeout error. - Changesets cover every user-perceivable change; the release PR will pick them up next cycle. ## Checklist - [x] I have read the [CONTRIBUTING](https://github.com/PyModel/pythinker-code/blob/main/CONTRIBUTING.md) document. - [x] I have linked a related issue (internal continuation PR, no issue). - [x] I have added tests that prove my feature works. - [x] Ran `gen-changesets` skill, or this PR needs no changeset. - [x] Ran `gen-docs` skill, or this PR needs no doc update. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added manual Dynamic Workflow controls in the composer and mobile settings. * Redesigned onboarding and provider settings with improved navigation, status feedback, and model details. * Added file-type icons, monochrome accent styling, animated thinking indicators, and mascot working states. * Reworked thinking blocks into collapsible inline panels with live elapsed timers. * Added automatic model catalog refresh and configurable stream-stall timeouts. * **Bug Fixes** * Fixed missing brand icons and subagent cards remaining stuck in “Running.” * Improved permission and background-task state synchronization. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Summary
Every pythinker raster icon was derived from a
logo.pngwhose artwork is clipped at all four edges (the navy outline color touches the canvas on top, left, right, and bottom), so the mark renders cut off at every size — favicon, PWA icons, VS Code, and desktop.This regenerates the full set from the unclipped vector master (
public/brand/icon.svg) with a single sizing policy:favicon.ico→ multi-size 16/32/48 (was a single 48)apple-touch-icon.png180,icon-192.png,icon-512.pnglogo.png→ square 1024 (was portrait 822×1025, which also distorted `GlobalLoading.vue``s fixed 120×120 box)public/andpublic/brand/copies kept byte-identicalicon.ico(16–256 multi-size),pythinker-logo.png, marketplacepythinker-icon-storefront.pngbuild/icon.png1024site.webmanifest+ standard head links (svg icon, apple-touch-icon, manifest)Test plan
pnpm --filter @pymodel/pythinker-web run test— 829/829 passedapps/desktop/tests/packaging-config.spec.ts— icon sha256 pin updated to the regenerated artifact; 10/10 passed