diffusers-workflow 0.7.0__tar.gz → 0.8.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.
Files changed (532) hide show
  1. {diffusers_workflow-0.7.0/diffusers_workflow.egg-info → diffusers_workflow-0.8.0}/PKG-INFO +2 -2
  2. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/README.md +1 -1
  3. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0/diffusers_workflow.egg-info}/PKG-INFO +2 -2
  4. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/diffusers_workflow.egg-info/SOURCES.txt +46 -21
  5. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/assets.py +5 -2
  6. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/ARCHITECTURE.md +23 -1
  7. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/LORAS.md +66 -0
  8. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/MCP.md +7 -4
  9. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/RELEASING.md +137 -2
  10. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/SECURITY.md +1 -0
  11. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/SERVER.md +29 -4
  12. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/WORKFLOW_GUIDE.md +241 -1
  13. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/WORKSPACES.md +6 -2
  14. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/events.py +6 -0
  15. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/introspection.py +5 -0
  16. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/library.py +25 -3
  17. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/locations.py +53 -18
  18. diffusers_workflow-0.8.0/dw/lora_catalog.py +134 -0
  19. diffusers_workflow-0.8.0/dw/lora_catalog_schema.json +57 -0
  20. diffusers_workflow-0.8.0/dw/lora_hub.py +237 -0
  21. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/media.py +11 -5
  22. diffusers_workflow-0.8.0/dw/path_redaction.py +72 -0
  23. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/run.py +2 -2
  24. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/security.py +20 -0
  25. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/admission.py +31 -13
  26. diffusers_workflow-0.8.0/dw/server/api_models.py +824 -0
  27. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/app.py +26 -1
  28. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/assess.py +44 -1
  29. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/deps.py +21 -1
  30. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/guides.py +1 -1
  31. diffusers_workflow-0.8.0/dw/server/inline_media.py +131 -0
  32. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/jobs.py +21 -8
  33. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/outputs.py +65 -4
  34. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/routes/__init__.py +2 -1
  35. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/routes/assets.py +24 -4
  36. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/routes/files.py +3 -3
  37. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/routes/gallery.py +28 -38
  38. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/routes/jobs.py +108 -12
  39. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/routes/library.py +132 -36
  40. diffusers_workflow-0.8.0/dw/server/routes/loras.py +275 -0
  41. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/routes/media.py +102 -19
  42. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/routes/system.py +72 -17
  43. diffusers_workflow-0.7.0/dw/server/ui/assets/cssMode-DQI1FUIr.js → diffusers_workflow-0.8.0/dw/server/ui/assets/cssMode-C1mrKegs.js +1 -1
  44. diffusers_workflow-0.7.0/dw/server/ui/assets/editor.api-a3j9A86u.js → diffusers_workflow-0.8.0/dw/server/ui/assets/editor.api-EZbUgQvM.js +1 -1
  45. diffusers_workflow-0.7.0/dw/server/ui/assets/freemarker2-BcdiHyGC.js → diffusers_workflow-0.8.0/dw/server/ui/assets/freemarker2-Dth1K2Vy.js +1 -1
  46. diffusers_workflow-0.7.0/dw/server/ui/assets/handlebars-DCj-aPE8.js → diffusers_workflow-0.8.0/dw/server/ui/assets/handlebars-8Sswqnxq.js +1 -1
  47. diffusers_workflow-0.7.0/dw/server/ui/assets/html-D8xomw9g.js → diffusers_workflow-0.8.0/dw/server/ui/assets/html-BYtYo7f1.js +1 -1
  48. diffusers_workflow-0.7.0/dw/server/ui/assets/htmlMode-DK_n-eew.js → diffusers_workflow-0.8.0/dw/server/ui/assets/htmlMode-B_AiWoXc.js +1 -1
  49. diffusers_workflow-0.8.0/dw/server/ui/assets/index-B6Ujrvuj.js +45 -0
  50. diffusers_workflow-0.8.0/dw/server/ui/assets/index-BChhQc7I.css +1 -0
  51. diffusers_workflow-0.7.0/dw/server/ui/assets/javascript-SmmG4uTF.js → diffusers_workflow-0.8.0/dw/server/ui/assets/javascript-E4m083D3.js +1 -1
  52. diffusers_workflow-0.7.0/dw/server/ui/assets/jsonMode-BRyslvRu.js → diffusers_workflow-0.8.0/dw/server/ui/assets/jsonMode--h7ZikWy.js +1 -1
  53. diffusers_workflow-0.7.0/dw/server/ui/assets/liquid-CC4C0BTL.js → diffusers_workflow-0.8.0/dw/server/ui/assets/liquid-BzbKdLRW.js +1 -1
  54. diffusers_workflow-0.7.0/dw/server/ui/assets/lspLanguageFeatures-Cmg2_33_.js → diffusers_workflow-0.8.0/dw/server/ui/assets/lspLanguageFeatures-CRa0bRFV.js +1 -1
  55. diffusers_workflow-0.7.0/dw/server/ui/assets/mdx-DTAejllH.js → diffusers_workflow-0.8.0/dw/server/ui/assets/mdx-BJ4u6XQs.js +1 -1
  56. diffusers_workflow-0.7.0/dw/server/ui/assets/monaco-C_Um4bRZ.js → diffusers_workflow-0.8.0/dw/server/ui/assets/monaco-DwaeaVri.js +4 -4
  57. diffusers_workflow-0.7.0/dw/server/ui/assets/python-DKASw3vF.js → diffusers_workflow-0.8.0/dw/server/ui/assets/python-CoX_gCAL.js +1 -1
  58. diffusers_workflow-0.7.0/dw/server/ui/assets/razor-CkEOBTMa.js → diffusers_workflow-0.8.0/dw/server/ui/assets/razor-BCTdG5SN.js +1 -1
  59. diffusers_workflow-0.7.0/dw/server/ui/assets/tsMode-CmkUIEUu.js → diffusers_workflow-0.8.0/dw/server/ui/assets/tsMode-B6BV7a76.js +1 -1
  60. diffusers_workflow-0.7.0/dw/server/ui/assets/typescript-BXTFUpwg.js → diffusers_workflow-0.8.0/dw/server/ui/assets/typescript-DJe7-fvZ.js +1 -1
  61. diffusers_workflow-0.7.0/dw/server/ui/assets/workers-Cpj1l6gK.js → diffusers_workflow-0.8.0/dw/server/ui/assets/workers-DCzLJTPE.js +1 -1
  62. diffusers_workflow-0.7.0/dw/server/ui/assets/xml-D1BkO5yz.js → diffusers_workflow-0.8.0/dw/server/ui/assets/xml-CNvWfUrB.js +1 -1
  63. diffusers_workflow-0.7.0/dw/server/ui/assets/yaml-CDFThBDz.js → diffusers_workflow-0.8.0/dw/server/ui/assets/yaml-ByARP6WE.js +1 -1
  64. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/index.html +2 -2
  65. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/task_domains.py +1 -0
  66. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/audio_utils.py +9 -4
  67. diffusers_workflow-0.8.0/dw/tasks/h3_latent_upscale.py +341 -0
  68. diffusers_workflow-0.8.0/dw/tasks/h3_latent_upscaler_model.py +274 -0
  69. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/loop_bed.py +9 -2
  70. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/task.py +74 -0
  71. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/worker.py +24 -3
  72. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/workspace.py +5 -3
  73. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/__main__.py +1 -1
  74. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/assets.py +25 -82
  75. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/authoring.py +5 -31
  76. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/catalog.py +9 -23
  77. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/client.py +75 -53
  78. diffusers_workflow-0.8.0/dw_mcp/confine.py +70 -0
  79. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/diagnose.py +32 -23
  80. diffusers_workflow-0.8.0/dw_mcp/loras.py +29 -0
  81. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/media.py +84 -254
  82. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/server.py +12 -1
  83. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/tools_authoring.py +37 -2
  84. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/tools_catalog.py +2 -4
  85. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/tools_media.py +4 -4
  86. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/workspaces.py +17 -31
  87. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/pyproject.toml +3 -1
  88. diffusers_workflow-0.8.0/tests/test_api_contract.py +597 -0
  89. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_arch_report.py +20 -0
  90. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_audio_utils.py +3 -0
  91. diffusers_workflow-0.8.0/tests/test_ci_config.py +26 -0
  92. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_events.py +22 -0
  93. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_find_loop_bed.py +9 -0
  94. diffusers_workflow-0.8.0/tests/test_h3_latent_upscale.py +471 -0
  95. diffusers_workflow-0.8.0/tests/test_h3_upscaler_source.py +174 -0
  96. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_library_sources.py +7 -2
  97. diffusers_workflow-0.8.0/tests/test_lora_catalog.py +265 -0
  98. diffusers_workflow-0.8.0/tests/test_lora_hub.py +326 -0
  99. diffusers_workflow-0.8.0/tests/test_lora_library.py +115 -0
  100. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_assets.py +34 -0
  101. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_authoring.py +10 -36
  102. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_catalog.py +23 -23
  103. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_client.py +65 -28
  104. diffusers_workflow-0.8.0/tests/test_mcp_confine.py +81 -0
  105. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_diagnose.py +24 -3
  106. diffusers_workflow-0.8.0/tests/test_mcp_loras.py +58 -0
  107. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_main.py +16 -0
  108. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_media.py +159 -325
  109. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_server.py +47 -6
  110. diffusers_workflow-0.8.0/tests/test_mcp_twins.py +224 -0
  111. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_workspaces.py +31 -37
  112. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_modular_output_properties.py +81 -2
  113. diffusers_workflow-0.8.0/tests/test_path_redaction.py +57 -0
  114. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_security_auth.py +13 -0
  115. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_security_decoder_bombs.py +39 -47
  116. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server.py +174 -2
  117. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server_assess.py +61 -0
  118. diffusers_workflow-0.8.0/tests/test_server_gallery_image.py +188 -0
  119. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server_guides.py +17 -0
  120. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server_jobs.py +120 -1
  121. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server_library_path.py +66 -0
  122. diffusers_workflow-0.8.0/tests/test_server_loras.py +375 -0
  123. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_shots.py +1 -0
  124. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_step_cache.py +8 -4
  125. diffusers_workflow-0.8.0/tests/test_ui_twins.py +302 -0
  126. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_worker_execute.py +29 -0
  127. diffusers_workflow-0.7.0/dw/server/ui/assets/index-3Vw6WAPW.css +0 -1
  128. diffusers_workflow-0.7.0/dw/server/ui/assets/index-CNiY-pOw.js +0 -44
  129. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/LICENSE +0 -0
  130. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/MANIFEST.in +0 -0
  131. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
  132. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
  133. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/diffusers_workflow.egg-info/requires.txt +0 -0
  134. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
  135. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/__init__.py +0 -0
  136. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/adapter_compatibility.py +0 -0
  137. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/argument_media.py +0 -0
  138. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/argument_warnings.py +0 -0
  139. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/arguments.py +0 -0
  140. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/assessment_rules.py +0 -0
  141. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/audio_qc.py +0 -0
  142. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/cache_blocks.json +0 -0
  143. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/cache_blocks.py +0 -0
  144. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
  145. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/content_types.py +0 -0
  146. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/dissolve_frame_errors.py +0 -0
  147. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/ACCELERATION.md +0 -0
  148. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/AGENT_LOOP.md +0 -0
  149. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/DEPENDENCIES.md +0 -0
  150. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/IP_ADAPTER.md +0 -0
  151. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
  152. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/QUANTIZATION.md +0 -0
  153. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/RECIPES_24GB.md +0 -0
  154. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/REMOTE.md +0 -0
  155. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
  156. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/TASKS.md +0 -0
  157. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/TESTING.md +0 -0
  158. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/docs/WORKER_GUIDE.md +0 -0
  159. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/download_watch.py +0 -0
  160. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/dsp.py +0 -0
  161. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/elision.py +0 -0
  162. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/for_each.py +0 -0
  163. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/host_memory.py +0 -0
  164. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/host_memory_projection.py +0 -0
  165. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/hub_cache.py +0 -0
  166. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/kernel_availability.py +0 -0
  167. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/log_setup.py +0 -0
  168. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/media_frames.py +0 -0
  169. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/media_types.py +0 -0
  170. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/output_extraction.py +0 -0
  171. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/pipeline_ownership.py +0 -0
  172. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/pipeline_processors/adapters.py +0 -0
  173. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/pipeline_processors/chain.py +0 -0
  174. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/pipeline_processors/components.py +0 -0
  175. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/pipeline_processors/config_objects.py +0 -0
  176. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/pipeline_processors/pipeline.py +0 -0
  177. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/pipeline_processors/placement.py +0 -0
  178. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/pipeline_processors/progress.py +0 -0
  179. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/pipeline_processors/remote.py +0 -0
  180. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/plan.py +0 -0
  181. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/previous_results.py +0 -0
  182. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/probe_paths.py +0 -0
  183. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/prompt_schema.json +0 -0
  184. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/prompt_weighting.py +0 -0
  185. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/prompts.py +0 -0
  186. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/realize.py +0 -0
  187. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/reference_limits.py +0 -0
  188. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/reference_names.py +0 -0
  189. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/references.py +0 -0
  190. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/result.py +0 -0
  191. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/runs.py +0 -0
  192. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/scalar_result_validation.py +0 -0
  193. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/schema.py +0 -0
  194. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/serve.py +0 -0
  195. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/__init__.py +0 -0
  196. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/catalog.py +0 -0
  197. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/catalog_shape.py +0 -0
  198. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/enhancers.py +0 -0
  199. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/exports.py +0 -0
  200. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/http_security.py +0 -0
  201. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/job_history.py +0 -0
  202. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/job_record.py +0 -0
  203. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/mcp_mount.py +0 -0
  204. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/netinfo.py +0 -0
  205. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/observed_cost.py +0 -0
  206. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/sysinfo.py +0 -0
  207. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
  208. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
  209. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
  210. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
  211. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
  212. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
  213. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
  214. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
  215. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
  216. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
  217. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
  218. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
  219. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
  220. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/css.worker-B3ciXF_0.js +0 -0
  221. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
  222. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
  223. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
  224. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
  225. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/editor-jjEx9u7D.css +0 -0
  226. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -0
  227. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
  228. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
  229. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
  230. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
  231. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
  232. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
  233. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/html.worker-C93Ht9o9.js +0 -0
  234. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
  235. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
  236. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -0
  237. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
  238. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
  239. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
  240. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
  241. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
  242. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
  243. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
  244. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
  245. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/monaco--ixms01u.css +0 -0
  246. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
  247. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
  248. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
  249. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
  250. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
  251. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
  252. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
  253. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
  254. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
  255. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
  256. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
  257. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
  258. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
  259. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
  260. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
  261. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
  262. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
  263. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
  264. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
  265. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
  266. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
  267. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
  268. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
  269. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
  270. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
  271. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
  272. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
  273. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
  274. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
  275. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
  276. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
  277. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
  278. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
  279. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
  280. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/ts.worker-D7T1-Ig5.js +0 -0
  281. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
  282. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
  283. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
  284. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
  285. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/server/updater.py +0 -0
  286. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/settings.py +0 -0
  287. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/shot_span_preflight.py +0 -0
  288. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/shots.py +0 -0
  289. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/slice_preflight.py +0 -0
  290. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/step.py +0 -0
  291. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/step_cache.py +0 -0
  292. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/step_value_checks.py +0 -0
  293. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/subfolders.py +0 -0
  294. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/assess.py +0 -0
  295. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/audio_dynamics.py +0 -0
  296. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/audio_transcription.py +0 -0
  297. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/background_remover.py +0 -0
  298. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/borders.py +0 -0
  299. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/compose_text.py +0 -0
  300. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/concat_videos.py +0 -0
  301. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/depth_estimator.py +0 -0
  302. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/diffusion_upscale.py +0 -0
  303. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/dissolve_videos.py +0 -0
  304. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/format_messages.py +0 -0
  305. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/gather.py +0 -0
  306. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/grade.py +0 -0
  307. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/image_to_text.py +0 -0
  308. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/image_utils.py +0 -0
  309. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/interpolate_frames.py +0 -0
  310. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/join_into_song.py +0 -0
  311. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/joins.py +0 -0
  312. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/judge.py +0 -0
  313. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/model_cache.py +0 -0
  314. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/pair_audio.py +0 -0
  315. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/qr_code.py +0 -0
  316. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/restore_faces.py +0 -0
  317. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/rife_model.py +0 -0
  318. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/segment.py +0 -0
  319. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/select.py +0 -0
  320. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/speech_generation.py +0 -0
  321. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/stabilize.py +0 -0
  322. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/tensor_image.py +0 -0
  323. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/text_generation.py +0 -0
  324. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/text_sections.py +0 -0
  325. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/upscale.py +0 -0
  326. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/video_utils.py +0 -0
  327. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/voice_attribution.py +0 -0
  328. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/tasks/zoe_depth.py +0 -0
  329. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/test.py +0 -0
  330. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/trust.py +0 -0
  331. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/type_helpers.py +0 -0
  332. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/type_references.py +0 -0
  333. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/validate.py +0 -0
  334. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/validation.py +0 -0
  335. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/variable_constraints.py +0 -0
  336. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/variables.py +0 -0
  337. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/video_extensions.py +0 -0
  338. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/video_size_errors.py +0 -0
  339. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/vram_estimate.py +0 -0
  340. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/vram_inheritance.py +0 -0
  341. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/worker_manager.py +0 -0
  342. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/worker_protocol.py +0 -0
  343. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/workflow.py +0 -0
  344. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/workflow_run.py +0 -0
  345. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/workflow_schema.json +0 -0
  346. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/workflows/h3_context_ir.json +0 -0
  347. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/workflows/test.json +0 -0
  348. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw/writers.py +0 -0
  349. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/__init__.py +0 -0
  350. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/exports.py +0 -0
  351. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/guides.py +0 -0
  352. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/models.py +0 -0
  353. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/prompts.py +0 -0
  354. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/dw_mcp/tools_jobs.py +0 -0
  355. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/setup.cfg +0 -0
  356. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_admission.py +0 -0
  357. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_arch_metrics.py +0 -0
  358. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_architecture_map.py +0 -0
  359. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_argument_updates.py +0 -0
  360. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_arguments.py +0 -0
  361. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_assemble_and_score_target_lufs.py +0 -0
  362. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_assess.py +0 -0
  363. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_assessment_rules.py +0 -0
  364. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_assets.py +0 -0
  365. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_attention_slicing.py +0 -0
  366. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_best_of_n_template.py +0 -0
  367. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_borders.py +0 -0
  368. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_cache_blocks.py +0 -0
  369. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_catalog_shape.py +0 -0
  370. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_catalog_structure.py +0 -0
  371. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_chain.py +0 -0
  372. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_cli.py +0 -0
  373. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_component_name_errors.py +0 -0
  374. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_component_pruning.py +0 -0
  375. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_component_type_errors.py +0 -0
  376. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_compose_text.py +0 -0
  377. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_concat_videos.py +0 -0
  378. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_config_objects.py +0 -0
  379. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_configuration_schema.py +0 -0
  380. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_content_types.py +0 -0
  381. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_depth_estimator.py +0 -0
  382. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_device.py +0 -0
  383. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_device_helpers.py +0 -0
  384. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_device_portability.py +0 -0
  385. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_dialogue_short_voices.py +0 -0
  386. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_diffusion_upscale.py +0 -0
  387. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_dissolve_frame_errors.py +0 -0
  388. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_dissolve_videos.py +0 -0
  389. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_docs_links.py +0 -0
  390. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_download_watch.py +0 -0
  391. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_dsp.py +0 -0
  392. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_elision.py +0 -0
  393. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_examples.py +0 -0
  394. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_for_each.py +0 -0
  395. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_gather.py +0 -0
  396. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_grade.py +0 -0
  397. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_h3_adapters.py +0 -0
  398. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_h3_context_ir.py +0 -0
  399. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_h3_schedule.py +0 -0
  400. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_h3_vram_ceiling.py +0 -0
  401. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_hf_placement.py +0 -0
  402. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_host_memory.py +0 -0
  403. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_host_memory_projection.py +0 -0
  404. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_hub_cache.py +0 -0
  405. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_image_to_text.py +0 -0
  406. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_image_utils.py +0 -0
  407. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_integration.py +0 -0
  408. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_interpolate_frames.py +0 -0
  409. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_introspection.py +0 -0
  410. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_job_history_wal.py +0 -0
  411. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_job_progress.py +0 -0
  412. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_job_warnings.py +0 -0
  413. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_jobs_listing.py +0 -0
  414. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_jobs_reused.py +0 -0
  415. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_join_into_song.py +0 -0
  416. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_judge.py +0 -0
  417. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_kernel_availability.py +0 -0
  418. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_library_path.py +0 -0
  419. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_list_images.py +0 -0
  420. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_locations.py +0 -0
  421. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_lora_alpha.py +0 -0
  422. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_lora_disable.py +0 -0
  423. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_ltx2_diffusion_decode.py +0 -0
  424. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_ltx2_extend_clip.py +0 -0
  425. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_ltx2_ic_loras.py +0 -0
  426. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_ltx_prompt_library.py +0 -0
  427. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_exports.py +0 -0
  428. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_guides.py +0 -0
  429. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_models.py +0 -0
  430. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mcp_prompts.py +0 -0
  431. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_media_audio.py +0 -0
  432. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_media_frames.py +0 -0
  433. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_media_info.py +0 -0
  434. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_media_layering.py +0 -0
  435. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mix_audio.py +0 -0
  436. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_model_cache.py +0 -0
  437. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_modular_pipeline.py +0 -0
  438. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_modular_progress.py +0 -0
  439. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mps_fallback_warning.py +0 -0
  440. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_mps_rope_precision.py +0 -0
  441. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_null_media.py +0 -0
  442. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_observed_cost.py +0 -0
  443. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_offload_placement.py +0 -0
  444. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_output_references.py +0 -0
  445. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_pair_audio.py +0 -0
  446. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_pair_audio_fit.py +0 -0
  447. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_parallel_loading_default.py +0 -0
  448. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_phase_events.py +0 -0
  449. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_pipeline_caching.py +0 -0
  450. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_pipeline_components.py +0 -0
  451. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_plan.py +0 -0
  452. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_plugin_skills.py +0 -0
  453. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_prepare_pipeline.py +0 -0
  454. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_previous_result_walker_parity.py +0 -0
  455. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_previous_results.py +0 -0
  456. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_prompt_library.py +0 -0
  457. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_prompt_parser.py +0 -0
  458. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_prompt_references.py +0 -0
  459. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_prompt_weighting.py +0 -0
  460. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_prompts.py +0 -0
  461. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_real_models.py +0 -0
  462. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_realize.py +0 -0
  463. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_recenter_crop.py +0 -0
  464. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_reference_limits.py +0 -0
  465. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_reference_names.py +0 -0
  466. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_reference_skip_sets.py +0 -0
  467. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_references.py +0 -0
  468. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_rerun_new_seed.py +0 -0
  469. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_resize_bucket.py +0 -0
  470. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_result.py +0 -0
  471. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_result_fps.py +0 -0
  472. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_result_output_naming.py +0 -0
  473. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_rule_parity.py +0 -0
  474. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_runs.py +0 -0
  475. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_scalar_result_validation.py +0 -0
  476. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_scheduler_config.py +0 -0
  477. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_schema.py +0 -0
  478. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_security.py +0 -0
  479. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_security_input_caps.py +0 -0
  480. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_security_ssrf.py +0 -0
  481. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_security_symlinks.py +0 -0
  482. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_security_trust_gate.py +0 -0
  483. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_security_web_headers.py +0 -0
  484. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_segment.py +0 -0
  485. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_select.py +0 -0
  486. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_select_validation.py +0 -0
  487. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_serve_main.py +0 -0
  488. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server_downloads.py +0 -0
  489. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server_exports.py +0 -0
  490. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server_info.py +0 -0
  491. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server_mcp.py +0 -0
  492. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_server_workspaces.py +0 -0
  493. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_shaping_logs.py +0 -0
  494. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_shot_span_preflight.py +0 -0
  495. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_slice_preflight.py +0 -0
  496. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_speech_generation.py +0 -0
  497. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_stabilize.py +0 -0
  498. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_step.py +0 -0
  499. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_strip_exif_and_watermark.py +0 -0
  500. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_sub_workflow_resolver.py +0 -0
  501. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_subfolders.py +0 -0
  502. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_task.py +0 -0
  503. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_task_discovery.py +0 -0
  504. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_task_domains.py +0 -0
  505. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_task_signature_errors.py +0 -0
  506. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_template_defaults.py +0 -0
  507. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_template_subfolders.py +0 -0
  508. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_tensor_image.py +0 -0
  509. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_text_generation.py +0 -0
  510. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_text_sections.py +0 -0
  511. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_transcribe_audio.py +0 -0
  512. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_type_helpers.py +0 -0
  513. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_updater.py +0 -0
  514. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_validate_arguments.py +0 -0
  515. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_validation.py +0 -0
  516. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_variable_constraints.py +0 -0
  517. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_variables.py +0 -0
  518. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_video_extensions.py +0 -0
  519. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_video_size_errors.py +0 -0
  520. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_video_utils.py +0 -0
  521. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_voice_attribution.py +0 -0
  522. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_vram_estimate.py +0 -0
  523. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_vram_inheritance.py +0 -0
  524. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_worker.py +0 -0
  525. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_worker_job_peak_rss.py +0 -0
  526. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_worker_manager.py +0 -0
  527. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_worker_messages.py +0 -0
  528. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_workflow.py +0 -0
  529. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_workflow_snapshot.py +0 -0
  530. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_workflow_step_cache.py +0 -0
  531. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.0}/tests/test_workflow_trust.py +0 -0
  532. {diffusers_workflow-0.7.0 → diffusers_workflow-0.8.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.7.0
3
+ Version: 0.8.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 59 tools covering the whole surface — the
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 59 tools covering the whole surface — the
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.7.0
3
+ Version: 0.8.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 59 tools covering the whole surface — the
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
 
@@ -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-DQI1FUIr.js
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-a3j9A86u.js
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-BcdiHyGC.js
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-DCj-aPE8.js
180
+ dw/server/ui/assets/handlebars-8Sswqnxq.js
174
181
  dw/server/ui/assets/hcl-CpzslTdj.js
175
- dw/server/ui/assets/html-D8xomw9g.js
182
+ dw/server/ui/assets/html-BYtYo7f1.js
176
183
  dw/server/ui/assets/html.worker-C93Ht9o9.js
177
- dw/server/ui/assets/htmlMode-DK_n-eew.js
178
- dw/server/ui/assets/index-3Vw6WAPW.css
179
- dw/server/ui/assets/index-CNiY-pOw.js
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-SmmG4uTF.js
189
+ dw/server/ui/assets/javascript-E4m083D3.js
183
190
  dw/server/ui/assets/json.worker-B2V3pomh.js
184
- dw/server/ui/assets/jsonMode-BRyslvRu.js
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-CC4C0BTL.js
190
- dw/server/ui/assets/lspLanguageFeatures-Cmg2_33_.js
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-DTAejllH.js
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-C_Um4bRZ.js
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-DKASw3vF.js
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-CkEOBTMa.js
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-CmkUIEUu.js
242
+ dw/server/ui/assets/tsMode-B6BV7a76.js
236
243
  dw/server/ui/assets/twig-De2hgUGE.js
237
- dw/server/ui/assets/typescript-BXTFUpwg.js
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-Cpj1l6gK.js
242
- dw/server/ui/assets/xml-D1BkO5yz.js
243
- dw/server/ui/assets/yaml-CDFThBDz.js
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
- searched = ", ".join(root.root for root in library.roots())
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 'asset:' reference "
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` | `run_workflow` and `rerun_job` refuse until `acknowledged_cost` is set. | `tests/test_mcp_diagnose.py::test_run_refuses_without_an_acknowledged_cost`, `tests/test_mcp_diagnose.py::test_rerun_refuses_without_an_acknowledged_cost` |
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
- 59 tools in six groups. Names and arguments below are transcribed from
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 is read from the job record (`run_dir`) and the reply adds `job_id` and the resolved `run_dir` to the usual `name` / `deleted` / `run_swept`; a job that never wrote a run directory, or an unknown one, is an error. `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; a `job_id` delete with no `workspace` goes to the workspace the job ran in |
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