///
declare namespace NodeJS {
interface ProcessEnv {
/**
* The built directory structure
*
* ```tree
* ├─┬─┬ dist
* │ │ └── index.html
* │ │
* │ ├─┬ dist-electron
* │ │ ├── main.js
* │ │ └── preload.js
* │
* ```
*/
APP_ROOT: string;
/** /dist/ or /public/ */
VITE_PUBLIC: string;
}
}
/** sharp 图片处理库(可选依赖,运行时动态加载) */
declare module 'sharp' {
interface SharpInstance {
metadata(): Promise<{ width?: number; height?: number; format?: string }>;
resize(width?: number, height?: number, options?: { fit?: string; withoutEnlargement?: boolean }): SharpInstance;
jpeg(options?: { quality?: number }): SharpInstance;
toBuffer(): Promise;
}
function sharp(input: string | Buffer): SharpInstance;
export = sharp;
}
// Used in Renderer process, expose in `preload.ts`
declare interface Window {
ipcRenderer: import('electron').IpcRenderer;
/** safeStorage 安全加密 API(基于 OS 原生密钥链) */
safeStorage: {
encrypt(plaintext: string): Promise;
decrypt(encryptedBase64: string): Promise;
};
/** 应用运行时 API */
appRuntime: {
/** 登录/登出后更新窗口标题中的版控后缀 */
setWindowEdition(edition: string | null): void;
};
/** 无限画布 API(由 preload 注入) */
canvas: {
/** 打开画布窗口 */
openWindow(projectPath?: string): void;
/** 扫描目录 */
scanDirectory(params: {
roots: string[];
extensions: string[];
recursive: boolean;
}): Promise<{ success: boolean; data: Array<{ path: string; fileName: string; ext: string; fileSize: number; modifiedAt: string }>; error?: string }>;
/** 读取 sidecar 元数据 */
readSidecar(params: { filePath: string }): Promise<{ success: boolean; data: object | null }>;
/** 写入 sidecar 元数据 */
writeSidecar(params: { filePath: string; metadata: object }): Promise<{ success: boolean; error?: string }>;
/** 生成缩略图 */
generateThumbnail(params: { filePath: string; size: number }): Promise<{
success: boolean;
data: { data: string; mimeType: string; width: number; height: number };
error?: string;
}>;
/** 扫描项目 */
scanProject(params: { projectPath: string; stage: string; assetTypeFilter: string; shotQuery: string }): Promise<{ success: boolean; data: Array<{ path: string; fileName: string; ext: string; fileSize: number; modifiedAt: string }>; error?: string }>;
/** 复制文件 */
copyFile(params: { src: string; destDir: string; fileName: string }): Promise<{ success: boolean; data: string; error?: string }>;
/** 列出目录下的子文件夹(非递归,排除隐藏) */
listSubdirs(params: { parentPath: string }): Promise<{ success: boolean; data: string[]; error?: string }>;
/** 扫描阶段文件(单个 episode/shot/stage 组合) */
scanStageFiles(params: { projectPath: string; episode: string; shot: string; stage: string }): Promise<{ success: boolean; data: Array<{ path: string; fileName: string; ext: string; fileSize: number; modifiedAt: string }>; error?: string }>;
/** 扫描资产文件(深度递归扫描 assets/ 目录) */
scanAssetFiles(params: { projectPath: string; assetTypeFilter: string }): Promise<{ success: boolean; data: Array<{ path: string; fileName: string; ext: string; fileSize: number; modifiedAt: string }>; error?: string }>;
/** 创建目录 */
createDirectory(params: { parentPath: string; dirName: string }): Promise<{ success: boolean; data: string; error?: string }>;
/** 将本地文件路径转换为 local-media:// 协议 URL */
getMediaUrl(filePath: string): string;
/** 启动原生文件拖拽(从缩略图拖放媒体文件到外部应用) */
startDrag(params: { filePath: string; fileName: string }): Promise<{ success: boolean; error?: string }>;
};
}