diffusers-workflow 0.10.0__tar.gz → 0.11.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 (609) hide show
  1. {diffusers_workflow-0.10.0/diffusers_workflow.egg-info → diffusers_workflow-0.11.0}/PKG-INFO +1 -1
  2. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0/diffusers_workflow.egg-info}/PKG-INFO +1 -1
  3. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/SOURCES.txt +40 -29
  4. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/__init__.py +18 -0
  5. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/adapter_compatibility.py +8 -24
  6. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/audio_qc.py +3 -1
  7. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/content_types.py +5 -17
  8. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/dissolve_frame_errors.py +6 -18
  9. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/ACCELERATION.md +4 -3
  10. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/ARCHITECTURE.md +10 -6
  11. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/MCP.md +1 -1
  12. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/RELEASING.md +76 -0
  13. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/SERVER.md +7 -1
  14. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/TASKS.md +41 -5
  15. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/WORKFLOW_GUIDE.md +37 -13
  16. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/dsp.py +29 -0
  17. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/elision.py +65 -9
  18. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/events.py +3 -0
  19. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/for_each.py +60 -18
  20. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/guides.py +59 -73
  21. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/hold_audio.py +7 -35
  22. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/hub_cache.py +58 -47
  23. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/introspection.py +4 -18
  24. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/kernel_availability.py +4 -19
  25. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/locations.py +66 -53
  26. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/media.py +33 -21
  27. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/chain.py +61 -42
  28. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/components.py +47 -32
  29. diffusers_workflow-0.11.0/dw/pipeline_processors/h3_guide_steps.py +542 -0
  30. diffusers_workflow-0.11.0/dw/pipeline_processors/h3_guides.py +305 -0
  31. diffusers_workflow-0.11.0/dw/pipeline_processors/h3_hold.py +227 -0
  32. diffusers_workflow-0.11.0/dw/pipeline_processors/h3_hold_steps.py +397 -0
  33. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/pipeline.py +62 -55
  34. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/plan.py +46 -7
  35. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/previous_results.py +6 -16
  36. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/reference_limits.py +5 -17
  37. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/reference_names.py +4 -15
  38. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/references.py +46 -2
  39. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/scalar_result_validation.py +5 -19
  40. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/script_lines.py +2 -2
  41. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/admission.py +57 -45
  42. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/api_models.py +18 -1
  43. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/app.py +1 -0
  44. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/assess.py +24 -6
  45. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/deps.py +82 -15
  46. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/job_record.py +13 -0
  47. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/assets.py +30 -3
  48. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/jobs.py +26 -1
  49. diffusers_workflow-0.10.0/dw/server/ui/assets/codicon-Brq4_Ui5.ttf → diffusers_workflow-0.11.0/dw/server/ui/assets/codicon-DF1abBS2.ttf +0 -0
  50. diffusers_workflow-0.10.0/dw/server/ui/assets/css.worker-B3ciXF_0.js → diffusers_workflow-0.11.0/dw/server/ui/assets/css.worker-C6lDtRpF.js +38 -35
  51. diffusers_workflow-0.10.0/dw/server/ui/assets/cssMode-wXe774OW.js → diffusers_workflow-0.11.0/dw/server/ui/assets/cssMode-ukxfz-ce.js +1 -1
  52. diffusers_workflow-0.11.0/dw/server/ui/assets/editor-DjpsE8to.css +1 -0
  53. diffusers_workflow-0.11.0/dw/server/ui/assets/editor.api-Bkt_tsj1.js +908 -0
  54. diffusers_workflow-0.11.0/dw/server/ui/assets/editor.worker-BmdWdrHZ.js +33 -0
  55. diffusers_workflow-0.10.0/dw/server/ui/assets/freemarker2-DR8uhCda.js → diffusers_workflow-0.11.0/dw/server/ui/assets/freemarker2-DbXygLvH.js +1 -1
  56. diffusers_workflow-0.10.0/dw/server/ui/assets/handlebars-D1n_Fhy1.js → diffusers_workflow-0.11.0/dw/server/ui/assets/handlebars-BdhZGoSz.js +1 -1
  57. diffusers_workflow-0.10.0/dw/server/ui/assets/html-BVJM2HQM.js → diffusers_workflow-0.11.0/dw/server/ui/assets/html-Chhg10Tp.js +1 -1
  58. diffusers_workflow-0.10.0/dw/server/ui/assets/html.worker-C93Ht9o9.js → diffusers_workflow-0.11.0/dw/server/ui/assets/html.worker-C5yZDBHz.js +29 -26
  59. diffusers_workflow-0.10.0/dw/server/ui/assets/htmlMode-Cb3bisrD.js → diffusers_workflow-0.11.0/dw/server/ui/assets/htmlMode-cC3JW4lx.js +1 -1
  60. diffusers_workflow-0.11.0/dw/server/ui/assets/index-BYEwBCrU.css +1 -0
  61. diffusers_workflow-0.11.0/dw/server/ui/assets/index-CkD0GJG0.js +46 -0
  62. diffusers_workflow-0.10.0/dw/server/ui/assets/javascript-DhyRtgFn.js → diffusers_workflow-0.11.0/dw/server/ui/assets/javascript-BWWLMkof.js +1 -1
  63. diffusers_workflow-0.11.0/dw/server/ui/assets/json.worker-DdeUAmHa.js +65 -0
  64. diffusers_workflow-0.10.0/dw/server/ui/assets/jsonMode-IURul1-R.js → diffusers_workflow-0.11.0/dw/server/ui/assets/jsonMode-DrC8C29V.js +2 -2
  65. diffusers_workflow-0.10.0/dw/server/ui/assets/liquid-CdeVzoDf.js → diffusers_workflow-0.11.0/dw/server/ui/assets/liquid-CXdQfmUT.js +1 -1
  66. diffusers_workflow-0.10.0/dw/server/ui/assets/lspLanguageFeatures-C7DVi-2z.js → diffusers_workflow-0.11.0/dw/server/ui/assets/lspLanguageFeatures-BgAhb71w.js +2 -2
  67. diffusers_workflow-0.10.0/dw/server/ui/assets/mdx-BDSAHpOx.js → diffusers_workflow-0.11.0/dw/server/ui/assets/mdx-CQS0lFaZ.js +1 -1
  68. diffusers_workflow-0.11.0/dw/server/ui/assets/monaco-Z_sI-RLU.js +58 -0
  69. diffusers_workflow-0.11.0/dw/server/ui/assets/monaco-n7clI0si.css +1 -0
  70. diffusers_workflow-0.10.0/dw/server/ui/assets/python-C6JhntrO.js → diffusers_workflow-0.11.0/dw/server/ui/assets/python-C9MtI630.js +1 -1
  71. diffusers_workflow-0.10.0/dw/server/ui/assets/razor-DUoZWg4e.js → diffusers_workflow-0.11.0/dw/server/ui/assets/razor-DPO5mHyR.js +1 -1
  72. diffusers_workflow-0.10.0/dw/server/ui/assets/ts.worker-D7T1-Ig5.js → diffusers_workflow-0.11.0/dw/server/ui/assets/ts.worker-DGGa2mF8.js +217 -214
  73. diffusers_workflow-0.10.0/dw/server/ui/assets/tsMode-CxKbOt5l.js → diffusers_workflow-0.11.0/dw/server/ui/assets/tsMode-D8vGBTVc.js +5 -5
  74. diffusers_workflow-0.10.0/dw/server/ui/assets/typescript-BYnQ0RjU.js → diffusers_workflow-0.11.0/dw/server/ui/assets/typescript-DyoEkQLT.js +1 -1
  75. diffusers_workflow-0.10.0/dw/server/ui/assets/workers-CqfSFzdX.js → diffusers_workflow-0.11.0/dw/server/ui/assets/workers-Bdewp_DS.js +1 -1
  76. diffusers_workflow-0.10.0/dw/server/ui/assets/xml-BTej-yKG.js → diffusers_workflow-0.11.0/dw/server/ui/assets/xml-DmmKOVWo.js +1 -1
  77. diffusers_workflow-0.10.0/dw/server/ui/assets/yaml-DLu_25Zn.js → diffusers_workflow-0.11.0/dw/server/ui/assets/yaml-C4jCTuer.js +1 -1
  78. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/index.html +2 -2
  79. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/shot_span_preflight.py +6 -18
  80. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/slice_preflight.py +6 -18
  81. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/step.py +52 -24
  82. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/step_cache.py +23 -0
  83. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/step_value_checks.py +60 -93
  84. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/subfolders.py +4 -18
  85. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/task_domains.py +16 -626
  86. diffusers_workflow-0.11.0/dw/task_problems.py +631 -0
  87. diffusers_workflow-0.11.0/dw/tasks/audio_handlers.py +291 -0
  88. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/beats.py +3 -5
  89. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/concat_videos.py +16 -17
  90. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/cuts.py +375 -160
  91. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/face_track.py +1 -1
  92. diffusers_workflow-0.11.0/dw/tasks/finish_handlers.py +207 -0
  93. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/image_utils.py +2 -3
  94. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/joins.py +3 -2
  95. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/lut.py +2 -2
  96. diffusers_workflow-0.11.0/dw/tasks/measure_sync.py +198 -0
  97. diffusers_workflow-0.11.0/dw/tasks/model_handlers.py +319 -0
  98. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/registry.py +1 -1
  99. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/script_check.py +96 -61
  100. diffusers_workflow-0.11.0/dw/tasks/task.py +367 -0
  101. diffusers_workflow-0.11.0/dw/tasks/video_handlers.py +383 -0
  102. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/type_references.py +7 -32
  103. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/validation.py +5 -2
  104. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/video_extensions.py +61 -16
  105. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/video_size_errors.py +6 -18
  106. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/vram_inheritance.py +45 -1
  107. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/window_count_errors.py +6 -18
  108. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflow_run.py +4 -0
  109. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflow_schema.json +1 -1
  110. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/assets.py +30 -2
  111. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/diagnose.py +10 -2
  112. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/media.py +39 -31
  113. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/prompts.py +4 -1
  114. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/tools_authoring.py +7 -7
  115. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/tools_jobs.py +6 -8
  116. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/tools_media.py +25 -15
  117. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/pyproject.toml +1 -1
  118. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_analyze_beats.py +2 -1
  119. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_catalog_structure.py +5 -1
  120. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_elision.py +63 -3
  121. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_face_track.py +1 -1
  122. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_finish.py +2 -2
  123. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_for_each.py +79 -0
  124. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_guides.py +33 -43
  125. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_hold_audio.py +42 -8
  126. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_refine.py +4 -2
  127. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_rules.py +16 -4
  128. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_schedule.py +28 -0
  129. diffusers_workflow-0.11.0/tests/test_inductor_cache_default.py +58 -0
  130. diffusers_workflow-0.11.0/tests/test_inherited_cost.py +195 -0
  131. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_job_progress.py +37 -0
  132. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_assets.py +24 -0
  133. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_prompts.py +23 -0
  134. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_twins.py +1 -0
  135. diffusers_workflow-0.11.0/tests/test_measure_sync.py +120 -0
  136. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_plan.py +41 -0
  137. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_plan_cuts.py +8 -7
  138. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_plugin_skills.py +5 -3
  139. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_references.py +33 -0
  140. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_restore_faces_video.py +1 -1
  141. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_result.py +2 -0
  142. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_script_check.py +2 -1
  143. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_assess.py +22 -0
  144. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_library_path.py +17 -0
  145. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_speech_generation.py +1 -1
  146. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_step_cache.py +66 -13
  147. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_domains.py +7 -7
  148. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_registry_rules.py +12 -10
  149. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_video_extensions.py +79 -0
  150. diffusers_workflow-0.10.0/dw/pipeline_processors/h3_guides.py +0 -790
  151. diffusers_workflow-0.10.0/dw/pipeline_processors/h3_hold.py +0 -609
  152. diffusers_workflow-0.10.0/dw/server/ui/assets/editor-jjEx9u7D.css +0 -1
  153. diffusers_workflow-0.10.0/dw/server/ui/assets/editor.api-DqvgVCmU.js +0 -847
  154. diffusers_workflow-0.10.0/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -30
  155. diffusers_workflow-0.10.0/dw/server/ui/assets/index-BxCxre0j.css +0 -1
  156. diffusers_workflow-0.10.0/dw/server/ui/assets/index-Bxcur2S3.js +0 -45
  157. diffusers_workflow-0.10.0/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -62
  158. diffusers_workflow-0.10.0/dw/server/ui/assets/monaco--ixms01u.css +0 -1
  159. diffusers_workflow-0.10.0/dw/server/ui/assets/monaco-B8zQveVO.js +0 -56
  160. diffusers_workflow-0.10.0/dw/tasks/task.py +0 -1471
  161. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/LICENSE +0 -0
  162. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/MANIFEST.in +0 -0
  163. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/README.md +0 -0
  164. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
  165. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
  166. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/requires.txt +0 -0
  167. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
  168. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/argument_media.py +0 -0
  169. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/argument_warnings.py +0 -0
  170. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/arguments.py +0 -0
  171. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/assessment_rules.py +0 -0
  172. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/assets.py +0 -0
  173. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/cache_blocks.json +0 -0
  174. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/cache_blocks.py +0 -0
  175. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
  176. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/community_pipelines/pipeline_ltx2_refine.py +0 -0
  177. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/devices.py +0 -0
  178. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/AGENT_LOOP.md +0 -0
  179. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/DEPENDENCIES.md +0 -0
  180. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/IP_ADAPTER.md +0 -0
  181. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/LORAS.md +0 -0
  182. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
  183. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/QUANTIZATION.md +0 -0
  184. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/RECIPES_24GB.md +0 -0
  185. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/REMOTE.md +0 -0
  186. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/SECURITY.md +0 -0
  187. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
  188. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/TESTING.md +0 -0
  189. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/WORKER_GUIDE.md +0 -0
  190. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/docs/WORKSPACES.md +0 -0
  191. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/download_watch.py +0 -0
  192. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/host_memory.py +0 -0
  193. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/host_memory_projection.py +0 -0
  194. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/library.py +0 -0
  195. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/log_setup.py +0 -0
  196. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/lora_catalog.py +0 -0
  197. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/lora_catalog_schema.json +0 -0
  198. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/lora_hub.py +0 -0
  199. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/media_frames.py +0 -0
  200. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/media_types.py +0 -0
  201. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/outbound.py +0 -0
  202. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/output_extraction.py +0 -0
  203. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/path_redaction.py +0 -0
  204. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_ownership.py +0 -0
  205. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/adapters.py +0 -0
  206. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/config_objects.py +0 -0
  207. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/h3_rules.py +0 -0
  208. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/placement.py +0 -0
  209. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/progress.py +0 -0
  210. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/pipeline_processors/remote.py +0 -0
  211. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/probe_paths.py +0 -0
  212. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/prompt_schema.json +0 -0
  213. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/prompt_weighting.py +0 -0
  214. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/prompts.py +0 -0
  215. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/realize.py +0 -0
  216. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/result.py +0 -0
  217. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/run.py +0 -0
  218. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/runs.py +0 -0
  219. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/schema.py +0 -0
  220. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/security.py +0 -0
  221. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/serve.py +0 -0
  222. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/__init__.py +0 -0
  223. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/catalog.py +0 -0
  224. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/catalog_shape.py +0 -0
  225. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/enhancers.py +0 -0
  226. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/exports.py +0 -0
  227. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/guides.py +0 -0
  228. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/http_security.py +0 -0
  229. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/inline_media.py +0 -0
  230. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/job_history.py +0 -0
  231. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/job_results.py +0 -0
  232. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/jobs.py +0 -0
  233. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/mcp_mount.py +0 -0
  234. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/netinfo.py +0 -0
  235. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/observed_cost.py +0 -0
  236. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/outputs.py +0 -0
  237. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/pool.py +0 -0
  238. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/__init__.py +0 -0
  239. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/files.py +0 -0
  240. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/gallery.py +0 -0
  241. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/library.py +0 -0
  242. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/loras.py +0 -0
  243. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/media.py +0 -0
  244. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/routes/system.py +0 -0
  245. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/sysinfo.py +0 -0
  246. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
  247. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
  248. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
  249. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
  250. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
  251. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
  252. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
  253. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
  254. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
  255. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
  256. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
  257. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
  258. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
  259. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
  260. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
  261. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
  262. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
  263. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
  264. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
  265. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
  266. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
  267. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
  268. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
  269. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
  270. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
  271. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
  272. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
  273. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
  274. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
  275. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
  276. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
  277. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
  278. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
  279. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
  280. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
  281. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
  282. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
  283. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
  284. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
  285. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
  286. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
  287. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
  288. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
  289. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
  290. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
  291. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
  292. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
  293. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
  294. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
  295. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
  296. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
  297. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
  298. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
  299. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
  300. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
  301. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
  302. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
  303. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
  304. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
  305. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
  306. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
  307. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
  308. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
  309. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
  310. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
  311. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
  312. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
  313. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
  314. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
  315. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
  316. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/updater.py +0 -0
  317. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/server/worker_memory.py +0 -0
  318. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/settings.py +0 -0
  319. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/shots.py +0 -0
  320. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/assess.py +0 -0
  321. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/audio_dynamics.py +0 -0
  322. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/audio_transcription.py +0 -0
  323. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/audio_utils.py +0 -0
  324. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/background_remover.py +0 -0
  325. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/borders.py +0 -0
  326. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/compose_text.py +0 -0
  327. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/depth_estimator.py +0 -0
  328. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/diffusion_upscale.py +0 -0
  329. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/dissolve_videos.py +0 -0
  330. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/finish.py +0 -0
  331. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/fit.py +0 -0
  332. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/format_messages.py +0 -0
  333. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/gather.py +0 -0
  334. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/grade.py +0 -0
  335. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/h3_latent_upscale.py +0 -0
  336. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/h3_latent_upscaler_model.py +0 -0
  337. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/image_ops.py +0 -0
  338. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/image_to_text.py +0 -0
  339. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/interpolate_frames.py +0 -0
  340. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/join_into_song.py +0 -0
  341. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/judge.py +0 -0
  342. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/loop_bed.py +0 -0
  343. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/model_cache.py +0 -0
  344. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/pair_audio.py +0 -0
  345. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/qr_code.py +0 -0
  346. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/restore_faces.py +0 -0
  347. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/rife_model.py +0 -0
  348. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/segment.py +0 -0
  349. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/select.py +0 -0
  350. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/speech_generation.py +0 -0
  351. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/stabilize.py +0 -0
  352. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/tensor_image.py +0 -0
  353. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/text_generation.py +0 -0
  354. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/text_sections.py +0 -0
  355. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/trim.py +0 -0
  356. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/upscale.py +0 -0
  357. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/video_utils.py +0 -0
  358. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/voice_attribution.py +0 -0
  359. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/windows.py +0 -0
  360. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/tasks/zoe_depth.py +0 -0
  361. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/test.py +0 -0
  362. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/trust.py +0 -0
  363. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/type_helpers.py +0 -0
  364. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/validate.py +0 -0
  365. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/variable_constraints.py +0 -0
  366. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/variables.py +0 -0
  367. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/vram_estimate.py +0 -0
  368. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/worker.py +0 -0
  369. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/worker_manager.py +0 -0
  370. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/worker_protocol.py +0 -0
  371. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflow.py +0 -0
  372. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflows/h3_context_ir.json +0 -0
  373. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workflows/test.json +0 -0
  374. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/workspace.py +0 -0
  375. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw/writers.py +0 -0
  376. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/__init__.py +0 -0
  377. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/__main__.py +0 -0
  378. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/authoring.py +0 -0
  379. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/catalog.py +0 -0
  380. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/client.py +0 -0
  381. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/confine.py +0 -0
  382. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/exports.py +0 -0
  383. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/guides.py +0 -0
  384. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/loras.py +0 -0
  385. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/models.py +0 -0
  386. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/server.py +0 -0
  387. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/tools_catalog.py +0 -0
  388. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/dw_mcp/workspaces.py +0 -0
  389. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/setup.cfg +0 -0
  390. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_admission.py +0 -0
  391. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_admission_capacity.py +0 -0
  392. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_api_contract.py +0 -0
  393. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_arch_metrics.py +0 -0
  394. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_arch_report.py +0 -0
  395. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_architecture_map.py +0 -0
  396. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_argument_updates.py +0 -0
  397. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_arguments.py +0 -0
  398. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_assemble_and_score_target_lufs.py +0 -0
  399. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_assess.py +0 -0
  400. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_assessment_rules.py +0 -0
  401. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_assets.py +0 -0
  402. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_attention_slicing.py +0 -0
  403. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_audio_utils.py +0 -0
  404. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_best_of_n_template.py +0 -0
  405. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_borders.py +0 -0
  406. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_cache_blocks.py +0 -0
  407. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_catalog_shape.py +0 -0
  408. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_chain.py +0 -0
  409. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ci_config.py +0 -0
  410. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_cli.py +0 -0
  411. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_component_name_errors.py +0 -0
  412. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_component_pruning.py +0 -0
  413. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_component_type_errors.py +0 -0
  414. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_compose_text.py +0 -0
  415. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_concat_videos.py +0 -0
  416. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_config_objects.py +0 -0
  417. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_configuration_schema.py +0 -0
  418. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_content_types.py +0 -0
  419. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_depth_estimator.py +0 -0
  420. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_device.py +0 -0
  421. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_device_helpers.py +0 -0
  422. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_device_portability.py +0 -0
  423. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_dialogue_short_voices.py +0 -0
  424. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_diffusion_upscale.py +0 -0
  425. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_dissolve_frame_errors.py +0 -0
  426. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_dissolve_videos.py +0 -0
  427. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_docs_links.py +0 -0
  428. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_download_watch.py +0 -0
  429. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_dsp.py +0 -0
  430. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_events.py +0 -0
  431. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_examples.py +0 -0
  432. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_find_loop_bed.py +0 -0
  433. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_fit_templates.py +0 -0
  434. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_fit_to_model.py +0 -0
  435. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_gather.py +0 -0
  436. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_grade.py +0 -0
  437. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_guide_chain_validation.py +0 -0
  438. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_guides_validation.py +0 -0
  439. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_adapters.py +0 -0
  440. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_context_ir.py +0 -0
  441. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_latent_upscale.py +0 -0
  442. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_upscaler_source.py +0 -0
  443. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_h3_vram_ceiling.py +0 -0
  444. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_hf_placement.py +0 -0
  445. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_host_memory.py +0 -0
  446. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_host_memory_projection.py +0 -0
  447. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_hub_cache.py +0 -0
  448. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_image_ops.py +0 -0
  449. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_image_to_text.py +0 -0
  450. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_image_utils.py +0 -0
  451. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ingredients_grid.py +0 -0
  452. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_integration.py +0 -0
  453. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_interpolate_frames.py +0 -0
  454. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_introspection.py +0 -0
  455. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_job_history_device.py +0 -0
  456. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_job_history_wal.py +0 -0
  457. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_job_warnings.py +0 -0
  458. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_jobs_listing.py +0 -0
  459. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_jobs_reused.py +0 -0
  460. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_join_into_song.py +0 -0
  461. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_join_windows.py +0 -0
  462. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_judge.py +0 -0
  463. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_kernel_availability.py +0 -0
  464. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_library_path.py +0 -0
  465. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_library_sources.py +0 -0
  466. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_list_images.py +0 -0
  467. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_locations.py +0 -0
  468. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_alpha.py +0 -0
  469. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_catalog.py +0 -0
  470. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_disable.py +0 -0
  471. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_hub.py +0 -0
  472. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lora_library.py +0 -0
  473. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx2_diffusion_decode.py +0 -0
  474. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx2_extend_clip.py +0 -0
  475. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx2_ic_loras.py +0 -0
  476. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx2_refine_pipeline.py +0 -0
  477. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ltx_prompt_library.py +0 -0
  478. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_lut.py +0 -0
  479. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_authoring.py +0 -0
  480. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_catalog.py +0 -0
  481. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_client.py +0 -0
  482. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_confine.py +0 -0
  483. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_diagnose.py +0 -0
  484. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_exports.py +0 -0
  485. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_guides.py +0 -0
  486. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_loras.py +0 -0
  487. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_main.py +0 -0
  488. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_media.py +0 -0
  489. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_models.py +0 -0
  490. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_server.py +0 -0
  491. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mcp_workspaces.py +0 -0
  492. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_media_audio.py +0 -0
  493. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_media_frames.py +0 -0
  494. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_media_info.py +0 -0
  495. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_media_layering.py +0 -0
  496. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mix_audio.py +0 -0
  497. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_model_cache.py +0 -0
  498. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_modular_output_properties.py +0 -0
  499. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_modular_pipeline.py +0 -0
  500. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_modular_progress.py +0 -0
  501. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mps_fallback_warning.py +0 -0
  502. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_mps_rope_precision.py +0 -0
  503. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_null_media.py +0 -0
  504. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_numeric_coercion.py +0 -0
  505. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_observed_cost.py +0 -0
  506. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_offload_placement.py +0 -0
  507. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_outbound.py +0 -0
  508. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_output_references.py +0 -0
  509. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_pair_audio.py +0 -0
  510. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_pair_audio_fit.py +0 -0
  511. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_parallel_loading_default.py +0 -0
  512. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_path_redaction.py +0 -0
  513. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_phase_events.py +0 -0
  514. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_pipeline_caching.py +0 -0
  515. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_pipeline_components.py +0 -0
  516. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prepare_pipeline.py +0 -0
  517. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_previous_result_walker_parity.py +0 -0
  518. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_previous_results.py +0 -0
  519. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompt_library.py +0 -0
  520. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompt_parser.py +0 -0
  521. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompt_references.py +0 -0
  522. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompt_weighting.py +0 -0
  523. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_prompts.py +0 -0
  524. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_read_frame_range.py +0 -0
  525. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_real_models.py +0 -0
  526. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_realize.py +0 -0
  527. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_recenter_crop.py +0 -0
  528. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_reference_limits.py +0 -0
  529. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_reference_names.py +0 -0
  530. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_reference_skip_sets.py +0 -0
  531. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_rerun_new_seed.py +0 -0
  532. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_resize_bucket.py +0 -0
  533. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_result_fps.py +0 -0
  534. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_result_output_naming.py +0 -0
  535. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_rule_parity.py +0 -0
  536. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_runs.py +0 -0
  537. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_scalar_result_validation.py +0 -0
  538. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_scheduler_config.py +0 -0
  539. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_schema.py +0 -0
  540. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security.py +0 -0
  541. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_auth.py +0 -0
  542. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_decoder_bombs.py +0 -0
  543. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_input_caps.py +0 -0
  544. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_ssrf.py +0 -0
  545. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_symlinks.py +0 -0
  546. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_trust_gate.py +0 -0
  547. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_security_web_headers.py +0 -0
  548. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_segment.py +0 -0
  549. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_select.py +0 -0
  550. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_select_validation.py +0 -0
  551. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_separate_stems.py +0 -0
  552. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_serve_main.py +0 -0
  553. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server.py +0 -0
  554. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_downloads.py +0 -0
  555. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_exports.py +0 -0
  556. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_gallery_image.py +0 -0
  557. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_guides.py +0 -0
  558. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_info.py +0 -0
  559. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_jobs.py +0 -0
  560. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_loras.py +0 -0
  561. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_mcp.py +0 -0
  562. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_server_workspaces.py +0 -0
  563. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_shaping_logs.py +0 -0
  564. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_shot_span_preflight.py +0 -0
  565. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_shots.py +0 -0
  566. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_slice_preflight.py +0 -0
  567. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_stabilize.py +0 -0
  568. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_step.py +0 -0
  569. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_strip_exif_and_watermark.py +0 -0
  570. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_sub_workflow_resolver.py +0 -0
  571. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_subfolders.py +0 -0
  572. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task.py +0 -0
  573. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_discovery.py +0 -0
  574. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_public_imports.py +0 -0
  575. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_task_signature_errors.py +0 -0
  576. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_template_defaults.py +0 -0
  577. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_template_subfolders.py +0 -0
  578. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_tensor_image.py +0 -0
  579. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_text_generation.py +0 -0
  580. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_text_sections.py +0 -0
  581. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_transcribe_audio.py +0 -0
  582. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_trim_video.py +0 -0
  583. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_type_helpers.py +0 -0
  584. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_type_helpers_concurrency.py +0 -0
  585. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_ui_twins.py +0 -0
  586. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_updater.py +0 -0
  587. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_validate_arguments.py +0 -0
  588. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_validation.py +0 -0
  589. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_variable_constraints.py +0 -0
  590. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_variables.py +0 -0
  591. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_video_size_errors.py +0 -0
  592. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_video_utils.py +0 -0
  593. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_voice_attribution.py +0 -0
  594. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_vram_estimate.py +0 -0
  595. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_vram_guides.py +0 -0
  596. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_vram_inheritance.py +0 -0
  597. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_window_count_errors.py +0 -0
  598. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_window_video.py +0 -0
  599. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker.py +0 -0
  600. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_execute.py +0 -0
  601. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_job_peak_rss.py +0 -0
  602. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_manager.py +0 -0
  603. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_messages.py +0 -0
  604. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_worker_pool.py +0 -0
  605. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_workflow.py +0 -0
  606. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_workflow_snapshot.py +0 -0
  607. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_workflow_step_cache.py +0 -0
  608. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.0}/tests/test_workflow_trust.py +0 -0
  609. {diffusers_workflow-0.10.0 → diffusers_workflow-0.11.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.10.0
3
+ Version: 0.11.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.10.0
3
+ Version: 0.11.0
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -73,6 +73,7 @@ dw/step_cache.py
73
73
  dw/step_value_checks.py
74
74
  dw/subfolders.py
75
75
  dw/task_domains.py
76
+ dw/task_problems.py
76
77
  dw/test.py
77
78
  dw/trust.py
78
79
  dw/type_helpers.py
@@ -120,8 +121,10 @@ dw/pipeline_processors/adapters.py
120
121
  dw/pipeline_processors/chain.py
121
122
  dw/pipeline_processors/components.py
122
123
  dw/pipeline_processors/config_objects.py
124
+ dw/pipeline_processors/h3_guide_steps.py
123
125
  dw/pipeline_processors/h3_guides.py
124
126
  dw/pipeline_processors/h3_hold.py
127
+ dw/pipeline_processors/h3_hold_steps.py
125
128
  dw/pipeline_processors/h3_rules.py
126
129
  dw/pipeline_processors/pipeline.py
127
130
  dw/pipeline_processors/placement.py
@@ -169,52 +172,52 @@ dw/server/ui/assets/bat-i0X4ZdIN.js
169
172
  dw/server/ui/assets/bicep-B5-_aFwp.js
170
173
  dw/server/ui/assets/cameligo-DMUM7wLl.js
171
174
  dw/server/ui/assets/clojure-Cm7r79vr.js
172
- dw/server/ui/assets/codicon-Brq4_Ui5.ttf
175
+ dw/server/ui/assets/codicon-DF1abBS2.ttf
173
176
  dw/server/ui/assets/coffee-Ba7i2nA0.js
174
177
  dw/server/ui/assets/cpp-C7h46wYY.js
175
178
  dw/server/ui/assets/csharp-BKxtCVv1.js
176
179
  dw/server/ui/assets/csp-bTuwJoIa.js
177
180
  dw/server/ui/assets/css-DIMkf-bt.js
178
- dw/server/ui/assets/css.worker-B3ciXF_0.js
179
- dw/server/ui/assets/cssMode-wXe774OW.js
181
+ dw/server/ui/assets/css.worker-C6lDtRpF.js
182
+ dw/server/ui/assets/cssMode-ukxfz-ce.js
180
183
  dw/server/ui/assets/cypher-CVaqCwHa.js
181
184
  dw/server/ui/assets/dart-onAF5SnQ.js
182
185
  dw/server/ui/assets/dockerfile-DZFCIeNp.js
183
186
  dw/server/ui/assets/ecl-D05T4iGw.js
184
- dw/server/ui/assets/editor-jjEx9u7D.css
185
- dw/server/ui/assets/editor.api-DqvgVCmU.js
186
- dw/server/ui/assets/editor.worker-q-txB4vs.js
187
+ dw/server/ui/assets/editor-DjpsE8to.css
188
+ dw/server/ui/assets/editor.api-Bkt_tsj1.js
189
+ dw/server/ui/assets/editor.worker-BmdWdrHZ.js
187
190
  dw/server/ui/assets/elixir-6RTg0lbw.js
188
191
  dw/server/ui/assets/flow9-C5_-GSwl.js
189
- dw/server/ui/assets/freemarker2-DR8uhCda.js
192
+ dw/server/ui/assets/freemarker2-DbXygLvH.js
190
193
  dw/server/ui/assets/fsharp-C8Ef5oNN.js
191
194
  dw/server/ui/assets/go-C-y9NEjX.js
192
195
  dw/server/ui/assets/graphql-fmXr3nnJ.js
193
- dw/server/ui/assets/handlebars-D1n_Fhy1.js
196
+ dw/server/ui/assets/handlebars-BdhZGoSz.js
194
197
  dw/server/ui/assets/hcl-CpzslTdj.js
195
- dw/server/ui/assets/html-BVJM2HQM.js
196
- dw/server/ui/assets/html.worker-C93Ht9o9.js
197
- dw/server/ui/assets/htmlMode-Cb3bisrD.js
198
- dw/server/ui/assets/index-BxCxre0j.css
199
- dw/server/ui/assets/index-Bxcur2S3.js
198
+ dw/server/ui/assets/html-Chhg10Tp.js
199
+ 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
200
203
  dw/server/ui/assets/ini-sBoK_t0W.js
201
204
  dw/server/ui/assets/java-BEtHBSE6.js
202
- dw/server/ui/assets/javascript-DhyRtgFn.js
203
- dw/server/ui/assets/json.worker-B2V3pomh.js
204
- dw/server/ui/assets/jsonMode-IURul1-R.js
205
+ dw/server/ui/assets/javascript-BWWLMkof.js
206
+ dw/server/ui/assets/json.worker-DdeUAmHa.js
207
+ dw/server/ui/assets/jsonMode-DrC8C29V.js
205
208
  dw/server/ui/assets/julia-Bri6UV-V.js
206
209
  dw/server/ui/assets/kotlin-BOotOW0E.js
207
210
  dw/server/ui/assets/less-B9JPFI3C.js
208
211
  dw/server/ui/assets/lexon-CfSJPG6W.js
209
- dw/server/ui/assets/liquid-CdeVzoDf.js
210
- dw/server/ui/assets/lspLanguageFeatures-C7DVi-2z.js
212
+ dw/server/ui/assets/liquid-CXdQfmUT.js
213
+ dw/server/ui/assets/lspLanguageFeatures-BgAhb71w.js
211
214
  dw/server/ui/assets/lua-CsQS60Ue.js
212
215
  dw/server/ui/assets/m3-D-oSqn_W.js
213
216
  dw/server/ui/assets/markdown-Cimd5fb3.js
214
- dw/server/ui/assets/mdx-BDSAHpOx.js
217
+ dw/server/ui/assets/mdx-CQS0lFaZ.js
215
218
  dw/server/ui/assets/mips-CIPQ_RoX.js
216
- dw/server/ui/assets/monaco--ixms01u.css
217
- dw/server/ui/assets/monaco-B8zQveVO.js
219
+ dw/server/ui/assets/monaco-Z_sI-RLU.js
220
+ dw/server/ui/assets/monaco-n7clI0si.css
218
221
  dw/server/ui/assets/msdax-DauUninz.js
219
222
  dw/server/ui/assets/mysql-SOo6toE5.js
220
223
  dw/server/ui/assets/objective-c-FvmIjYaQ.js
@@ -229,10 +232,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
229
232
  dw/server/ui/assets/powershell-DmHpPYUd.js
230
233
  dw/server/ui/assets/protobuf-C531GsRP.js
231
234
  dw/server/ui/assets/pug-Z5eAx3Zn.js
232
- dw/server/ui/assets/python-C6JhntrO.js
235
+ dw/server/ui/assets/python-C9MtI630.js
233
236
  dw/server/ui/assets/qsharp-DkqhCAOL.js
234
237
  dw/server/ui/assets/r-BwWrilGY.js
235
- dw/server/ui/assets/razor-DUoZWg4e.js
238
+ dw/server/ui/assets/razor-DPO5mHyR.js
236
239
  dw/server/ui/assets/redis-ClamHrr6.js
237
240
  dw/server/ui/assets/redshift-DT7zqm-g.js
238
241
  dw/server/ui/assets/restructuredtext-BYgofb2h.js
@@ -251,18 +254,19 @@ dw/server/ui/assets/st-DbInun42.js
251
254
  dw/server/ui/assets/swift-Bxkupp3x.js
252
255
  dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
253
256
  dw/server/ui/assets/tcl-DISqw1ZD.js
254
- dw/server/ui/assets/ts.worker-D7T1-Ig5.js
255
- dw/server/ui/assets/tsMode-CxKbOt5l.js
257
+ dw/server/ui/assets/ts.worker-DGGa2mF8.js
258
+ dw/server/ui/assets/tsMode-D8vGBTVc.js
256
259
  dw/server/ui/assets/twig-De2hgUGE.js
257
- dw/server/ui/assets/typescript-BYnQ0RjU.js
260
+ dw/server/ui/assets/typescript-DyoEkQLT.js
258
261
  dw/server/ui/assets/typespec-B8J7ngcE.js
259
262
  dw/server/ui/assets/vb-DV3o63ZY.js
260
263
  dw/server/ui/assets/wgsl-DpFanUEy.js
261
- dw/server/ui/assets/workers-CqfSFzdX.js
262
- dw/server/ui/assets/xml-BTej-yKG.js
263
- dw/server/ui/assets/yaml-DLu_25Zn.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
264
267
  dw/tasks/assess.py
265
268
  dw/tasks/audio_dynamics.py
269
+ dw/tasks/audio_handlers.py
266
270
  dw/tasks/audio_transcription.py
267
271
  dw/tasks/audio_utils.py
268
272
  dw/tasks/background_remover.py
@@ -276,6 +280,7 @@ dw/tasks/diffusion_upscale.py
276
280
  dw/tasks/dissolve_videos.py
277
281
  dw/tasks/face_track.py
278
282
  dw/tasks/finish.py
283
+ dw/tasks/finish_handlers.py
279
284
  dw/tasks/fit.py
280
285
  dw/tasks/format_messages.py
281
286
  dw/tasks/gather.py
@@ -291,7 +296,9 @@ dw/tasks/joins.py
291
296
  dw/tasks/judge.py
292
297
  dw/tasks/loop_bed.py
293
298
  dw/tasks/lut.py
299
+ dw/tasks/measure_sync.py
294
300
  dw/tasks/model_cache.py
301
+ dw/tasks/model_handlers.py
295
302
  dw/tasks/pair_audio.py
296
303
  dw/tasks/qr_code.py
297
304
  dw/tasks/registry.py
@@ -308,6 +315,7 @@ dw/tasks/text_generation.py
308
315
  dw/tasks/text_sections.py
309
316
  dw/tasks/trim.py
310
317
  dw/tasks/upscale.py
318
+ dw/tasks/video_handlers.py
311
319
  dw/tasks/video_utils.py
312
320
  dw/tasks/voice_attribution.py
313
321
  dw/tasks/windows.py
@@ -406,7 +414,9 @@ tests/test_hub_cache.py
406
414
  tests/test_image_ops.py
407
415
  tests/test_image_to_text.py
408
416
  tests/test_image_utils.py
417
+ tests/test_inductor_cache_default.py
409
418
  tests/test_ingredients_grid.py
419
+ tests/test_inherited_cost.py
410
420
  tests/test_integration.py
411
421
  tests/test_interpolate_frames.py
412
422
  tests/test_introspection.py
@@ -451,6 +461,7 @@ tests/test_mcp_prompts.py
451
461
  tests/test_mcp_server.py
452
462
  tests/test_mcp_twins.py
453
463
  tests/test_mcp_workspaces.py
464
+ tests/test_measure_sync.py
454
465
  tests/test_media_audio.py
455
466
  tests/test_media_frames.py
456
467
  tests/test_media_info.py
@@ -48,6 +48,24 @@ def _parallel_loading_default(platform):
48
48
  if "HF_ENABLE_PARALLEL_LOADING" not in os.environ:
49
49
  os.environ["HF_ENABLE_PARALLEL_LOADING"] = _parallel_loading_default(sys.platform)
50
50
 
51
+
52
+ def _inductor_cache_dir_default(environ):
53
+ """Where torch.compile keeps its on-disk cache.
54
+
55
+ Inductor's own default is /tmp/torchinductor_<user>, which a reboot wipes.
56
+ A fresh worker always retraces, but a cache hit skips codegen and kernel
57
+ builds - most of a cold compile, about 90s of MiniMax-H3's first step on a
58
+ 3090 - so the user's cache directory keeps that paid once per shape rather
59
+ than once per boot. An empty XDG_CACHE_HOME counts as unset, per the spec."""
60
+ base = environ.get("XDG_CACHE_HOME") or os.path.join(
61
+ os.path.expanduser("~"), ".cache"
62
+ )
63
+ return os.path.join(base, "dw", "torchinductor")
64
+
65
+
66
+ if "TORCHINDUCTOR_CACHE_DIR" not in os.environ:
67
+ os.environ["TORCHINDUCTOR_CACHE_DIR"] = _inductor_cache_dir_default(os.environ)
68
+
51
69
  # Suppress all common library warnings before any imports
52
70
  warnings.filterwarnings("ignore", category=FutureWarning)
53
71
  warnings.filterwarnings("ignore", category=UserWarning)
@@ -30,7 +30,7 @@ names and the partition each one denoises against are diffusers' own, and
30
30
  import logging
31
31
 
32
32
  from . import references
33
- from .references import MEMBER_SEPARATOR, render_path
33
+ from .references import render_path
34
34
 
35
35
  logger = logging.getLogger("dw")
36
36
 
@@ -109,13 +109,9 @@ def _lora_problems(steps, source_indices, written=None, supplied=()):
109
109
  """
110
110
  written_steps = (written or {}).get("steps")
111
111
  found = []
112
- for index, step in enumerate(steps):
113
- if not isinstance(step, dict):
114
- continue
115
- pipeline = step.get("pipeline")
116
- if not isinstance(pipeline, dict):
117
- continue
118
- source = references.author_index(source_indices, index)
112
+ for _, _, pipeline, source, where in references.iter_steps(
113
+ steps, source_indices, "pipeline"
114
+ ):
119
115
  from_pretrained = pipeline.get(FROM_PRETRAINED_KEY)
120
116
  workflow = (
121
117
  from_pretrained.get(WORKFLOW_KEY)
@@ -127,12 +123,6 @@ def _lora_problems(steps, source_indices, written=None, supplied=()):
127
123
  loras = pipeline.get(LORAS_KEY)
128
124
  if not isinstance(loras, list):
129
125
  continue
130
- name = step.get("name")
131
- where = (
132
- f" in member '{name}'"
133
- if isinstance(name, str) and MEMBER_SEPARATOR in name
134
- else ""
135
- )
136
126
  for position, lora in enumerate(loras):
137
127
  if not isinstance(lora, dict):
138
128
  continue
@@ -212,18 +202,12 @@ def _disabled_loras(steps, source_indices, written=None, supplied=()):
212
202
  engine's, and so is saying that it was used."""
213
203
  written_steps = (written or {}).get("steps")
214
204
  found = []
215
- for index, step in enumerate(steps):
216
- pipeline = step.get("pipeline") if isinstance(step, dict) else None
217
- loras = pipeline.get(LORAS_KEY) if isinstance(pipeline, dict) else None
205
+ for _, _, pipeline, source, where in references.iter_steps(
206
+ steps, source_indices, "pipeline"
207
+ ):
208
+ loras = pipeline.get(LORAS_KEY)
218
209
  if not isinstance(loras, list):
219
210
  continue
220
- source = references.author_index(source_indices, index)
221
- name = step.get("name")
222
- where = (
223
- f" in member '{name}'"
224
- if isinstance(name, str) and MEMBER_SEPARATOR in name
225
- else ""
226
- )
227
211
  for position, lora in enumerate(loras):
228
212
  if not isinstance(lora, dict) or lora.get(MODEL_NAME_KEY) is not None:
229
213
  continue
@@ -174,7 +174,9 @@ def warn_if_written_above_full_scale(
174
174
  f"the file is written: a 'normalize_audio' step at 'peak_dbfs: -3' "
175
175
  f"ahead of the step that saves it (a template's intermediate shot has "
176
176
  f"no such step to edit: set the join's 'match_levels' instead). A "
177
- f"mux into a video needs more of it than an audio file does.",
177
+ f"mux into a video needs more of it than an audio file does. For a "
178
+ f"file already written, the 'relevel-clip' template re-levels it "
179
+ f"without a re-render.",
178
180
  kind="audio_clipped",
179
181
  file=name,
180
182
  peak_dbfs=round(peak, 2),
@@ -29,7 +29,7 @@ import logging
29
29
  import mimetypes
30
30
 
31
31
  from . import references
32
- from .references import MEMBER_SEPARATOR, render_path
32
+ from .references import render_path
33
33
  from .security import InvalidInputError, validate_content_type
34
34
 
35
35
  logger = logging.getLogger("dw")
@@ -126,29 +126,17 @@ def content_type_errors(workflow_definition, source_indices=None):
126
126
  several, and the path an error carries has to be one the author can
127
127
  find in the file they wrote; the member is named in the message.
128
128
  """
129
- steps = workflow_definition.get("steps")
130
- if not isinstance(steps, list):
131
- return []
132
-
133
129
  errors = []
134
- for index, step in enumerate(steps):
135
- if not isinstance(step, dict):
136
- continue
137
- result = step.get("result")
138
- if not isinstance(result, dict) or CONTENT_TYPE_KEY not in result:
130
+ for _, _, result, source, where in references.iter_steps(
131
+ workflow_definition.get("steps"), source_indices, "result"
132
+ ):
133
+ if CONTENT_TYPE_KEY not in result:
139
134
  continue
140
135
  value = result[CONTENT_TYPE_KEY]
141
136
  # A prefix substitution resolves before this pass: one still spelled
142
137
  # out is the undeclared-variable pass's complaint, not a shape error
143
138
  if references.is_ref(references.SUBSTITUTED, value):
144
139
  continue
145
- source = references.author_index(source_indices, index)
146
- name = step.get("name")
147
- where = (
148
- f" in member '{name}'"
149
- if isinstance(name, str) and MEMBER_SEPARATOR in name
150
- else ""
151
- )
152
140
  fault = content_type_fault(value)
153
141
  if fault is not None:
154
142
  errors.append(
@@ -31,10 +31,10 @@ its window to the shortest side (`crossfade_concat`) - a different, and
31
31
  already silent, shape of problem with no run-time error to move earlier.
32
32
  """
33
33
 
34
- from .for_each import MEMBER_SEPARATOR, render_path
34
+ from .for_each import render_path
35
35
  from .media import probe_metadata
36
36
  from .probe_paths import resolve_probe_path
37
- from .references import author_index
37
+ from .references import iter_steps
38
38
  from .task_domains import dissolve_shortfalls
39
39
 
40
40
 
@@ -63,16 +63,11 @@ def dissolve_frame_errors(
63
63
  a memoizing wrapper so a file referenced by more than one check is
64
64
  probed once per validation rather than once per check.
65
65
  """
66
- steps = workflow_definition.get("steps")
67
- if not isinstance(steps, list):
68
- return []
69
-
70
66
  errors = []
71
- for index, step in enumerate(steps):
72
- if not isinstance(step, dict):
73
- continue
74
- task = step.get("task")
75
- if not isinstance(task, dict) or task.get("command") != "dissolve_videos":
67
+ for _, _, task, source, where in iter_steps(
68
+ workflow_definition.get("steps"), source_indices, "task"
69
+ ):
70
+ if task.get("command") != "dissolve_videos":
76
71
  continue
77
72
  arguments = task.get("arguments")
78
73
  if not isinstance(arguments, dict):
@@ -96,13 +91,6 @@ def dissolve_frame_errors(
96
91
  if not problems:
97
92
  continue
98
93
 
99
- source = author_index(source_indices, index)
100
- name = step.get("name")
101
- where = (
102
- f" in member '{name}'"
103
- if isinstance(name, str) and MEMBER_SEPARATOR in name
104
- else ""
105
- )
106
94
  errors.append(
107
95
  {
108
96
  "path": render_path(
@@ -134,7 +134,7 @@ Select the attention implementation diffusers uses for the duration of each pipe
134
134
  }
135
135
  ```
136
136
 
137
- Common values: `"flash"`, `"flash_hub"`, `"sage"`, `"sage_hub"`, `"native"`, `"flex"`. The full set is diffusers' `AttentionBackendName` enum - availability depends on what's installed (`flash-attn`, `sageattention`, etc.) and the platform. `_hub`-suffixed backends are fetched from the Hugging Face Hub kernel registry on first use, which needs the `kernels` package installed (`pip install kernels`) - it is not a dw dependency, and no bundled workflow sets a backend, so each runs on a plain install.
137
+ Common values: `"flash"`, `"flash_hub"`, `"sage"`, `"sage_hub"`, `"native"`, `"flex"`. The full set is diffusers' `AttentionBackendName` enum - availability depends on what's installed (`flash-attn`, `sageattention`, etc.) and the platform. `_hub`-suffixed backends are fetched from the Hugging Face Hub kernel registry on first use, which needs the `kernels` package installed (`pip install kernels`) - it is not a dw dependency, and no bundled workflow sets a backend, so each runs on a plain install. diffusers also refuses a Hub kernel whose publisher it does not list as trusted - `sage_hub` among them, since SageAttention 2 comes from `SageAttention/sage-attention` - until `DIFFUSERS_TRUST_REMOTE_KERNELS=true`, which allows remote code from any such publisher. On an RTX 3090 `sage_hub` measured about 30% faster per MiniMax-H3 step (13.8 s against 19.2 s at 960x544x124, 54.7 s against 81.2 s at 345 frames); the local `sage` backend needs `sageattention>=2.1.1`, which PyPI does not carry.
138
138
 
139
139
  A component can also pin its backend persistently instead, via `set_attention_backend`:
140
140
 
@@ -186,7 +186,7 @@ Compile a component once it is fully configured - the graph captures final dtype
186
186
 
187
187
  Typical gains are 1.3-1.5x on diffusion transformers, and compilation stacks with the caches above. Notes:
188
188
 
189
- - **First run pays the compile cost.** The [server](SERVER.md)'s persistent worker keeps compiled pipelines loaded between runs, so the cost is paid once per session rather than once per generation.
189
+ - **First run pays the compile cost.** The [server](SERVER.md)'s persistent worker keeps compiled pipelines loaded between runs, so the cost is paid once per session rather than once per generation. A new session still retraces, but the kernels it built come back from the on-disk cache, which dw keeps across reboots (`TORCHINDUCTOR_CACHE_DIR`, see [Environment Defaults](#environment-defaults)).
190
190
  - **Pin the attention backend** on a compiled component (`"attention_backend"` in the same `components` entry) rather than using the pipeline-level per-call context manager, which forces recompiles.
191
191
  - **Composes with offloading**: apply `group_offload` and `compile` on the same component and the offload hooks are installed first, as required. Skipped with a warning on MPS.
192
192
  - **Don't combine `fullgraph` with a `cache`**: the cache hooks decide skip-or-compute per step, a data-dependent branch diffusers wraps in `torch.compiler.disable` - it needs the graph break that `fullgraph: true` forbids. Compile with the default (partial) graph mode when a cache is active.
@@ -272,13 +272,14 @@ Device-level settings, read once at startup from `~/.diffusers_helper/settings.j
272
272
 
273
273
  ## Environment Defaults
274
274
 
275
- Set automatically at import unless already present in the environment (export your own value to override):
275
+ Set automatically at import unless already present in the environment (export your own value to override, or put it in a `.env` file in the directory dw starts from - [.env.example](../.env.example) lists these and the other knobs worth knowing: the Hub, diffusers, transformers and SDNQ):
276
276
 
277
277
  | Variable | Default | Effect |
278
278
  | -------- | ------- | ------ |
279
279
  | `PYTORCH_CUDA_ALLOC_CONF` | `expandable_segments:True` | Lets the CUDA allocator grow segments instead of fragmenting fixed-size ones. Multi-step workflows churn differently-shaped allocations (generate, upscale, interpolate); fragmentation is what OOMs a card that nominally has room. |
280
280
  | `HF_ENABLE_PARALLEL_LOADING` | `true` | Loads sharded checkpoints in parallel - faster cold starts. |
281
281
  | `PYTORCH_MPS_HIGH_WATERMARK_RATIO` | `0.0` | MPS only - use all available unified memory. |
282
+ | `TORCHINDUCTOR_CACHE_DIR` | `$XDG_CACHE_HOME/dw/torchinductor` (`~/.cache/dw/torchinductor`) | Keeps `torch.compile`'s on-disk cache across reboots - Inductor's own default is under `/tmp`. A new worker still retraces, but a cache hit skips codegen and kernel builds, the bulk of a cold compile. Entries are per shape, so a new size or frame count compiles once more. |
282
283
 
283
284
  For faster model downloads, optionally `pip install hf_transfer` and set `HF_HUB_ENABLE_HF_TRANSFER=1`. Not enabled automatically - it bypasses the Python HTTP stack and breaks some proxy setups.
284
285
 
@@ -31,11 +31,12 @@ one to open.
31
31
  | LoRAs | `dw/pipeline_processors/adapters.py`: `active_loras`, `load_loras` | A `loras` entry whose `model_name` is null is switched off. | `tests/test_lora_disable.py::TestLoadLoras::test_an_all_null_entry_loads_nothing` |
32
32
  | Step progress | `dw/pipeline_processors/progress.py`: `reported_progress_bars` | A pipeline with no step callback reports its denoise steps through its progress bars. | `tests/test_modular_progress.py::test_every_advance_of_the_bar_is_reported` |
33
33
  | Community pipelines | `dw/community_pipelines/` (e.g. `pipeline_ltx2_refine.py`: `LTX2RefinePipeline`), `dw/introspection.py`: `community_pipelines`, `load_allowed_class` | A pipeline dw ships is named by its dotted path (`dw.community_pipelines.<module>.<Class>`), loads untrusted because it is under `dw`, and is listed by `list_pipelines` and resolved by `get_pipeline_signature` - only the modules in that directory, never a caller-chosen import. `LTX2RefinePipeline` VAE-encodes `video` at `width` x `height` and passes it unnormalized as `latents`, because `LTX2Pipeline.prepare_latents` normalizes 5-D latents itself. | `tests/test_ltx2_refine_pipeline.py::TestIntrospection::test_only_the_shipped_modules_resolve`, `tests/test_ltx2_refine_pipeline.py::TestEncode::test_the_latents_are_left_unnormalized_for_the_parent` |
34
- | Adding a task | `dw/tasks/registry.py`: `register_command`, `RegistryTable` | A task is a function registered with `@register_command`, and the signature of its implementation is its argument schema. Its validate-time rules are declared on the same decorator - `domains`, `choices`, `static_check`, `whole_numbers` and `media_arguments` - and `TASK_ARGUMENT_DOMAINS`, `TASK_ARGUMENT_CHOICES`, `TASK_STATIC_CHECKS`, `TASK_WHOLE_NUMBER_ARGUMENTS` and `TASK_MEDIA_ARGUMENTS` are read-only views derived from them, so there is no second table to forget (#692). The registry lives in `dw/tasks/registry.py`; `dw/tasks/task.py` re-exports it, and a task module may register its own handler, as `dw/tasks/beats.py` does, provided `dw/tasks/task.py` imports it (`docs/TASKS.md` *Adding a task*). | `tests/test_task_discovery.py::TestDescribeTask::test_signature_becomes_the_schema`, `tests/test_task_registry_rules.py::test_every_derived_table_is_the_registrys_view`, `tests/test_task_registry_rules.py::test_every_static_check_is_registered_to_exactly_one_command`, `tests/test_task_registry_rules.py::test_every_media_argument_is_a_parameter_of_its_command` |
35
- | Task argument domains | `dw/task_domains.py`: `check_arguments`, `task_argument_errors` | A numeric domain that a signature cannot express is declared on the command's `@register_command(domains=...)`, and it is checked at validation and again at run time. A numeric argument is read by `whole_number` or `real_number`, the only numeric coercion in `dw/tasks/`, and validation applies the same rule (`number_problem`), so a value is refused at both or at neither: `"3.0"` is a whole number, `"3.5"` for one of `whole_numbers` is not, and `true` is no number (#774). `Task.run` coerces every declared argument through `coerce_arguments` before dispatch, so a handler sees a number, and an argument that has no range besides being a number declares `finite`. A command's cross-argument rules are its registered `static_check`, which `task_argument_errors` runs at validation (`attribute_voices`' `voices_argument_errors`, kept in `dw/tasks/voice_attribution.py`, among them). A literal enum choice (`choice_errors`) and the `ingredients_grid` image count against `max_images` (`ingredients_grid_errors`) are refused at validation by the same module. So are `crop_face_track`'s cross-argument rules (`face_track_problems`, `face_track_errors`: crop size a multiple of the step's `multiple` (32 by default), `remainder` below `modulus`, `gate_zero` above `gate_full`, padding and confidence limits), which the task checks again at run time, as `analyze_beats`' are too (`beats_problems`, `beats_errors`: `min_bpm` below `max_bpm`, and anchors that are one kind per list, ascending, with whole beat indexes; `tests/test_analyze_beats.py`), and `plan_cuts`' (`cuts_problems`, `cuts_errors`: a bare-string transcript (`transcript_problem`, which `plan_cuts` also calls at run time), `min_scene_s` above `max_scene_s`, `segment_by: "beat"` without beats), and `select`'s index (`select_index_problem`, `select_rule_problems`: a whole number, at least 0, and below the candidate count when the count is known, i.e. at run time or when `candidates` is a written list), and `apply_lut`'s (`lut_source_problem`, `palette_problem`, `lut_errors`: exactly one of `lut` or `palette`, and a palette of 2..16 `#rrggbb` colours, re-checked at run time by `check_lut_source`), and `check_face_detector_source` vets its Hub repo and `.onnx` file before any download. | `tests/test_task_domains.py::TestTheStaticPass::test_a_negative_frame_count_is_refused_at_its_path`, `tests/test_numeric_coercion.py::TestGradeExposure::test_a_string_number_grades_like_the_number`, `tests/test_task_domains.py::TestAtRunTime::test_slice_audio_refuses_a_negative_count`, `tests/test_ingredients_grid.py::TestStaticValidation::test_bad_layout_and_fit`, `tests/test_face_track.py::TestStaticValidation::test_bad_literal_is_an_error_at_its_argument`, `tests/test_face_track.py::TestCropFaceTrack::test_bad_arguments_are_refused_at_run_time`, `tests/test_face_track.py::TestStaticValidation::test_a_declared_grid_is_accepted`, `tests/test_face_track.py::TestDetectorSource::test_traversing_repo_is_refused`, `tests/test_select_validation.py::TestSelectErrors::test_an_out_of_range_literal_index_names_both_ends`, `tests/test_lut.py::TestPaletteAtValidate::test_both_refuse_naming_the_two`, `tests/test_lut.py::TestPalette::test_a_bad_palette_refuses_naming_the_entry` |
34
+ | Adding a task | `dw/tasks/registry.py`: `register_command`, `RegistryTable` | A task is a function registered with `@register_command`, and the signature of its implementation is its argument schema. Its validate-time rules are declared on the same decorator - `domains`, `choices`, `static_check`, `whole_numbers` and `media_arguments` - and `TASK_ARGUMENT_DOMAINS`, `TASK_ARGUMENT_CHOICES`, `TASK_STATIC_CHECKS`, `TASK_WHOLE_NUMBER_ARGUMENTS` and `TASK_MEDIA_ARGUMENTS` are read-only views derived from them, so there is no second table to forget (#692). The registry lives in `dw/tasks/registry.py`; `dw/tasks/task.py` re-exports it, and a task module may register its own handler, as `dw/tasks/beats.py` does, provided `dw/tasks/task.py` imports it (`docs/TASKS.md` *Adding a task*). The built-in handlers are grouped by family the same way - `dw/tasks/audio_handlers.py`, `dw/tasks/video_handlers.py`, `dw/tasks/finish_handlers.py` and `dw/tasks/model_handlers.py` (#790) - and `dw/tasks/task.py` keeps the general-purpose commands, the processor dispatch and `Task`. | `tests/test_task_discovery.py::TestDescribeTask::test_signature_becomes_the_schema`, `tests/test_task_registry_rules.py::test_every_derived_table_is_the_registrys_view`, `tests/test_task_registry_rules.py::test_every_static_check_is_registered_to_exactly_one_command`, `tests/test_task_registry_rules.py::test_every_media_argument_is_a_parameter_of_its_command` |
35
+ | Task argument domains | `dw/task_domains.py`: `check_arguments`, `task_argument_errors`; `dw/task_problems.py`: `face_track_errors`, `beats_errors`, `cuts_errors`, `lut_errors` | A numeric domain that a signature cannot express is declared on the command's `@register_command(domains=...)`, and it is checked at validation and again at run time. A numeric argument is read by `whole_number` or `real_number`, the only numeric coercion in `dw/tasks/`, and validation applies the same rule (`number_problem`), so a value is refused at both or at neither: `"3.0"` is a whole number, `"3.5"` for one of `whole_numbers` is not, and `true` is no number (#774). `Task.run` coerces every declared argument through `coerce_arguments` before dispatch, so a handler sees a number, and an argument that has no range besides being a number declares `finite`. A command's cross-argument rules are its registered `static_check`, which `task_argument_errors` runs at validation (`attribute_voices`' `voices_argument_errors`, kept in `dw/tasks/voice_attribution.py`, among them). A literal enum choice (`choice_errors`) is refused at validation by the same module. The per-family rules past a single domain live in `dw/task_problems.py`, which reads `task_domains`' helpers and is never imported by it (`task_argument_errors` reaches them only through the registered `static_check`, so `import_cycles` stays 0; #790): the `ingredients_grid` image count against `max_images` (`ingredients_grid_errors`), and `crop_face_track`'s cross-argument rules (`face_track_problems`, `face_track_errors`: crop size a multiple of the step's `multiple` (32 by default), `remainder` below `modulus`, `gate_zero` above `gate_full`, padding and confidence limits), which the task checks again at run time, as `analyze_beats`' are too (`beats_problems`, `beats_errors`: `min_bpm` below `max_bpm`, and anchors that are one kind per list, ascending, with whole beat indexes; `tests/test_analyze_beats.py`), and `plan_cuts`' (`cuts_problems`, `cuts_errors`: a bare-string transcript (`transcript_problem`, which `plan_cuts` also calls at run time), `min_scene_s` above `max_scene_s`, `segment_by: "beat"` without beats), and `apply_lut`'s (`lut_source_problem`, `palette_problem`, `lut_errors`: exactly one of `lut` or `palette`, and a palette of 2..16 `#rrggbb` colours, re-checked at run time by `check_lut_source`), and `check_face_detector_source` vets its Hub repo and `.onnx` file before any download. `select`'s index stays in `task_domains` with the other media-timing rules (`select_index_problem`, `select_rule_problems`: a whole number, at least 0, and below the candidate count when the count is known, i.e. at run time or when `candidates` is a written list). | `tests/test_task_domains.py::TestTheStaticPass::test_a_negative_frame_count_is_refused_at_its_path`, `tests/test_numeric_coercion.py::TestGradeExposure::test_a_string_number_grades_like_the_number`, `tests/test_task_domains.py::TestAtRunTime::test_slice_audio_refuses_a_negative_count`, `tests/test_ingredients_grid.py::TestStaticValidation::test_bad_layout_and_fit`, `tests/test_face_track.py::TestStaticValidation::test_bad_literal_is_an_error_at_its_argument`, `tests/test_face_track.py::TestCropFaceTrack::test_bad_arguments_are_refused_at_run_time`, `tests/test_face_track.py::TestStaticValidation::test_a_declared_grid_is_accepted`, `tests/test_face_track.py::TestDetectorSource::test_traversing_repo_is_refused`, `tests/test_select_validation.py::TestSelectErrors::test_an_out_of_range_literal_index_names_both_ends`, `tests/test_lut.py::TestPaletteAtValidate::test_both_refuse_naming_the_two`, `tests/test_lut.py::TestPalette::test_a_bad_palette_refuses_naming_the_entry` |
36
36
  | Variables | `dw/variables.py`: `set_variables`, `argument_errors`, `resolve_variable_values` | `argument_errors` folds a caller's arguments in exactly as `set_variables` does when a run starts, so a bad name or value is refused before anything is queued. | `tests/test_variables.py::test_argument_errors_reports_a_dict_passed_for_a_string_variable` |
37
37
  | List variables from the CLI | `dw/run.py`, `dw/variables.py`: `get_value` | A `name=value` string given for a list variable is split on commas, so a list of objects can only be passed as JSON over the API or MCP. | `tests/test_variables.py::test_set_variables_list_default_splits_on_comma` |
38
38
  | `for_each` expansion | `dw/for_each.py`: `expand_for_each` | Each entry becomes an ordinary step named `<step>@<entry>`, after substitution and before the reference check. | `tests/test_for_each.py::TestNaming::test_member_name_joins_with_at` |
39
+ | Optional entry field | `dw/for_each.py`: `_optional_item`, `_item_fields` | `{"item": "field", "default": X}` reads an entry field with a fallback; without `default` it is the plain required read, and `list_fields` / `entry_field_warnings` count the field as one entries take. The editor's string scan needs no twin code, only the shared case file. | `tests/test_for_each.py::TestOptionalItem::test_a_present_field_wins_and_an_absent_one_takes_the_default`, `tests/test_ui_twins.py::test_the_engine_decides_each_shared_reference_case` |
39
40
  | Previous results | `dw/previous_results.py`: `get_iterations`, `previous_result_reference_errors` | Several `previous_result:` references in one step multiply into a cartesian product. | `tests/test_previous_results.py::TestGetIterations::test_multiple_references_create_cartesian_product` |
40
41
  | Previous-result check | `dw/previous_results.py`: `previous_result_reference_errors` | A literal reference to a step that is not earlier in the workflow is a validation error. | `tests/test_previous_results.py::TestStaticReferenceChecking::test_a_step_cannot_reference_itself_or_a_later_one` |
41
42
  | Type conversion | `dw/arguments.py`: `realize_args`, `dw/type_helpers.py`: `get_type` | A key ending `_type` or `_dtype` loads a Python object at realize time. The other spellings, and `{}` escaping, are in `docs/WORKFLOW_GUIDE.md`. | `tests/test_type_helpers.py::TestGetType::test_get_type_from_diffusers`, `tests/test_arguments.py::TestRealizeArgs::test_realize_escaped_type_reference` |
@@ -76,6 +77,7 @@ one to open.
76
77
  | Fit to a model and restore | `dw/tasks/fit.py`: `fit_to_model`, `restore_to_source` | fit_to_model's record is the whole of what restore_to_source needs: the scale is inferred from the output's size and must be uniform, and restore returns the source's size times that scale and at most its frame count. | `tests/test_fit_to_model.py` |
77
78
  | Shared image ops | `dw/tasks/image_ops.py`: `LUMA_WEIGHTS`, `luma`, `split_alpha`, `join_alpha`, `per_frame` | `grade`, `finish` and `lut` take luma (float64 Rec. 709 weights, cast to the input's dtype) and alpha handling from `image_ops`, never from each other, so an RGBA input comes back RGBA with its alpha untouched; `lut.LUMA_WEIGHTS` is a re-export. An image command runs over a video or frame list only through `per_frame`. A media file is read by `task._load_media` with `fetch_image(keep_alpha=True)`, so a file with transparency arrives RGBA; a pipeline input still flattens to RGB. | `tests/test_image_ops.py::TestLuma::test_lut_re_exports_the_one_float64_weights`, `tests/test_image_ops.py::TestAlpha::test_rgba_round_trip_keeps_the_alpha_bytes`, `tests/test_image_ops.py::TestOutputsAreByteIdentical::test_every_command_matches_the_pre_refactor_bytes`, `tests/test_image_ops.py::TestPerFrame::test_a_video_comes_back_as_a_video_with_the_same_frames_and_audio`, `tests/test_finish.py::TestRgbaFileKeepsAlpha::test_a_file_path_comes_back_rgba_with_its_alpha` |
78
79
  | Audio level of a deliverable | `dw/audio_qc.py`: `warn_without_headroom`, `warn_if_written_above_full_scale` | A muxed video keeps the pre-encode headroom prediction and falls back to it only when the post-write probe cannot measure the file. A result a later step resets the level of (`consumed_by_normalizer`, `dw/step_cache.py`) draws neither the post-write warning nor the fallback. | `tests/test_result.py::TestNoHeadroom::test_a_clean_video_mux_drops_the_stale_prediction`, `tests/test_result.py::TestNoHeadroom::test_an_unprobeable_video_mux_falls_back_to_the_prediction`, `tests/test_result.py::TestNoHeadroom::test_a_video_a_join_level_matches_draws_no_headroom_warning`, `tests/test_result.py::TestTheWrittenLevel::test_a_file_that_decodes_above_full_scale_warns` |
80
+ | Level-spread warning on a replaced track | `dw/step_cache.py`: `audio_replaced_downstream`, `dw/tasks/joins.py`: `warn_on_level_spread` | A join whose track a later `pair_audio` takes as its `video` draws no `level_spread` warning; being that step's `audio` argument doesn't count. | `tests/test_step_cache.py::test_level_spread_warning_suppressed_when_audio_replaced`, `tests/test_step_cache.py::test_audio_replaced_downstream_false_when_it_is_the_audio_or_unread` |
79
81
  | Template audio-level placement | `workflows/templates/minimax/music-video.json`, `workflows/templates/minimax/music.json` | `normalize_audio` (-3 dBFS) acts only on the track that goes into the final file, so the slices that condition the shots are untouched. `music-video` slices each shot `lead_frames` early and `trim_video` drops the run-up before the join. | — |
80
82
 
81
83
  ## Validation, plan and cost
@@ -94,9 +96,10 @@ one to open.
94
96
  | Raw workflow GET | `dw/server/routes/library.py`: `get_workflow` | The raw workflow GET is served verbatim, with no `observed`, because the editor saves what it reads. | — |
95
97
  | VRAM projection | `dw/vram_estimate.py`, `dw/guides.py`: `guide_lengths` | A template's `vram_estimate` is projected per step after `for_each` expansion, and only the largest step over the ceiling is reported. With `bytes_per_guide_voxel` declared, each guide the step lays in (its own non-null `guides` plus a guide chain's) adds its snapped frames times the canvas; an unprobeable clip is charged at `num_frames`, and validate, admission and run project the same number. | `tests/test_vram_estimate.py::test_only_the_largest_over_ceiling_step_is_reported_once_per_cost_entry`, `tests/test_vram_guides.py::test_validate_apply_and_required_agree_on_a_guided_definition` |
96
98
  | H3 Ref2VA VRAM numbers | `workflows/templates/minimax/` | Every Ref2VA template declares `base_gb` 16.0, `bytes_per_voxel` 28.71 and `gb_per_reference` 1.0. | `tests/test_h3_vram_ceiling.py::test_every_ref2va_minimax_template_declares_gb_per_reference` |
97
- | Inherited VRAM ceiling | `dw/vram_inheritance.py`, `dw/server/deps.py`: `ceiling_index` | A workflow with no `vram_estimate` is matched against the catalog by pipeline identity, and is warned, never refused. | `tests/test_vram_inheritance.py::test_every_template_declaring_one_identity_declares_the_same_numbers` |
99
+ | Inherited VRAM ceiling | `dw/vram_inheritance.py`, `dw/server/deps.py`: `ceiling_index` (the catalog parse is `_catalog_listing`, shared with the cost lookup below) | A workflow with no `vram_estimate` is matched against the catalog by pipeline identity, and is warned, never refused. | `tests/test_vram_inheritance.py::test_every_template_declaring_one_identity_declares_the_same_numbers` |
100
+ | Inherited cost | `dw/server/deps.py`: `inherited_observed`, `dw/vram_inheritance.py`: `inherited_differences`, `dw/plan.py`: `_observed` (basis `inherited`), `dw/server/routes/jobs.py`: `_inherited_cost_warnings` | An inline workflow (no catalog name) is priced from the observed runs of the catalog template with the same `component_type` + `model_name` + `workflow` key as `vram_inheritance`; the template with the most cold runs wins, then name. `differs` lists offload, quantization and frame count set differently from the template. It is warned, never refused. | `tests/test_inherited_cost.py::TestPricedByPipelineIdentity::test_an_inline_copy_inherits_the_templates_runs`, `tests/test_inherited_cost.py::TestDifferences::test_offload_quantization_and_frames_are_named`, `tests/test_inherited_cost.py::TestThePlanReportsIt::test_the_estimate_is_inherited_and_the_validate_answer_warns` |
98
101
  | H3 adapter partition | `dw/adapter_compatibility.py` | An FL2VA LoRA on a reference step is refused, and a LoRA whose file name says neither `ref2v` nor `fl2v` is warned. | `tests/test_h3_adapters.py::TestWhatIsRefused::test_a_keyframe_adapter_on_the_reference_path`, `tests/test_h3_adapters.py::TestWhatIsRefused::test_an_unrecognised_name_is_a_warning_not_a_refusal` |
99
- | H3 audio hold, refine and guide layout | Three modules, imported one way: `dw/pipeline_processors/h3_rules.py` holds the names and rules, torch- and diffusers-free (`refine_problems`, the per-argument refine rules asked before validation and before the call; `not_h3`, the step rule; `snap_guide_length`, `guide_frame_problem`, `guide_chain_problems`, `guide_end_problem`; `CHAIN_CONTINUITY_MODES`; the chunk constants), `dw/pipeline_processors/h3_hold.py` the hold and refine blocks (`insert_audio_hold`, `core_denoise_sequences`, `refines`, `encode_audio_span`), and `dw/pipeline_processors/h3_guides.py` the guide layout (`LAYOUT_ANCHORS`, `splice_guide_rows`, `insert_guides`), which imports `h3_hold` and never the reverse (`_with_guides` in `dw/pipeline_processors/pipeline.py` adds its blocks for a `guides` call), `dw/guides.py`: the `guides` validation check and the chain `continuity: "guide"` check, `guide_chain_errors`, which asks the `guides` check's own step rule (`_takes_guides_problem`, built on `h3_rules.not_h3` and `REFERENCE_WORKFLOWS`) and reads the mode names from `h3_rules.CHAIN_CONTINUITY_MODES`, the names `chain.py`'s `CONTINUITY_MODES` is zipped against (both registered in `dw/validation.py`; a `previous_result:` guide is checked at run time), `dw/hold_audio.py`: `hold_audio_errors`, `refine_strength_errors` | The one place dw modifies a diffusers modular pipeline's block graph: three blocks go in, before `set_timesteps`, `denoise` and `after_denoise`, in every H3 core-denoise sequence (the whole graph and the `workflow=`-pruned flat graph), and they are no-ops without `hold_audio` / `refine_strength`. A `hold_audio` path is opened only after `locations.validate_media_path` against the step's workflow directory. `dw/introspection.py` builds the same graph without weights, hold included, so `get_pipeline_signature` lists a modular pipeline's block inputs. The copies of diffusers behaviour are pinned to the installed diffusers: `shifted_sigma_grid` (the spacing `refine_sigmas` rests on) to stock `set_timesteps`, `GUIDE_FRAMES_PER_CHUNK`/`GUIDE_LATENTS_PER_CHUNK` to the H3 video VAE's `clip_length` and latents per clip, and every name in `LAYOUT_ANCHORS` (`_fill_audio_positions` among them) to `before_denoise`. | `tests/test_h3_hold_audio.py::TestAnchors::test_inserted_next_to_the_anchors_in_every_shape`, `tests/test_h3_hold_audio.py::TestHoldAudioLocation::test_a_path_outside_the_roots_is_refused_at_the_call`, `tests/test_h3_hold_audio.py::TestRefusals::test_a_non_h3_step_is_refused`, `tests/test_h3_hold_audio.py::TestSignature::test_the_h3_signature_shows_hold_audio`, `tests/test_h3_refine.py::TestAnchors::test_inserted_before_denoise_in_every_shape`, `tests/test_h3_refine.py::TestSigmaGridDrift::test_the_full_grid_is_stock_set_timesteps`, `tests/test_h3_guides.py::TestChunkDrift::test_frames_per_chunk_is_the_vae_clip_length`, `tests/test_h3_guides.py::TestChunkDrift::test_latents_per_chunk_is_the_vae_tokens_per_clip`, `tests/test_h3_guides.py::TestAnchors::test_installed_diffusers_has_every_anchor`, `tests/test_guide_chain_validation.py::TestRefused::test_the_step_rule_is_the_guides_rule`, `tests/test_guide_chain_validation.py::TestRefused::test_every_run_mode_is_known_to_validate`, `tests/test_h3_rules.py::test_h3_rules_imports_neither_torch_nor_diffusers` |
102
+ | H3 audio hold, refine and guide layout | Five modules, imported one way: `dw/pipeline_processors/h3_rules.py` holds the names and rules, torch- and diffusers-free (`refine_problems`, the per-argument refine rules asked before validation and before the call; `not_h3`, the step rule; `snap_guide_length`, `guide_frame_problem`, `guide_chain_problems`, `guide_end_problem`; `CHAIN_CONTINUITY_MODES`; the chunk constants), `dw/pipeline_processors/h3_hold.py` puts the hold and refine blocks in (`insert_audio_hold`, `core_denoise_sequences`, `refines`), and `dw/pipeline_processors/h3_guides.py` the guide layout (`LAYOUT_ANCHORS`, `insert_guides`), which imports `h3_hold` and never the reverse; the blocks themselves, and the arithmetic they run, are `dw/pipeline_processors/h3_hold_steps.py` (`encode_audio_span`, `refine_sigmas`) and `dw/pipeline_processors/h3_guide_steps.py` (`splice_guide_rows`), which import diffusers when they load, so the two owners import them only inside `blocks()` and `guide_blocks()` (#790), and `h3_guide_steps` imports `h3_hold_steps` and never the reverse (`_with_guides` in `dw/pipeline_processors/pipeline.py` adds its blocks for a `guides` call), `dw/guides.py`: the `guides` validation check and the chain `continuity: "guide"` check, `guide_chain_errors`, which asks the `guides` check's own step rule (`_takes_guides_problem`, built on `h3_rules.not_h3` and `REFERENCE_WORKFLOWS`) and reads the mode names from `h3_rules.CHAIN_CONTINUITY_MODES`, the names `chain.py`'s `CONTINUITY_MODES` is zipped against (both registered in `dw/validation.py`; a `previous_result:` guide is checked at run time), `dw/hold_audio.py`: `hold_audio_errors`, `refine_strength_errors` | The one place dw modifies a diffusers modular pipeline's block graph: three blocks go in, before `set_timesteps`, `denoise` and `after_denoise`, in every H3 core-denoise sequence (the whole graph and the `workflow=`-pruned flat graph), and they are no-ops without `hold_audio` / `refine_strength`. A `hold_audio` path is opened only after `locations.validate_media_path` against the step's workflow directory. `dw/introspection.py` builds the same graph without weights, hold included, so `get_pipeline_signature` lists a modular pipeline's block inputs. The copies of diffusers behaviour are pinned to the installed diffusers: `shifted_sigma_grid` (the spacing `refine_sigmas` rests on) to stock `set_timesteps`, `GUIDE_FRAMES_PER_CHUNK`/`GUIDE_LATENTS_PER_CHUNK` to the H3 video VAE's `clip_length` and latents per clip, and every name in `LAYOUT_ANCHORS` (`_fill_audio_positions` among them) to `before_denoise`. | `tests/test_h3_hold_audio.py::TestAnchors::test_inserted_next_to_the_anchors_in_every_shape`, `tests/test_h3_hold_audio.py::TestHoldAudioLocation::test_a_path_outside_the_roots_is_refused_at_the_call`, `tests/test_h3_hold_audio.py::TestRefusals::test_a_non_h3_step_is_refused`, `tests/test_h3_hold_audio.py::TestSignature::test_the_h3_signature_shows_hold_audio`, `tests/test_h3_refine.py::TestAnchors::test_inserted_before_denoise_in_every_shape`, `tests/test_h3_refine.py::TestSigmaGridDrift::test_the_full_grid_is_stock_set_timesteps`, `tests/test_h3_guides.py::TestChunkDrift::test_frames_per_chunk_is_the_vae_clip_length`, `tests/test_h3_guides.py::TestChunkDrift::test_latents_per_chunk_is_the_vae_tokens_per_clip`, `tests/test_h3_guides.py::TestAnchors::test_installed_diffusers_has_every_anchor`, `tests/test_guide_chain_validation.py::TestRefused::test_the_step_rule_is_the_guides_rule`, `tests/test_guide_chain_validation.py::TestRefused::test_every_run_mode_is_known_to_validate`, `tests/test_h3_rules.py::test_h3_rules_imports_neither_torch_nor_diffusers`, `tests/test_h3_rules.py::test_the_block_owners_import_no_diffusers` |
100
103
  | IC-LoRA reference scale | `workflows/templates/ltx2/` | The three conditioning templates run at `reference_downscale_factor: 1`, and the two upscalers at 2. | `tests/test_ltx2_ic_loras.py::TestEachTemplateMatchesItsCard::test_the_reference_is_encoded_at_the_output_resolution`, `tests/test_ltx2_ic_loras.py::TestTheGenerativeUpscaleMatchesTheSameCard::test_it_loads_the_upscaler_at_factor_two` |
101
104
  | IC-LoRA numbers | `workflows/templates/ltx2/` | Every number in the IC-LoRA templates comes from the vendor's model card. | `tests/test_ltx2_ic_loras.py::TestEachTemplateMatchesItsCard::test_the_strength_is_the_cards_default`, `tests/test_ltx2_ic_loras.py::TestEachTemplateMatchesItsCard::test_the_defaults_are_the_trained_bucket` |
102
105
  | IC-LoRA prompt genre | `prompts/ltx2/` | A stored prompt tagged `ic-lora` is checked against its trained caption form, not against the T2V paragraph rule. | `tests/test_ltx_prompt_library.py::test_an_ic_lora_prompt_is_in_its_trained_form` |
@@ -122,7 +125,8 @@ one to open.
122
125
  | Opening media | `dw/media.py` | This is the only module that calls `av.open`. It imports no torch and no step types. | `tests/test_media_layering.py::test_av_open_appears_only_in_media`, `tests/test_media_layering.py::test_media_imports_no_step_types` (no torch: —) |
123
126
  | Signal processing | `dw/dsp.py` | It measures and transforms waveforms, decides nothing, and imports nothing from `dw`. | `tests/test_media_layering.py::test_dsp_imports_nothing_from_dw` |
124
127
  | Assessment probes | `dw/tasks/assess.py`, `dw/assessment_rules.py` | Exactly three registered commands are assessment probes. Each measures a finished file, and every rule names a real probe field. | `tests/test_assessment_rules.py::TestRuleProbesAreRealCommands::test_assessment_is_exactly_the_three_probes`, `tests/test_assessment_rules.py::TestRuleProbesAreRealCommands::test_every_rule_names_a_registered_json_command` |
125
- | Script check | `dw/tasks/script_check.py`: `check`; `dw/script_lines.py`: `parse_lines`, `parse_shots`, `shot_names_error` | `check_script` aligns a take's heard words to its expected lines and guards out words heard over silence and repetition loops (Whisper's hallucination over music). It builds its findings with `assessment_rules.finding()` and reads the guard's floor and window (`DEAD_AIR_FLOOR_DBFS`, `DEAD_AIR_WINDOW`) rather than copying them. It is not an assessment probe and adds nothing to `RULES`. Its literal `lines` is refused at validation through `task_domains` (`script_lines_errors`), which calls the same `parse_lines` the task runs, and a literal `shots` through the same `parse_shots` and `shot_names_error`; the parsers live in `dw/script_lines.py`, not the task, so that `task_domains` reaches them without importing `script_check` (the `import_cycles` ratchet in `scripts/arch_metrics.py`). Its shot map comes from `assess.resolve_shots`, the one the probes use, never a copy; it places each shot on the soundtrack with `assess.sample_span`, decides repeated shot names with `shots.duplicate_shot_names`, and asks `locations.is_http_url` whether the take is a URL. | `tests/test_script_check.py::TestRegistration::test_registered_as_json_command_without_assessment_flag`, `tests/test_script_check.py::TestEmptyLines::test_words_only_over_silence_are_discarded_not_found`, `tests/test_script_check.py::TestLinesErrors::test_literal_with_a_colon_is_not_a_reference` |
128
+ | Script check | `dw/tasks/script_check.py`: `check`; `dw/script_lines.py`: `parse_lines`, `parse_shots`, `shot_names_error` | `check_script` aligns a take's heard words to its expected lines and guards out words heard over silence and repetition loops (Whisper's hallucination over music). It builds its findings with `assessment_rules.finding()` and reads the guard's floor and window (`DEAD_AIR_FLOOR_DBFS`, `DEAD_AIR_WINDOW`) rather than copying them. It is not an assessment probe and adds nothing to `RULES`. Its literal `lines` is refused at validation through `task_problems` (`script_lines_errors`), which calls the same `parse_lines` the task runs, and a literal `shots` through the same `parse_shots` and `shot_names_error`; the parsers live in `dw/script_lines.py`, not the task, so that `task_problems` reaches them without importing `script_check` (the `import_cycles` ratchet in `scripts/arch_metrics.py`). Its shot map comes from `assess.resolve_shots`, the one the probes use, never a copy; it places each shot on the soundtrack with `assess.sample_span`, decides repeated shot names with `shots.duplicate_shot_names`, and asks `locations.is_http_url` whether the take is a URL. | `tests/test_script_check.py::TestRegistration::test_registered_as_json_command_without_assessment_flag`, `tests/test_script_check.py::TestEmptyLines::test_words_only_over_silence_are_discarded_not_found`, `tests/test_script_check.py::TestLinesErrors::test_literal_with_a_colon_is_not_a_reference` |
129
+ | Audio sync against a source slice | `dw/tasks/measure_sync.py`: `measure_sync`; `dw/dsp.py`: `envelope_lag` | `measure_sync` cross-correlates the onset envelopes of a shot's audio and its source slice and answers the lag and a 0-1 confidence. A positive lag means the audio is LATE (its events fall after the reference's), negative early; `lag_seconds` is None for a silent or flat track. It builds its findings (`sync_unmeasurable`, `sync_low_confidence`, `audio_out_of_sync`) with `assessment_rules.finding()` over module-local rule dicts and adds nothing to `RULES`; it reads the silence floor from `beats.SILENT_DBFS`. `envelope_lag` imports nothing from `dw`. | `tests/test_measure_sync.py::TestLag::test_late_audio_is_a_positive_lag`, `tests/test_measure_sync.py::TestLag::test_early_audio_is_a_negative_lag`, `tests/test_measure_sync.py::TestUnmeasurable::test_a_silent_reference_has_no_lag` |
126
130
 
127
131
  ## Security and architecture guardrails
128
132
 
@@ -133,7 +137,7 @@ one to open.
133
137
  | Locations from a workflow | `dw/locations.py` | A local path in a workflow's media arguments (named like their media, or declared by the task's `@register_command(media_arguments=...)`, read through `TASK_MEDIA_ARGUMENTS`) is confined to a known root, a location written as a URL is one `security.validate_url` accepts, and a URL must not name a host inside the deployment. A host that does not resolve is refused. The requests themselves are `dw/outbound.py`'s. | `tests/test_locations.py::TestMediaPathContainment::test_absolute_path_outside_every_root_is_refused`, `tests/test_locations.py::TestMediaPathContainment::test_a_url_that_is_not_http_is_refused`, `tests/test_locations.py::TestMediaPathContainment::test_an_upper_case_https_url_is_not_refused_as_another_scheme`, `tests/test_security_ssrf.py::TestInternalAddressSpellings::test_a_name_that_resolves_inside`, `tests/test_locations.py::TestTaskMediaArguments::test_an_unreadable_source_is_an_error_at_its_path` |
134
138
  | Outbound requests | `dw/outbound.py`: `safe_get`, `safe_post` | Every outbound request is validated per hop against `dw/locations.py`'s policy, resolved once and dialed at the address the policy checked, capped and timed. No other module under `dw/` makes an HTTP request or builds a session or adapter. | `tests/test_outbound.py::TestSafeRequest::test_one_lookup_per_hop_and_the_dial_is_the_checked_address` |
135
139
  | Trust gate | `dw/trust.py`: `require_trusted_dotted_name` | In an untrusted workflow (the default), a dotted type outside the allowlist is a validation error before anything is imported. | `tests/test_security_trust_gate.py::TestValidationRefusesBeforeImport::test_a_dotted_type_is_a_validation_error` |
136
- | CodeQL path-injection model | `.github/codeql/dw-security/DwPathSanitizers.qll`, `.github/workflows/codeql.yml` | The local pack models the `dw/security.py` validators as sanitizers, so a validator that moves is re-modelled in the same commit. | `.github/codeql/dw-security/DwPathInjection.ql` |
140
+ | CodeQL path-injection model | `.github/codeql/dw-security/DwPathSanitizers.qll`, `.github/workflows/codeql.yml` | The local pack models the `dw/security.py` validators (and `dw/locations.py`'s `validate_media_path`) as sanitizers, so a validator that moves is re-modelled in the same commit. | `.github/codeql/dw-security/DwPathInjection.ql` |
137
141
  | Archives never follow links | `dw/server/outputs.py`: `zip_download` | A gallery listing drops a symlink that leaves its root, and an archive skips one. | `tests/test_security_symlinks.py::TestOutputs::test_the_archive_route_does_not_follow_the_link`, `tests/test_security_symlinks.py::TestOutputs::test_the_gallery_listing_does_not_enumerate_the_link` |
138
142
  | Engine/server import direction | `dw/workspace.py`: `EXPORTS_SUBDIR` | No engine module imports `dw.server` except the entry point `dw/serve.py`, and a constant both sides need lives engine-side. | `docs/stabilization/baseline.json`: `import_cycles` ratchet (indirect: it fails only on an import that closes a cycle) |
139
143
  | Module and function size | `scripts/arch_metrics.py`: `SIZE_WARNING`, `SIZE_CEILING` | A module stays at or under 1,100 lines, and it warns above 1,000. A function stays at or under 150 lines. | `docs/stabilization/baseline.json`: `modules_over_size_ceiling`, `functions_over_150_lines` |
@@ -279,7 +279,7 @@ tools) rather than relying on the session pin.
279
279
  | `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` |
280
280
  | `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` |
281
281
  | `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 |
282
- | `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 |
282
+ | `list_assets(limit=50, prefix)` | `limit`, `prefix` | 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. Newest first; `prefix` keeps names starting with it (e.g. `cast/`), `limit` bounds the answer, `total` is the count matched before the cut |
283
283
  | `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 |
284
284
  | `upload_asset(file_path=None, content=None, asset_name=None, shared=False)` | exactly one of `file_path` or `content` (base64), optional `asset_name`, `shared` | Push an image, video or audio file, or a `.cube` 3D LUT for `apply_lut`, into the server's asset library and get back its `asset:` reference. `file_path` is read from the machine the MCP server runs on, so this is how an input reaches a dw.serve running somewhere else - but only when the caller shares a filesystem with that machine. `content` is the alternative for an agent that does not: the bytes travel inline, base64-encoded, in the tool call itself, capped at 4MB (well under `file_path`'s 200MB) because inline bytes compete with the calling agent's own context budget rather than being a bulk-transfer path (#203). `asset_name` is required with `content` (there is no file name to infer one from) and, either way, stores it under a readable name (`cast/priya-voice.wav`) instead of a random one; `shared=true` puts it in the library every workspace shares |
285
285
  | `delete_asset(name)` | `name` | Permanently remove one file from the asset library, by the name `list_assets` reports. Deletes from whichever library holds it - this workspace's own before the shared one; one from a read-only examples library is refused. Any workflow still carrying that `asset:` reference stops loading |