DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

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

dsh-pptx-sidebar

Pptx Sidebar

DSH web plugin(dsh-better-sidebar consumer):在右侧边栏中将 .pptx 演示文稿渲染为易读的结构化视图——幻灯片列表(按演示文稿顺序,而非文件名顺序)、带项目符号层级的文本、演讲者备注和内嵌图片——并配备断路器,确保任何演示文稿都不会导致标签页卡死。阅读视图,而非幻灯片复刻。

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

npx -y @deepseek-ai/dsh plugin --profile web add github:drscrewdriver/dsh-pptx-sidebar#c93ffda610eb4726946aa29ab926d8840b1bc0c3
README兼容性版本

兼容性与来源证明

Pptx Sidebar 以 dsh-pptx-sidebar 发布,当前版本为 0.2.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

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

版本

0.2.0stable
2026/9/24

相关插件

正在加载相关插件…

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

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

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

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

认领这个 Plugin →
报告问题

相关插件

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

Acp App@deepseek-ai/dsh-acp-appdsh ACP 配置文件包:基于 dsh-base 的仅限自动化的 JSON-RPC stdio 和进程生命周期管理Client Ui Task Board@linxin666/dsh-client-ui-task-board面向 DSH Web GUI 的主机权威任务面板,支持实际会话执行、主机 cron 调度以及可选的跨平台空闲睡眠保护;以挂载方式提供,无需修改 DSH 源代码。Web All@linxin666/dsh-web-allDSH Web UI 全家桶聚合插件:一键安装全部功能插件(task-board / git-graph / pet / remote-web-ui / web-ui-settings / skin-center / community-plugins / compat shim)。compat 桥接层已并入本包(src/client),无需独立 compat npm 包。Deepseek Ipptdeepseek-ipptiPolloWork PPT Studio 及其精选幻灯片模板,作为原生 DeepSeek Harness 对话视图。

README

dsh-pptx-sidebar

Read .pptx / .pptm decks in the DSH sidebar — the slides in presentation order, with their text, bullet levels, speaker notes and inline pictures.

This is a reading view, not a slide reproduction. No absolute positioning, no theme fonts, no placeholder inheritance, no animation. The viewer says so in its header, because a layout difference that looks like a rendering bug is worse than a plainly-labelled limitation.

It is a dsh-better-sidebar consumer: it registers a file previewer and renders inside the Side card's preview area. Without that plugin it loads, warns once, and does nothing.


Install

dsh plugin --profile <profile> add github:drscrewdriver/dsh-pptx-sidebar#<sha>
dsh plugin --profile <profile> add dsh-pptx-sidebar@0.1.0     # once published

Then restart the DSH host — a browser refresh is not enough for a new loader row. Verify without starting anything:

dsh --profile <profile> --dump-config | Select-String dsh-pptx-sidebar

Manual installation is three steps, not one — see cordis.patch.yml. Doing only steps 1 and 3 produces a profile where the package is present, the patch row is present, and nothing loads, silently.

What it does / does not do

DoneNot done
Slide list in p:sldIdLst orderVisual layout, absolute positioning
Text paragraphs, per-paragraph bullet levelsTheme/master font resolution
Title detection from placeholder typePlaceholder inheritance (see below)
Speaker notes from notesSlide partsCharts re-rendered as charts
Inline pictures as blob URLsAnimation, transitions, timings
Real tables (a:tbl)Comments, revision marks
Bold / italic runsEditing, writing back
Seven circuit-breaker ceilingsLegacy .ppt (BIFF/OLE2), WPS formats

The placeholder inheritance line (deliberate)

A slide often shows text it does not contain: numbers, footers, and title text that live in slideLayout / slideMaster, referenced through a p:ph placeholder. Resolving that means re-implementing PowerPoint's inheritance chain — including lstStyle level overrides and which layout the slide actually uses.

v1 does not do it. Only the slide's own part is read. The consequence is stated rather than hidden: a slide whose text is entirely inherited renders with no text. That is a visible omission, not a corruption — the opposite trade (inheriting wrongly) would show text that is not on the slide.

Width adaptation

The sidebar pane is resizable, so the reading view adapts to it — within bounds, because "adaptive" is not a licence to keep growing or shrinking:

KnobValueWhy
Base width360 pxThe factor is exactly 1 here, so the usual pane width renders the layout 0.1.0 shipped
Floor0.9×A narrow pane still gets readable type
Ceiling1.15×A wide pane gets comfortable type, not enormous type
Quantisation2 decimalsA drag re-lays-out on 0.01 steps, not on every pixel

The factor is derived from the pane width and written to the --reader-scale custom property; the root font-size becomes 13px × scale and the slide content is expressed in em, so text reflows at the new size instead of being transform-scaled (which would blur glyphs).

Only the document scales. Titles, bullets, paragraphs, notes, tables and image captions follow the factor; the header strip, the slide strip, the breaker banner and the loading/empty states keep their fixed size. Chrome that changes size while you drag a divider reads as a glitch rather than as responsiveness.

Two related decisions:

  • An unmeasurable width falls back to 1, not to a bound. Before the first measurement the width is 0, and rendering that as "as narrow as possible" would flash tiny type every time a deck is opened.
  • Pictures do not scale. They render at the size the shape transform states and are only capped by the pane; magnifying a bitmap past its natural size to track the text would make it softer, not more faithful.

The pipeline

archive bytes (host /sidebar/file, custom loader)
  → archive-size gate                      refuse before any unpacking
  → central directory (declared-size gate) refuse a lying part before inflating
  → streaming inflate + total budget       the zip-bomb gate
  → ppt/presentation.xml                   p:sldIdLst — slide ORDER
  → ppt/_rels/presentation.xml.rels        rId → slides/slideN.xml
  → ppt/slides/slideN.xml                  p:spTree → p:sp / p:pic / p:graphicFrame
  │     p:txBody → a:p → a:pPr@lvl (level), a:r → a:rPr(b/i) + a:t
  │     p:pic    → a:blip@r:embed → slide rels → ppt/media/*
  │     p:grpSp  → recursed, never flattened away
  ├→ ppt/slides/_rels/slideN.xml.rels      .../notesSlide → notesSlides/notesSlideN.xml
  └→ rules: a slide too long loses only its own tail; notes absent is silence

Pictures are pulled out of the zip and turned into object URLs. An embedded image lives inside the archive, so there is no host route to point at — this is not "reading files ourselves", it is using the bytes the host already handed over.

Seven circuit-breaker ceilings

DimensionDefaultOver it
Archive size8 MBBLOCKED — refused before any unpacking
Total inflate64 MBBLOCKED — the zip-bomb gate
One part32 MBBLOCKED — a single oversized XML part
Slides300TRUNCATED — the reader stops walking the deck
Slide text20 000 charsthat slide's remaining text elided
Images200further pictures skipped
One image8 MBthat picture skipped (not even inflated)

At most one warning per dimension, structurally — warnings live in a Map<reason, warning>, so a dimension that trips on every slide produces one line, not sixty.

The per-slide text ceiling elides only the offending slide. A per-block ceiling would shave every slide equally and lose information the deck had budget for; the failure mode we accept instead is "slide 12 is cut short".

Tests

npm install
npm run verify          # build (bundle load gate) + tests
npm test                # 19 checks

The fixture is a real pptx-shaped zip built in the test file, with a genuine tiny PNG. It is hostile where the format is:

  • p:sldIdLst lists slide2 before slide1, so sorting parts by filename would pass every other assertion and still be wrong;
  • one slide relationship uses an absolute target, another is External;
  • ppt/slideLayouts/slideLayout1.xml carries MASTER TEXT MUST NOT APPEAR, which must never surface — that is what "no placeholder inheritance" means here.

Layout

FileRole
pptx.tsThe reader: parts, relationships, shape tree, notes, pictures
circuit-breaker.tsThe seven ceilings and the single-warning-per-dimension rule
zip.ts / xml.tsContainer reading; targeted XML scanning with depth counting
PptxViewer.tsxSlide strip, current-slide rendering, object-URL lifetime
locales.tszh / en dictionaries, including every warning template
seams.tsStructural mirrors of the client services we consume

The zip and XML code is copied from the sibling document plugin rather than shared. Two users of this code is not yet the threshold for extracting a package — that would add a third thing to publish and version-lock.

License

MIT