diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml new file mode 100644 index 00000000..b4ca3134 --- /dev/null +++ b/.github/workflows/build-test.yml @@ -0,0 +1,67 @@ +name: Build & Test + +on: + push: + branches: [main] + pull_request: + +jobs: + build-and-test: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + + - name: Install Node dependencies + run: npm ci + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install Python tooling + run: | + python -m venv .venv + source .venv/bin/activate + pip install --upgrade pip build pytest ruff aiohttp twine + + - name: Sync manifest and bundle assets + run: | + source .venv/bin/activate + python scripts/sync_bundles.py + + - name: Lint Python modules + run: | + source .venv/bin/activate + ruff check scripts/sync_bundles.py packages/core packages/meta + + - name: Build packages + run: | + source .venv/bin/activate + rm -rf dist + mkdir dist + for pkg in core media_api media_video media_image media_other meta; do + python -m build --outdir dist packages/$pkg + done + + - name: Run Nx build (sanity) + env: + NX_ADD_PLUGINS: "false" + NX_DAEMON: "false" + run: | + source .venv/bin/activate + npm run build:all + + - name: Run tests + env: + PYTHONPATH: packages/meta/src:packages/core/src:packages/media_api/src:packages/media_video/src:packages/media_image/src:packages/media_other/src + run: | + source .venv/bin/activate + pytest packages/core/tests diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 95285428..a8e3a335 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -42,25 +42,44 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + + - name: Install Node dependencies + run: npm ci + - name: Set up Python uses: actions/setup-python@v4 with: python-version: "3.x" - - name: Install build dependencies - run: python -m pip install build + - name: Install build tooling + run: | + python -m venv .venv + source .venv/bin/activate + pip install --upgrade pip build - - name: Setup package + - name: Sync manifest and bundle assets run: | - mkdir -p comfyui_workflow_templates/templates/ - cp -r templates/* comfyui_workflow_templates/templates/ + source .venv/bin/activate + python scripts/sync_bundles.py - - name: Build package - run: python -m build + - name: Build packages + run: | + source .venv/bin/activate + rm -rf dist + mkdir dist + for pkg in core media_api media_video media_image media_other meta; do + python -m build --outdir dist packages/$pkg + done - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: + packages-dir: dist password: ${{ secrets.PYPI_TOKEN }} attestations: false diff --git a/.gitignore b/.gitignore index 91a31611..c5d212a2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ pnpm-debug.log* lerna-debug.log* node_modules +.venv +.nx dist dist-ssr *.local @@ -49,6 +51,14 @@ dist.zip # Generated JSON Schemas /schemas/ +# Generated manifest samples +/prd/ + +# Generated bundle assets +packages/*/src/**/templates/ +packages/*/src/**/__pycache__/ +packages/*/src/**/*.egg-info/ + # Workflow templates assets # Hosted on https://github.com/Comfy-Org/workflow_templates /public/templates/ @@ -72,4 +82,4 @@ lychee_full_report.txt LINK_CHECKER_REPORT.md # Asset validation report (generated by scripts) -asset_validation_report.md \ No newline at end of file +asset_validation_report.md diff --git a/MANIFEST.in b/MANIFEST.in index 07648b0b..04f196ac 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,2 @@ include README.md include LICENSE -recursive-include comfyui_workflow_templates/templates * \ No newline at end of file diff --git a/README.md b/README.md index 82c4d422..ae7f701d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,15 @@ # workflow_templates -ComfyUI workflow templates available in the app by clicking the **Workflow** button then the **Browse Templates** button. +This repo hosts the official ComfyUI workflow templates. The repository now ships a +**package-per-media** structure: + +- `packages/core` – manifest + loader helpers shipped as `comfyui-workflow-templates-core` +- `packages/media_*` – the actual template JSON + preview assets for each media type +- `packages/meta` and the root `pyproject.toml` – the `comfyui-workflow-templates` meta package that depends on all others + +Most contributors only touch the `templates/` folder and `bundles.json`, but the build +pipeline now requires the helper scripts described below. See the sections on "Adding +new templates" and "Publishing" for the exact steps. - [workflow\_templates](#workflow_templates) - [Adding New Templates](#adding-new-templates) @@ -10,12 +19,13 @@ ComfyUI workflow templates available in the app by clicking the **Workflow** but - [4 — Choose Thumbnail Type](#4--choose-thumbnail-type) - [5 — Compress Assets](#5--compress-assets) - [6 — Rename and Move Files](#6--rename-and-move-files) - - [7 — Add Entry to `index.json`](#7--add-entry-to-indexjson) - - [8 — Embed Models](#8--embed-models) - - [9 — Embed Node Versions (optional)](#9--embed-node-versions-optional) - - [10 — Add Documentation Nodes (optional)](#10--add-documentation-nodes-optional) - - [11 — Bump Version and Create PR](#11--bump-version-and-create-pr) - - [12 — Add Translations](#12--add-translations) + - [7 — Assign Bundle & Sync Assets](#7--assign-bundle--sync-assets) + - [8 — Add Entry to `index.json`](#8--add-entry-to-indexjson) + - [9 — Embed Models](#9--embed-models) + - [10 — Embed Node Versions (optional)](#10--embed-node-versions-optional) + - [11 — Add Documentation Nodes (optional)](#11--add-documentation-nodes-optional) + - [12 — Bump Version and Create PR](#12--bump-version-and-create-pr) + - [13 — Add Translations](#13--add-translations) ## Adding New Templates @@ -93,7 +103,22 @@ text_to_video_wan-1.webp Then move the renamed files to your templates folder. -### 7 — Add Entry to `index.json` +### 7 — Assign Bundle & Sync Assets + +Each template lives in one bundle (`media-image`, `media-video`, etc.). Update +[`bundles.json`](bundles.json) with the template ID so the correct media package ships it. +After editing `templates/` or `bundles.json`, regenerate the manifest and copy assets into +the package directories: + +```bash +python scripts/sync_bundles.py +# or via Nx +npm run sync +``` + +This step must be run before committing; CI will fail if the manifest/bundles are out of sync. + +### 8 — Add Entry to `index.json` There's an [`index.json`](templates/index.json) file in the templates folder which is where template configurations are set. You will need to add your template to this file, using the fields outlined below: @@ -166,7 +191,7 @@ Now you can start ComfyUI (or refresh browser if already running) and test that > > Make sure to use double-quotes `"` instead of single-quotes `'` when adding things to json files -### 8 — Embed Models +### 9 — Embed Models Now we need to embed metadata for any models the template workflow uses. This way, the user can download and run the workflow without ever leaving ComfyUI. @@ -296,7 +321,7 @@ You can find the `hash` and `hash_type` for a model on huggingface (see below)or > > Ensure that the filename being downloaded from the links matches the filenames in the `widgets_values` exactly. -### 9 — Embed Node Versions (optional) +### 10 — Embed Node Versions (optional) If your template requires a specific version of Comfy or a custom node, you can specify that using the same process as with models. @@ -330,7 +355,7 @@ The Wan 2.1 workflow requires the SaveWEBM node which wasn't fully supported unt This can help diagnose issues when others run the workflow and ensure the workflow is more reproducible. -### 10 — Add Documentation Nodes (optional) +### 11 — Add Documentation Nodes (optional) If your template corresponds with a page on https://github.com/comfyanonymous/ComfyUI_examples, https://docs.comfy.org/custom-nodes/workflow_templates, etc., you can add a `MarkdownNote` node with links: @@ -346,7 +371,22 @@ Raw markdown used: > [Wan 2.1 Tutorial - docs.comfy.org](https://docs.comfy.org/tutorials/video/wan/wan-video) — Explanation of concepts and step-by-step tutorial ``` -### 11 — Bump Version and Create PR +### 12 — Bump Version and Create PR + +Run the automated version helper before opening your PR. It looks at the latest git tag +and bumps only the packages that changed (plus updates dependency pins): + +```bash +./scripts/bump_versions.py --dry-run # optional preview +./scripts/bump_versions.py +``` + +Then run the full validation script (which regenerates manifests, runs lint/tests, and +builds wheels): + +```bash +./run_full_validation.sh +``` 1. Fully test the workflow: delete the models, input images, etc. and try it as a new user would. Ensure the process has no hiccups and you can generate the thumbnail image on the first execution (if applicable). 2. Create a fork of https://github.com/Comfy-Org/workflow_templates (or just checkout a new branch if you are a Comfy-Org collaborator) @@ -361,7 +401,7 @@ Here is the PR I made for the Wan template: https://github.com/Comfy-Org/workflo Once the PR is merged, if you followed step 6 correctly, a new version will be published to the [comfyui-workflow-templates PyPi package](https://pypi.org/project/comfyui-workflow-templates). -### 12 — Add Translations +### 13 — Add Translations Make a PR in https://github.com/Comfy-Org/ComfyUI_frontend adding the mapping from your template filename (without extension) to the English display name title. The mapping goes in [`ComfyUI_frontend/src/locales/en/main.json`](https://github.com/Comfy-Org/ComfyUI_frontend/blob/9f0abac57ba0d5752c51198bf8a075b8336fdda1/src/locales/en/main.json#L480-L487). diff --git a/bundles.json b/bundles.json new file mode 100644 index 00000000..1eef995a --- /dev/null +++ b/bundles.json @@ -0,0 +1,200 @@ +{ + "media-api": [ + "api_bfl_flux_1_kontext_max_image", + "api_bfl_flux_1_kontext_multiple_images_input", + "api_bfl_flux_1_kontext_pro_image", + "api_bfl_flux_pro_t2i", + "api_bytedance_flf2v", + "api_bytedance_image_to_video", + "api_bytedance_seedream4", + "api_bytedance_text_to_video", + "api_google_gemini", + "api_google_gemini_image", + "api_hailuo_minimax_i2v", + "api_hailuo_minimax_t2v", + "api_hailuo_minimax_video", + "api_ideogram_v3_t2i", + "api_kling_effects", + "api_kling_flf", + "api_kling_i2v", + "api_ltxv_image_to_video", + "api_ltxv_text_to_video", + "api_luma_i2v", + "api_luma_photon_i2i", + "api_luma_photon_style_ref", + "api_luma_t2v", + "api_moonvalley_image_to_video", + "api_moonvalley_text_to_video", + "api_moonvalley_video_to_video_motion_transfer", + "api_moonvalley_video_to_video_pose_control", + "api_openai_chat", + "api_openai_dall_e_2_inpaint", + "api_openai_dall_e_2_t2i", + "api_openai_dall_e_3_t2i", + "api_openai_image_1_i2i", + "api_openai_image_1_inpaint", + "api_openai_image_1_multi_inputs", + "api_openai_image_1_t2i", + "api_openai_sora_video", + "api_pika_i2v", + "api_pika_scene", + "api_pixverse_i2v", + "api_pixverse_t2v", + "api_pixverse_template_i2v", + "api_recraft_image_gen_with_color_control", + "api_recraft_image_gen_with_style_control", + "api_recraft_vector_gen", + "api_rodin_gen2", + "api_rodin_image_to_model", + "api_rodin_multiview_to_model", + "api_runway_first_last_frame", + "api_runway_gen3a_turbo_image_to_video", + "api_runway_gen4_turo_image_to_video", + "api_runway_reference_to_image", + "api_runway_text_to_image", + "api_stability_ai_audio_inpaint", + "api_stability_ai_audio_to_audio", + "api_stability_ai_i2i", + "api_stability_ai_sd3.5_i2i", + "api_stability_ai_sd3.5_t2i", + "api_stability_ai_stable_image_ultra_t2i", + "api_stability_ai_text_to_audio", + "api_tripo_image_to_model", + "api_tripo_multiview_to_model", + "api_tripo_text_to_model", + "api_veo2_i2v", + "api_veo3", + "api_vidu_image_to_video", + "api_vidu_reference_to_video", + "api_vidu_start_end_to_video", + "api_vidu_text_to_video", + "api_wan_image_to_video", + "api_wan_text_to_image", + "api_wan_text_to_image ", + "api_wan_text_to_video" + ], + "media-image": [ + "01_qwen_t2i_subgraphed", + "02_qwen_Image_edit_subgraphed", + "3d_hunyuan3d_image_to_model", + "controlnet_example", + "depth_controlnet", + "depth_t2i_adapter", + "flux1_dev_uso_reference_image_gen", + "flux1_krea_dev", + "flux_canny_model_example", + "flux_depth_lora_example", + "flux_dev_checkpoint_example", + "flux_dev_full_text_to_image", + "flux_fill_inpaint_example", + "flux_fill_outpaint_example", + "flux_kontext_dev_basic", + "flux_redux_model_example", + "flux_schnell", + "flux_schnell_full_text_to_image", + "image2image", + "image_chroma1_radiance_text_to_image", + "image_chroma_text_to_image", + "image_chrono_edit_14B", + "image_flux.1_fill_dev_OneReward", + "image_lotus_depth_v1_1", + "image_netayume_lumina_t2i", + "image_omnigen2_image_edit", + "image_omnigen2_t2i", + "image_qwen_image", + "image_qwen_image_controlnet_patch", + "image_qwen_image_edit", + "image_qwen_image_edit_2509", + "image_qwen_image_instantx_controlnet", + "image_qwen_image_instantx_inpainting_controlnet", + "image_qwen_image_union_control_lora", + "inpaint_example", + "inpaint_model_outpainting", + "mixing_controlnets", + "sd3.5_large_canny_controlnet_example", + "sdxl_refiner_prompt_example", + "sdxl_revision_text_prompts", + "sdxl_simple_example", + "sdxlturbo_example" + ], + "media-other": [ + "04_hunyuan_3d_2.1_subgraphed", + "05_audio_ace_step_1_t2a_song_subgraphed", + "2_pass_pose_worship", + "3d_hunyuan3d-v2.1", + "3d_hunyuan3d_multiview_to_model", + "3d_hunyuan3d_multiview_to_model_turbo", + "ByteDance-Seedance_00003_", + "area_composition", + "area_composition_square_area_for_subject", + "audio_ace_step_1_m2m_editing", + "audio_ace_step_1_t2a_instrumentals", + "audio_ace_step_1_t2a_song", + "audio_stable_audio_example", + "default", + "embedding_example", + "esrgan_example", + "gligen_textbox_example", + "hidream_e1_1", + "hidream_e1_full", + "hidream_i1_dev", + "hidream_i1_fast", + "hidream_i1_full", + "hiresfix_esrgan_workflow", + "hiresfix_latent_workflow", + "index", + "index.ar", + "index.es", + "index.fr", + "index.ja", + "index.ko", + "index.ru", + "index.schema", + "index.tr", + "index.zh", + "index.zh-TW", + "latent_upscale_different_prompt_model", + "lora", + "lora_multiple", + "sd3.5_large_blur", + "sd3.5_large_depth", + "sd3.5_simple_example", + "wan2.1_flf2v_720_f16", + "wan2.1_fun_control", + "wan2.1_fun_inp" + ], + "media-video": [ + "03_video_wan2_2_14B_i2v_subgraphed", + "hunyuan_video_text_to_video", + "image_to_video", + "image_to_video_wan", + "ltxv_image_to_video", + "ltxv_text_to_video", + "mochi_text_to_video_example", + "text_to_video_wan", + "txt_to_image_to_video", + "video_humo", + "video_wan2.1_alpha_t2v_14B", + "video_wan2.1_fun_camera_v1.1_1.3B", + "video_wan2.1_fun_camera_v1.1_14B", + "video_wan2_2_14B_animate", + "video_wan2_2_14B_flf2v", + "video_wan2_2_14B_fun_camera", + "video_wan2_2_14B_fun_control", + "video_wan2_2_14B_fun_inpaint", + "video_wan2_2_14B_i2v", + "video_wan2_2_14B_s2v", + "video_wan2_2_14B_t2v", + "video_wan2_2_14B_t2v (2)", + "video_wan2_2_5B_fun_control", + "video_wan2_2_5B_fun_inpaint", + "video_wan2_2_5B_ti2v", + "video_wan_ati", + "video_wan_vace_14B_ref2v", + "video_wan_vace_14B_t2v", + "video_wan_vace_14B_v2v", + "video_wan_vace_flf2v", + "video_wan_vace_inpainting", + "video_wan_vace_outpainting" + ] +} diff --git a/comfyui_workflow_templates/__init__.py b/comfyui_workflow_templates/__init__.py deleted file mode 100644 index 321452c9..00000000 --- a/comfyui_workflow_templates/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -ComfyUI Workflow Templates Package -""" - -import importlib.resources - - -def get_templates_path(): - """Return the absolute path to the templates directory""" - try: - return str( - importlib.resources.files("comfyui_workflow_templates") / "templates" - ) - except Exception as e: - print(f"Error accessing templates: {e}") - return None diff --git a/docs/publishing-workflow-templates.md b/docs/publishing-workflow-templates.md new file mode 100644 index 00000000..21dbcf79 --- /dev/null +++ b/docs/publishing-workflow-templates.md @@ -0,0 +1,92 @@ +# Publishing the Workflow Templates Packages + +This repository now produces six wheels: + +- `comfyui-workflow-templates-core` +- `comfyui-workflow-templates-media-api` +- `comfyui-workflow-templates-media-video` +- `comfyui-workflow-templates-media-image` +- `comfyui-workflow-templates-media-other` +- `comfyui-workflow-templates` (meta package that depends on all bundles) + +Publishing a package on PyPI automatically creates the project if it does not already exist. Follow this playbook each time you cut a release. + +## Prerequisites + +1. Install Python 3.12+ and `pipx` (recommended) or work inside a virtual environment. +2. Install the latest `build` and `twine`: + ```bash + pipx install build + pipx install twine + ``` + or + ```bash + python -m pip install --upgrade build twine + ``` +3. Have API tokens for **TestPyPI** and **PyPI** with the necessary permissions under the Comfy org (`project:comfyui-workflow-templates-*`). Save them somewhere secure—never commit them. +4. Optional: if you want GitHub Actions to publish automatically, set up PyPI “Trusted Publishers” for each project, then skip the manual `twine upload` step. + +## 1. Build Wheels Locally + +```bash +git checkout refactor/package-of-packages +git pull + +./scripts/bump_versions.py --dry-run # inspect what will be bumped +./scripts/bump_versions.py # apply version bumps +./run_full_validation.sh +``` + +This script regenerates the manifest, rebuilds all six wheels into `./dist/`, runs lint/tests, and performs `twine check`. + +## 2. Dry Run on TestPyPI + +1. Export the TestPyPI token (or pass with `-u __token__ -p pypi-...`): + ```bash + export TWINE_REPOSITORY=testpypi + export TWINE_USERNAME="__token__" + export TWINE_PASSWORD="pypi-" + ``` +2. Upload each wheel/sdist pair. A simple loop: + ```bash + for pkg in core media_api media_video media_image media_other meta; do + twine upload dist/comfyui_workflow_templates_${pkg}-*.whl dist/comfyui_workflow_templates_${pkg}-*.tar.gz + done + ``` + The meta package uses `_` in the wheel file name. Adjust accordingly: + ```bash + twine upload dist/comfyui_workflow_templates-*.whl dist/comfyui_workflow_templates-*.tar.gz + ``` +3. Verify on https://test.pypi.org/project/comfyui-workflow-templates-core/ (repeat for each project). Check the simple index for files. +4. Test installation from TestPyPI: + ```bash + python -m venv /tmp/testenv && source /tmp/testenv/bin/activate + python -m pip install --upgrade pip + python -m pip install --index-url https://test.pypi.org/simple --extra-index-url https://pypi.org/simple comfyui-workflow-templates + ``` + Confirm `python -c "import comfyui_workflow_templates_core; print(len(list(comfyui_workflow_templates_core.iter_templates())))"` works and assets resolve. + +## 3. Publish to PyPI + +1. Switch to production token: + ```bash + export TWINE_REPOSITORY=pypi + export TWINE_USERNAME="__token__" + export TWINE_PASSWORD="pypi-" + ``` +2. Repeat the upload loop from TestPyPI. +3. Verify on https://pypi.org/project/comfyui-workflow-templates-core/ etc. +4. Cut a GitHub Release tag (e.g., `v0.3.0`). + +## Recovery & Troubleshooting + +- **Upload interrupted:** rerun `twine upload` for the failing wheel. Already-uploaded files will be rejected; that’s OK. +- **Wrong file uploaded:** delete the release from TestPyPI via UI. For PyPI, reach out to admins; PyPI does not allow overwriting releases. +- **Missing token permissions:** ensure the token scope includes the new project names (`project:comfyui-workflow-templates-*`). PyPI tokens are project-specific. +- **Build failure:** re-run `run_full_validation.sh` to regenerate assets and confirm tests pass before uploading again. + +## GitHub Actions Publishing (Optional) + +1. In PyPI, under each project, add a Trusted Publisher for your repo (`comfy-org/workflow_templates` → `Publishing` → `Settings`). +2. Update `.github/workflows/publish.yml` to use the OIDC `pypi` publish action without storing secrets (check PyPI docs). +3. Test by triggering the workflow via `workflow_dispatch`. diff --git a/nx.json b/nx.json new file mode 100644 index 00000000..8af59dc0 --- /dev/null +++ b/nx.json @@ -0,0 +1,30 @@ +{ + "$schema": "./node_modules/nx/schemas/nx-schema.json", + "npmScope": "comfyui", + "affected": { + "defaultBase": "main" + }, + "tasksRunnerOptions": { + "default": { + "runner": "nx/tasks-runners/default", + "options": { + "cacheableOperations": ["build"] + } + } + }, + "targetDefaults": { + "build": { + "dependsOn": ["^build"], + "outputs": ["{projectRoot}/dist"] + } + }, + "projects": { + "core": "packages/core", + "media-api": "packages/media_api", + "media-video": "packages/media_video", + "media-image": "packages/media_image", + "media-other": "packages/media_other", + "meta": "packages/meta", + "tooling": "tools" + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..a985e145 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1748 @@ +{ + "name": "comfyui-workflow-templates-monorepo", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "comfyui-workflow-templates-monorepo", + "devDependencies": { + "nx": "^19.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@nrwl/tao": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.8.14.tgz", + "integrity": "sha512-zBeYzzwg43T/Z8ZtLblv0fcKuqJULttqYDekSLILThXp3UOMSerEvruhUgwddCY1jUssfLscz8vacMKISv5X4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "nx": "19.8.14", + "tslib": "^2.3.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.14.tgz", + "integrity": "sha512-bZUFf23gAzuwVw71dR8rngye5aCR8Z/ouIo+KayjqB0LWWoi3WzO73s4S69ljftYt4n6z9wvD+Trbb1BKm2fPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.14.tgz", + "integrity": "sha512-UXXVea8icFG/3rFwpbLYsD6O4wlyJ1STQfOdhGK1Hyuga70AUUdrjVm7HzigAQP/Sb2Nzd7155YXHzfpRPDFYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.14.tgz", + "integrity": "sha512-TK2xuXn+BI6hxGaRK1HRUPWeF/nOtezKSqM+6rbippfCzjES/crmp9l5nbI764MMthtUmykCyWvhEfkDca6kbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.14.tgz", + "integrity": "sha512-33rptyRraqaeQ2Kq6pcZKQqgnYY/7zcGH8fHXgKK7XzKk+7QuPViq+jMEUZP5E3UzZPkIYhsfmZcZqhNRvepJQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.14.tgz", + "integrity": "sha512-2E70qMKOhh7Fp4JGcRbRLvFKq0+ANVdAgSzH47plxOLygIeVAfIXRSuQbCI0EUFa5Sy6hImLaoRSB2GdgKihAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.14.tgz", + "integrity": "sha512-ltty/PDWqkYgu/6Ye65d7v5nh3D6e0n3SacoKRs2Vtfz5oHYRUkSKizKIhEVfRNuHn3d9j8ve1fdcCN4SDPUBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.14.tgz", + "integrity": "sha512-JzE3BuO9RCBVdgai18CCze6KUzG0AozE0TtYFxRokfSC05NU3nUhd/o62UsOl7s6Bqt/9nwrW7JC8pNDiCi9OQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.14.tgz", + "integrity": "sha512-2rPvDOQLb7Wd6YiU88FMBiLtYco0dVXF99IJBRGAWv+WTI7MNr47OyK2ze+JOsbYY1d8aOGUvckUvCCZvZKEfg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.14.tgz", + "integrity": "sha512-JxW+YPS+EjhUsLw9C6wtk9pQTG3psyFwxhab8y/dgk2s4AOTLyIm0XxgcCJVvB6i4uv+s1g0QXRwp6+q3IR6hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.14.tgz", + "integrity": "sha512-RxiPlBWPcGSf9TzIIy62iKRdRhokXMDUsPub9DL2VdVyTMXPZQR25aY/PJeasJN1EQU74hg097LK2wSHi+vzOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", + "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lines-and-columns": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx": { + "version": "19.8.14", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.8.14.tgz", + "integrity": "sha512-yprBOWV16eQntz5h5SShYHMVeN50fUb6yHfzsqNiFneCJeyVjyJ585m+2TuVbE11vT1amU0xCjHcSGfJBBnm8g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.8.14", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "19.8.14", + "@nx/nx-darwin-x64": "19.8.14", + "@nx/nx-freebsd-x64": "19.8.14", + "@nx/nx-linux-arm-gnueabihf": "19.8.14", + "@nx/nx-linux-arm64-gnu": "19.8.14", + "@nx/nx-linux-arm64-musl": "19.8.14", + "@nx/nx-linux-x64-gnu": "19.8.14", + "@nx/nx-linux-x64-musl": "19.8.14", + "@nx/nx-win32-arm64-msvc": "19.8.14", + "@nx/nx-win32-x64-msvc": "19.8.14" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..a4ed7096 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "comfyui-workflow-templates-monorepo", + "private": true, + "devDependencies": { + "nx": "^19.0.0" + }, + "scripts": { + "graph": "NX_ADD_PLUGINS=false NX_DAEMON=false npx nx graph --watch=false --open=false", + "sync": "NX_ADD_PLUGINS=false NX_DAEMON=false npx nx run tooling:sync --skip-nx-cache", + "build:all": "NX_ADD_PLUGINS=false NX_DAEMON=false npx nx run-many --target build --skip-nx-cache" + } +} diff --git a/packages/core/project.json b/packages/core/project.json new file mode 100644 index 00000000..01547774 --- /dev/null +++ b/packages/core/project.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://raw.githubusercontent.com/nrwl/nx/master/packages/nx/schemas/project-schema.json", + "name": "core", + "projectType": "library", + "sourceRoot": "packages/core/src", + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "cwd": "packages/core", + "command": "python3 -m build" + }, + "dependsOn": [ + { + "projects": "tooling", + "target": "sync" + } + ] + } + }, + "tags": [] +} diff --git a/packages/core/pyproject.toml b/packages/core/pyproject.toml new file mode 100644 index 00000000..c08daf21 --- /dev/null +++ b/packages/core/pyproject.toml @@ -0,0 +1,17 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "comfyui-workflow-templates-core" +version = "0.3.1" +description = "Core helpers for ComfyUI workflow templates" +readme = {text = "Core helpers for ComfyUI workflow templates.", content-type = "text/plain"} +requires-python = ">=3.9" +license = "MIT" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +comfyui_workflow_templates_core = ["manifest.json"] diff --git a/packages/core/src/comfyui_workflow_templates_core/__init__.py b/packages/core/src/comfyui_workflow_templates_core/__init__.py new file mode 100644 index 00000000..cf5c75ab --- /dev/null +++ b/packages/core/src/comfyui_workflow_templates_core/__init__.py @@ -0,0 +1,25 @@ +""" +Core runtime helpers for ComfyUI workflow templates. + +This package is responsible for loading the manifest, resolving asset +paths across media bundles, and exposing metadata that higher-level +packages (e.g., the meta wrapper or ComfyUI itself) can consume. +""" + +from .loader import ( + get_asset_path, + get_template_entry, + iter_assets, + iter_templates, + load_manifest, + resolve_all_assets, +) + +__all__ = [ + "get_asset_path", + "get_template_entry", + "iter_assets", + "iter_templates", + "load_manifest", + "resolve_all_assets", +] diff --git a/packages/core/src/comfyui_workflow_templates_core/loader.py b/packages/core/src/comfyui_workflow_templates_core/loader.py new file mode 100644 index 00000000..e02f7062 --- /dev/null +++ b/packages/core/src/comfyui_workflow_templates_core/loader.py @@ -0,0 +1,129 @@ +""" +Manifest loader and asset resolution helpers. + +The manifest is generated during the build step and embedded as package +data in `comfyui_workflow_templates_core`. Each media bundle exposes its +assets under a namespace package (e.g., `comfyui_workflow_templates_media_api`). +""" + +from __future__ import annotations + +import json +from dataclasses import dataclass +from functools import lru_cache +from importlib import resources +from typing import Dict, Iterable, Iterator, List, Tuple + +MANIFEST_RESOURCE = "manifest.json" + +BUNDLE_PACKAGE_MAP = { + "media-api": "comfyui_workflow_templates_media_api", + "media-video": "comfyui_workflow_templates_media_video", + "media-image": "comfyui_workflow_templates_media_image", + "media-other": "comfyui_workflow_templates_media_other", +} + + +@dataclass(frozen=True) +class TemplateAsset: + filename: str + sha256: str + + +@dataclass(frozen=True) +class TemplateEntry: + template_id: str + bundle: str + version: str + assets: List[TemplateAsset] + + +@dataclass(frozen=True) +class Manifest: + manifest_version: int + bundles: Dict[str, Dict[str, str]] + templates: Dict[str, TemplateEntry] + + +def _parse_manifest(payload: str) -> Manifest: + raw = json.loads(payload) + templates: Dict[str, TemplateEntry] = {} + for entry in raw.get("templates", []): + assets = [ + TemplateAsset(a["filename"], a["sha256"]) + for a in entry.get("assets", []) + ] + templates[entry["id"]] = TemplateEntry( + template_id=entry["id"], + bundle=entry["bundle"], + version=entry.get("version", ""), + assets=assets, + ) + return Manifest( + manifest_version=raw.get("manifest_version", 1), + bundles=raw.get("bundles", {}), + templates=templates, + ) + + +@lru_cache(maxsize=1) +def load_manifest() -> Manifest: + """Load and cache the manifest from package data.""" + data = resources.files(__package__).joinpath(MANIFEST_RESOURCE).read_text() + return _parse_manifest(data) + + +def iter_templates() -> Iterable[TemplateEntry]: + """Iterate over all template entries.""" + return load_manifest().templates.values() + + +def get_template_entry(template_id: str) -> TemplateEntry: + """Return manifest entry for the given template id.""" + try: + return load_manifest().templates[template_id] + except KeyError as exc: + raise KeyError(f"Template '{template_id}' not found in manifest") from exc + + +def _bundle_package(bundle_name: str) -> str: + try: + return BUNDLE_PACKAGE_MAP[bundle_name] + except KeyError as exc: + raise KeyError(f"No package mapping defined for bundle '{bundle_name}'") from exc + + +def get_asset_path(template_id: str, filename: str) -> str: + """ + Resolve the absolute path for an asset belonging to `template_id`. + + Raises: + FileNotFoundError: if the bundle package or asset is missing. + """ + entry = get_template_entry(template_id) + package_name = _bundle_package(entry.bundle) + try: + package_files = resources.files(package_name) + except ModuleNotFoundError as exc: + raise FileNotFoundError( + f"Media package '{package_name}' is not installed for bundle '{entry.bundle}'" + ) from exc + asset = package_files / "templates" / filename + if not asset.exists(): + raise FileNotFoundError( + f"Asset '{filename}' for template '{template_id}' not found in package '{package_name}'" + ) + return str(asset) + + +def resolve_all_assets(template_id: str) -> List[str]: + """Return absolute paths for every asset declared for the template.""" + entry = get_template_entry(template_id) + return [get_asset_path(template_id, asset.filename) for asset in entry.assets] + + +def iter_assets() -> Iterator[Tuple[str, str]]: + """Yield tuples of (relative_filename, absolute_path) for every asset.""" + for entry in iter_templates(): + for asset in entry.assets: + yield asset.filename, get_asset_path(entry.template_id, asset.filename) diff --git a/packages/core/src/comfyui_workflow_templates_core/manifest.json b/packages/core/src/comfyui_workflow_templates_core/manifest.json new file mode 100644 index 00000000..fb3b458b --- /dev/null +++ b/packages/core/src/comfyui_workflow_templates_core/manifest.json @@ -0,0 +1,3687 @@ +{ + "manifest_version": 1, + "bundles": { + "media-api": { + "version": "0.0.0" + }, + "media-video": { + "version": "0.0.0" + }, + "media-image": { + "version": "0.0.0" + }, + "media-other": { + "version": "0.0.0" + } + }, + "templates": [ + { + "id": "api_bfl_flux_1_kontext_max_image", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_bfl_flux_1_kontext_max_image.json", + "sha256": "86190cff9c93a0b56522ce6080e61f294943eb76d37ff51425236a4f9764a97b" + }, + { + "filename": "api_bfl_flux_1_kontext_max_image-1.webp", + "sha256": "6e879c02a3af39b81cb9d425b9958f1d0c56a1a178f8c671db47610748bbd8e0" + }, + { + "filename": "api_bfl_flux_1_kontext_max_image-2.webp", + "sha256": "72cce6225a35b2bb400e6060a3fd10e0646ae97ac5417e6a426cf2b94bbfb9b5" + } + ], + "cdn": { + "path": "media-api/api_bfl_flux_1_kontext_max_image/" + } + }, + { + "id": "api_bfl_flux_1_kontext_multiple_images_input", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_bfl_flux_1_kontext_multiple_images_input.json", + "sha256": "3fc1b1e2827b285bacf55eb1ccc2ea02d4e4886b0bb07af198f3f1a596848950" + }, + { + "filename": "api_bfl_flux_1_kontext_multiple_images_input-1.webp", + "sha256": "c0c7f8aeafe977a0b06428343dc58395f610b0566f903634b27584fc2ec79658" + }, + { + "filename": "api_bfl_flux_1_kontext_multiple_images_input-2.webp", + "sha256": "98bafffb88a8de5e54c3bfa2b578cb1c30ecf80e629974742d1b3e58610ab347" + } + ], + "cdn": { + "path": "media-api/api_bfl_flux_1_kontext_multiple_images_input/" + } + }, + { + "id": "api_bfl_flux_1_kontext_pro_image", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_bfl_flux_1_kontext_pro_image.json", + "sha256": "af64352c8a879fbfa908291818a0d7d40120d4fd4e0eea2bb1132edf1f4e5ea1" + }, + { + "filename": "api_bfl_flux_1_kontext_pro_image-1.webp", + "sha256": "84459290330a08cfc7e1f2fbd3ac2b567bfd47565a9671c3473d18a4aa60d9ee" + }, + { + "filename": "api_bfl_flux_1_kontext_pro_image-2.webp", + "sha256": "82a8671132a012eece36dccc82daece46ff336564c23241236169a8e4b2b02fd" + } + ], + "cdn": { + "path": "media-api/api_bfl_flux_1_kontext_pro_image/" + } + }, + { + "id": "api_bfl_flux_pro_t2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_bfl_flux_pro_t2i.json", + "sha256": "a28501bd7c14eb129f56dfd7b69e258ffebdca7500772fc52ceed60345276579" + }, + { + "filename": "api_bfl_flux_pro_t2i-1.webp", + "sha256": "b0ededc3e134e19ad3c01be65d6bb32ad205f6bce34b7d73236e56ddbce518d6" + } + ], + "cdn": { + "path": "media-api/api_bfl_flux_pro_t2i/" + } + }, + { + "id": "api_bytedance_flf2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_bytedance_flf2v.json", + "sha256": "5c442870c8c24f8794b8186b7c91a4bb02ea49c02818dcada8012eff6f9fd4d7" + }, + { + "filename": "api_bytedance_flf2v-1.webp", + "sha256": "5daa2567214babafa6575c0ddbeb267f0533b357f157e6ba3bea5b5d3a7fa736" + } + ], + "cdn": { + "path": "media-api/api_bytedance_flf2v/" + } + }, + { + "id": "api_bytedance_image_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_bytedance_image_to_video.json", + "sha256": "775a8b658a5910fad12062574f0e92877ac2b8efffe4ab041bb46d05ec21fa19" + }, + { + "filename": "api_bytedance_image_to_video-1.webp", + "sha256": "76f8e106d571a08bb1f2f9feff35463a7d1b8f254bcd896d27b2af31a036519c" + } + ], + "cdn": { + "path": "media-api/api_bytedance_image_to_video/" + } + }, + { + "id": "api_bytedance_seedream4", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_bytedance_seedream4.json", + "sha256": "c3f171a94dfeabaf3fef0c3a5aa66505849330f7fd160883236796c4b53e3ca3" + }, + { + "filename": "api_bytedance_seedream4-1.webp", + "sha256": "c28649c8009fd1c8f448e87b77287fcae5a290a7711065fae92fd4374ab686a8" + } + ], + "cdn": { + "path": "media-api/api_bytedance_seedream4/" + } + }, + { + "id": "api_bytedance_text_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_bytedance_text_to_video.json", + "sha256": "05d0c2e61d0fb4542e098c5464544530199a314add7bfbb06211c12d69324e0e" + }, + { + "filename": "api_bytedance_text_to_video-1.webp", + "sha256": "6699e3e3396447c53039d2db9878e73bf18dedcc3dd4317bdc62c9bf59b85673" + } + ], + "cdn": { + "path": "media-api/api_bytedance_text_to_video/" + } + }, + { + "id": "api_google_gemini", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_google_gemini.json", + "sha256": "70ec8cbbe6df9bf1dc97b52422b174722224c3a6dfd865ecf8f3d358018f963b" + }, + { + "filename": "api_google_gemini-1.webp", + "sha256": "afb510574ebef1a98896f0318599984448e48aa8cd1652ee0c0551efb355420f" + }, + { + "filename": "api_google_gemini_image-1.webp", + "sha256": "9f9b5021ae1ea13ae8c14cc1091a494ad78b616bf15d3d7687df0a9b3996089a" + } + ], + "cdn": { + "path": "media-api/api_google_gemini/" + } + }, + { + "id": "api_google_gemini_image", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_google_gemini_image.json", + "sha256": "8c7d7388d80d55bcd5ef80f245157f0b9b3d5444a96f86bc73376cea963fdbbd" + }, + { + "filename": "api_google_gemini_image-1.webp", + "sha256": "9f9b5021ae1ea13ae8c14cc1091a494ad78b616bf15d3d7687df0a9b3996089a" + } + ], + "cdn": { + "path": "media-api/api_google_gemini_image/" + } + }, + { + "id": "api_hailuo_minimax_i2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_hailuo_minimax_i2v.json", + "sha256": "707285d99f3256361106b5da4ecee564a7cddc0234420865516f01c4af2531c2" + }, + { + "filename": "api_hailuo_minimax_i2v-1.webp", + "sha256": "07b9f6ae372aa8bc811f9f4615e500d5d15355847b4acc46ef55b6374bb86836" + } + ], + "cdn": { + "path": "media-api/api_hailuo_minimax_i2v/" + } + }, + { + "id": "api_hailuo_minimax_t2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_hailuo_minimax_t2v.json", + "sha256": "2253223a15fc817ef89b9eabbf92cbd29b68928adfa1f3e1a8c33d18de80e3df" + }, + { + "filename": "api_hailuo_minimax_t2v-1.webp", + "sha256": "953a9729e096e3dcb4967d874f24c1776319a2bce0cb7cc9431a0068127ac127" + } + ], + "cdn": { + "path": "media-api/api_hailuo_minimax_t2v/" + } + }, + { + "id": "api_hailuo_minimax_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_hailuo_minimax_video.json", + "sha256": "024d9a372ca69549401875803c4f5bbc1242466bdacf1749cae60ba08c1fac88" + }, + { + "filename": "api_hailuo_minimax_video-1.webp", + "sha256": "57b7d832b74e47ecf8054dcbbf2abfa2617c3e2b9c679770c0ef5fed40699de4" + } + ], + "cdn": { + "path": "media-api/api_hailuo_minimax_video/" + } + }, + { + "id": "api_ideogram_v3_t2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_ideogram_v3_t2i.json", + "sha256": "479f6eed8ad1380e704c77624dc69d205da253dfc51e96654a6e7974db4f155e" + }, + { + "filename": "api_ideogram_v3_t2i-1.webp", + "sha256": "c3461112f9f18e220f2e8c00d390366084fb73f448c64b083bc5feaf4ac63836" + } + ], + "cdn": { + "path": "media-api/api_ideogram_v3_t2i/" + } + }, + { + "id": "api_kling_effects", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_kling_effects.json", + "sha256": "3609634a1d0c1d0535e10c2fadce7535d60c180bece1af54994e9253679a011d" + }, + { + "filename": "api_kling_effects-1.webp", + "sha256": "e337801ee2e42c586a42a649df85a05b2b89d2c481f48e94ba3c28c7493fe036" + } + ], + "cdn": { + "path": "media-api/api_kling_effects/" + } + }, + { + "id": "api_kling_flf", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_kling_flf.json", + "sha256": "03da38429ce020ddbb4a239e72bafc1cb11f21be3b4343ee3f3c6d8c773f7120" + }, + { + "filename": "api_kling_flf-1.webp", + "sha256": "a93011048c1ebbfd423119a305746b52171e9f3523721f854f180d726499b548" + } + ], + "cdn": { + "path": "media-api/api_kling_flf/" + } + }, + { + "id": "api_kling_i2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_kling_i2v.json", + "sha256": "47c8c50d20f0c9ffeef22010a0022b4ca2f407e7b70ae6865d7dbf3de8e4ca92" + }, + { + "filename": "api_kling_i2v-1.webp", + "sha256": "d59912dc58f7eedc91818942fa59436cc34d77eabe9e1a078e97e9526384f0e1" + } + ], + "cdn": { + "path": "media-api/api_kling_i2v/" + } + }, + { + "id": "api_ltxv_image_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_ltxv_image_to_video.json", + "sha256": "b6b60d5a2d1306f66390f49f445880c2dd40b6eae36a9fb744fa976527cab708" + }, + { + "filename": "api_ltxv_image_to_video-1.webp", + "sha256": "ef5df50edf2e1d5e9e5c1e4bc2e311f3973fa0d09676f53c68bced781fcbe330" + } + ], + "cdn": { + "path": "media-api/api_ltxv_image_to_video/" + } + }, + { + "id": "api_ltxv_text_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_ltxv_text_to_video.json", + "sha256": "0a32f1512e34904c8af32e86665779b5abc6cc06ba41b79932eed6f924daac5d" + }, + { + "filename": "api_ltxv_text_to_video-1.webp", + "sha256": "e04c1a3c427aefe6bf183c43c344f6051b5e9a1503e83c8207377f3826087ea7" + } + ], + "cdn": { + "path": "media-api/api_ltxv_text_to_video/" + } + }, + { + "id": "api_luma_i2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_luma_i2v.json", + "sha256": "9c6ccb491ad5334c3dbdc9b110b7fa1b54f683ec477e37f9c58e348d1aac6e07" + }, + { + "filename": "api_luma_i2v-1.webp", + "sha256": "e4d981fa4e3f5359375de871b60d1e81fa46e51531add655b66ef4b8f84503fa" + } + ], + "cdn": { + "path": "media-api/api_luma_i2v/" + } + }, + { + "id": "api_luma_photon_i2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_luma_photon_i2i.json", + "sha256": "10cfe33c7e7f0f6f7effdfeae3a7bf654fb61590b1af989914b6690093407554" + }, + { + "filename": "api_luma_photon_i2i-1.webp", + "sha256": "a628c870e01e41bce975d794bafd878980d1c63b1a09d5c59578357995ad46dc" + }, + { + "filename": "api_luma_photon_i2i-2.webp", + "sha256": "cc16b8cd0ccf969c21524fab887bbaa0d895faddec73a12363aabb70a720f705" + } + ], + "cdn": { + "path": "media-api/api_luma_photon_i2i/" + } + }, + { + "id": "api_luma_photon_style_ref", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_luma_photon_style_ref.json", + "sha256": "528d6ed309255b855f8d480e3980c0fb3b0f223de818b9fdc078e5354c07d306" + }, + { + "filename": "api_luma_photon_style_ref-1.webp", + "sha256": "dbd93c55856445913a18b464ad8e464ca594c3009ea79dc511429ad4a8bdc2a6" + }, + { + "filename": "api_luma_photon_style_ref-2.webp", + "sha256": "442feb10a730cf5e41c5b78a6278af86ddc8ba17f79d283429c1c512e98831a9" + } + ], + "cdn": { + "path": "media-api/api_luma_photon_style_ref/" + } + }, + { + "id": "api_luma_t2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_luma_t2v.json", + "sha256": "06c42e234442f5cb23c5eccf677dd4081a026e2375cca956107b6f3af5a63085" + }, + { + "filename": "api_luma_t2v-1.webp", + "sha256": "b7a70af0a918c1f3ea9fb4c8216363fa2bf0f91b66509f2e2d27dbfb53f2ddbd" + } + ], + "cdn": { + "path": "media-api/api_luma_t2v/" + } + }, + { + "id": "api_moonvalley_image_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_moonvalley_image_to_video.json", + "sha256": "256673bfb50b05467ad899f825d5dbcf4e69cbfb6992b054259cfafd2d48bd1d" + }, + { + "filename": "api_moonvalley_image_to_video-1.webp", + "sha256": "c5fbaa270eae67729d596db8ef1faea41b01a8b5c722918807a39c361ab1bcfb" + } + ], + "cdn": { + "path": "media-api/api_moonvalley_image_to_video/" + } + }, + { + "id": "api_moonvalley_text_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_moonvalley_text_to_video.json", + "sha256": "6cabfd93b59e22b9cde4c7021fbf930cfde76b7c082dd7703a08886a20d861d1" + }, + { + "filename": "api_moonvalley_text_to_video-1.webp", + "sha256": "9fdfc71ad07f9f911a40e4bfda693dc53331c0f133233789203909336396d7d3" + } + ], + "cdn": { + "path": "media-api/api_moonvalley_text_to_video/" + } + }, + { + "id": "api_moonvalley_video_to_video_motion_transfer", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_moonvalley_video_to_video_motion_transfer.json", + "sha256": "fcb32400ef6525abe15be17c05005b925a9d7ac9e9a75bbc6188cbff4b3e5e40" + }, + { + "filename": "api_moonvalley_video_to_video_motion_transfer-1.webp", + "sha256": "2b6fcd11d57fcfceadff36b6ee5bd0e746e26bdd763a7caf1ddc0619afdd27ca" + }, + { + "filename": "api_moonvalley_video_to_video_motion_transfer-2.webp", + "sha256": "3175f464ce645ecb063a0ad3aa8c3dfe0aa7e8a468f598e077d0799c3a7ceaa7" + } + ], + "cdn": { + "path": "media-api/api_moonvalley_video_to_video_motion_transfer/" + } + }, + { + "id": "api_moonvalley_video_to_video_pose_control", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_moonvalley_video_to_video_pose_control.json", + "sha256": "677717190ade0b1f8a1514cfe2db96184cf5b217d352f6e35917fbb7eaea4eab" + }, + { + "filename": "api_moonvalley_video_to_video_pose_control-1.webp", + "sha256": "1531217e5ae8e31192d5146eed7bce88522332789f2db22ca3310517300685a8" + }, + { + "filename": "api_moonvalley_video_to_video_pose_control-2.webp", + "sha256": "27412a2fc91746e9cac91651b4dff664c5b1c89d581edc563bf718c2b77a50ea" + } + ], + "cdn": { + "path": "media-api/api_moonvalley_video_to_video_pose_control/" + } + }, + { + "id": "api_openai_chat", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_openai_chat.json", + "sha256": "77a9894a1b052edf6aaaa566de7aaabfb067a19a12b81f1e407099334b3fdb6e" + }, + { + "filename": "api_openai_chat-1.webp", + "sha256": "d5aa743962941c7a4a42d6c6ab6c9175485eb9896a808b1b5989495a44b31a9e" + } + ], + "cdn": { + "path": "media-api/api_openai_chat/" + } + }, + { + "id": "api_openai_dall_e_2_inpaint", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_openai_dall_e_2_inpaint.json", + "sha256": "fc90793e414f8c181869425076d78891e71e1257e6d173bf9d34b11d7fc2f087" + }, + { + "filename": "api_openai_dall_e_2_inpaint-1.webp", + "sha256": "b0c0134156fe22b87a5a2a07a455442593ce067e72c3e1ed754bd224f9663a6d" + }, + { + "filename": "api_openai_dall_e_2_inpaint-2.webp", + "sha256": "81590695862a9ee42eb1536e4909edeb9f631831607ba29ff84fe7bd0e3931e1" + } + ], + "cdn": { + "path": "media-api/api_openai_dall_e_2_inpaint/" + } + }, + { + "id": "api_openai_dall_e_2_t2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_openai_dall_e_2_t2i.json", + "sha256": "7687dceb8b903e1a1ebdaf7d6aededdabe19c304a46b8b4144a613c2770f64e6" + }, + { + "filename": "api_openai_dall_e_2_t2i-1.webp", + "sha256": "ffc527688ea56c1fa6cccd8c52a336b81de39727a4f39af6aebb93a853a8881c" + } + ], + "cdn": { + "path": "media-api/api_openai_dall_e_2_t2i/" + } + }, + { + "id": "api_openai_dall_e_3_t2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_openai_dall_e_3_t2i.json", + "sha256": "df33199925bc400b0cd5a8fff8c5d6838b1e7125b984d3fc04915702dbb11cb8" + }, + { + "filename": "api_openai_dall_e_3_t2i-1.webp", + "sha256": "cc12b553d390ef922128d5a9a13bc83b0dda287ca7ed1f8f515572c5365108bf" + } + ], + "cdn": { + "path": "media-api/api_openai_dall_e_3_t2i/" + } + }, + { + "id": "api_openai_image_1_i2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_openai_image_1_i2i.json", + "sha256": "2d0c09653577740c7ab3685a644fbbfd21f857272f9af8b72771a66b4ae99f27" + }, + { + "filename": "api_openai_image_1_i2i-1.webp", + "sha256": "30f96dc3d9632c517e4bb17677306f9a0940733fd91c4b1cee9fbe70f725b8af" + }, + { + "filename": "api_openai_image_1_i2i-2.webp", + "sha256": "6d84a0c9f3e0763f7a25446b9ee80c4cd7a6c8f10d238417065b59cbace5bfb8" + } + ], + "cdn": { + "path": "media-api/api_openai_image_1_i2i/" + } + }, + { + "id": "api_openai_image_1_inpaint", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_openai_image_1_inpaint.json", + "sha256": "87e80da8fd52417441c2535806a39f513293f727e4ce5097e98e6011f3fa255f" + }, + { + "filename": "api_openai_image_1_inpaint-1.webp", + "sha256": "d856c2f9be1d3dd165414172699ae96e6363c614355dbbea25a0ba7addf139cf" + }, + { + "filename": "api_openai_image_1_inpaint-2.webp", + "sha256": "0f4f482482b795a454b9a250301c900639990a20ab7d27689ec36cb7aa4fbba3" + } + ], + "cdn": { + "path": "media-api/api_openai_image_1_inpaint/" + } + }, + { + "id": "api_openai_image_1_multi_inputs", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_openai_image_1_multi_inputs.json", + "sha256": "37c51ff1946c27ccef29929fd218a367ad84abb278e92b321ae8bcd4db2a7ab3" + }, + { + "filename": "api_openai_image_1_multi_inputs-1.webp", + "sha256": "24adf44cb9a88e3b26127867e23f5b0f414b94e426efa59d3cc7009f665db754" + }, + { + "filename": "api_openai_image_1_multi_inputs-2.webp", + "sha256": "077138caad3f314e4fa5a69fdd52f2792e988ce4989dbe5bb368751e60d71bd5" + } + ], + "cdn": { + "path": "media-api/api_openai_image_1_multi_inputs/" + } + }, + { + "id": "api_openai_image_1_t2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_openai_image_1_t2i.json", + "sha256": "7138ab1a3202b027816534dcebba955d63b314b7df2bf08fbce64fead8a77974" + }, + { + "filename": "api_openai_image_1_t2i-1.webp", + "sha256": "1739fdd3a11467852323cbe5bdbe1c202070b3f7b7bf3dcf99df32c4f0f18a28" + } + ], + "cdn": { + "path": "media-api/api_openai_image_1_t2i/" + } + }, + { + "id": "api_openai_sora_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_openai_sora_video.json", + "sha256": "28ef82622aa71c7b1031bd2e4f44d5bfcdcafc49810fdcaa761df99a08a80d91" + }, + { + "filename": "api_openai_sora_video-1.webp", + "sha256": "2f2588332ab107a1abc0ce8611485fa2417613703c114dcdc609f663e5c9a053" + } + ], + "cdn": { + "path": "media-api/api_openai_sora_video/" + } + }, + { + "id": "api_pika_i2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_pika_i2v.json", + "sha256": "f9561d1541ee71b2a4cbee8b3026d2f1203599308bbd33e9650b528fdfacd3c9" + }, + { + "filename": "api_pika_i2v-1.webp", + "sha256": "6172f52fbbf79a28e49b08ee92bee2804ed697e7537ef1ef805662a04102c8df" + } + ], + "cdn": { + "path": "media-api/api_pika_i2v/" + } + }, + { + "id": "api_pika_scene", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_pika_scene.json", + "sha256": "a1a841c227a144bde29eaf8a336d1204b808d9141c0fc0400cdc69c6d67f2656" + }, + { + "filename": "api_pika_scene-1.webp", + "sha256": "d78f159c3496f2c17e25a428c063c601feb9dacb6a50d407665b3b2381f56e3a" + } + ], + "cdn": { + "path": "media-api/api_pika_scene/" + } + }, + { + "id": "api_pixverse_i2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_pixverse_i2v.json", + "sha256": "9520460fd4c62c114e06089b3be081c96d10b34442823b3d26534f2a2ea8631e" + }, + { + "filename": "api_pixverse_i2v-1.webp", + "sha256": "b4a8a8baf4538db626807f52e27900707efc71336a8664fd3cdcb826ec4293e7" + } + ], + "cdn": { + "path": "media-api/api_pixverse_i2v/" + } + }, + { + "id": "api_pixverse_t2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_pixverse_t2v.json", + "sha256": "c947a32e8793e161449343e8babdd755380ad0423052e475cbfb5bd7654bc96f" + }, + { + "filename": "api_pixverse_t2v-1.webp", + "sha256": "0271fefe810a5467c20c666d6697cdfd83a74e80f00878a421fbabc74bc0e51d" + } + ], + "cdn": { + "path": "media-api/api_pixverse_t2v/" + } + }, + { + "id": "api_pixverse_template_i2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_pixverse_template_i2v.json", + "sha256": "7683f2a989bdb22a2780125d7692ffdddcd2ce251801e250fbfdd9577d58d579" + }, + { + "filename": "api_pixverse_template_i2v-1.webp", + "sha256": "1af83c7fcb60b49af13204c4bc93a271108f11ad02c1e25902006cdd852fc4cd" + } + ], + "cdn": { + "path": "media-api/api_pixverse_template_i2v/" + } + }, + { + "id": "api_recraft_image_gen_with_color_control", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_recraft_image_gen_with_color_control.json", + "sha256": "9a540a60c88294746faaf4759d4b53e4b6c4d805d30c1960a2a4618246babeac" + }, + { + "filename": "api_recraft_image_gen_with_color_control-1.webp", + "sha256": "9392cab6b5acf7245dc8463d1be8a20b749eccb50b1a646b251c253fa08ab291" + } + ], + "cdn": { + "path": "media-api/api_recraft_image_gen_with_color_control/" + } + }, + { + "id": "api_recraft_image_gen_with_style_control", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_recraft_image_gen_with_style_control.json", + "sha256": "04e00c9c0c0cdaa26209036c279caf7c125b71e939a647dc440a5b1804c481ca" + }, + { + "filename": "api_recraft_image_gen_with_style_control-1.webp", + "sha256": "3748343ddf9b156953e53563bebe54697bfd58dae89a247d601bc3bfe73764c7" + } + ], + "cdn": { + "path": "media-api/api_recraft_image_gen_with_style_control/" + } + }, + { + "id": "api_recraft_vector_gen", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_recraft_vector_gen.json", + "sha256": "ffdc082b7ad2c751d6042128f6bdbc687502dcb5049534429f457bd5a0902fc0" + }, + { + "filename": "api_recraft_vector_gen-1.webp", + "sha256": "b4141bb96f5c4278d1cda70d5cbc068efc65bc8772ed4401a923bd6a86fa4ac1" + } + ], + "cdn": { + "path": "media-api/api_recraft_vector_gen/" + } + }, + { + "id": "api_rodin_gen2", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_rodin_gen2.json", + "sha256": "912783c5e381755ca90c50f16601476b9181207414d68f7ed361f425b6f2dcf5" + }, + { + "filename": "api_rodin_gen2-1.webp", + "sha256": "0cc962f68d7ee308dd7ccd9bd76eb6bf1bcf647f4f9e0bfe4d2ad0b204098eb0" + } + ], + "cdn": { + "path": "media-api/api_rodin_gen2/" + } + }, + { + "id": "api_rodin_image_to_model", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_rodin_image_to_model.json", + "sha256": "94543e28844ac80a4d75be2a502c87125978d77b28892e574c5bb4c51e7a1c68" + }, + { + "filename": "api_rodin_image_to_model-1.webp", + "sha256": "3e0617574cf818395b0d070e4b5ffcf9a99fcb2b802c0bc03d7cb863c7ff54a4" + } + ], + "cdn": { + "path": "media-api/api_rodin_image_to_model/" + } + }, + { + "id": "api_rodin_multiview_to_model", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_rodin_multiview_to_model.json", + "sha256": "76dc0426c9af65e0f5377adb35dbb1e1166f96dc27bf0b758ca13c0caea012fa" + }, + { + "filename": "api_rodin_multiview_to_model-1.webp", + "sha256": "a5fe5c7afc99dd738cedf2e3d479aff101482a88148d140dd16e949edcb08285" + } + ], + "cdn": { + "path": "media-api/api_rodin_multiview_to_model/" + } + }, + { + "id": "api_runway_first_last_frame", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_runway_first_last_frame.json", + "sha256": "c49ab37cea705b0a93526f397db7306c1a7da413b2a2808820d968c8390a486c" + }, + { + "filename": "api_runway_first_last_frame-1.webp", + "sha256": "39de752799ace93746144d75e4ce9346f622310162112db1c396477b0264a411" + } + ], + "cdn": { + "path": "media-api/api_runway_first_last_frame/" + } + }, + { + "id": "api_runway_gen3a_turbo_image_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_runway_gen3a_turbo_image_to_video.json", + "sha256": "395b782602946532d525e4669244c8de9829c48c7564fe6cfd351f6ae69cc64d" + }, + { + "filename": "api_runway_gen3a_turbo_image_to_video-1.webp", + "sha256": "9aedf81d0eb88867a128631f8106279944d34d1569c57cdb3cade30066a27743" + } + ], + "cdn": { + "path": "media-api/api_runway_gen3a_turbo_image_to_video/" + } + }, + { + "id": "api_runway_gen4_turo_image_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_runway_gen4_turo_image_to_video.json", + "sha256": "c5ee7ba7e6c3e7ac8e4f41f9518d29ea0691d68d24901350a80d9fd954b27a36" + }, + { + "filename": "api_runway_gen4_turo_image_to_video-1.webp", + "sha256": "e7b9787f64df8038eeab89b6963e5fb9923b829e1846212d77d98cb114866cd4" + } + ], + "cdn": { + "path": "media-api/api_runway_gen4_turo_image_to_video/" + } + }, + { + "id": "api_runway_reference_to_image", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_runway_reference_to_image.json", + "sha256": "b208aff59940d1b26ae3c63f87eca236e7ac1786bbddb922f3a0da14d02ccec3" + }, + { + "filename": "api_runway_reference_to_image-1.webp", + "sha256": "799b9e753cc418c73139bc69ce824c3900325a6114a80a40a511d3e8a925d27c" + }, + { + "filename": "api_runway_reference_to_image-2.webp", + "sha256": "04b99d7f03e468f1bc812813ce7ded38b7f441b731249ae44808c67953224c92" + } + ], + "cdn": { + "path": "media-api/api_runway_reference_to_image/" + } + }, + { + "id": "api_runway_text_to_image", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_runway_text_to_image.json", + "sha256": "2f815aff2977c041eec0bbb32ce34d024f38e80d8cf592d3de4ab6fa1c036600" + }, + { + "filename": "api_runway_text_to_image-1.webp", + "sha256": "7ae453dc03ab18e88668ec36431202903df8ef505a983f613bc1820e6f4b17db" + } + ], + "cdn": { + "path": "media-api/api_runway_text_to_image/" + } + }, + { + "id": "api_stability_ai_audio_inpaint", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_stability_ai_audio_inpaint.json", + "sha256": "9f6aa533590cc2637c7c28dd3389f23500d7dc435f097e38d624aa20dcd695b7" + }, + { + "filename": "api_stability_ai_audio_inpaint-1.mp3", + "sha256": "4977f621d36d4dae0f97dd882ac70aa5440b0c140173d1b83a89b6df3e072e31" + } + ], + "cdn": { + "path": "media-api/api_stability_ai_audio_inpaint/" + } + }, + { + "id": "api_stability_ai_audio_to_audio", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_stability_ai_audio_to_audio.json", + "sha256": "9c509c24cd7ed9abac30eb66eb5150ef480f46b8282a803ce9e485e5dc0ca11f" + }, + { + "filename": "api_stability_ai_audio_to_audio-1.mp3", + "sha256": "ab63f41ebc9d61ce1f401fff8ca8e80bef67751e99c14432f9895cfcd304b409" + } + ], + "cdn": { + "path": "media-api/api_stability_ai_audio_to_audio/" + } + }, + { + "id": "api_stability_ai_i2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_stability_ai_i2i.json", + "sha256": "98099da79ae2fad2e89b20c0ba5eb8296dec278206a89143b16896f500ee9002" + }, + { + "filename": "api_stability_ai_i2i-1.webp", + "sha256": "777d08c2e6c5ee50f3206215f94ac0bfb009834ace181d2ffbc6fa00bfb3029b" + }, + { + "filename": "api_stability_ai_i2i-2.webp", + "sha256": "04a736fe62f58802acf6c6cf92211ee58f175e6216df7c5ff4b500a25476c21d" + } + ], + "cdn": { + "path": "media-api/api_stability_ai_i2i/" + } + }, + { + "id": "api_stability_ai_sd3.5_i2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_stability_ai_sd3.5_i2i.json", + "sha256": "417a0b538fe8b0cd9efdba0432e5b6f6e1cd73c8f927c34c9d964162db0b88d6" + }, + { + "filename": "api_stability_ai_sd3.5_i2i-1.webp", + "sha256": "7c4aef145d1c0096df43124e11aadedd8137e88302c7a73c086dab37610607fd" + }, + { + "filename": "api_stability_ai_sd3.5_i2i-2.webp", + "sha256": "dd1aa72dc06f3373b497195ee5d49692b95f70299f08eb2e74f9e8c823dd40f8" + } + ], + "cdn": { + "path": "media-api/api_stability_ai_sd3.5_i2i/" + } + }, + { + "id": "api_stability_ai_sd3.5_t2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_stability_ai_sd3.5_t2i.json", + "sha256": "9b62f6e02b75d3a91469f45e793c77dac584820a314f1164d952aa14d837d1c2" + }, + { + "filename": "api_stability_ai_sd3.5_t2i-1.webp", + "sha256": "872861089177e05823bbba3693dffd69c7722fa6b3be20daf44d34067d2bac81" + } + ], + "cdn": { + "path": "media-api/api_stability_ai_sd3.5_t2i/" + } + }, + { + "id": "api_stability_ai_stable_image_ultra_t2i", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_stability_ai_stable_image_ultra_t2i.json", + "sha256": "c3fc06a029043754a54294ee3f03f6df1f934a6b135164cb04bd136af81715a0" + }, + { + "filename": "api_stability_ai_stable_image_ultra_t2i-1.webp", + "sha256": "709675a9880529a781c343fb3dd0c010b6e5115b45ae831921cd0131926997cb" + } + ], + "cdn": { + "path": "media-api/api_stability_ai_stable_image_ultra_t2i/" + } + }, + { + "id": "api_stability_ai_text_to_audio", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_stability_ai_text_to_audio.json", + "sha256": "b5ec484b463b54bedbfb22f2da38ee91100d7e4af7ae8d321e25bd6847ac31ae" + }, + { + "filename": "api_stability_ai_text_to_audio-1.mp3", + "sha256": "f6654af4da4091b53527368d75bbcdc96f397a7ab30b8890554ec0eed0bf5b76" + } + ], + "cdn": { + "path": "media-api/api_stability_ai_text_to_audio/" + } + }, + { + "id": "api_tripo_image_to_model", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_tripo_image_to_model.json", + "sha256": "61ab2c84aa5b04bd39d04a15eb1c939f7edf1f073f617eadf2658033ab33c3dc" + }, + { + "filename": "api_tripo_image_to_model-1.webp", + "sha256": "bc4fa266cfecf45c818e1fdd4288c0619e02dbea54be1c30f7fe420d01f46a7f" + } + ], + "cdn": { + "path": "media-api/api_tripo_image_to_model/" + } + }, + { + "id": "api_tripo_multiview_to_model", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_tripo_multiview_to_model.json", + "sha256": "ae08c3a1af429623c7f64a27dec49d504f4b62b1b49266b4ed0947dc341ac2e3" + }, + { + "filename": "api_tripo_multiview_to_model-1.webp", + "sha256": "ea9b401fb9da9d5ad0205ab04347aafdeab1cc2603a1e60963aa5ca8875e318a" + } + ], + "cdn": { + "path": "media-api/api_tripo_multiview_to_model/" + } + }, + { + "id": "api_tripo_text_to_model", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_tripo_text_to_model.json", + "sha256": "72b92e7b679c969c09b80815ac0a72d8493a1851b34010d81c25f481a3e6232f" + }, + { + "filename": "api_tripo_text_to_model-1.webp", + "sha256": "5b33ff521d3a1bacb2d98760717415f634621caf264d025466c8cf7c65c669bf" + } + ], + "cdn": { + "path": "media-api/api_tripo_text_to_model/" + } + }, + { + "id": "api_veo2_i2v", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_veo2_i2v.json", + "sha256": "1ba1a318104cc74835659cfed98e58a9608487ea4e1d42f647b57f06e664d7fd" + }, + { + "filename": "api_veo2_i2v-1.webp", + "sha256": "f1d93a524b58c58a8be5da0a950c0de6356bd38be7d1b35b410fcd59b5a789e8" + } + ], + "cdn": { + "path": "media-api/api_veo2_i2v/" + } + }, + { + "id": "api_veo3", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_veo3.json", + "sha256": "fe05063358dad76635d839cdb7753d147edbdb24b0275273c7e31a5ba691ce0b" + }, + { + "filename": "api_veo3-1.webp", + "sha256": "9973d7a63cd0fa761810f5d78d85959223acec643f1eb63659e891a07b9b1b44" + } + ], + "cdn": { + "path": "media-api/api_veo3/" + } + }, + { + "id": "api_vidu_image_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_vidu_image_to_video.json", + "sha256": "73ea2a014a05505cdd21fdd6cc98379508d9e7d865f76bbf61e32d035073c9f7" + }, + { + "filename": "api_vidu_image_to_video-1.webp", + "sha256": "1bcd4fbcd3354880f8a0d224068e603620c00a71cb37ae93015fc881f014e68f" + } + ], + "cdn": { + "path": "media-api/api_vidu_image_to_video/" + } + }, + { + "id": "api_vidu_reference_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_vidu_reference_to_video.json", + "sha256": "5147c5721c5cf6ac2009d293e7c5bce67272d4a5072dda5a364ee498de927552" + }, + { + "filename": "api_vidu_reference_to_video-1.webp", + "sha256": "c0481fc78ea6e6ae7f15ae83032fd6c9af65be6752ca906f7e0c0ae34f342200" + } + ], + "cdn": { + "path": "media-api/api_vidu_reference_to_video/" + } + }, + { + "id": "api_vidu_start_end_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_vidu_start_end_to_video.json", + "sha256": "7cebccf598dd19ad36de31158e0c0655a37ccb54ac7fb13289d191a8df462ed9" + }, + { + "filename": "api_vidu_start_end_to_video-1.webp", + "sha256": "27be4f2f50e5b97b5c67b3a8fc2bfdb569a7c97f30382fd209169d4335dfb4ec" + } + ], + "cdn": { + "path": "media-api/api_vidu_start_end_to_video/" + } + }, + { + "id": "api_vidu_text_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_vidu_text_to_video.json", + "sha256": "56e3503eddcb9a4f969831ef1745338211b64e2938733d3e070053e68ecdd1f6" + }, + { + "filename": "api_vidu_text_to_video-1.webp", + "sha256": "9f504d416c7377a23a30baf67795a2c253203beb565388b98085acdb273cbef1" + } + ], + "cdn": { + "path": "media-api/api_vidu_text_to_video/" + } + }, + { + "id": "api_wan_image_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_wan_image_to_video.json", + "sha256": "01e80439aeec1ffe90f16ec2b2ec31c3962259cd1fea000a1579a15ad8e9edd6" + }, + { + "filename": "api_wan_image_to_video-1.webp", + "sha256": "d372935b7d86b19f4c989b0937936e22de2e3f54f897da29c1a5fb33c44bf8bf" + } + ], + "cdn": { + "path": "media-api/api_wan_image_to_video/" + } + }, + { + "id": "api_wan_text_to_image", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_wan_text_to_image.json", + "sha256": "c481a33c935f0587547b53807307ae62b67321e90e96d1464c8fb0a5a73b300b" + }, + { + "filename": "api_wan_text_to_image-1.webp", + "sha256": "3a81b0c68d0fd85a12743982311a1e14af83492e580e43910a2924ba48d69c2b" + } + ], + "cdn": { + "path": "media-api/api_wan_text_to_image/" + } + }, + { + "id": "api_wan_text_to_image ", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_wan_text_to_image .json", + "sha256": "6fb9b7fd6978277c5bde13693035b4a7bee5f0236125ee1f79a9bfd9125effbe" + } + ], + "cdn": { + "path": "media-api/api_wan_text_to_image /" + } + }, + { + "id": "api_wan_text_to_video", + "bundle": "media-api", + "version": "0.0.0", + "assets": [ + { + "filename": "api_wan_text_to_video.json", + "sha256": "ca91b9325d587906640fc91e09a131c0ff72128e56f399363f83af932ef1db26" + }, + { + "filename": "api_wan_text_to_video-1.webp", + "sha256": "7bb1fb96077835c7d1ad2dc9fad722257caf108cba9a5d06d095c9fb80d8f8e9" + } + ], + "cdn": { + "path": "media-api/api_wan_text_to_video/" + } + }, + { + "id": "01_qwen_t2i_subgraphed", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "01_qwen_t2i_subgraphed.json", + "sha256": "3be7a84690a92fd114793bcac1c4f67f94f7aea098a4467da9c003ab9055a25a" + }, + { + "filename": "01_qwen_t2i_subgraphed-1.webp", + "sha256": "5bfd7a133881864ff3ad6fe86403048b886cd77d2e19ef22ed539f8e0fa2e25c" + } + ], + "cdn": { + "path": "media-image/01_qwen_t2i_subgraphed/" + } + }, + { + "id": "02_qwen_Image_edit_subgraphed", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "02_qwen_Image_edit_subgraphed.json", + "sha256": "34a7eb18932284caf80c0677e64406273e4fbd27d5b1ad5c0ab11cd9b3c9b3b7" + }, + { + "filename": "02_qwen_Image_edit_subgraphed-1.webp", + "sha256": "8621581d2386d00c951d0411cc704e1a95516c9de90f443cda89e5ef04e68691" + } + ], + "cdn": { + "path": "media-image/02_qwen_Image_edit_subgraphed/" + } + }, + { + "id": "3d_hunyuan3d_image_to_model", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "3d_hunyuan3d_image_to_model.json", + "sha256": "378d08e0f011d15e4b79a7cf41dc76f8b45f819becc529aea73fbc4d19107837" + }, + { + "filename": "3d_hunyuan3d_image_to_model-1.webp", + "sha256": "5cfcfd6ae59c6fadd2abea78da25c5cc8ab66aa242676702a3cc8c76808b90da" + } + ], + "cdn": { + "path": "media-image/3d_hunyuan3d_image_to_model/" + } + }, + { + "id": "controlnet_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "controlnet_example.json", + "sha256": "1e7c9f5a088b25de4ad521765f8cc14c608f680eef6821080aaa381d03b06f01" + }, + { + "filename": "controlnet_example-1.webp", + "sha256": "b8a0ac758e9b1377f4e27927b74cd5494887308bdbc933add599bc0ab9fe5e9b" + }, + { + "filename": "controlnet_example-2.webp", + "sha256": "8d5eb0c8fc5d5e1a4b2afb74acdc5dc242f3adefdc7a87ef33cc4a377acdf480" + } + ], + "cdn": { + "path": "media-image/controlnet_example/" + } + }, + { + "id": "depth_controlnet", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "depth_controlnet.json", + "sha256": "e6950b4b7f4c334c00aa069ec5133dbf39272db6dbfc2e126d383591e3d32349" + }, + { + "filename": "depth_controlnet-1.webp", + "sha256": "26163445ffdf610c8451d5e17a0e911741fb8b63b2ad152c2d5e59db6bcbf9bc" + }, + { + "filename": "depth_controlnet-2.webp", + "sha256": "8cc93beaea3b61c19201bf1d4455e12f83364916f98d3d075c0ae2e13d23106d" + } + ], + "cdn": { + "path": "media-image/depth_controlnet/" + } + }, + { + "id": "depth_t2i_adapter", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "depth_t2i_adapter.json", + "sha256": "86d5852939c73065e2f9fe2a0f5ee25207969c581e0b451f4da1a0306a835cf6" + }, + { + "filename": "depth_t2i_adapter-1.webp", + "sha256": "af0ea41068a74de2916ddcf0d320c2743b01b4ec91e1814dfb7a673d13c94dee" + }, + { + "filename": "depth_t2i_adapter-2.webp", + "sha256": "221ba8ca27329a65074ef5ad71c9aca098b8ba0b47fb639a73d43461b6e76872" + } + ], + "cdn": { + "path": "media-image/depth_t2i_adapter/" + } + }, + { + "id": "flux1_dev_uso_reference_image_gen", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux1_dev_uso_reference_image_gen.json", + "sha256": "ccc8149aa95d80f21ee29b24400a222e714d5c3118ce674005c37a2440af105f" + }, + { + "filename": "flux1_dev_uso_reference_image_gen-1.webp", + "sha256": "feb4cd9d6809b065094a4a658aca52159a3885fd2ffe83cd38020ef3569e1576" + }, + { + "filename": "flux1_dev_uso_reference_image_gen-2.webp", + "sha256": "b87257947cc9a3d0e60f732e0511346413e29f2180447c1d17bb646c2bd2c13e" + } + ], + "cdn": { + "path": "media-image/flux1_dev_uso_reference_image_gen/" + } + }, + { + "id": "flux1_krea_dev", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux1_krea_dev.json", + "sha256": "f62947dcd46dbfa98a5c0385f364c58aa16ddf8169907d13510026f92c26276a" + }, + { + "filename": "flux1_krea_dev-1.webp", + "sha256": "f50f69199be7d4df57a4e1dae1876af89dde710a4fef700835858a469f0c9b50" + } + ], + "cdn": { + "path": "media-image/flux1_krea_dev/" + } + }, + { + "id": "flux_canny_model_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_canny_model_example.json", + "sha256": "b9426c6d99f17c389ccffe50c8f705de89dafb96342db94d9e6dbc188f96ffa7" + }, + { + "filename": "flux_canny_model_example-1.webp", + "sha256": "e130f622ad97a8c5c2bb22a1ac5ef0deac26337523faf46590e8f7935aa472b6" + }, + { + "filename": "flux_canny_model_example-2.webp", + "sha256": "00616a8740a89ff31823fb392c424d7418a1c3d6e839ad06a6464eabc90972ec" + } + ], + "cdn": { + "path": "media-image/flux_canny_model_example/" + } + }, + { + "id": "flux_depth_lora_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_depth_lora_example.json", + "sha256": "b02c3f5d5d25aa4796859ca45023f736eb2b39b35d1f6f882b4ca08198e3d44c" + }, + { + "filename": "flux_depth_lora_example-1.webp", + "sha256": "410efafc6cd95d54766f9177195bb05cab1ff56f3af475a5d0e26d62f1811964" + }, + { + "filename": "flux_depth_lora_example-2.webp", + "sha256": "0d98ef1d593b73f6189a8a4984ee8c2ae9799e74bb80b892a8e600cac7e6590a" + } + ], + "cdn": { + "path": "media-image/flux_depth_lora_example/" + } + }, + { + "id": "flux_dev_checkpoint_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_dev_checkpoint_example.json", + "sha256": "a4768937a004e39e475368182a34bf61694dc44a167fb31ac9332fb977873740" + }, + { + "filename": "flux_dev_checkpoint_example-1.webp", + "sha256": "43995ffc15c491d5725cc36dc55b3beb8e8fc0357d10fa8e5b5ad9867b286c31" + } + ], + "cdn": { + "path": "media-image/flux_dev_checkpoint_example/" + } + }, + { + "id": "flux_dev_full_text_to_image", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_dev_full_text_to_image.json", + "sha256": "4d1a771c6d3f7e10ce6465c80aa8fb5a8bb3c35133aa7a76a50624ac811c6ad0" + }, + { + "filename": "flux_dev_full_text_to_image-1.webp", + "sha256": "1fe0da957b8457f2ce6525040833032cc82786431e98ec471d83057daec4ac3c" + } + ], + "cdn": { + "path": "media-image/flux_dev_full_text_to_image/" + } + }, + { + "id": "flux_fill_inpaint_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_fill_inpaint_example.json", + "sha256": "bcf5c790f95b3a25facb26a89dbf00f76d37d37dd59a13cc9a807d7e78200c99" + }, + { + "filename": "flux_fill_inpaint_example-1.webp", + "sha256": "a725b4e355525d269aa5baad3344c31d5fc4fb794b8007e2899e6cfc0b61d205" + }, + { + "filename": "flux_fill_inpaint_example-2.webp", + "sha256": "11c0b3155c6c640ec953588f7ac645673f58c381a834dfcf9c15579c7cc0e18c" + } + ], + "cdn": { + "path": "media-image/flux_fill_inpaint_example/" + } + }, + { + "id": "flux_fill_outpaint_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_fill_outpaint_example.json", + "sha256": "1399173c0ede67c4cb40536f7e183d5fe9a18cdcde7b58a38a23d8290e9db59b" + }, + { + "filename": "flux_fill_outpaint_example-1.webp", + "sha256": "51545ecfbfca6c44ffb2e37d9c332474c2c42b20e0215e2c3391493cb0d3e984" + }, + { + "filename": "flux_fill_outpaint_example-2.webp", + "sha256": "90dd672510aa07932cb3756b135cac33ce2e71c70aab2e81fd0c9bc8ec7f2e1b" + } + ], + "cdn": { + "path": "media-image/flux_fill_outpaint_example/" + } + }, + { + "id": "flux_kontext_dev_basic", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_kontext_dev_basic.json", + "sha256": "bbed446702e5005ebc16fd47cdfb18880f562287d44841e7aa29f91d05392b64" + }, + { + "filename": "flux_kontext_dev_basic-1.webp", + "sha256": "237f6a74538d2b1c301e5d74418a6e136e7152c884bc6e4892a3583e209fb3ef" + }, + { + "filename": "flux_kontext_dev_basic-2.webp", + "sha256": "f0f1bf8fa8460cee339da73111d966c66b2dc1a9d34878768acd408c2c49303c" + } + ], + "cdn": { + "path": "media-image/flux_kontext_dev_basic/" + } + }, + { + "id": "flux_redux_model_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_redux_model_example.json", + "sha256": "67db0d6add12f1ced576fb7b8cc5f49420034f4204d96e953c3e2c9c8c5ff18f" + }, + { + "filename": "flux_redux_model_example-1.webp", + "sha256": "6953c2e69e4036c7bc03769579f191fd4cb4c0d277e3347211e0488c7857b597" + } + ], + "cdn": { + "path": "media-image/flux_redux_model_example/" + } + }, + { + "id": "flux_schnell", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_schnell.json", + "sha256": "05f2aa7c5c1cd4bfabcc6e25410f5d4286257f3ed78d10c542655c4e5c62c77a" + }, + { + "filename": "flux_schnell-1.webp", + "sha256": "7d0ee3729029efc052bb9b74c2099df5ba4928e72642b2691c3c3af52775a11c" + }, + { + "filename": "flux_schnell_full_text_to_image-1.webp", + "sha256": "7f4d43a62183753980325541c585348965e0b5fe39e4c67a30986af2885f88e5" + } + ], + "cdn": { + "path": "media-image/flux_schnell/" + } + }, + { + "id": "flux_schnell_full_text_to_image", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "flux_schnell_full_text_to_image.json", + "sha256": "19950f69c7335a04e429c8866249293b47936fea7b6d9386f4808b13f12edf05" + }, + { + "filename": "flux_schnell_full_text_to_image-1.webp", + "sha256": "7f4d43a62183753980325541c585348965e0b5fe39e4c67a30986af2885f88e5" + } + ], + "cdn": { + "path": "media-image/flux_schnell_full_text_to_image/" + } + }, + { + "id": "image2image", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image2image.json", + "sha256": "c3076287df4ca0f6c2d65c6b964bac04be0641096f314d383dc6d21f4f102f07" + }, + { + "filename": "image2image-1.webp", + "sha256": "c9af98420dfc541c30e906807dfb8faab05b0e4867ff7102968af96d1606e639" + }, + { + "filename": "image2image-2.webp", + "sha256": "de2730ab6e05fc38d7b0c9e334d5e6430e46f690fec08400ef7ab66fab1e321b" + } + ], + "cdn": { + "path": "media-image/image2image/" + } + }, + { + "id": "image_chroma1_radiance_text_to_image", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_chroma1_radiance_text_to_image.json", + "sha256": "4745d4bc6a52970372b3a967f6ab77df6ba3149acae02030f7f9b2b9893818aa" + }, + { + "filename": "image_chroma1_radiance_text_to_image-1.webp", + "sha256": "e318701a365743d90ec11500aa0ef77eded43af0e98db115c9d220af376887dc" + } + ], + "cdn": { + "path": "media-image/image_chroma1_radiance_text_to_image/" + } + }, + { + "id": "image_chroma_text_to_image", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_chroma_text_to_image.json", + "sha256": "fa3b3d2b8c5623f493073b3c250bbd4c289b0b5597850feec6a2087930a6d1ab" + }, + { + "filename": "image_chroma_text_to_image-1.webp", + "sha256": "7b163b4eb307c0b8aa3acdeb01eb08e78e39ee6c1b6600de29d5ef157309cacb" + } + ], + "cdn": { + "path": "media-image/image_chroma_text_to_image/" + } + }, + { + "id": "image_chrono_edit_14B", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_chrono_edit_14B.json", + "sha256": "5be2a7f00cde75d896d4eab39aed07ef3c893ae31eff65ca5d96fb2b852fb180" + }, + { + "filename": "image_chrono_edit_14B-1.webp", + "sha256": "b8b1b522d1cbbb8b315e42ab347a194c32553986b60a519ae03a5df18b8d86dc" + }, + { + "filename": "image_chrono_edit_14B-2.webp", + "sha256": "891f4e803c424faa16895acf5c5b431ae741e965dda56e1d98d039a96b3dd6dd" + } + ], + "cdn": { + "path": "media-image/image_chrono_edit_14B/" + } + }, + { + "id": "image_flux.1_fill_dev_OneReward", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_flux.1_fill_dev_OneReward.json", + "sha256": "4c7f880f94bb2f1f1f35c22bfd2457a615689dca87b404d74a4f8bc30112012c" + }, + { + "filename": "image_flux.1_fill_dev_OneReward-1.webp", + "sha256": "ecf56ec0754cfc33905535cee3fb51b7ae7c0af138f62cb9987f231dac1aa6c2" + }, + { + "filename": "image_flux.1_fill_dev_OneReward-2.webp", + "sha256": "78dc0114c08fba514cc08ef3119e6c892c5db58a290d6ac6fbc5fb96f530e3af" + } + ], + "cdn": { + "path": "media-image/image_flux.1_fill_dev_OneReward/" + } + }, + { + "id": "image_lotus_depth_v1_1", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_lotus_depth_v1_1.json", + "sha256": "d7bfacb13ae582c19c41fcb1f266d4d082527bc257031ea9bc1abd90aac8d305" + }, + { + "filename": "image_lotus_depth_v1_1-1.webp", + "sha256": "db8725421b1eef7b6e0b6462e6566c821898a0409ed572925549af652be52b87" + }, + { + "filename": "image_lotus_depth_v1_1-2.webp", + "sha256": "d8ce635ce389acaa102f1dfc5000a63343fb655b0210116c9bab96944cbe6e86" + } + ], + "cdn": { + "path": "media-image/image_lotus_depth_v1_1/" + } + }, + { + "id": "image_netayume_lumina_t2i", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_netayume_lumina_t2i.json", + "sha256": "e3447f5d399b249ca0bc69123ee9908719e769dc8d66f3c31999ac7ce82c8bae" + }, + { + "filename": "image_netayume_lumina_t2i-1.webp", + "sha256": "64b88bd1f424912fabd274c63681dee3e4301d910254a7f9ce5e654e794747a2" + } + ], + "cdn": { + "path": "media-image/image_netayume_lumina_t2i/" + } + }, + { + "id": "image_omnigen2_image_edit", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_omnigen2_image_edit.json", + "sha256": "d6f9769864c051f4e31b1639f1d65782fda2e787becc1c568e449ca733e377c4" + }, + { + "filename": "image_omnigen2_image_edit-1.webp", + "sha256": "1bb0e5cd057eb7c0b7850bd0c2d197ee69a1fc6dbd53e7086af55e2d3239c192" + }, + { + "filename": "image_omnigen2_image_edit-2.webp", + "sha256": "5107c8629e6f32f76e039b153768a9bd8c8d265518e57fc90b8880c8949bfd3a" + } + ], + "cdn": { + "path": "media-image/image_omnigen2_image_edit/" + } + }, + { + "id": "image_omnigen2_t2i", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_omnigen2_t2i.json", + "sha256": "e187ca681ae53423d47609f300219c3b00e9227b26d0e05bde92268402313552" + }, + { + "filename": "image_omnigen2_t2i-1.webp", + "sha256": "a076b45c17e5c3ae74599667b22348598068fd3151f29461fa97faa4aa0f4cf5" + } + ], + "cdn": { + "path": "media-image/image_omnigen2_t2i/" + } + }, + { + "id": "image_qwen_image", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_qwen_image.json", + "sha256": "df4f8af49e1070a53650d93c3bde6d1378d787da53f66ab8d63d9c07f258156a" + }, + { + "filename": "image_qwen_image-1.webp", + "sha256": "9b61fc1058f6ddc310347eca0902777617b10bae962ea5fb303f7eddbf6ec5f4" + }, + { + "filename": "image_qwen_image_controlnet_patch-1.webp", + "sha256": "233bdd99c862da7ee038142625374a13238bf766996ad42edde806257e918407" + }, + { + "filename": "image_qwen_image_controlnet_patch-2.webp", + "sha256": "748f1edad66133a7c2edd63052220955fea9568f53fd9cd9e2d904090922a588" + }, + { + "filename": "image_qwen_image_edit-1.webp", + "sha256": "8308e3589732a4f36e3df85292a36ae4eb96e528c932fc24dc985296307f1e51" + }, + { + "filename": "image_qwen_image_edit-2.webp", + "sha256": "52861e9846b68b4c36f36732d9d337f6885c136c78e7631f2b43b2cb6b09a0c2" + }, + { + "filename": "image_qwen_image_edit_2509-1.webp", + "sha256": "a9f52fb9b2d8933bb2c118698a875910c7f672fbd0b61e2189fcb5c745967d84" + }, + { + "filename": "image_qwen_image_edit_2509-2.webp", + "sha256": "0f14e8b7fa50e29229b8a512dc33c96ec8d52704f6e656df046af928a64eeafa" + }, + { + "filename": "image_qwen_image_instantx_controlnet-1.webp", + "sha256": "866333d22baa19e85b1dcb75556790de02032fdb8b58f75e6a71aec7379f362c" + }, + { + "filename": "image_qwen_image_instantx_controlnet-2.webp", + "sha256": "1ee0c1381a79cf67b20fa388a1d5b1ff248d3aceeda2110bcf37d9aeea665b3e" + }, + { + "filename": "image_qwen_image_instantx_inpainting_controlnet-1.webp", + "sha256": "66fde18de64f512905d1b93753f6b8fa3d00e2e79a05ff2916a0d7aaefc146bd" + }, + { + "filename": "image_qwen_image_instantx_inpainting_controlnet-2.webp", + "sha256": "9187dd7414eb950cf38d1c2b54bf68fa8b3d8f3bd709de2d4abcd346f79b30ec" + }, + { + "filename": "image_qwen_image_union_control_lora-1.webp", + "sha256": "c2310000870f19774b8f8323f90001bfdc909f41cc2bec41bc01c15c1771457b" + }, + { + "filename": "image_qwen_image_union_control_lora-3.webp", + "sha256": "0541d8698edd40e7eefd563f22313371defb16807db08e5c13a3541e7f142cdf" + } + ], + "cdn": { + "path": "media-image/image_qwen_image/" + } + }, + { + "id": "image_qwen_image_controlnet_patch", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_qwen_image_controlnet_patch.json", + "sha256": "54bb01cf78235ea44f0ba0561164d8a03b6a4610aaade6f6d6f95b192db7ffba" + }, + { + "filename": "image_qwen_image_controlnet_patch-1.webp", + "sha256": "233bdd99c862da7ee038142625374a13238bf766996ad42edde806257e918407" + }, + { + "filename": "image_qwen_image_controlnet_patch-2.webp", + "sha256": "748f1edad66133a7c2edd63052220955fea9568f53fd9cd9e2d904090922a588" + } + ], + "cdn": { + "path": "media-image/image_qwen_image_controlnet_patch/" + } + }, + { + "id": "image_qwen_image_edit", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_qwen_image_edit.json", + "sha256": "8bdfe5050dade4f6fd0aaf9a0979591cbd0c0b5dbd71af3e6218c7cb3c5c113e" + }, + { + "filename": "image_qwen_image_edit-1.webp", + "sha256": "8308e3589732a4f36e3df85292a36ae4eb96e528c932fc24dc985296307f1e51" + }, + { + "filename": "image_qwen_image_edit-2.webp", + "sha256": "52861e9846b68b4c36f36732d9d337f6885c136c78e7631f2b43b2cb6b09a0c2" + }, + { + "filename": "image_qwen_image_edit_2509-1.webp", + "sha256": "a9f52fb9b2d8933bb2c118698a875910c7f672fbd0b61e2189fcb5c745967d84" + }, + { + "filename": "image_qwen_image_edit_2509-2.webp", + "sha256": "0f14e8b7fa50e29229b8a512dc33c96ec8d52704f6e656df046af928a64eeafa" + } + ], + "cdn": { + "path": "media-image/image_qwen_image_edit/" + } + }, + { + "id": "image_qwen_image_edit_2509", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_qwen_image_edit_2509.json", + "sha256": "55d3c8e985334c6f1cd40439bfda0e8713ad58f7d4512d819628edf0efa94668" + }, + { + "filename": "image_qwen_image_edit_2509-1.webp", + "sha256": "a9f52fb9b2d8933bb2c118698a875910c7f672fbd0b61e2189fcb5c745967d84" + }, + { + "filename": "image_qwen_image_edit_2509-2.webp", + "sha256": "0f14e8b7fa50e29229b8a512dc33c96ec8d52704f6e656df046af928a64eeafa" + } + ], + "cdn": { + "path": "media-image/image_qwen_image_edit_2509/" + } + }, + { + "id": "image_qwen_image_instantx_controlnet", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_qwen_image_instantx_controlnet.json", + "sha256": "2ca87611b3f2b9f0bf28585873ac7a6625c31e71a72019a2f56ee7b7ec6ded03" + }, + { + "filename": "image_qwen_image_instantx_controlnet-1.webp", + "sha256": "866333d22baa19e85b1dcb75556790de02032fdb8b58f75e6a71aec7379f362c" + }, + { + "filename": "image_qwen_image_instantx_controlnet-2.webp", + "sha256": "1ee0c1381a79cf67b20fa388a1d5b1ff248d3aceeda2110bcf37d9aeea665b3e" + } + ], + "cdn": { + "path": "media-image/image_qwen_image_instantx_controlnet/" + } + }, + { + "id": "image_qwen_image_instantx_inpainting_controlnet", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_qwen_image_instantx_inpainting_controlnet.json", + "sha256": "d2238ca8a551aa2412fbb008ea2b0d160b0c75e1a783215fdc52bd287f31cf31" + }, + { + "filename": "image_qwen_image_instantx_inpainting_controlnet-1.webp", + "sha256": "66fde18de64f512905d1b93753f6b8fa3d00e2e79a05ff2916a0d7aaefc146bd" + }, + { + "filename": "image_qwen_image_instantx_inpainting_controlnet-2.webp", + "sha256": "9187dd7414eb950cf38d1c2b54bf68fa8b3d8f3bd709de2d4abcd346f79b30ec" + } + ], + "cdn": { + "path": "media-image/image_qwen_image_instantx_inpainting_controlnet/" + } + }, + { + "id": "image_qwen_image_union_control_lora", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "image_qwen_image_union_control_lora.json", + "sha256": "3a4a0bbc2411f6f5c3f5815a7be52ff23bc703a3e9e68a7003f3f2cf57d53ea1" + }, + { + "filename": "image_qwen_image_union_control_lora-1.webp", + "sha256": "c2310000870f19774b8f8323f90001bfdc909f41cc2bec41bc01c15c1771457b" + }, + { + "filename": "image_qwen_image_union_control_lora-3.webp", + "sha256": "0541d8698edd40e7eefd563f22313371defb16807db08e5c13a3541e7f142cdf" + } + ], + "cdn": { + "path": "media-image/image_qwen_image_union_control_lora/" + } + }, + { + "id": "inpaint_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "inpaint_example.json", + "sha256": "4bd93f009251d228a3edb8b290739e2ceb97b14870b60416ee8c5dab5e1bc6eb" + }, + { + "filename": "inpaint_example-1.webp", + "sha256": "2b53235793cc22e05e3a7bc35d282488ce80554f2a0828ca0a373d4dd2cfebf9" + }, + { + "filename": "inpaint_example-2.webp", + "sha256": "bf5bce535d7aa79f934ab5752cb684696cb59fae7ffc71d1160310928074a56e" + } + ], + "cdn": { + "path": "media-image/inpaint_example/" + } + }, + { + "id": "inpaint_model_outpainting", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "inpaint_model_outpainting.json", + "sha256": "3b6e747909232b55b3f4e972d36d014a30292a3bdf176cfdb43adf2e2d3fcf61" + }, + { + "filename": "inpaint_model_outpainting-1.webp", + "sha256": "3d57482782cabc018ff8ecc3d459b340616971428e31d5e3f9b0604302206432" + }, + { + "filename": "inpaint_model_outpainting-2.webp", + "sha256": "f08fc12137ac26b86f59da9e6dccff054b06d8ee65b5acb1808930642b3e47dc" + } + ], + "cdn": { + "path": "media-image/inpaint_model_outpainting/" + } + }, + { + "id": "mixing_controlnets", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "mixing_controlnets.json", + "sha256": "a0addbddf84f3c0a0147d796915cfbb4f3d1c3c64e7f20b2e652e63d361aea49" + }, + { + "filename": "mixing_controlnets-1.webp", + "sha256": "05cebabf1d5c796f8c8e38b292574664527fff09edd9cc26340271a12ba8e062" + }, + { + "filename": "mixing_controlnets-2.webp", + "sha256": "8f5903708aff7415fdaadb0484bef7e78ee10c86818af4a56c716aace4020620" + } + ], + "cdn": { + "path": "media-image/mixing_controlnets/" + } + }, + { + "id": "sd3.5_large_canny_controlnet_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "sd3.5_large_canny_controlnet_example.json", + "sha256": "de00419ed00e9c7600b4159977aa1b3b454013672ff4bc0d8cfbad2802369d2c" + }, + { + "filename": "sd3.5_large_canny_controlnet_example-1.webp", + "sha256": "0cbb438ac0ff74d99927b7333f6d3df8e9b9ea1308c6c30b17fbea8b1557f583" + }, + { + "filename": "sd3.5_large_canny_controlnet_example-2.webp", + "sha256": "16f33bf6f25247b2a58c9fe049952ae9ad9a6ba5c12ee9ee59f75a9a68696720" + } + ], + "cdn": { + "path": "media-image/sd3.5_large_canny_controlnet_example/" + } + }, + { + "id": "sdxl_refiner_prompt_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "sdxl_refiner_prompt_example.json", + "sha256": "6b95ff4fe803a124944a085f9b572cb1ccfa973ae5cb177bd95c878c01085dec" + }, + { + "filename": "sdxl_refiner_prompt_example-1.webp", + "sha256": "ae398519d7ab3d3cfff6451b2c6fc0391371c0b4adfdd7152eb02703f46ae449" + } + ], + "cdn": { + "path": "media-image/sdxl_refiner_prompt_example/" + } + }, + { + "id": "sdxl_revision_text_prompts", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "sdxl_revision_text_prompts.json", + "sha256": "d088867225226f157354d273707f205c7113f7ca8fccb87276260778d6c11416" + }, + { + "filename": "sdxl_revision_text_prompts-1.webp", + "sha256": "56edc4a645e54902e46f386dc220c0d9257c1e58670c6752a6a486d0e7f7afae" + } + ], + "cdn": { + "path": "media-image/sdxl_revision_text_prompts/" + } + }, + { + "id": "sdxl_simple_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "sdxl_simple_example.json", + "sha256": "19371ef3af27d97a1eb65ac185711ca1aaffb5014e49bc98ac68e7e3c491802c" + }, + { + "filename": "sdxl_simple_example-1.webp", + "sha256": "edbd2ddcd6f4926a63721c390c88e56f9c4694e0830e40c50a31990718e63633" + } + ], + "cdn": { + "path": "media-image/sdxl_simple_example/" + } + }, + { + "id": "sdxlturbo_example", + "bundle": "media-image", + "version": "0.0.0", + "assets": [ + { + "filename": "sdxlturbo_example.json", + "sha256": "c623bd4ac8189edb6c8b884269fee7ab5a8c5910ea0c8d7148b65119e6a832ef" + }, + { + "filename": "sdxlturbo_example-1.webp", + "sha256": "97f4b668675d15caa717f90dd1fc47b561bf0d5d3ec75ff0a8f0fb312456f4d7" + } + ], + "cdn": { + "path": "media-image/sdxlturbo_example/" + } + }, + { + "id": "04_hunyuan_3d_2.1_subgraphed", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "04_hunyuan_3d_2.1_subgraphed.json", + "sha256": "868d4f0b6a94944eb8d0f8b8b05713eaede5d9323a32febc962ba7c96686f70a" + }, + { + "filename": "04_hunyuan_3d_2.1_subgraphed-1.webp", + "sha256": "9000d662e0ea43d1eb22ce96023ad310c7e72ffded08412574c7c7f928f59dc6" + } + ], + "cdn": { + "path": "media-other/04_hunyuan_3d_2.1_subgraphed/" + } + }, + { + "id": "05_audio_ace_step_1_t2a_song_subgraphed", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "05_audio_ace_step_1_t2a_song_subgraphed.json", + "sha256": "6934a1d551cd7742fdeccea80096c86b42841eb807ecf930491406b65d608cbb" + }, + { + "filename": "05_audio_ace_step_1_t2a_song_subgraphed-1.webp", + "sha256": "90b75f8ddb8472ed2c4d1b10173ab0d08d9e0f05b1c22dd5ee50f3667a31d981" + } + ], + "cdn": { + "path": "media-other/05_audio_ace_step_1_t2a_song_subgraphed/" + } + }, + { + "id": "2_pass_pose_worship", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "2_pass_pose_worship.json", + "sha256": "9e6f6f2e56e2ef9afb892b3475b3df332faa724b56edc29855654f09f140ec4c" + }, + { + "filename": "2_pass_pose_worship-1.webp", + "sha256": "562a21f2c3d182fdfe6eb38e91eb48379762332f68b7b1e460c3bad84ae5c86a" + }, + { + "filename": "2_pass_pose_worship-2.webp", + "sha256": "42204e1b04b8c59aba4fc9b91e83427522cbbbab364b0e7bc6f06e80e15be35e" + } + ], + "cdn": { + "path": "media-other/2_pass_pose_worship/" + } + }, + { + "id": "3d_hunyuan3d-v2.1", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "3d_hunyuan3d-v2.1.json", + "sha256": "f35db860609c056bdc27862e4658999c0ec86a15bdd9d065cecaeaf71d2ce9a3" + }, + { + "filename": "3d_hunyuan3d-v2.1-1.webp", + "sha256": "30bf19801e9bbc14ec34dec2974984812c7cc77bbc0d66da7f4d81673a624fd7" + } + ], + "cdn": { + "path": "media-other/3d_hunyuan3d-v2.1/" + } + }, + { + "id": "3d_hunyuan3d_multiview_to_model", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "3d_hunyuan3d_multiview_to_model.json", + "sha256": "27efa74e206704d86f4cd13c75b1121bf921116fe62293230878dad7981ca930" + }, + { + "filename": "3d_hunyuan3d_multiview_to_model-1.webp", + "sha256": "446e3c5eb8fe4455e57489ab3d188dfe59327305a128181c099b24928a63faae" + }, + { + "filename": "3d_hunyuan3d_multiview_to_model-2.webp", + "sha256": "323bf2112cc91dcbaa1aa7b8cfdc67c3054280ad63994c98e9efdbf0d2b5e327" + }, + { + "filename": "3d_hunyuan3d_multiview_to_model_turbo-1.webp", + "sha256": "cd7662b2dd6df82ba35a45caec578fb7bbdbc6a8ec35a31f87a20260ab4c4cf3" + }, + { + "filename": "3d_hunyuan3d_multiview_to_model_turbo-2.webp", + "sha256": "648aa51605b4fad11b8c5257cb72a08abc70975a7588febaea388fd26f80f086" + } + ], + "cdn": { + "path": "media-other/3d_hunyuan3d_multiview_to_model/" + } + }, + { + "id": "3d_hunyuan3d_multiview_to_model_turbo", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "3d_hunyuan3d_multiview_to_model_turbo.json", + "sha256": "22ca6068616f1d48533a3f9113aa4ad961f96d69a20a371105ba9cef8040b3c5" + }, + { + "filename": "3d_hunyuan3d_multiview_to_model_turbo-1.webp", + "sha256": "cd7662b2dd6df82ba35a45caec578fb7bbdbc6a8ec35a31f87a20260ab4c4cf3" + }, + { + "filename": "3d_hunyuan3d_multiview_to_model_turbo-2.webp", + "sha256": "648aa51605b4fad11b8c5257cb72a08abc70975a7588febaea388fd26f80f086" + } + ], + "cdn": { + "path": "media-other/3d_hunyuan3d_multiview_to_model_turbo/" + } + }, + { + "id": "ByteDance-Seedance_00003_", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "ByteDance-Seedance_00003_.json", + "sha256": "0ff5ce1074ee250e1e6a78da59128f95775a789b90136954ebd9e2ecda00cb00" + } + ], + "cdn": { + "path": "media-other/ByteDance-Seedance_00003_/" + } + }, + { + "id": "area_composition", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "area_composition.json", + "sha256": "364c0b86206b769554372746c7a9a0cbc5825176c29c0aec577ed18df6eb1132" + }, + { + "filename": "area_composition-1.webp", + "sha256": "36cf2e635b35479e49582bc64b8231b8d256bc8bde0bfe8c445677bca1096373" + }, + { + "filename": "area_composition_square_area_for_subject-1.webp", + "sha256": "7a621b6d78257fffcc6c33e674e5fb69852fe059f244960449cf5df8b5fc6357" + } + ], + "cdn": { + "path": "media-other/area_composition/" + } + }, + { + "id": "area_composition_square_area_for_subject", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "area_composition_square_area_for_subject.json", + "sha256": "883b8f8caba3dd00057f093fe3450dc83da7968ca54a30f61326f882e89f7a12" + }, + { + "filename": "area_composition_square_area_for_subject-1.webp", + "sha256": "7a621b6d78257fffcc6c33e674e5fb69852fe059f244960449cf5df8b5fc6357" + } + ], + "cdn": { + "path": "media-other/area_composition_square_area_for_subject/" + } + }, + { + "id": "audio_ace_step_1_m2m_editing", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "audio_ace_step_1_m2m_editing.json", + "sha256": "84a5505aab66cbf80df79afb0d2c70a83e07adb6649a42e34e0ccff79f96db26" + }, + { + "filename": "audio_ace_step_1_m2m_editing-1.mp3", + "sha256": "26dcaf75dd8424f88f862f0fda51c7a6b17622f85f8eeea37d00db77addfafaa" + } + ], + "cdn": { + "path": "media-other/audio_ace_step_1_m2m_editing/" + } + }, + { + "id": "audio_ace_step_1_t2a_instrumentals", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "audio_ace_step_1_t2a_instrumentals.json", + "sha256": "4f669317c24bf48c91a63e9fb703321f87a85e13279b7e34530fe157719bdb1e" + }, + { + "filename": "audio_ace_step_1_t2a_instrumentals-1.mp3", + "sha256": "4fc66c6f888520cfdc46b3c727b0e40af7eef56a4100f71932fa58e4d20f93bc" + } + ], + "cdn": { + "path": "media-other/audio_ace_step_1_t2a_instrumentals/" + } + }, + { + "id": "audio_ace_step_1_t2a_song", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "audio_ace_step_1_t2a_song.json", + "sha256": "5c00f7a6db454a7d94f48077c4bd5d5c56deca82c05713ce78a09cc6376445c4" + }, + { + "filename": "audio_ace_step_1_t2a_song-1.mp3", + "sha256": "558f4ede5f17c55796005261afe7c9cbc8fd56652a5a8138cc07d79b41c439ad" + } + ], + "cdn": { + "path": "media-other/audio_ace_step_1_t2a_song/" + } + }, + { + "id": "audio_stable_audio_example", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "audio_stable_audio_example.json", + "sha256": "e7b6884609910a9503288c46b55e5cbf5f6e32f7ba7f5e6bd0b5092d00302a38" + }, + { + "filename": "audio_stable_audio_example-1.mp3", + "sha256": "1484d142879d1687875a98b41800ae788bee453d3ffd9ae1799624b3888d8c59" + } + ], + "cdn": { + "path": "media-other/audio_stable_audio_example/" + } + }, + { + "id": "default", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "default.json", + "sha256": "44b97d95bb0d205c0e16253559a68bf7df09de73031039b83145c2a7d025557b" + }, + { + "filename": "default-1.webp", + "sha256": "a8931d78303c3c5a18268c9f70d37e4d84b9d93cd9ae29c7a2ae21b237463903" + } + ], + "cdn": { + "path": "media-other/default/" + } + }, + { + "id": "embedding_example", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "embedding_example.json", + "sha256": "e02d63c5ba24eeb705735e72f84797f5d958c9f8a21fef26e61124b1b980463a" + }, + { + "filename": "embedding_example-1.webp", + "sha256": "c8597f09b45a3804c0d6d81d3680d0e9d3c8e63fdd0d9ead10ef00953c2e2c83" + } + ], + "cdn": { + "path": "media-other/embedding_example/" + } + }, + { + "id": "esrgan_example", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "esrgan_example.json", + "sha256": "8d253128d05ddf8324c3e150db2452cd38f0f7c7174e473db125aaf0f7bbc361" + }, + { + "filename": "esrgan_example-1.webp", + "sha256": "f5089fe7c2f4ddfb72dee9c4dfba59c2b21537c1f85ec9ec74bfbde568a8a082" + }, + { + "filename": "esrgan_example-2.webp", + "sha256": "7a22410ba0636ad5422eeb7f4f671e944920a5cd5864bb3d8737d304543b76b3" + } + ], + "cdn": { + "path": "media-other/esrgan_example/" + } + }, + { + "id": "gligen_textbox_example", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "gligen_textbox_example.json", + "sha256": "1e25f6c587892a969a0e2885edf0e2eb7c1de7e25d6e82460cd527bc0d414f46" + }, + { + "filename": "gligen_textbox_example-1.webp", + "sha256": "e0bbf9604fc574085de163988328ed49e114c4b9db3276250b5b0945ae884e62" + } + ], + "cdn": { + "path": "media-other/gligen_textbox_example/" + } + }, + { + "id": "hidream_e1_1", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "hidream_e1_1.json", + "sha256": "c5017b0867f758f0c158db9a255fdabb7ed3f5f6bc99343690fa0b80553bd499" + }, + { + "filename": "hidream_e1_1-1.webp", + "sha256": "dfdd5917c0a21d87fcfe89d66a512e0942c5dd3f7eb109554d54858754f70535" + }, + { + "filename": "hidream_e1_1-2.webp", + "sha256": "077a3d0d1910bf27075d4486399a5d29fb473015fa525bfef467c439b6f3c00f" + } + ], + "cdn": { + "path": "media-other/hidream_e1_1/" + } + }, + { + "id": "hidream_e1_full", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "hidream_e1_full.json", + "sha256": "57025ea928c4c8600048cfe2f15bbcaf4e259cd88c1b4d774cf94742f6f8667c" + }, + { + "filename": "hidream_e1_full-1.webp", + "sha256": "f7e25400d2c2a9223c3c36a87c6dfb7565ab51bc1bff058df4eff2b022acfd09" + }, + { + "filename": "hidream_e1_full-2.webp", + "sha256": "057b42dcbebed6b5716ede6d40a2788162b7013a0a1ace6099dfa0cc7057c510" + } + ], + "cdn": { + "path": "media-other/hidream_e1_full/" + } + }, + { + "id": "hidream_i1_dev", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "hidream_i1_dev.json", + "sha256": "8feb7ad6904169eb7503d403d8ca68fbe3bd422fa7067659ea20c77537ce2335" + }, + { + "filename": "hidream_i1_dev-1.webp", + "sha256": "4956f5471da3ecf610ddb2e94b88a10c71a7107cee2ef7310346bebc462bc370" + } + ], + "cdn": { + "path": "media-other/hidream_i1_dev/" + } + }, + { + "id": "hidream_i1_fast", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "hidream_i1_fast.json", + "sha256": "f90d94b8873faeea0c40746d70c168d3a3469436982570bc8348a65537c53645" + }, + { + "filename": "hidream_i1_fast-1.webp", + "sha256": "e9109ae25f6e185c391e7c89a56c1a2c7466bff347d6e66eb2fd79a019ca554b" + } + ], + "cdn": { + "path": "media-other/hidream_i1_fast/" + } + }, + { + "id": "hidream_i1_full", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "hidream_i1_full.json", + "sha256": "853cd711fb94505d60e4732336e07322d1ae59c990ec3fb7ee3a1e4a5fe8616d" + }, + { + "filename": "hidream_i1_full-1.webp", + "sha256": "e389027450dc395fd353d903bdce529a519510417cb348f687def8f035ee35ce" + } + ], + "cdn": { + "path": "media-other/hidream_i1_full/" + } + }, + { + "id": "hiresfix_esrgan_workflow", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "hiresfix_esrgan_workflow.json", + "sha256": "349eb573fcebbeb5b32b72fbe3c6f6d3fb9530c3dc74d389d4609a121278c7cb" + }, + { + "filename": "hiresfix_esrgan_workflow-1.webp", + "sha256": "d596a280cf954b9403e8698c1a579ddfc3b28dbb75bdbf88e6a6ab19e6cee393" + }, + { + "filename": "hiresfix_esrgan_workflow-2.webp", + "sha256": "5ecd694b90a16cd0601b27bd06fc055dc34974e9637d47e92b57695f93748a81" + } + ], + "cdn": { + "path": "media-other/hiresfix_esrgan_workflow/" + } + }, + { + "id": "hiresfix_latent_workflow", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "hiresfix_latent_workflow.json", + "sha256": "bca898d64d81e39fc9e969589aa073f0dcf49ac85994cc5719fe6efddfa702a6" + }, + { + "filename": "hiresfix_latent_workflow-1.webp", + "sha256": "601a5481541f448b272d001a85dfec595e63edbb4b3b0bb44cc991804b8e5d9d" + }, + { + "filename": "hiresfix_latent_workflow-2.webp", + "sha256": "f0d9b03570ae92bd34271410f97bc889681719dac937bacf7cf99420af692b37" + } + ], + "cdn": { + "path": "media-other/hiresfix_latent_workflow/" + } + }, + { + "id": "index", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.json", + "sha256": "cba119111902bd841d3d362c72795f5df3fe21942ce8ff781458de8a99fa006c" + } + ], + "cdn": { + "path": "media-other/index/" + } + }, + { + "id": "index.ar", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.ar.json", + "sha256": "b9bc956ea5473774272febf03677772017f8a9b30c6e475ec6a14aa7ac8d4499" + } + ], + "cdn": { + "path": "media-other/index.ar/" + } + }, + { + "id": "index.es", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.es.json", + "sha256": "0ddd46291d680aa315b69067deaaee2f8a744b415a4011f96895a185cccc58cf" + } + ], + "cdn": { + "path": "media-other/index.es/" + } + }, + { + "id": "index.fr", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.fr.json", + "sha256": "97fa62253dbf5843e0586ed22e53335d726f91aa0a67b315b51649432311ba99" + } + ], + "cdn": { + "path": "media-other/index.fr/" + } + }, + { + "id": "index.ja", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.ja.json", + "sha256": "7c7c1682c9b95df1bd3101e9f5bbec9f1c338a4b2de7f669d0109a28d932fc5e" + } + ], + "cdn": { + "path": "media-other/index.ja/" + } + }, + { + "id": "index.ko", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.ko.json", + "sha256": "7db01161a96cda7965554f23e05921e6768defba3dcab7b7f118d48e82f24606" + } + ], + "cdn": { + "path": "media-other/index.ko/" + } + }, + { + "id": "index.ru", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.ru.json", + "sha256": "453bb38d0f96b9f1afba2f7a4e4eeb1293b6dad61bdba67c397f6008d448d4a7" + } + ], + "cdn": { + "path": "media-other/index.ru/" + } + }, + { + "id": "index.schema", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.schema.json", + "sha256": "b1b55b397f7554d2c7c50ee277e306cf90c639d720ec7b4b193ad242172c253c" + } + ], + "cdn": { + "path": "media-other/index.schema/" + } + }, + { + "id": "index.tr", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.tr.json", + "sha256": "959e231f0b318495403c43924fa756a9e67503167ba4a49bf5d4ea77d253945f" + } + ], + "cdn": { + "path": "media-other/index.tr/" + } + }, + { + "id": "index.zh", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.zh.json", + "sha256": "eb89d90aa5b7a5164a8c52008a2f39033437dcdc80e95675d68500adc0b165c0" + } + ], + "cdn": { + "path": "media-other/index.zh/" + } + }, + { + "id": "index.zh-TW", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "index.zh-TW.json", + "sha256": "e46e81186baded144f9572f8a7b66388768bc322c7195c6d23895bdfb15ab77b" + } + ], + "cdn": { + "path": "media-other/index.zh-TW/" + } + }, + { + "id": "latent_upscale_different_prompt_model", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "latent_upscale_different_prompt_model.json", + "sha256": "ae8dbec5c2b37b9147e457dcb2177262f056a502dfc2b0a9664f7192a4864cc6" + }, + { + "filename": "latent_upscale_different_prompt_model-1.webp", + "sha256": "1fab2db2dec454105b91ffa41ede56019583ef64f7d88a2c44d74d636907ee36" + } + ], + "cdn": { + "path": "media-other/latent_upscale_different_prompt_model/" + } + }, + { + "id": "lora", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "lora.json", + "sha256": "a43e1ac3394a9d252ca3d078117041331094bac3a5a63fab311c2e1a3cec575a" + }, + { + "filename": "lora-1.webp", + "sha256": "372a29dd875f6e0d35ebdcb03760d9bd8bf7ac2fb705180cd9848716fcbf18da" + }, + { + "filename": "lora_multiple-1.webp", + "sha256": "d24662dcfbc2d54f668265b08c70776d037d0d9de0df3f85b39dc22dcdcaa717" + } + ], + "cdn": { + "path": "media-other/lora/" + } + }, + { + "id": "lora_multiple", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "lora_multiple.json", + "sha256": "e57b0e2f201ec6c82938246a8a331fb8d419ae307ff03fcc3184968f0f29ba51" + }, + { + "filename": "lora_multiple-1.webp", + "sha256": "d24662dcfbc2d54f668265b08c70776d037d0d9de0df3f85b39dc22dcdcaa717" + } + ], + "cdn": { + "path": "media-other/lora_multiple/" + } + }, + { + "id": "sd3.5_large_blur", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "sd3.5_large_blur.json", + "sha256": "f81b4783cbc7945a92c19274ce7ee0bc5e68c12b7e6cfab1599d3c67fa929d86" + }, + { + "filename": "sd3.5_large_blur-1.webp", + "sha256": "2d50cba92b72af53cba2057cd275ba90ac4accebc649ec6b7028bab5da9ab7f8" + }, + { + "filename": "sd3.5_large_blur-2.webp", + "sha256": "3bce0cc0871f8cd311a3843f6b479d1983e7868789036b5dc1f5c676c3bb9240" + } + ], + "cdn": { + "path": "media-other/sd3.5_large_blur/" + } + }, + { + "id": "sd3.5_large_depth", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "sd3.5_large_depth.json", + "sha256": "3747f3dac25edd4bd85b25a8f6f4a1f0ed9c0a601d27a865eb6c94b92a2e2c08" + }, + { + "filename": "sd3.5_large_depth-1.webp", + "sha256": "0460328d8d2333ee897a9735fb650a42aa3f11f5caa14e4fb061f54cea5b6b04" + }, + { + "filename": "sd3.5_large_depth-2.webp", + "sha256": "5e419482dcf94be59e74ea80a02057d9de65cb1fa3f705c0daba8734d7b519c7" + } + ], + "cdn": { + "path": "media-other/sd3.5_large_depth/" + } + }, + { + "id": "sd3.5_simple_example", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "sd3.5_simple_example.json", + "sha256": "984609244f0158264ac844830d44753a8b528fdf0bf5bd599ad4998e0b72d903" + }, + { + "filename": "sd3.5_simple_example-1.webp", + "sha256": "129a08018afc03e7734176260c867c9365671a92fe6d6468f2d80a8a6f34c0c9" + } + ], + "cdn": { + "path": "media-other/sd3.5_simple_example/" + } + }, + { + "id": "wan2.1_flf2v_720_f16", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "wan2.1_flf2v_720_f16.json", + "sha256": "6bf24f3617b65395802802a1bdd7f2bdde143bdf85deb047858561ba87bf1972" + }, + { + "filename": "wan2.1_flf2v_720_f16-1.webp", + "sha256": "5d0d6267d7f4faa8a0676de90724e03e8b3383b2ed9b7ebfaa485d98a88f7c38" + } + ], + "cdn": { + "path": "media-other/wan2.1_flf2v_720_f16/" + } + }, + { + "id": "wan2.1_fun_control", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "wan2.1_fun_control.json", + "sha256": "6f015f71d3e3bc47ecd699c40b58b316f2875fd8f1502c187f8e3a6a11941958" + }, + { + "filename": "wan2.1_fun_control-1.webp", + "sha256": "b6a2fb921cde839271102bfb6e989d3161a3b0d47b6a99a60a1b5d6d821b0a50" + }, + { + "filename": "wan2.1_fun_control-2.webp", + "sha256": "b2b05e2903bc1c2d3202dabe3d25344cad16b055194782210993db98faef606b" + } + ], + "cdn": { + "path": "media-other/wan2.1_fun_control/" + } + }, + { + "id": "wan2.1_fun_inp", + "bundle": "media-other", + "version": "0.0.0", + "assets": [ + { + "filename": "wan2.1_fun_inp.json", + "sha256": "7d8492ffe65106024dcc4a71044718ac0fa8de1d3dd4c5d56a68703ff3402db9" + }, + { + "filename": "wan2.1_fun_inp-1.webp", + "sha256": "295aa862df3289ac613672604827d5c53f162e7083d8ce73aadcbe000728c2d2" + } + ], + "cdn": { + "path": "media-other/wan2.1_fun_inp/" + } + }, + { + "id": "03_video_wan2_2_14B_i2v_subgraphed", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "03_video_wan2_2_14B_i2v_subgraphed.json", + "sha256": "0c4f2feaea586836511e5ec623fb624b912c9c2c56856e4f7da46a0a11fae544" + }, + { + "filename": "03_video_wan2_2_14B_i2v_subgraphed-1.webp", + "sha256": "34b3a99e34db410d56b60924f73409dec3ab79cfbe68ce7e774ae1c2df75035a" + } + ], + "cdn": { + "path": "media-video/03_video_wan2_2_14B_i2v_subgraphed/" + } + }, + { + "id": "hunyuan_video_text_to_video", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "hunyuan_video_text_to_video.json", + "sha256": "58b28a1cdf18bdaaae4699e4cef8023350c6ffa0e2ea692cedea9152217d149b" + }, + { + "filename": "hunyuan_video_text_to_video-1.webp", + "sha256": "2da9f766ef4986269878bfa7ab44b004aee972db4ff9bdd0014c763518758972" + } + ], + "cdn": { + "path": "media-video/hunyuan_video_text_to_video/" + } + }, + { + "id": "image_to_video", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "image_to_video.json", + "sha256": "2856625e4990a7f6f0eb3f4fe0397e735fd3674604457a1985c35a293054e789" + }, + { + "filename": "image_to_video-1.webp", + "sha256": "6098ab2d8328ecfa04bf214caf01363f6aff113bd5f680ee0620f5a107c64311" + }, + { + "filename": "image_to_video_wan-1.webp", + "sha256": "731b71796e4a7a9b95bea2274f51b877a75d28dfea096cf3596e2cbf4625e8f2" + } + ], + "cdn": { + "path": "media-video/image_to_video/" + } + }, + { + "id": "image_to_video_wan", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "image_to_video_wan.json", + "sha256": "404247aaeb63cee6af7992c4475b1410291f285e09f5a34bdd0881ebf3a81181" + }, + { + "filename": "image_to_video_wan-1.webp", + "sha256": "731b71796e4a7a9b95bea2274f51b877a75d28dfea096cf3596e2cbf4625e8f2" + } + ], + "cdn": { + "path": "media-video/image_to_video_wan/" + } + }, + { + "id": "ltxv_image_to_video", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "ltxv_image_to_video.json", + "sha256": "888860b7bed81c0c20d75cf544d966272ce15363e0a96067af56eb8f59366b39" + }, + { + "filename": "ltxv_image_to_video-1.webp", + "sha256": "61a541b73d534dcf74c8fca68c2516c446b9a8df42d686cc6730c64856595b41" + } + ], + "cdn": { + "path": "media-video/ltxv_image_to_video/" + } + }, + { + "id": "ltxv_text_to_video", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "ltxv_text_to_video.json", + "sha256": "81fbdb914bbd376e8dd55db4844afad1083c1467270230ef27c9e794bddc65a0" + }, + { + "filename": "ltxv_text_to_video-1.webp", + "sha256": "808a031853f2d612aaf8115c25418dbddd5cdddf2ddc6c3514620eea3b237772" + } + ], + "cdn": { + "path": "media-video/ltxv_text_to_video/" + } + }, + { + "id": "mochi_text_to_video_example", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "mochi_text_to_video_example.json", + "sha256": "eda12d38d0479527d0dd43ac08396aa50880fd2493e94a0f0b9a37d55531d082" + }, + { + "filename": "mochi_text_to_video_example-1.webp", + "sha256": "5bb454af7c2e3c2448e28a6487ecc9efa6282d644420e125e8e4308b42374e5e" + } + ], + "cdn": { + "path": "media-video/mochi_text_to_video_example/" + } + }, + { + "id": "text_to_video_wan", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "text_to_video_wan.json", + "sha256": "6cfcb2bcc842926d462667f1858651a7a73d698591013e4d0370bdc2984a6fea" + }, + { + "filename": "text_to_video_wan-1.webp", + "sha256": "3a57dada11e319ba8a4645d71eb507c5c86f5819fddc208436fa62e1d5b7d564" + } + ], + "cdn": { + "path": "media-video/text_to_video_wan/" + } + }, + { + "id": "txt_to_image_to_video", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "txt_to_image_to_video.json", + "sha256": "0531d6fd34879f18a2b027aa0e1a45d533cc71efdc6c85317f998a68d475d31a" + }, + { + "filename": "txt_to_image_to_video-1.webp", + "sha256": "217c68930b9d569358d3f6ceef0554e70f236653e2520fa9b6c4abfac2afe4c6" + } + ], + "cdn": { + "path": "media-video/txt_to_image_to_video/" + } + }, + { + "id": "video_humo", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_humo.json", + "sha256": "d060fe0a59a616a30e7cff5f9f4559e6b4d38ceb962256b98c1a5ac72c9c8f51" + }, + { + "filename": "video_humo-1.webp", + "sha256": "4f83a7f241c552a937874a78d080a9d63bb1c94cdeac250dc4133f399af66fe0" + } + ], + "cdn": { + "path": "media-video/video_humo/" + } + }, + { + "id": "video_wan2.1_alpha_t2v_14B", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2.1_alpha_t2v_14B.json", + "sha256": "8c413ef6b19f22c20e3b605a8e08366de73655f4612cbdac730cd34adea9d9c5" + }, + { + "filename": "video_wan2.1_alpha_t2v_14B-1.webp", + "sha256": "8ad7aadddfb306c182049cf4babe7282f768fa61cb61cf1f61c572afa903429c" + } + ], + "cdn": { + "path": "media-video/video_wan2.1_alpha_t2v_14B/" + } + }, + { + "id": "video_wan2.1_fun_camera_v1.1_1.3B", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2.1_fun_camera_v1.1_1.3B.json", + "sha256": "d8ca49660913a1f8f07ca60303f1669b8e2efd4e4f59cf3c44ebab644c3dddb4" + }, + { + "filename": "video_wan2.1_fun_camera_v1.1_1.3B-1.webp", + "sha256": "95802037012edc4873456ede87c3310ef31fa341ad8d9c3d640ebcf0886d75d9" + } + ], + "cdn": { + "path": "media-video/video_wan2.1_fun_camera_v1.1_1.3B/" + } + }, + { + "id": "video_wan2.1_fun_camera_v1.1_14B", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2.1_fun_camera_v1.1_14B.json", + "sha256": "f44715753ea6fb8d631333f7628700109ad9cb3a42ee55fa1a55fb3523e77862" + }, + { + "filename": "video_wan2.1_fun_camera_v1.1_14B-1.webp", + "sha256": "9b880a9ff7547835ec65269b3db618d4b8866f9d74d45949a2f168c7d38f0669" + } + ], + "cdn": { + "path": "media-video/video_wan2.1_fun_camera_v1.1_14B/" + } + }, + { + "id": "video_wan2_2_14B_animate", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_14B_animate.json", + "sha256": "9ad462b0bff9b73a607dee89f1abaadda1453abeadd8a8fd90a5f0576922cc28" + }, + { + "filename": "video_wan2_2_14B_animate-1.webp", + "sha256": "ba755e2690e5cb9f21e7483aeb331e13a849e13378564bb370c0bc8fb5651548" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_14B_animate/" + } + }, + { + "id": "video_wan2_2_14B_flf2v", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_14B_flf2v.json", + "sha256": "d002c138529e97fb0eaeff80917e981a2a781acdc777800afb1a99586ffe6d89" + }, + { + "filename": "video_wan2_2_14B_flf2v-1.webp", + "sha256": "a069f404dd2ba556de7a3fb9773e7bc66c03fd4a6817623f043c7d91e7feecb3" + }, + { + "filename": "video_wan2_2_14B_flf2v-2.webp", + "sha256": "d458df74a9cb4d5de95799d34e4cfaf5e8ebb118131b3f3e097751edb8fbca54" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_14B_flf2v/" + } + }, + { + "id": "video_wan2_2_14B_fun_camera", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_14B_fun_camera.json", + "sha256": "787afbc3dde9ce5f0e36a6747a67cf476c50d0ca4f72573b9d176226da292b73" + }, + { + "filename": "video_wan2_2_14B_fun_camera-1.webp", + "sha256": "3d9d9d7944eafe816fb2131147da6def7d990261a6286933b84aa604d9c86160" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_14B_fun_camera/" + } + }, + { + "id": "video_wan2_2_14B_fun_control", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_14B_fun_control.json", + "sha256": "f56843d9ef0db395933278afd8f845d142d14ea7c3b6370fe845beb932de5571" + }, + { + "filename": "video_wan2_2_14B_fun_control-1.webp", + "sha256": "9c3ee52547fd3edb466bdb6b874221da526a685b1bf7fb1eb2ce6708d3e44784" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_14B_fun_control/" + } + }, + { + "id": "video_wan2_2_14B_fun_inpaint", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_14B_fun_inpaint.json", + "sha256": "80084aaa9a996c797af71b91660c546cf714e9f712e92a9c26df0239bbcf814d" + }, + { + "filename": "video_wan2_2_14B_fun_inpaint-1.webp", + "sha256": "ea9a45f43743e7c5372890b5a7dab766afe8aa9b44e9ba553c4dc80b9a53dbce" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_14B_fun_inpaint/" + } + }, + { + "id": "video_wan2_2_14B_i2v", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_14B_i2v.json", + "sha256": "0716b13bb5032f958d8458702a56a4d192500cdf3401cfe6b804e1cffa0b6a4c" + }, + { + "filename": "video_wan2_2_14B_i2v-1.webp", + "sha256": "1c2bbda5573acdf1a3e796b32781583fe0cf360a931f6f903715916b4b76e4ef" + }, + { + "filename": "video_wan2_2_14B_i2v-2.webp", + "sha256": "f50ede08fae994a93558e1e03963b7abd02d9ef090093da205cbc65f716e8ca9" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_14B_i2v/" + } + }, + { + "id": "video_wan2_2_14B_s2v", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_14B_s2v.json", + "sha256": "4f02f101b0faeabd0634378b8a2672869246ae695cb6d5993fe412a0e095c774" + }, + { + "filename": "video_wan2_2_14B_s2v-1.webp", + "sha256": "4f65c3e2690089004e8f650f5b2313b640e5d074189546d6836970da8b8b73ba" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_14B_s2v/" + } + }, + { + "id": "video_wan2_2_14B_t2v", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_14B_t2v.json", + "sha256": "76922b9bec0b092b200eba893d4d6170e6b32469e4be4409602ef59aa32001fb" + }, + { + "filename": "video_wan2_2_14B_t2v-1.webp", + "sha256": "1be72f99c222864d3fd1ff18c93f5ab855d027feb5c6776bbf38d3d94cf090fc" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_14B_t2v/" + } + }, + { + "id": "video_wan2_2_14B_t2v (2)", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_14B_t2v (2).json", + "sha256": "5293894a3d0ebee79c861ec864ec7323ae171423e1c798069ebbc17f39606b92" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_14B_t2v (2)/" + } + }, + { + "id": "video_wan2_2_5B_fun_control", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_5B_fun_control.json", + "sha256": "036612dd5f08c67a7192ef8fb6506e87c167d38aa94208ba4f021381909c137e" + }, + { + "filename": "video_wan2_2_5B_fun_control-1.webp", + "sha256": "0d65596539e892d21380654994728c821ab83325512003acaf6e3d1cefa4c741" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_5B_fun_control/" + } + }, + { + "id": "video_wan2_2_5B_fun_inpaint", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_5B_fun_inpaint.json", + "sha256": "6cd07b97c85d2956b967638c91d0a55e889dc87c170e4fe82330b3a4c8ed6248" + }, + { + "filename": "video_wan2_2_5B_fun_inpaint-1.webp", + "sha256": "1030d41666ac3bc511b65f5af1d0d6dfd49f1f677dbb1875b5174ab0e313708c" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_5B_fun_inpaint/" + } + }, + { + "id": "video_wan2_2_5B_ti2v", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan2_2_5B_ti2v.json", + "sha256": "a721ebc03c16d969213955f1acc6b424b1e33b01522ee159b69ced4831bf5624" + }, + { + "filename": "video_wan2_2_5B_ti2v-1.webp", + "sha256": "972226640f44a2d9e8051da7d224058e14ea1404643f761ced8ee5454d35c593" + } + ], + "cdn": { + "path": "media-video/video_wan2_2_5B_ti2v/" + } + }, + { + "id": "video_wan_ati", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan_ati.json", + "sha256": "2402e7e7f9756bc34cba8b73301ccf791f66f007a25aa0faf520d5cb1874492f" + }, + { + "filename": "video_wan_ati-1.webp", + "sha256": "3e117a26c2c6595170ccec26c8dfe6d90b819a75a5063eae3508d9943bf41b29" + }, + { + "filename": "video_wan_ati-2.webp", + "sha256": "502096a1ea9a02f757342ec38c3b033ef2a12a721955eda867a7c50fea7f5e16" + } + ], + "cdn": { + "path": "media-video/video_wan_ati/" + } + }, + { + "id": "video_wan_vace_14B_ref2v", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan_vace_14B_ref2v.json", + "sha256": "b54341f011ecfbca374a0c0ffa9e3acec78a287394322413a8644d7bd833434b" + }, + { + "filename": "video_wan_vace_14B_ref2v-1.webp", + "sha256": "10c217af196ba1930f3d278125c57fc8423ce7225a76b555de47f89202d88ffa" + } + ], + "cdn": { + "path": "media-video/video_wan_vace_14B_ref2v/" + } + }, + { + "id": "video_wan_vace_14B_t2v", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan_vace_14B_t2v.json", + "sha256": "fc4c2829c37d83a26de42b4dace86fabcf77d0441821c18cfa552d25b4faa40e" + }, + { + "filename": "video_wan_vace_14B_t2v-1.webp", + "sha256": "d7a69d5c937f0ed29db9fc792680c8af965f3b6b73463cc2c3d7a2099b0f768f" + } + ], + "cdn": { + "path": "media-video/video_wan_vace_14B_t2v/" + } + }, + { + "id": "video_wan_vace_14B_v2v", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan_vace_14B_v2v.json", + "sha256": "528c91cae38273295956a8f94237ccbf54c54fdd583f26fd11edce1520a3b1e4" + }, + { + "filename": "video_wan_vace_14B_v2v-1.webp", + "sha256": "d5d96e7bed5029927f0e5274eb201b4d1f9301091fb9f408405b52a3eb830a62" + }, + { + "filename": "video_wan_vace_14B_v2v-2.webp", + "sha256": "5f6b39e063f933f86d1ad1794cdc149e5d7fb60d53ed3b20710594adf5621b93" + } + ], + "cdn": { + "path": "media-video/video_wan_vace_14B_v2v/" + } + }, + { + "id": "video_wan_vace_flf2v", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan_vace_flf2v.json", + "sha256": "976cf5ddb0c6a4fce517350a6921e36dd4c4631dfaf748973ca298dcbb6f0230" + }, + { + "filename": "video_wan_vace_flf2v-1.webp", + "sha256": "dc388ec33c5d13f6b168137a4298ff7c6cbceddb7267e3e9f6c532130a4343d6" + } + ], + "cdn": { + "path": "media-video/video_wan_vace_flf2v/" + } + }, + { + "id": "video_wan_vace_inpainting", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan_vace_inpainting.json", + "sha256": "504c8cb8ee9b5d1749e1cef0f5ea0772acbab80f7944ae16a3783621bdf1789c" + }, + { + "filename": "video_wan_vace_inpainting-1.webp", + "sha256": "93f2ee8a421cef35545b9be1b60e6d0ed4ea718161fa79f4cef9faf8aeed7f6e" + }, + { + "filename": "video_wan_vace_inpainting-2.webp", + "sha256": "3029d866adeff87171207aaded685dc4faf48b1ed3abc0b26ff822d6de3feea6" + } + ], + "cdn": { + "path": "media-video/video_wan_vace_inpainting/" + } + }, + { + "id": "video_wan_vace_outpainting", + "bundle": "media-video", + "version": "0.0.0", + "assets": [ + { + "filename": "video_wan_vace_outpainting.json", + "sha256": "c37f0ecd1884903327f4926d48073214f546e2ff224844d5ce72e2dceba93fac" + }, + { + "filename": "video_wan_vace_outpainting-1.webp", + "sha256": "f007f1e61c2303b337d9137a661192a2f6c0fcc9e52ca2e7fd4abf4b6310334e" + }, + { + "filename": "video_wan_vace_outpainting-2.webp", + "sha256": "0e25fd1028c0bbf8dbc616e375c86519872d326398f61abb213360c1f00098d4" + } + ], + "cdn": { + "path": "media-video/video_wan_vace_outpainting/" + } + } + ] +} \ No newline at end of file diff --git a/packages/core/tests/test_bump_versions.py b/packages/core/tests/test_bump_versions.py new file mode 100644 index 00000000..25cd480f --- /dev/null +++ b/packages/core/tests/test_bump_versions.py @@ -0,0 +1,180 @@ +import os +import subprocess +import sys +from pathlib import Path +from textwrap import dedent + +import pytest + +SCRIPT_PATH = Path(__file__).resolve().parents[3] / "scripts" / "bump_versions.py" + +PACKAGES = { + "core": "comfyui-workflow-templates-core", + "media_api": "comfyui-workflow-templates-media-api", + "media_image": "comfyui-workflow-templates-media-image", + "media_other": "comfyui-workflow-templates-media-other", + "media_video": "comfyui-workflow-templates-media-video", + "meta": "comfyui-workflow-templates", +} + + +@pytest.fixture() +def temp_repo(tmp_path): + repo = tmp_path / "repo" + repo.mkdir() + + (repo / "templates").mkdir() + (repo / "packages").mkdir() + for name in PACKAGES: + pkg_dir = repo / "packages" / name + pkg_dir.mkdir(parents=True, exist_ok=True) + pyproject = pkg_dir / "pyproject.toml" + pip_name = PACKAGES[name] + pyproject.write_text( + dedent( + f""" + [build-system] + requires = ["setuptools>=61.0"] + build-backend = "setuptools.build_meta" + + [project] + name = "{pip_name}" + version = "0.1.0" + """ + ).strip() + + "\n" + ) + + # Root pyproject with dependency constraints + root_pyproject = repo / "pyproject.toml" + root_pyproject.write_text( + dedent( + """ + [build-system] + requires = ["setuptools>=61.0"] + build-backend = "setuptools.build_meta" + + [project] + name = "comfyui_workflow_templates" + version = "0.1.0" + description = "Meta package" + requires-python = ">=3.9" + license = "MIT" + + dependencies = [ + "comfyui-workflow-templates-core>=0.1.0", + "comfyui-workflow-templates-media-api>=0.1.0", + "comfyui-workflow-templates-media-video>=0.1.0", + "comfyui-workflow-templates-media-image>=0.1.0", + "comfyui-workflow-templates-media-other>=0.1.0" + ] + """ + ).strip() + + "\n" + ) + meta_project = repo / "packages" / "meta" / "pyproject.toml" + deps_block = dedent( + """ + dependencies = [ + "comfyui-workflow-templates-core>=0.1.0", + "comfyui-workflow-templates-media-api>=0.1.0", + "comfyui-workflow-templates-media-video>=0.1.0", + "comfyui-workflow-templates-media-image>=0.1.0", + "comfyui-workflow-templates-media-other>=0.1.0" + ] + """ + ).strip() + meta_project.write_text(meta_project.read_text() + "\n" + deps_block) + + (repo / "bundles.json").write_text( + dedent( + """ + { + "media-image": ["foo_template"], + "media-api": [], + "media-video": [], + "media-other": [] + } + """ + ).strip() + + "\n" + ) + (repo / "templates" / "foo_template.json").write_text("{}\n") + + subprocess.run(["git", "init"], cwd=repo, check=True, stdout=subprocess.PIPE) + subprocess.run(["git", "config", "user.name", "Test"], cwd=repo, check=True) + subprocess.run(["git", "config", "user.email", "test@example.com"], cwd=repo, check=True) + subprocess.run(["git", "add", "."], cwd=repo, check=True) + subprocess.run(["git", "commit", "-m", "initial"], cwd=repo, check=True) + subprocess.run(["git", "tag", "v0.1.0"], cwd=repo, check=True) + + yield repo + + +def run_script(repo: Path, *args: str, check: bool = True): + env = os.environ.copy() + env["WORKFLOW_TEMPLATES_ROOT"] = str(repo) + return subprocess.run( + [sys.executable, str(SCRIPT_PATH), *args], + env=env, + cwd=repo, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + check=check, + ) + + +def read_version(repo: Path, rel_path: str) -> str: + import re + + text = (repo / rel_path).read_text() + match = re.search(r'version\s*=\s*"(\d+\.\d+\.\d+)"', text) + if not match: + raise AssertionError(f"version not found in {rel_path}") + return match.group(1) + + +def assert_dependency_version(repo: Path, pip_name: str, expected: str): + text = (repo / "pyproject.toml").read_text() + needle = f"{pip_name}>={expected}" + assert needle in text + + +def test_no_changes(temp_repo): + result = run_script(temp_repo, "--base-ref", "v0.1.0") + assert "No package changes" in result.stdout + for rel in [ + "pyproject.toml", + "packages/meta/pyproject.toml", + "packages/core/pyproject.toml", + ]: + assert read_version(temp_repo, rel) == "0.1.0" + + +def test_template_change_bumps_bundle_and_meta(temp_repo): + template_file = temp_repo / "templates" / "foo_template-1.webp" + template_file.write_text("binary") + subprocess.run(["git", "add", "templates"], cwd=temp_repo, check=True) + subprocess.run(["git", "commit", "-m", "template update"], cwd=temp_repo, check=True) + + run_script(temp_repo, "--base-ref", "v0.1.0") + + assert read_version(temp_repo, "packages/media_image/pyproject.toml") == "0.1.1" + assert read_version(temp_repo, "packages/meta/pyproject.toml") == "0.1.1" + assert read_version(temp_repo, "packages/core/pyproject.toml") == "0.1.0" + assert_dependency_version(temp_repo, "comfyui-workflow-templates-media-image", "0.1.1") + + +def test_core_change_bumps_core_and_meta(temp_repo): + core_file = temp_repo / "packages" / "core" / "src" / "dummy.py" + core_file.parent.mkdir(parents=True, exist_ok=True) + core_file.write_text("print('hi')\n") + subprocess.run(["git", "add", "packages/core"], cwd=temp_repo, check=True) + subprocess.run(["git", "commit", "-m", "core change"], cwd=temp_repo, check=True) + + run_script(temp_repo, "--base-ref", "v0.1.0") + + assert read_version(temp_repo, "packages/core/pyproject.toml") == "0.1.1" + assert read_version(temp_repo, "packages/meta/pyproject.toml") == "0.1.1" + assert_dependency_version(temp_repo, "comfyui-workflow-templates-core", "0.1.1") diff --git a/packages/core/tests/test_bundles_config.py b/packages/core/tests/test_bundles_config.py new file mode 100644 index 00000000..28e20050 --- /dev/null +++ b/packages/core/tests/test_bundles_config.py @@ -0,0 +1,49 @@ +import json +import os +from pathlib import Path + +PACKAGE_ROOTS = [ + "packages/core/src", + "packages/meta/src", + "packages/media_api/src", + "packages/media_video/src", + "packages/media_image/src", + "packages/media_other/src", +] + +REPO_ROOT = Path(__file__).resolve().parents[3] +for root in PACKAGE_ROOTS: + full = REPO_ROOT / root + full_str = str(full) + if full_str not in os.sys.path: + os.sys.path.insert(0, full_str) + +import comfyui_workflow_templates_core.loader as loader # noqa: E402 + + +def load_bundle_config(): + path = REPO_ROOT / "bundles.json" + with path.open("r", encoding="utf-8") as f: + return json.load(f) + + +def test_manifest_aligns_with_bundles_config(): + config = load_bundle_config() + manifest_map = {entry.template_id: entry.bundle for entry in loader.iter_templates()} + + config_map = {} + for bundle, templates in config.items(): + for template_id in templates: + assert template_id not in config_map, ( + f"Duplicate template '{template_id}' in bundles.json" + ) + config_map[template_id] = bundle + + assert manifest_map.keys() == config_map.keys(), ( + "Mismatch between manifest and bundles.json templates" + ) + + for template_id, bundle in manifest_map.items(): + assert ( + config_map[template_id] == bundle + ), f"Template '{template_id}' expected in '{config_map[template_id]}', got '{bundle}'" diff --git a/packages/core/tests/test_http_routes.py b/packages/core/tests/test_http_routes.py new file mode 100644 index 00000000..c4f88d5a --- /dev/null +++ b/packages/core/tests/test_http_routes.py @@ -0,0 +1,66 @@ +import asyncio +from pathlib import Path + +from aiohttp import web +from aiohttp.test_utils import make_mocked_request + +from comfyui_workflow_templates_core import iter_assets + + +BUNDLE_SAMPLES = { + "media-api": [ + "api_bfl_flux_1_kontext_max_image", + "api_bfl_flux_1_kontext_multiple_images_input", + ], + "media-image": [ + "01_qwen_t2i_subgraphed", + "02_qwen_Image_edit_subgraphed", + ], + "media-other": [ + "04_hunyuan_3d_2.1_subgraphed", + "05_audio_ace_step_1_t2a_song_subgraphed", + ], + "media-video": [ + "03_video_wan2_2_14B_i2v_subgraphed", + "hunyuan_video_text_to_video", + ], +} + + +def build_handler(asset_map): + async def handle(request: web.Request) -> web.StreamResponse: + rel_path = request.match_info.get("path", "") + target = asset_map.get(rel_path) + if target is None: + raise web.HTTPNotFound() + return web.FileResponse(target) + + return handle + + +def run_request(handler, rel_path: str): + request = make_mocked_request("GET", f"/templates/{rel_path}") + request._match_info["path"] = rel_path # type: ignore[attr-defined] + return asyncio.run(handler(request)) + + +def test_static_handler_serves_samples(): + assets = dict(iter_assets()) + assert assets, "Expected bundled assets to be available" + handler = build_handler(assets) + + for bundle, template_ids in BUNDLE_SAMPLES.items(): + for template_id in template_ids: + variants = [name for name in assets if name.startswith(template_id)] + assert variants, f"No assets found for template {template_id} in {bundle}" + for rel_name in variants: + response = run_request(handler, rel_name) + assert isinstance(response, web.FileResponse) + assert Path(response._path) == Path(assets[rel_name]) # type: ignore[attr-defined] + + # Verify missing path 404s + try: + run_request(handler, "does_not_exist") + except web.HTTPNotFound: + return + raise AssertionError("Expected HTTPNotFound for missing asset") diff --git a/packages/core/tests/test_loader.py b/packages/core/tests/test_loader.py new file mode 100644 index 00000000..d4b9bdf1 --- /dev/null +++ b/packages/core/tests/test_loader.py @@ -0,0 +1,56 @@ +import os +from importlib import reload +from pathlib import Path + +import pytest + +PACKAGE_ROOTS = [ + "packages/core/src", + "packages/meta/src", + "packages/media_api/src", + "packages/media_video/src", + "packages/media_image/src", + "packages/media_other/src", +] + +REPO_ROOT = Path(__file__).resolve().parents[3] +for root in PACKAGE_ROOTS: + full = REPO_ROOT / root + full_str = str(full) + if full_str not in os.sys.path: + os.sys.path.insert(0, full_str) + +import comfyui_workflow_templates as meta # noqa: E402 +import comfyui_workflow_templates_core.loader as loader # noqa: E402 + + +def test_manifest_loads(): + manifest = loader.load_manifest() + assert manifest.manifest_version == 1 + assert len(manifest.templates) > 0 + + +def test_resolve_sample_asset(): + entries = list(meta.iter_templates()) + assert entries + sample = entries[0] + asset = sample.assets[0] + path = meta.get_asset_path(sample.template_id, asset.filename) + assert os.path.exists(path) + with open(path, "rb") as f: + data = f.read(1) + assert data + + +def test_missing_template_raises(): + with pytest.raises(KeyError): + loader.get_template_entry("not-a-template") + + +def test_missing_bundle_resolves(monkeypatch): + entries = list(loader.iter_templates()) + sample = entries[0] + monkeypatch.setitem(loader.BUNDLE_PACKAGE_MAP, sample.bundle, "_does_not_exist") + with pytest.raises(FileNotFoundError): + loader.get_asset_path(sample.template_id, sample.assets[0].filename) + reload(loader) diff --git a/packages/core/tests/test_templates_repo.py b/packages/core/tests/test_templates_repo.py new file mode 100644 index 00000000..49d1e7a8 --- /dev/null +++ b/packages/core/tests/test_templates_repo.py @@ -0,0 +1,56 @@ +import json +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parents[3] +TEMPLATES_DIR = REPO_ROOT / "templates" +BUNDLES_CONFIG = REPO_ROOT / "bundles.json" +MANIFEST_PATH = ( + REPO_ROOT + / "packages" + / "core" + / "src" + / "comfyui_workflow_templates_core" + / "manifest.json" +) +SUPPORTED_EXTENSIONS = { + ".json", + ".webp", + ".png", + ".jpg", + ".jpeg", + ".gif", + ".mp4", + ".webm", + ".mp3", + ".wav", + ".ogg", + ".flac", + ".m4a", +} + + +def test_templates_directory_matches_bundles_config(): + template_ids = {path.stem for path in TEMPLATES_DIR.glob("*.json")} + bundles = json.loads(BUNDLES_CONFIG.read_text()) + configured_ids = { + template_id for templates in bundles.values() for template_id in templates + } + assert template_ids == configured_ids, ( + "Mismatch between templates/ JSON files and bundles.json assignments" + ) + + +def test_manifest_includes_all_template_assets(): + manifest = json.loads(MANIFEST_PATH.read_text()) + manifest_assets = { + asset["filename"] + for entry in manifest.get("templates", []) + for asset in entry.get("assets", []) + } + files_on_disk = { + path.name + for path in TEMPLATES_DIR.iterdir() + if path.is_file() and path.suffix.lower() in SUPPORTED_EXTENSIONS + } + missing = sorted(files_on_disk - manifest_assets) + assert not missing, f"Assets missing from manifest: {missing}" diff --git a/packages/media_api/project.json b/packages/media_api/project.json new file mode 100644 index 00000000..806245bb --- /dev/null +++ b/packages/media_api/project.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://raw.githubusercontent.com/nrwl/nx/master/packages/nx/schemas/project-schema.json", + "name": "media-api", + "projectType": "library", + "sourceRoot": "packages/media_api/src", + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "cwd": "packages/media_api", + "command": "python3 -m build" + }, + "dependsOn": [ + { + "projects": "tooling", + "target": "sync" + } + ] + } + }, + "tags": [], + "implicitDependencies": ["core"] +} diff --git a/packages/media_api/pyproject.toml b/packages/media_api/pyproject.toml new file mode 100644 index 00000000..24654ac5 --- /dev/null +++ b/packages/media_api/pyproject.toml @@ -0,0 +1,17 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "comfyui-workflow-templates-media-api" +version = "0.3.1" +description = "Media bundle containing API-driven workflow assets" +readme = {text = "Media bundle containing API-driven workflow assets for ComfyUI.", content-type = "text/plain"} +requires-python = ">=3.9" +license = "MIT" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +comfyui_workflow_templates_media_api = ["templates/*"] diff --git a/packages/media_api/src/comfyui_workflow_templates_media_api/__init__.py b/packages/media_api/src/comfyui_workflow_templates_media_api/__init__.py new file mode 100644 index 00000000..e5035f5a --- /dev/null +++ b/packages/media_api/src/comfyui_workflow_templates_media_api/__init__.py @@ -0,0 +1,6 @@ +""" +Media bundle: API workflows. + +Static assets live under `templates/` within this package. Content is +populated during the build step. +""" diff --git a/packages/media_image/project.json b/packages/media_image/project.json new file mode 100644 index 00000000..edcd4112 --- /dev/null +++ b/packages/media_image/project.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://raw.githubusercontent.com/nrwl/nx/master/packages/nx/schemas/project-schema.json", + "name": "media-image", + "projectType": "library", + "sourceRoot": "packages/media_image/src", + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "cwd": "packages/media_image", + "command": "python3 -m build" + }, + "dependsOn": [ + { + "projects": "tooling", + "target": "sync" + } + ] + } + }, + "tags": [], + "implicitDependencies": ["core"] +} diff --git a/packages/media_image/pyproject.toml b/packages/media_image/pyproject.toml new file mode 100644 index 00000000..97951064 --- /dev/null +++ b/packages/media_image/pyproject.toml @@ -0,0 +1,17 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "comfyui-workflow-templates-media-image" +version = "0.3.1" +description = "Media bundle containing image workflow assets" +readme = {text = "Media bundle containing image workflow assets for ComfyUI.", content-type = "text/plain"} +requires-python = ">=3.9" +license = "MIT" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +comfyui_workflow_templates_media_image = ["templates/*"] diff --git a/packages/media_image/src/comfyui_workflow_templates_media_image/__init__.py b/packages/media_image/src/comfyui_workflow_templates_media_image/__init__.py new file mode 100644 index 00000000..3151e038 --- /dev/null +++ b/packages/media_image/src/comfyui_workflow_templates_media_image/__init__.py @@ -0,0 +1,6 @@ +""" +Media bundle: image-centric workflows. + +Static assets live under `templates/` within this package. Content is +populated during the build step. +""" diff --git a/packages/media_other/project.json b/packages/media_other/project.json new file mode 100644 index 00000000..75ee56f5 --- /dev/null +++ b/packages/media_other/project.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://raw.githubusercontent.com/nrwl/nx/master/packages/nx/schemas/project-schema.json", + "name": "media-other", + "projectType": "library", + "sourceRoot": "packages/media_other/src", + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "cwd": "packages/media_other", + "command": "python3 -m build" + }, + "dependsOn": [ + { + "projects": "tooling", + "target": "sync" + } + ] + } + }, + "tags": [], + "implicitDependencies": ["core"] +} diff --git a/packages/media_other/pyproject.toml b/packages/media_other/pyproject.toml new file mode 100644 index 00000000..507efb7c --- /dev/null +++ b/packages/media_other/pyproject.toml @@ -0,0 +1,17 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "comfyui-workflow-templates-media-other" +version = "0.3.1" +description = "Media bundle containing audio/3D/misc workflow assets" +readme = {text = "Media bundle containing audio, 3D, and other workflow assets for ComfyUI.", content-type = "text/plain"} +requires-python = ">=3.9" +license = "MIT" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +comfyui_workflow_templates_media_other = ["templates/*"] diff --git a/packages/media_other/src/comfyui_workflow_templates_media_other/__init__.py b/packages/media_other/src/comfyui_workflow_templates_media_other/__init__.py new file mode 100644 index 00000000..3db7c698 --- /dev/null +++ b/packages/media_other/src/comfyui_workflow_templates_media_other/__init__.py @@ -0,0 +1,6 @@ +""" +Media bundle: audio, 3D, depth, and miscellaneous workflows. + +Static assets live under `templates/` within this package. Content is +populated during the build step. +""" diff --git a/packages/media_video/project.json b/packages/media_video/project.json new file mode 100644 index 00000000..a5c7a661 --- /dev/null +++ b/packages/media_video/project.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://raw.githubusercontent.com/nrwl/nx/master/packages/nx/schemas/project-schema.json", + "name": "media-video", + "projectType": "library", + "sourceRoot": "packages/media_video/src", + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "cwd": "packages/media_video", + "command": "python3 -m build" + }, + "dependsOn": [ + { + "projects": "tooling", + "target": "sync" + } + ] + } + }, + "tags": [], + "implicitDependencies": ["core"] +} diff --git a/packages/media_video/pyproject.toml b/packages/media_video/pyproject.toml new file mode 100644 index 00000000..933337c5 --- /dev/null +++ b/packages/media_video/pyproject.toml @@ -0,0 +1,17 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "comfyui-workflow-templates-media-video" +version = "0.3.1" +description = "Media bundle containing video workflow assets" +readme = {text = "Media bundle containing video workflow assets for ComfyUI.", content-type = "text/plain"} +requires-python = ">=3.9" +license = "MIT" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.setuptools.package-data] +comfyui_workflow_templates_media_video = ["templates/*"] diff --git a/packages/media_video/src/comfyui_workflow_templates_media_video/__init__.py b/packages/media_video/src/comfyui_workflow_templates_media_video/__init__.py new file mode 100644 index 00000000..c593a402 --- /dev/null +++ b/packages/media_video/src/comfyui_workflow_templates_media_video/__init__.py @@ -0,0 +1,6 @@ +""" +Media bundle: video workflows. + +Static assets live under `templates/` within this package. Content is +populated during the build step. +""" diff --git a/packages/meta/project.json b/packages/meta/project.json new file mode 100644 index 00000000..6acac827 --- /dev/null +++ b/packages/meta/project.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://raw.githubusercontent.com/nrwl/nx/master/packages/nx/schemas/project-schema.json", + "name": "meta", + "projectType": "library", + "sourceRoot": "packages/meta/src", + "targets": { + "build": { + "executor": "nx:run-commands", + "options": { + "cwd": "packages/meta", + "command": "python3 -m build" + }, + "dependsOn": [ + { + "projects": "tooling", + "target": "sync" + } + ] + } + }, + "tags": [], + "implicitDependencies": [ + "core", + "media-api", + "media-video", + "media-image", + "media-other" + ] +} diff --git a/packages/meta/pyproject.toml b/packages/meta/pyproject.toml new file mode 100644 index 00000000..43053e80 --- /dev/null +++ b/packages/meta/pyproject.toml @@ -0,0 +1,33 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "comfyui-workflow-templates" +version = "0.3.1" +description = "Meta package for ComfyUI workflow templates" +readme = {text = "Meta package that depends on all ComfyUI workflow template bundles.", content-type = "text/plain"} +requires-python = ">=3.9" +license = "MIT" +dependencies = [ + "comfyui-workflow-templates-core>=0.3.1", + "comfyui-workflow-templates-media-api>=0.3.1", + "comfyui-workflow-templates-media-video>=0.3.1", + "comfyui-workflow-templates-media-image>=0.3.1", + "comfyui-workflow-templates-media-other>=0.3.1" +] + +[project.optional-dependencies] +api = ["comfyui-workflow-templates-media-api>=0.3.1"] +video = ["comfyui-workflow-templates-media-video>=0.3.1"] +image = ["comfyui-workflow-templates-media-image>=0.3.1"] +other = ["comfyui-workflow-templates-media-other>=0.3.1"] +all = [ + "comfyui-workflow-templates-media-api>=0.3.1", + "comfyui-workflow-templates-media-video>=0.3.1", + "comfyui-workflow-templates-media-image>=0.3.1", + "comfyui-workflow-templates-media-other>=0.3.1" +] + +[tool.setuptools.packages.find] +where = ["src"] diff --git a/packages/meta/src/comfyui_workflow_templates/__init__.py b/packages/meta/src/comfyui_workflow_templates/__init__.py new file mode 100644 index 00000000..3aa19166 --- /dev/null +++ b/packages/meta/src/comfyui_workflow_templates/__init__.py @@ -0,0 +1,37 @@ +""" +Meta-package wrapper that re-exports core manifest helpers while +keeping the original import path (`comfyui_workflow_templates`) stable. +""" + +from __future__ import annotations + +from comfyui_workflow_templates_core import ( + get_asset_path, + get_template_entry, + iter_templates, + load_manifest, + resolve_all_assets, +) + +__all__ = [ + "get_asset_path", + "get_template_entry", + "iter_templates", + "load_manifest", + "resolve_all_assets", + "get_templates_path", +] + + +def get_templates_path() -> str: + """ + Legacy helper retained for compatibility. + + Multi-bundle distribution no longer exposes a single `templates/` + directory, so this function now raises to encourage callers to use + `get_asset_path`/`resolve_all_assets` instead. + """ + raise RuntimeError( + "get_templates_path() is no longer supported. " + "Use get_asset_path(template_id, filename) to access assets." + ) diff --git a/pyproject.toml b/pyproject.toml index 365e1d9d..004ca298 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,11 +4,12 @@ build-backend = "setuptools.build_meta" [project] name = "comfyui_workflow_templates" -version = "0.2.11" +version = "0.3.1" description = "ComfyUI workflow templates package" readme = "README.md" requires-python = ">=3.9" -license = {file = "LICENSE"} +license = "MIT" +license-files = ["LICENSE"] authors = [ {name = "Comfy-Org"} ] @@ -17,3 +18,33 @@ classifiers = [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] + +dependencies = [ + "comfyui-workflow-templates-core>=0.3.1", + "comfyui-workflow-templates-media-api>=0.3.1", + "comfyui-workflow-templates-media-video>=0.3.1", + "comfyui-workflow-templates-media-image>=0.3.1", + "comfyui-workflow-templates-media-other>=0.3.1", +] + +[project.optional-dependencies] +api = ["comfyui-workflow-templates-media-api>=0.3.1"] +video = ["comfyui-workflow-templates-media-video>=0.3.1"] +image = ["comfyui-workflow-templates-media-image>=0.3.1"] +other = ["comfyui-workflow-templates-media-other>=0.3.1"] +all = [ + "comfyui-workflow-templates-media-api>=0.3.1", + "comfyui-workflow-templates-media-video>=0.3.1", + "comfyui-workflow-templates-media-image>=0.3.1", + "comfyui-workflow-templates-media-other>=0.3.1", +] + +[tool.setuptools.packages.find] +where = ["packages/meta/src"] + +[tool.ruff] +line-length = 100 +target-version = "py312" + +[tool.ruff.lint] +select = ["E", "F"] diff --git a/run_full_validation.sh b/run_full_validation.sh new file mode 100755 index 00000000..f9ad1b80 --- /dev/null +++ b/run_full_validation.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -euo pipefail + +python3 scripts/sync_bundles.py + +python3 -m venv .venv +source .venv/bin/activate + +python -m pip install --upgrade pip build pytest twine ruff aiohttp + +rm -rf dist +mkdir dist + +for pkg in core media_api media_video media_image media_other meta; do + python -m build --outdir dist "packages/${pkg}" +done + +ruff check scripts/sync_bundles.py packages/core packages/meta + +pytest packages/core/tests + +twine check dist/* diff --git a/scripts/bump_versions.py b/scripts/bump_versions.py new file mode 100755 index 00000000..5e7dce96 --- /dev/null +++ b/scripts/bump_versions.py @@ -0,0 +1,275 @@ +#!/usr/bin/env python3 +"""Auto-bump package versions when relevant files change. + +Usage examples: + python3 scripts/bump_versions.py # uses latest git tag as base + python3 scripts/bump_versions.py --base-ref v0.3.0 + python3 scripts/bump_versions.py --dry-run + +The script compares the working tree (HEAD) with the previous release tag, +figures out which packages/assets changed, bumps the patch version for those +packages, and keeps dependency constraints in sync. +""" +from __future__ import annotations + +import argparse +import json +import re +import subprocess +from dataclasses import dataclass +from pathlib import Path +import os +from typing import Dict, Iterable, List, Mapping, Set + +ROOT = Path( + os.environ.get("WORKFLOW_TEMPLATES_ROOT", Path(__file__).resolve().parents[1]) +) +BUNDLES_FILE = ROOT / "bundles.json" + +def run_git(args: List[str]) -> str: + return ( + subprocess.check_output(["git", *args], cwd=ROOT, stderr=subprocess.PIPE) + .decode() + .strip() + ) + + +def default_base_ref() -> str: + try: + return run_git(["describe", "--tags", "--abbrev=0"]) + except subprocess.CalledProcessError as exc: # pragma: no cover - defensive + raise SystemExit("Unable to determine base tag. Pass --base-ref explicitly.") from exc + + +@dataclass +class PackageConfig: + name: str + paths: List[str] + pyproject_paths: List[Path] + pip_name: str + + +PACKAGE_CONFIGS: Dict[str, PackageConfig] = { + "core": PackageConfig( + name="core", + paths=["packages/core"], + pyproject_paths=[ROOT / "packages/core/pyproject.toml"], + pip_name="comfyui-workflow-templates-core", + ), + "media_api": PackageConfig( + name="media_api", + paths=["packages/media_api"], + pyproject_paths=[ROOT / "packages/media_api/pyproject.toml"], + pip_name="comfyui-workflow-templates-media-api", + ), + "media_video": PackageConfig( + name="media_video", + paths=["packages/media_video"], + pyproject_paths=[ROOT / "packages/media_video/pyproject.toml"], + pip_name="comfyui-workflow-templates-media-video", + ), + "media_image": PackageConfig( + name="media_image", + paths=["packages/media_image"], + pyproject_paths=[ROOT / "packages/media_image/pyproject.toml"], + pip_name="comfyui-workflow-templates-media-image", + ), + "media_other": PackageConfig( + name="media_other", + paths=["packages/media_other"], + pyproject_paths=[ROOT / "packages/media_other/pyproject.toml"], + pip_name="comfyui-workflow-templates-media-other", + ), + "meta": PackageConfig( + name="meta", + paths=["packages/meta", "pyproject.toml"], + pyproject_paths=[ + ROOT / "packages/meta/pyproject.toml", + ROOT / "pyproject.toml", + ], + pip_name="comfyui-workflow-templates", + ), +} + +BUNDLE_TO_PACKAGE = { + "media-api": "media_api", + "media-video": "media_video", + "media-image": "media_image", + "media-other": "media_other", +} + +VERSION_RE = re.compile(r"^(version\s*=\s*)\"(\d+\.\d+\.\d+)\"", re.MULTILINE) +def dependency_regex(pip_name: str) -> re.Pattern[str]: + escaped = re.escape(pip_name) + return re.compile(rf'("{escaped}>=)(\d+\.\d+\.\d+)(")') + + +def load_versions() -> Dict[str, str]: + versions = {} + for pkg, cfg in PACKAGE_CONFIGS.items(): + text = cfg.pyproject_paths[0].read_text() + match = VERSION_RE.search(text) + if not match: # pragma: no cover - file corruption safeguard + raise SystemExit(f"Unable to find version in {cfg.pyproject_paths[0]}") + versions[pkg] = match.group(2) + return versions + + +def bump_patch(version: str) -> str: + major, minor, patch = version.split(".") + return f"{major}.{minor}.{int(patch) + 1}" + + +def git_changed_files(base_ref: str) -> List[str]: + if not base_ref: + return [] + out = run_git(["diff", f"{base_ref}..HEAD", "--name-only"]) + return [line.strip() for line in out.splitlines() if line.strip()] + + +def load_bundles_from_git(ref: str) -> Mapping[str, List[str]]: + try: + raw = run_git(["show", f"{ref}:bundles.json"]) + return json.loads(raw) + except subprocess.CalledProcessError: + return {} + + +def template_bundle_map(bundles: Mapping[str, Iterable[str]]) -> Dict[str, str]: + mapping = {} + for bundle, template_ids in bundles.items(): + pkg = BUNDLE_TO_PACKAGE.get(bundle) + if not pkg: + continue + for template_id in template_ids: + mapping[template_id] = pkg + return mapping + + +def detect_bundle_changes(base_ref: str) -> Set[str]: + if not base_ref: + return set() + head_bundles = json.loads(BUNDLES_FILE.read_text()) + base_bundles = load_bundles_from_git(base_ref) + head_map = template_bundle_map(head_bundles) + base_map = template_bundle_map(base_bundles) + + changed = set() + bundle_keys = set(head_bundles.keys()) | set(base_bundles.keys()) + for bundle in bundle_keys: + head_set = set(head_bundles.get(bundle, [])) + base_set = set(base_bundles.get(bundle, [])) + delta = head_set.symmetric_difference(base_set) + for template_id in delta: + pkg = head_map.get(template_id) or base_map.get(template_id) + if pkg: + changed.add(pkg) + return changed + + +def detect_template_asset_changes(changed_files: Iterable[str]) -> Set[str]: + head_map = template_bundle_map(json.loads(BUNDLES_FILE.read_text())) + template_ids_sorted = sorted(head_map.keys(), key=len, reverse=True) + affected = set() + for rel_path in changed_files: + if not rel_path.startswith("templates/"): + continue + filename = Path(rel_path).name + for template_id in template_ids_sorted: + if filename.startswith(template_id): + affected.add(head_map[template_id]) + break + return affected + + +def packages_changed_from_paths(changed_files: Iterable[str]) -> Set[str]: + affected = set() + for rel_path in changed_files: + for pkg, cfg in PACKAGE_CONFIGS.items(): + for path in cfg.paths: + if path.endswith(".toml"): + if rel_path == path: + affected.add(pkg) + else: + if rel_path == path or rel_path.startswith(f"{path}/"): + affected.add(pkg) + return affected + + +def packages_to_bump(base_ref: str) -> Set[str]: + changed = git_changed_files(base_ref) + affected = packages_changed_from_paths(changed) + affected |= detect_template_asset_changes(changed) + affected |= detect_bundle_changes(base_ref) + + # If any of the component bundles changed, make sure meta gets bumped too + if affected & {"core", "media_api", "media_image", "media_other", "media_video"}: + affected.add("meta") + return affected + + +def write_version(path: Path, new_version: str) -> None: + text = path.read_text() + updated, count = VERSION_RE.subn(rf'\1"{new_version}"', text, count=1) + if count == 0: # pragma: no cover - guard + raise SystemExit(f"Failed to update version in {path}") + path.write_text(updated) + + +def update_dependencies(pyproject_path: Path, versions: Mapping[str, str]) -> None: + text = pyproject_path.read_text() + for pkg, cfg in PACKAGE_CONFIGS.items(): + pattern = dependency_regex(cfg.pip_name) + text = pattern.sub(rf"\g<1>{versions[pkg]}\g<3>", text) + pyproject_path.write_text(text) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Bump package versions based on git diff") + parser.add_argument( + "--base-ref", + help="Git ref/tag to diff against (defaults to last annotated tag)", + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="Show planned bumps without modifying files", + ) + return parser.parse_args() + + +def main() -> None: + args = parse_args() + base_ref = args.base_ref or default_base_ref() + affected_packages = packages_to_bump(base_ref) + + if not affected_packages: + print(f"No package changes detected relative to {base_ref}.") + return + + current_versions = load_versions() + next_versions = current_versions.copy() + for pkg in affected_packages: + next_versions[pkg] = bump_patch(current_versions[pkg]) + + print(f"Base reference: {base_ref}") + for pkg in sorted(affected_packages): + print(f" - {pkg}: {current_versions[pkg]} -> {next_versions[pkg]}") + + if args.dry_run: + print("Dry run requested; no files updated.") + return + + for pkg in affected_packages: + for pyproject in PACKAGE_CONFIGS[pkg].pyproject_paths: + write_version(pyproject, next_versions[pkg]) + + # Keep root/meta dependency constraints in sync with actual versions + update_dependencies(ROOT / "pyproject.toml", next_versions) + update_dependencies(ROOT / "packages/meta/pyproject.toml", next_versions) + + print("Updated pyproject files. Don't forget to commit the changes.") + + +if __name__ == "__main__": + main() diff --git a/scripts/report_bundle_sizes.py b/scripts/report_bundle_sizes.py new file mode 100755 index 00000000..35c2a211 --- /dev/null +++ b/scripts/report_bundle_sizes.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +"""Print the total disk usage per bundle as defined in bundles.json.""" + +from __future__ import annotations + +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +TEMPLATES_DIR = ROOT / "templates" +BUNDLES_FILE = ROOT / "bundles.json" + + +def bytes_to_mb(size: int) -> float: + return size / (1024 * 1024) + + +def gather_sizes() -> dict[str, int]: + bundles = json.loads(BUNDLES_FILE.read_text()) + totals: dict[str, int] = {bundle: 0 for bundle in bundles} + + for bundle, template_ids in bundles.items(): + for template_id in template_ids: + for path in TEMPLATES_DIR.glob(f"{template_id}*"): + totals[bundle] += path.stat().st_size + return totals + + +def main() -> None: + totals = gather_sizes() + grand_total = sum(totals.values()) + + print("Bundle size report (MB):") + for bundle, size in sorted(totals.items(), key=lambda item: item[1], reverse=True): + print(f" {bundle:12s}: {bytes_to_mb(size):6.2f} MB") + print(f" {'total':12s}: {bytes_to_mb(grand_total):6.2f} MB") + + +if __name__ == "__main__": + main() diff --git a/scripts/sync_bundles.py b/scripts/sync_bundles.py new file mode 100644 index 00000000..4e7edbaf --- /dev/null +++ b/scripts/sync_bundles.py @@ -0,0 +1,245 @@ +#!/usr/bin/env python3 +""" +Sync manifest and bundle package assets for the ComfyUI workflow templates. + +Reads `bundles.json` to determine which templates belong to each media package, +hashes every workflow/asset, writes the consolidated manifest into the core +package, and mirrors assets into the bundle package directories. A copy of the +manifest is saved to `prd/phase1-manifest-sample.json` for review. +""" + +import argparse +import hashlib +import json +import shutil +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +TEMPLATES_DIR = ROOT / "templates" +CORE_MANIFEST = ( + ROOT + / "packages" + / "core" + / "src" + / "comfyui_workflow_templates_core" + / "manifest.json" +) +SAMPLE_MANIFEST = ROOT / "prd" / "phase1-manifest-sample.json" + +BUNDLE_TARGETS = { + "media-api": ROOT + / "packages" + / "media_api" + / "src" + / "comfyui_workflow_templates_media_api" + / "templates", + "media-video": ROOT + / "packages" + / "media_video" + / "src" + / "comfyui_workflow_templates_media_video" + / "templates", + "media-image": ROOT + / "packages" + / "media_image" + / "src" + / "comfyui_workflow_templates_media_image" + / "templates", + "media-other": ROOT + / "packages" + / "media_other" + / "src" + / "comfyui_workflow_templates_media_other" + / "templates", +} +BUNDLES_CONFIG = ROOT / "bundles.json" + +def sha256_for_file(path: Path) -> str: + h = hashlib.sha256() + with path.open("rb") as f: + for chunk in iter(lambda: f.read(1024 * 1024), b""): + h.update(chunk) + return h.hexdigest() + + +def load_template_data(template_id: str): + json_path = TEMPLATES_DIR / f"{template_id}.json" + try: + with json_path.open("r", encoding="utf-8") as f: + return json.load(f) + except Exception as exc: + raise SystemExit(f"Failed to parse template JSON '{json_path}': {exc}") + + +def load_bundles_config() -> dict: + if not BUNDLES_CONFIG.exists(): + raise SystemExit(f"Bundle configuration not found: {BUNDLES_CONFIG}") + with BUNDLES_CONFIG.open("r", encoding="utf-8") as f: + data = json.load(f) + if not isinstance(data, dict): + raise SystemExit("`bundles.json` must map bundle names to template id lists.") + + valid_bundles = set(BUNDLE_TARGETS.keys()) + unknown_bundles = set(data.keys()) - valid_bundles + if unknown_bundles: + raise SystemExit( + "Unknown bundle(s) in bundles.json: " + ", ".join(sorted(unknown_bundles)) + ) + + normalized = {} + seen = set() + for bundle, entries in data.items(): + if not isinstance(entries, list): + raise SystemExit(f"Bundle '{bundle}' must contain a list of template ids.") + normalized[bundle] = [] + for template_id in sorted(entries): + if not isinstance(template_id, str): + raise SystemExit( + f"Template id '{template_id}' under bundle '{bundle}' must be a string." + ) + if template_id in seen: + raise SystemExit( + f"Template '{template_id}' assigned more than once in bundles.json." + ) + seen.add(template_id) + normalized[bundle].append(template_id) + return normalized + + +def build_manifest(): + bundle_map = load_bundles_config() + + declared_templates = {tpl for templates in bundle_map.values() for tpl in templates} + on_disk_templates = { + entry.name[:-5] for entry in TEMPLATES_DIR.iterdir() if entry.name.endswith(".json") + } + + missing_from_manifest = sorted(on_disk_templates - declared_templates) + if missing_from_manifest: + raise SystemExit( + "bundles.json is missing template assignments for: " + + ", ".join(missing_from_manifest) + ) + + missing_on_disk = sorted(declared_templates - on_disk_templates) + if missing_on_disk: + raise SystemExit( + "bundles.json references templates that do not exist: " + + ", ".join(missing_on_disk) + ) + + templates = [] + for bundle, template_ids in bundle_map.items(): + for template_id in template_ids: + _ = load_template_data(template_id) # ensure JSON is readable + assets = [] + json_name = f"{template_id}.json" + json_path = TEMPLATES_DIR / json_name + if json_path.exists(): + assets.append( + { + "filename": json_name, + "sha256": sha256_for_file(json_path), + } + ) + media_patterns = [ + f"{template_id}*.webp", + f"{template_id}*.png", + f"{template_id}*.jpg", + f"{template_id}*.jpeg", + f"{template_id}*.gif", + f"{template_id}*.mp4", + f"{template_id}*.webm", + f"{template_id}*.mp3", + f"{template_id}*.wav", + f"{template_id}*.ogg", + f"{template_id}*.flac", + f"{template_id}*.m4a", + ] + seen = set() + for pattern in media_patterns: + for asset_path in sorted(TEMPLATES_DIR.glob(pattern)): + if asset_path.name in seen: + continue + seen.add(asset_path.name) + assets.append( + { + "filename": asset_path.name, + "sha256": sha256_for_file(asset_path), + } + ) + templates.append( + { + "id": template_id, + "bundle": bundle, + "version": "0.0.0", # placeholder for bundle version + "assets": assets, + "cdn": {"path": f"{bundle}/{template_id}/"}, + } + ) + + manifest = { + "manifest_version": 1, + "bundles": { + "media-api": {"version": "0.0.0"}, + "media-video": {"version": "0.0.0"}, + "media-image": {"version": "0.0.0"}, + "media-other": {"version": "0.0.0"}, + }, + "templates": templates, + } + return manifest + + +def sync_bundle_directories(manifest: dict, dry_run: bool = False) -> None: + if dry_run: + return + + for target in BUNDLE_TARGETS.values(): + if target.exists(): + shutil.rmtree(target) + target.mkdir(parents=True, exist_ok=True) + + for template in manifest["templates"]: + bundle = template["bundle"] + target_root = BUNDLE_TARGETS[bundle] + for asset in template["assets"]: + src = TEMPLATES_DIR / asset["filename"] + if not src.exists(): + # Some optional assets (e.g., preview) may not exist; skip silently. + continue + shutil.copy2(src, target_root / asset["filename"]) + + +def write_manifest(manifest: dict, dry_run: bool = False) -> None: + payload = json.dumps(manifest, indent=2) + SAMPLE_MANIFEST.parent.mkdir(parents=True, exist_ok=True) + SAMPLE_MANIFEST.write_text(payload) + if dry_run: + return + CORE_MANIFEST.parent.mkdir(parents=True, exist_ok=True) + CORE_MANIFEST.write_text(payload) + + +def main(): + parser = argparse.ArgumentParser(description="Generate manifest and sync media bundles.") + parser.add_argument( + "--dry-run", + action="store_true", + help="Only regenerate sample manifest (no copying into package directories).", + ) + args = parser.parse_args() + + if not TEMPLATES_DIR.exists(): + raise SystemExit(f"Templates directory not found: {TEMPLATES_DIR}") + manifest = build_manifest() + write_manifest(manifest, dry_run=args.dry_run) + sync_bundle_directories(manifest, dry_run=args.dry_run) + target = CORE_MANIFEST if not args.dry_run else SAMPLE_MANIFEST + print(f"Wrote manifest to {target}") + if not args.dry_run: + print("Synced media assets into package directories.") + + +if __name__ == "__main__": + main() diff --git a/scripts/upload_all_packages.sh b/scripts/upload_all_packages.sh new file mode 100755 index 00000000..ebb7f7c5 --- /dev/null +++ b/scripts/upload_all_packages.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +PACKAGES=(core media_api media_video media_image media_other) + +for pkg in "${PACKAGES[@]}"; do + twine upload dist/comfyui_workflow_templates_${pkg}-*.whl dist/comfyui_workflow_templates_${pkg}-*.tar.gz + echo "Uploaded comfyui_workflow_templates_${pkg}" +done + +twine upload dist/comfyui_workflow_templates-*.whl dist/comfyui_workflow_templates-*.tar.gz diff --git a/tools/project.json b/tools/project.json new file mode 100644 index 00000000..5074fd41 --- /dev/null +++ b/tools/project.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://raw.githubusercontent.com/nrwl/nx/master/packages/nx/schemas/project-schema.json", + "name": "tooling", + "projectType": "application", + "root": "tools", + "targets": { + "sync": { + "executor": "nx:run-commands", + "options": { + "command": "python3 scripts/sync_bundles.py" + } + } + } +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 00000000..cdc5de2d --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "rootDir": ".", + "baseUrl": ".", + "paths": {} + }, + "exclude": ["node_modules", "tmp"] +}