asset-import
GitHub指导通过本地或上传方式导入媒体资源,支持同机回环桥接与远程上传辅助,处理批量导入、重试及转录等待。
Trigger Scenarios
Install
npx skills add ChatCut-Inc/agent-plugin --skill asset-import -g -y
SKILL.md
Frontmatter
{
"name": "asset-import",
"description": "Import local or downloaded media, or relink missing media to an existing ChatCut asset, through the hosted Codex plugin. Use the editor loopback bridge when the editor and files are on the same machine; use the upload helper for imports otherwise. Desktop MCP sessions use their own built-in import tools."
}
Asset Import
Check browse_assets first when a file may already be imported.
Same-machine editor import (preferred)
- Open the target project using
browserHandoff.urloreditorUrl. Keep exactly one editor tab for this project open, on the same machine/network namespace as your shell. A remote sandbox's localhost is not the user's localhost. - Start the bundled server using Codex's bundled Node runtime when available, otherwise Node 18+ from PATH, and the origin of the actual editor URL:
"<bundled-or-global-node>" <this-skill-dir>/scripts/serve-local-media.mjs --origin <editor-origin> /path/to/source.mp4
Keep this process alive using the host's background-process support while calling MCP. It prints one JSON line and automatically exits after 900 seconds. It serves only the listed files over tokenized loopback URLs.
- Import multiple files in one
import_mediacall:{"action":"from_editor","files":[...]}. Copy each file'sassetId,url,filename, andsizeBytesfrom the printedimportsarray intofiles, omitting its per-fileaction. Each URL may come from a different running helper. Send 1–16 files per call; for larger sets, submit successive batches of 16. Processing is bounded to four concurrent imports. There is no loopback-specific file-size cap. The original top-level single-file arguments still work. - Inspect every entry in
results: successful entries haveok:trueandstatus:"locally_imported"; failed entries have anerror. Results preserve input order and includeassetIdandfilename, with top-levelsucceeded/failedcounts. Retry only failed files with the same asset IDs. Success means the editor has persisted local bytes and registered the asset locally. Stop the helpers only after all files succeed. Keep the editor open for server sync, background upload and transcription. - Use the returned asset IDs for timeline work. Wait on
track_progress target:"transcription"before transcript/caption work. Browser-renderable timelines defer original-file uploads; cloud-only or unsupported timelines upload automatically. Checkbrowse_assetsbefore waiting ontarget:"upload"; a deferred upload is not in progress. Use the editor's Upload action when cloud bytes are needed, preserving the same asset ID. If server sync is still catching up, retry the asset lookup.
On timeout, check browse_assets and retry with the same assetId; the import may still be running. Keep the same ID even if restarting the helper changes its URL. Do not blindly start a second import. Allow the editor's browser local-network permission if prompted. If the editor cannot reach the helper or the bridge is unavailable, use the fallback. A host-policy denial is not permission to try another transfer route.
For visual analysis, inspect readable original files locally rather than waiting for cloud upload. Import original source assets; do not flatten an edit into a local pre-render.
Relink an existing asset
For missing local media, preserve the existing asset and its timeline references:
- Get the existing
assetIdfrombrowse_assetsand locate its corresponding original source file. - Serve that file with the same loopback helper above.
- Call
import_mediawith the helper'surl,filename, andsizeBytes, but setaction: "relink_from_editor"and replace the generatedassetIdwith the existing assetId. For multiple files, use the samefilesarray form, with an existing asset ID in every entry. - Wait for
status: "locally_relinked"before stopping the helper. Upload/transcription may still be pending; keep the editor open.
Relink always reads the supplied file, even if the editor has cached bytes. The media type must match. Use the corresponding original, not a different replacement clip: relink preserves existing edits and transcripts. If the target is missing from the editor, let project sync finish and retry. A failed relink must not fall back to creating a new asset.
Upload-helper fallback
For a remote sandbox, unavailable editor, or blocked browser connection:
- Call
import_mediawith{"action":"create_session"}. - Run the bundled helper in the foreground, using the returned token and endpoint and at most four paths:
"<bundled-or-global-node>" <this-skill-dir>/scripts/upload-media.mjs --token <token> --endpoint <endpoint> /path/to/source.mp4
Resolve scripts relative to this skill. Do not replace the helper with handwritten upload/transcode commands. MCP OAuth stays inside the MCP client; only the short-lived import token goes to the helper. Larger batches need a fresh session per four files.
The helper registers placeholders early but prints its final JSON after uploads complete. Read imports[].result.assetId. On an error with retry, obtain a fresh session and rerun the returned arguments to resume the same asset.
If host policy denies transfer, stop and ask the user to upload through the editor or grant permission. Do not work around the denial. Public URLs can be downloaded locally and then imported through the appropriate route above.
Version History
-
0dd9c5e
Current 2026-09-22 02:32
从单批4文件上传改为同机优先回环桥接,支持单次最多16文件批量导入。
- 014586d 2026-08-27 10:43
-
e1867a8
2026-08-02 23:37
优化了资产导入流程,明确了使用browse_assets避免重复,细化了import_media参数及upload-media.mjs脚本的使用规范,强调了错误重试策略和权限拒绝时的处理方式。
-
f39cdae
2026-07-30 21:53
同步插件版本至66c0309a40866ab98e1147b05d4cc160094efab5
- 5e9afe0 2026-07-22 10:58


