diffusers-workflow 0.7.0__tar.gz → 0.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {diffusers_workflow-0.7.0/diffusers_workflow.egg-info → diffusers_workflow-0.9.0}/PKG-INFO +2 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/README.md +1 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0/diffusers_workflow.egg-info}/PKG-INFO +2 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/diffusers_workflow.egg-info/SOURCES.txt +46 -21
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/assets.py +5 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/ARCHITECTURE.md +23 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/LORAS.md +66 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/MCP.md +8 -5
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/RELEASING.md +197 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/REMOTE.md +5 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/SECURITY.md +1 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/SERVER.md +29 -4
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/WORKFLOW_GUIDE.md +241 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/WORKSPACES.md +6 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/events.py +6 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/introspection.py +5 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/library.py +25 -3
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/locations.py +53 -18
- diffusers_workflow-0.9.0/dw/lora_catalog.py +134 -0
- diffusers_workflow-0.9.0/dw/lora_catalog_schema.json +57 -0
- diffusers_workflow-0.9.0/dw/lora_hub.py +237 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/media.py +11 -5
- diffusers_workflow-0.9.0/dw/path_redaction.py +72 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/plan.py +67 -13
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/run.py +2 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/security.py +20 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/admission.py +31 -13
- diffusers_workflow-0.9.0/dw/server/api_models.py +824 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/app.py +26 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/assess.py +44 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/deps.py +21 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/guides.py +1 -1
- diffusers_workflow-0.9.0/dw/server/inline_media.py +131 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/jobs.py +21 -8
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/outputs.py +65 -4
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/routes/__init__.py +2 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/routes/assets.py +24 -4
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/routes/files.py +3 -3
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/routes/gallery.py +28 -38
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/routes/jobs.py +115 -17
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/routes/library.py +132 -36
- diffusers_workflow-0.9.0/dw/server/routes/loras.py +275 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/routes/media.py +102 -19
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/routes/system.py +72 -17
- diffusers_workflow-0.7.0/dw/server/ui/assets/cssMode-DQI1FUIr.js → diffusers_workflow-0.9.0/dw/server/ui/assets/cssMode-C1mrKegs.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/editor.api-a3j9A86u.js → diffusers_workflow-0.9.0/dw/server/ui/assets/editor.api-EZbUgQvM.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/freemarker2-BcdiHyGC.js → diffusers_workflow-0.9.0/dw/server/ui/assets/freemarker2-Dth1K2Vy.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/handlebars-DCj-aPE8.js → diffusers_workflow-0.9.0/dw/server/ui/assets/handlebars-8Sswqnxq.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/html-D8xomw9g.js → diffusers_workflow-0.9.0/dw/server/ui/assets/html-BYtYo7f1.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/htmlMode-DK_n-eew.js → diffusers_workflow-0.9.0/dw/server/ui/assets/htmlMode-B_AiWoXc.js +1 -1
- diffusers_workflow-0.9.0/dw/server/ui/assets/index-B6Ujrvuj.js +45 -0
- diffusers_workflow-0.9.0/dw/server/ui/assets/index-BChhQc7I.css +1 -0
- diffusers_workflow-0.7.0/dw/server/ui/assets/javascript-SmmG4uTF.js → diffusers_workflow-0.9.0/dw/server/ui/assets/javascript-E4m083D3.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/jsonMode-BRyslvRu.js → diffusers_workflow-0.9.0/dw/server/ui/assets/jsonMode--h7ZikWy.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/liquid-CC4C0BTL.js → diffusers_workflow-0.9.0/dw/server/ui/assets/liquid-BzbKdLRW.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/lspLanguageFeatures-Cmg2_33_.js → diffusers_workflow-0.9.0/dw/server/ui/assets/lspLanguageFeatures-CRa0bRFV.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/mdx-DTAejllH.js → diffusers_workflow-0.9.0/dw/server/ui/assets/mdx-BJ4u6XQs.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/monaco-C_Um4bRZ.js → diffusers_workflow-0.9.0/dw/server/ui/assets/monaco-DwaeaVri.js +4 -4
- diffusers_workflow-0.7.0/dw/server/ui/assets/python-DKASw3vF.js → diffusers_workflow-0.9.0/dw/server/ui/assets/python-CoX_gCAL.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/razor-CkEOBTMa.js → diffusers_workflow-0.9.0/dw/server/ui/assets/razor-BCTdG5SN.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/tsMode-CmkUIEUu.js → diffusers_workflow-0.9.0/dw/server/ui/assets/tsMode-B6BV7a76.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/typescript-BXTFUpwg.js → diffusers_workflow-0.9.0/dw/server/ui/assets/typescript-DJe7-fvZ.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/workers-Cpj1l6gK.js → diffusers_workflow-0.9.0/dw/server/ui/assets/workers-DCzLJTPE.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/xml-D1BkO5yz.js → diffusers_workflow-0.9.0/dw/server/ui/assets/xml-CNvWfUrB.js +1 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/yaml-CDFThBDz.js → diffusers_workflow-0.9.0/dw/server/ui/assets/yaml-ByARP6WE.js +1 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/index.html +2 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/task_domains.py +1 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/audio_utils.py +9 -4
- diffusers_workflow-0.9.0/dw/tasks/h3_latent_upscale.py +341 -0
- diffusers_workflow-0.9.0/dw/tasks/h3_latent_upscaler_model.py +274 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/joins.py +10 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/loop_bed.py +9 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/task.py +74 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/worker.py +24 -3
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/workspace.py +5 -3
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/__main__.py +1 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/assets.py +25 -82
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/authoring.py +5 -31
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/catalog.py +9 -23
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/client.py +75 -53
- diffusers_workflow-0.9.0/dw_mcp/confine.py +70 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/diagnose.py +32 -23
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/exports.py +15 -12
- diffusers_workflow-0.9.0/dw_mcp/loras.py +29 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/media.py +84 -254
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/server.py +12 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/tools_authoring.py +37 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/tools_catalog.py +2 -4
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/tools_jobs.py +10 -11
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/tools_media.py +4 -4
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/workspaces.py +17 -31
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/pyproject.toml +3 -1
- diffusers_workflow-0.9.0/tests/test_api_contract.py +597 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_arch_report.py +20 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_assemble_and_score_target_lufs.py +12 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_audio_utils.py +3 -0
- diffusers_workflow-0.9.0/tests/test_ci_config.py +26 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_concat_videos.py +17 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_events.py +22 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_find_loop_bed.py +9 -0
- diffusers_workflow-0.9.0/tests/test_h3_latent_upscale.py +471 -0
- diffusers_workflow-0.9.0/tests/test_h3_upscaler_source.py +174 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_library_sources.py +7 -2
- diffusers_workflow-0.9.0/tests/test_lora_catalog.py +265 -0
- diffusers_workflow-0.9.0/tests/test_lora_hub.py +326 -0
- diffusers_workflow-0.9.0/tests/test_lora_library.py +115 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_assets.py +34 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_authoring.py +10 -36
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_catalog.py +23 -23
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_client.py +65 -28
- diffusers_workflow-0.9.0/tests/test_mcp_confine.py +81 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_diagnose.py +24 -3
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_exports.py +11 -4
- diffusers_workflow-0.9.0/tests/test_mcp_loras.py +58 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_main.py +16 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_media.py +159 -325
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_server.py +55 -13
- diffusers_workflow-0.9.0/tests/test_mcp_twins.py +224 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_workspaces.py +31 -37
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_modular_output_properties.py +81 -2
- diffusers_workflow-0.9.0/tests/test_path_redaction.py +57 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_plan.py +81 -4
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_plugin_skills.py +35 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_security_auth.py +13 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_security_decoder_bombs.py +39 -47
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server.py +174 -2
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server_assess.py +61 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server_exports.py +15 -6
- diffusers_workflow-0.9.0/tests/test_server_gallery_image.py +188 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server_guides.py +17 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server_jobs.py +120 -1
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server_library_path.py +66 -0
- diffusers_workflow-0.9.0/tests/test_server_loras.py +375 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_shots.py +1 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_step_cache.py +8 -4
- diffusers_workflow-0.9.0/tests/test_ui_twins.py +302 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_worker_execute.py +29 -0
- diffusers_workflow-0.7.0/dw/server/ui/assets/index-3Vw6WAPW.css +0 -1
- diffusers_workflow-0.7.0/dw/server/ui/assets/index-CNiY-pOw.js +0 -44
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/LICENSE +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/MANIFEST.in +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/diffusers_workflow.egg-info/requires.txt +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/__init__.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/adapter_compatibility.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/argument_media.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/argument_warnings.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/arguments.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/assessment_rules.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/audio_qc.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/cache_blocks.json +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/cache_blocks.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/content_types.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/dissolve_frame_errors.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/ACCELERATION.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/AGENT_LOOP.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/DEPENDENCIES.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/IP_ADAPTER.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/QUANTIZATION.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/RECIPES_24GB.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/TASKS.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/TESTING.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/docs/WORKER_GUIDE.md +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/download_watch.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/dsp.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/elision.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/for_each.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/host_memory.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/host_memory_projection.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/hub_cache.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/kernel_availability.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/log_setup.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/media_frames.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/media_types.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/output_extraction.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/pipeline_ownership.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/pipeline_processors/adapters.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/pipeline_processors/chain.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/pipeline_processors/components.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/pipeline_processors/config_objects.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/pipeline_processors/pipeline.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/pipeline_processors/placement.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/pipeline_processors/progress.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/pipeline_processors/remote.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/previous_results.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/probe_paths.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/prompt_schema.json +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/prompt_weighting.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/prompts.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/realize.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/reference_limits.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/reference_names.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/references.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/result.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/runs.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/scalar_result_validation.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/schema.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/serve.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/__init__.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/catalog.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/catalog_shape.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/enhancers.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/exports.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/http_security.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/job_history.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/job_record.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/mcp_mount.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/netinfo.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/observed_cost.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/sysinfo.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/css.worker-B3ciXF_0.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/editor-jjEx9u7D.css +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/html.worker-C93Ht9o9.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/monaco--ixms01u.css +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/ts.worker-D7T1-Ig5.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/server/updater.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/settings.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/shot_span_preflight.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/shots.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/slice_preflight.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/step.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/step_cache.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/step_value_checks.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/subfolders.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/assess.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/audio_dynamics.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/audio_transcription.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/background_remover.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/borders.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/compose_text.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/concat_videos.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/depth_estimator.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/diffusion_upscale.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/dissolve_videos.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/format_messages.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/gather.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/grade.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/image_to_text.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/image_utils.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/interpolate_frames.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/join_into_song.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/judge.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/model_cache.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/pair_audio.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/qr_code.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/restore_faces.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/rife_model.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/segment.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/select.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/speech_generation.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/stabilize.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/tensor_image.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/text_generation.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/text_sections.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/upscale.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/video_utils.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/voice_attribution.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/tasks/zoe_depth.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/test.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/trust.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/type_helpers.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/type_references.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/validate.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/validation.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/variable_constraints.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/variables.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/video_extensions.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/video_size_errors.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/vram_estimate.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/vram_inheritance.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/worker_manager.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/worker_protocol.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/workflow.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/workflow_run.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/workflow_schema.json +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/workflows/h3_context_ir.json +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/workflows/test.json +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw/writers.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/__init__.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/guides.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/models.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/dw_mcp/prompts.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/setup.cfg +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_admission.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_arch_metrics.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_architecture_map.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_argument_updates.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_arguments.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_assess.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_assessment_rules.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_assets.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_attention_slicing.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_best_of_n_template.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_borders.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_cache_blocks.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_catalog_shape.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_catalog_structure.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_chain.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_cli.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_component_name_errors.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_component_pruning.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_component_type_errors.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_compose_text.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_config_objects.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_configuration_schema.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_content_types.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_depth_estimator.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_device.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_device_helpers.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_device_portability.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_dialogue_short_voices.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_diffusion_upscale.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_dissolve_frame_errors.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_dissolve_videos.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_docs_links.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_download_watch.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_dsp.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_elision.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_examples.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_for_each.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_gather.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_grade.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_h3_adapters.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_h3_context_ir.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_h3_schedule.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_h3_vram_ceiling.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_hf_placement.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_host_memory.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_host_memory_projection.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_hub_cache.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_image_to_text.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_image_utils.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_integration.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_interpolate_frames.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_introspection.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_job_history_wal.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_job_progress.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_job_warnings.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_jobs_listing.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_jobs_reused.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_join_into_song.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_judge.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_kernel_availability.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_library_path.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_list_images.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_locations.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_lora_alpha.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_lora_disable.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_ltx2_diffusion_decode.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_ltx2_extend_clip.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_ltx2_ic_loras.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_ltx_prompt_library.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_guides.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_models.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mcp_prompts.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_media_audio.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_media_frames.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_media_info.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_media_layering.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mix_audio.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_model_cache.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_modular_pipeline.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_modular_progress.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mps_fallback_warning.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_mps_rope_precision.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_null_media.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_observed_cost.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_offload_placement.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_output_references.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_pair_audio.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_pair_audio_fit.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_parallel_loading_default.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_phase_events.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_pipeline_caching.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_pipeline_components.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_prepare_pipeline.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_previous_result_walker_parity.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_previous_results.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_prompt_library.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_prompt_parser.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_prompt_references.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_prompt_weighting.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_prompts.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_real_models.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_realize.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_recenter_crop.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_reference_limits.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_reference_names.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_reference_skip_sets.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_references.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_rerun_new_seed.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_resize_bucket.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_result.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_result_fps.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_result_output_naming.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_rule_parity.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_runs.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_scalar_result_validation.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_scheduler_config.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_schema.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_security.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_security_input_caps.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_security_ssrf.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_security_symlinks.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_security_trust_gate.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_security_web_headers.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_segment.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_select.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_select_validation.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_serve_main.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server_downloads.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server_info.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server_mcp.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_server_workspaces.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_shaping_logs.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_shot_span_preflight.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_slice_preflight.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_speech_generation.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_stabilize.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_step.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_strip_exif_and_watermark.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_sub_workflow_resolver.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_subfolders.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_task.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_task_discovery.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_task_domains.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_task_signature_errors.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_template_defaults.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_template_subfolders.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_tensor_image.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_text_generation.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_text_sections.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_transcribe_audio.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_type_helpers.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_updater.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_validate_arguments.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_validation.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_variable_constraints.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_variables.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_video_extensions.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_video_size_errors.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_video_utils.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_voice_attribution.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_vram_estimate.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_vram_inheritance.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_worker.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_worker_job_peak_rss.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_worker_manager.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_worker_messages.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_workflow.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_workflow_snapshot.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_workflow_step_cache.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_workflow_trust.py +0 -0
- {diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/tests/test_workspace.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diffusers-workflow
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
|
|
5
5
|
Author: dkackman
|
|
6
6
|
License: Apache-2.0
|
|
@@ -168,7 +168,7 @@ once; without it the run fails partway through with a 401/403 from the Hub.
|
|
|
168
168
|
|
|
169
169
|
## Drive it from an agent
|
|
170
170
|
|
|
171
|
-
Then just ask. The agent has
|
|
171
|
+
Then just ask. The agent has 62 tools covering the whole surface — the
|
|
172
172
|
workflow catalog, the real diffusers pipeline signatures, the job queue, the
|
|
173
173
|
gallery, the model cache:
|
|
174
174
|
|
|
@@ -83,7 +83,7 @@ once; without it the run fails partway through with a 401/403 from the Hub.
|
|
|
83
83
|
|
|
84
84
|
## Drive it from an agent
|
|
85
85
|
|
|
86
|
-
Then just ask. The agent has
|
|
86
|
+
Then just ask. The agent has 62 tools covering the whole surface — the
|
|
87
87
|
workflow catalog, the real diffusers pipeline signatures, the job queue, the
|
|
88
88
|
gallery, the model cache:
|
|
89
89
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: diffusers-workflow
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
|
|
5
5
|
Author: dkackman
|
|
6
6
|
License: Apache-2.0
|
|
@@ -168,7 +168,7 @@ once; without it the run fails partway through with a 401/403 from the Hub.
|
|
|
168
168
|
|
|
169
169
|
## Drive it from an agent
|
|
170
170
|
|
|
171
|
-
Then just ask. The agent has
|
|
171
|
+
Then just ask. The agent has 62 tools covering the whole surface — the
|
|
172
172
|
workflow catalog, the real diffusers pipeline signatures, the job queue, the
|
|
173
173
|
gallery, the model cache:
|
|
174
174
|
|
{diffusers_workflow-0.7.0 → diffusers_workflow-0.9.0}/diffusers_workflow.egg-info/SOURCES.txt
RENAMED
|
@@ -33,10 +33,14 @@ dw/kernel_availability.py
|
|
|
33
33
|
dw/library.py
|
|
34
34
|
dw/locations.py
|
|
35
35
|
dw/log_setup.py
|
|
36
|
+
dw/lora_catalog.py
|
|
37
|
+
dw/lora_catalog_schema.json
|
|
38
|
+
dw/lora_hub.py
|
|
36
39
|
dw/media.py
|
|
37
40
|
dw/media_frames.py
|
|
38
41
|
dw/media_types.py
|
|
39
42
|
dw/output_extraction.py
|
|
43
|
+
dw/path_redaction.py
|
|
40
44
|
dw/pipeline_ownership.py
|
|
41
45
|
dw/plan.py
|
|
42
46
|
dw/previous_results.py
|
|
@@ -115,6 +119,7 @@ dw/pipeline_processors/progress.py
|
|
|
115
119
|
dw/pipeline_processors/remote.py
|
|
116
120
|
dw/server/__init__.py
|
|
117
121
|
dw/server/admission.py
|
|
122
|
+
dw/server/api_models.py
|
|
118
123
|
dw/server/app.py
|
|
119
124
|
dw/server/assess.py
|
|
120
125
|
dw/server/catalog.py
|
|
@@ -124,6 +129,7 @@ dw/server/enhancers.py
|
|
|
124
129
|
dw/server/exports.py
|
|
125
130
|
dw/server/guides.py
|
|
126
131
|
dw/server/http_security.py
|
|
132
|
+
dw/server/inline_media.py
|
|
127
133
|
dw/server/job_history.py
|
|
128
134
|
dw/server/job_record.py
|
|
129
135
|
dw/server/jobs.py
|
|
@@ -139,6 +145,7 @@ dw/server/routes/files.py
|
|
|
139
145
|
dw/server/routes/gallery.py
|
|
140
146
|
dw/server/routes/jobs.py
|
|
141
147
|
dw/server/routes/library.py
|
|
148
|
+
dw/server/routes/loras.py
|
|
142
149
|
dw/server/routes/media.py
|
|
143
150
|
dw/server/routes/system.py
|
|
144
151
|
dw/server/ui/index.html
|
|
@@ -156,45 +163,45 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
|
|
|
156
163
|
dw/server/ui/assets/csp-bTuwJoIa.js
|
|
157
164
|
dw/server/ui/assets/css-DIMkf-bt.js
|
|
158
165
|
dw/server/ui/assets/css.worker-B3ciXF_0.js
|
|
159
|
-
dw/server/ui/assets/cssMode-
|
|
166
|
+
dw/server/ui/assets/cssMode-C1mrKegs.js
|
|
160
167
|
dw/server/ui/assets/cypher-CVaqCwHa.js
|
|
161
168
|
dw/server/ui/assets/dart-onAF5SnQ.js
|
|
162
169
|
dw/server/ui/assets/dockerfile-DZFCIeNp.js
|
|
163
170
|
dw/server/ui/assets/ecl-D05T4iGw.js
|
|
164
171
|
dw/server/ui/assets/editor-jjEx9u7D.css
|
|
165
|
-
dw/server/ui/assets/editor.api-
|
|
172
|
+
dw/server/ui/assets/editor.api-EZbUgQvM.js
|
|
166
173
|
dw/server/ui/assets/editor.worker-q-txB4vs.js
|
|
167
174
|
dw/server/ui/assets/elixir-6RTg0lbw.js
|
|
168
175
|
dw/server/ui/assets/flow9-C5_-GSwl.js
|
|
169
|
-
dw/server/ui/assets/freemarker2-
|
|
176
|
+
dw/server/ui/assets/freemarker2-Dth1K2Vy.js
|
|
170
177
|
dw/server/ui/assets/fsharp-C8Ef5oNN.js
|
|
171
178
|
dw/server/ui/assets/go-C-y9NEjX.js
|
|
172
179
|
dw/server/ui/assets/graphql-fmXr3nnJ.js
|
|
173
|
-
dw/server/ui/assets/handlebars-
|
|
180
|
+
dw/server/ui/assets/handlebars-8Sswqnxq.js
|
|
174
181
|
dw/server/ui/assets/hcl-CpzslTdj.js
|
|
175
|
-
dw/server/ui/assets/html-
|
|
182
|
+
dw/server/ui/assets/html-BYtYo7f1.js
|
|
176
183
|
dw/server/ui/assets/html.worker-C93Ht9o9.js
|
|
177
|
-
dw/server/ui/assets/htmlMode-
|
|
178
|
-
dw/server/ui/assets/index-
|
|
179
|
-
dw/server/ui/assets/index-
|
|
184
|
+
dw/server/ui/assets/htmlMode-B_AiWoXc.js
|
|
185
|
+
dw/server/ui/assets/index-B6Ujrvuj.js
|
|
186
|
+
dw/server/ui/assets/index-BChhQc7I.css
|
|
180
187
|
dw/server/ui/assets/ini-sBoK_t0W.js
|
|
181
188
|
dw/server/ui/assets/java-BEtHBSE6.js
|
|
182
|
-
dw/server/ui/assets/javascript-
|
|
189
|
+
dw/server/ui/assets/javascript-E4m083D3.js
|
|
183
190
|
dw/server/ui/assets/json.worker-B2V3pomh.js
|
|
184
|
-
dw/server/ui/assets/jsonMode
|
|
191
|
+
dw/server/ui/assets/jsonMode--h7ZikWy.js
|
|
185
192
|
dw/server/ui/assets/julia-Bri6UV-V.js
|
|
186
193
|
dw/server/ui/assets/kotlin-BOotOW0E.js
|
|
187
194
|
dw/server/ui/assets/less-B9JPFI3C.js
|
|
188
195
|
dw/server/ui/assets/lexon-CfSJPG6W.js
|
|
189
|
-
dw/server/ui/assets/liquid-
|
|
190
|
-
dw/server/ui/assets/lspLanguageFeatures-
|
|
196
|
+
dw/server/ui/assets/liquid-BzbKdLRW.js
|
|
197
|
+
dw/server/ui/assets/lspLanguageFeatures-CRa0bRFV.js
|
|
191
198
|
dw/server/ui/assets/lua-CsQS60Ue.js
|
|
192
199
|
dw/server/ui/assets/m3-D-oSqn_W.js
|
|
193
200
|
dw/server/ui/assets/markdown-Cimd5fb3.js
|
|
194
|
-
dw/server/ui/assets/mdx-
|
|
201
|
+
dw/server/ui/assets/mdx-BJ4u6XQs.js
|
|
195
202
|
dw/server/ui/assets/mips-CIPQ_RoX.js
|
|
196
203
|
dw/server/ui/assets/monaco--ixms01u.css
|
|
197
|
-
dw/server/ui/assets/monaco-
|
|
204
|
+
dw/server/ui/assets/monaco-DwaeaVri.js
|
|
198
205
|
dw/server/ui/assets/msdax-DauUninz.js
|
|
199
206
|
dw/server/ui/assets/mysql-SOo6toE5.js
|
|
200
207
|
dw/server/ui/assets/objective-c-FvmIjYaQ.js
|
|
@@ -209,10 +216,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
|
|
|
209
216
|
dw/server/ui/assets/powershell-DmHpPYUd.js
|
|
210
217
|
dw/server/ui/assets/protobuf-C531GsRP.js
|
|
211
218
|
dw/server/ui/assets/pug-Z5eAx3Zn.js
|
|
212
|
-
dw/server/ui/assets/python-
|
|
219
|
+
dw/server/ui/assets/python-CoX_gCAL.js
|
|
213
220
|
dw/server/ui/assets/qsharp-DkqhCAOL.js
|
|
214
221
|
dw/server/ui/assets/r-BwWrilGY.js
|
|
215
|
-
dw/server/ui/assets/razor-
|
|
222
|
+
dw/server/ui/assets/razor-BCTdG5SN.js
|
|
216
223
|
dw/server/ui/assets/redis-ClamHrr6.js
|
|
217
224
|
dw/server/ui/assets/redshift-DT7zqm-g.js
|
|
218
225
|
dw/server/ui/assets/restructuredtext-BYgofb2h.js
|
|
@@ -232,15 +239,15 @@ dw/server/ui/assets/swift-Bxkupp3x.js
|
|
|
232
239
|
dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
|
|
233
240
|
dw/server/ui/assets/tcl-DISqw1ZD.js
|
|
234
241
|
dw/server/ui/assets/ts.worker-D7T1-Ig5.js
|
|
235
|
-
dw/server/ui/assets/tsMode-
|
|
242
|
+
dw/server/ui/assets/tsMode-B6BV7a76.js
|
|
236
243
|
dw/server/ui/assets/twig-De2hgUGE.js
|
|
237
|
-
dw/server/ui/assets/typescript-
|
|
244
|
+
dw/server/ui/assets/typescript-DJe7-fvZ.js
|
|
238
245
|
dw/server/ui/assets/typespec-B8J7ngcE.js
|
|
239
246
|
dw/server/ui/assets/vb-DV3o63ZY.js
|
|
240
247
|
dw/server/ui/assets/wgsl-DpFanUEy.js
|
|
241
|
-
dw/server/ui/assets/workers-
|
|
242
|
-
dw/server/ui/assets/xml-
|
|
243
|
-
dw/server/ui/assets/yaml-
|
|
248
|
+
dw/server/ui/assets/workers-DCzLJTPE.js
|
|
249
|
+
dw/server/ui/assets/xml-CNvWfUrB.js
|
|
250
|
+
dw/server/ui/assets/yaml-ByARP6WE.js
|
|
244
251
|
dw/tasks/assess.py
|
|
245
252
|
dw/tasks/audio_dynamics.py
|
|
246
253
|
dw/tasks/audio_transcription.py
|
|
@@ -255,6 +262,8 @@ dw/tasks/dissolve_videos.py
|
|
|
255
262
|
dw/tasks/format_messages.py
|
|
256
263
|
dw/tasks/gather.py
|
|
257
264
|
dw/tasks/grade.py
|
|
265
|
+
dw/tasks/h3_latent_upscale.py
|
|
266
|
+
dw/tasks/h3_latent_upscaler_model.py
|
|
258
267
|
dw/tasks/image_to_text.py
|
|
259
268
|
dw/tasks/image_utils.py
|
|
260
269
|
dw/tasks/interpolate_frames.py
|
|
@@ -287,9 +296,11 @@ dw_mcp/assets.py
|
|
|
287
296
|
dw_mcp/authoring.py
|
|
288
297
|
dw_mcp/catalog.py
|
|
289
298
|
dw_mcp/client.py
|
|
299
|
+
dw_mcp/confine.py
|
|
290
300
|
dw_mcp/diagnose.py
|
|
291
301
|
dw_mcp/exports.py
|
|
292
302
|
dw_mcp/guides.py
|
|
303
|
+
dw_mcp/loras.py
|
|
293
304
|
dw_mcp/media.py
|
|
294
305
|
dw_mcp/models.py
|
|
295
306
|
dw_mcp/prompts.py
|
|
@@ -300,6 +311,7 @@ dw_mcp/tools_jobs.py
|
|
|
300
311
|
dw_mcp/tools_media.py
|
|
301
312
|
dw_mcp/workspaces.py
|
|
302
313
|
tests/test_admission.py
|
|
314
|
+
tests/test_api_contract.py
|
|
303
315
|
tests/test_arch_metrics.py
|
|
304
316
|
tests/test_arch_report.py
|
|
305
317
|
tests/test_architecture_map.py
|
|
@@ -317,6 +329,7 @@ tests/test_cache_blocks.py
|
|
|
317
329
|
tests/test_catalog_shape.py
|
|
318
330
|
tests/test_catalog_structure.py
|
|
319
331
|
tests/test_chain.py
|
|
332
|
+
tests/test_ci_config.py
|
|
320
333
|
tests/test_cli.py
|
|
321
334
|
tests/test_component_name_errors.py
|
|
322
335
|
tests/test_component_pruning.py
|
|
@@ -346,7 +359,9 @@ tests/test_gather.py
|
|
|
346
359
|
tests/test_grade.py
|
|
347
360
|
tests/test_h3_adapters.py
|
|
348
361
|
tests/test_h3_context_ir.py
|
|
362
|
+
tests/test_h3_latent_upscale.py
|
|
349
363
|
tests/test_h3_schedule.py
|
|
364
|
+
tests/test_h3_upscaler_source.py
|
|
350
365
|
tests/test_h3_vram_ceiling.py
|
|
351
366
|
tests/test_hf_placement.py
|
|
352
367
|
tests/test_host_memory.py
|
|
@@ -370,7 +385,10 @@ tests/test_library_sources.py
|
|
|
370
385
|
tests/test_list_images.py
|
|
371
386
|
tests/test_locations.py
|
|
372
387
|
tests/test_lora_alpha.py
|
|
388
|
+
tests/test_lora_catalog.py
|
|
373
389
|
tests/test_lora_disable.py
|
|
390
|
+
tests/test_lora_hub.py
|
|
391
|
+
tests/test_lora_library.py
|
|
374
392
|
tests/test_ltx2_diffusion_decode.py
|
|
375
393
|
tests/test_ltx2_extend_clip.py
|
|
376
394
|
tests/test_ltx2_ic_loras.py
|
|
@@ -379,14 +397,17 @@ tests/test_mcp_assets.py
|
|
|
379
397
|
tests/test_mcp_authoring.py
|
|
380
398
|
tests/test_mcp_catalog.py
|
|
381
399
|
tests/test_mcp_client.py
|
|
400
|
+
tests/test_mcp_confine.py
|
|
382
401
|
tests/test_mcp_diagnose.py
|
|
383
402
|
tests/test_mcp_exports.py
|
|
384
403
|
tests/test_mcp_guides.py
|
|
404
|
+
tests/test_mcp_loras.py
|
|
385
405
|
tests/test_mcp_main.py
|
|
386
406
|
tests/test_mcp_media.py
|
|
387
407
|
tests/test_mcp_models.py
|
|
388
408
|
tests/test_mcp_prompts.py
|
|
389
409
|
tests/test_mcp_server.py
|
|
410
|
+
tests/test_mcp_twins.py
|
|
390
411
|
tests/test_mcp_workspaces.py
|
|
391
412
|
tests/test_media_audio.py
|
|
392
413
|
tests/test_media_frames.py
|
|
@@ -406,6 +427,7 @@ tests/test_output_references.py
|
|
|
406
427
|
tests/test_pair_audio.py
|
|
407
428
|
tests/test_pair_audio_fit.py
|
|
408
429
|
tests/test_parallel_loading_default.py
|
|
430
|
+
tests/test_path_redaction.py
|
|
409
431
|
tests/test_phase_events.py
|
|
410
432
|
tests/test_pipeline_caching.py
|
|
411
433
|
tests/test_pipeline_components.py
|
|
@@ -452,10 +474,12 @@ tests/test_server.py
|
|
|
452
474
|
tests/test_server_assess.py
|
|
453
475
|
tests/test_server_downloads.py
|
|
454
476
|
tests/test_server_exports.py
|
|
477
|
+
tests/test_server_gallery_image.py
|
|
455
478
|
tests/test_server_guides.py
|
|
456
479
|
tests/test_server_info.py
|
|
457
480
|
tests/test_server_jobs.py
|
|
458
481
|
tests/test_server_library_path.py
|
|
482
|
+
tests/test_server_loras.py
|
|
459
483
|
tests/test_server_mcp.py
|
|
460
484
|
tests/test_server_workspaces.py
|
|
461
485
|
tests/test_shaping_logs.py
|
|
@@ -480,6 +504,7 @@ tests/test_text_generation.py
|
|
|
480
504
|
tests/test_text_sections.py
|
|
481
505
|
tests/test_transcribe_audio.py
|
|
482
506
|
tests/test_type_helpers.py
|
|
507
|
+
tests/test_ui_twins.py
|
|
483
508
|
tests/test_updater.py
|
|
484
509
|
tests/test_validate_arguments.py
|
|
485
510
|
tests/test_validation.py
|
|
@@ -121,9 +121,12 @@ def resolve_asset_reference(reference, asset_dir=None, base_dir=None, library=No
|
|
|
121
121
|
if found:
|
|
122
122
|
logger.debug(f"Resolved {reference} to {found[0]}")
|
|
123
123
|
return found[0]
|
|
124
|
-
|
|
124
|
+
# Named by origin, not directory: this message reaches API and MCP
|
|
125
|
+
# callers, and the roots are the server's filesystem layout
|
|
126
|
+
searched = ", ".join(dict.fromkeys(root.origin for root in library.roots()))
|
|
125
127
|
raise ValueError(
|
|
126
|
-
f"Asset '{name}' not found in {searched} - an
|
|
128
|
+
f"Asset '{name}' not found in the asset library ({searched}) - an "
|
|
129
|
+
f"'asset:' reference "
|
|
127
130
|
f"names a file in the asset library, with its extension, like "
|
|
128
131
|
f"'asset:iris.jpg' or 'asset:gyre/frame_1.jpg'"
|
|
129
132
|
)
|
|
@@ -49,6 +49,8 @@ one to open.
|
|
|
49
49
|
| Reference name shape | `dw/reference_names.py`: `reference_name_errors` | The shape of every `asset:`, `prompt:` and `output:` name is checked before the queue, and existence is checked later. | `tests/test_reference_names.py::TestTheValidationPass::test_a_malformed_reference_is_refused_before_the_queue` |
|
|
50
50
|
| Library reads | `dw/library.py`: `LibraryPath` | Reads go through the roots front to back, so an earlier name shadows a later one. | `tests/test_library_path.py::TestResolution::test_the_front_of_the_path_shadows_the_rest` |
|
|
51
51
|
| Library writes | `dw/library.py`: `LibraryPath` | Writes go only to the front root, so saving something opened from a read-only root writes a copy. | `tests/test_library_path.py::TestConstruction::test_the_writable_root_comes_first`, `tests/test_library_sources.py::TestServer::test_saving_an_example_prompt_writes_a_copy` |
|
|
52
|
+
| LoRA catalog matching | `dw/lora_catalog.py`: `matches`, `workflow_bases` | An entry fits a base only by exact repo id (and H3 partition); no alias or family match. | `tests/test_lora_catalog.py::TestMatching::test_the_base_must_match_exactly` |
|
|
53
|
+
| Hub search | `dw/lora_hub.py`: `search_hub` | The Hub is searched only by `GET /api/loras/recommend`, never raises, and offers no pickle-only repo. | `tests/test_lora_hub.py::TestCandidates::test_a_pickle_only_repo_is_dropped`, `tests/test_lora_hub.py::TestFailure::test_a_hub_error_is_returned_not_raised` |
|
|
52
54
|
| Packaged builtins | `dw/library.py`: `builtin_root`, `resolve_sub_workflow_reference` | `builtin:` names the packaged `dw/workflows/`, not the top-level `workflows/` examples. | `tests/test_sub_workflow_resolver.py::TestTheResolver::test_a_builtin_resolves_in_the_packaged_root` |
|
|
53
55
|
| Sub-workflow paths | `dw/library.py`: `resolve_sub_workflow_reference`, `resolve_sub_workflow` | A sub-workflow path is confined to the root it resolves in. The search order is in the docstring of `resolve_sub_workflow`. | `tests/test_sub_workflow_resolver.py::TestTheResolver::test_a_path_escaping_its_root_is_refused` |
|
|
54
56
|
| Workspace | `dw/workspace.py`: `resolve_workspace`, `set_workspace` | `--workspace` beats `DW_WORKSPACE`, which beats the setting, which beats a working directory that looks like a workspace, which beats `~/diffusers-workspace`. | `tests/test_workspace.py::TestResolution::test_a_flag_wins_over_everything`, `tests/test_workspace.py::TestResolution::test_a_bare_working_directory_falls_back_to_the_home_workspace` |
|
|
@@ -99,6 +101,7 @@ one to open.
|
|
|
99
101
|
| Worker protocol | `dw/worker_protocol.py`: `parse_reply` | Every command and reply is a frozen dataclass that travels as a wire dict. | `tests/test_worker_messages.py::test_from_wire_inverts_to_wire`, `tests/test_worker_messages.py::test_an_unknown_reply_type_is_kept_whole_rather_than_raised` |
|
|
100
102
|
| Persistent worker | `dw/worker.py`, `dw/worker_manager.py`, `dw/serve.py` | Jobs run in one spawned worker that keeps models loaded, so a change to engine code needs a server restart. | — |
|
|
101
103
|
| Failed-run reporting | `dw/worker.py`, `dw/worker_protocol.py`: `Failed`, `Cancelled` | A failed or cancelled run's reply still carries the manifest of the steps that ran. | `tests/test_worker_execute.py::test_failure_carries_the_manifest_of_the_steps_that_ran`, `tests/test_worker_execute.py::test_cancellation_carries_the_manifest_too` |
|
|
104
|
+
| Failure path redaction | `dw/path_redaction.py`: `redact_paths`, called by `dw/worker.py` | A failed run's message and traceback name a file under the job's asset roots or output directory by its `asset:`/`output:` reference, never its absolute server path. | `tests/test_worker_execute.py::test_a_failure_names_an_asset_by_reference_not_by_server_path`, `tests/test_path_redaction.py` |
|
|
102
105
|
| Run-time warnings | `dw/events.py`: `emit_warning` | A warning found at run time is emitted as an event, so it reaches the caller and not just the log. | `tests/test_concat_videos.py::TestWarningsReachTheCaller::test_the_level_spread_warning_is_emitted_as_an_event` |
|
|
103
106
|
|
|
104
107
|
## Media and DSP
|
|
@@ -140,7 +143,13 @@ one to open.
|
|
|
140
143
|
| `dw_mcp` stays torch-free | `dw_mcp/` | `dw_mcp` reaches `dw.serve` over HTTP and imports no `dw` module, because `dw/__init__.py` pulls in torch. | `tests/test_mcp_server.py::TestStartupWeight::test_the_server_starts_without_importing_the_engine` |
|
|
141
144
|
| Tool surface | `dw_mcp/server.py`, `dw_mcp/tools_*.py` | Only these modules import the MCP SDK, and each tool body is a one-line call into a handler. | `tests/test_mcp_server.py::test_the_wiring_table_covers_every_registered_tool`, `tests/test_mcp_server.py::test_the_stated_tool_count_is_the_registered_one` |
|
|
142
145
|
| Surface text budget | the tool docstrings in `dw_mcp/tools_*.py`, the instructions in `dw_mcp/server.py` | The instructions and each tool description stay at or under 2,048 characters, and the whole surface stays within its token budget. | `tests/test_mcp_server.py`: `SURFACE_BUDGET`, `CLIENT_TEXT_LIMIT`; `tests/test_mcp_server.py::test_no_text_the_agent_reads_is_cut_off_by_the_client`, `tests/test_mcp_server.py::test_the_tool_surface_fits_the_budget` |
|
|
143
|
-
| Spending needs consent | `dw_mcp/diagnose.py`
|
|
146
|
+
| Spending needs consent | each handler behind a tool that takes `acknowledged_cost` (`dw_mcp/diagnose.py`, `models.py`, `prompts.py`, `workspaces.py`) | Every tool that takes `acknowledged_cost` refuses until it is set; `delete_workspace`'s refusal is the server's 409. | `tests/test_mcp_twins.py::test_every_tool_that_takes_acknowledged_cost_refuses_without_it` |
|
|
147
|
+
| Copies of engine rules | the constants and word lists in `dw_mcp/` and `dw/run.py` | `dw_mcp` cannot import its owners, so each copy equals its owner; a copy that needs no twin is deleted, not pinned. | `tests/test_mcp_twins.py` |
|
|
148
|
+
| The CLI is a client of the server | `dw/run.py` | `dw.run` queues on `dw.serve` through `dw_mcp.client`, so `dw` imports `dw_mcp` and never the reverse. | `tests/test_mcp_server.py::TestStartupWeight::test_the_server_starts_without_importing_the_engine`, `tests/test_mcp_twins.py` |
|
|
149
|
+
| Inline images | `dw/server/inline_media.py` | Fitting an image to a longest side and halving it under a base64 budget happens on the server, for `/image` and `/frames` alike; `dw_mcp` forwards the size and budget and imports no Pillow. | `tests/test_server_gallery_image.py`, `tests/test_mcp_server.py::TestStartupWeight::test_the_server_starts_without_importing_the_engine` |
|
|
150
|
+
| Workflow patch | `dw/library.py`: `merge_patch`; `dw/server/routes/library.py`: `patch_workflow` | A merge patch is applied on the server under the lock `PUT` takes; no client reads, merges and writes back. | `tests/test_server_library_path.py::TestPatchWorkflow::test_patch_merges_onto_the_stored_definition` |
|
|
151
|
+
| Deleting a job's run | `dw/server/jobs.py`: `JobManager.run_location`; `dw/server/outputs.py`: `delete_run_directory` | The server resolves a job's run directory against the root the job ran in, and refuses a job still queued or running. | `tests/test_server_jobs.py::TestDeleteAJobsRun::test_a_running_job_is_409` |
|
|
152
|
+
| Level findings | `dw/server/assess.py`: `level_findings` | Gallery metadata reports level problems from `dw/audio_qc.py`'s thresholds; no client restates a threshold. | `tests/test_server_assess.py::TestMetadataLevelFindings::test_level_findings_read_audio_qc_thresholds` |
|
|
144
153
|
| API errors | `dw_mcp/client.py` | An API failure becomes a message a person can act on, here and nowhere else. | `tests/test_mcp_client.py::test_a_400_surfaces_the_servers_detail_verbatim` |
|
|
145
154
|
|
|
146
155
|
## UI
|
|
@@ -148,3 +157,16 @@ one to open.
|
|
|
148
157
|
| Concept | Owner | Rule | Enforced by |
|
|
149
158
|
| --- | --- | --- | --- |
|
|
150
159
|
| The UI reads engine fields | `ui/src/lib/plan.ts`: `describePlan`, `ui/src/lib/results.ts`: `sectionBySubfolder` | The UI reads `plan`, `version` and `subfolder` as fields the server sends and derives nothing of its own, and it never sends `acknowledged_cost`. | `ui/src/lib/plan.test.ts`, `ui/src/lib/results.test.ts` |
|
|
160
|
+
| Reference prefixes in the UI | `ui/src/lib/references.ts` | The only module in `ui/src` that spells a reference prefix; each equals `dw/references.py`'s. | `tests/test_ui_twins.py::test_the_ui_spells_every_reference_prefix_the_engine_does`; `prefix_literals` in `ui/scripts/arch-metrics.mjs` |
|
|
161
|
+
| Output kinds on the job page | `dw/server/outputs.py`: `MEDIA_KINDS`, `output_kinds` | The page renders an output by the `output_kinds` the job detail carries, never by its extension. | `tests/test_server.py::test_a_job_reports_each_output_files_media_kind`, `ui/src/lib/pages/JobPage.test.ts` |
|
|
162
|
+
| The editor's live reference check | `ui/src/lib/flow.ts`: `danglingReferenceDetails`, owned by `dw/previous_results.py` and `dw/for_each.py` | The editor warns as the author types, so it keeps a copy of the reference rules; one case file is run through both, the engine deciding each case. | `tests/test_ui_twins.py::test_the_engine_decides_each_shared_reference_case`, `ui/src/lib/flow.test.ts` |
|
|
163
|
+
| Name segments in the UI | `ui/src/lib/names.ts`: `isNameSegment` | Workspaces, folders and stored names follow `dw/security.py`'s `WORKSPACE_NAME_PATTERN` and length cap, counted in code points. | `tests/test_ui_twins.py::test_the_engine_decides_each_shared_workspace_name_case`, `ui/src/lib/names.test.ts` |
|
|
164
|
+
| UI copies of engine rules | the constants `tests/test_ui_twins.py` reads | A list the UI must hold equals its owner, read from the TS source; a rule tested on both sides reads one case file in `tests/fixtures/`. | `tests/test_ui_twins.py` |
|
|
165
|
+
| UI overlays and suggestions | `ui/src/lib/ui/`: `ConfirmDialog`, `Modal`, `Popover`, `Suggest` | Bits UI is imported only here; pages and components use the wrappers, which own focus, Escape, outside presses and scroll lock. Overlay styles and the stacking scale (`--layer-*`) live in `ui/src/app.css`. | `ui/eslint.config.js` (`no-restricted-imports`), `ui/src/lib/ui/*.test.ts`, `ui/e2e/chrome.spec.ts` |
|
|
166
|
+
| Escape on a page under an overlay | `ui/src/lib/ui/layers.svelte.ts`: `holdLayer`, `overlayOpen` | Every open overlay holds a layer; a page's own Escape handling acts only when none is open. | `ui/src/lib/pages/GalleryPage.test.ts` (an Escape that closes a confirm leaves the selection) |
|
|
167
|
+
| The editors' document | `ui/src/lib/editorShell.svelte.ts`: `DocumentEditor` | The workflow and prompt editors keep one rule each for the view (remembered per editor), the JSON draft (a failed parse pins it), dirty against the last load or save, the save path, and the tab-close guard. | `ui/src/lib/editorShell.test.ts`, `ui/src/lib/pages/PromptEditorPage.test.ts`, `ui/src/lib/pages/EditorPage.test.ts` |
|
|
168
|
+
| UI polling | `ui/src/lib/poll.ts`: `poll`, `sleep` | A page that refreshes on a timer starts it through `poll` and stops it with the function `poll` returns. | `ui/src/lib/poll.test.ts` |
|
|
169
|
+
| Workspace state in the UI | `ui/src/lib/workspaceState.svelte.ts`: `workspace` | The current workspace is one `$state`; `api.ts` reads it from here, so the request layer imports no page state. | `import_cycles` in `ui/scripts/arch-metrics.mjs` |
|
|
170
|
+
| The UI's response contract | `dw/server/api_models.py`: `ApiModel`, `send_rejected_responses`; `scripts/dump_openapi.py` | Every JSON route `api.ts` calls declares a response model, and `types.ts` re-exports the types generated from it (`ui/src/lib/generated/`). The payload does not change: an absent key stays absent (`response_model_exclude_unset`), a sometimes-sent key is `sometimes()`. Runtime is lenient - an undeclared key passes and a rejected response is logged and sent as built; tests, the e2e server and the dump run strict (`DW_STRICT_RESPONSES=1`). The document is generated under the FastAPI and Pydantic `constraints-openapi.txt` pins: CI installs them, and the dump refuses to write under others. | `tests/test_api_contract.py`, `tests/test_ui_twins.py::test_every_json_route_the_ui_calls_declares_its_response`, CI's "Response contract" step |
|
|
171
|
+
| Where `--live` appears | `ui/src/app.css` (its header) | The state colour marks machine state only, in the files `ui/scripts/design-rules.test.ts` lists. | `ui/scripts/design-rules.test.ts` |
|
|
172
|
+
| UI architecture ratchet | `ui/scripts/arch-metrics.mjs` | No metric rises above `docs/stabilization/ui/baseline.json`. | the `ui` job in `.github/workflows/ci.yml`; `npm run preflight` |
|
|
@@ -129,3 +129,69 @@ python -m dw.run workflow.json lora="other-user/other-lora"
|
|
|
129
129
|
- [lora.json](../workflows/templates/lora.json) — Flux with realism LoRA and variables
|
|
130
130
|
- [lora.json](../workflows/templates/lora.json) — SD 3.5 with yarn art style LoRA
|
|
131
131
|
- [lora.json](../workflows/templates/lora.json) — A LoRA adapter on FLUX.1 dev, with the SD 3.5 variant in its description
|
|
132
|
+
|
|
133
|
+
## LoRA catalog
|
|
134
|
+
|
|
135
|
+
The catalog records LoRAs that were tried on a base model: `proven`, `trial`,
|
|
136
|
+
or `rejected` with the reason. It is a library like the prompt library - the
|
|
137
|
+
server's own `loras/` at the workspace root (writable, shared by every
|
|
138
|
+
workspace), then the `loras/` an examples tree brings (read-only). One JSON
|
|
139
|
+
file per LoRA, under a family folder: `loras/qwen-image/voxel-style.json`.
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"model_name": "fal/MiniMax-H3-Realism-People-LoRA",
|
|
144
|
+
"weight_name": "h3-realism-people-t2v-i2v-r2v.safetensors",
|
|
145
|
+
"revision": "<sha>",
|
|
146
|
+
"base_models": ["MiniMaxAI/MiniMax-H3"],
|
|
147
|
+
"workflow": "t2va",
|
|
148
|
+
"description": "Realistic people and faces",
|
|
149
|
+
"use_when": "People, crowds or faces should look photoreal",
|
|
150
|
+
"scale": { "default": 0.7, "range": [0.7, 0.7] },
|
|
151
|
+
"status": "proven",
|
|
152
|
+
"evidence": [{ "issue": 585, "note": "Best arm of the 2026-10-03 eval" }]
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
`model_name`, `weight_name`, `revision` and `scale.default` drop straight into
|
|
157
|
+
a step's `loras` entry. `base_models` holds exact repo ids, and matching is
|
|
158
|
+
exact - an adapter on the wrong base usually loads and is quietly worse.
|
|
159
|
+
`workflow` constrains a MiniMax-H3 entry to a partition (`t2va`, `fl2va`,
|
|
160
|
+
`ref2va`) - a string, or a list of them for an adapter that covers several
|
|
161
|
+
(the turbo keyframe files are `["t2va", "fl2va"]`). `proven` and `rejected` entries need `evidence`; a rejected
|
|
162
|
+
entry's first note is why. The schema is `GET /api/lora-schema`.
|
|
163
|
+
|
|
164
|
+
Promotion: a trial that worked is saved with `save_lora` (or
|
|
165
|
+
`PUT /api/loras/{name}`) as `proven`, its job id in `evidence`.
|
|
166
|
+
|
|
167
|
+
## Finding LoRAs on the Hub
|
|
168
|
+
|
|
169
|
+
`recommend_loras(model, query)` (`GET /api/loras/recommend`) is the only
|
|
170
|
+
place dw searches the Hub, and only when called. It returns the catalog's
|
|
171
|
+
entries for the model first, ranked against the query, then Hub adapters
|
|
172
|
+
whose card declares that exact base (`base_model:adapter:<repo>`), most
|
|
173
|
+
downloaded first. Nothing is downloaded; the weight file's header is read to
|
|
174
|
+
check its layout, for a single-weight repo only. Hub rows are candidates to trial, never recommendations,
|
|
175
|
+
and carry `warnings`:
|
|
176
|
+
|
|
177
|
+
| Warning | Meaning |
|
|
178
|
+
| --- | --- |
|
|
179
|
+
| `will_not_load` | Full-weight `.diff` keys diffusers' converters refuse |
|
|
180
|
+
| `unknown_format` | The tensor names match no known LoRA layout |
|
|
181
|
+
| `header_unreadable` | The header range read failed; format unchecked |
|
|
182
|
+
| `multiple_weights` | Several `.safetensors`; pick one from `weights` |
|
|
183
|
+
| `gated` | Needs the server's HF token to have accepted the gate |
|
|
184
|
+
| `no_license` | The card declares none |
|
|
185
|
+
| `stale` | Last changed before its base was - trained on an older revision |
|
|
186
|
+
|
|
187
|
+
A repo holding only pickle `.bin` weights is never offered. A repo the
|
|
188
|
+
catalog marks `rejected` comes back in `hub` as `rejected` with the reason
|
|
189
|
+
only when the Hub search turns it up; rejected entries are left out of
|
|
190
|
+
`catalog` (`list_loras` still shows them). When the
|
|
191
|
+
Hub is unreachable the catalog rows still come back, with `hub_error`.
|
|
192
|
+
|
|
193
|
+
Limits: the search runs the typed query plus at most 4 of its words;
|
|
194
|
+
`query` is capped at 200 characters and `limit` is 1-25. One Hub search runs
|
|
195
|
+
at a time per server, and a concurrent call gets catalog rows plus
|
|
196
|
+
`hub_error` saying a search is already running. An empty `hub` with
|
|
197
|
+
`hub_error` set means the search failed, not that no adapters exist.
|
|
@@ -187,7 +187,7 @@ Nothing in this sequence costs GPU time.
|
|
|
187
187
|
|
|
188
188
|
## Tool reference
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
62 tools in six groups. Names and arguments below are transcribed from
|
|
191
191
|
`dw_mcp/tools_*.py` — nothing here is renamed or reshaped for the docs.
|
|
192
192
|
|
|
193
193
|
### Catalog (read-only)
|
|
@@ -227,7 +227,7 @@ when no single workflow covers it.
|
|
|
227
227
|
| `get_server_info()` | — | What this installation can do and where it keeps things: `device` (the accelerator a run will use), `version`, the `workspace` this session is working in and the workflow/asset/output/prompt `directories` of *that* workspace, the bind address and port, whether a token is required, and whether MCP is mounted. Check the device before authoring - a CUDA-only choice (bitsandbytes, `torch.compile`, flash attention) is not available on an `mps` or `cpu` server. `runtime` (#222) reports the Python version, torch version and the CUDA version torch was built against, the NVIDIA driver version (when `nvidia-smi` is reachable), and the installed versions of diffusers, transformers, accelerate, bitsandbytes, peft, safetensors and sentencepiece (`null` for one not installed) - for diagnosing an environment mismatch between boxes without shelling in |
|
|
228
228
|
| `list_jobs(limit=20, status=None, workspace=None)` | optional `limit` (newest N), `status` (one state or a comma-separated set of `queued`, `running`, `succeeded`, `failed`, `cancelled`), `workspace` | List queued, running and recent jobs, **newest first**. Bounded by default: the unbounded listing was over a client's tool-result limit on a server with a few months of history, which made it a tool that could not be called at all. `total` says how many matched and `truncated`/`next` say so when the answer was cut - raise `limit` or narrow with `status`. Without `workspace`, a named workspace lists its own jobs and the default one lists every job the server holds |
|
|
229
229
|
| `list_gallery(limit=50, subfolder=None, only_orphans=False, workspace=None, folder=None, version=None)` | `limit`, `subfolder`, `only_orphans`, `workspace`, `folder`, `version` | List generated output files, newest first. A name is `<workflow>/<run id>/<file>`, where `<file>` may sit in the subfolder the step chose (`final/episode.mp4`); each entry carries `folder` (the workflow) and `subfolder` (by convention `final` or `intermediate`, `''` when the step chose none, any path the workflow wrote otherwise), and `subfolder="final"` lists only deliverables. Each entry carries `run_id` and `version` - that run's ordinal among the workflow's runs, which is how one of several runs that wrote the same basename is named to a person: the web UI labels the same file `v5`. The number is assigned when the run opens and never renumbered, so deleting a run leaves a gap rather than sliding the rest down (a failed run, or a rerun that reused every step, leaves one too - it took a number and may have nothing to list), and it is `null` under the flat output layout, which has no runs. `folder` with `version` lists that one run's files, and `output:<folder>/v5/<file>` names one in a workflow; every other tool takes `name`. Each entry also carries a ready-made `url`, already scoped to the workspace that made it - a hand-built `/outputs/<name>` URL 404s for anything but the default workspace. `only_orphans=True` inverts the call: instead of files, it returns run directories with no media anywhere under them (`runs`, each `{name, mtime}`) - a run whose output was deleted before `delete_output` could remove it by name, or one that failed before writing anything; `subfolder` does not apply in this mode, and `name` is exactly what `delete_output` accepts (#170). `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
|
|
230
|
-
| `get_gallery_metadata(name, envelope=False, workspace=None)` | `name`, `workspace` | Get the metadata embedded in a generated file — or, when `name` is an `asset:` reference, what an *input* asset holds (`source` says which; `job` is null for an asset). Reading an input's duration, frame count, fps and sample rate before a run is how a caller learns the `total_frames`, `fps` and `sample_rate` a workflow expects it to supply: the exact workflow and arguments that produced it, and, for audio/video, a `media` block (duration, rate, channels, fps, size, peak/mean dBFS). Only an image (PNG/JPEG/WebP) embeds `metadata` this way — it is always null for audio and video, and `next` then points at `get_job_workflow(job_id)` when `job` is known, or says a kept asset carries no provenance at all when it isn't. `envelope=true` adds `media.envelope` — `rms_dbfs` and `peak_dbfs` one entry per second — which is what locates something in a track rather than measuring the whole of it. `media.shots` is set on an output joined from shots: one `{name, start_frame, num_frames, start_sample, num_samples}` per shot, as the join measured them (see the run manifest in docs/WORKFLOW_GUIDE.md), else null. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
|
|
230
|
+
| `get_gallery_metadata(name, envelope=False, workspace=None)` | `name`, `workspace` | Get the metadata embedded in a generated file — or, when `name` is an `asset:` reference, what an *input* asset holds (`source` says which; `job` is null for an asset). Reading an input's duration, frame count, fps and sample rate before a run is how a caller learns the `total_frames`, `fps` and `sample_rate` a workflow expects it to supply: the exact workflow and arguments that produced it, and, for audio/video, a `media` block (duration, rate, channels, fps, size, peak/mean dBFS) and `findings` - each level problem the server measured against `dw/audio_qc.py`'s thresholds (`full_scale`, `near_silent`), with the fix. Only an image (PNG/JPEG/WebP) embeds `metadata` this way — it is always null for audio and video, and `next` then points at `get_job_workflow(job_id)` when `job` is known, or says a kept asset carries no provenance at all when it isn't. `envelope=true` adds `media.envelope` — `rms_dbfs` and `peak_dbfs` one entry per second — which is what locates something in a track rather than measuring the whole of it. `media.shots` is set on an output joined from shots: one `{name, start_frame, num_frames, start_sample, num_samples}` per shot, as the join measured them (see the run manifest in docs/WORKFLOW_GUIDE.md), else null. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
|
|
231
231
|
|
|
232
232
|
### Media
|
|
233
233
|
|
|
@@ -239,7 +239,7 @@ when no single workflow covers it.
|
|
|
239
239
|
| `get_output_text(name, max_characters=20000, workspace=None)` | `name`, `max_characters`, `workspace` | Read a text output — a prompt enhancement, or any step whose result is `text/plain` or JSON. Reports the file's real length and whether it was truncated. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
|
|
240
240
|
| `assess_output(name, probe=None, detail=False, workspace=None)` | `name` (a gallery name or `asset:`), `probe`, `detail`, `workspace` | Measure a finished cut on the server, without queueing: the assessment probes (`analyze_shots`, `analyze_seams`, `analyze_sync_drift`) run in the server process over one decode of the file, beside whatever job holds the GPU. Shot boundaries are the ones its run recorded (the manifest for an output, the `keep_output` sidecar for an asset). The answer merges every applicable probe's `findings` (`{rule, severity, at, value, threshold, says}`) with `rules_applied`, `rules_skipped` and `not_applicable` (`{probe: why}` - a still, a mute file, a file with no recorded shots); `detail=true` adds each probe's full body under `probes`, and `probe=` returns that one probe's full body. `probe` is checked against the three names before anything else is read, and an unknown one is refused naming them. Findings are places to look, not verdicts: drill in with `get_output_frames(seams=[n])` / `get_output_audio(start, duration)`. See *Assessing a run's output* in docs/WORKFLOW_GUIDE.md |
|
|
241
241
|
| `download_output(name, destination=None, overwrite=False, workspace=None)` | `name`, `destination`, `overwrite`, `workspace` | Save one output file to local disk, of any content type. `destination` may be a full path or a directory; `~` expands and missing parent directories are created. `overwrite=True` is required to replace a file already at the resolved path. Over the stdio `dw-mcp`, omitting `destination` saves under the output's own name in the current working directory. Over a `dw.serve --mcp` endpoint the file lands on the server confined to that workspace (a relative path is joined onto it), and `destination` is required there - an omitted one is refused rather than dropped loose in the workspace root, where nothing can find or delete it later (#353); use the `url` `list_gallery` reports, `get_output_image`/`get_output_audio`/`get_output_frames` for inline content, or `keep_output` to make it a named asset instead. Returns nothing to the conversation but where the file landed — unlike the other media tools, the point is a file on disk, not a payload in context. Writes on the machine running the MCP server - over `dw.serve --mcp` that is the GPU box. A write that fails there (a path that exists only on the client, for instance) comes back as an error naming the server-side write and the client-side alternatives, not as an anonymous tool failure. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
|
|
242
|
-
| `delete_output(name=None, workspace=None, job_id=None)` | exactly one of `name` / `job_id`, `workspace` | Permanently remove one generated file from the output directory, or - with `name` a `<workflow>/<run id>` run directory, or with `job_id` - a whole run. By `job_id` the run directory
|
|
242
|
+
| `delete_output(name=None, workspace=None, job_id=None)` | exactly one of `name` / `job_id`, `workspace` | Permanently remove one generated file from the output directory, or - with `name` a `<workflow>/<run id>` run directory, or with `job_id` - a whole run. By `job_id` the server reads the run directory from the job record and the root the job ran in (`DELETE /api/jobs/{id}/run`), and the reply is `job_id`, `run_dir`, `deleted` and `run_swept`; a job that never wrote a run directory, an unknown one, or one still queued or running is an error. `workspace` names the workspace for a `name` delete without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
|
|
243
243
|
|
|
244
244
|
### Authoring, assets and workspaces
|
|
245
245
|
|
|
@@ -272,7 +272,7 @@ tools) rather than relying on the session pin.
|
|
|
272
272
|
| `validate_workflow(workflow=None, name=None, workspace=None, arguments=None)` | exactly one of `workflow` (inline definition) or `name` (a stored workflow, as `list_workflows` reports it), optional `workspace`, optional `arguments` | Check a workflow against the schema and against real pipeline signatures. Free and instant. Validating by name uses the workflow file's own directory as the base directory, so it sees what a run would. Returns every schema violation in `errors`, each with the JSON path it sits at, so a draft is fixed in one pass, and a `previous_result:` that names no earlier step is one of them. `warnings` covers what still runs but is probably wrong - a signature mismatch, and, for a list-driven variable, an entry key no step reads, at the entry's path. `workspace` names the workspace for this one call without switching the session to it - use it to pin a job whose `output:` or `asset:` references live in a workspace other than the session's. Pass the same `arguments` you will pass to `run_workflow` and they are checked too - an undeclared or renamed variable name, a value that will not coerce to the declared type, and an `asset:`, `prompt:` or `output:` reference that names nothing this workspace can reach, each reported at `arguments.<name>`. `checked_arguments` lists what was covered, so a `valid: true` about the stored defaults cannot be mistaken for one about your values. A reference set the model would refuse - too many images, videos or audio clips, or, for MiniMax-H3, audio as the only reference - is an error here too, rather than a failure minutes into a run you acknowledged. `run_workflow` makes the same check and refuses a bad argument rather than queuing a job that fails on its first step. A valid answer carries `plan` - the fingerprint, step count, list lengths, `downloads_required`, `estimate` (with `basis`) and `elided_steps` for the arguments given; quote from it. `steps` counts what will run: a step nothing reads and which saves no file does not run, and is named in `elided_steps` instead |
|
|
273
273
|
| `list_workspaces()` | — | The server's workspaces and which one this session is using. Each has its own workflows, assets and outputs; the prompt library is shared by all of them |
|
|
274
274
|
| `use_workspace(name)` | `name` | Work in that workspace for the rest of the session - every later call reads and writes there. This is how to keep your work out of another agent's namespace rather than sharing the default one. Checked against the server, so a typo fails here rather than scoping every later call to nothing. On a `dw.serve --mcp` endpoint the pin is shared by every connected client (#298, see the note above the table) - a `warning` field appears when this call overwrote a pin already pointed away from `default` |
|
|
275
|
-
| `create_workspace(name, use=False)` | `name`, `use` | Create a workspace. Pass use=true to switch this session to it as well; otherwise the session stays where it was and the result says so. `use=true` carries the same mounted-server caveat and `warning` field as `use_workspace` |
|
|
275
|
+
| `create_workspace(name, use=False)` | `name`, `use` | Create a workspace. Pass use=true to switch this session to it as well; otherwise the session stays where it was and the result says so. The result names the workspace (`name`, `default`, `current`, `next`), not its folders - `list_workspaces(detail=true)` is the opt-in for those. `use=true` carries the same mounted-server caveat and `warning` field as `use_workspace` |
|
|
276
276
|
| `delete_workspace(name, acknowledged_cost=False)` | `name`, `acknowledged_cost` | Permanently delete a workspace and everything in it. Refuses without the acknowledgement, reporting what it would remove |
|
|
277
277
|
| `list_assets()` | — | The input media on the server, each with the `asset:` reference a workflow argument carries. Look here before asking for a file - what a workflow needs may already be there. `libraries` names the roots searched and which are writable; `shadowed` lists names a nearer library hides |
|
|
278
278
|
| `keep_output(name, asset_name=None, overwrite=False, shared=False, workspace=None)` | `name`, optional `asset_name`, `overwrite`, `shared`, `workspace` | Keep a generated file as an input asset under a stable `asset:` name, so a later workflow can rely on it. The copy happens on the server: nothing is downloaded or re-uploaded. `asset_name` may name a folder and takes the kept file's extension when it has none; `shared=true` keeps it in the library every workspace shares, which is where a recurring cast belongs. `workspace` names the workspace for this one call without switching the session to it - the same pin `run_workflow` takes, so a job run into another workspace stays reachable from the session that queued it |
|
|
@@ -297,6 +297,9 @@ references written in the same session.
|
|
|
297
297
|
| `delete_prompt(name)` | `name` | Permanently delete a stored prompt. A workflow still referencing it will fail to load |
|
|
298
298
|
| `list_enhancers()` | — | List the enhancer presets `enhance_prompt` accepts |
|
|
299
299
|
| `enhance_prompt(idea, preset="h3", model_name=None, device=None, acknowledged_cost=False)` | `idea`, `preset`, optional `model_name` and `device`, `acknowledged_cost` | Expand a short idea into a full prompt with a language model. Queued as an ordinary job, so it passes the gate; the enhanced text is the text file in the finished manifest, readable with `get_output_text` |
|
|
300
|
+
| `list_loras(model=None, workflow=None, status=None, tag=None)` | optional `model`, `workflow`, `status`, `tag` | List the LoRAs tried on a base model - proven, trial or rejected - with `use_when`, `trigger` and `scale`; exact match on the base. Guide: `loras` |
|
|
301
|
+
| `save_lora(name, entry)` | `name`, `entry` | Save a catalog entry, overwriting any entry of that name; promote a trial to `proven` with its job in `evidence` |
|
|
302
|
+
| `recommend_loras(model, query, limit=8)` | `model`, `query`, optional `limit` | Opt-in: catalog LoRAs ranked against a style request, then Hugging Face Hub adapters of that exact base. Queries the Hub (the one tool with `open_world_hint`); no download, no GPU. Hub rows are candidates to trial. A failed or busy Hub (another search already running) returns the catalog rows plus `hub_error`; an empty `hub` with `hub_error` means the search failed |
|
|
300
303
|
|
|
301
304
|
### Diagnose
|
|
302
305
|
|
|
@@ -305,7 +308,7 @@ references written in the same session.
|
|
|
305
308
|
| `run_workflow(workflow_path=None, inline_workflow=None, arguments=None, acknowledged_cost=False, workspace=None, wait_seconds=0)` | exactly one of `workflow_path` (a catalog name from `list_workflows`, with or without `.json`, or a path to a workflow file on the server) or `inline_workflow`, optional `arguments`, `acknowledged_cost`, `workspace`, `wait_seconds` | Queue a workflow for generation. Returns as soon as the job is queued - unless `wait_seconds` is above 0, in which case the call then waits on the queued job exactly as `wait_for_job(job_id, timeout_seconds=wait_seconds)` would (same per-call cap, clamped not honoured) and the result carries the queued-job fields plus that wait's (`status`, `still_running`, `waited_seconds`, `timeout_requested_seconds`, `timeout_applied_seconds`, `timeout_capped`, the slim `job`); when the cap covers the job's runtime one call is the run and the wait, and a `still_running: true` result is followed with `wait_for_job` as before. `workspace` names the workspace for this one call without switching the session to it - use it to pin a job whose `output:` or `asset:` references live in a workspace other than the session's - `acknowledged_cost` is `true` or the bound `{fingerprint, minutes, downloads}` from the validate plan; a 409 means the plan changed and the message carries the new estimate, and nothing is waited on |
|
|
306
309
|
| `get_job(job_id)` | `job_id` | Get a job's status, warnings, output manifest, error and traceback; each manifest entry's `subfolder` is the in-run subfolder the step declared - by convention `final` for the deliverable, `intermediate` for scratch, `''` for none. A running job also carries `progress` (below) |
|
|
307
310
|
| `get_job_workflow(job_id)` | `job_id` | The REST equivalent is `GET /api/jobs/{id}/workflow` (see [SERVER.md](SERVER.md#jobs-api)). The workflow the job actually ran. `realized: true` means every mutable input is pinned (arguments, seed, prompts, `output:latest`); `false` means the job predates run tracking and this is the definition as submitted. Pass it to `save_workflow` to keep it under a name |
|
|
308
|
-
| `export_job(job_id, overwrite=False)` | `job_id`, `overwrite` | Gather one finished job into `<workspace>/exports/<job id>/` on the server: the realized workflow, the run's manifest, the job row, a README, and copies of the assets, earlier-run inputs and outputs. Returns the directory, a zip URL, the file list with sizes and the total. The three JSON files are in the zip, not repeated here - get_job_workflow and get_job serve them individually. **The directory is on the machine running the server**, like `download_output`'s destination.
|
|
311
|
+
| `export_job(job_id, overwrite=False)` | `job_id`, `overwrite` | Gather one finished job into `<workspace>/exports/<job id>/` on the server: the realized workflow, the run's manifest, the job row, a README, and copies of the assets, earlier-run inputs and outputs. Returns the directory, a zip URL, the file list with sizes and the total. The three JSON files are in the zip, not repeated here - get_job_workflow and get_job serve them individually. **The directory is on the machine running the server**, like `download_output`'s destination. The zip needs no token (`/exports/*.zip` is ungated like `/outputs`, #592), so `auth_required` is false and the agent fetches `open_url` itself (prefixing a relative one with the server address) and unpacks it into `exports/` under the session's working directory (a deliverable, not a temp file) - the archive already unpacks into one folder named after the job id, so do not create that folder first; only an agent without HTTP gives the user `open_url`. `true` is kept as a forward guard for a gated zip, when `open_url` is handed to the person instead |
|
|
309
312
|
| `get_job_events(job_id, after=-1, limit=200)` | `job_id`, `after`, `limit` | Get a page of a job's progress events |
|
|
310
313
|
| `wait_for_job(job_id, timeout_seconds=20)` | `job_id`, `timeout_seconds` | Block until a job reaches a terminal status, or `timeout_seconds` elapses. **One call blocks for at most the server's cap** — 55 seconds unless the deployment sets `DW_MCP_MAX_WAIT_SECONDS` higher, and the tool's description states the live value; a larger `timeout_seconds` is clamped, not honoured. Ask for the job's `plan.estimate` plus a margin: under the cap that is one call for the whole job, over it one call per cap. A deployment raises the cap only as far as its clients (and anything between them and the server) hold one silent HTTP request open - Claude Code's limit is `MCP_TOOL_TIMEOUT`. Every reply carries `waited_seconds`, `timeout_requested_seconds`, `timeout_applied_seconds` and `timeout_capped`, so a capped return is distinguishable from an elapsed one. Use instead of hand-polling `get_job`/`get_job_events` in a loop; if it returns `still_running: true`, call it again. Returns a slim job - status, warnings, error, `run_id` and `run_version` (the run's `v5`, as the gallery labels it), and the manifest once finished - without the arguments; `get_job` has those. A running job also carries `progress` (below) |
|
|
311
314
|
| `cancel_job(job_id)` | `job_id` | Ask a queued or running job to stop |
|