DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Dock Flash — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
D

dock-flash

Dock Flash

Quick Control dock 插件——适用于 DSH Workbench 的动态浮动快捷面板,带有可扩展的开关注册表。可独立运行,也可与 dock-base 搭配使用。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:tcgbp/dock-flash#7d4cde8462708fe7eb2123f7164cac6f53a0ccdd
README兼容性版本

兼容性与来源证明

Dock Flash 以 dock-flash 发布,当前版本为 1.3.1。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/9/20

版本

1.3.1stable
2026/9/20
1.2.0stable
2026/9/20
1.1.8stable
2026/9/20
查看其余 6 个版本收起版本
1.1.6stable
2026/9/20
1.1.4stable
2026/9/20
1.0.15stable
2026/9/20
1.0.14stable
2026/9/19
1.0.12stable
2026/9/19
1.0.11stable
2026/9/19

相关插件

正在加载相关插件…

最新版
1.3.1
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
Apache-2.0
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/9/20
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层Remote Web Ui@linxin666/dsh-remote-web-ui通过扫码配对访问 dsh Web GUI,共享一个官方界面:设置按钮旁的二维码可将手机和 PC 配对到同一个 Web GUI(手机采用竖屏触控适配层,PC 使用完整桌面界面),通过一次性令牌和 rClient Ui Git Graph@linxin666/dsh-client-ui-git-graph外部 dsh Web GUI 插件:空会话 Git 分支选择器和 Git 图,包含实际的主机端 Git 操作与防护,作为 dsh 配置文件包

README

dock-flash

Quick Control dock plugin for DSH — works standalone or with dock-base. Click the ⚡ icon to open a floating quick-control panel with an extensible switch registry that other plugins can use to register their own switches.

中文文档

Modes

ModeConditionUIAvailable Switches
Workbenchdock-base installed⚡ icon in activity bar → sidebar/floating panelAppearance + System switches
Standaloneno dock-base⚡ trigger button in the configured conversation slot (default: input right) → floating panelAppearance + Layout + System

Features

Built-in Switches

Built-in switches are grouped into Appearance / Layout / System (compact two-column layout). The Layout group appears in standalone mode only:

GroupSwitchTypeDescriptionStandalone
🎨 AppearanceThemeselectLight / Dark / System — switches DSH global theme (includes wxj-black-hole conflict retry)✅
🎨 AppearanceSkinselectDynamically discovers installed skin plugins and switches between them (requires dsh-market)✅
🎨 AppearanceTurn RailtoggleMoves DSH's built-in turn navigator from the right gutter to the left. Hidden unless DSH's own rail is on screen and no other timeline plugin owns it✅
🎨 AppearanceFullscreentoggleBrowser Fullscreen API — enter/exit fullscreen✅
🎨 AppearanceLog DownloadtoggleShow/hide the session log download button✅
📐 LayoutClose on BlurbuttongroupOff / On — auto-close the panel when clicking outside. Also a toggle in the panel header (both modes)✅
📐 LayoutTrigger PositionselectInput Left / Input Right / Session Header / Header Utils — where the standalone ⚡ trigger goes — or Conversation top-right, a floating button inside the conversation you can drag anywhere within it✅
⚙️ SystemLanguagebuttongroup中文 / English — switches DSH global UI language✅
⚙️ SystemSystem ProxyselectAll Proxy / API Bypass / All Bypass / Custom — fine-grained NO_PROXY control. Custom is validated: host / domain suffix / IP / host:port, comma- or space-separated; blank and CIDR are rejected✅
⚙️ SystemTest URLselectGoogle 204 / GitHub / DeepSeek API / Custom — the address the connection test probes, with the effective URL printed on its own wrapping line beneath the select (so a custom address is readable). Lives in the proxy cluster, which can be folded✅
⚙️ SystemDiagnostics LoglogRead-only multi-line report of the latest connection test — one fact per line. Appears the instant Test Connection is pressed, starting with the address being tried, and is replaced (never appended) as the run progresses; ✕ clears it, no 30s expiry✅

The Layout group only renders in standalone mode. In workbench mode close-on-blur exists solely as the panel-header toggle, so no built-in switch carries group: 'layout' and the category is skipped entirely.

Dock layout is not configured here. Dock edge, auto-hide, reserve space and icon scaling are dock-base's own settings — dock-flash deliberately does not duplicate them. In the Layout group dock-flash owns only trigger-position and close-on-blur, both standalone-only.

Turn Rail only offers itself while DSH's own rail is what you see. It stays hidden with no session open, in a session without turns, while DSH's own @container (width<=900px) rule hides the rail, and when another timeline plugin owns it — dsh-codex-timeline enhances the native rail in place, so the rail on screen is its surface and dock-flash must not fight it for the same edge. Type __dockFlashTurnRail() in the browser console to print the decision and its reason.

Core Capabilities

  • 🧩 Dynamic Discovery — Other plugins register their own switches through the quickControl service; the panel auto-renders them
  • 🌐 Internationalization — Full Chinese/English localization, auto-follows DSH language setting (via <html lang> MutationObserver)
  • 🎨 Skin System — Multi-layer discovery + categorized switching (CSS / Managed / Excluded)
  • 🛡️ Error Boundaries — All panel components are wrapped in PanelErrorBoundary to prevent render errors from crashing the entire dock-base WorkbenchRoot
  • 🔌 Standalone Mode — Works without dock-base: a ⚡ trigger injected into the configured conversation slot opens a floating popup panel
  • 📝 Recent Changes — Auto-records switch operations (30s TTL), displayed in "old value → new value" format
  • 🩺 Connection Diagnostics — A read-only multi-line log of the latest proxy test (route taken, redirect chain, timings, body size, socket error code), one fact per line. It appears the moment the test starts — first line naming the address being tried — and is replaced by the full report when the answer lands, never appended to
  • 🧮 Reorderable and hideable Panel — A ⇅ icon in the Workbench and Extensions tab headers opens a reorder mode: ▲▼ move groups and switches, and the result is saved in your DSH profile, so it follows you to another browser or machine. Beside it, a ◉ icon opens a visibility mode with a ●/○ box on every row: untick a switch you never use and it disappears from the panel, while staying listed here so you can bring it back. Both configuration pages list every registered control, including any a plugin is standing down right now — the turn-navigation switch while DSH's rail is absent, the proxy probe while no proxy is configured — and those rows are dimmed with the reason on hover, so a control that does not apply at the moment can still be ordered or hidden. The two modes are mutually exclusive — entering one hides the other’s button — and each has its own ↺ reset, so restoring your order never un-hides a row and showing everything never reshuffles your order. Switches that declare a cluster move as one unit with a fixed internal order and are drawn as one card whose members fold — the System proxy controls are the case that motivated it, since they only apply once a proxy is configured

Host-side Features

src/index.ts (host half) provides:

  • Registers the dock-flash settings namespace (proxyMode string + customNoProxy string + testUrl string)
  • Listens for proxy mode changes and re-installs the undici global dispatcher via @deepseek-ai/dsh-http-proxy, so outbound fetch() requests respect the user's NO_PROXY choice
  • Exposes HTTP routes:
    • GET /plugins/dock-flash/proxy-status — returns current proxyMode, customNoProxy, testUrl, and the actual NO_PROXY env value
    • POST /plugins/dock-flash/test-connection — runs the diagnostic connectivity probe; an optional { "url": "..." } body overrides the stored target

Connection Diagnostics

POST /plugins/dock-flash/test-connection returns a structured report, not a bare pass/fail:

FieldMeaning
proxy{ mode, noProxy, httpProxy, proxied, routeError } — how dsh-http-proxy would route this exact URL
redirectsthe redirect chain, walked one hop at a time (redirect: 'manual'), plus redirectLimitHit when capped
status / statusTextfinal response status — any HTTP response counts as ok, because it proves the network path works
headersMs / bodyMs / elapsedMstime to headers, time to body, and total
bodyBytes / bodySnippetbody size, plus the first 200 bytes of a textual body — which is where a corporate proxy's own "blocked" page shows up
error{ name, message, code, causeName, causeMessage, causeCode, causeErrno } — the nested undici cause is what carries ENOTFOUND, ECONNREFUSED, UND_ERR_CONNECT_TIMEOUT, DEPTH_ZERO_SELF_SIGNED_CERT, …

The panel renders this into the Diagnostics Log block, one fact per line. The block appears as soon as the test starts — its first line names the address being tried — and holds the latest run only: each test replaces it rather than appending, because the panel is short and a wall of history buries the run just asked for.

The test target is a setting, never a constant. testUrl defaults to https://www.google.com/generate_204 and is stored in the DSH profile on disk, so an internal endpoint can be configured without appearing in this repository.

Proxy Mode Options

ModeNO_PROXYEffect
All Proxy(removed)All traffic goes through the system proxy
API Bypassapi.deepseek.com,chat.deepseek.comDeepSeek API calls bypass the proxy
All Bypass*All traffic bypasses the proxy (direct connection)
Custom(user-defined)User specifies the NO_PROXY value via a prompt

Proxy Scope

This setting only affects fetch() requests within the DSH Node.js process.

  • ✅ Affected: Node.js built-in fetch() (undici), DSH API calls, MCP HTTP transport, pi-ai provider, and any SDK that reaches globalThis.fetch
  • ❌ Not affected: Requests via node:http/node:https modules (e.g. OTLP telemetry), SDKs that build their own transport (e.g. E2B), the operating system's other applications, browsers, or other terminal sessions
  • The setting works identically on Windows, macOS, and Linux — it modifies process.env and the undici global dispatcher, both of which are Node.js abstractions with no OS-specific behavior

Structure

src/index.ts      HOST half — settings namespace + proxy mode + connection test (tsc → dist/)
lib/client.js     BROWSER half — quickControl registry + dynamic panel + skin system + i18n
cordis.patch.yml  bundle layer — inserts host rows into profile

Plugin Contract

When dock-base is installed, this plugin follows the dock-base plugin contract, interacting through ctx.workbench methods:

RegistrationAPIDescription
Sidebar Panelctx.workbench.registerPanel()Quick control panel (sideBar area)
Activity Bar Itemctx.workbench.registerActivityBarItem()Lightning icon ⚡, click to open sidebar
Editor Viewctx.workbench.registerEditorView()Quick control panel (draggable to floating window)
Commandctx.workbench.registerCommand()dock-flash:openQuickControl command
Quick Control Registryctx.provide('quickControl', registry)For other plugins to register switches

When dock-base is not installed, dock-flash automatically enters standalone mode: it mounts a floating ⚡ trigger button and popup panel directly in the DOM, providing access to all non-layout switches.


🧩 Dynamic Discovery API

This plugin publishes the quickControl service to WorkbenchContext. Other plugins obtain the registry via ctx.get('quickControl') and register their own switches.

Switch Types

TypeDescriptionRequired Fields
toggleBoolean switchgetValue(), setValue(boolean)
sliderNumeric slidergetValue(), setValue(number), min, max, step
selectDropdown selectgetValue(), setValue(any), options
buttongroupButton groupgetValue(), setValue(any), options
actionAction buttonrun()

QuickSwitchDefinition

interface QuickSwitchOption {
  label: string | (() => string)
  value: any
}

interface QuickSwitchDefinition {
  /** Globally unique id; use "plugin:switch" format, e.g. "dock-git:show-stash" */
  id: string
  /** Display label (supports functional i18n) */
  label: string | (() => string)
  /** Icon (emoji or text) */
  icon?: string
  /** Switch type */
  type: 'toggle' | 'slider' | 'select' | 'buttongroup' | 'action'
  /** Sort weight (ascending); built-in items use 10-60, start from 100 */
  order?: number
  /** Built-in group: 'appearance' | 'layout' | 'system' (only for dock-flash:* items; ignored by third-party switches) */
  group?: string
  /**
   * Optional cluster label. Switches sharing a label are drawn as ONE card and
   * reordered as one unit (a single ▲▼ pair), keeping a fixed internal order —
   * their `order` field. The card opens folded to its head row and its members
   * can be revealed behind a centred ▼/▲ toggle on the card's bottom edge: a cluster never disappears on its own, so
   * the panel's structure and the saved order survive a condition coming or going.
   */
  cluster?: string

  // ── Common to toggle / slider / select / buttongroup ──
  getValue?: () => any
  setValue?: (value: any) => void

  // ── Slider-specific ──
  min?: number
  max?: number
  step?: number
  formatLabel?: (value: number) => string

  // ── Select / buttongroup-specific ──
  options?: QuickSwitchOption[] | (() => QuickSwitchOption[])

  // ── Action-specific ──
  run?: () => void | Promise<void>
  actionLabel?: string
  /** Drop the title column and let the button fill the row (button carries the wording) */
  hideLabel?: boolean
}

Registration Example

// In another plugin's client.js factory:
exports.inject = ['quickControl']   // ← declare service dependency

exports.apply = function (ctx) {
  const registry = ctx.get('quickControl')

  ctx.effect(() => {
    const dispose = registry.registerSwitch({
      id: 'dock-git:show-stash',
      label: 'Show Stash',
      icon: '📦',
      type: 'toggle',
      order: 100,
      getValue: () => myGitState.showStash,
      setValue: (v) => { myGitState.showStash = v },  // only update state; panel handles UI
    })
    return dispose  // auto-unregister on dispose
  }, 'dock-git: quick-control switch')
}

Service Dependency Declaration

Third-party plugins must declare a dependency on the quickControl service so dock-flash finishes registration before apply() is called. Add exports.inject in the client half:

// client.js — inside factory
exports.inject = ['quickControl']   // ← must declare, otherwise service may not be ready
exports.apply = function (ctx) {
  const registry = ctx.get('quickControl')  // service is ready, no null check needed
  // …
}

Also declare the module-level dependency in package.json's dsh.client.inject to ensure dock-flash's client script loads before your plugin:

{
  "dsh": {
    "client": {
      "inject": ["@deepseek-ai/dsh-client-runtime", "dock-flash/client"]
    }
  }
}

Dynamic Value Updates

If a switch's value changes outside the panel (e.g. timers, server push, other UI actions), call registry.notifyChange(id) to trigger a panel refresh:

const registry = ctx.get('quickControl')
// Some async event changed the value
myGitState.showStash = true
registry?.notifyChange('dock-git:show-stash')

Note: When the user operates a switch in the panel, dock-flash automatically refreshes that switch's UI — no need to call notifyChange manually. Only use this method for value changes that the panel cannot detect.

Changelog

The panel automatically logs every user interaction (toggle click, slider drag, option select, buttongroup/action click) in the "Recent Changes" tab (auto-expires after 30s).

Plugins should NOT manually call _notifyChange. The panel injects _notifyChange into each switch during rendering and calls it automatically on user interaction. setValue() only needs to update internal state:

// ✅ Correct: setValue only updates state
setValue: (v) => { myState = v }

// ❌ Wrong: don't call _notifyChange in setValue (causes duplicate entries)
setValue: (v) => { myState = v; sw._notifyChange?.('old', 'new') }

_notifyChange(oldDisplay, newDisplay) should only be used when a plugin proactively changes state (not from user panel interaction) and needs to record it in the changelog, e.g.:

// Timer auto-switches to dark mode
setTimeout(() => {
  state.darkMode = true
  const sw = registry.getSwitches().find(s => s.id === 'my-plugin:auto-dark')
  sw?._notifyChange('Light', 'Dark')
}, 3600000)

Grouping Rules

The panel uses a collapsible tab layout:

  • ⚡ Workbench — Built-in switches (ids starting with dock-flash:), grouped by group field into Appearance / Layout / System subgroups. In workbench mode the Layout subgroup is empty and is not rendered, because dock-base's own settings already own every dock layout property.
  • 🧩 Extensions — Third-party switches (ids not starting with dock-flash:), automatically grouped by id colon prefix (plugin name)
  • 📝 Recent Changes — Switch change records from the last 30 seconds

Rule: id.startsWith('dock-flash:') is built-in, otherwise third-party. The group field on third-party switches is currently ignored; they are all placed in the Extensions tab grouped by source plugin.

Within the same group, switches are sorted by order ascending.

quickControl Service API

MethodDescription
registerSwitch(def)Register a switch, returns a dispose function
unregisterSwitch(id)Unregister by id
getSwitches()Get all switches (sorted by order ascending)
notifyChange(id)Notify that a switch's value changed, triggers panel refresh
recordChange(entry)Record a changelog entry { id, label, icon, oldDisplay, newDisplay }
getChangelog()Get change records from the last 30 seconds
subscribe(fn)Subscribe to registry/value changes, returns a dispose function
versionCurrent registry version number (incremented on every change)

🎨 Skin System

The skin switcher requires dsh-market to be installed — without it the switcher is not shown (disabled themes are invisible to DOM scan and the list would be incomplete).

Skin Categories

CategoryDescriptionExamples
CSSActivated via <style> / <link> tags + body attributesmaid-atelier, official-homepage
ManagedOwn lifecycle with canvas/WebGL/particles; toggled through mount() / unmount()Mineradio
ExcludedMatched by discovery but hidden from the dropdown (conflicting or unreliable for external control)bloom-theme, black-hole, theme-manager

dsh-market Integration

  • Fetches the full list of installed/disabled themes (/dsh-market/installed API)
  • Market-managed themes are activated via the /dsh-market/use-skin API (triggers a page refresh)
  • Market-disabled themes are labeled "Not Enabled" in the dropdown

Preference Persistence

Skin selection, panel order and the standalone trigger position are saved to the host settings namespace (dock-flash in your profile's settings.yaml), and restored on load. localStorage is kept only as a cache, so these preferences follow you to another browser or machine rather than staying behind with the browser profile. Values that predate this (still in localStorage only) are migrated into the profile once, on first load.

For implementation details, switching mechanisms, exclusion rationale, and technical constraints, see AGENTS.md.


🌐 Internationalization

The panel includes built-in Chinese/English localization that auto-follows the DSH language setting. Third-party switches can use functional labels (label: () => t('xxx')) for dynamic refresh on language change.


Installation

Requires DSH Web environment:

# Install this plugin
dsh plugin --profile my-profile add ./dock-flash

# (Optional) Install dock-base for full workbench integration
dsh plugin --profile my-profile add dock-base

# Start
dsh --profile my-profile

Without dock-base: dock-flash runs in standalone mode — a ⚡ trigger button is injected into the conversation slot picked by the trigger-position switch (default: input right). Click it to open the quick control popup panel (Appearance, Layout — trigger position — and System switches). The shared sidebar.footer.action slot is deliberately not offered, because other plugins occupy it too.

With dock-base: dock-flash integrates into the workbench — the ⚡ icon appears in the activity bar, and the panel can be opened as a sidebar or floating window with the Appearance and System switches. Dock layout properties (dock edge, auto-hide, reserve space, icon scaling) are configured in dock-base's own settings, not here.

Development

pnpm install
pnpm run build      # tsc → dist/index.js
pnpm run typecheck  # type check only

For development rules, critical constraints, and testing conventions, see AGENTS.md. For what changed in each release and why, see CHANGELOG.md.

Style Contract

This plugin follows the DSH Web style contract: all colors reference --dsw-alias-* design tokens (literals only as fallback), no theme-branching CSS selectors.

Dependencies

DependencyTypeDescription
dock-base >=0.1.2-0 <1.0.0-0 || >=0.2.0-0 <1.0.0-0peer (optional)Provides ctx.workbench registry services for full workbench integration
@deepseek-ai/cordis >=4.0.0-rc.1 <5.0.0-0 || >=4.0.1-0 <5.0.0-0peerPlugin framework (bundled with DSH)

License

Apache License 2.0