dsh-film 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -12
- package/apps/canvas/LICENSE +1 -0
- package/apps/canvas/NOTICE +95 -0
- package/apps/canvas/THIRD-PARTY-NOTICES.txt +388 -2
- package/apps/canvas/assets/{highlighted-body-OFNGDK62-B6c2aC_6.js → highlighted-body-OFNGDK62-BrKQ1b3K.js} +1 -1
- package/apps/canvas/assets/index-BCy3Hvja.js +43 -0
- package/apps/canvas/assets/index-CGsQaiBC.css +1 -0
- package/apps/canvas/assets/index-C_MTtFXn.js +647 -0
- package/apps/canvas/catalog/camera-control.json +56 -0
- package/apps/canvas/catalog/camera-moves.json +67 -0
- package/apps/canvas/catalog/generation-presets.json +12 -0
- package/apps/canvas/catalog/vibedev-skills.json +414 -0
- package/apps/canvas/component-build.json +1 -1
- package/apps/canvas/director-desk/licenses/Apache-2.0.txt +202 -202
- package/apps/canvas/index.html +2 -2
- package/client/client.workbench.js +1 -1
- package/lib/agent/canvas-tools.d.ts +8 -0
- package/lib/agent/canvas-tools.js +507 -27
- package/lib/agent/context.d.ts +2 -0
- package/lib/agent/editing-tools.d.ts +45 -0
- package/lib/agent/editing-tools.js +897 -0
- package/lib/agent/guidance.js +6 -0
- package/lib/agent/index.d.ts +2 -2
- package/lib/agent/index.js +19 -2
- package/lib/agent/install.d.ts +4 -3
- package/lib/agent/install.js +4 -3
- package/lib/agent/media-task-tools.d.ts +3 -2
- package/lib/agent/media-task-tools.js +42 -6
- package/lib/canvas/assist-prompt.d.ts +30 -0
- package/lib/canvas/assist-prompt.js +66 -3
- package/lib/canvas/board-media.d.ts +40 -4
- package/lib/canvas/board-media.js +58 -8
- package/lib/canvas/board-ops.js +2 -0
- package/lib/canvas/board-tools.d.ts +32 -9
- package/lib/canvas/board-tools.js +79 -14
- package/lib/canvas/catalog.d.ts +198 -0
- package/lib/canvas/catalog.js +304 -0
- package/lib/canvas/clip-marks.d.ts +61 -0
- package/lib/canvas/clip-marks.js +106 -0
- package/lib/canvas/generation-options.d.ts +564 -0
- package/lib/canvas/generation-options.js +1469 -0
- package/lib/canvas/media-time.d.ts +92 -0
- package/lib/canvas/media-time.js +156 -0
- package/lib/canvas/prompt-skills.d.ts +314 -0
- package/lib/canvas/prompt-skills.js +595 -0
- package/lib/canvas/subtitle-resegment.d.ts +56 -0
- package/lib/canvas/subtitle-resegment.js +212 -0
- package/lib/canvas/subtitle-srt.d.ts +78 -0
- package/lib/canvas/subtitle-srt.js +205 -0
- package/lib/canvas/subtitles.d.ts +210 -0
- package/lib/canvas/subtitles.js +355 -0
- package/lib/canvas/tool-error.d.ts +10 -0
- package/lib/canvas/tool-error.js +13 -0
- package/lib/director/vendor/director-math/schema/cameraMicroMotionState.d.ts +1 -1
- package/lib/file-writes.d.ts +4 -2
- package/lib/file-writes.js +5 -6
- package/lib/index.js +3 -1
- package/lib/media/catalogue.d.ts +100 -32
- package/lib/media/catalogue.js +124 -42
- package/lib/media/edit.d.ts +245 -0
- package/lib/media/edit.js +848 -0
- package/lib/media/tasks.d.ts +92 -9
- package/lib/media/tasks.js +214 -12
- package/lib/routes.js +2 -0
- package/lib/screenwriter/contracts/production.d.ts +7 -2
- package/lib/screenwriter/contracts/production.js +6 -3
- package/lib/studio/board-file-routes.d.ts +3 -5
- package/lib/studio/board-file-routes.js +3 -6
- package/lib/studio/media-edit-routes.d.ts +54 -0
- package/lib/studio/media-edit-routes.js +461 -0
- package/lib/studio/project-routes.js +12 -4
- package/lib/studio/text-routes.d.ts +3 -1
- package/lib/studio/text-routes.js +5 -1
- package/package.json +1 -1
- package/apps/canvas/assets/index-C_1iyrK7.js +0 -687
- package/apps/canvas/assets/index-DFL3lVtS.css +0 -1
- package/apps/canvas/icons/claude.svg +0 -1
- package/apps/canvas/icons/deepseek.svg +0 -1
- package/apps/canvas/icons/gemini.svg +0 -1
- package/apps/canvas/icons/glm.svg +0 -1
- package/apps/canvas/icons/grok.svg +0 -1
- package/apps/canvas/icons/linuxdo.svg +0 -9
- package/apps/canvas/icons/openai.svg +0 -1
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ A film workbench for DeepSeek Harness and VibeDev: three right-sidebar tabs —
|
|
|
37
37
|
**从 GitHub Release 安装**:插件页的“包名或地址”和上面的命令也接受 Release 里的 `.tgz` 直链,例如
|
|
38
38
|
|
|
39
39
|
```
|
|
40
|
-
https://github.com/CrisLIUning/dsh-film/releases/download/v0.
|
|
40
|
+
https://github.com/CrisLIUning/dsh-film/releases/download/v0.3.0/dsh-film-0.3.0.tgz
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
直链不经过安装源,需要本机能直接访问 GitHub(或配好代理)。包约 3 MB。网速很慢时仍可能超过 pnpm 默认的 60 秒下载时限而失败:这时改为按包名从中国大陆镜像源安装;也可以把时限调长:pnpm 11(DeepSeek Harness 和 VibeDev 桌面版自带的就是它)不再从 `~/.npmrc` 读取这个设置,要在 pnpm 的全局配置 `config.yaml` 里加一行 `fetchTimeout: 600000`(Windows:`%LOCALAPPDATA%\pnpm\config\config.yaml`;macOS:`~/Library/Preferences/pnpm/config.yaml`;Linux:`~/.config/pnpm/config.yaml`),或设环境变量 `pnpm_config_fetch_timeout=600000`;pnpm 10 及更早的版本则在 `~/.npmrc` 里加 `fetch-timeout=600000`。
|
|
@@ -46,7 +46,7 @@ https://github.com/CrisLIUning/dsh-film/releases/download/v0.2.0/dsh-film-0.2.0.
|
|
|
46
46
|
|
|
47
47
|
**不能从 Git 仓库安装**:不要在插件页填仓库地址 `https://github.com/CrisLIUning/dsh-film`,也不要对它运行 `dsh plugin add`。`lib/`、`client/` 和 `apps/`(分镜画布和导演台的前端)都是构建产物,不在 git 里,从仓库安装会失败(不会留下装了却用不了的插件)。
|
|
48
48
|
|
|
49
|
-
**dsh-media 是可选的**:只有在分镜画布里生成图片和视频才需要另装 [dsh-media](https://github.com/CrisLIUning/dsh-media)(包名 `dsh-media`,装法相同;走 VibeDev 网关,按用量从 VibeDev
|
|
49
|
+
**dsh-media 是可选的**:只有在分镜画布里生成图片和视频才需要另装 [dsh-media](https://github.com/CrisLIUning/dsh-media)(包名 `dsh-media`,装法相同;走 VibeDev 网关,按用量从 VibeDev 余额扣费)。不装也能写剧本、排分镜和调度导演台。分镜画布给每个视频模型列出的模式与 dsh-media 实际接受的一致:声明不收首帧的线路(Seedance 2.5(VibeDev)、2.5 30s(VibeDev)、2.5 480p 30s(山海)和三条 lec 线路;Seedance 2.5 特价按次收首帧,仍有图生视频)不显示“图生视频”,接一张图时改走“全能参考”,图作为参考图发送;以前保存成“图生视频”的节点在这些线路上也按全能参考生成。
|
|
50
50
|
|
|
51
51
|
装好后打开任意会话的右侧侧栏,在“开始”页点“剧本”等入口。会话需要有工作区。第一次打开任一影视标签时,插件自动在工作区里建好影片(片名取工作区文件夹名,画幅 16:9,连同一张空白分镜画布),不用填表。片名和画幅在三个标签共用的标题栏里改:点片名直接改(最多 80 字,回车或点别处保存,Esc 取消);画幅是这部片子的画面比例,分镜画布和导演台都按它来,菜单里有 16:9、9:16、1:1、4:5、21:9、2.39:1。0.1.0 建的 4:3 影片照旧保留并显示为 4:3。
|
|
52
52
|
|
|
@@ -56,13 +56,35 @@ Requires DeepSeek Harness 0.2.x or VibeDev (VibeDev Next), which is built on it.
|
|
|
56
56
|
|
|
57
57
|
- **Plugin page** (recommended): Plugins → Add plugin → install a third-party plugin by package name, enter `dsh-film`, pick the npm registry or the China mirror under the install source, and install.
|
|
58
58
|
- **Command line**: for the DeepSeek Harness desktop app, quit it fully, then run `dsh plugin --profile desktop add dsh-film` (the `dsh` command is installed from the app menu). VibeDev Next's command is `vibedev-app` (app menu → Manage vibedev-app Command…): quit the app fully, then run `vibedev-app plugin --profile desktop add dsh-film`; it keeps its data in `~/.vibedev-app`, which `dsh` does not reach. With the npm `dsh` CLI, run `dsh plugin add dsh-film`.
|
|
59
|
-
- **GitHub Release**: the plugin page and the commands also take the release asset URL, e.g. `https://github.com/CrisLIUning/dsh-film/releases/download/v0.
|
|
59
|
+
- **GitHub Release**: the plugin page and the commands also take the release asset URL, e.g. `https://github.com/CrisLIUning/dsh-film/releases/download/v0.3.0/dsh-film-0.3.0.tgz`. It is fetched straight from GitHub, not through a registry. The file is about 3 MB; if a very slow connection still hits pnpm's default 60-second fetch timeout, install by name from the mirror instead, or raise the timeout — pnpm 11 (the one the desktop apps ship) no longer reads it from `~/.npmrc`, so add `fetchTimeout: 600000` to pnpm's global `config.yaml` (Windows `%LOCALAPPDATA%\pnpm\config\config.yaml`, macOS `~/Library/Preferences/pnpm/config.yaml`, Linux `~/.config/pnpm/config.yaml`) or set `pnpm_config_fetch_timeout=600000`; pnpm 10 and earlier take `fetch-timeout=600000` in `~/.npmrc`.
|
|
60
60
|
- **A fresh release**: pnpm 11 installs only versions published at least a day ago (`minimumReleaseAge`). The very first version is not held back: installing by name a package with no earlier version installs it and adds it to `minimumReleaseAgeExclude`. After each later release, an install by name gets the previous version for a day; to get the new one at once, install the exact version (`dsh-film@<version>`) or use the release URL.
|
|
61
61
|
- **Not from the git repository**: `lib/`, `client/` and `apps/` (the storyboard and director desk front ends) are build outputs that are not in git, so installing from the repository URL fails (it does not leave a plugin that cannot work).
|
|
62
|
-
- **dsh-media is optional**: only image and video generation on the storyboard needs [dsh-media](https://github.com/CrisLIUning/dsh-media). Everything else works without it.
|
|
62
|
+
- **dsh-media is optional**: only image and video generation on the storyboard needs [dsh-media](https://github.com/CrisLIUning/dsh-media). Everything else works without it. The storyboard lists for each video model the modes dsh-media accepts: lanes that declare no first frame (Seedance 2.5 (VibeDev), 2.5 30s (VibeDev), 2.5 480p 30s (山海) and the three lec lanes; Seedance 2.5 特价按次 takes a first frame and keeps image-to-video) offer no image-to-video, and a single image goes as a 全能参考 (multi-reference) reference image instead, also for nodes saved as image-to-video earlier.
|
|
63
63
|
|
|
64
64
|
Then open the right sidebar of a session that has a workspace and pick a part on its start page. The first time a film tab opens, the plugin creates the film — named after the workspace folder, 16:9, with an empty storyboard — with no form to fill in. Rename it and pick its frame in the header the three tabs share: click the title to edit it (up to 80 characters; Enter or clicking away saves, Esc cancels); the frame is the film's aspect ratio, which the storyboard canvas and the director desk use (16:9, 9:16, 1:1, 4:5, 21:9, 2.39:1). A 4:3 film made by 0.1.0 keeps and shows its frame. To upgrade, install the new version over the old one (no need to uninstall first), then restart DeepSeek Harness / VibeDev: until you do, the workbench shows a banner asking for the restart and does not open the storyboard or the director desk. Your film stays in the workspace's `film/` folder either way.
|
|
65
65
|
|
|
66
|
+
### 0.3.0 版本说明 · 0.3.0 release note
|
|
67
|
+
|
|
68
|
+
- **视频节点上直接剪**:裁剪条(入点出点、磁吸、0.1 秒微调)、在播放头切开、“剪辑”面板一次截多段或多点截帧、选中多个视频拼接(编码一致时插件无损拼接,否则在页面里重新编码)、分离音频、音频截取。生成、下载、存素材都自动用裁剪后的片段;参考视频超出所选模型的限制时,提示“截取前 N 秒 / 选择片段”,不会自动提交。
|
|
69
|
+
- **字幕**:在视频节点上导入、导出和编辑 SRT(也读 WebVTT 和纯文本),自动断句,实时叠在画面上;裁剪、切开、拼接后字幕跟着对时。不做语音识别。
|
|
70
|
+
- **运镜与相机**:视频节点和生成配置节点上选运镜(约 40 种,可组合、可调速度);图片和视频节点上设相机(质感、镜头、焦距、光圈,可选景别和机位)。生成时自动写进提示词,只加一次,“查看最终提示词”能看到实际发送的内容。多角度工具加了预设和景别。
|
|
71
|
+
- **提示词技能与生成预设**:自带 23 个中文影视技能(分镜画面、角色/场景/道具设定卡、产品广告镜头、首尾帧衔接、风格统一等),可以挂到节点上、用 @ 引用,或放一个技能节点连到多个生成节点;6 个生成预设,也可以把自己的设置存成预设(存在本机浏览器里)。影视工作台里不再从 GitHub 读取在线提示词库。
|
|
72
|
+
- **生成面板**:参数按模型能力显示(图片的方/横/竖与像素、视频的时长、原生音频和各比例像素),生成按钮显示预估价格;预估 ≥ ¥20、模型没有报价或参考视频时长未知时先确认,批量生成按总额确认。影视工作台下每次最多 4 张图。模型按家族分组,首尾帧改为两个固定槽位,可以一键用上一镜的尾帧。
|
|
73
|
+
- **素材与画布**:素材按分类和多个标签筛选;粘贴提示词时 @ 引用还原成引用标签;长文本节点可以用滚轮浏览;画布同步了上游 infinite-canvas v0.19(缩略图、拖拽和连线提速、悬停按钮),去掉了继承来的第三方品牌标志和赞助信息。
|
|
74
|
+
- **Agent**:新增剪切组工具(入出点、切分、出片、拼接、分离音频、读写字幕);生成选项工具能设运镜、相机、提示词技能、技能节点、首尾帧和预设;页面拒绝生成时,原因原样转给 Agent;“帮我写”按运镜、相机和技能来写。
|
|
75
|
+
- **变化**:0.1 的旧导入地址 `/api/canvas/timelines/:boardId/import` 不再可用(返回 404)。在不收首帧的线路上,“图生视频”改走“全能参考”;带尾帧的请求直接拒绝,不扣费。
|
|
76
|
+
- **来源**:部分视频、音频和素材交互改编自 tigerowo/infinite-canvas(经作者许可);交互设计参考了 Open AI Canvas,不含其代码。详见包内 `apps/canvas/NOTICE`。
|
|
77
|
+
|
|
78
|
+
- **Cut right on video nodes**: a trim bar (in/out points, snapping, 0.1 s steps), split at the playhead, the 剪辑 (cut) panel for several segments or frames at once, joining selected videos (losslessly by the plugin when the codecs match, otherwise re-encoded in the page), extracting audio and trimming audio. Generation, download and save-as-asset use the trimmed clip; a reference video over the chosen model's limit offers "trim to the first N s / pick a segment" and never submits by itself.
|
|
79
|
+
- **Subtitles**: import, export and edit SRT on video nodes (WebVTT and plain text are read too), with automatic line splitting and a live overlay on the picture; cues follow trims, splits and joins. No speech recognition.
|
|
80
|
+
- **Camera moves and camera settings**: pick camera moves (about 40, combinable, with speed) on video and generation-config nodes, and camera settings (look, lens, focal length, aperture, optional shot size and angle) on image and video nodes. They are added to the prompt at generation time, once; "view final prompt" shows what is sent. The multi-angle tool gains presets and shot sizes.
|
|
81
|
+
- **Prompt skills and generation presets**: 23 bundled Chinese film skills (storyboard frame, character/scene/prop sheets, product ad shot, first/last frame continuity, consistent style …) can be attached to a node, mentioned with @, or put in a skill node wired to several generation nodes; six generation presets, plus your own presets saved in this browser. The workbench no longer reads the online prompt library from GitHub.
|
|
82
|
+
- **Generation panel**: settings follow each model's capabilities (square/landscape/portrait with pixel sizes for images; duration, native audio and per-ratio pixels for video), and the generate button shows an estimate; an estimate of ¥20 or more, an unpriced model or a reference of unknown length asks first, and a batch asks once for its total. At most 4 images per run in the workbench. Models are grouped by family; first/last frames are two fixed slots, with one click to reuse the previous shot's last frame.
|
|
83
|
+
- **Library and canvas**: filter assets by category and several tags; pasted prompts turn @ references back into reference chips; long text nodes scroll with the wheel; the canvas is synced with upstream infinite-canvas v0.19 (thumbnails, faster dragging and edges, hover buttons), and inherited third-party brand marks and sponsor notes are gone.
|
|
84
|
+
- **Agent**: a new cut group (in/out marks, split, render a clip, join, extract audio, read and write subtitles); the generation-option tools set camera moves, camera settings, prompt skills, skill nodes, first/last frames and presets; when the page refuses a generation, its reason reaches the agent word for word; 帮我写 writes with the chosen camera move, camera settings and skills.
|
|
85
|
+
- **Changes**: 0.1's old import path `/api/canvas/timelines/:boardId/import` is gone (404). On lanes without a first frame, image-to-video goes as 全能参考 (multi-reference); a request with a last frame is refused before anything is charged.
|
|
86
|
+
- **Sources**: some video, audio and library interactions are adapted from tigerowo/infinite-canvas (with the author's permission); the interaction design also draws on Open AI Canvas, whose code is not included. See `apps/canvas/NOTICE` in the package.
|
|
87
|
+
|
|
66
88
|
### 0.2.0 版本说明 · 0.2.0 release note
|
|
67
89
|
|
|
68
90
|
- **剪辑台已移除**:0.2.0 起影视工作台只有剧本、分镜画布和导演台三个标签,Agent 也不再带剪辑、字幕识别和渲染的工具(常驻工具从 35 个减到 30 个),插件包从约 38 MB 缩到约 3 MB。旧会话里还开着的剪辑台标签会显示 DSH 自带的“不可用”提示,关掉即可。
|
|
@@ -94,21 +116,68 @@ Then open the right sidebar of a session that has a workspace and pick a part on
|
|
|
94
116
|
|
|
95
117
|
Media anywhere in the workspace outside `film/` is material: the storyboard's library shows it (hidden entries, `node_modules`, build and cache folders, credential folders and links are skipped; a very large workspace is listed in part, and the list says so). A file is copied into `film/canvas/media/` when used (as a copy-on-write clone where the file system supports it; never a hard link, so editing the original elsewhere later leaves the film's copy as it was), the same bytes only once; an imported file that has not changed since is no longer offered for import by the storyboard. A workspace inside a hidden folder (a name starting with `.`) or a credential folder such as `.ssh` gets no film, and its media is neither played nor imported.
|
|
96
118
|
|
|
119
|
+
## 运镜与相机 · Camera moves and camera settings
|
|
120
|
+
|
|
121
|
+
分镜画布的视频节点(和视频模式的生成配置节点)可以选**运镜**:推、拉、摇、移、跟、升降、环绕、手持、变焦、航拍等 42 种,最多 3 个,第一个是主运镜,按先后或同时进行,能调速度的可以选快慢。图片、视频和生成配置节点可以设**相机**:质感、镜头、焦距、光圈,可选景别和机位(全景图没有)。它们是节点上的设置,不写进你的提示词:生成时画布在提示词末尾各加一行(先运镜,后相机;提示词里已经有同样的一行就不再加),结果节点记下加了哪些行,“查看最终提示词”能看到实际发出的全文。“帮我写”会被告知这两行已经另外定好,不再自己描述镜头运动和摄影器材。
|
|
122
|
+
|
|
123
|
+
这只是写进提示词的引导:效果取决于模型,不保证每次都拍成那样,标为“尽力而为”的运镜(如滑动变焦、FPV 俯冲、子弹时间)对现在的模型更难。加上这两行后提示词超过 4000 字时不会生成,要精简提示词或去掉部分设置(你自己写的长提示词照常发送)。
|
|
124
|
+
|
|
125
|
+
Agent 也能用:`canvas_generation_options` 列出可选的运镜和相机参数,`canvas_set_generation_options` 给节点设置或清除(清除存为 `null`),`canvas_create_generation_flow` 建流程时也能直接带上;分镜标签开着、关着都行。Agent 发起的生成若无论页面怎样设置都会因为加上的行和提示词技能超过 4000 字,工具直接报错(`CANVAS_PROMPT_OVER_LIMIT`);其余情况由页面在开始前自己检查,不生成时整批拒绝,原因原样转给 Agent(`CANVAS_BOARD_REFUSED`),不会悄悄不生成。可选项读自分镜画布自带的目录(`apps/canvas/catalog/`),和页面里的一致。
|
|
126
|
+
|
|
127
|
+
Video nodes on the storyboard (and generation nodes in video mode) take a **camera move**: 42 moves — push, pull, pan, truck, follow, crane, orbit, handheld, zoom, aerial and more — up to three, the first being the main move, one after another or together, with a speed where a move has one. Image, video and generation nodes take **camera settings**: look, lens, focal length, aperture, and optionally shot size and angle (not panoramas). Both are node settings, never written into your prompt: when the node generates, the storyboard appends one line for each (the move, then the camera; a line already in the prompt is not added again), the result records which lines were added, and "view final prompt" shows the whole text sent. The prompt writer is told both lines are chosen separately, so it describes neither the camera's movement nor its equipment.
|
|
128
|
+
|
|
129
|
+
They only guide the model through the prompt: the effect depends on the model and is not guaranteed, and moves marked best-effort (dolly zoom, FPV dive, bullet time and the like) are harder for current models. A prompt that the two lines push past 4000 characters is not generated; shorten it or drop a setting (a prompt you wrote longer than that yourself is sent as it is).
|
|
130
|
+
|
|
131
|
+
The agent can do the same: `canvas_generation_options` lists the moves and camera choices, `canvas_set_generation_options` sets or clears them on nodes (a cleared setting is stored as `null`), and `canvas_create_generation_flow` takes them when it builds a flow, with the storyboard tab open or closed. An agent-started generation that the added lines and prompt skills would push past 4000 characters however the page is set up is refused by the tool (`CANVAS_PROMPT_OVER_LIMIT`); otherwise the page checks the runs itself before it starts them and refuses the whole batch with its own reason, passed on word for word (`CANVAS_BOARD_REFUSED`), instead of silently not generating. The choices come from the storyboard build's own catalogues (`apps/canvas/catalog/`), so they match the page.
|
|
132
|
+
|
|
133
|
+
## 提示词技能与生成预设 · Prompt skills and generation presets
|
|
134
|
+
|
|
135
|
+
分镜画布自带 23 个**提示词技能**(VibeDev 自写的中文提示词模板):分镜画面描述、角色 / 场景 / 道具设定卡、多角度三视图、表情/表演参考、短剧情绪特写、产品广告镜头、首尾帧衔接、下一镜推演、风格统一、运镜描述增强、光影氛围、视频时序脚本、对白镜头、建立镜头、动作戏节拍、分镜预演图、换装/状态变体、短剧封面海报、参考身份锁定、环境声设计和剧本拆镜表。图片、视频和生成配置节点(以及空的文本节点)可以挂技能:每个节点最多一个包裹技能(把你的提示词放进它的结构)和两个追加技能(在后面加几行)。技能和运镜、相机一样只存在节点设置里,挂上时冻结一份快照(连同变量),发送时才按技能的结构组合进提示词,不改动你写的文字:运镜句和相机句填进技能留的位置,各技能的避免词合成一行“避免:……”,只在技能适用的生成模式下套用,每个技能只套一次,重试也不会再套一遍。**技能节点**把一个技能套到它连着的每个图片、视频和生成配置节点上(节点自己的包裹技能优先)。“帮我写”会按节点上技能的结构写,写好后这些技能发送时不再重复套用。
|
|
136
|
+
|
|
137
|
+
**生成预设**一键套用模型、比例、分辨率、时长、原生音频、张数和技能:内置竖屏短剧、横屏预告、低价试镜、角色设定卡、分镜静帧、竖版剧照 6 个,按当前模型调整过的地方会提示;当前设置也可以存为自己的预设(只存在这个浏览器里)。
|
|
138
|
+
|
|
139
|
+
Agent 也能用:`canvas_generation_options` 用 `skills` 列出技能(模板、变量、适用模式),用 `presets` 列出内置预设;`canvas_set_generation_options` 用 `skills` 给节点挂技能(必填变量要给,`clear: ["skills"]` 去掉节点自己的技能,两者同给就是替换),`as: "node"` 则加一个技能节点并连到这些节点(已有同一技能、同样变量的技能节点就直接连上它);`preset` 套用预设,连同其中的技能;`frameRoles` 按图片节点指定视频节点的首帧和尾帧(只在图生视频、首尾帧模式下起作用)。`canvas_create_generation_flow` 建流程时也能直接带上这些,分镜标签开着、关着都行。预设里的模型(以及建流程时给的 `model`)按目录 id 写进节点(如 `seedance-2-0-official-mini`),生成时页面按提供这个模型的通道来用:先用 VibeDev 网关的通道,没有就用第一个提供它的通道;哪个通道都不提供时显示未配置,要用户自己选模型。提示词技能是 VibeDev 的提示词模板,不是 Agent 的技能(如下文的编剧技能 `film-screenwriting`)。
|
|
140
|
+
|
|
141
|
+
The storyboard ships 23 **prompt skills**, VibeDev's own Chinese prompt templates: storyboard frame, character, location and prop sheets, turnaround views, expression and performance sheet, short-drama emotion close-up, product ad shot, first-to-last frame bridge, next shot, style lock, camera move detailing, lighting and mood, timed video prompt, dialogue shot, establishing shot, action beat, storyboard grid, costume and state variant, short-drama cover poster, identity lock, sound bed and script to shot list. Image, video and generation nodes (and an empty text node) take up to one wrap skill (your prompt goes into its structure) and two append skills (lines added after it). Like camera moves and camera settings they are node settings, frozen as a snapshot (variables included) when attached and composed into the prompt only when it is sent, without changing what you wrote: the camera move and camera sentences fill the slots a skill leaves for them, the skills' avoid terms merge into one "避免:" line, a skill applies only in the modes it names, once, and a retry never applies it again. A **skill node** applies one skill to every image, video and generation node it is wired into (a node's own wrap skill wins). The prompt writer writes in the structure of a node's skills, which are then not composed in again when it is sent.
|
|
142
|
+
|
|
143
|
+
**Generation presets** apply a model, ratio, resolution, duration, native audio, image count and skills in one click: six built-ins (vertical short drama, landscape trailer, low-cost preview, character card, storyboard still, vertical still), with a notice where they were fitted to the current model; you can save the current settings as your own preset (kept in this browser only).
|
|
144
|
+
|
|
145
|
+
The agent can do the same: `canvas_generation_options` lists the skills (`skills`: templates, variables, modes) and the presets (`presets`); `canvas_set_generation_options` attaches skills to nodes (`skills`, with their required variables; `clear: ["skills"]` removes a node's own skills, and both together replace them) or adds a skill node wired into them (`as: "node"`; an existing skill node with the same skill and values is wired instead), applies a preset with its skills (`preset`), and names a video node's first and last frame images (`frameRoles`, which apply only in image-to-video and first-last-frame mode); `canvas_create_generation_flow` takes them when it builds a flow, with the storyboard tab open or closed. A preset's model (and a flow's `model`) goes on the node as its catalogue id (such as `seedance-2-0-official-mini`); when the node generates, the page uses the channel serving that model — the VibeDev gateway's first, else the first channel that serves it — and a model no configured channel serves shows as not configured until the person picks one. Prompt skills are VibeDev prompt templates, not agent skills such as the screenwriting skill `film-screenwriting` below.
|
|
146
|
+
|
|
147
|
+
## 剪切、拼接与分离音频 · Cut, join and extract audio
|
|
148
|
+
|
|
149
|
+
分镜画布上的视频可以剪切(定入点、出点)、拼接(把几段接成一段)和分离音频(把声音单独存成音频)。结果都是画布上的新节点,在来源右边,并有连线指回来源;原节点和原文件不动。结果文件放在 `film/canvas/media/`:剪切是 `clip-<id>.mp4`(音频文件剪切后保持原格式),拼接是 `join-<id>.mp4`,分离音频是 `extract-<id>.m4a`。撤销或删掉节点后,已经生成的文件留在磁盘上,和片里其他文件一样。
|
|
150
|
+
|
|
151
|
+
这些操作由插件在 DSH 里直接完成,**不重新编码**:只复制原来的编码数据,所以不损画质、几乎不花时间,不需要 ffmpeg,分镜标签关着也能做,并作为影片任务运行,可以看进度、可以取消(取消后不留半个文件)。剪切默认从入点前最近的关键帧开始复制,并在 MP4 里写明从入点开始播放;个别不认这种标记的播放器会在开头多显示不到一个关键帧间隔的画面。选“从关键帧开始”(`shrink`)时从关键帧开始剪:入点正落在某个关键帧那一帧画面上,就从这个关键帧开始(最多早一帧),否则挪到其后第一个关键帧;画面和声音都从那里开始,没有要隐藏的部分,文件里不会带着剪掉的画面(生成参考这类要求精确的用途就这样剪)。结果节点的 `derivedFrom` 记下每个来源实际用到的区间和它在结果里的起点(出点可能比请求的多出最后一帧),字幕和导演提示按它换算。
|
|
152
|
+
|
|
153
|
+
只有能直接复制的才这样做。拼接要求每一段和第一段的编码、尺寸和编码参数相同,声音格式相同,都有或都没有声音,第二段起的入点落在关键帧上(剪切结果开头藏起来的预滚不算),并且除最后一段外,每段的声音不比画面短一帧以上;同一个模型、同一个分辨率生成的镜头通常满足。拼接时声音首尾相接,接缝处与画面相差不超过半帧。不满足时插件会说明是哪一段、什么原因,由分镜页在浏览器里重新编码(以第一段的尺寸和帧率为准,无声的段补静音)——重新编码需要分镜标签开着,声音用浏览器自带的 AAC 编码器(浏览器不支持时页面会说明,不生成文件)。
|
|
154
|
+
|
|
155
|
+
Agent 也能做这些(见下文的剪切组):`video_clip` 定入点出点,`video_split` 在某一时刻切成两个节点,`video_render_clip` 把入出点出片成文件,`video_join` 按给定顺序拼接,`video_extract_audio` 分离音频,分镜标签开着、关着都能用。入出点和切分是画板编辑:分镜页开着时交给页面执行(可撤销),关着时写进保存的画布。出片、拼接和分离音频由插件作为影片任务完成,结果落在来源右边并连线,和在页面里做的一样带上来源的内容:出片带来源的提示词、这一段换算后的字幕(连同字幕样式,并按新文件记下媒体键,不会被标成“字幕可能和视频不匹配”)和导演镜头;拼接带各段换算后的字幕(同样带样式和新文件的媒体键)和导演镜头,不带提示词;分离音频什么都不带。Agent 用 `media_get_task` 看结果。需要重新编码的拼接(`VIDEO_JOIN_NEEDS_PAGE`)只能由用户在分镜页里用“拼接”完成。Agent 还能用 `video_get_subtitles` 和 `video_set_subtitles` 读写视频节点的字幕(见下文的剪切组)。
|
|
156
|
+
|
|
157
|
+
Videos on the storyboard can be cut (in and out points), joined (several clips into one) and have their sound extracted into an audio file. Each result is a new node right of its source with an edge back to it; the source node and file are untouched. Results go to `film/canvas/media/` as `clip-<id>.mp4` (an audio file keeps its format), `join-<id>.mp4` and `extract-<id>.m4a`; undoing or deleting the node leaves the file on disk like any other film file.
|
|
158
|
+
|
|
159
|
+
The plugin does these in DSH itself **without re-encoding**: it copies the encoded data (mediabunny), so there is no quality loss, it takes moments, needs no ffmpeg and works with the storyboard tab closed. Each runs as a film task with progress and cancel (a cancelled edit leaves no partial file). A cut copies from the key frame before the in point and marks the MP4 to start playing at the in point; a player that ignores the mark shows up to one key-frame interval more at the start. The `shrink` boundary starts on a key frame instead — the one whose picture shows at the in point (at most a frame earlier), else the next one — so picture and sound both start there with nothing hidden and nothing cut away left in the file (the exact cut a generation reference needs). A result's `derivedFrom` records the range of each source it really holds and where that starts in the result (the out point may run one frame past the one asked for), for remapping subtitles and director cues.
|
|
160
|
+
|
|
161
|
+
Only what can be copied is done this way. A join needs every clip to match the first in codec, size and encoder parameters and in sound format, all with or all without sound, every clip after the first to start on a key frame (not the hidden pre-roll at the start of a cut), and every clip but the last to have sound no more than a frame shorter than its picture — shots from one model at one resolution usually do. The joined sound runs back to back, within half a frame of the picture at every cut. Otherwise the plugin names the clip and the reason, and the storyboard page re-encodes in the browser (to the first clip's size and frame rate, silent clips padded with silence), which needs the storyboard tab open and the browser's own AAC encoder for the sound (without one the page says so and makes no file).
|
|
162
|
+
|
|
163
|
+
The agent can do the same with the cutting group (see below): `video_clip` sets in and out points, `video_split` cuts a node in two at one time, `video_render_clip` renders a mark into its own file, `video_join` joins in the given order and `video_extract_audio` copies the sound out, with the storyboard tab open or closed. Marks and splits are board edits, run by the open page (undoable) or saved to the board; renders, joins and sound copies run as film tasks that land their result right of the source with an edge back, carrying what the page's own edits carry — a render the source's prompt and the remapped subtitles (with their style, keyed to the new file so they are not flagged as mismatched) and director shots of its range; a join every clip's remapped subtitles and director shots, but no prompt; a sound copy nothing — and the agent reads them with `media_get_task`. A join that needs re-encoding (`VIDEO_JOIN_NEEDS_PAGE`) is left to the person, with 拼接 in the storyboard page. The agent also reads and writes a video node's subtitles with `video_get_subtitles` and `video_set_subtitles`.
|
|
164
|
+
|
|
97
165
|
## Agent 的影视工具 · Agent tools
|
|
98
166
|
|
|
99
|
-
每个会话都有 `film_project`:查看工作区的影片项目,在用户要做片时新建一个(用户打开影视标签时也会自动建好),或改片名和画幅(`update`)。工作区有影片项目的会话还会常驻
|
|
167
|
+
每个会话都有 `film_project`:查看工作区的影片项目,在用户要做片时新建一个(用户打开影视标签时也会自动建好),或改片名和画幅(`update`)。工作区有影片项目的会话还会常驻 32 个工具、`film_tools` 和一段说明(没有影片的会话不带它们;新建项目后从下一步起就有)。导演台、建模和剪切三组工具按需加载:画板上有导演台节点时自动带上导演组,有带文件的视频节点时自动带上剪切组,其余由 Agent 用 `film_tools` 开启,不用时不占 token。
|
|
100
168
|
|
|
101
169
|
- **剧本** `story_query` `story_asset_bindings` `story_create` `story_apply_ops` `story_history` `story_checkpoint` `story_restore` `story_revert`:和剧本标签用同一套接口,按保存的版本号写入(先 dryRun 预览),每次写入都有版本和操作记录,可以单独撤回某次操作。`story_asset_bindings` 给人物、地点、道具和镜头绑定参考图(只认选中的那份字节,五种解析结果分开报告),工作区里 `film/` 以外的图片先放进影片再绑定。
|
|
102
170
|
- **导入导出** `story_import` `story_export`:先预览再导入为新副本(从不覆盖);导出完整 Markdown、仅正文,或连同参考图打成素材包存到 `film/story-exports/`。
|
|
103
171
|
- **剧本到分镜** `story_source` `story_handoff` `story_adopt` `story_impact` `story_director_links`:把保存的人物、场景、道具、场次或镜头读成制作素材,送到画布成为独立的剧本来源卡(可同时准备一个连好线、只待确认提示词的图片节点,不会自动生成);按节点保存的字段显式采用描述或参考图(参考图另存一份字节快照);剧本改动后查看影响了哪些采用、产物和导演镜头;给导演台已保存的机位记下剧本来源。分镜标签不开也能用。
|
|
104
|
-
- **分镜画布** `canvas_list_clients` `canvas_get_state` `canvas_get_selection` `canvas_read_node` `canvas_get_generation_status` `canvas_get_document` `canvas_create_text_nodes` `canvas_create_generation_flow` `canvas_run_generation` `canvas_connect_nodes` `canvas_delete_nodes` `canvas_apply_ops` `canvas_attach_media`:分镜标签开着时,改动交给页面执行,用户看着它出现,也能撤销;没开时,改动写进保存的画布,下次打开就在。运行生成要分镜页开着。`canvas_attach_media` 把已经生成好的文件(如 dsh-media 存在 `media/`
|
|
105
|
-
- **影片任务** `media_get_task` `media_cancel_task`:读取或取消分镜画布的生成任务(`canvas_get_generation_status` 在 `outputs[].task`
|
|
172
|
+
- **分镜画布** `canvas_list_clients` `canvas_get_state` `canvas_get_selection` `canvas_read_node` `canvas_get_generation_status` `canvas_get_document` `canvas_create_text_nodes` `canvas_create_generation_flow` `canvas_generation_options` `canvas_set_generation_options` `canvas_run_generation` `canvas_connect_nodes` `canvas_delete_nodes` `canvas_apply_ops` `canvas_attach_media`:分镜标签开着时,改动交给页面执行,用户看着它出现,也能撤销;没开时,改动写进保存的画布,下次打开就在。运行生成要分镜页开着。`canvas_attach_media` 把已经生成好的文件(如 dsh-media 存在 `media/` 的图片,或工作区里别处的图片、视频、音频)放进指定节点,不重复生成。`canvas_generation_options` 和 `canvas_set_generation_options` 列出、设置或清除节点的运镜、相机、提示词技能(含技能节点)、首尾帧和预设(见上文“运镜与相机”“提示词技能与生成预设”),只改节点设置,不发起生成。`canvas_get_generation_status` 还带上页面记在节点上的原因(`error`):批量或 Agent 发起的生成在发出请求前被拒(如参考视频超限、提示词超长),或生成配置节点的输出全部失败;`canvas_get_document` 的节点摘要带上运镜、相机、技能、首尾帧和技能节点的技能。
|
|
173
|
+
- **影片任务** `media_get_task` `media_cancel_task`:读取或取消分镜画布的生成任务(`canvas_get_generation_status` 在 `outputs[].task` 里给出的任务号),以及剪切组发起的出片、拼接和分离音频(完成后 `file.landedNodeId` 是落到画板上的新节点,`file.derivedFrom` 列出各来源实际用到的区间;取消的剪切不留半个文件)。
|
|
106
174
|
- **导演组(按需)** `director_query` `director_models` `director_stage` `director_render` `director_render_status` `director_render_cancel` `director_inspect_model` `director_review` `director_compile_motion` `director_modeling_brief`:读导演台场景(结构、采样、事件、诊断、动作),列出能用的模型文件和尺寸,按指纹分步调度(先 dryRun;`place_model` 按真实尺寸放入模型,见下文“导演台里的模型”),编译动作,管理审阅版本(审阅版只能交给画布生成)。查询和调度在导演标签关着时作用于保存的节点,开着时作用于桌面上的实时场景;渲染、检视模型和审阅版本要导演标签开着。后台无头渲染暂未接入。
|
|
107
175
|
- **建模组(按需)** `space_plan_compile` `model_brief` `model_review` `model_adopt` `model_status` `model_report` `model_cancel`:按毫米写平面,编译成 `film/spaces/` 下导演台能打开的 GLB(先 dryRun 看尺寸、警告和楼梯可达性);为程序化模型准备建模任务,读 `film/models/<id>/model.json` 里的记录、写审阅、记录用户采用的版本。运行模型、拍检查图、导出和回读 GLB 需要无头浏览器,暂未接入。
|
|
176
|
+
- **剪切组(按需)** `video_clip` `video_split` `video_render_clip` `video_join` `video_extract_audio` `video_get_subtitles` `video_set_subtitles`:给视频(和音频)节点定入点出点(只是标记,不动文件;清除时存为 `null`),在某一时刻切成两个节点(后段是同一文件的新节点,连线指回原节点,字幕和导演镜头留在各自的部分),把入出点出片成文件,按给定顺序无损拼接(结果标为成片,`workflowKind: final`),分离音频,并读写视频节点的字幕。出片、拼接和分离音频作为影片任务运行,结果落在来源右边并连线。`video_get_subtitles` 分页读出字幕(JSON 或 SRT;时间按整个文件计,`timeBase: clip` 时从入点算起)和样式,视频换过(地址不同、大小不同,或时长差超过 250 毫秒)时标出 `mediaChanged`;`video_set_subtitles` 用 SRT/WebVTT 文本或字幕条列表替换读出时那一视图里的字幕:默认替换全部;`timeBase: clip` 时只替换入出点之内的字幕(入出点外的保留,跨过入出点边缘的字幕按读出的样子写回时,边缘外的部分也保留);带上那次读取的 `offset`/`limit` 和 `contentDigest` 时只替换那一页。新列表少了这部分里的字幕(没有同 id、时间上也不重叠的字幕)就拒绝并列出它们(`CANVAS_SUBTITLE_WOULD_REMOVE`),确实要删时再带 `replaceAll: true`——只读一部分再写回,不会删掉没读到的字幕;结果里有现存条数、保留未动的条数(`kept`)、删掉的条数(`removed`)和没能用上的条数(`dropped`)。写入的字幕按分镜画布导入的规则整理(排序、结束晚于开始、每条最多 2000 字、最多 5000 条,长句按标点自动断句);也可以只改样式,或清除(存为 `null`);保存时按节点当前的视频记下媒体键,和在分镜画布里保存的一样。`video_clip`、`video_split`、`video_render_clip`、`video_extract_audio` 和 `video_set_subtitles` 要带节点当前的 `content`(`expectedContent`),节点期间换了文件或正在生成就拒绝(`video_join` 和 `video_get_subtitles` 不用带);改读出来的字幕时再带上 `contentDigest`,字幕期间被改过就拒绝,不会覆盖;出片、拼接和分离音频还要带 Agent 自己的 `requestId`,重复提交只返回同一个任务(同一个 id 换了文件、区间或边界会被拒绝,新的剪辑要用新的 id)。只做剪切和拼接,不做转场、配乐或特效,字幕只显示在画面上、不写进视频文件,也不会发起生成、不花额度。
|
|
108
177
|
|
|
109
178
|
工具名和参数沿用 VibeDev Studio 的影视工具;工作区就是项目,所以不再需要 `project` 参数。
|
|
110
179
|
|
|
111
|
-
Every conversation has `film_project` (read or start the workspace's film — opening a film tab also starts it — or rename it and change its frame with `update`). Conversations in a film workspace also carry
|
|
180
|
+
Every conversation has `film_project` (read or start the workspace's film — opening a film tab also starts it — or rename it and change its frame with `update`). Conversations in a film workspace also carry 32 screenplay, storyboard and film-task tools (among them `canvas_generation_options` and `canvas_set_generation_options` for the camera moves, camera settings, prompt skills, first and last frames and presets of storyboard nodes), `film_tools` and guidance; the director desk's, the modeling and the cutting tools (`video_clip`, `video_split`, `video_render_clip`, `video_join`, `video_extract_audio`, and `video_get_subtitles` / `video_set_subtitles`, which read and write a video node's subtitles — cues in the time of its whole file, SubRip or WebVTT in, paged JSON or SubRip out, saved by the storyboard's own rules and flagged by `mediaChanged` when the video was replaced; a list written back replaces only the cues of the view it was read in — the mark's with `timeBase: clip`, one page with that read's `offset`/`limit` — and a write that would drop cues of that view is refused unless `replaceAll` says so, so reading part of a list never deletes the rest) are groups taken on when needed (the director group starts enabled when the board has a director node, the cutting group when it has a video with a file). All of them go through the same API as the workbench's pages. With the storyboard open, board edits run in the page (live and undoable); with it closed they are saved to the board, and running a generation needs the page.
|
|
112
181
|
|
|
113
182
|
### 编剧技能 · Screenwriting skill
|
|
114
183
|
|
|
@@ -146,17 +215,17 @@ npm run build # 先删掉 lib/ 和 client/,再构建 lib/(Host 一侧
|
|
|
146
215
|
|
|
147
216
|
浏览器端按 DSH 的模块加载格式打包:`client/client.js` 每次启动加载,只登记三个标签;工作台本体在 `client/client.workbench.js`,第一次打开标签时才加载。`scripts/check-client.mjs` 会检查打包结果(文件清单、加载器首行、只引用宿主提供的模块)。
|
|
148
217
|
|
|
149
|
-
**发布**:`npm pack` 和 `npm publish` 先跑 `prepack`——`npm run build`,再用 `scripts/check-package.mjs` 检查 `apps/canvas/index.html` 和下文列出的许可证、声明文件都在(导演台带了 glTF 解码器时还要有 `apps/canvas/director-desk/licenses/Apache-2.0.txt
|
|
218
|
+
**发布**:`npm pack` 和 `npm publish` 先跑 `prepack`——`npm run build`,再用 `scripts/check-package.mjs` 检查 `apps/canvas/index.html` 和下文列出的许可证、声明文件都在(导演台带了 glTF 解码器时还要有 `apps/canvas/director-desk/licenses/Apache-2.0.txt`),画布的四个目录(运镜、相机、提示词技能、生成预设)都通过 Agent 工具读取时的同一套检查,画布构建里没有 FFmpeg AAC 编码器(`aac-encoder` 分块或 `licenses/FFmpeg-LGPL-2.1.txt`;这一版不带它,页面重新编码声音用浏览器自带的 AAC 编码器),`apps/` 下除了 `canvas` 没有别的东西、顶层没有 `vendor/` 和 `models/`,该删的多余文件已删,`lib/` 里没有对不上源码的过期文件,`lib/` 和 `client/` 里没有构建机器的绝对路径,缺一样就拒绝打包(没有 `apps/` 的包能装上,但画布和导演台两个标签是空的)。`publishConfig` 把发布固定到 npm 官方源,镜像源不接受发布。同一个 `dsh-film-<版本>.tgz` 附到 GitHub Release `v<版本>`。
|
|
150
219
|
|
|
151
|
-
Only `lib/` and `client/` build from this repository. `apps/` is built by `node scripts/build-apps.mjs canvas` from sibling checkouts — `../canvas` on `feat/dsh-host` (vibedev-canvas) and `../director-desk` on `feat/dsh-procedural-mannequin` (vibedev-director-desk); both are private repositories, so only maintainers can rebuild `apps/`. The script replaces only `apps/canvas`: a checkout that comes from 0.1 must delete the other folders under `apps/` by hand, or the package check refuses to pack. The same step removes the files `scripts/app-excludes.mjs` lists (the director desk's experiment and smoke-test pages, benchmark image, and the model-runtime page with its toolchain, about 10 MB) and writes the app's licences and `THIRD-PARTY-NOTICES.txt` (every production npm dependency the bundle can contain, with version, licence, repository and licence text). `node scripts/build-apps.mjs notices canvas` rewrites only those, warning when a checkout is not at the commit the app's `component-build.json` records; `trim` only removes the excluded files. `prepack` builds and then runs `scripts/check-package.mjs`, which refuses to pack without the app, the licence and notice files (with the Apache License beside the director desk's glTF decoders when it has them), with anything but `canvas` under `apps/`, with a top-level `vendor/` or `models/`, with excluded files present, with stale files in `lib/`, or with build-machine paths in `lib/` or `client/`. `publishConfig` sends `npm publish` to the npm registry.
|
|
220
|
+
Only `lib/` and `client/` build from this repository. `apps/` is built by `node scripts/build-apps.mjs canvas` from sibling checkouts — `../canvas` on `feat/dsh-host` (vibedev-canvas) and `../director-desk` on `feat/dsh-procedural-mannequin` (vibedev-director-desk); both are private repositories, so only maintainers can rebuild `apps/`. The script replaces only `apps/canvas`: a checkout that comes from 0.1 must delete the other folders under `apps/` by hand, or the package check refuses to pack. The same step removes the files `scripts/app-excludes.mjs` lists (the director desk's experiment and smoke-test pages, benchmark image, and the model-runtime page with its toolchain, about 10 MB) and writes the app's licences and `THIRD-PARTY-NOTICES.txt` (every production npm dependency the bundle can contain, with version, licence, repository and licence text). `node scripts/build-apps.mjs notices canvas` rewrites only those, warning when a checkout is not at the commit the app's `component-build.json` records; `trim` only removes the excluded files. `prepack` builds and then runs `scripts/check-package.mjs`, which refuses to pack without the app, the licence and notice files (with the Apache License beside the director desk's glTF decoders when it has them), with a canvas catalogue that fails the check the agent's tools apply when they read it, with the FFmpeg AAC encoder still in the canvas build (an `aac-encoder` chunk or `licenses/FFmpeg-LGPL-2.1.txt`; this release does not ship it, and the page re-encodes sound with the browser's own AAC encoder), with anything but `canvas` under `apps/`, with a top-level `vendor/` or `models/`, with excluded files present, with stale files in `lib/`, or with build-machine paths in `lib/` or `client/`. `publishConfig` sends `npm publish` to the npm registry.
|
|
152
221
|
|
|
153
222
|
## 许可 · License
|
|
154
223
|
|
|
155
224
|
本插件以 MIT 许可证发布,见 `LICENSE`。包里还带着别人的代码,许可证和第三方声明放在这些地方:
|
|
156
225
|
|
|
157
226
|
- **导演台的场景数学**:`lib/director/vendor/director-math/`(源码在 `src/director/vendor/director-math/`)原样复制自 vibedev-director-desk(源码仓库不公开),Copyright (c) 2026 YZ,MIT;许可证原文在包里的 `lib/director/vendor/director-math/LICENSE`。
|
|
158
|
-
- **分镜画布** `apps/canvas/`:vibedev-canvas,MIT,见 `apps/canvas/LICENSE
|
|
227
|
+
- **分镜画布** `apps/canvas/`:vibedev-canvas,MIT,见 `apps/canvas/LICENSE`。它基于 basketikun 的 Infinite Canvas(MIT);`apps/canvas/NOTICE` 列出它所基于或改编了代码的每个项目、各自的许可证或授权,以及由每个来源改编的文件(带出处提交)。其中的导演台 `apps/canvas/director-desk/` 来自 vibedev-director-desk(MIT,Copyright (c) 2026 YZ,见 `apps/canvas/director-desk/LICENSE`)。两者打包进去的 npm 依赖见 `apps/canvas/THIRD-PARTY-NOTICES.txt`;导演台自己的构建另带 `apps/canvas/director-desk/THIRD-PARTY-NOTICES.txt` 和 `licenses/`(Mediabunny,MPL-2.0)。
|
|
159
228
|
|
|
160
229
|
声明文件逐个列出 npm 包时,带了 LICENSE 等文件的附上全文;有些包自己就没带许可证文件,声明里写明了,并给出它在 package.json 里声明的许可证。
|
|
161
230
|
|
|
162
|
-
dsh-film is MIT (`LICENSE`). The third-party code in the package and where its licences and notices are: the director desk's scene math (MIT, Copyright (c) 2026 YZ) at `lib/director/vendor/director-math/LICENSE`; the storyboard canvas and its director desk at `apps/canvas/LICENSE`, `apps/canvas/director-desk/LICENSE` and `apps/canvas/THIRD-PARTY-NOTICES.txt` (the desk's own build adds notices in `apps/canvas/director-desk/`). The notices list every npm package with the licence files it ships; packages that ship none are marked as such, with the licence their package.json declares.
|
|
231
|
+
dsh-film is MIT (`LICENSE`). The third-party code in the package and where its licences and notices are: the director desk's scene math (MIT, Copyright (c) 2026 YZ) at `lib/director/vendor/director-math/LICENSE`; the storyboard canvas and its director desk at `apps/canvas/LICENSE`, `apps/canvas/NOTICE` (the canvas is based on Infinite Canvas by basketikun, MIT; the NOTICE names each project the canvas is based on or adapts code from, with the licence or permission it is used under, and lists each derived file with its source commit), `apps/canvas/director-desk/LICENSE` and `apps/canvas/THIRD-PARTY-NOTICES.txt` (the desk's own build adds notices in `apps/canvas/director-desk/`). The notices list every npm package with the licence files it ships; packages that ship none are marked as such, with the licence their package.json declares.
|
package/apps/canvas/LICENSE
CHANGED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
VibeDev Canvas (vibedev-canvas)
|
|
2
|
+
|
|
3
|
+
This program is licensed under the MIT License. The complete license text,
|
|
4
|
+
with every copyright line it carries, is provided in LICENSE.
|
|
5
|
+
|
|
6
|
+
Each source below that this repository adapts code from lists the files
|
|
7
|
+
derived from it, with the source commit. A derived file also names its
|
|
8
|
+
source in a header comment, and FORK-DELTA.md records every existing file a
|
|
9
|
+
change touched. A project that served only as a design reference is
|
|
10
|
+
acknowledged without a file list.
|
|
11
|
+
|
|
12
|
+
================================================================================
|
|
13
|
+
Infinite Canvas (base)
|
|
14
|
+
================================================================================
|
|
15
|
+
|
|
16
|
+
https://github.com/basketikun/infinite-canvas
|
|
17
|
+
Copyright (c) 2026 basketikun
|
|
18
|
+
MIT License (relicensed from AGPL-3.0 in commit 890ba95, authored by
|
|
19
|
+
HouYunFei)
|
|
20
|
+
Base version: v0.17.0 (93ddcde), merged up to v0.19.0 + main (dab19ad);
|
|
21
|
+
upstream merges are recorded in FORK-DELTA.md.
|
|
22
|
+
|
|
23
|
+
This repository is a fork of Infinite Canvas. Upstream authors and
|
|
24
|
+
contributors keep their copyright and attribution. The basketikun logo
|
|
25
|
+
(web/public/logo.svg, plugins/infinite-canvas/assets/icon.png) and the author
|
|
26
|
+
information in README.md are kept as the upstream README asks.
|
|
27
|
+
|
|
28
|
+
================================================================================
|
|
29
|
+
Open AI Canvas
|
|
30
|
+
================================================================================
|
|
31
|
+
|
|
32
|
+
https://github.com/ddcat-ai/open-ai-canvas
|
|
33
|
+
|
|
34
|
+
No code from Open AI Canvas is included; only its interaction design served
|
|
35
|
+
as a reference.
|
|
36
|
+
|
|
37
|
+
================================================================================
|
|
38
|
+
tigerowo/infinite-canvas
|
|
39
|
+
================================================================================
|
|
40
|
+
|
|
41
|
+
https://github.com/tigerowo/infinite-canvas
|
|
42
|
+
Author: tigerowo (TIGERQWQ)
|
|
43
|
+
|
|
44
|
+
Portions adapted from tigerowo/infinite-canvas (author TIGERQWQ), used under
|
|
45
|
+
the author's permission and licensed to VibeDev under the MIT License. The
|
|
46
|
+
repository itself is published under AGPL-3.0; only code its author wrote is
|
|
47
|
+
used here, each piece checked first against basketikun/infinite-canvas,
|
|
48
|
+
HuFakai/infinite-canvas and ganbo-gab/open-storyboard-canvas, and none of the
|
|
49
|
+
tigerowo repository's other content is included. Files:
|
|
50
|
+
|
|
51
|
+
web/src/components/canvas/canvas-camera-popover.tsx (node-anchored popover
|
|
52
|
+
positioning and the clamped stepper; the popover layout is ours)
|
|
53
|
+
from web/src/app/(user)/canvas/components/canvas-camera-control.tsx
|
|
54
|
+
at 2cc2fcc
|
|
55
|
+
web/src/components/canvas/canvas-video-node-shell.tsx (video node controls)
|
|
56
|
+
from web/src/app/(user)/canvas/components/canvas-node.tsx
|
|
57
|
+
at 434da29, 51c4503 and 0670c8f
|
|
58
|
+
web/src/components/canvas/canvas-audio-trim-dialog.tsx (audio trim dialog)
|
|
59
|
+
from web/src/app/(user)/canvas/[id]/canvas-client-page.tsx
|
|
60
|
+
at 51c4503 and 0670c8f
|
|
61
|
+
web/src/pages/canvas/hooks/use-video-timeline.tsx (extract-audio flow)
|
|
62
|
+
from web/src/app/(user)/canvas/[id]/canvas-client-page.tsx
|
|
63
|
+
at 51c4503 and 0670c8f
|
|
64
|
+
web/src/components/canvas/canvas-side-panel.tsx (asset category and
|
|
65
|
+
multi-tag filter)
|
|
66
|
+
from web/src/app/(user)/canvas/components/canvas-side-panel.tsx
|
|
67
|
+
at f30b8d7
|
|
68
|
+
web/src/pages/assets/index.tsx (asset category field, category and tag
|
|
69
|
+
filters)
|
|
70
|
+
from web/src/app/(user)/assets/page.tsx and
|
|
71
|
+
web/src/components/assets/asset-form-modal.tsx
|
|
72
|
+
at f30b8d7
|
|
73
|
+
web/src/lib/asset-filters.ts (category and tag lists, the category, tag and
|
|
74
|
+
keyword filter)
|
|
75
|
+
from web/src/app/(user)/assets/page.tsx and
|
|
76
|
+
web/src/app/(user)/canvas/components/canvas-side-panel.tsx
|
|
77
|
+
at f30b8d7
|
|
78
|
+
|
|
79
|
+
================================================================================
|
|
80
|
+
Not included
|
|
81
|
+
================================================================================
|
|
82
|
+
|
|
83
|
+
No code from HuFakai/infinite-canvas (AGPL-3.0) is included. The camera data
|
|
84
|
+
tables, camera and lens artwork and brand names of
|
|
85
|
+
ganbo-gab/open-storyboard-canvas are not included. Product names and logos of
|
|
86
|
+
model vendors, sponsors and communities that the upstream project showed have
|
|
87
|
+
been removed.
|
|
88
|
+
|
|
89
|
+
================================================================================
|
|
90
|
+
Bundled packages
|
|
91
|
+
================================================================================
|
|
92
|
+
|
|
93
|
+
The npm packages a built app contains, and the 3D director desk bundled with
|
|
94
|
+
it, are listed with their licences in THIRD-PARTY-NOTICES.txt in the built
|
|
95
|
+
app (and in director-desk/THIRD-PARTY-NOTICES.txt for the desk).
|