dsh-film 0.3.5 → 0.3.6
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 +15 -5
- package/client/client.js +18 -72
- package/client/client.workbench.js +1 -1
- package/lib/agent/director-tools.d.ts +1 -1
- package/lib/agent/director-tools.js +8 -8
- package/lib/agent/guidance.js +1 -1
- package/lib/director/live.d.ts +1 -1
- package/lib/director/live.js +1 -1
- package/lib/director/model-placement.js +1 -1
- package/lib/studio/director-routes.d.ts +1 -1
- package/lib/studio/director-routes.js +1 -1
- package/lib/studio/story-production-routes.d.ts +1 -1
- package/lib/studio/story-production-routes.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# dsh-film · VibeDev 影视工作台
|
|
2
2
|
|
|
3
|
-
在 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 和 VibeDev
|
|
3
|
+
在 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 和 VibeDev 里做片:聊天右侧的侧栏多出两个标签——**剧本、分镜画布**;**导演台**不再是独立标签,改在分镜画布里以 3D 导演台节点打开。左边和 Agent 聊,右边看和改成果。项目是工作区里 `film/` 下的普通文件;Agent 用专门的影视工具改剧本和分镜、调度导演台(见下),和右边看到的是同一份。
|
|
4
4
|
|
|
5
5
|
> 0.2 仍属预览。分镜画布(含导演台)用的是 VibeDev 的原版前端,跑在插件自己的接口上;剧本标签是按 DSH 界面重写的,文件格式与 VibeDev Studio 的编剧台相同。图片、视频的生成由可选的「VibeDev 账号与模型」插件 [@vibedev-si/dsh-vibedev](https://github.com/VibeDev-Si/dsh-vibedev)(原 dsh-media)负责。
|
|
6
6
|
|
|
7
|
-
A film workbench for DeepSeek Harness and VibeDev:
|
|
7
|
+
A film workbench for DeepSeek Harness and VibeDev: two right-sidebar tabs — script and storyboard; the director desk is no longer a tab of its own, it opens inside the storyboard canvas as a 3D director node — working on one film per workspace, kept as plain files under `film/`. In this 0.2 preview, the storyboard (with the director desk) is VibeDev's original front end running on the plugin's own API, and the script tab is a DSH-native rewrite. The agent works on the same film through its own film tools.
|
|
8
8
|
|
|
9
9
|
## 安装 · Install
|
|
10
10
|
|
|
@@ -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/VibeDev-Si/dsh-film/releases/download/v0.3.
|
|
40
|
+
https://github.com/VibeDev-Si/dsh-film/releases/download/v0.3.6/dsh-film-0.3.6.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`。
|
|
@@ -48,7 +48,7 @@ https://github.com/VibeDev-Si/dsh-film/releases/download/v0.3.5/dsh-film-0.3.5.t
|
|
|
48
48
|
|
|
49
49
|
**「VibeDev 账号与模型」插件是可选的**:只有在分镜画布里生成图片和视频才需要另装 [@vibedev-si/dsh-vibedev](https://github.com/VibeDev-Si/dsh-vibedev)(原 dsh-media,包名 `@vibedev-si/dsh-vibedev`,装法相同;在侧边栏底部或「设置 → VibeDev 账号」登录 VibeDev,走 VibeDev 网关,按用量从 VibeDev 余额扣费)。不装也能写剧本、排分镜和调度导演台;从 VibeDev 插件中心安装影视工作台时会把它一并装上。分镜画布给每个视频模型列出的模式与该插件实际接受的一致:声明不收首帧的线路(Seedance 2.5(VibeDev)、2.5 30s(VibeDev)、2.5 480p 30s(山海)和三条 lec 线路;Seedance 2.5 特价按次收首帧,仍有图生视频)不显示“图生视频”,接一张图时改走“全能参考”,图作为参考图发送;以前保存成“图生视频”的节点在这些线路上也按全能参考生成。
|
|
50
50
|
|
|
51
|
-
装好后打开任意会话的右侧侧栏,在“开始”页点“剧本”等入口。会话需要有工作区。第一次打开任一影视标签时,插件自动在工作区里建好影片(片名取工作区文件夹名,画幅 16:9
|
|
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
|
|
|
53
53
|
**升级**:按上面的方法直接安装新版本即可,会覆盖旧版本,不用先卸载。装好后要重启 DeepSeek Harness / VibeDev,新版本才会生效;重启之前,影视工作台顶部会显示提示横幅,分镜画布和导演台也先不打开。影片是工作区里 `film/` 下的文件,升级和卸载插件都不会动它们。
|
|
54
54
|
|
|
@@ -61,7 +61,17 @@ Requires DeepSeek Harness 0.2.x or VibeDev (VibeDev Next), which is built on it.
|
|
|
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
62
|
- **The VibeDev account & models plugin is optional**: only image and video generation on the storyboard needs [@vibedev-si/dsh-vibedev](https://github.com/VibeDev-Si/dsh-vibedev) (formerly dsh-media; sign in to VibeDev at the bottom of the sidebar or in Settings → VibeDev account). Everything else works without it; installing the workbench from the VibeDev Plugin Center installs it too. The storyboard lists for each video model the modes that plugin 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
|
-
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
|
|
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 two 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
|
+
|
|
66
|
+
### 0.3.6 版本说明 · 0.3.6 release note
|
|
67
|
+
|
|
68
|
+
- **右侧栏从三个标签减为两个:剧本、分镜画布**。**导演台不再是独立标签**,改在分镜画布里以 3D 导演台节点打开:画布入口不变,台内的场景、机位、审阅和全部 `director_*` 工具都不变。Agent 的导航说明也同步改成「在分镜画布里打开对应导演台节点」。
|
|
69
|
+
- **旧标签不会自动消失**:升级前导演台标签还开着的话,重启后会显示宿主自带的「不可用」提示,**请用户自己关一次**。插件**不会**自动移除该标签,也**不会**删除任何数据或未保存的 3D 场景。
|
|
70
|
+
- 其余内容与 0.3.5 相同(含 0.3.4 的范围响应修复与 0.3.5 的「兼容播放」入口)。
|
|
71
|
+
|
|
72
|
+
- **The right sidebar now has two tabs — script and storyboard**. The **director desk is no longer a tab of its own**: it opens inside the storyboard canvas as a 3D director node (the canvas entry is unchanged, and the desk's scenes, cameras, reviews and every `director_*` tool are unchanged). The Agent's own guidance now says "open the director node in the storyboard canvas".
|
|
73
|
+
- **An old tab is not removed by itself**: if the director desk tab was still open before the upgrade, after the restart it shows the host's own "unavailable" notice — **ask the user to close it once**. The plugin does **not** remove that tab, and does **not** delete any data or unsaved 3D scene.
|
|
74
|
+
- Everything else matches 0.3.5 (including 0.3.4's range-response fix and 0.3.5's "Prepare playback" entry).
|
|
65
75
|
|
|
66
76
|
### 0.3.5 版本说明 · 0.3.5 release note
|
|
67
77
|
|
package/client/client.js
CHANGED
|
@@ -663,77 +663,22 @@ window.__ModuleLoader__.load({ id: "dsh-film", factory: (require) => {
|
|
|
663
663
|
]
|
|
664
664
|
});
|
|
665
665
|
}
|
|
666
|
-
/**
|
|
667
|
-
* The director desk: a film camera.
|
|
668
|
-
* @param props - canvas size and layout class.
|
|
669
|
-
* @returns the artwork.
|
|
670
|
-
*/
|
|
671
|
-
function ArtworkDirector({ size = 36, className }) {
|
|
672
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
|
|
673
|
-
width: size,
|
|
674
|
-
height: size,
|
|
675
|
-
className,
|
|
676
|
-
"aria-hidden": "true",
|
|
677
|
-
viewBox: "0 0 36 36",
|
|
678
|
-
fill: "none",
|
|
679
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
680
|
-
children: [
|
|
681
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
|
|
682
|
-
x: "6.5",
|
|
683
|
-
y: "14",
|
|
684
|
-
width: "16",
|
|
685
|
-
height: "12",
|
|
686
|
-
rx: "2",
|
|
687
|
-
stroke: "#E5679B",
|
|
688
|
-
strokeWidth: "2"
|
|
689
|
-
}),
|
|
690
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
691
|
-
d: "M22.5 18L29.5 14.5V25.5L22.5 22",
|
|
692
|
-
stroke: "#E5679B",
|
|
693
|
-
strokeWidth: "2",
|
|
694
|
-
strokeLinejoin: "round"
|
|
695
|
-
}),
|
|
696
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
697
|
-
cx: "10.5",
|
|
698
|
-
cy: "9.5",
|
|
699
|
-
r: "3",
|
|
700
|
-
fill: "#F2A7C6"
|
|
701
|
-
}),
|
|
702
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
703
|
-
cx: "18",
|
|
704
|
-
cy: "9.5",
|
|
705
|
-
r: "3",
|
|
706
|
-
fill: "#F2A7C6"
|
|
707
|
-
})
|
|
708
|
-
]
|
|
709
|
-
});
|
|
710
|
-
}
|
|
711
666
|
//#endregion
|
|
712
667
|
//#region src/client/views.ts
|
|
713
|
-
const PARTS = [
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
artwork: ArtworkBoard
|
|
728
|
-
},
|
|
729
|
-
{
|
|
730
|
-
view: "director",
|
|
731
|
-
id: "dsh-film/director",
|
|
732
|
-
kind: "film-director",
|
|
733
|
-
order: 103,
|
|
734
|
-
artwork: ArtworkDirector
|
|
735
|
-
}
|
|
736
|
-
];
|
|
668
|
+
const PARTS = [{
|
|
669
|
+
view: "story",
|
|
670
|
+
id: "dsh-film/story",
|
|
671
|
+
kind: "film-story",
|
|
672
|
+
order: 100,
|
|
673
|
+
artwork: ArtworkStory,
|
|
674
|
+
keepMounted: true
|
|
675
|
+
}, {
|
|
676
|
+
view: "board",
|
|
677
|
+
id: "dsh-film/board",
|
|
678
|
+
kind: "film-board",
|
|
679
|
+
order: 101,
|
|
680
|
+
artwork: ArtworkBoard
|
|
681
|
+
}];
|
|
737
682
|
/**
|
|
738
683
|
* The tab kind of a part.
|
|
739
684
|
* @param view - the part.
|
|
@@ -834,9 +779,10 @@ window.__ModuleLoader__.load({ id: "dsh-film", factory: (require) => {
|
|
|
834
779
|
//#endregion
|
|
835
780
|
//#region src/client/index.ts
|
|
836
781
|
/**
|
|
837
|
-
* dsh-film browser half: the
|
|
838
|
-
* storyboard
|
|
839
|
-
*
|
|
782
|
+
* dsh-film browser half: the two parts of the film workbench — script,
|
|
783
|
+
* storyboard — as right-sidebar tab types, each with an entry box on the
|
|
784
|
+
* sidebar's guide page. The 3D director desk has no tab of its own: it opens
|
|
785
|
+
* inside the storyboard canvas, as a director node on the board.
|
|
840
786
|
*
|
|
841
787
|
* Built by tsdown into the `__ModuleLoader__` factory bundle at
|
|
842
788
|
* client/client.js, with the workbench itself in client/client.workbench.js,
|
|
@@ -693,7 +693,7 @@ window.__ModuleLoader__.load({ id: "dsh-film", chunk: "client.workbench.js", fac
|
|
|
693
693
|
* an older dictionary, whose translate function echoes keys it lacks.
|
|
694
694
|
*/
|
|
695
695
|
/** The version this bundle was built as (tsdown defines it); `dev` where nothing does (node tests). */
|
|
696
|
-
const CLIENT_VERSION = "0.3.
|
|
696
|
+
const CLIENT_VERSION = "0.3.6";
|
|
697
697
|
/**
|
|
698
698
|
* Whether the page should ask for a restart.
|
|
699
699
|
* @param client - the version this page was built as.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* `model_brief`, apps/daemon/src/mcp.ts), calling the director routes
|
|
4
4
|
* in-process. Querying, staging, reviews, motion compiling and modeling
|
|
5
5
|
* briefs are computed here from the saved board — or from the open desk, which
|
|
6
|
-
* is read first when the
|
|
6
|
+
* is read first when the storyboard canvas shows it. Rendering, output status and model
|
|
7
7
|
* inspection need the desk open: those calls go to the canvas page that has
|
|
8
8
|
* it (see src/director/live.ts for how that page is found).
|
|
9
9
|
*
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* `model_brief`, apps/daemon/src/mcp.ts), calling the director routes
|
|
4
4
|
* in-process. Querying, staging, reviews, motion compiling and modeling
|
|
5
5
|
* briefs are computed here from the saved board — or from the open desk, which
|
|
6
|
-
* is read first when the
|
|
6
|
+
* is read first when the storyboard canvas shows it. Rendering, output status and model
|
|
7
7
|
* inspection need the desk open: those calls go to the canvas page that has
|
|
8
8
|
* it (see src/director/live.ts for how that page is found).
|
|
9
9
|
*
|
|
@@ -100,7 +100,7 @@ export function directorTools(services) {
|
|
|
100
100
|
+ 'is, facing, action, moving; where each camera is, what it tracks and who is in its frame (screen x -1 left..1 right); aspect overrides. '
|
|
101
101
|
+ 'kind=diagnostics (step 0.02–2, cameraIds): subjects leaving frame or head cut, the 180° line crossed, routes through walls, late arrivals, '
|
|
102
102
|
+ 'screen order. kind=actions with objectId: the character\'s actions, how each renders, compatibility and library needs, plus its action clips. '
|
|
103
|
-
+ 'Reads the open desk when the
|
|
103
|
+
+ 'Reads the open desk when the storyboard canvas shows it, else the saved node.',
|
|
104
104
|
parameters: {
|
|
105
105
|
kind: { type: 'string', required: true, enum: ['structure', 'sample', 'diagnostics', 'events', 'actions'] },
|
|
106
106
|
nodeId,
|
|
@@ -127,7 +127,7 @@ export function directorTools(services) {
|
|
|
127
127
|
+ 'includeWorkspace (default true), GLB/FBX/OBJ files elsewhere in the workspace not imported yet. Each gives path, inFilm, format, role '
|
|
128
128
|
+ '(space|model), placeable, suggestedKind (scene|prop|auto: auto means it may carry a rig — a skinned glTF (hasSkin:true), or any FBX, whose '
|
|
129
129
|
+ 'rig the Host cannot inspect; place_model places it as a prop unless you pass kind, and a rigged character is imported by the person in the '
|
|
130
|
-
+ '
|
|
130
|
+
+ 'desk\'s 空间库, opened from the director node in the storyboard canvas), the '
|
|
131
131
|
+ 'measured bounds in file units, metresPerUnit when the file declares its units (GLB 1, FBX by its unit) or suggestedMetresPerUnit (OBJ guess), '
|
|
132
132
|
+ 'sizeMetres when the units are known, hasSkin, compression and any problem; pending means not measured yet (place_model measures it). Place '
|
|
133
133
|
+ 'one with director_stage place_model. At most 100 entries.',
|
|
@@ -160,7 +160,7 @@ export function directorTools(services) {
|
|
|
160
160
|
}),
|
|
161
161
|
defineTool({
|
|
162
162
|
name: 'director_stage',
|
|
163
|
-
description: 'Stage a director-desk scene from a plan in a director\'s words, compiled, checked and written into the desk (open in the
|
|
163
|
+
description: 'Stage a director-desk scene from a plan in a director\'s words, compiled, checked and written into the desk (open in the storyboard canvas, as a director node) or '
|
|
164
164
|
+ 'the board\'s node; a node never opened starts empty. plan = {ops:[...]} (1–200, metres and scene seconds, additive: only what an op names changes). '
|
|
165
165
|
+ 'Core ops: place_character {id?,name?,at:[x,z]|[x,y,z],facing?:degrees|{toward:id},bodyType?,action?}; place_prop {id?,name?,geometry?:box|sphere|'
|
|
166
166
|
+ 'cylinder|torus|cone|pyramid,at,size:[w,h,d]}; move {objectId,start,end,path:[[x,z],…] (one point walks there),holds?:[{point,seconds,action?}],'
|
|
@@ -178,7 +178,7 @@ export function directorTools(services) {
|
|
|
178
178
|
+ 'at?:[x,z]|[x,y,z],facing?:degrees,metresPerUnit?|size?:{height|width|depth|longest:metres},name?,id?,assetId?}: it hashes, measures and '
|
|
179
179
|
+ 'calibrates for you and expands into import_asset, calibrate_asset, place_asset and transform_objects; a workspace file is copied into '
|
|
180
180
|
+ 'film/canvas/models/ only on apply (a dryRun reports wouldImport). Units come from metresPerUnit, else size over the measured box, else the file '
|
|
181
|
-
+ '(GLB metres, an FBX\'s declared unit); an OBJ needs one of them. Characters (rigged) are imported by the person in the
|
|
181
|
+
+ '(GLB metres, an FBX\'s declared unit); an OBJ needs one of them. Characters (rigged) are imported by the person in the desk\'s 空间库 (open that director node in the storyboard canvas), '
|
|
182
182
|
+ 'not here. Up to 40 per plan; the answer\'s placed[] gives each assetId, objectId and size. '
|
|
183
183
|
+ 'dryRun:true compiles and checks without writing. Every answer carries the result\'s diagnostics: read them before calling it done. Pass the '
|
|
184
184
|
+ 'fingerprint from your last read (director_query events/actions) or last applied stage as expectedFingerprint, for dryRun and apply alike, so a '
|
|
@@ -202,7 +202,7 @@ export function directorTools(services) {
|
|
|
202
202
|
}),
|
|
203
203
|
defineTool({
|
|
204
204
|
name: 'director_render',
|
|
205
|
-
description: 'Render what a director-desk scene looks like into the film, through the desk open in the
|
|
205
|
+
description: 'Render what a director-desk scene looks like into the film, through the desk open in the storyboard canvas (open the director node there; ask the person to if the '
|
|
206
206
|
+ 'call says it is not). frames: [{shotId?,cameraId?,at?:scene seconds,position?:first|current|last,fileName?}] — clean frames. sheet: true or '
|
|
207
207
|
+ '{moment?:start|middle|end,cameraIds?,sequence?} — a contact sheet of every shot\'s opening, the way to check a staging at a glance. video: true or '
|
|
208
208
|
+ '{sequence?,shotId?,cameraId?,fps?:24|30|60} — an MP4 reference that carries the camera move into a generation. Each file lands on the board as a '
|
|
@@ -237,7 +237,7 @@ export function directorTools(services) {
|
|
|
237
237
|
defineTool({
|
|
238
238
|
name: 'director_render_status',
|
|
239
239
|
description: 'Read the desk\'s current output job (person- or agent-started): phase, progress, saved result count, terminal error. task:null means '
|
|
240
|
-
+ 'none. Needs the desk open in the
|
|
240
|
+
+ 'none. Needs the desk open in the storyboard canvas: the director node there must be open.',
|
|
241
241
|
parameters: { nodeId },
|
|
242
242
|
output: jsonOutput,
|
|
243
243
|
isConcurrencySafe: () => true,
|
|
@@ -257,7 +257,7 @@ export function directorTools(services) {
|
|
|
257
257
|
defineTool({
|
|
258
258
|
name: 'director_inspect_model',
|
|
259
259
|
description: 'Extract wall/floor/ceiling candidates from a static scene or prop model placed in the scene, from the geometry the open desk has loaded '
|
|
260
|
-
+ '(the
|
|
260
|
+
+ '(the desk must show the model: open the director node in the storyboard canvas). Metadata, name guesses and bare bounds are labelled; unknown parts and single treads need '
|
|
261
261
|
+ 'review. Changes nothing: review the candidates and the proposed plan, then director_stage it with dryRun and the ORIGINAL returned fingerprint. '
|
|
262
262
|
+ 'Saved spatial profiles are readable with director_query structure even with the desk closed.',
|
|
263
263
|
parameters: {
|
package/lib/agent/guidance.js
CHANGED
|
@@ -27,7 +27,7 @@ export const FILM_GUIDANCE = [
|
|
|
27
27
|
'',
|
|
28
28
|
'### Director desk',
|
|
29
29
|
'The director_* tools are the director tool group: a conversation starts with it when the board has a director node; otherwise enable it with film_tools.',
|
|
30
|
-
'A director node on the board holds a 3D blocking scene. director_query reads it (structure, sample, events for the fingerprint, diagnostics, actions) and director_stage changes it from a plan of ops: dryRun first, apply with the fingerprint you read, and read the diagnostics before calling it done. Both work with the
|
|
30
|
+
'A director node on the board holds a 3D blocking scene. director_query reads it (structure, sample, events for the fingerprint, diagnostics, actions) and director_stage changes it from a plan of ops: dryRun first, apply with the fingerprint you read, and read the diagnostics before calling it done. Both work with the director node closed on the board (on the saved node) and with the desk open (on its live scene). director_render, director_render_status/cancel, director_inspect_model and review versions need the desk open in the storyboard canvas: if a call says it is not, ask the person to open the director node there. Look at renders with read_image. A review is confirmed only when the person accepts that exact version. Model files the person put in the workspace or the film (GLB, FBX, OBJ) are listed by director_models and placed at their real size with director_stage place_model; for a rigged character, ask the person to use the desk\'s 空间库 (opened from the director node in the storyboard canvas).',
|
|
31
31
|
'### Spaces and models',
|
|
32
32
|
'space_plan_compile and the model_* tools are the modeling tool group: enable it with film_tools when the person wants a place built or a procedural model.',
|
|
33
33
|
'A place for a scene (a room, a corridor, a building) is a plan you write in millimetres and compile with space_plan_compile: dryRun first, read the warnings and access issues, fix the plan, then write it. The GLB lands in film/spaces/ and the director desk\'s 空间库 lists it; say its size when you report it.',
|
package/lib/director/live.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* One change in how the page is chosen. Studio's film workspace has one
|
|
10
10
|
* canvas page per board with the desk as an overlay; in the film workbench
|
|
11
|
-
* the
|
|
11
|
+
* the storyboard tab and the desk page are two canvas pages on the same board, and the
|
|
12
12
|
* newest page is often the one without the desk. So:
|
|
13
13
|
*
|
|
14
14
|
* - a scene read asks every page showing the board (`director_read_scene`)
|
package/lib/director/live.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* One change in how the page is chosen. Studio's film workspace has one
|
|
10
10
|
* canvas page per board with the desk as an overlay; in the film workbench
|
|
11
|
-
* the
|
|
11
|
+
* the storyboard tab and the desk page are two canvas pages on the same board, and the
|
|
12
12
|
* newest page is often the one without the desk. So:
|
|
13
13
|
*
|
|
14
14
|
* - a scene read asks every page showing the board (`director_read_scene`)
|
|
@@ -71,7 +71,7 @@ export function parsePlaceModel(raw, index) {
|
|
|
71
71
|
if (path === '')
|
|
72
72
|
throw new DirectorStageError('place_model 需要 path:film/…、相对 film/ 的路径,或工作区里的模型文件', index);
|
|
73
73
|
if (raw.kind === 'character') {
|
|
74
|
-
throw new DirectorStageError('place_model
|
|
74
|
+
throw new DirectorStageError('place_model 不放人物:带骨架的人物要在分镜画布里的导演台节点打开空间库导入(导演台要检查骨架);静态模型用 kind prop 或 scene', index);
|
|
75
75
|
}
|
|
76
76
|
if (raw.kind !== undefined && raw.kind !== 'prop' && raw.kind !== 'scene')
|
|
77
77
|
throw new DirectorStageError('place_model 的 kind 只能是 prop 或 scene', index);
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* Not offered: headless background rendering (`/api/projects/:id/director/renders`),
|
|
14
14
|
* which in Studio runs the desk in an embedded Chromium no DSH plugin has.
|
|
15
15
|
* Without it every render, model inspection and review version needs the
|
|
16
|
-
* desk open in the
|
|
16
|
+
* desk open in the storyboard canvas, exactly as Studio's foreground path does.
|
|
17
17
|
* @module dsh-film/studio/director-routes
|
|
18
18
|
*/
|
|
19
19
|
import type { CanvasBoardAgent } from '../canvas/board-agent.js';
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* Not offered: headless background rendering (`/api/projects/:id/director/renders`),
|
|
14
14
|
* which in Studio runs the desk in an embedded Chromium no DSH plugin has.
|
|
15
15
|
* Without it every render, model inspection and review version needs the
|
|
16
|
-
* desk open in the
|
|
16
|
+
* desk open in the storyboard canvas, exactly as Studio's foreground path does.
|
|
17
17
|
* @module dsh-film/studio/director-routes
|
|
18
18
|
*/
|
|
19
19
|
import { join } from 'node:path';
|
|
@@ -31,7 +31,7 @@ export interface StoryProductionDeps {
|
|
|
31
31
|
/**
|
|
32
32
|
* Ask the pages showing the film's board whether a director node's desk holds
|
|
33
33
|
* a scene, as Studio's screenwriter routes do. Every page is asked (the 分镜
|
|
34
|
-
* and
|
|
34
|
+
* and the desk page are two pages on one board) and the open desk is used wherever
|
|
35
35
|
* it is; no page means the desk is closed.
|
|
36
36
|
* @param agent - the open canvas pages.
|
|
37
37
|
* @returns the reader.
|
|
@@ -29,7 +29,7 @@ const DOCUMENT = '/api/projects/:projectId/story/documents/:documentId';
|
|
|
29
29
|
/**
|
|
30
30
|
* Ask the pages showing the film's board whether a director node's desk holds
|
|
31
31
|
* a scene, as Studio's screenwriter routes do. Every page is asked (the 分镜
|
|
32
|
-
* and
|
|
32
|
+
* and the desk page are two pages on one board) and the open desk is used wherever
|
|
33
33
|
* it is; no page means the desk is closed.
|
|
34
34
|
* @param agent - the open canvas pages.
|
|
35
35
|
* @returns the reader.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-film",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.6",
|
|
4
4
|
"description": "VibeDev 影视工作台:在 DeepSeek Harness 和 VibeDev 的右侧侧栏里写剧本、排分镜和调度导演台,Agent 用影视工具协同改片 · Film workbench for DeepSeek Harness and VibeDev: screenplay, storyboard canvas and director desk in the right sidebar, with film tools for the agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|