WayJ/dsh-work--plugins-brand-profile0

brand-profile

DSH Web GUI brand customization: configure the sidebar brand mark/name, the new-session hero logo & headline, the running-turn thinking label, and the browser tab title from a General Settings row.

包名
brand-profile
版本
0.1.0
许可证
MIT
最近更新
2026年9月12日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:WayJ/dsh-work#fc381507d1a812baf4387d824c6aaf3962941cb3&path:plugins/brand-profile

description: "brand-profile: configurable brand surfaces for the dsh Web GUI — sidebar mark/name, hero mark/headline, thinking label, and tab title, edited from a General Settings row." kind: "package-reference"

brand-profile

中文 | English

Overview

brand-profile is a dsh Web GUI plugin that makes every user-visible brand surface configurable from one Settings → General card:

FieldSurfaceWhen empty
Brand nameSidebar brand wordmark (expanded row)official brand name
Logo type + image URL / emojiSidebar brand mark (expanded + collapsed rail) and the new-session hero markofficial whale logo
New-session headlineBlank-session hero headline (default 探索未至之境 / Into the Unknown)official headline
Thinking labelRunning-turn status text (default 深度求索中... / Deep diving...)official label
Browser tab titledocument.titleunchanged
Browser tab iconfavicon follows the logo: image URL used directly; emoji rasterized to a 64px PNGofficial icon

All values persist in the durable brand-profile settings namespace (~/.dsh/settings.yaml) and take effect immediately — no restart. The logo emoji is picked from a popup category grid (8 curated categories, zero dependencies, with a "not set" clear entry); click the current emoji to open it.

Package layout

Mirrors the official packages/client/* plugin layout:

  • src/index.ts — host half: registers the brand-profile settings namespace.
  • src/schema.ts — schemastery durable schema (node half only; the browser bundle never depends on schemastery).
  • src/brand-settings.ts — shared field names, types, defaults, and the official-text table.
  • src/client/index.ts — browser apply: locale dictionaries, the settings card, brand slot occupants, and the DOM fallback injector.
  • src/client/policy.ts — live config snapshot store with durable write-through.
  • src/client/components.tsx — slot occupants (sidebar/hero mark, brand name).
  • src/client/settings-row.tsx — the General Settings card.
  • src/client/emoji-data.ts + src/client/emoji-picker.tsx — the logo-emoji popup picker (curated catalog + panel component).
  • src/client/dom-injector.ts — MutationObserver text replacement + tab title + favicon sync.
  • src/client/locales.ts — typed zh/en dictionaries.
  • build.mjs — esbuild build replicating the unpublished official clientBundle preset: lib/index.js (ESM host bundle) and lib/client.js (window.__ModuleLoader__.load({ id, factory }) lazy-CJS, bare specifiers external for the shell module table).

How it works

  • The sidebar brand seats are the official sidebar.brand.mark / sidebar.brand.name UI slots (kind single; lowest priority renders). This plugin registers occupants at priority: -10 to shadow the official build (which sits at 0). Empty config disposes the occupants, restoring official branding untouched.
  • The new-session hero logo rides conversation.hero.brand.mark.
  • The thinking status and hero headline are rendered through official locale dictionaries with no provider seam, so a MutationObserver replaces those exact rendered text nodes (zh and en both matched), following the proven ui-status-label approach.

Install

dsh plugin --profile web add 

or from the harness checkout CLI:

node apps/cli/lib/bin.js plugin --profile web add 

Restart dsh web (or refresh), then open Settings → General and find the brand card at the bottom. After editing sources, rebuild with node build.mjs and restart.

Remove

dsh plugin --profile web remove brand-profile

Model experience

None. The plugin is browser-side branding chrome plus one durable settings namespace; it registers no model-facing surface and sends no provider requests.

KV cache impact

None; the plugin neither assembles nor sends provider requests.

Known limitations and deferred work

  • The DOM text injector matches the exact official zh/en strings listed in src/brand-settings.ts; an upstream rewording stops the override silently until the table is updated.
  • Logo images load from the browser (URL or data URI); no host-side file route is provided yet.

MIT License