diffusers-workflow 0.11.0__tar.gz → 0.12.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 (607) hide show
  1. {diffusers_workflow-0.11.0/diffusers_workflow.egg-info → diffusers_workflow-0.12.0}/PKG-INFO +1 -1
  2. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0/diffusers_workflow.egg-info}/PKG-INFO +1 -1
  3. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/SOURCES.txt +30 -21
  4. diffusers_workflow-0.12.0/dw/disk_caches.py +471 -0
  5. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/ACCELERATION.md +22 -3
  6. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/ARCHITECTURE.md +3 -1
  7. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/LORAS.md +4 -0
  8. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/MCP.md +2 -2
  9. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/QUANTIZATION.md +27 -0
  10. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/RECIPES_24GB.md +73 -17
  11. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/RELEASING.md +109 -0
  12. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/REMOTE.md +2 -0
  13. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/SECURITY.md +4 -0
  14. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/SERVER.md +49 -2
  15. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/TASKS.md +5 -3
  16. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/WORKER_GUIDE.md +14 -0
  17. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/WORKFLOW_GUIDE.md +12 -1
  18. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/dsp.py +19 -0
  19. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/media.py +112 -23
  20. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_ownership.py +18 -2
  21. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/adapters.py +103 -36
  22. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/components.py +61 -8
  23. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/pipeline.py +32 -1
  24. diffusers_workflow-0.12.0/dw/quantized_cache.py +917 -0
  25. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/script_lines.py +66 -0
  26. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/serve.py +13 -0
  27. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/api_models.py +59 -0
  28. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/deps.py +25 -0
  29. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/media.py +14 -6
  30. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/system.py +85 -0
  31. diffusers_workflow-0.11.0/dw/server/ui/assets/cssMode-ukxfz-ce.js → diffusers_workflow-0.12.0/dw/server/ui/assets/cssMode-n9saDHXf.js +1 -1
  32. diffusers_workflow-0.11.0/dw/server/ui/assets/editor.api-Bkt_tsj1.js → diffusers_workflow-0.12.0/dw/server/ui/assets/editor.api-DBE2zlnf.js +1 -1
  33. diffusers_workflow-0.11.0/dw/server/ui/assets/freemarker2-DbXygLvH.js → diffusers_workflow-0.12.0/dw/server/ui/assets/freemarker2-BomqYelz.js +1 -1
  34. diffusers_workflow-0.11.0/dw/server/ui/assets/handlebars-BdhZGoSz.js → diffusers_workflow-0.12.0/dw/server/ui/assets/handlebars-8Houv1UM.js +1 -1
  35. diffusers_workflow-0.11.0/dw/server/ui/assets/html-Chhg10Tp.js → diffusers_workflow-0.12.0/dw/server/ui/assets/html-DaY0zzOJ.js +1 -1
  36. diffusers_workflow-0.11.0/dw/server/ui/assets/htmlMode-cC3JW4lx.js → diffusers_workflow-0.12.0/dw/server/ui/assets/htmlMode-DP2rYJIT.js +1 -1
  37. diffusers_workflow-0.11.0/dw/server/ui/assets/index-BYEwBCrU.css → diffusers_workflow-0.12.0/dw/server/ui/assets/index-CZtjWH1q.css +1 -1
  38. diffusers_workflow-0.11.0/dw/server/ui/assets/index-CkD0GJG0.js → diffusers_workflow-0.12.0/dw/server/ui/assets/index-DGl2EK47.js +11 -9
  39. diffusers_workflow-0.11.0/dw/server/ui/assets/javascript-BWWLMkof.js → diffusers_workflow-0.12.0/dw/server/ui/assets/javascript-B5R3UPTQ.js +1 -1
  40. diffusers_workflow-0.11.0/dw/server/ui/assets/jsonMode-DrC8C29V.js → diffusers_workflow-0.12.0/dw/server/ui/assets/jsonMode-DsuGIxoD.js +1 -1
  41. diffusers_workflow-0.11.0/dw/server/ui/assets/liquid-CXdQfmUT.js → diffusers_workflow-0.12.0/dw/server/ui/assets/liquid-B2d5ZvOn.js +1 -1
  42. diffusers_workflow-0.11.0/dw/server/ui/assets/lspLanguageFeatures-BgAhb71w.js → diffusers_workflow-0.12.0/dw/server/ui/assets/lspLanguageFeatures-ChdmQify.js +1 -1
  43. diffusers_workflow-0.11.0/dw/server/ui/assets/mdx-CQS0lFaZ.js → diffusers_workflow-0.12.0/dw/server/ui/assets/mdx-DIXDAORJ.js +1 -1
  44. diffusers_workflow-0.11.0/dw/server/ui/assets/monaco-Z_sI-RLU.js → diffusers_workflow-0.12.0/dw/server/ui/assets/monaco-BgG3yDUh.js +4 -4
  45. diffusers_workflow-0.11.0/dw/server/ui/assets/python-C9MtI630.js → diffusers_workflow-0.12.0/dw/server/ui/assets/python-CXHtns6L.js +1 -1
  46. diffusers_workflow-0.11.0/dw/server/ui/assets/razor-DPO5mHyR.js → diffusers_workflow-0.12.0/dw/server/ui/assets/razor-BSKKsa7H.js +1 -1
  47. diffusers_workflow-0.11.0/dw/server/ui/assets/tsMode-D8vGBTVc.js → diffusers_workflow-0.12.0/dw/server/ui/assets/tsMode-DRjPuZ2P.js +1 -1
  48. diffusers_workflow-0.11.0/dw/server/ui/assets/typescript-DyoEkQLT.js → diffusers_workflow-0.12.0/dw/server/ui/assets/typescript-CBpoJtqE.js +1 -1
  49. diffusers_workflow-0.11.0/dw/server/ui/assets/workers-Bdewp_DS.js → diffusers_workflow-0.12.0/dw/server/ui/assets/workers-DUo4Mox_.js +1 -1
  50. diffusers_workflow-0.11.0/dw/server/ui/assets/xml-DmmKOVWo.js → diffusers_workflow-0.12.0/dw/server/ui/assets/xml-B2gZoNmP.js +1 -1
  51. diffusers_workflow-0.11.0/dw/server/ui/assets/yaml-C4jCTuer.js → diffusers_workflow-0.12.0/dw/server/ui/assets/yaml-CSvo_Woe.js +1 -1
  52. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/index.html +2 -2
  53. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/step_cache.py +117 -17
  54. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/assess.py +20 -5
  55. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/audio_transcription.py +53 -1
  56. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/cuts.py +41 -22
  57. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/restore_faces.py +18 -8
  58. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/script_check.py +11 -46
  59. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/worker.py +44 -10
  60. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflow.py +8 -2
  61. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflow_run.py +41 -7
  62. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/catalog.py +10 -3
  63. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/tools_catalog.py +27 -20
  64. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/workspaces.py +31 -0
  65. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/pyproject.toml +1 -1
  66. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_api_contract.py +3 -0
  67. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_assess.py +8 -3
  68. diffusers_workflow-0.12.0/tests/test_catalog_speed_defaults.py +76 -0
  69. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_catalog_structure.py +4 -1
  70. diffusers_workflow-0.12.0/tests/test_disk_caches.py +769 -0
  71. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_inherited_cost.py +30 -0
  72. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_server.py +7 -0
  73. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_workspaces.py +79 -1
  74. diffusers_workflow-0.12.0/tests/test_media_decode_threads.py +81 -0
  75. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_media_info.py +59 -0
  76. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_modular_pipeline.py +19 -0
  77. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_plan_cuts.py +89 -0
  78. diffusers_workflow-0.12.0/tests/test_quantized_cache.py +1597 -0
  79. diffusers_workflow-0.12.0/tests/test_restore_faces_helper_cache.py +93 -0
  80. diffusers_workflow-0.12.0/tests/test_runtime_settings.py +151 -0
  81. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server.py +30 -0
  82. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_assess.py +1 -1
  83. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_step_cache.py +205 -72
  84. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_transcribe_audio.py +115 -3
  85. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_execute.py +46 -1
  86. diffusers_workflow-0.12.0/tests/test_workflow_run_keys.py +42 -0
  87. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_workflow_step_cache.py +120 -0
  88. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/LICENSE +0 -0
  89. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/MANIFEST.in +0 -0
  90. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/README.md +0 -0
  91. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
  92. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
  93. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/requires.txt +0 -0
  94. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
  95. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/__init__.py +0 -0
  96. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/adapter_compatibility.py +0 -0
  97. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/argument_media.py +0 -0
  98. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/argument_warnings.py +0 -0
  99. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/arguments.py +0 -0
  100. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/assessment_rules.py +0 -0
  101. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/assets.py +0 -0
  102. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/audio_qc.py +0 -0
  103. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/cache_blocks.json +0 -0
  104. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/cache_blocks.py +0 -0
  105. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
  106. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/community_pipelines/pipeline_ltx2_refine.py +0 -0
  107. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/content_types.py +0 -0
  108. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/devices.py +0 -0
  109. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/dissolve_frame_errors.py +0 -0
  110. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/AGENT_LOOP.md +0 -0
  111. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/DEPENDENCIES.md +0 -0
  112. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/IP_ADAPTER.md +0 -0
  113. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
  114. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
  115. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/TESTING.md +0 -0
  116. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/docs/WORKSPACES.md +0 -0
  117. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/download_watch.py +0 -0
  118. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/elision.py +0 -0
  119. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/events.py +0 -0
  120. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/for_each.py +0 -0
  121. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/guides.py +0 -0
  122. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/hold_audio.py +0 -0
  123. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/host_memory.py +0 -0
  124. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/host_memory_projection.py +0 -0
  125. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/hub_cache.py +0 -0
  126. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/introspection.py +0 -0
  127. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/kernel_availability.py +0 -0
  128. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/library.py +0 -0
  129. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/locations.py +0 -0
  130. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/log_setup.py +0 -0
  131. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/lora_catalog.py +0 -0
  132. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/lora_catalog_schema.json +0 -0
  133. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/lora_hub.py +0 -0
  134. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/media_frames.py +0 -0
  135. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/media_types.py +0 -0
  136. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/outbound.py +0 -0
  137. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/output_extraction.py +0 -0
  138. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/path_redaction.py +0 -0
  139. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/chain.py +0 -0
  140. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/config_objects.py +0 -0
  141. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_guide_steps.py +0 -0
  142. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_guides.py +0 -0
  143. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_hold.py +0 -0
  144. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_hold_steps.py +0 -0
  145. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/h3_rules.py +0 -0
  146. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/placement.py +0 -0
  147. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/progress.py +0 -0
  148. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/pipeline_processors/remote.py +0 -0
  149. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/plan.py +0 -0
  150. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/previous_results.py +0 -0
  151. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/probe_paths.py +0 -0
  152. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/prompt_schema.json +0 -0
  153. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/prompt_weighting.py +0 -0
  154. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/prompts.py +0 -0
  155. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/realize.py +0 -0
  156. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/reference_limits.py +0 -0
  157. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/reference_names.py +0 -0
  158. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/references.py +0 -0
  159. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/result.py +0 -0
  160. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/run.py +0 -0
  161. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/runs.py +0 -0
  162. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/scalar_result_validation.py +0 -0
  163. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/schema.py +0 -0
  164. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/security.py +0 -0
  165. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/__init__.py +0 -0
  166. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/admission.py +0 -0
  167. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/app.py +0 -0
  168. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/assess.py +0 -0
  169. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/catalog.py +0 -0
  170. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/catalog_shape.py +0 -0
  171. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/enhancers.py +0 -0
  172. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/exports.py +0 -0
  173. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/guides.py +0 -0
  174. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/http_security.py +0 -0
  175. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/inline_media.py +0 -0
  176. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/job_history.py +0 -0
  177. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/job_record.py +0 -0
  178. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/job_results.py +0 -0
  179. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/jobs.py +0 -0
  180. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/mcp_mount.py +0 -0
  181. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/netinfo.py +0 -0
  182. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/observed_cost.py +0 -0
  183. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/outputs.py +0 -0
  184. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/pool.py +0 -0
  185. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/__init__.py +0 -0
  186. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/assets.py +0 -0
  187. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/files.py +0 -0
  188. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/gallery.py +0 -0
  189. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/jobs.py +0 -0
  190. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/library.py +0 -0
  191. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/routes/loras.py +0 -0
  192. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/sysinfo.py +0 -0
  193. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
  194. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
  195. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
  196. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
  197. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
  198. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
  199. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
  200. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/codicon-DF1abBS2.ttf +0 -0
  201. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
  202. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
  203. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
  204. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
  205. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
  206. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/css.worker-C6lDtRpF.js +0 -0
  207. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
  208. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
  209. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
  210. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
  211. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/editor-DjpsE8to.css +0 -0
  212. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/editor.worker-BmdWdrHZ.js +0 -0
  213. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
  214. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
  215. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
  216. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
  217. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
  218. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
  219. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/html.worker-C5yZDBHz.js +0 -0
  220. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
  221. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
  222. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/json.worker-DdeUAmHa.js +0 -0
  223. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
  224. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
  225. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
  226. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
  227. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
  228. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
  229. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
  230. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
  231. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/monaco-n7clI0si.css +0 -0
  232. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
  233. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
  234. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
  235. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
  236. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
  237. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
  238. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
  239. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
  240. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
  241. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
  242. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
  243. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
  244. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
  245. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
  246. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
  247. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
  248. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
  249. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
  250. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
  251. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
  252. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
  253. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
  254. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
  255. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
  256. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
  257. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
  258. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
  259. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
  260. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
  261. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
  262. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
  263. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
  264. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
  265. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
  266. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/ts.worker-DGGa2mF8.js +0 -0
  267. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
  268. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
  269. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
  270. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
  271. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/updater.py +0 -0
  272. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/server/worker_memory.py +0 -0
  273. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/settings.py +0 -0
  274. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/shot_span_preflight.py +0 -0
  275. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/shots.py +0 -0
  276. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/slice_preflight.py +0 -0
  277. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/step.py +0 -0
  278. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/step_value_checks.py +0 -0
  279. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/subfolders.py +0 -0
  280. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/task_domains.py +0 -0
  281. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/task_problems.py +0 -0
  282. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/audio_dynamics.py +0 -0
  283. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/audio_handlers.py +0 -0
  284. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/audio_utils.py +0 -0
  285. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/background_remover.py +0 -0
  286. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/beats.py +0 -0
  287. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/borders.py +0 -0
  288. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/compose_text.py +0 -0
  289. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/concat_videos.py +0 -0
  290. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/depth_estimator.py +0 -0
  291. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/diffusion_upscale.py +0 -0
  292. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/dissolve_videos.py +0 -0
  293. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/face_track.py +0 -0
  294. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/finish.py +0 -0
  295. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/finish_handlers.py +0 -0
  296. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/fit.py +0 -0
  297. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/format_messages.py +0 -0
  298. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/gather.py +0 -0
  299. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/grade.py +0 -0
  300. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/h3_latent_upscale.py +0 -0
  301. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/h3_latent_upscaler_model.py +0 -0
  302. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/image_ops.py +0 -0
  303. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/image_to_text.py +0 -0
  304. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/image_utils.py +0 -0
  305. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/interpolate_frames.py +0 -0
  306. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/join_into_song.py +0 -0
  307. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/joins.py +0 -0
  308. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/judge.py +0 -0
  309. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/loop_bed.py +0 -0
  310. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/lut.py +0 -0
  311. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/measure_sync.py +0 -0
  312. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/model_cache.py +0 -0
  313. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/model_handlers.py +0 -0
  314. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/pair_audio.py +0 -0
  315. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/qr_code.py +0 -0
  316. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/registry.py +0 -0
  317. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/rife_model.py +0 -0
  318. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/segment.py +0 -0
  319. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/select.py +0 -0
  320. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/speech_generation.py +0 -0
  321. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/stabilize.py +0 -0
  322. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/task.py +0 -0
  323. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/tensor_image.py +0 -0
  324. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/text_generation.py +0 -0
  325. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/text_sections.py +0 -0
  326. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/trim.py +0 -0
  327. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/upscale.py +0 -0
  328. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/video_handlers.py +0 -0
  329. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/video_utils.py +0 -0
  330. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/voice_attribution.py +0 -0
  331. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/windows.py +0 -0
  332. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/tasks/zoe_depth.py +0 -0
  333. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/test.py +0 -0
  334. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/trust.py +0 -0
  335. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/type_helpers.py +0 -0
  336. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/type_references.py +0 -0
  337. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/validate.py +0 -0
  338. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/validation.py +0 -0
  339. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/variable_constraints.py +0 -0
  340. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/variables.py +0 -0
  341. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/video_extensions.py +0 -0
  342. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/video_size_errors.py +0 -0
  343. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/vram_estimate.py +0 -0
  344. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/vram_inheritance.py +0 -0
  345. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/window_count_errors.py +0 -0
  346. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/worker_manager.py +0 -0
  347. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/worker_protocol.py +0 -0
  348. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflow_schema.json +0 -0
  349. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflows/h3_context_ir.json +0 -0
  350. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workflows/test.json +0 -0
  351. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/workspace.py +0 -0
  352. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw/writers.py +0 -0
  353. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/__init__.py +0 -0
  354. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/__main__.py +0 -0
  355. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/assets.py +0 -0
  356. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/authoring.py +0 -0
  357. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/client.py +0 -0
  358. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/confine.py +0 -0
  359. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/diagnose.py +0 -0
  360. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/exports.py +0 -0
  361. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/guides.py +0 -0
  362. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/loras.py +0 -0
  363. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/media.py +0 -0
  364. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/models.py +0 -0
  365. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/prompts.py +0 -0
  366. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/server.py +0 -0
  367. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/tools_authoring.py +0 -0
  368. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/tools_jobs.py +0 -0
  369. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/dw_mcp/tools_media.py +0 -0
  370. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/setup.cfg +0 -0
  371. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_admission.py +0 -0
  372. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_admission_capacity.py +0 -0
  373. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_analyze_beats.py +0 -0
  374. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_arch_metrics.py +0 -0
  375. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_arch_report.py +0 -0
  376. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_architecture_map.py +0 -0
  377. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_argument_updates.py +0 -0
  378. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_arguments.py +0 -0
  379. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_assemble_and_score_target_lufs.py +0 -0
  380. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_assessment_rules.py +0 -0
  381. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_assets.py +0 -0
  382. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_attention_slicing.py +0 -0
  383. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_audio_utils.py +0 -0
  384. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_best_of_n_template.py +0 -0
  385. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_borders.py +0 -0
  386. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_cache_blocks.py +0 -0
  387. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_catalog_shape.py +0 -0
  388. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_chain.py +0 -0
  389. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ci_config.py +0 -0
  390. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_cli.py +0 -0
  391. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_component_name_errors.py +0 -0
  392. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_component_pruning.py +0 -0
  393. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_component_type_errors.py +0 -0
  394. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_compose_text.py +0 -0
  395. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_concat_videos.py +0 -0
  396. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_config_objects.py +0 -0
  397. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_configuration_schema.py +0 -0
  398. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_content_types.py +0 -0
  399. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_depth_estimator.py +0 -0
  400. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_device.py +0 -0
  401. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_device_helpers.py +0 -0
  402. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_device_portability.py +0 -0
  403. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_dialogue_short_voices.py +0 -0
  404. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_diffusion_upscale.py +0 -0
  405. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_dissolve_frame_errors.py +0 -0
  406. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_dissolve_videos.py +0 -0
  407. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_docs_links.py +0 -0
  408. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_download_watch.py +0 -0
  409. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_dsp.py +0 -0
  410. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_elision.py +0 -0
  411. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_events.py +0 -0
  412. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_examples.py +0 -0
  413. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_face_track.py +0 -0
  414. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_find_loop_bed.py +0 -0
  415. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_finish.py +0 -0
  416. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_fit_templates.py +0 -0
  417. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_fit_to_model.py +0 -0
  418. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_for_each.py +0 -0
  419. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_gather.py +0 -0
  420. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_grade.py +0 -0
  421. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_guide_chain_validation.py +0 -0
  422. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_guides_validation.py +0 -0
  423. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_adapters.py +0 -0
  424. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_context_ir.py +0 -0
  425. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_guides.py +0 -0
  426. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_hold_audio.py +0 -0
  427. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_latent_upscale.py +0 -0
  428. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_refine.py +0 -0
  429. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_rules.py +0 -0
  430. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_schedule.py +0 -0
  431. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_upscaler_source.py +0 -0
  432. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_h3_vram_ceiling.py +0 -0
  433. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_hf_placement.py +0 -0
  434. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_host_memory.py +0 -0
  435. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_host_memory_projection.py +0 -0
  436. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_hub_cache.py +0 -0
  437. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_image_ops.py +0 -0
  438. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_image_to_text.py +0 -0
  439. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_image_utils.py +0 -0
  440. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_inductor_cache_default.py +0 -0
  441. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ingredients_grid.py +0 -0
  442. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_integration.py +0 -0
  443. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_interpolate_frames.py +0 -0
  444. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_introspection.py +0 -0
  445. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_job_history_device.py +0 -0
  446. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_job_history_wal.py +0 -0
  447. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_job_progress.py +0 -0
  448. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_job_warnings.py +0 -0
  449. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_jobs_listing.py +0 -0
  450. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_jobs_reused.py +0 -0
  451. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_join_into_song.py +0 -0
  452. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_join_windows.py +0 -0
  453. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_judge.py +0 -0
  454. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_kernel_availability.py +0 -0
  455. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_library_path.py +0 -0
  456. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_library_sources.py +0 -0
  457. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_list_images.py +0 -0
  458. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_locations.py +0 -0
  459. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_alpha.py +0 -0
  460. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_catalog.py +0 -0
  461. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_disable.py +0 -0
  462. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_hub.py +0 -0
  463. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lora_library.py +0 -0
  464. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx2_diffusion_decode.py +0 -0
  465. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx2_extend_clip.py +0 -0
  466. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx2_ic_loras.py +0 -0
  467. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx2_refine_pipeline.py +0 -0
  468. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ltx_prompt_library.py +0 -0
  469. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_lut.py +0 -0
  470. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_assets.py +0 -0
  471. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_authoring.py +0 -0
  472. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_catalog.py +0 -0
  473. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_client.py +0 -0
  474. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_confine.py +0 -0
  475. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_diagnose.py +0 -0
  476. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_exports.py +0 -0
  477. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_guides.py +0 -0
  478. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_loras.py +0 -0
  479. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_main.py +0 -0
  480. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_media.py +0 -0
  481. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_models.py +0 -0
  482. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_prompts.py +0 -0
  483. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mcp_twins.py +0 -0
  484. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_measure_sync.py +0 -0
  485. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_media_audio.py +0 -0
  486. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_media_frames.py +0 -0
  487. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_media_layering.py +0 -0
  488. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mix_audio.py +0 -0
  489. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_model_cache.py +0 -0
  490. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_modular_output_properties.py +0 -0
  491. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_modular_progress.py +0 -0
  492. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mps_fallback_warning.py +0 -0
  493. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_mps_rope_precision.py +0 -0
  494. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_null_media.py +0 -0
  495. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_numeric_coercion.py +0 -0
  496. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_observed_cost.py +0 -0
  497. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_offload_placement.py +0 -0
  498. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_outbound.py +0 -0
  499. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_output_references.py +0 -0
  500. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_pair_audio.py +0 -0
  501. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_pair_audio_fit.py +0 -0
  502. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_parallel_loading_default.py +0 -0
  503. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_path_redaction.py +0 -0
  504. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_phase_events.py +0 -0
  505. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_pipeline_caching.py +0 -0
  506. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_pipeline_components.py +0 -0
  507. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_plan.py +0 -0
  508. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_plugin_skills.py +0 -0
  509. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prepare_pipeline.py +0 -0
  510. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_previous_result_walker_parity.py +0 -0
  511. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_previous_results.py +0 -0
  512. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompt_library.py +0 -0
  513. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompt_parser.py +0 -0
  514. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompt_references.py +0 -0
  515. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompt_weighting.py +0 -0
  516. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_prompts.py +0 -0
  517. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_read_frame_range.py +0 -0
  518. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_real_models.py +0 -0
  519. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_realize.py +0 -0
  520. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_recenter_crop.py +0 -0
  521. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_reference_limits.py +0 -0
  522. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_reference_names.py +0 -0
  523. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_reference_skip_sets.py +0 -0
  524. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_references.py +0 -0
  525. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_rerun_new_seed.py +0 -0
  526. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_resize_bucket.py +0 -0
  527. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_restore_faces_video.py +0 -0
  528. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_result.py +0 -0
  529. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_result_fps.py +0 -0
  530. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_result_output_naming.py +0 -0
  531. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_rule_parity.py +0 -0
  532. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_runs.py +0 -0
  533. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_scalar_result_validation.py +0 -0
  534. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_scheduler_config.py +0 -0
  535. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_schema.py +0 -0
  536. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_script_check.py +0 -0
  537. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security.py +0 -0
  538. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_auth.py +0 -0
  539. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_decoder_bombs.py +0 -0
  540. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_input_caps.py +0 -0
  541. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_ssrf.py +0 -0
  542. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_symlinks.py +0 -0
  543. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_trust_gate.py +0 -0
  544. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_security_web_headers.py +0 -0
  545. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_segment.py +0 -0
  546. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_select.py +0 -0
  547. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_select_validation.py +0 -0
  548. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_separate_stems.py +0 -0
  549. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_serve_main.py +0 -0
  550. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_downloads.py +0 -0
  551. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_exports.py +0 -0
  552. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_gallery_image.py +0 -0
  553. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_guides.py +0 -0
  554. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_info.py +0 -0
  555. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_jobs.py +0 -0
  556. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_library_path.py +0 -0
  557. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_loras.py +0 -0
  558. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_mcp.py +0 -0
  559. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_server_workspaces.py +0 -0
  560. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_shaping_logs.py +0 -0
  561. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_shot_span_preflight.py +0 -0
  562. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_shots.py +0 -0
  563. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_slice_preflight.py +0 -0
  564. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_speech_generation.py +0 -0
  565. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_stabilize.py +0 -0
  566. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_step.py +0 -0
  567. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_strip_exif_and_watermark.py +0 -0
  568. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_sub_workflow_resolver.py +0 -0
  569. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_subfolders.py +0 -0
  570. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task.py +0 -0
  571. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_discovery.py +0 -0
  572. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_domains.py +0 -0
  573. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_public_imports.py +0 -0
  574. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_registry_rules.py +0 -0
  575. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_task_signature_errors.py +0 -0
  576. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_template_defaults.py +0 -0
  577. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_template_subfolders.py +0 -0
  578. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_tensor_image.py +0 -0
  579. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_text_generation.py +0 -0
  580. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_text_sections.py +0 -0
  581. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_trim_video.py +0 -0
  582. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_type_helpers.py +0 -0
  583. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_type_helpers_concurrency.py +0 -0
  584. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_ui_twins.py +0 -0
  585. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_updater.py +0 -0
  586. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_validate_arguments.py +0 -0
  587. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_validation.py +0 -0
  588. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_variable_constraints.py +0 -0
  589. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_variables.py +0 -0
  590. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_video_extensions.py +0 -0
  591. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_video_size_errors.py +0 -0
  592. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_video_utils.py +0 -0
  593. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_voice_attribution.py +0 -0
  594. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_vram_estimate.py +0 -0
  595. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_vram_guides.py +0 -0
  596. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_vram_inheritance.py +0 -0
  597. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_window_count_errors.py +0 -0
  598. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_window_video.py +0 -0
  599. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker.py +0 -0
  600. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_job_peak_rss.py +0 -0
  601. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_manager.py +0 -0
  602. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_messages.py +0 -0
  603. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_worker_pool.py +0 -0
  604. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_workflow.py +0 -0
  605. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_workflow_snapshot.py +0 -0
  606. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.0}/tests/test_workflow_trust.py +0 -0
  607. {diffusers_workflow-0.11.0 → diffusers_workflow-0.12.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.11.0
3
+ Version: 0.12.0
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusers-workflow
3
- Version: 0.11.0
3
+ Version: 0.12.0
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -20,6 +20,7 @@ dw/cache_blocks.json
20
20
  dw/cache_blocks.py
21
21
  dw/content_types.py
22
22
  dw/devices.py
23
+ dw/disk_caches.py
23
24
  dw/dissolve_frame_errors.py
24
25
  dw/download_watch.py
25
26
  dw/dsp.py
@@ -52,6 +53,7 @@ dw/probe_paths.py
52
53
  dw/prompt_schema.json
53
54
  dw/prompt_weighting.py
54
55
  dw/prompts.py
56
+ dw/quantized_cache.py
55
57
  dw/realize.py
56
58
  dw/reference_limits.py
57
59
  dw/reference_names.py
@@ -179,44 +181,44 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
179
181
  dw/server/ui/assets/csp-bTuwJoIa.js
180
182
  dw/server/ui/assets/css-DIMkf-bt.js
181
183
  dw/server/ui/assets/css.worker-C6lDtRpF.js
182
- dw/server/ui/assets/cssMode-ukxfz-ce.js
184
+ dw/server/ui/assets/cssMode-n9saDHXf.js
183
185
  dw/server/ui/assets/cypher-CVaqCwHa.js
184
186
  dw/server/ui/assets/dart-onAF5SnQ.js
185
187
  dw/server/ui/assets/dockerfile-DZFCIeNp.js
186
188
  dw/server/ui/assets/ecl-D05T4iGw.js
187
189
  dw/server/ui/assets/editor-DjpsE8to.css
188
- dw/server/ui/assets/editor.api-Bkt_tsj1.js
190
+ dw/server/ui/assets/editor.api-DBE2zlnf.js
189
191
  dw/server/ui/assets/editor.worker-BmdWdrHZ.js
190
192
  dw/server/ui/assets/elixir-6RTg0lbw.js
191
193
  dw/server/ui/assets/flow9-C5_-GSwl.js
192
- dw/server/ui/assets/freemarker2-DbXygLvH.js
194
+ dw/server/ui/assets/freemarker2-BomqYelz.js
193
195
  dw/server/ui/assets/fsharp-C8Ef5oNN.js
194
196
  dw/server/ui/assets/go-C-y9NEjX.js
195
197
  dw/server/ui/assets/graphql-fmXr3nnJ.js
196
- dw/server/ui/assets/handlebars-BdhZGoSz.js
198
+ dw/server/ui/assets/handlebars-8Houv1UM.js
197
199
  dw/server/ui/assets/hcl-CpzslTdj.js
198
- dw/server/ui/assets/html-Chhg10Tp.js
200
+ dw/server/ui/assets/html-DaY0zzOJ.js
199
201
  dw/server/ui/assets/html.worker-C5yZDBHz.js
200
- dw/server/ui/assets/htmlMode-cC3JW4lx.js
201
- dw/server/ui/assets/index-BYEwBCrU.css
202
- dw/server/ui/assets/index-CkD0GJG0.js
202
+ dw/server/ui/assets/htmlMode-DP2rYJIT.js
203
+ dw/server/ui/assets/index-CZtjWH1q.css
204
+ dw/server/ui/assets/index-DGl2EK47.js
203
205
  dw/server/ui/assets/ini-sBoK_t0W.js
204
206
  dw/server/ui/assets/java-BEtHBSE6.js
205
- dw/server/ui/assets/javascript-BWWLMkof.js
207
+ dw/server/ui/assets/javascript-B5R3UPTQ.js
206
208
  dw/server/ui/assets/json.worker-DdeUAmHa.js
207
- dw/server/ui/assets/jsonMode-DrC8C29V.js
209
+ dw/server/ui/assets/jsonMode-DsuGIxoD.js
208
210
  dw/server/ui/assets/julia-Bri6UV-V.js
209
211
  dw/server/ui/assets/kotlin-BOotOW0E.js
210
212
  dw/server/ui/assets/less-B9JPFI3C.js
211
213
  dw/server/ui/assets/lexon-CfSJPG6W.js
212
- dw/server/ui/assets/liquid-CXdQfmUT.js
213
- dw/server/ui/assets/lspLanguageFeatures-BgAhb71w.js
214
+ dw/server/ui/assets/liquid-B2d5ZvOn.js
215
+ dw/server/ui/assets/lspLanguageFeatures-ChdmQify.js
214
216
  dw/server/ui/assets/lua-CsQS60Ue.js
215
217
  dw/server/ui/assets/m3-D-oSqn_W.js
216
218
  dw/server/ui/assets/markdown-Cimd5fb3.js
217
- dw/server/ui/assets/mdx-CQS0lFaZ.js
219
+ dw/server/ui/assets/mdx-DIXDAORJ.js
218
220
  dw/server/ui/assets/mips-CIPQ_RoX.js
219
- dw/server/ui/assets/monaco-Z_sI-RLU.js
221
+ dw/server/ui/assets/monaco-BgG3yDUh.js
220
222
  dw/server/ui/assets/monaco-n7clI0si.css
221
223
  dw/server/ui/assets/msdax-DauUninz.js
222
224
  dw/server/ui/assets/mysql-SOo6toE5.js
@@ -232,10 +234,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
232
234
  dw/server/ui/assets/powershell-DmHpPYUd.js
233
235
  dw/server/ui/assets/protobuf-C531GsRP.js
234
236
  dw/server/ui/assets/pug-Z5eAx3Zn.js
235
- dw/server/ui/assets/python-C9MtI630.js
237
+ dw/server/ui/assets/python-CXHtns6L.js
236
238
  dw/server/ui/assets/qsharp-DkqhCAOL.js
237
239
  dw/server/ui/assets/r-BwWrilGY.js
238
- dw/server/ui/assets/razor-DPO5mHyR.js
240
+ dw/server/ui/assets/razor-BSKKsa7H.js
239
241
  dw/server/ui/assets/redis-ClamHrr6.js
240
242
  dw/server/ui/assets/redshift-DT7zqm-g.js
241
243
  dw/server/ui/assets/restructuredtext-BYgofb2h.js
@@ -255,15 +257,15 @@ dw/server/ui/assets/swift-Bxkupp3x.js
255
257
  dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
256
258
  dw/server/ui/assets/tcl-DISqw1ZD.js
257
259
  dw/server/ui/assets/ts.worker-DGGa2mF8.js
258
- dw/server/ui/assets/tsMode-D8vGBTVc.js
260
+ dw/server/ui/assets/tsMode-DRjPuZ2P.js
259
261
  dw/server/ui/assets/twig-De2hgUGE.js
260
- dw/server/ui/assets/typescript-DyoEkQLT.js
262
+ dw/server/ui/assets/typescript-CBpoJtqE.js
261
263
  dw/server/ui/assets/typespec-B8J7ngcE.js
262
264
  dw/server/ui/assets/vb-DV3o63ZY.js
263
265
  dw/server/ui/assets/wgsl-DpFanUEy.js
264
- dw/server/ui/assets/workers-Bdewp_DS.js
265
- dw/server/ui/assets/xml-DmmKOVWo.js
266
- dw/server/ui/assets/yaml-C4jCTuer.js
266
+ dw/server/ui/assets/workers-DUo4Mox_.js
267
+ dw/server/ui/assets/xml-B2gZoNmP.js
268
+ dw/server/ui/assets/yaml-CSvo_Woe.js
267
269
  dw/tasks/assess.py
268
270
  dw/tasks/audio_dynamics.py
269
271
  dw/tasks/audio_handlers.py
@@ -361,6 +363,7 @@ tests/test_best_of_n_template.py
361
363
  tests/test_borders.py
362
364
  tests/test_cache_blocks.py
363
365
  tests/test_catalog_shape.py
366
+ tests/test_catalog_speed_defaults.py
364
367
  tests/test_catalog_structure.py
365
368
  tests/test_chain.py
366
369
  tests/test_ci_config.py
@@ -379,6 +382,7 @@ tests/test_device_helpers.py
379
382
  tests/test_device_portability.py
380
383
  tests/test_dialogue_short_voices.py
381
384
  tests/test_diffusion_upscale.py
385
+ tests/test_disk_caches.py
382
386
  tests/test_dissolve_frame_errors.py
383
387
  tests/test_dissolve_videos.py
384
388
  tests/test_docs_links.py
@@ -463,6 +467,7 @@ tests/test_mcp_twins.py
463
467
  tests/test_mcp_workspaces.py
464
468
  tests/test_measure_sync.py
465
469
  tests/test_media_audio.py
470
+ tests/test_media_decode_threads.py
466
471
  tests/test_media_frames.py
467
472
  tests/test_media_info.py
468
473
  tests/test_media_layering.py
@@ -497,6 +502,7 @@ tests/test_prompt_parser.py
497
502
  tests/test_prompt_references.py
498
503
  tests/test_prompt_weighting.py
499
504
  tests/test_prompts.py
505
+ tests/test_quantized_cache.py
500
506
  tests/test_read_frame_range.py
501
507
  tests/test_real_models.py
502
508
  tests/test_realize.py
@@ -507,12 +513,14 @@ tests/test_reference_skip_sets.py
507
513
  tests/test_references.py
508
514
  tests/test_rerun_new_seed.py
509
515
  tests/test_resize_bucket.py
516
+ tests/test_restore_faces_helper_cache.py
510
517
  tests/test_restore_faces_video.py
511
518
  tests/test_result.py
512
519
  tests/test_result_fps.py
513
520
  tests/test_result_output_naming.py
514
521
  tests/test_rule_parity.py
515
522
  tests/test_runs.py
523
+ tests/test_runtime_settings.py
516
524
  tests/test_scalar_result_validation.py
517
525
  tests/test_scheduler_config.py
518
526
  tests/test_schema.py
@@ -590,6 +598,7 @@ tests/test_worker_manager.py
590
598
  tests/test_worker_messages.py
591
599
  tests/test_worker_pool.py
592
600
  tests/test_workflow.py
601
+ tests/test_workflow_run_keys.py
593
602
  tests/test_workflow_snapshot.py
594
603
  tests/test_workflow_step_cache.py
595
604
  tests/test_workflow_trust.py
@@ -0,0 +1,471 @@
1
+ """dw's own disk caches: what derived data its runs leave on disk, how big it
2
+ is, and clearing it (#828).
3
+
4
+ Each cache is a `DiskCache` in `CACHES`, named by the REST routes
5
+ (`GET /api/caches`, `DELETE /api/caches/{name}`) and summarized in the MCP
6
+ `get_server_info`'s `caches`:
7
+
8
+ - `inductor`: torch.compile's kernels, under `TORCHINDUCTOR_CACHE_DIR`, which
9
+ `dw/__init__.py` always sets.
10
+ - `triton`: Triton's compiled and autotuned kernels (SDNQ's `triton.jit` /
11
+ `triton.autotune` matmul and attention, most of the compile disk use).
12
+ Registered where Triton itself puts it - `TRITON_CACHE_DIR`, else
13
+ `$TRITON_HOME/.triton/cache`, else `~/.triton/cache` - resolved here
14
+ without importing triton. dw sets no `TRITON_*` variable and never creates
15
+ that directory.
16
+ - `quantized`: SDNQ components quantized once and saved (#815,
17
+ `dw/quantized_cache.py`), under `DW_QUANTIZED_CACHE_DIR`, enabled by
18
+ `DW_QUANTIZED_CACHE=1`. Its entries - one `<64-hex key>/` directory each,
19
+ described by its `entry.json` - are listed and can be deleted one at a time
20
+ (`DELETE /api/caches/quantized/entries/{entry}`). A cache that is off still
21
+ lists, and still clears, what is on disk.
22
+
23
+ **Clearing never trusts the root.** A root comes from an env var, and one
24
+ pointed at `~` by mistake must not be emptied. Only a root carrying the
25
+ `.dw-cache` marker is clearable. `mark_roots()`, run once at `dw.serve`
26
+ start, writes it into a root that is empty or missing (a missing `triton`
27
+ root is left missing), or into a populated root equal to the member's
28
+ default exactly - the cache dw (or Triton, by default) has been filling all
29
+ along. A populated root anywhere else stays unmarked and its clear is
30
+ refused, until someone marks it by hand.
31
+
32
+ **Clear empties the root and keeps it and its marker:** every top-level child
33
+ is renamed into one `<root>/.clearing-<pid>-<rand>/` directory, which is then
34
+ deleted. A writer racing the clear finds an empty cache and rebuilds; it never
35
+ reads a half-deleted tree. An entry delete moves the one entry the same way. The
36
+ routes refuse while a job is running or queued.
37
+
38
+ **An entry id must have a cache key's shape** (`quantized_cache.is_key`, 64
39
+ lowercase hex) before any path is built from it.
40
+ """
41
+
42
+ import importlib.util
43
+ import logging
44
+ import os
45
+ import secrets
46
+ import shutil
47
+ import threading
48
+ from dataclasses import dataclass
49
+ from typing import Callable
50
+
51
+ from . import _inductor_cache_dir_default, quantized_cache
52
+ from .security import SecurityError, validate_path
53
+
54
+ logger = logging.getLogger("dw")
55
+
56
+ MARKER = ".dw-cache"
57
+ _CLEARING_PREFIX = ".clearing-"
58
+ _MARKER_TEXT = (
59
+ "This directory is a cache dw may empty from its server page or "
60
+ "DELETE /api/caches. Delete this file to stop that.\n"
61
+ )
62
+
63
+ # One clear at a time: a second one would find the first's staging directory
64
+ # among the root's children and move it out from under its rmtree
65
+ _clear_lock = threading.Lock()
66
+
67
+
68
+ class UnknownCache(ValueError):
69
+ pass
70
+
71
+
72
+ class NotClearable(Exception):
73
+ pass
74
+
75
+
76
+ class NoEntries(ValueError):
77
+ """An entry operation on a cache that has no entries, or an entry id
78
+ that isn't one (a 400)."""
79
+
80
+
81
+ class UnknownEntry(ValueError):
82
+ pass
83
+
84
+
85
+ @dataclass(frozen=True)
86
+ class DiskCache:
87
+ name: str
88
+ # The absolute root, from the environment as it stands
89
+ root: Callable[[], str]
90
+ # The root with the member's env var unset - only for grandfathering
91
+ default_root: Callable[[], str]
92
+ enabled: Callable[[], bool]
93
+ cost_of_clearing: str
94
+ # Whether the cache lists entries of its own: `<root>/<64-hex id>/`
95
+ # directories, each described by an `entry.json`
96
+ has_entries: bool = False
97
+ # Whether mark_roots may create a missing root
98
+ create_root: bool = True
99
+ # The free space under which the cache's volume reads `low_disk`, from
100
+ # the volume's total - for a cache that refuses to write below a floor
101
+ low_disk_floor: Callable[[int], int] | None = None
102
+
103
+
104
+ def _inductor_root():
105
+ return os.path.abspath(
106
+ os.environ.get("TORCHINDUCTOR_CACHE_DIR")
107
+ or _inductor_cache_dir_default(os.environ)
108
+ )
109
+
110
+
111
+ def _inductor_default():
112
+ return os.path.abspath(_inductor_cache_dir_default(os.environ))
113
+
114
+
115
+ def _triton_default():
116
+ return os.path.abspath(os.path.join(os.path.expanduser("~"), ".triton", "cache"))
117
+
118
+
119
+ def _triton_root():
120
+ """Where Triton caches, as triton.knobs resolves it - without importing
121
+ triton, which the server process never loads and macOS doesn't have."""
122
+ explicit = os.environ.get("TRITON_CACHE_DIR", "").strip()
123
+ if explicit:
124
+ return os.path.abspath(os.path.expanduser(explicit))
125
+ home = os.environ.get("TRITON_HOME", "").strip()
126
+ if home:
127
+ return os.path.abspath(
128
+ os.path.join(os.path.expanduser(home), ".triton", "cache")
129
+ )
130
+ return _triton_default()
131
+
132
+
133
+ def _triton_installed():
134
+ # find_spec on a top-level name looks for it without importing it. The
135
+ # workers run in this interpreter's environment, so this is theirs too
136
+ return importlib.util.find_spec("triton") is not None
137
+
138
+
139
+ CACHES = {
140
+ cache.name: cache
141
+ for cache in (
142
+ DiskCache(
143
+ name="inductor",
144
+ root=_inductor_root,
145
+ default_root=_inductor_default,
146
+ enabled=lambda: True,
147
+ cost_of_clearing=(
148
+ "The next first step of each torch.compile'd shape compiles "
149
+ "its kernels again, up to a few minutes per shape."
150
+ ),
151
+ ),
152
+ DiskCache(
153
+ name="triton",
154
+ root=_triton_root,
155
+ default_root=_triton_default,
156
+ enabled=_triton_installed,
157
+ cost_of_clearing=(
158
+ "The next first step of each SDNQ or compiled shape "
159
+ "re-autotunes its Triton kernels (100-300 s on MiniMax-H3). "
160
+ "This directory is shared with any other Triton user on "
161
+ "this machine, whose kernels are cleared too."
162
+ ),
163
+ # A box without Triton gets no stray directory
164
+ create_root=False,
165
+ ),
166
+ DiskCache(
167
+ name="quantized",
168
+ root=quantized_cache.cache_root,
169
+ default_root=quantized_cache.default_root,
170
+ enabled=quantized_cache.enabled,
171
+ cost_of_clearing=(
172
+ "The next load of each SDNQ-quantized component reads its "
173
+ "bf16 weights and quantizes them again (minutes per component "
174
+ "on MiniMax-H3), and saves a new entry while the cache is on."
175
+ ),
176
+ has_entries=True,
177
+ # configure_at_startup creates it when the cache is on; a server
178
+ # with it off gets no stray directory
179
+ create_root=False,
180
+ low_disk_floor=quantized_cache.floor_bytes,
181
+ ),
182
+ )
183
+ }
184
+
185
+
186
+ def get(name):
187
+ try:
188
+ return CACHES[name]
189
+ except (KeyError, TypeError):
190
+ raise UnknownCache(
191
+ f"Unknown cache {name!r} - the caches are: {', '.join(CACHES)}"
192
+ ) from None
193
+
194
+
195
+ def _children(root):
196
+ """The root's entries other than the marker."""
197
+ with os.scandir(root) as entries:
198
+ return [entry for entry in entries if entry.name != MARKER]
199
+
200
+
201
+ def _has_marker(root):
202
+ return os.path.isfile(os.path.join(root, MARKER)) and not os.path.islink(
203
+ os.path.join(root, MARKER)
204
+ )
205
+
206
+
207
+ def _write_marker(root):
208
+ marker = validate_path(os.path.join(root, MARKER), base_dir=root)
209
+ with open(marker, "w") as f:
210
+ f.write(_MARKER_TEXT)
211
+
212
+
213
+ def mark_root(cache):
214
+ """Mark one cache's root as dw's to clear, if the rule allows it.
215
+ Returns whether the root carries the marker afterwards."""
216
+ root = cache.root()
217
+ if os.path.islink(root) or (os.path.exists(root) and not os.path.isdir(root)):
218
+ return False
219
+ if not os.path.exists(root):
220
+ if not cache.create_root:
221
+ return False
222
+ os.makedirs(root, exist_ok=True)
223
+ if _has_marker(root):
224
+ return True
225
+ if _children(root) and root != cache.default_root():
226
+ logger.info(
227
+ f"The {cache.name} cache at {root} was not created by dw and "
228
+ f"has no {MARKER} marker, so it can't be cleared from the server"
229
+ )
230
+ return False
231
+ _write_marker(root)
232
+ return True
233
+
234
+
235
+ def mark_roots():
236
+ """Write the ownership marker into each cache root the rule allows. Run
237
+ once at server start; a root it can't write is left unclearable."""
238
+ for cache in CACHES.values():
239
+ try:
240
+ mark_root(cache)
241
+ except (OSError, SecurityError) as e:
242
+ logger.warning(f"Could not mark the {cache.name} cache: {e}")
243
+
244
+
245
+ def _walk(top):
246
+ """(bytes, files, newest mtime) of the regular files under `top`,
247
+ symlinks neither followed nor counted, the marker not counted."""
248
+ total, files, newest = 0, 0, None
249
+ stack = [top]
250
+ while stack:
251
+ directory = stack.pop()
252
+ try:
253
+ entries = os.scandir(directory)
254
+ except OSError:
255
+ continue
256
+ with entries:
257
+ for entry in entries:
258
+ try:
259
+ if entry.is_dir(follow_symlinks=False):
260
+ stack.append(entry.path)
261
+ continue
262
+ if not entry.is_file(follow_symlinks=False):
263
+ continue
264
+ if entry.name == MARKER and directory == top:
265
+ continue
266
+ stat = entry.stat(follow_symlinks=False)
267
+ except OSError:
268
+ # A file deleted mid-walk (a racing compile's temp file)
269
+ continue
270
+ total += stat.st_size
271
+ files += 1
272
+ if newest is None or stat.st_mtime > newest:
273
+ newest = stat.st_mtime
274
+ return total, files, newest
275
+
276
+
277
+ def _volume(path):
278
+ """shutil.disk_usage of the volume `path` is (or would be) on: a missing
279
+ root is measured at its nearest existing ancestor."""
280
+ while path and not os.path.exists(path):
281
+ parent = os.path.dirname(path)
282
+ if parent == path:
283
+ return None
284
+ path = parent
285
+ try:
286
+ return shutil.disk_usage(path)
287
+ except OSError:
288
+ return None
289
+
290
+
291
+ def _reason(cache):
292
+ """Why `cache` can't be cleared now, or None. A root that came into being
293
+ after server start (Triton's, made by the first compile) is marked here
294
+ by the same rule mark_roots applies at startup."""
295
+ root = cache.root()
296
+ if os.path.isdir(root) and not _has_marker(root):
297
+ try:
298
+ mark_root(cache)
299
+ except (OSError, SecurityError) as e:
300
+ logger.warning(f"Could not mark the {cache.name} cache: {e}")
301
+ return _not_clearable_reason(root)
302
+
303
+
304
+ def _not_clearable_reason(root):
305
+ if not os.path.isdir(root) or os.path.islink(root):
306
+ return "root does not exist (nothing to clear)"
307
+ if not _has_marker(root):
308
+ return f"root not created by dw (no {MARKER} marker)"
309
+ return None
310
+
311
+
312
+ def scan(cache):
313
+ """One cache as plain data."""
314
+ root = cache.root()
315
+ present = os.path.isdir(root) and not os.path.islink(root)
316
+ total, files, newest = _walk(root) if present else (0, 0, None)
317
+ usage = _volume(root)
318
+ reason = _reason(cache)
319
+ info = {
320
+ "name": cache.name,
321
+ "root": root,
322
+ "enabled": cache.enabled(),
323
+ "bytes": total,
324
+ "files": files,
325
+ "last_used": newest,
326
+ "clearable": reason is None,
327
+ "cost_of_clearing": cache.cost_of_clearing,
328
+ "disk_free": usage.free if usage else None,
329
+ "disk_total": usage.total if usage else None,
330
+ }
331
+ if reason:
332
+ info["not_clearable_reason"] = reason
333
+ if cache.low_disk_floor and usage:
334
+ info["low_disk"] = usage.free < cache.low_disk_floor(usage.total)
335
+ if cache.has_entries:
336
+ info["entries"] = scan_entries(root) if present else []
337
+ return info
338
+
339
+
340
+ def _entry_fields(path):
341
+ """What an entry's `entry.json` says of it, or None when it can't be
342
+ read. `component` falls back to the subfolder - the component's name in
343
+ a diffusers repo - since entry.json doesn't record it."""
344
+ try:
345
+ entry = quantized_cache.read_entry(path)
346
+ except (OSError, ValueError):
347
+ return None
348
+ return {
349
+ "model": entry.get("model_name"),
350
+ "subfolder": entry.get("subfolder"),
351
+ "component": entry.get("component") or entry.get("subfolder") or None,
352
+ "created": entry.get("created"),
353
+ "last_hit": entry.get("last_hit"),
354
+ }
355
+
356
+
357
+ def scan_entries(root):
358
+ """Each `<64-hex id>/` directory under a cache root, newest first. An
359
+ entry whose `entry.json` is missing or unreadable is listed with
360
+ `unreadable: true`, so it can still be deleted."""
361
+ entries = []
362
+ with os.scandir(root) as children:
363
+ for child in children:
364
+ if not quantized_cache.is_key(child.name) or not child.is_dir(
365
+ follow_symlinks=False
366
+ ):
367
+ continue
368
+ total, files, newest = _walk(child.path)
369
+ fields = _entry_fields(child.path)
370
+ entry = {"id": child.name, "bytes": total, "files": files}
371
+ if fields is None:
372
+ entry.update(
373
+ unreadable=True,
374
+ model=None,
375
+ subfolder=None,
376
+ component=None,
377
+ created=newest,
378
+ last_hit=None,
379
+ )
380
+ else:
381
+ entry.update(unreadable=False, **fields)
382
+ entries.append(entry)
383
+ entries.sort(key=lambda e: e["created"] or 0, reverse=True)
384
+ return entries
385
+
386
+
387
+ def scan_all():
388
+ return [scan(cache) for cache in CACHES.values()]
389
+
390
+
391
+ def entry_cache(name, entry):
392
+ """The cache an entry route names, after checking the id's shape - so
393
+ nothing builds a path from a malformed one. Raises UnknownCache, or
394
+ NoEntries for a cache without entries or an id that isn't 64 hex."""
395
+ cache = get(name)
396
+ if not cache.has_entries:
397
+ raise NoEntries(f"The {name} cache has no entries - clear it whole")
398
+ if not quantized_cache.is_key(entry):
399
+ raise NoEntries(f"Not an entry id: {entry!r} (64 lowercase hex characters)")
400
+ return cache
401
+
402
+
403
+ def _stage_out(root, sources):
404
+ """Move `sources` (paths directly under `root`) into one fresh
405
+ `.clearing-*` directory and delete it. Returns (bytes, files) removed."""
406
+ staging = validate_path(
407
+ os.path.join(root, f"{_CLEARING_PREFIX}{os.getpid()}-{secrets.token_hex(4)}"),
408
+ base_dir=root,
409
+ )
410
+ os.mkdir(staging)
411
+ try:
412
+ for path in sources:
413
+ try:
414
+ source = validate_path(path, base_dir=root)
415
+ target = validate_path(
416
+ os.path.join(staging, os.path.basename(path)), base_dir=root
417
+ )
418
+ except SecurityError:
419
+ # A name validate_path refuses (one holding "..") stays
420
+ continue
421
+ try:
422
+ os.rename(source, target)
423
+ except FileNotFoundError:
424
+ continue
425
+ freed, files, _ = _walk(staging)
426
+ finally:
427
+ shutil.rmtree(staging, ignore_errors=True)
428
+ return freed, files
429
+
430
+
431
+ def delete_entry(name, entry):
432
+ """Delete one entry of a marked cache root. Returns `{freed, files}`.
433
+
434
+ Raises UnknownCache, NoEntries (no entries here, or a malformed id),
435
+ NotClearable for a root without the marker, or UnknownEntry - each
436
+ before anything is moved."""
437
+ cache = entry_cache(name, entry)
438
+ with _clear_lock:
439
+ root = cache.root()
440
+ reason = _reason(cache)
441
+ if reason:
442
+ raise NotClearable(f"The {name} cache at {root} can't be changed: {reason}")
443
+ root = validate_path(root)
444
+ path = quantized_cache.entry_path(root, entry)
445
+ if os.path.islink(path) or not os.path.isdir(path):
446
+ raise UnknownEntry(f"The {name} cache has no entry {entry}")
447
+ freed, files = _stage_out(root, [path])
448
+ logger.info(f"Deleted {name} cache entry {entry} ({freed} bytes, {files} files)")
449
+ return {"freed": freed, "files": files}
450
+
451
+
452
+ def clear(name):
453
+ """Empty a marked cache root, keeping the root and its marker. Returns
454
+ `{freed, files}` for what was removed.
455
+
456
+ Raises UnknownCache for a name not in the registry and NotClearable for a
457
+ root without the marker - before anything is moved."""
458
+ cache = get(name)
459
+ with _clear_lock:
460
+ root = cache.root()
461
+ reason = _reason(cache)
462
+ if reason:
463
+ raise NotClearable(f"The {name} cache at {root} can't be cleared: {reason}")
464
+ root = validate_path(root)
465
+ # A link is left alone: validate_path resolves it, so the rename
466
+ # would move its target, not the link
467
+ freed, files = _stage_out(
468
+ root, [entry.path for entry in _children(root) if not entry.is_symlink()]
469
+ )
470
+ logger.info(f"Cleared the {name} cache at {root} ({freed} bytes, {files} files)")
471
+ return {"freed": freed, "files": files}