npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

dsh-media-studio

v0.3.1

Published

DSH 插件:面向 AI 漫剧 / AI 微电影 / AI 视频创作的多项目无限画布编辑器 —— 画布节点编排、分门别类的素材库、全局素材搜索与跨项目软引用,配合 dsh-llm-multimodal 的生成工具与 media-preview 的聊天内预览。

Readme

dsh-media-studio

中文 English npm

一个 DeepSeek Harness(DSH)插件,为 agent 提供多项目无限画布编辑器:项目画布、每项目分门别类的素材库、全局实时素材搜索、跨项目软引用。媒体生成能力(generate_image / generate_video / generate_vision / generate_music / TTS)位于姊妹插件 dsh-llm-multimodal,本插件通过画布「重新生成」流程调用。

效果预览

Media Studio 画布

一条 59 节点、76 条连线的 AI 微电影工作台:五个分区——编排计划、剧本与制作计划、资产锚点、分镜与关键帧、视频片段——在 22% 缩放下总览。点击可放大。

面向 AI 视频创作

画布是为多镜头、长链路的 AI 视频生产准备的工作台——这类工作需要一致的角色、可复用的资产与逐镜头的拓扑,而不是一条提示词:

| 使用场景 | 画布提供什么 | |---|---| | AI 漫剧 / 动态漫 | 一集一个分区:角色与场景资产块跨镜头复用,一个共享的美术风格节点向下游所有提示词供词,让画风在几十格里保持一致 | | AI 微电影 | 剧本 → 分镜 → 镜头 → 剪辑分区让整片状态一眼可查;首尾帧关键帧串联让相邻镜头真正衔接,而不是 PPT 切片 | | AI 视频创作 | 任何多镜头作品——商品广告、MV、讲解片。节点级 canvas_refresh_node 只重生成没做好的那一个镜头,不必重做整块画布 |

下面这些能力让以上场景可行:每项目一套素材库(人物 / 场景 / 音频 / 视频片段)保证主角形象稳定;软引用让一个角色资产服务多张画布而无需复制文件;**全局搜索(⌘K)**能从旧项目里找到场景资产直接复用到当前画布。

配套插件(互推)

本插件与同作者的另外两个 DSH 插件组成「生成 → 编排 → 预览」完整闭环,建议一起安装:

| 插件 | 角色 | npm | |---|---|---| | dsh-llm-multimodal | 生成后端:generate_image / generate_video / generate_vision / generate_tts / generate_music / generate_text,模型从 llm-pi-ai 自动发现 | npm: dsh-llm-multimodal | | media-preview | 把聊天中的本地/在线媒体路径渲染为可播放预览(Range / 缓存 / 27 种格式) | npm: media-preview |

  • 生成 → 编排:本插件发布跨插件服务 mediaStudio(ctx.reflect.provide,软引用,双方均无硬依赖)。dsh-llm-multimodal 用 ctx.get('mediaStudio') 读取它,把生成产物直接写进活跃项目的 <sourcePath>/assets/<类别>/ 而非 /tmp;结果附带 projectId + canvasUrl,batchAddMedia 可一步挂到画布节点。本插件缺失时生成器自动回退自身的 outputDir 策略——安装顺序无关。
  • 编排 → 预览:项目下的媒体文件经 /api/media-studio/media-file 提供,media-preview 负责把 file:// 路径在聊天里内联渲染。

Compatibility

| 项目 | 状态 | |---|---| | Harness | DeepSeek Harness 0.1.1-rc.2 | | Node | ^22.19.0 || >=24.0.0 | | 平台 | 全部(纯 ESM;无原生代码、无网络) |

What it does

  • 无限画布(Media Studio 侧栏标签页,经 betterSidebar)。服务端权威 + SSE 实时回灌;键鼠编辑、撤销/重做、小地图、自动整理、媒体灯箱预览。
  • Agent 工具(25 个):13 个 canvas_*(图快照/批量写、自动整理、节点重生成、单节点 CRUD、分区 CRUD/贴合)+ 12 个 media_studio_*(项目管理、素材库、全局搜索)。缺省 canvasId 解析为当前激活项目的画布。
  • 分区(Region):命名容器盒,把画布按业务区块划分(流程总览 / 剧本文案 / 人物资产 / 场景资产 / 分镜区 / 成片与音频)。节点归属 = data.region;盒随节点新增自动扩容,支持整体拖动、锁定、贴合内容。canvas_auto_arrange({ regionId }) 只重排该分区。
  • 项目(M0/M1):projects.json 注册表 + 每项目 assets/;旧画布首次启动自动升级为项目。顶部「项目」菜单:新建 / 打开 / 最近打开(≤10)/ 重命名 / 删除(带依赖分析);默认进 <ws>/trash/ 回收站。带 sourcePath 创建的项目,画布与素材都留在用户自有目录。
  • 素材库(M2):四类资产(人物 / 场景 / 音频 / 视频片段)。画布媒体卡可「存入素材库」;素材库面板支持浏览、改名、跨项目复制、删除预检。资产文件名=资产 id——改名永不断引用。
  • 全局搜索 + 软引用(M3):顶栏实时搜索(⌘K)对全部项目的库资产与完成画布素材做模糊匹配,按「当前项目 / 其他项目」分组。「+ 添加」把库资产软引用进当前画布(data.assetRef,不复制文件);画布素材结果提供「复制入库」。引用关系支撑删除预检;源被删时可把被引用资产迁入共享库(__shared)或在引用处断链标记。
  • 中英双语 UI:极简 i18n,跟随 DSH 的 Language 设置(ctx.locale)。

全部 REST/SSE 挂在 /api/media-studio/* 下:projects*(列出/新建/打开/改名/删除/依赖/打开目录/选目录/在访达显示)、assets*(列出/登记/更新/删除/复制/依赖/同步文件)、refs、search、search/import-canvas、canvas/*(state/patch/auto-arrange/refresh/backfill-video-posters)、media-file 代理、service-worker.js,以及统一 sse 端点。

只允许一条 SSE 连接。 画布 patch 与注册表变更(registry-changed / project-open / project-deleted / asset-changed / project-focused)全部复用 /api/media-studio/sse 单条流。这是刻意的:HTTP/1.1 每主机上限 6 连接,而 DSH 核心已占用数条。标签页后台化时连接暂停,重连后主动拉取最新快照补齐。新增第二个 EventSource 属于回归——请合并进该端点。

Install

# 方式一(推荐):dsh 官方命令,从 npm registry 安装
dsh plugin --profile web add dsh-media-studio

# 方式二:从打包产物安装
pnpm pack
dsh plugin --profile <name> add ./dsh-media-studio-0.3.1.tgz

# 确认插件行已挂载
dsh --profile <name> --dump-config | grep 'dsh-media-studio'

可选:media-studio agent preset

包内还附带一份 agent preset(src/presets/media-studio/agent.cordis.yml),让会话带上媒体制作人格与配套的 prompt 段落。preset 里不声明任何工具——本插件自己的 fiber 已注册全部工具,每个会话都能通过 ctx.tools 继承;preset 只补充身份与提示词框架。

源码检出场景下,pnpm run prepare(或 bash scripts/setup-preset.sh [profile])会把它软链到 $DSH_HOME/profiles/<profile>/agent-presets/media-studio/。npm 安装场景请自行从 node_modules/dsh-media-studio/src/presets/media-studio/agent.cordis.yml 软链。之后在 agent preset 选择器里选 media-studio,或在对话中输入 /preset media-studio。完全跳过这一步也没问题——画布标签页与全部 25 个工具都不依赖它。

Configuration

| 键 | 类型 | 默认 | 说明 | |---|---|---|---| | workspaceRoot | string | ~/.media-studio | 注册表、旧版画布、回收站所在 | | mediaRoots | string[] | ['~/Movies'] | media-file 代理可额外提供的目录。默认 ~/Movies,让 sourcePath 落在其下的影视类项目开箱即可渲染;~ 会自动展开 | | defaultCanvasId | string | main | 兜底画布 id(激活项目优先) | | logToolCalls | boolean | true | 工具结果写入会话日志 | | recentLimit | number | 10 | 最近打开项目上限(1–50) | | trashEnabled | boolean | true | 删除移入 <ws>/trash(除非显式彻底删除) |

配置由 src/config.ts 的 Schemastery Config 模式校验;无可调参数被硬编码。运行中的 profile 可通过 cordis.patch.yml 覆盖任意一项。

Development

pnpm install
pnpm run typecheck        # 服务端源
pnpm run typecheck:client # 浏览器源(tsc)
pnpm test                 # vitest(store/project/asset/search/perf 套件)
pnpm run build            # tsdown → lib/
pnpm pack

性能契约

以下热点路径由回归测试钉住——review 看不出 100ms 与 1s 的差别,CI 跑过的数字才看得见:

| 契约 | 测试 | |---|---| | 持久化合并:100 次同步 apply → ≤2 次写入 | tests/persistence-debounce.test.ts | | postProcessCanvasPatch 把 N 个视频节点合并成单次 apply | tests/post-process-batching.test.ts | | 1000 次同步 apply 在 500ms 内完成且 ≤2 次写入 | tests/perf-budget.test.ts | | 媒体文件名稳定(sha1 派生,16 位 hex) | tests/stable-filename.test.ts | | gcOrphanMedia 只删不可达的 v- / a- / i- 文件 | tests/orphan-gc.test.ts | | SSE 广播按 canvasId 分桶隔离 | tests/sse-bucketing.test.ts | | merge token 在节点 data 未变时短路 | tests/canvas-rerender-discipline.test.ts | | loadAssetIndex 命中 mtime 缓存(Object.is 稳定) | tests/search-cache.test.ts | | openProject 只 restore 目标画布 | tests/restore-target.test.ts | | dependentsOf / scanAssetRefs 不深拷贝画布 | tests/dependents-no-clone.test.ts |

任何改动热点路径(写入、SSE、媒体处理、依赖扫描、画布渲染)都必须随附对应的回归测试。

打赏支持

若这个插件帮到了你,欢迎用下面的二维码请我喝杯咖啡。

License

Apache License 2.0 © 2026 dsh-media-studio contributors.