packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
在 DSH 右侧栏文档预览里打开 .blend:Blender headless 导出缓存 GLB 与场景统计,由零依赖 WebGL 视口渲染。需本机装有 Blender 3.6+(或在设置里指定 blenderPath)。
Renamed: the canonical package is now
dsh-preview-blender. This repository is kept as the legacy 0.1.x home.
# dsh-blend-preview
Preview Blender .blend files inside DeepSeek Harness: the right-Sidebar document preview turns the scene into an interactive 3D viewport (orbit / zoom / wireframe) with a scene-information panel, instead of the built-in “binary file, no preview” empty state.

.blend files, so clicking one in Workspace files opens it in the right Sidebar.blender --background once per file version to export a GLB plus a scene JSON (objects, triangles, materials, real-world size in mm, units, cameras, lights, collections).~/.dsh/cache/blend-preview; the second open is instant (a few milliseconds).0.2.0-rc.2 and 0.2.1-rc.2).DSH_BLENDER, BLENDER_PATH, blender on PATH, the Steam library, and C:\Program Files\Blender Foundation\Blender*. Set blenderPath if your install lives elsewhere.# into a normal (non-desktop) profile
dsh plugin --profile <profile> add dsh-blend-preview
# the desktop profile is owned by the Electron app; add it there through the
# plugin manager UI, or compose it manually and restart the app
The package ships a cordis.patch.yml, so installation adds the plugin row automatically. Restart DSH after installing.
Settings → Plugins → Blender preview (namespace blend-preview):
| Key | Default | Meaning |
|---|---|---|
enabled | true | Register the renderer and the conversion route. |
routePath | /api/blend-preview | Authenticated conversion route. Must stay under /api; otherwise the authenticated fence is bypassed, so it falls back to the default. |
extensions | ["blend"] | Suffixes that open in the 3D preview. |
blenderPath | "" (auto) | Absolute path of blender.exe / blender. |
cacheDir | "" → ~/.dsh/cache/blend-preview | Where exported GLB files and scene JSON live. |
timeoutMs | 180000 | Wall-clock ceiling for one cold conversion. |
maxBytes | 1073741824 | Largest .blend converted (1 GiB). |
applyModifiers | true | Apply modifiers during export, so the preview matches what Blender renders. |
cacheEntries | 24 | Cached conversions kept on disk before the oldest are pruned. |
Workspace file click
│
▼
document preview body (lib/client.js)
│ GET /api/blend-preview?path=…&kind=info (scene JSON)
│ GET /api/blend-preview?path=…&kind=glb (model bytes)
▼
Host half (lib/index.js, lib/route.js)
│ cache key = sha1(realpath, size, mtime, recipe, modifiers)
▼
lib/blender.js ── spawn blender --background --python lib/scene.py
│ → model.glb + scene.json (+ meta.json)
▼
~/.dsh/cache/blend-preview/<key>/
lib/scene.py exports with export_apply, use_visible, Y-up, no cameras/lights, and writes the scene description (world-space AABBs through the evaluated depsgraph, Principled base colours converted to sRGB swatches)./api, so the connection service authenticates every request (Host/Origin fence + session cookie). Arbitrary local files are not exposed.dev/client-body.js client UI (single CJS factory for the DSH module loader)
dev/viewer.js the WebGL renderer, spliced into the bundle at build time
scripts/build-client.mjs builds lib/client.js from the two files
scripts/e2e-browser.mjs Playwright end-to-end against a temporary DSH host
scripts/live-selftest.mjs cold/warm/concurrent conversion against a real .blend
node --test test/*.test.js
lib/client.js is generated — edit the files under dev/ and rebuild. The DSH client loader hands the bundle a require limited to the platform seed modules, so the package cannot pull a renderer dependency at runtime; the single generated file is the intended shape.
timeoutMs.