dsh-hyperframes 0.10.1 → 0.11.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/CHANGELOG.md +13 -0
- package/README.en.md +4 -3
- package/README.md +4 -3
- package/docs/WORKBENCH.md +6 -0
- package/lib/client.js +40 -2
- package/lib/media-templates.d.ts +1 -1
- package/lib/media-templates.js +1 -1
- package/package.json +2 -2
- package/plugin.json +1 -1
- package/skills/NOTICE.md +1 -1
- package/skills/UPSTREAM.json +93 -8
- package/skills/embedded-captions/SKILL.md +1 -1
- package/skills/faceless-explainer/SKILL.md +1 -1
- package/skills/general-video/SKILL.md +1 -1
- package/skills/hyperframes-animation/SKILL.md +1 -1
- package/skills/hyperframes-audio/SKILL.md +1 -1
- package/skills/hyperframes-core/SKILL.md +1 -1
- package/skills/hyperframes-creative/SKILL.md +1 -1
- package/skills/hyperframes-keyframes/SKILL.md +1 -1
- package/skills/hyperframes-studio/SKILL.md +1 -1
- package/skills/media-use/scripts/lib/adopt.mjs +128 -0
- package/skills/media-use/scripts/lib/adopt.test.mjs +95 -0
- package/skills/media-use/scripts/lib/bgm-provider.mjs +20 -0
- package/skills/media-use/scripts/lib/brand-provider.mjs +59 -0
- package/skills/media-use/scripts/lib/bundled-sfx-provider.mjs +119 -0
- package/skills/media-use/scripts/lib/bundled-sfx-provider.test.mjs +139 -0
- package/skills/media-use/scripts/lib/cache.mjs +162 -0
- package/skills/media-use/scripts/lib/cache.test.mjs +110 -0
- package/skills/media-use/scripts/lib/candidates.mjs +91 -0
- package/skills/media-use/scripts/lib/candidates.test.mjs +155 -0
- package/skills/media-use/scripts/lib/codex-provider.mjs +161 -0
- package/skills/media-use/scripts/lib/codex-provider.test.mjs +34 -0
- package/skills/media-use/scripts/lib/config-lock.d.mts +3 -0
- package/skills/media-use/scripts/lib/config-lock.test.mjs +79 -0
- package/skills/media-use/scripts/lib/coverage.test.mjs +136 -0
- package/skills/media-use/scripts/lib/cube-build.mjs +181 -0
- package/skills/media-use/scripts/lib/cube-build.test.mjs +80 -0
- package/skills/media-use/scripts/lib/cube-validate.mjs +197 -0
- package/skills/media-use/scripts/lib/cube-validate.test.mjs +125 -0
- package/skills/media-use/scripts/lib/cutlist.test.mjs +174 -0
- package/skills/media-use/scripts/lib/duck.test.mjs +319 -0
- package/skills/media-use/scripts/lib/error-diffusion.test.mjs +102 -0
- package/skills/media-use/scripts/lib/ff-binaries.mjs +37 -0
- package/skills/media-use/scripts/lib/freeze.mjs +72 -0
- package/skills/media-use/scripts/lib/freeze.test.mjs +138 -0
- package/skills/media-use/scripts/lib/grade-analyzer.mjs +277 -0
- package/skills/media-use/scripts/lib/grade-analyzer.test.mjs +285 -0
- package/skills/media-use/scripts/lib/heygen-cli.mjs +208 -0
- package/skills/media-use/scripts/lib/heygen-cli.test.mjs +315 -0
- package/skills/media-use/scripts/lib/heygen-search.mjs +45 -0
- package/skills/media-use/scripts/lib/heygen-search.test.mjs +49 -0
- package/skills/media-use/scripts/lib/heygen-video-provider.mjs +138 -0
- package/skills/media-use/scripts/lib/heygen-video-provider.test.mjs +435 -0
- package/skills/media-use/scripts/lib/image-provider.mjs +44 -0
- package/skills/media-use/scripts/lib/local-media-search.mjs +32 -0
- package/skills/media-use/scripts/lib/local-models.mjs +318 -0
- package/skills/media-use/scripts/lib/local-models.test.mjs +220 -0
- package/skills/media-use/scripts/lib/local-run.mjs +78 -0
- package/skills/media-use/scripts/lib/local-run.test.mjs +121 -0
- package/skills/media-use/scripts/lib/logo-provider.mjs +244 -0
- package/skills/media-use/scripts/lib/logo-provider.test.mjs +298 -0
- package/skills/media-use/scripts/lib/ltx-video-provider.mjs +94 -0
- package/skills/media-use/scripts/lib/ltx-video-provider.test.mjs +316 -0
- package/skills/media-use/scripts/lib/lut-preset-provider.mjs +271 -0
- package/skills/media-use/scripts/lib/lut-preset-provider.test.mjs +199 -0
- package/skills/media-use/scripts/lib/main-module.mjs +13 -0
- package/skills/media-use/scripts/lib/manifest.d.mts +20 -0
- package/skills/media-use/scripts/lib/manifest.test.mjs +397 -0
- package/skills/media-use/scripts/lib/match.mjs +47 -0
- package/skills/media-use/scripts/lib/media-fetch.test.mjs +197 -0
- package/skills/media-use/scripts/lib/media-home.test.mjs +61 -0
- package/skills/media-use/scripts/lib/media-search.d.mts +9 -0
- package/skills/media-use/scripts/lib/media-search.mjs +107 -0
- package/skills/media-use/scripts/lib/mflux-provider.mjs +128 -0
- package/skills/media-use/scripts/lib/mflux-provider.test.mjs +174 -0
- package/skills/media-use/scripts/lib/misses.mjs +49 -0
- package/skills/media-use/scripts/lib/misses.test.mjs +89 -0
- package/skills/media-use/scripts/lib/npx-sync.mjs +2 -28
- package/skills/media-use/scripts/lib/npx-sync.test.mjs +50 -0
- package/skills/media-use/scripts/lib/openverse.mjs +134 -0
- package/skills/media-use/scripts/lib/openverse.test.mjs +219 -0
- package/skills/media-use/scripts/lib/parakeet-words.test.mjs +44 -0
- package/skills/media-use/scripts/lib/prefs-store.concurrent.test.mjs +173 -0
- package/skills/media-use/scripts/lib/prefs-store.test.mjs +245 -0
- package/skills/media-use/scripts/lib/probe.mjs +46 -0
- package/skills/media-use/scripts/lib/probe.test.mjs +221 -0
- package/skills/media-use/scripts/lib/providers.mjs +5 -0
- package/skills/media-use/scripts/lib/recipe-store.test.mjs +391 -0
- package/skills/media-use/scripts/lib/registry.mjs +214 -0
- package/skills/media-use/scripts/lib/registry.test.mjs +262 -0
- package/skills/media-use/scripts/lib/search.mjs +24 -0
- package/skills/media-use/scripts/lib/search.test.mjs +32 -0
- package/skills/media-use/scripts/lib/sfx-provider.mjs +33 -0
- package/skills/media-use/scripts/lib/specs.mjs +132 -0
- package/skills/media-use/scripts/lib/specs.test.mjs +157 -0
- package/skills/media-use/scripts/lib/stats.mjs +117 -0
- package/skills/media-use/scripts/lib/stats.test.mjs +165 -0
- package/skills/media-use/scripts/lib/svg-sanitize.mjs +21 -0
- package/skills/media-use/scripts/lib/telemetry.test.mjs +437 -53
- package/skills/media-use/scripts/lib/test-home.test.mjs +10 -0
- package/skills/media-use/scripts/lib/transcriptCutFade.test.mjs +33 -0
- package/skills/media-use/scripts/lib/tts-local-provider.mjs +94 -0
- package/skills/media-use/scripts/lib/tts-local-provider.test.mjs +72 -0
- package/skills/media-use/scripts/lib/usage.mjs +57 -0
- package/skills/media-use/scripts/lib/usage.test.mjs +54 -0
- package/skills/media-use/scripts/lib/voice-provider.mjs +57 -0
- package/skills/media-use/scripts/lib/voice-provider.test.mjs +46 -0
- package/skills/media-use/scripts/resolve.mjs +1360 -27
- package/skills/motion-graphics/SKILL.md +1 -1
- package/skills/music-to-video/SKILL.md +1 -1
- package/skills/pr-to-video/SKILL.md +1 -1
- package/skills/product-launch-video/SKILL.md +1 -1
- package/skills/talking-head-recut/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
[返回简介](README.md) · [使用说明](docs/USAGE.md) · [验证记录](docs/VALIDATION.md)
|
|
4
4
|
|
|
5
|
+
## 0.11.0 (2026-10-29)
|
|
6
|
+
|
|
7
|
+
- 同步官方 HyperFrames 0.8.214 技能、完整资源与渲染器;修正兼容技能入口和上游来源声明中的旧版本。
|
|
8
|
+
- 工程库新增关键词搜索和最近 / 最早更新、自然标题排序;保留返回列表时的筛选条件,提供无匹配提示和清空搜索。
|
|
9
|
+
- Add project search and updated / oldest / natural-title sorting, retained filters on return, and a clear no-results state.
|
|
10
|
+
- 当前工程与归档工程可分别筛选,按标题、正文或模板查找;保留运行任务与未保存修改保护。
|
|
11
|
+
|
|
12
|
+
## 0.10.2 (2026-10-29)
|
|
13
|
+
|
|
14
|
+
- 同步仓库与 npm 的简明介绍、中英文 README 和反馈入口;本次为文档与包元数据更新。
|
|
15
|
+
- Sync npm descriptions and both README guides with the repository, including issue and pull-request links.
|
|
16
|
+
- Correct the introductory engine reference to the already included HyperFrames 0.8.211.
|
|
17
|
+
|
|
5
18
|
## 0.10.1 (2026-10-28)
|
|
6
19
|
|
|
7
20
|
- 同步官方 HyperFrames 0.8.211:7 个当前技能、301 项资源逐一比对发布提交;更新两处上游文档,并固定新的 CLI 与渲染环境版本。
|
package/README.en.md
CHANGED
|
@@ -4,20 +4,21 @@
|
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Create HTML videos in DSH with official HyperFrames skills, template projects, asset upload and ordering, archives, official preview and local MP4 export. Use AI-authored projects or start directly from a workbench template.
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/dsh-hyperframes) [](https://www.npmjs.com/package/dsh-hyperframes)
|
|
10
10
|
|
|
11
11
|
Feedback and contributions are welcome: report [issues](https://github.com/STARDUSTLC666/dsh-hyperframes/issues) or submit [pull requests](https://github.com/STARDUSTLC666/dsh-hyperframes/pulls).
|
|
12
12
|
|
|
13
|
-
Open the
|
|
13
|
+
Open the workbench from the native DSH sidebar. See the [workbench guide](docs/WORKBENCH.md) for configuration and operating boundaries.
|
|
14
14
|
|
|
15
|
-
Bundled skills: official HyperFrames 0.8.
|
|
15
|
+
Bundled skills: official HyperFrames 0.8.214, seven current skills with fourteen previous names retained as compatibility entries.
|
|
16
16
|
|
|
17
17
|
Move images up or down in the Media tab, including with the keyboard. The order saves immediately; export again to apply it to a new MP4.
|
|
18
18
|
|
|
19
19
|
## What it does
|
|
20
20
|
|
|
21
|
+
- Search projects and sort by update time or natural title; keep filters when returning to the library.
|
|
21
22
|
- A settings workbench for templates, editable content, media uploads, official Studio preview and local MP4 export.
|
|
22
23
|
- Title card, product card and slideshow templates in landscape, portrait or square format.
|
|
23
24
|
- Editable project backups, cancellable jobs and a warning when an MP4 uses an older revision.
|
package/README.md
CHANGED
|
@@ -4,20 +4,21 @@
|
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
在 DSH 中用 HTML 创作视频:官方 HyperFrames 技能、模板工程、素材上传与排序、归档、官方预览和本地 MP4 导出。既可让 AI 编写视频工程,也可直接使用工作台模板。
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/dsh-hyperframes) [](https://www.npmjs.com/package/dsh-hyperframes)
|
|
10
10
|
|
|
11
11
|
欢迎使用,遇到问题或有改进建议,请提交 [issues](https://github.com/STARDUSTLC666/dsh-hyperframes/issues) 和 [PR](https://github.com/STARDUSTLC666/dsh-hyperframes/pulls)。
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
从 DSH 原生侧栏打开工作台;配置与操作边界见[工作台说明](docs/WORKBENCH.md)。
|
|
14
14
|
|
|
15
|
-
技能内容:官方 HyperFrames 0.8.
|
|
15
|
+
技能内容:官方 HyperFrames 0.8.214,7 个当前技能;14 个旧名称保留为兼容入口。
|
|
16
16
|
|
|
17
17
|
在「素材」页上移或下移图片即可调整轮播顺序,支持键盘操作。顺序立即保存;重新导出后应用于新 MP4。
|
|
18
18
|
|
|
19
19
|
## 功能
|
|
20
20
|
|
|
21
|
+
- 工程库按关键词搜索,按最近 / 最早更新或标题排序;返回列表时保留筛选条件。
|
|
21
22
|
- 设置页视频工作台:选模板、编辑内容、上传素材,在官方 Studio 预览并导出本机 MP4。
|
|
22
23
|
- 提供标题卡、产品介绍、图文轮播;支持横屏、竖屏和正方形。
|
|
23
24
|
- 保留可编辑工程备份、渲染记录与取消操作;工程修改后提醒重新导出。
|
package/docs/WORKBENCH.md
CHANGED
|
@@ -27,3 +27,9 @@ Edit the template sources and run pnpm run build. Commit generated lib/client.js
|
|
|
27
27
|
邮件使用受控 AgentMail HTTP 服务,日历使用受控 CalDAV 协议传输;插件处理器、存储、校验和原生宿主均实际运行。未使用真实邮箱、真实日历账号或付费模型。RSS 访问 Node.js 官方公开来源。PPT 实际生成并渲染 PPTX、下载 ZIP;两个视频插件实际运行官方引擎并播放 MP4。
|
|
28
28
|
|
|
29
29
|
这些是 Web 共用界面的验收结果,不代表已验收 Electron 专属菜单、系统权限、真实账号、全部外部来源或所有可选模型/引擎。Docker、Slack、钉钉继续按用户约定搁置。
|
|
30
|
+
|
|
31
|
+
## 工程查找 / Find projects
|
|
32
|
+
|
|
33
|
+
工程列表可按关键词筛选,并按最近更新、最早更新或自然标题顺序排列;多个词需要同时匹配。PPT 只查目录中的标题和工程路径;视频查标题、正文和模板,当前列表与归档列表各自保留筛选条件。清空搜索会恢复完整列表,返回工程库会保留刚才的搜索和排序。筛选只在本机列表中执行,不读取未选工程的完整文件,也不修改工程内容。
|
|
34
|
+
|
|
35
|
+
Search the local project list and sort by newest update, oldest update or natural title. Multiple terms must all match. PPT searches catalog titles and paths; video searches titles, text and templates, with separate active/archive filters. Clear restores the full list; returning from editing preserves filters. Filtering does not load unselected project files or change project contents.
|
package/lib/client.js
CHANGED
|
@@ -595,6 +595,44 @@ function createWorkbenchUI(React) {
|
|
|
595
595
|
window.__ModuleLoader__.load(__stardustUpdatesWrap({ id: 'dsh-hyperframes', factory: require => {
|
|
596
596
|
const React = require('react'), { useState, useEffect, useRef } = React, h = React.createElement;
|
|
597
597
|
const W = createWorkbenchUI(React);
|
|
598
|
+
// Per-view preferences stay in this plugin instance; user files are never changed.
|
|
599
|
+
const projectLibraryPreferences = new Map();
|
|
600
|
+
function ProjectLibrary({ items, scope = 'projects', language = 'zh', searchText, updatedAt, renderItem, t, searchHint }) {
|
|
601
|
+
const saved = projectLibraryPreferences.get(scope);
|
|
602
|
+
const [query, setQuery] = React.useState(saved?.query || '');
|
|
603
|
+
const [order, setOrder] = React.useState(saved?.order || 'updated');
|
|
604
|
+
const controlId = React.useId();
|
|
605
|
+
const normalize = text => String(text ?? '').normalize('NFKC').toLocaleLowerCase(language);
|
|
606
|
+
const words = normalize(query).trim().split(/\s+/).filter(Boolean);
|
|
607
|
+
const collator = new Intl.Collator(language, { numeric: true, sensitivity: 'base' });
|
|
608
|
+
const timestamp = row => { const value = Date.parse(updatedAt(row)); return Number.isFinite(value) ? value : 0; };
|
|
609
|
+
const visible = items.filter(row => words.every(word => normalize(searchText(row)).includes(word))).sort((a, b) => {
|
|
610
|
+
const tie = collator.compare(String(a.title || ''), String(b.title || '')) || String(a.id).localeCompare(String(b.id));
|
|
611
|
+
return order === 'title' ? tie : (order === 'oldest' ? timestamp(a) - timestamp(b) : timestamp(b) - timestamp(a)) || tie;
|
|
612
|
+
});
|
|
613
|
+
function change(nextQuery, nextOrder) {
|
|
614
|
+
projectLibraryPreferences.set(scope, { query: nextQuery, order: nextOrder });
|
|
615
|
+
setQuery(nextQuery); setOrder(nextOrder);
|
|
616
|
+
}
|
|
617
|
+
return h('section', { className: 'project-library', 'aria-label': t('工程查找', 'Find projects') },
|
|
618
|
+
h('style', null, PROJECT_LIBRARY_CSS),
|
|
619
|
+
h('div', { className: 'project-library-controls' },
|
|
620
|
+
h('label', { htmlFor: controlId + '-query' }, t('搜索工程', 'Search projects'),
|
|
621
|
+
h('input', { id: controlId + '-query', type: 'search', value: query, placeholder: searchHint, maxLength: 200,
|
|
622
|
+
onChange: e => change(e.target.value, order), onKeyDown: e => { if (e.key === 'Escape' && query) { e.preventDefault(); e.stopPropagation(); change('', order); } } })),
|
|
623
|
+
h('label', { htmlFor: controlId + '-order' }, t('排序', 'Sort by'),
|
|
624
|
+
h('select', { id: controlId + '-order', value: order, onChange: e => change(query, e.target.value) },
|
|
625
|
+
h('option', { value: 'updated' }, t('最近更新', 'Recently updated')),
|
|
626
|
+
h('option', { value: 'oldest' }, t('最早更新', 'Oldest updated')),
|
|
627
|
+
h('option', { value: 'title' }, t('标题', 'Title')))),
|
|
628
|
+
query ? h(W.Button, { variant: 'ghost', onClick: () => change('', order) }, t('清空搜索', 'Clear search')) : null),
|
|
629
|
+
h('p', { className: 'w-muted project-library-count', role: 'status', 'aria-live': 'polite' },
|
|
630
|
+
t('显示 ', 'Showing ') + visible.length + ' / ' + items.length + t(' 个工程', ' projects')),
|
|
631
|
+
visible.length ? visible.map(renderItem) : h(W.Empty, { title: t('没有匹配的工程', 'No matching projects'), icon: 'folder' },
|
|
632
|
+
t('换个关键词,或清空搜索查看全部工程。', 'Try another keyword or clear the search to show all projects.')));
|
|
633
|
+
}
|
|
634
|
+
const PROJECT_LIBRARY_CSS = `.project-library{min-width:0}.project-library-controls{display:flex;gap:12px;align-items:end;flex-wrap:wrap;padding:12px 0}.project-library-controls>label{display:grid;gap:6px;margin:0!important;min-width:0;color:var(--w-muted);font-size:13px}.project-library-controls>label:first-child{flex:1 1 240px}.project-library-controls>label:nth-child(2){flex:0 1 180px}.project-library-controls input,.project-library-controls select{width:100%;min-width:0;min-height:38px;font:inherit;color:var(--w-text);background:var(--w-bg);border:1px solid var(--w-border);border-radius:8px;padding:8px 10px}.project-library-count{margin:4px 0 12px;font-size:12px}.project-library-controls :focus-visible{outline:2px solid var(--w-accent);outline-offset:3px}@media(max-width:520px){.project-library-controls>label:first-child{flex-basis:100%}.project-library-controls>label:nth-child(2){flex:1 1 160px}}`;
|
|
635
|
+
|
|
598
636
|
function MediaCanvas({ project, fields, render, dirty, stale, job, running, ready, busy, start, perform, setNotice, t }) {
|
|
599
637
|
const previewing = job?.kind === 'preview' && job.state === 'running';
|
|
600
638
|
const ratio = fields.format === 'portrait' ? '9 / 16' : fields.format === 'square' ? '1 / 1' : '16 / 9';
|
|
@@ -836,7 +874,7 @@ const canSave=fields.title.trim().length>0 && fields.title.length<=72 && Number.
|
|
|
836
874
|
!project && !creating ? libraryTab === 'environment' ? h('section',{className:'media-environment'},h('h3',null,t('渲染环境','Render environment')+(environment.ready?t(' · 已准备',' · ready'):t(' · 首次需下载',' · first download required'))),h('p', { className: 'muted' }, t(environment?.hint, 'First use downloads the official CLI. ' + (engine === 'hyperframes' ? 'Windows uses the official rendering browser; other platforms reuse installed Chrome when available. FFmpeg must be in PATH.' : 'Installed Chrome is reused; a browser is downloaded when needed. Remotion retains its official license.'))),
|
|
837
875
|
engine === 'remotion' && h('p', null, h('a', { href: 'https://www.remotion.dev/license', target: '_blank', rel: 'noreferrer' }, t('查看 Remotion 使用许可证', 'Read the Remotion license'))),
|
|
838
876
|
h('button', { disabled: busy || activeJob, onClick: () => start('prepare') }, environment?.ready ? t('重新检查 / 修复环境', 'Check / repair environment') : t('准备渲染环境', 'Prepare render environment'))) : libraryTab === 'archives' ? archived.length ? h('section',{className:'media-project-list'},h('p', { className: 'muted' }, t('归档保留素材与成品,不占当前 30 个工程名额。恢复后可以继续编辑。', 'Archives retain media and output, freeing an active project slot. Restore to edit again.')),
|
|
839
|
-
archived.
|
|
877
|
+
h(ProjectLibrary,{items:archived,scope:'archives',language:lang,t,searchHint:t('搜索归档工程','Search archived projects'),searchText:p=>[p.title,p.body,p.template].join(' '),updatedAt:p=>p.updated,renderItem:p=>h('div', { className: 'bar', key: p.id }, h('strong', null, p.title), h('button', { disabled: busy || dirty || activeJob, onClick: () => perform(async () => { await api({ action: 'restore', id: p.id, revision: p.revision, confirmed: true }); await refresh(); await open(p.id); setNotice(t('工程已恢复。', 'Project restored.')); }) }, t('恢复工程', 'Restore project')))})) : h(W.Empty,{title:t('没有归档工程','No archived projects'),icon:'folder'}) : projects.length ? h('div',{className:'media-project-list'},h(ProjectLibrary,{items:projects,language:lang,t,searchHint:t('搜索标题、正文或模板','Search titles, text or templates'),searchText:p=>[p.title,p.body,p.template,templates.find(row=>row.id===p.template)?.[lang==='en'?'en':'zh']].join(' '),updatedAt:p=>p.updated,renderItem:p=>h(W.Row,{key:p.id,title:p.title,disabled:running,meta:p.duration+t(' 秒 · 修订 ',' sec · revision ')+p.revision,description:(templates.find(row=>row.id===p.template)?.[lang==='en'?'en':'zh'] || p.template),onClick:()=>{setEditorTab('content');navigate(p.id);}})})) : h(W.Empty,{title:t('还没有视频工程','No video projects yet'),icon:'video'},t('点击“新建视频”,选择模板并保存。环境可以稍后准备。','Choose New video, select a template and save. The renderer can be prepared later.')) :
|
|
840
878
|
editorTab === 'environment' ? h('section',{className:'media-environment'},h('h3',null,t('渲染环境','Render environment')+(environment.ready?t(' · 已准备',' · ready'):t(' · 首次需下载',' · first download required'))),h('p', { className: 'muted' }, t(environment?.hint, 'First use downloads the official CLI. ' + (engine === 'hyperframes' ? 'Windows uses the official rendering browser; other platforms reuse installed Chrome when available. FFmpeg must be in PATH.' : 'Installed Chrome is reused; a browser is downloaded when needed. Remotion retains its official license.'))),
|
|
841
879
|
engine === 'remotion' && h('p', null, h('a', { href: 'https://www.remotion.dev/license', target: '_blank', rel: 'noreferrer' }, t('查看 Remotion 使用许可证', 'Read the Remotion license'))),
|
|
842
880
|
h('button', { disabled: busy || activeJob, onClick: () => start('prepare') }, environment?.ready ? t('重新检查 / 修复环境', 'Check / repair environment') : t('准备渲染环境', 'Prepare render environment'))) : editorTab === 'assets' ? h(MediaAssets,{project,dirty,running,fileRef,upload,perform,setProject,t}) : editorTab === 'exports' ? h(MediaExports,{project,dirty,running,activeJob,busy,setArchiveReview,t}) :
|
|
@@ -859,7 +897,7 @@ h('div', { className: 'bar' }, h('button', { disabled: busy || dirty || activeJo
|
|
|
859
897
|
catch { } W.register(ctx,{id:'dsh-'+engine+'.workbench',label:()=>title,icon:engine==='hyperframes'?'layers':'play',component:Workbench,inject:()=>({locale}),order:engine==='hyperframes'?65:66});
|
|
860
898
|
ctx.slots.inject('settings.section', () => ctx.slots.register({ name: 'settings.section', id: 'dsh-' + engine, order: engine === 'hyperframes' ? 62 : 63, label: () => title, inject: () => ({ locale }) }, Workbench)); }
|
|
861
899
|
return { inject: ['slots', 'locale'], apply };
|
|
862
|
-
} },{"name":"dsh-hyperframes","version":"0.1.0","hasWorkbench":true,"packageVersion":"0.
|
|
900
|
+
} },{"name":"dsh-hyperframes","version":"0.1.0","hasWorkbench":true,"packageVersion":"0.11.0","label":"HyperFrames","labelEn":"HyperFrames","suiteComponent":true}));
|
|
863
901
|
|
|
864
902
|
})();
|
|
865
903
|
|
package/lib/media-templates.d.ts
CHANGED
package/lib/media-templates.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const MEDIA_VERSIONS = { hyperframes: '0.8.
|
|
1
|
+
export const MEDIA_VERSIONS = { hyperframes: '0.8.214', remotion: '4.0.539', gsap: '3.15.0' };
|
|
2
2
|
export const MEDIA_TEMPLATES = [
|
|
3
3
|
{ id: 'title', zh: '标题卡', en: 'Title card', description: '一句标题、一段介绍,适合开场与通知。' },
|
|
4
4
|
{ id: 'product', zh: '产品介绍', en: 'Product card', description: '深色画布与一张主图,适合产品亮点。' },
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-hyperframes",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "DSH
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"description": "DSH HTML 视频工作台:官方 HyperFrames 技能、工程检索、模板、素材排序、预览与本地 MP4 导出。欢迎提交 issues 和 PR。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"types": "lib/index.d.ts",
|
package/plugin.json
CHANGED
package/skills/NOTICE.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
# Upstream notice
|
|
2
2
|
|
|
3
|
-
The seven canonical
|
|
3
|
+
The seven canonical skill directories come from official HyperFrames 0.8.214 (Git 4719543e972548a261b8354f0a8dada479ae5d93). The three npm-distributed skills retain all 290 files from its integrity-verified CLI tarball, including release-generated helpers; source-only resources retain their verified Git blob bytes. The Apache-2.0 license is retained in UPSTREAM-LICENSE.txt. Fourteen legacy DSH names are compatibility adapters; plugin.json pins their CLI release. DSH adapter code remains MIT licensed.
|
package/skills/UPSTREAM.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hyperframes",
|
|
3
|
-
"version": "0.8.
|
|
4
|
-
"gitHead": "
|
|
5
|
-
"tarball": "https://registry.npmjs.org/hyperframes/-/hyperframes-0.8.
|
|
6
|
-
"integrity": "sha512-
|
|
3
|
+
"version": "0.8.214",
|
|
4
|
+
"gitHead": "4719543e972548a261b8354f0a8dada479ae5d93",
|
|
5
|
+
"tarball": "https://registry.npmjs.org/hyperframes/-/hyperframes-0.8.214.tgz",
|
|
6
|
+
"integrity": "sha512-ZPxgxGB5nYzqq67We1XtSdj6QbXIkubp/QxgVQXl3BvfmZnLmYVLyL2gDPixydV51OpZCG8pBTd5yELzEaahIQ==",
|
|
7
7
|
"node": ">=22",
|
|
8
8
|
"canonical": [
|
|
9
9
|
"figma",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"talking-head-recut"
|
|
32
32
|
],
|
|
33
33
|
"repository": "https://github.com/heygen-com/hyperframes",
|
|
34
|
-
"checkedAt": "2026-10-
|
|
34
|
+
"checkedAt": "2026-10-29",
|
|
35
35
|
"adaptation": "Official canonical files unchanged; DSH compatibility aliases and upstream launcher manifest.",
|
|
36
36
|
"files": {
|
|
37
37
|
"figma/scripts/verify-motion.mjs": "1988721525e929caa5d3ced6d16c31467996e0c57757d281a971fb77e2297de8",
|
|
@@ -230,26 +230,111 @@
|
|
|
230
230
|
"media-use/scripts/dither.mjs": "8e9f437526f39f417f6793912ddeef71094ddb5a5b8d4893c5339086bc39547f",
|
|
231
231
|
"media-use/scripts/dither.test.mjs": "c22c3a0ae41647ac3f733b489a6bc6043fd294155d00954be5d901b3cff7d216",
|
|
232
232
|
"media-use/scripts/eval.mjs": "fadf274111a682acbfdff91eca75b977e3821c53026cd058551c538027f21f51",
|
|
233
|
+
"media-use/scripts/lib/adopt.mjs": "82f46374e759a79a88830bd059116835cf71b7fc617a8a23a68523925ed0954d",
|
|
234
|
+
"media-use/scripts/lib/adopt.test.mjs": "ca19fb75d72e8ed9fd29d81071c73b994a42ff2b71cb1ed17f9ddd45f02618f9",
|
|
235
|
+
"media-use/scripts/lib/bgm-provider.mjs": "37db0d3e8ee052d1341339a75b68a3f98b2aaf2d3689a682149138ffb4aedf95",
|
|
236
|
+
"media-use/scripts/lib/brand-provider.mjs": "3519d28f8bb2e59eed0c0706a1f57e0782aa94ed6237338b6110474d9ec093a1",
|
|
237
|
+
"media-use/scripts/lib/bundled-sfx-provider.mjs": "7d84a20ab0c161653bfd62f3b7f7846c862d21d45bcf819364c09c81db3923c9",
|
|
238
|
+
"media-use/scripts/lib/bundled-sfx-provider.test.mjs": "a64719e9505c42b0373668d6c181c94e697db21fe0ed23bcfff5dec69c146b93",
|
|
239
|
+
"media-use/scripts/lib/cache.mjs": "fb2ac16826e5e1bdd318b25673b7410fd836c37b4cc6d3f886260b36c147c713",
|
|
240
|
+
"media-use/scripts/lib/cache.test.mjs": "c6b7bf9b4e68c5f43a38366edbb918838c7a7699b2f953f9cd6e4d11c54bedab",
|
|
241
|
+
"media-use/scripts/lib/candidates.mjs": "6aa06d00037330fede903ab9bc95ca8edc0fd5d8be2e8b3988d685d474a2682a",
|
|
242
|
+
"media-use/scripts/lib/candidates.test.mjs": "bc9a0a625ee2d5e404725f2ba3206e78bfab91fe794cac6db30ac69b2de75c3b",
|
|
243
|
+
"media-use/scripts/lib/codex-provider.mjs": "1d58d7b3ea07253700f52b7ebb3250d21f9afdbeb06e7cc8b6fae0a429bb48b0",
|
|
244
|
+
"media-use/scripts/lib/codex-provider.test.mjs": "71d26ffc40296f98040101f8e4543b35b2854a66fea2d360950f96dfcd93f61f",
|
|
245
|
+
"media-use/scripts/lib/config-lock.d.mts": "dbe72fd0c6870868bb5c3a70bd58df1ab784c35a2a3e94dad0135666f1541cac",
|
|
233
246
|
"media-use/scripts/lib/config-lock.mjs": "a9d1679e2039be38cd1756a1011f813ae4be0577c2ff77b9ed411b99b1c94275",
|
|
247
|
+
"media-use/scripts/lib/config-lock.test.mjs": "7cf8f19db2f8cf999309c08c24d87463ac5ca204aa64dbce5e83b1a008a81a08",
|
|
248
|
+
"media-use/scripts/lib/coverage.test.mjs": "d6493cdf4889a80ccd0ceabd6dea5efd6703b19910e8d2ed2f6615b89d69c970",
|
|
249
|
+
"media-use/scripts/lib/cube-build.mjs": "c57b5561641dc97e73474ceb91f33357792028874eaac8012620d094dcfb2a07",
|
|
250
|
+
"media-use/scripts/lib/cube-build.test.mjs": "d915460484e53263c792e2d67813895f79fa22f07f002cab46c4f663478da939",
|
|
251
|
+
"media-use/scripts/lib/cube-validate.mjs": "73f169ce4b767d35646bf01f538d756e2af2ff0aa2e0488bde97f7a32ef3bee6",
|
|
252
|
+
"media-use/scripts/lib/cube-validate.test.mjs": "9b2acbba85879eb8f75d63c6e6f9162cce61bac266441d4e1b2b1117f16b9bb7",
|
|
234
253
|
"media-use/scripts/lib/cutlist.mjs": "c395f49bdb602b29dfc1ea98b7f6d0d5d8781f00eca1c16d009d10e7ef0205be",
|
|
254
|
+
"media-use/scripts/lib/cutlist.test.mjs": "ef004b3deee1c704f441ec7d1e265da010150842da7a812f7b80e99cf586742c",
|
|
235
255
|
"media-use/scripts/lib/duck.mjs": "0930aea672a8cb204d344902cb90442491a8979f9f554f9c7c61cd13666a6846",
|
|
256
|
+
"media-use/scripts/lib/duck.test.mjs": "0686a6e00fce56286d69e1e5558947e26dd0fae7a3c67d0439bdb477bbe40eca",
|
|
236
257
|
"media-use/scripts/lib/error-diffusion.mjs": "aa718fe95f98087979bab5ea31d68b8e45fbde0c5b874c6888ad21923fb45936",
|
|
258
|
+
"media-use/scripts/lib/error-diffusion.test.mjs": "365640f4035bbd1180b3663adca87d8735fad3c0b20b7fe41a562d8cd71154fd",
|
|
259
|
+
"media-use/scripts/lib/ff-binaries.mjs": "87b8d6a6fdb46563c404a38070ad6075134d281c1aa154d93c2b92054671ca6e",
|
|
260
|
+
"media-use/scripts/lib/freeze.mjs": "1b9115cbc06059d4488d1ac93f944b5a222a01155792ce6ce2234ad25d6d426c",
|
|
261
|
+
"media-use/scripts/lib/freeze.test.mjs": "4c5c339c3ec382442148ee55e4cfd89dd4b23720ddb8d9861b3de353f7b8f503",
|
|
262
|
+
"media-use/scripts/lib/grade-analyzer.mjs": "525278a155d568d9f62c1991d9eef37417ca46863b1535cb99e5be9fffc93216",
|
|
263
|
+
"media-use/scripts/lib/grade-analyzer.test.mjs": "a47684600e07b719062879e9fac2eac81f625137d539a9459524974eaec4bd27",
|
|
264
|
+
"media-use/scripts/lib/heygen-cli.mjs": "32b703f5b7fbc3e07834fd1d81903888115bbc934fa90017a201cddfd05953b1",
|
|
265
|
+
"media-use/scripts/lib/heygen-cli.test.mjs": "947df3c8cb6f49418c9963047564730bff6ba668193951ab446ad346c6a1da49",
|
|
266
|
+
"media-use/scripts/lib/heygen-search.mjs": "574e75e0479b3edf4ae5c519a437939b244637807c0094b8de7043f2bfbbdc77",
|
|
267
|
+
"media-use/scripts/lib/heygen-search.test.mjs": "016cb16093b76a0601613899f92788f1bb112b0c0305aef3ff661a961682c660",
|
|
268
|
+
"media-use/scripts/lib/heygen-video-provider.mjs": "e6a1be96e2ee883e5adaf152bf14c8b0e45a2e627ad229483e088fc9ff701ee1",
|
|
269
|
+
"media-use/scripts/lib/heygen-video-provider.test.mjs": "01eff63cd508f7cd8826e1fdf594ebbc4dcd8c4fe3fb86afbe0781d81500b4bd",
|
|
270
|
+
"media-use/scripts/lib/image-provider.mjs": "73ac032e7cf0bd80a08d3b279a16e60de1a6c010d9e197451d56a5fdd6874481",
|
|
237
271
|
"media-use/scripts/lib/index-gen.mjs": "fde84f36ebfb4fa819935956b2b6dc43a70b749a5c846d5470295d7c439e40e6",
|
|
272
|
+
"media-use/scripts/lib/local-media-search.mjs": "e327cb5c6154bd6e3484f65fab43c5cab0f155fa2a12f9b2f737fe9519414e5e",
|
|
273
|
+
"media-use/scripts/lib/local-models.mjs": "46a8cb015426b622203236fcdd4e044bfe7c2c556cbd524ac482316e9fc06641",
|
|
274
|
+
"media-use/scripts/lib/local-models.test.mjs": "1836a274c146cd8b692f081ebc3dfc52348982c8bf12cbf1d2684052253a0c77",
|
|
275
|
+
"media-use/scripts/lib/local-run.mjs": "a92698954b5685356a5438b943602997fc13ea4b9b8a8ff86f415e842094b642",
|
|
276
|
+
"media-use/scripts/lib/local-run.test.mjs": "6d6cbb64c654285796dc2047351f23dd2d1b5f9da30b24b784d683622441277f",
|
|
277
|
+
"media-use/scripts/lib/logo-provider.mjs": "85b6c328425f1f2af96331e5ee5fa84f10d3af30529e1f343256b96a3f4caac5",
|
|
278
|
+
"media-use/scripts/lib/logo-provider.test.mjs": "7374f9a1b12c4b3788a069365f6b2cf36c4bf36b3b5c374c3f7a59a3a85e8ae6",
|
|
279
|
+
"media-use/scripts/lib/ltx-video-provider.mjs": "eab9a1ac88795bf066efe46f1f7e5d0dff4b640e458c47beb2a3464781cc00bc",
|
|
280
|
+
"media-use/scripts/lib/ltx-video-provider.test.mjs": "67250f197c6c8067d6dacedda7f4c48ee2989cd4c0a5d450512284d26a592b94",
|
|
281
|
+
"media-use/scripts/lib/lut-preset-provider.mjs": "de18e8cc41dd1a72114b12a76d21557f1b3beff1426a837f4892ba89d21069e6",
|
|
282
|
+
"media-use/scripts/lib/lut-preset-provider.test.mjs": "245424e4afff88285e6d540277b6b85c81690886219c7fb51b961eb05f68c1b2",
|
|
283
|
+
"media-use/scripts/lib/main-module.mjs": "61811e09110856e1439c29875e4a4ad7701ae45d4045f9d1dcb6a7929698e4c0",
|
|
284
|
+
"media-use/scripts/lib/manifest.d.mts": "7756d2ba4d1f176e570c33617efac3c4f20f3bcf3d7eb692d35c90c7b97bad1f",
|
|
238
285
|
"media-use/scripts/lib/manifest.mjs": "67f827f7591241c170fd92eb7fa789df2f1756b2cd4889907141936179f5d00f",
|
|
286
|
+
"media-use/scripts/lib/manifest.test.mjs": "4258c03c63d5b3dc5a77aa0b411e2b38dae7ae61ce9e9d159c3d2d4cda2c59bb",
|
|
287
|
+
"media-use/scripts/lib/match.mjs": "82c99f95a578b18f40388a50040d734a156d5cfa17d6ae4ebb514ace1489ff6a",
|
|
239
288
|
"media-use/scripts/lib/media-fetch.mjs": "6a90740eee3e4765b83b4c9726676b2935a7fbc9990f61ad5b166f9263188366",
|
|
289
|
+
"media-use/scripts/lib/media-fetch.test.mjs": "5bf334bd6ed1ce497579e5a1d03da54d51d4d3a652c4fe8c0a8f074de93b1c85",
|
|
240
290
|
"media-use/scripts/lib/media-home.mjs": "7f69890d7b822f202b44ddec0d8176c767cd8b1da4dfc4d918599c6a05cfecb1",
|
|
241
|
-
"media-use/scripts/lib/
|
|
291
|
+
"media-use/scripts/lib/media-home.test.mjs": "09fae6bb36fe1d8c54b71d04d7c1eb6874e247332e82788bbbfaa240f4cef2d6",
|
|
292
|
+
"media-use/scripts/lib/media-search.d.mts": "d99c84604a0abd0651a1aca95ebcca07debaa5713a1a5d9fe2868fbd4ed418b8",
|
|
293
|
+
"media-use/scripts/lib/media-search.mjs": "aeedce36602c58ca2c14e40d5f3568e03ca2e0fe9b2c567e3a0939269a6e5f80",
|
|
294
|
+
"media-use/scripts/lib/mflux-provider.mjs": "f2d8913f1759b73f9a3b2cd2e68e0d1f52b442c019b4d38eb5dd2941c8c7c78c",
|
|
295
|
+
"media-use/scripts/lib/mflux-provider.test.mjs": "03d2497445e4416e5442ee3aaa1775c702c767ea5758adcd940b359beedbcb2b",
|
|
296
|
+
"media-use/scripts/lib/misses.mjs": "1926e9ba06268e801daefaaf2305a41f2d327c719a281748c90a211b7fa64125",
|
|
297
|
+
"media-use/scripts/lib/misses.test.mjs": "49d002ea295ea338d99712f5a3031c81766f005dcf1e5dfd163eabda59d9654c",
|
|
298
|
+
"media-use/scripts/lib/npx-sync.mjs": "dc6b79487293be9040ec3c48db8a919e04a23fa09983fa9eb9bf8c7c6b5098bb",
|
|
299
|
+
"media-use/scripts/lib/npx-sync.test.mjs": "d477daabcf44ef51563aedb2a03f88c0db49a2048e73f45c25882b59e0a4fa0f",
|
|
300
|
+
"media-use/scripts/lib/openverse.mjs": "e2b176ed6e0b91231debab84ef6633a1a4885e400b9511a39f11e97acef261bd",
|
|
301
|
+
"media-use/scripts/lib/openverse.test.mjs": "f8a67597d881984182a1347b9441715af8b3d4d895495ae6fcbd4d012dc97f68",
|
|
242
302
|
"media-use/scripts/lib/parakeet-words.mjs": "d5b66efe6cb8975beab2f523503113c3be3117e687ebc20695e7ab08c2ba1b4d",
|
|
303
|
+
"media-use/scripts/lib/parakeet-words.test.mjs": "f93f215c8b7e02a262f7aafcf9b09cadab2713bb9d15e6953693e2ac9834387b",
|
|
304
|
+
"media-use/scripts/lib/prefs-store.concurrent.test.mjs": "e23a60d4dd5d3a1975049433e9d68968ca625f220d129258e245a18e31c8a779",
|
|
243
305
|
"media-use/scripts/lib/prefs-store.mjs": "960429595e5c5dda3f88f2899852d2ac2322a7d26b27ed8139612d0161fff749",
|
|
306
|
+
"media-use/scripts/lib/prefs-store.test.mjs": "455b3f00e85e98e697fc5aaec4bc4cb238ef5f88a6f03f679661b7afbf1df749",
|
|
307
|
+
"media-use/scripts/lib/probe.mjs": "97981860e0905f9f183a298fbc7208958492ecf6da981c6a0fc9054a2dbb867c",
|
|
308
|
+
"media-use/scripts/lib/probe.test.mjs": "89d4a1ace860e3be3d7d89f48603b83a246ec261bb370f8c86419daee8f6d173",
|
|
309
|
+
"media-use/scripts/lib/providers.mjs": "a8d67479d945a02fa3ee45477526c63770f8b74f952a72f0361c5f7e0129645b",
|
|
244
310
|
"media-use/scripts/lib/recipe-store.mjs": "6d2786c2ba4959178351047c3b6d1d2b29a701685c9b256fcc4793c50717ce83",
|
|
311
|
+
"media-use/scripts/lib/recipe-store.test.mjs": "c87a9adb78dda9ac5361c8d6a13ec7d08b1db3b6849484a0c0aa9ddfa4bcc7d2",
|
|
312
|
+
"media-use/scripts/lib/registry.mjs": "073f7953f13e707e1d6ddf9e7535a88a04f0121a33b7994771680ba9ee0df9ae",
|
|
313
|
+
"media-use/scripts/lib/registry.test.mjs": "bd129d21cdc8d0d40db6dcaa32ee1e36ea50709b143edb4649dd6429be5e94da",
|
|
314
|
+
"media-use/scripts/lib/search.mjs": "e14bee0c2988abc4c471b7e88ecbf8da7b4b476d67ae1b2c34d4b1293fab47c1",
|
|
315
|
+
"media-use/scripts/lib/search.test.mjs": "93c20b3628f1f04e35b3bdb382cb0d29df19099de82850c6ef7898a1a6090146",
|
|
316
|
+
"media-use/scripts/lib/sfx-provider.mjs": "dfc621f5e5966c321a88e832b0671e6a1cc13af7e89f3b462b7d70865b3b002d",
|
|
317
|
+
"media-use/scripts/lib/specs.mjs": "4e394d41d83fdebe827301d1c3652f0f1975eedf4a3107f17a72fb746b27e21c",
|
|
318
|
+
"media-use/scripts/lib/specs.test.mjs": "97013dbd34102791e2feba5cc4d586f9f0950e542b361ebbdc15e392ed5a294b",
|
|
319
|
+
"media-use/scripts/lib/stats.mjs": "4134952ab6d24d1793d0c6f32a98d011bcba11a61c7b6ce05df5a33d8fc40c67",
|
|
320
|
+
"media-use/scripts/lib/stats.test.mjs": "534ca88d9c4ee893b2224488168e6f607ec53ff76bcb75726dd811a72d0bd826",
|
|
321
|
+
"media-use/scripts/lib/svg-sanitize.mjs": "b1e620d62818978573ba87a6948af1cec1ca5668bc744a4df7225d7c564ccfbb",
|
|
245
322
|
"media-use/scripts/lib/telemetry.mjs": "292ca36e91189e69d36b197311a345664a3a407b4e3fdb91f8044190649961cd",
|
|
246
|
-
"media-use/scripts/lib/telemetry.test.mjs": "
|
|
323
|
+
"media-use/scripts/lib/telemetry.test.mjs": "230b3c1e16871e73ef81a88b5f8c49170223c4056f8cdc6cf5def5578fd2edd8",
|
|
324
|
+
"media-use/scripts/lib/test-home.test.mjs": "528fc07b1c6df39e3b4504db38199cbf6b93007562beb18f542d426315b01690",
|
|
247
325
|
"media-use/scripts/lib/transcriptCutFade.mjs": "ee9c7ec28650cf0f6a0f1f21f1c6a1faa5e152337163cccc0cc9a109b3c99805",
|
|
326
|
+
"media-use/scripts/lib/transcriptCutFade.test.mjs": "e4a085de543c8463fa81bf4125e9e3438c7dd4ed9e338498cd959da216db9de7",
|
|
327
|
+
"media-use/scripts/lib/tts-local-provider.mjs": "7f6144689bc3fc3a79697150ea783e23d04f1339c08188e1e033a050d85ca1ae",
|
|
328
|
+
"media-use/scripts/lib/tts-local-provider.test.mjs": "66b51a1f5b8fcd4f935541989b76f358ace8f1a0946b52e5ce264b7b0c2a0d9d",
|
|
329
|
+
"media-use/scripts/lib/usage.mjs": "0731c6709210ea6384ac70087ef61030e7047fd3075bfd53ceb669520121bb63",
|
|
330
|
+
"media-use/scripts/lib/usage.test.mjs": "b6ed5dafbdd4f4e3775bf7483b2add22275f4906e9be08cc83f1aeceb2bfa9ca",
|
|
331
|
+
"media-use/scripts/lib/voice-provider.mjs": "1d83560ca6d78d58c3d85e989245c07530b32186c67508fdfbd145722dd10b85",
|
|
332
|
+
"media-use/scripts/lib/voice-provider.test.mjs": "6f2904cf374066caca014e4a0a12dfb8d87fbd50bcb09c5c26d6337b063ce9da",
|
|
248
333
|
"media-use/scripts/lib/words.mjs": "bfc1f93523d2fc8ce55580b262efcca537c7feabaf029c1c6f33433591377adb",
|
|
249
334
|
"media-use/scripts/prefs.mjs": "f551d5efe51dea7b59d37595c052b950111c6734d913567630181959e7497a04",
|
|
250
335
|
"media-use/scripts/recipe.mjs": "97d2a12604084668599c44f235d6300b77593f86a9a58a6034cf5aa92c98fcba",
|
|
251
336
|
"media-use/scripts/resolve-plugin.test.mjs": "fe8f4dce139b3a88e9ba817da335ae7667a644a715f250613901f7cc1e75f0ed",
|
|
252
|
-
"media-use/scripts/resolve.mjs": "
|
|
337
|
+
"media-use/scripts/resolve.mjs": "05df5c0d1c97c0e96f2d8a0941370c4f9b78f413f09a6c0e5de04db684d8da1b",
|
|
253
338
|
"media-use/scripts/transcribe.mjs": "9e0f2fd2775e3a76267fc219d4b5aa52373a95478812884f8f40f6292e09dac7",
|
|
254
339
|
"media-use/scripts/transcribe.test.mjs": "39a456ac37a0eca282417b09d7e556c0f2ac11ab3726bc361ff077e75a963ae1",
|
|
255
340
|
"media-use/scripts/transcript-cut.mjs": "17e148571738ad8cf30b0ccb3f28d0837df5072114b9dfb63bc8d9f5d25e5a5d",
|
|
@@ -7,4 +7,4 @@ description: Compatibility entry for the retired embedded-captions skill; routes
|
|
|
7
7
|
|
|
8
8
|
The current official HyperFrames release merged this workflow into the `hyperframes` skill. Load `hyperframes` from the DSH skill registry and follow its current instructions for the user's task. Use its bundled resources; do not reconstruct the retired workflow or download standalone skills.
|
|
9
9
|
|
|
10
|
-
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins HyperFrames
|
|
10
|
+
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins the HyperFrames release from plugin.json and suppresses standalone skill installation; run it in the user's project directory. This entry preserves the previous DSH skill name while using the current workflow.
|
|
@@ -7,4 +7,4 @@ description: Compatibility entry for the retired faceless-explainer skill; route
|
|
|
7
7
|
|
|
8
8
|
The current official HyperFrames release merged this workflow into the `hyperframes` skill. Load `hyperframes` from the DSH skill registry and follow its current instructions for the user's task. Use its bundled resources; do not reconstruct the retired workflow or download standalone skills.
|
|
9
9
|
|
|
10
|
-
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins HyperFrames
|
|
10
|
+
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins the HyperFrames release from plugin.json and suppresses standalone skill installation; run it in the user's project directory. This entry preserves the previous DSH skill name while using the current workflow.
|
|
@@ -7,4 +7,4 @@ description: Compatibility entry for the retired general-video skill; routes to
|
|
|
7
7
|
|
|
8
8
|
The current official HyperFrames release merged this workflow into the `hyperframes` skill. Load `hyperframes` from the DSH skill registry and follow its current instructions for the user's task. Use its bundled resources; do not reconstruct the retired workflow or download standalone skills.
|
|
9
9
|
|
|
10
|
-
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins HyperFrames
|
|
10
|
+
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins the HyperFrames release from plugin.json and suppresses standalone skill installation; run it in the user's project directory. This entry preserves the previous DSH skill name while using the current workflow.
|
|
@@ -7,4 +7,4 @@ description: Compatibility entry for the retired hyperframes-animation skill; ro
|
|
|
7
7
|
|
|
8
8
|
The current official HyperFrames release merged this workflow into the `hyperframes` skill. Load `hyperframes` from the DSH skill registry and follow its current instructions for the user's task. Use its bundled resources; do not reconstruct the retired workflow or download standalone skills.
|
|
9
9
|
|
|
10
|
-
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins HyperFrames
|
|
10
|
+
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins the HyperFrames release from plugin.json and suppresses standalone skill installation; run it in the user's project directory. This entry preserves the previous DSH skill name while using the current workflow.
|
|
@@ -7,4 +7,4 @@ description: Compatibility entry for the retired hyperframes-audio skill; routes
|
|
|
7
7
|
|
|
8
8
|
The current official HyperFrames release merged this workflow into the `media-use` skill. Load `media-use` from the DSH skill registry and follow its current instructions for the user's task. Use its bundled resources; do not reconstruct the retired workflow or download standalone skills.
|
|
9
9
|
|
|
10
|
-
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins HyperFrames
|
|
10
|
+
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins the HyperFrames release from plugin.json and suppresses standalone skill installation; run it in the user's project directory. This entry preserves the previous DSH skill name while using the current workflow.
|
|
@@ -7,4 +7,4 @@ description: Compatibility entry for the retired hyperframes-core skill; routes
|
|
|
7
7
|
|
|
8
8
|
The current official HyperFrames release merged this workflow into the `hyperframes` skill. Load `hyperframes` from the DSH skill registry and follow its current instructions for the user's task. Use its bundled resources; do not reconstruct the retired workflow or download standalone skills.
|
|
9
9
|
|
|
10
|
-
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins HyperFrames
|
|
10
|
+
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins the HyperFrames release from plugin.json and suppresses standalone skill installation; run it in the user's project directory. This entry preserves the previous DSH skill name while using the current workflow.
|
|
@@ -7,4 +7,4 @@ description: Compatibility entry for the retired hyperframes-creative skill; rou
|
|
|
7
7
|
|
|
8
8
|
The current official HyperFrames release merged this workflow into the `hyperframes` skill. Load `hyperframes` from the DSH skill registry and follow its current instructions for the user's task. Use its bundled resources; do not reconstruct the retired workflow or download standalone skills.
|
|
9
9
|
|
|
10
|
-
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins HyperFrames
|
|
10
|
+
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins the HyperFrames release from plugin.json and suppresses standalone skill installation; run it in the user's project directory. This entry preserves the previous DSH skill name while using the current workflow.
|
|
@@ -7,4 +7,4 @@ description: Compatibility entry for the retired hyperframes-keyframes skill; ro
|
|
|
7
7
|
|
|
8
8
|
The current official HyperFrames release merged this workflow into the `hyperframes` skill. Load `hyperframes` from the DSH skill registry and follow its current instructions for the user's task. Use its bundled resources; do not reconstruct the retired workflow or download standalone skills.
|
|
9
9
|
|
|
10
|
-
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins HyperFrames
|
|
10
|
+
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins the HyperFrames release from plugin.json and suppresses standalone skill installation; run it in the user's project directory. This entry preserves the previous DSH skill name while using the current workflow.
|
|
@@ -7,4 +7,4 @@ description: Compatibility entry for the retired hyperframes-studio skill; route
|
|
|
7
7
|
|
|
8
8
|
The current official HyperFrames release merged this workflow into the `hyperframes-cli` skill. Load `hyperframes-cli` from the DSH skill registry and follow its current instructions for the user's task. Use its bundled resources; do not reconstruct the retired workflow or download standalone skills.
|
|
9
9
|
|
|
10
|
-
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins HyperFrames
|
|
10
|
+
For an existing project, preserve its files and dependencies. DSH plugin management owns this installed skill bundle. The upstream plugin launcher pins the HyperFrames release from plugin.json and suppresses standalone skill installation; run it in the user's project directory. This entry preserves the previous DSH skill name while using the current workflow.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { readdirSync, statSync, existsSync } from "node:fs";
|
|
2
|
+
import { join, extname, basename } from "node:path";
|
|
3
|
+
import { readManifest, appendRecord, nextId } from "./manifest.mjs";
|
|
4
|
+
import { regenerateIndex } from "./index-gen.mjs";
|
|
5
|
+
import { probe } from "./probe.mjs";
|
|
6
|
+
import { matchTokens } from "./match.mjs";
|
|
7
|
+
|
|
8
|
+
const AUDIO_EXT = new Set([".mp3", ".wav", ".ogg", ".m4a", ".aac"]);
|
|
9
|
+
const IMAGE_EXT = new Set([".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg", ".ico"]);
|
|
10
|
+
const VIDEO_EXT = new Set([".mp4", ".webm", ".mov"]);
|
|
11
|
+
|
|
12
|
+
function inferType(filePath) {
|
|
13
|
+
const ext = extname(filePath).toLowerCase();
|
|
14
|
+
if (AUDIO_EXT.has(ext)) {
|
|
15
|
+
const lower = filePath.toLowerCase();
|
|
16
|
+
if (lower.includes("/bgm/") || lower.includes("/music/") || lower.startsWith("bgm/"))
|
|
17
|
+
return "bgm";
|
|
18
|
+
if (lower.includes("/sfx/") || lower.includes("/sound") || lower.startsWith("sfx/"))
|
|
19
|
+
return "sfx";
|
|
20
|
+
if (lower.includes("/voice/") || lower.includes("/narrat") || lower.startsWith("voice/"))
|
|
21
|
+
return "voice";
|
|
22
|
+
return "bgm";
|
|
23
|
+
}
|
|
24
|
+
if (IMAGE_EXT.has(ext)) {
|
|
25
|
+
if (ext === ".svg" || ext === ".ico") return "icon";
|
|
26
|
+
return "image";
|
|
27
|
+
}
|
|
28
|
+
if (VIDEO_EXT.has(ext)) return "video";
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function walkDir(dir, base = "") {
|
|
33
|
+
const files = [];
|
|
34
|
+
if (!existsSync(dir)) return files;
|
|
35
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
36
|
+
const rel = base ? `${base}/${entry.name}` : entry.name;
|
|
37
|
+
if (entry.isDirectory()) {
|
|
38
|
+
files.push(...walkDir(join(dir, entry.name), rel));
|
|
39
|
+
} else {
|
|
40
|
+
files.push(rel);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return files;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function scanExistingAssets(projectDir) {
|
|
47
|
+
const assetsDir = join(projectDir, "assets");
|
|
48
|
+
if (!existsSync(assetsDir)) return [];
|
|
49
|
+
|
|
50
|
+
const files = walkDir(assetsDir);
|
|
51
|
+
const found = [];
|
|
52
|
+
for (const rel of files) {
|
|
53
|
+
const type = inferType(rel);
|
|
54
|
+
if (!type) continue;
|
|
55
|
+
const fullPath = join(assetsDir, rel);
|
|
56
|
+
const stat = statSync(fullPath);
|
|
57
|
+
if (stat.size === 0) {
|
|
58
|
+
// A 0-byte asset would register clean but fail at render — skip it loudly
|
|
59
|
+
// rather than adopt a broken file.
|
|
60
|
+
console.error(`media-use: skipping 0-byte asset assets/${rel}`);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const meta = probe(fullPath);
|
|
64
|
+
found.push({
|
|
65
|
+
relativePath: `assets/${rel}`,
|
|
66
|
+
type,
|
|
67
|
+
size: stat.size,
|
|
68
|
+
name: basename(rel, extname(rel)),
|
|
69
|
+
...meta,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return found;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function adoptExistingAssets(projectDir) {
|
|
76
|
+
const existing = scanExistingAssets(projectDir);
|
|
77
|
+
if (existing.length === 0) return [];
|
|
78
|
+
|
|
79
|
+
const manifest = readManifest(projectDir);
|
|
80
|
+
const knownPaths = new Set(manifest.map((r) => r.path));
|
|
81
|
+
|
|
82
|
+
const adopted = [];
|
|
83
|
+
for (const asset of existing) {
|
|
84
|
+
if (knownPaths.has(asset.relativePath)) continue;
|
|
85
|
+
|
|
86
|
+
const id = nextId(projectDir, asset.type);
|
|
87
|
+
const record = {
|
|
88
|
+
id,
|
|
89
|
+
type: asset.type,
|
|
90
|
+
path: asset.relativePath,
|
|
91
|
+
source: "existing",
|
|
92
|
+
description: asset.name.replace(/[-_]/g, " "),
|
|
93
|
+
...(asset.duration != null && { duration: asset.duration }),
|
|
94
|
+
...(asset.width != null && { width: asset.width }),
|
|
95
|
+
...(asset.height != null && { height: asset.height }),
|
|
96
|
+
provenance: { provider: "local", adopted: true },
|
|
97
|
+
};
|
|
98
|
+
appendRecord(projectDir, record);
|
|
99
|
+
adopted.push(record);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (adopted.length > 0) regenerateIndex(projectDir);
|
|
103
|
+
return adopted;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Adopt a pre-existing assets/ file only when it shares a meaningful word with
|
|
107
|
+
// the intent. The old test — `name.includes(intent) || intent.includes(name)` —
|
|
108
|
+
// silently returned the WRONG file: "whoosh" grabbed a stray who.mp3, and a
|
|
109
|
+
// one-letter filename matched every intent. A false negative just falls through
|
|
110
|
+
// to a catalog search (safe); a false positive ships the wrong asset. So bias to
|
|
111
|
+
// precision: require a shared token, don't guess from substrings.
|
|
112
|
+
export function findExistingAsset(projectDir, intent, type) {
|
|
113
|
+
const assetsDir = join(projectDir, "assets");
|
|
114
|
+
if (!existsSync(assetsDir)) return null;
|
|
115
|
+
const intentTokens = matchTokens(intent);
|
|
116
|
+
if (intentTokens.size === 0) return null;
|
|
117
|
+
for (const rel of walkDir(assetsDir)) {
|
|
118
|
+
const t = inferType(rel);
|
|
119
|
+
if (!t || (type && t !== type)) continue;
|
|
120
|
+
const stem = basename(rel, extname(rel));
|
|
121
|
+
for (const tok of matchTokens(stem)) {
|
|
122
|
+
if (intentTokens.has(tok)) {
|
|
123
|
+
return { relativePath: `assets/${rel}`, type: t, name: stem };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|