diffusers-workflow 0.6.0__tar.gz → 0.7.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 (507) hide show
  1. {diffusers_workflow-0.6.0/diffusers_workflow.egg-info → diffusers_workflow-0.7.0}/PKG-INFO +1 -1
  2. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0/diffusers_workflow.egg-info}/PKG-INFO +1 -1
  3. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/SOURCES.txt +24 -21
  4. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/__init__.py +9 -0
  5. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/adapter_compatibility.py +6 -7
  6. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/argument_media.py +2 -2
  7. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/arguments.py +10 -7
  8. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/assets.py +6 -4
  9. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/content_types.py +3 -6
  10. diffusers_workflow-0.7.0/dw/docs/ARCHITECTURE.md +150 -0
  11. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/RELEASING.md +18 -0
  12. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/elision.py +1 -1
  13. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/for_each.py +6 -4
  14. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/kernel_availability.py +19 -3
  15. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/library.py +54 -18
  16. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/locations.py +1 -1
  17. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/placement.py +7 -0
  18. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/plan.py +7 -11
  19. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/previous_results.py +4 -1
  20. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/probe_paths.py +4 -6
  21. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/prompts.py +10 -20
  22. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/realize.py +29 -23
  23. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/reference_limits.py +3 -5
  24. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/reference_names.py +25 -18
  25. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/references.py +7 -0
  26. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/runs.py +13 -6
  27. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/admission.py +7 -6
  28. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/catalog.py +8 -7
  29. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/enhancers.py +3 -1
  30. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/exports.py +5 -6
  31. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/job_history.py +7 -1
  32. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/jobs.py +3 -3
  33. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/outputs.py +4 -4
  34. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/assets.py +2 -2
  35. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/jobs.py +4 -5
  36. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/library.py +6 -4
  37. diffusers_workflow-0.6.0/dw/server/ui/assets/cssMode-CjZLP_Pe.js → diffusers_workflow-0.7.0/dw/server/ui/assets/cssMode-DQI1FUIr.js +1 -1
  38. diffusers_workflow-0.6.0/dw/server/ui/assets/editor.api-DXlBngV6.js → diffusers_workflow-0.7.0/dw/server/ui/assets/editor.api-a3j9A86u.js +1 -1
  39. diffusers_workflow-0.6.0/dw/server/ui/assets/freemarker2-CtKALOjK.js → diffusers_workflow-0.7.0/dw/server/ui/assets/freemarker2-BcdiHyGC.js +1 -1
  40. diffusers_workflow-0.6.0/dw/server/ui/assets/handlebars-teGPbQUB.js → diffusers_workflow-0.7.0/dw/server/ui/assets/handlebars-DCj-aPE8.js +1 -1
  41. diffusers_workflow-0.6.0/dw/server/ui/assets/html-DfSymt9C.js → diffusers_workflow-0.7.0/dw/server/ui/assets/html-D8xomw9g.js +1 -1
  42. diffusers_workflow-0.6.0/dw/server/ui/assets/htmlMode-Cr3jQp_U.js → diffusers_workflow-0.7.0/dw/server/ui/assets/htmlMode-DK_n-eew.js +1 -1
  43. diffusers_workflow-0.6.0/dw/server/ui/assets/index-J5rsq_M9.js → diffusers_workflow-0.7.0/dw/server/ui/assets/index-CNiY-pOw.js +5 -4
  44. diffusers_workflow-0.6.0/dw/server/ui/assets/javascript-BeSdrNYj.js → diffusers_workflow-0.7.0/dw/server/ui/assets/javascript-SmmG4uTF.js +1 -1
  45. diffusers_workflow-0.6.0/dw/server/ui/assets/jsonMode-DJLaxAu8.js → diffusers_workflow-0.7.0/dw/server/ui/assets/jsonMode-BRyslvRu.js +1 -1
  46. diffusers_workflow-0.6.0/dw/server/ui/assets/liquid-D5XtXQ2P.js → diffusers_workflow-0.7.0/dw/server/ui/assets/liquid-CC4C0BTL.js +1 -1
  47. diffusers_workflow-0.6.0/dw/server/ui/assets/lspLanguageFeatures-BJkK4mNN.js → diffusers_workflow-0.7.0/dw/server/ui/assets/lspLanguageFeatures-Cmg2_33_.js +1 -1
  48. diffusers_workflow-0.6.0/dw/server/ui/assets/mdx-CIThOdKr.js → diffusers_workflow-0.7.0/dw/server/ui/assets/mdx-DTAejllH.js +1 -1
  49. diffusers_workflow-0.6.0/dw/server/ui/assets/monaco-CYXGxb41.js → diffusers_workflow-0.7.0/dw/server/ui/assets/monaco-C_Um4bRZ.js +4 -4
  50. diffusers_workflow-0.6.0/dw/server/ui/assets/python-BlzkzsC6.js → diffusers_workflow-0.7.0/dw/server/ui/assets/python-DKASw3vF.js +1 -1
  51. diffusers_workflow-0.6.0/dw/server/ui/assets/razor-DeSKNqSl.js → diffusers_workflow-0.7.0/dw/server/ui/assets/razor-CkEOBTMa.js +1 -1
  52. diffusers_workflow-0.6.0/dw/server/ui/assets/tsMode-BCUw0fMr.js → diffusers_workflow-0.7.0/dw/server/ui/assets/tsMode-CmkUIEUu.js +1 -1
  53. diffusers_workflow-0.6.0/dw/server/ui/assets/typescript-3N0ou1YS.js → diffusers_workflow-0.7.0/dw/server/ui/assets/typescript-BXTFUpwg.js +1 -1
  54. diffusers_workflow-0.6.0/dw/server/ui/assets/workers-C91O0to6.js → diffusers_workflow-0.7.0/dw/server/ui/assets/workers-Cpj1l6gK.js +1 -1
  55. diffusers_workflow-0.6.0/dw/server/ui/assets/xml-DmIqin7X.js → diffusers_workflow-0.7.0/dw/server/ui/assets/xml-D1BkO5yz.js +1 -1
  56. diffusers_workflow-0.6.0/dw/server/ui/assets/yaml-BQg2lXI1.js → diffusers_workflow-0.7.0/dw/server/ui/assets/yaml-CDFThBDz.js +1 -1
  57. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/index.html +1 -1
  58. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/settings.py +14 -0
  59. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/shots.py +11 -14
  60. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/step_cache.py +3 -1
  61. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/step_value_checks.py +3 -6
  62. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/subfolders.py +10 -6
  63. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/audio_utils.py +6 -5
  64. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/dissolve_videos.py +0 -1
  65. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/joins.py +14 -11
  66. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/validation.py +15 -14
  67. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/variable_constraints.py +15 -10
  68. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/video_extensions.py +4 -6
  69. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/vram_estimate.py +9 -8
  70. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/worker.py +4 -1
  71. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflow.py +20 -176
  72. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflow_run.py +3 -4
  73. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflow_schema.json +1 -1
  74. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/__init__.py +4 -0
  75. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/pyproject.toml +1 -1
  76. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_admission.py +1 -1
  77. diffusers_workflow-0.7.0/tests/test_arch_metrics.py +355 -0
  78. diffusers_workflow-0.7.0/tests/test_architecture_map.py +172 -0
  79. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_arguments.py +8 -0
  80. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_assets.py +10 -0
  81. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_audio_utils.py +25 -0
  82. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_concat_videos.py +16 -0
  83. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_dissolve_videos.py +11 -9
  84. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_kernel_availability.py +33 -0
  85. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_lora_disable.py +7 -2
  86. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_output_references.py +8 -0
  87. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompt_references.py +3 -3
  88. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompts.py +18 -2
  89. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_realize.py +2 -1
  90. diffusers_workflow-0.7.0/tests/test_reference_skip_sets.py +108 -0
  91. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_references.py +30 -0
  92. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_runs.py +27 -0
  93. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_guides.py +2 -2
  94. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_shot_span_preflight.py +2 -1
  95. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_slice_preflight.py +4 -1
  96. diffusers_workflow-0.7.0/tests/test_sub_workflow_resolver.py +243 -0
  97. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_validation.py +23 -8
  98. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_vram_inheritance.py +5 -2
  99. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker_execute.py +26 -17
  100. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_workflow.py +6 -3
  101. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_workflow_step_cache.py +9 -6
  102. diffusers_workflow-0.6.0/tests/test_arch_metrics.py +0 -183
  103. diffusers_workflow-0.6.0/tests/test_reference_sets.py +0 -36
  104. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/LICENSE +0 -0
  105. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/MANIFEST.in +0 -0
  106. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/README.md +0 -0
  107. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
  108. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/entry_points.txt +0 -0
  109. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/requires.txt +0 -0
  110. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/diffusers_workflow.egg-info/top_level.txt +0 -0
  111. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/argument_warnings.py +0 -0
  112. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/assessment_rules.py +0 -0
  113. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/audio_qc.py +0 -0
  114. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/cache_blocks.json +0 -0
  115. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/cache_blocks.py +0 -0
  116. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
  117. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/dissolve_frame_errors.py +0 -0
  118. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/ACCELERATION.md +0 -0
  119. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/AGENT_LOOP.md +0 -0
  120. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/DEPENDENCIES.md +0 -0
  121. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/IP_ADAPTER.md +0 -0
  122. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/LORAS.md +0 -0
  123. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/MCP.md +0 -0
  124. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/PROMPT_WEIGHTING.md +0 -0
  125. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/QUANTIZATION.md +0 -0
  126. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/RECIPES_24GB.md +0 -0
  127. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/REMOTE.md +0 -0
  128. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/SECURITY.md +0 -0
  129. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/SECURITY_QUICKREF.md +0 -0
  130. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/SERVER.md +0 -0
  131. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/TASKS.md +0 -0
  132. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/TESTING.md +0 -0
  133. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/WORKER_GUIDE.md +0 -0
  134. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/WORKFLOW_GUIDE.md +0 -0
  135. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/docs/WORKSPACES.md +0 -0
  136. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/download_watch.py +0 -0
  137. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/dsp.py +0 -0
  138. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/events.py +0 -0
  139. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/host_memory.py +0 -0
  140. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/host_memory_projection.py +0 -0
  141. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/hub_cache.py +0 -0
  142. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/introspection.py +0 -0
  143. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/log_setup.py +0 -0
  144. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/media.py +0 -0
  145. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/media_frames.py +0 -0
  146. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/media_types.py +0 -0
  147. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/output_extraction.py +0 -0
  148. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_ownership.py +0 -0
  149. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/adapters.py +0 -0
  150. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/chain.py +0 -0
  151. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/components.py +0 -0
  152. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/config_objects.py +0 -0
  153. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/pipeline.py +0 -0
  154. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/progress.py +0 -0
  155. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/pipeline_processors/remote.py +0 -0
  156. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/prompt_schema.json +0 -0
  157. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/prompt_weighting.py +0 -0
  158. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/result.py +0 -0
  159. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/run.py +0 -0
  160. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/scalar_result_validation.py +0 -0
  161. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/schema.py +0 -0
  162. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/security.py +0 -0
  163. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/serve.py +0 -0
  164. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/__init__.py +0 -0
  165. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/app.py +0 -0
  166. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/assess.py +0 -0
  167. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/catalog_shape.py +0 -0
  168. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/deps.py +0 -0
  169. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/guides.py +0 -0
  170. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/http_security.py +0 -0
  171. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/job_record.py +0 -0
  172. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/mcp_mount.py +0 -0
  173. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/netinfo.py +0 -0
  174. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/observed_cost.py +0 -0
  175. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/__init__.py +0 -0
  176. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/files.py +0 -0
  177. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/gallery.py +0 -0
  178. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/media.py +0 -0
  179. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/routes/system.py +0 -0
  180. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/sysinfo.py +0 -0
  181. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
  182. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
  183. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
  184. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
  185. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
  186. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
  187. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
  188. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
  189. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
  190. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
  191. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
  192. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
  193. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
  194. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/css.worker-B3ciXF_0.js +0 -0
  195. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
  196. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
  197. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
  198. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
  199. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/editor-jjEx9u7D.css +0 -0
  200. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -0
  201. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
  202. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
  203. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
  204. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
  205. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
  206. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
  207. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/html.worker-C93Ht9o9.js +0 -0
  208. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/index-3Vw6WAPW.css +0 -0
  209. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
  210. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
  211. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -0
  212. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
  213. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
  214. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
  215. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
  216. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
  217. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
  218. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
  219. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
  220. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/monaco--ixms01u.css +0 -0
  221. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
  222. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
  223. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
  224. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
  225. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
  226. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
  227. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
  228. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/php-nr791fC2.js +0 -0
  229. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
  230. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
  231. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
  232. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
  233. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
  234. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
  235. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
  236. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
  237. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
  238. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
  239. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
  240. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
  241. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
  242. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
  243. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
  244. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
  245. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
  246. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
  247. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
  248. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
  249. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
  250. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
  251. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/st-DbInun42.js +0 -0
  252. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
  253. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
  254. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
  255. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/ts.worker-D7T1-Ig5.js +0 -0
  256. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
  257. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
  258. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
  259. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
  260. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/server/updater.py +0 -0
  261. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/shot_span_preflight.py +0 -0
  262. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/slice_preflight.py +0 -0
  263. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/step.py +0 -0
  264. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/task_domains.py +0 -0
  265. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/assess.py +0 -0
  266. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/audio_dynamics.py +0 -0
  267. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/audio_transcription.py +0 -0
  268. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/background_remover.py +0 -0
  269. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/borders.py +0 -0
  270. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/compose_text.py +0 -0
  271. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/concat_videos.py +0 -0
  272. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/depth_estimator.py +0 -0
  273. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/diffusion_upscale.py +0 -0
  274. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/format_messages.py +0 -0
  275. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/gather.py +0 -0
  276. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/grade.py +0 -0
  277. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/image_to_text.py +0 -0
  278. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/image_utils.py +0 -0
  279. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/interpolate_frames.py +0 -0
  280. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/join_into_song.py +0 -0
  281. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/judge.py +0 -0
  282. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/loop_bed.py +0 -0
  283. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/model_cache.py +0 -0
  284. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/pair_audio.py +0 -0
  285. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/qr_code.py +0 -0
  286. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/restore_faces.py +0 -0
  287. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/rife_model.py +0 -0
  288. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/segment.py +0 -0
  289. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/select.py +0 -0
  290. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/speech_generation.py +0 -0
  291. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/stabilize.py +0 -0
  292. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/task.py +0 -0
  293. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/tensor_image.py +0 -0
  294. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/text_generation.py +0 -0
  295. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/text_sections.py +0 -0
  296. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/upscale.py +0 -0
  297. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/video_utils.py +0 -0
  298. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/voice_attribution.py +0 -0
  299. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/tasks/zoe_depth.py +0 -0
  300. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/test.py +0 -0
  301. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/trust.py +0 -0
  302. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/type_helpers.py +0 -0
  303. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/type_references.py +0 -0
  304. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/validate.py +0 -0
  305. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/variables.py +0 -0
  306. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/video_size_errors.py +0 -0
  307. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/vram_inheritance.py +0 -0
  308. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/worker_manager.py +0 -0
  309. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/worker_protocol.py +0 -0
  310. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflows/h3_context_ir.json +0 -0
  311. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workflows/test.json +0 -0
  312. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/workspace.py +0 -0
  313. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw/writers.py +0 -0
  314. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/__main__.py +0 -0
  315. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/assets.py +0 -0
  316. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/authoring.py +0 -0
  317. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/catalog.py +0 -0
  318. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/client.py +0 -0
  319. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/diagnose.py +0 -0
  320. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/exports.py +0 -0
  321. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/guides.py +0 -0
  322. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/media.py +0 -0
  323. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/models.py +0 -0
  324. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/prompts.py +0 -0
  325. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/server.py +0 -0
  326. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/tools_authoring.py +0 -0
  327. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/tools_catalog.py +0 -0
  328. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/tools_jobs.py +0 -0
  329. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/tools_media.py +0 -0
  330. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/dw_mcp/workspaces.py +0 -0
  331. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/setup.cfg +0 -0
  332. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_arch_report.py +0 -0
  333. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_argument_updates.py +0 -0
  334. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_assemble_and_score_target_lufs.py +0 -0
  335. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_assess.py +0 -0
  336. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_assessment_rules.py +0 -0
  337. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_attention_slicing.py +0 -0
  338. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_best_of_n_template.py +0 -0
  339. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_borders.py +0 -0
  340. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_cache_blocks.py +0 -0
  341. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_catalog_shape.py +0 -0
  342. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_catalog_structure.py +0 -0
  343. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_chain.py +0 -0
  344. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_cli.py +0 -0
  345. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_component_name_errors.py +0 -0
  346. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_component_pruning.py +0 -0
  347. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_component_type_errors.py +0 -0
  348. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_compose_text.py +0 -0
  349. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_config_objects.py +0 -0
  350. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_configuration_schema.py +0 -0
  351. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_content_types.py +0 -0
  352. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_depth_estimator.py +0 -0
  353. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_device.py +0 -0
  354. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_device_helpers.py +0 -0
  355. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_device_portability.py +0 -0
  356. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_dialogue_short_voices.py +0 -0
  357. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_diffusion_upscale.py +0 -0
  358. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_dissolve_frame_errors.py +0 -0
  359. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_docs_links.py +0 -0
  360. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_download_watch.py +0 -0
  361. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_dsp.py +0 -0
  362. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_elision.py +0 -0
  363. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_events.py +0 -0
  364. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_examples.py +0 -0
  365. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_find_loop_bed.py +0 -0
  366. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_for_each.py +0 -0
  367. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_gather.py +0 -0
  368. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_grade.py +0 -0
  369. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_h3_adapters.py +0 -0
  370. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_h3_context_ir.py +0 -0
  371. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_h3_schedule.py +0 -0
  372. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_h3_vram_ceiling.py +0 -0
  373. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_hf_placement.py +0 -0
  374. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_host_memory.py +0 -0
  375. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_host_memory_projection.py +0 -0
  376. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_hub_cache.py +0 -0
  377. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_image_to_text.py +0 -0
  378. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_image_utils.py +0 -0
  379. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_integration.py +0 -0
  380. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_interpolate_frames.py +0 -0
  381. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_introspection.py +0 -0
  382. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_job_history_wal.py +0 -0
  383. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_job_progress.py +0 -0
  384. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_job_warnings.py +0 -0
  385. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_jobs_listing.py +0 -0
  386. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_jobs_reused.py +0 -0
  387. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_join_into_song.py +0 -0
  388. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_judge.py +0 -0
  389. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_library_path.py +0 -0
  390. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_library_sources.py +0 -0
  391. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_list_images.py +0 -0
  392. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_locations.py +0 -0
  393. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_lora_alpha.py +0 -0
  394. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_ltx2_diffusion_decode.py +0 -0
  395. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_ltx2_extend_clip.py +0 -0
  396. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_ltx2_ic_loras.py +0 -0
  397. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_ltx_prompt_library.py +0 -0
  398. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_assets.py +0 -0
  399. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_authoring.py +0 -0
  400. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_catalog.py +0 -0
  401. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_client.py +0 -0
  402. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_diagnose.py +0 -0
  403. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_exports.py +0 -0
  404. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_guides.py +0 -0
  405. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_main.py +0 -0
  406. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_media.py +0 -0
  407. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_models.py +0 -0
  408. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_prompts.py +0 -0
  409. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_server.py +0 -0
  410. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mcp_workspaces.py +0 -0
  411. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_media_audio.py +0 -0
  412. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_media_frames.py +0 -0
  413. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_media_info.py +0 -0
  414. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_media_layering.py +0 -0
  415. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mix_audio.py +0 -0
  416. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_model_cache.py +0 -0
  417. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_modular_output_properties.py +0 -0
  418. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_modular_pipeline.py +0 -0
  419. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_modular_progress.py +0 -0
  420. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mps_fallback_warning.py +0 -0
  421. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_mps_rope_precision.py +0 -0
  422. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_null_media.py +0 -0
  423. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_observed_cost.py +0 -0
  424. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_offload_placement.py +0 -0
  425. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_pair_audio.py +0 -0
  426. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_pair_audio_fit.py +0 -0
  427. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_parallel_loading_default.py +0 -0
  428. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_phase_events.py +0 -0
  429. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_pipeline_caching.py +0 -0
  430. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_pipeline_components.py +0 -0
  431. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_plan.py +0 -0
  432. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_plugin_skills.py +0 -0
  433. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prepare_pipeline.py +0 -0
  434. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_previous_result_walker_parity.py +0 -0
  435. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_previous_results.py +0 -0
  436. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompt_library.py +0 -0
  437. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompt_parser.py +0 -0
  438. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_prompt_weighting.py +0 -0
  439. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_real_models.py +0 -0
  440. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_recenter_crop.py +0 -0
  441. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_reference_limits.py +0 -0
  442. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_reference_names.py +0 -0
  443. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_rerun_new_seed.py +0 -0
  444. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_resize_bucket.py +0 -0
  445. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_result.py +0 -0
  446. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_result_fps.py +0 -0
  447. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_result_output_naming.py +0 -0
  448. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_rule_parity.py +0 -0
  449. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_scalar_result_validation.py +0 -0
  450. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_scheduler_config.py +0 -0
  451. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_schema.py +0 -0
  452. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security.py +0 -0
  453. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_auth.py +0 -0
  454. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_decoder_bombs.py +0 -0
  455. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_input_caps.py +0 -0
  456. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_ssrf.py +0 -0
  457. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_symlinks.py +0 -0
  458. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_trust_gate.py +0 -0
  459. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_security_web_headers.py +0 -0
  460. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_segment.py +0 -0
  461. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_select.py +0 -0
  462. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_select_validation.py +0 -0
  463. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_serve_main.py +0 -0
  464. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server.py +0 -0
  465. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_assess.py +0 -0
  466. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_downloads.py +0 -0
  467. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_exports.py +0 -0
  468. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_info.py +0 -0
  469. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_jobs.py +0 -0
  470. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_library_path.py +0 -0
  471. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_mcp.py +0 -0
  472. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_server_workspaces.py +0 -0
  473. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_shaping_logs.py +0 -0
  474. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_shots.py +0 -0
  475. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_speech_generation.py +0 -0
  476. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_stabilize.py +0 -0
  477. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_step.py +0 -0
  478. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_step_cache.py +0 -0
  479. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_strip_exif_and_watermark.py +0 -0
  480. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_subfolders.py +0 -0
  481. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_task.py +0 -0
  482. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_task_discovery.py +0 -0
  483. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_task_domains.py +0 -0
  484. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_task_signature_errors.py +0 -0
  485. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_template_defaults.py +0 -0
  486. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_template_subfolders.py +0 -0
  487. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_tensor_image.py +0 -0
  488. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_text_generation.py +0 -0
  489. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_text_sections.py +0 -0
  490. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_transcribe_audio.py +0 -0
  491. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_type_helpers.py +0 -0
  492. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_updater.py +0 -0
  493. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_validate_arguments.py +0 -0
  494. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_variable_constraints.py +0 -0
  495. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_variables.py +0 -0
  496. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_video_extensions.py +0 -0
  497. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_video_size_errors.py +0 -0
  498. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_video_utils.py +0 -0
  499. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_voice_attribution.py +0 -0
  500. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_vram_estimate.py +0 -0
  501. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker.py +0 -0
  502. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker_job_peak_rss.py +0 -0
  503. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker_manager.py +0 -0
  504. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_worker_messages.py +0 -0
  505. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_workflow_snapshot.py +0 -0
  506. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.0}/tests/test_workflow_trust.py +0 -0
  507. {diffusers_workflow-0.6.0 → diffusers_workflow-0.7.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.6.0
3
+ Version: 0.7.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.6.0
3
+ Version: 0.7.0
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -87,6 +87,7 @@ dw/writers.py
87
87
  dw/community_pipelines/pipeline_flux_rf_inversion.py
88
88
  dw/docs/ACCELERATION.md
89
89
  dw/docs/AGENT_LOOP.md
90
+ dw/docs/ARCHITECTURE.md
90
91
  dw/docs/DEPENDENCIES.md
91
92
  dw/docs/IP_ADAPTER.md
92
93
  dw/docs/LORAS.md
@@ -155,45 +156,45 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
155
156
  dw/server/ui/assets/csp-bTuwJoIa.js
156
157
  dw/server/ui/assets/css-DIMkf-bt.js
157
158
  dw/server/ui/assets/css.worker-B3ciXF_0.js
158
- dw/server/ui/assets/cssMode-CjZLP_Pe.js
159
+ dw/server/ui/assets/cssMode-DQI1FUIr.js
159
160
  dw/server/ui/assets/cypher-CVaqCwHa.js
160
161
  dw/server/ui/assets/dart-onAF5SnQ.js
161
162
  dw/server/ui/assets/dockerfile-DZFCIeNp.js
162
163
  dw/server/ui/assets/ecl-D05T4iGw.js
163
164
  dw/server/ui/assets/editor-jjEx9u7D.css
164
- dw/server/ui/assets/editor.api-DXlBngV6.js
165
+ dw/server/ui/assets/editor.api-a3j9A86u.js
165
166
  dw/server/ui/assets/editor.worker-q-txB4vs.js
166
167
  dw/server/ui/assets/elixir-6RTg0lbw.js
167
168
  dw/server/ui/assets/flow9-C5_-GSwl.js
168
- dw/server/ui/assets/freemarker2-CtKALOjK.js
169
+ dw/server/ui/assets/freemarker2-BcdiHyGC.js
169
170
  dw/server/ui/assets/fsharp-C8Ef5oNN.js
170
171
  dw/server/ui/assets/go-C-y9NEjX.js
171
172
  dw/server/ui/assets/graphql-fmXr3nnJ.js
172
- dw/server/ui/assets/handlebars-teGPbQUB.js
173
+ dw/server/ui/assets/handlebars-DCj-aPE8.js
173
174
  dw/server/ui/assets/hcl-CpzslTdj.js
174
- dw/server/ui/assets/html-DfSymt9C.js
175
+ dw/server/ui/assets/html-D8xomw9g.js
175
176
  dw/server/ui/assets/html.worker-C93Ht9o9.js
176
- dw/server/ui/assets/htmlMode-Cr3jQp_U.js
177
+ dw/server/ui/assets/htmlMode-DK_n-eew.js
177
178
  dw/server/ui/assets/index-3Vw6WAPW.css
178
- dw/server/ui/assets/index-J5rsq_M9.js
179
+ dw/server/ui/assets/index-CNiY-pOw.js
179
180
  dw/server/ui/assets/ini-sBoK_t0W.js
180
181
  dw/server/ui/assets/java-BEtHBSE6.js
181
- dw/server/ui/assets/javascript-BeSdrNYj.js
182
+ dw/server/ui/assets/javascript-SmmG4uTF.js
182
183
  dw/server/ui/assets/json.worker-B2V3pomh.js
183
- dw/server/ui/assets/jsonMode-DJLaxAu8.js
184
+ dw/server/ui/assets/jsonMode-BRyslvRu.js
184
185
  dw/server/ui/assets/julia-Bri6UV-V.js
185
186
  dw/server/ui/assets/kotlin-BOotOW0E.js
186
187
  dw/server/ui/assets/less-B9JPFI3C.js
187
188
  dw/server/ui/assets/lexon-CfSJPG6W.js
188
- dw/server/ui/assets/liquid-D5XtXQ2P.js
189
- dw/server/ui/assets/lspLanguageFeatures-BJkK4mNN.js
189
+ dw/server/ui/assets/liquid-CC4C0BTL.js
190
+ dw/server/ui/assets/lspLanguageFeatures-Cmg2_33_.js
190
191
  dw/server/ui/assets/lua-CsQS60Ue.js
191
192
  dw/server/ui/assets/m3-D-oSqn_W.js
192
193
  dw/server/ui/assets/markdown-Cimd5fb3.js
193
- dw/server/ui/assets/mdx-CIThOdKr.js
194
+ dw/server/ui/assets/mdx-DTAejllH.js
194
195
  dw/server/ui/assets/mips-CIPQ_RoX.js
195
196
  dw/server/ui/assets/monaco--ixms01u.css
196
- dw/server/ui/assets/monaco-CYXGxb41.js
197
+ dw/server/ui/assets/monaco-C_Um4bRZ.js
197
198
  dw/server/ui/assets/msdax-DauUninz.js
198
199
  dw/server/ui/assets/mysql-SOo6toE5.js
199
200
  dw/server/ui/assets/objective-c-FvmIjYaQ.js
@@ -208,10 +209,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
208
209
  dw/server/ui/assets/powershell-DmHpPYUd.js
209
210
  dw/server/ui/assets/protobuf-C531GsRP.js
210
211
  dw/server/ui/assets/pug-Z5eAx3Zn.js
211
- dw/server/ui/assets/python-BlzkzsC6.js
212
+ dw/server/ui/assets/python-DKASw3vF.js
212
213
  dw/server/ui/assets/qsharp-DkqhCAOL.js
213
214
  dw/server/ui/assets/r-BwWrilGY.js
214
- dw/server/ui/assets/razor-DeSKNqSl.js
215
+ dw/server/ui/assets/razor-CkEOBTMa.js
215
216
  dw/server/ui/assets/redis-ClamHrr6.js
216
217
  dw/server/ui/assets/redshift-DT7zqm-g.js
217
218
  dw/server/ui/assets/restructuredtext-BYgofb2h.js
@@ -231,15 +232,15 @@ dw/server/ui/assets/swift-Bxkupp3x.js
231
232
  dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
232
233
  dw/server/ui/assets/tcl-DISqw1ZD.js
233
234
  dw/server/ui/assets/ts.worker-D7T1-Ig5.js
234
- dw/server/ui/assets/tsMode-BCUw0fMr.js
235
+ dw/server/ui/assets/tsMode-CmkUIEUu.js
235
236
  dw/server/ui/assets/twig-De2hgUGE.js
236
- dw/server/ui/assets/typescript-3N0ou1YS.js
237
+ dw/server/ui/assets/typescript-BXTFUpwg.js
237
238
  dw/server/ui/assets/typespec-B8J7ngcE.js
238
239
  dw/server/ui/assets/vb-DV3o63ZY.js
239
240
  dw/server/ui/assets/wgsl-DpFanUEy.js
240
- dw/server/ui/assets/workers-C91O0to6.js
241
- dw/server/ui/assets/xml-DmIqin7X.js
242
- dw/server/ui/assets/yaml-BQg2lXI1.js
241
+ dw/server/ui/assets/workers-Cpj1l6gK.js
242
+ dw/server/ui/assets/xml-D1BkO5yz.js
243
+ dw/server/ui/assets/yaml-CDFThBDz.js
243
244
  dw/tasks/assess.py
244
245
  dw/tasks/audio_dynamics.py
245
246
  dw/tasks/audio_transcription.py
@@ -301,6 +302,7 @@ dw_mcp/workspaces.py
301
302
  tests/test_admission.py
302
303
  tests/test_arch_metrics.py
303
304
  tests/test_arch_report.py
305
+ tests/test_architecture_map.py
304
306
  tests/test_argument_updates.py
305
307
  tests/test_arguments.py
306
308
  tests/test_assemble_and_score_target_lufs.py
@@ -422,7 +424,7 @@ tests/test_realize.py
422
424
  tests/test_recenter_crop.py
423
425
  tests/test_reference_limits.py
424
426
  tests/test_reference_names.py
425
- tests/test_reference_sets.py
427
+ tests/test_reference_skip_sets.py
426
428
  tests/test_references.py
427
429
  tests/test_rerun_new_seed.py
428
430
  tests/test_resize_bucket.py
@@ -465,6 +467,7 @@ tests/test_stabilize.py
465
467
  tests/test_step.py
466
468
  tests/test_step_cache.py
467
469
  tests/test_strip_exif_and_watermark.py
470
+ tests/test_sub_workflow_resolver.py
468
471
  tests/test_subfolders.py
469
472
  tests/test_task.py
470
473
  tests/test_task_discovery.py
@@ -1,3 +1,12 @@
1
+ """diffusers-workflow: device detection and the startup that configures it.
2
+
3
+ The default torch device is deliberately never set. Diffusers loads weights
4
+ into system memory and then places them, onto the device or under offload
5
+ hooks; a default device of 'cuda' would build every module directly in VRAM
6
+ and run a large pipeline out of memory before any offload hook exists. Device
7
+ placement is explicit throughout dw.
8
+ """
9
+
1
10
  from .settings import resolve_path, load_settings
2
11
  from .log_setup import setup_logging
3
12
  import functools
@@ -53,9 +53,6 @@ MODEL_NAME_KEY = "model_name"
53
53
  WEIGHT_NAME_KEY = "weight_name"
54
54
  WORKFLOW_KEY = "workflow"
55
55
  FROM_PRETRAINED_KEY = "from_pretrained_arguments"
56
- # Values another pass resolves; one still spelled out here is not this
57
- # pass's complaint
58
- _UNRESOLVED_PREFIXES = references.UNRESOLVED
59
56
 
60
57
 
61
58
  def _trained_for(weight_name):
@@ -140,8 +137,10 @@ def _lora_problems(steps, source_indices, written=None, supplied=()):
140
137
  if not isinstance(lora, dict):
141
138
  continue
142
139
  weight_name = lora.get(WEIGHT_NAME_KEY)
143
- if not isinstance(weight_name, str) or weight_name.startswith(
144
- _UNRESOLVED_PREFIXES
140
+ # Values another pass resolves; one still spelled out here is not
141
+ # this pass's complaint
142
+ if not isinstance(weight_name, str) or references.is_ref(
143
+ references.UNRESOLVED, weight_name
145
144
  ):
146
145
  continue
147
146
  problem = _problem(workflow, weight_name)
@@ -180,9 +179,9 @@ def _path_for(written_steps, source, position, supplied, key=WEIGHT_NAME_KEY):
180
179
  return None
181
180
  entry = loras[position]
182
181
  reference = entry.get(key) if isinstance(entry, dict) else None
183
- if not isinstance(reference, str) or not reference.startswith(references.VARIABLE):
182
+ variable = references.ref_name(references.VARIABLE, reference)
183
+ if variable is None:
184
184
  return None
185
- variable = reference.removeprefix(references.VARIABLE)
186
185
  return f"arguments.{variable}" if variable in (supplied or ()) else None
187
186
 
188
187
 
@@ -135,7 +135,7 @@ def fetch_image(img_spec, base_dir=None):
135
135
  raise ValueError(f"Image specification must be a string, got {type(img_spec)}")
136
136
 
137
137
  # Skip cross-step and variable references — these are resolved later during execution
138
- if references.is_ref((references.PREVIOUS_RESULT, references.VARIABLE), img_spec):
138
+ if references.is_ref(references.LAZY_MEDIA, img_spec):
139
139
  logger.debug(f"Skipping deferred reference: {img_spec}")
140
140
  return img_spec
141
141
 
@@ -291,7 +291,7 @@ def fetch_video(video_spec, base_dir=None):
291
291
  )
292
292
 
293
293
  # Skip cross-step and variable references — these are resolved later during execution
294
- if references.is_ref((references.PREVIOUS_RESULT, references.VARIABLE), video_spec):
294
+ if references.is_ref(references.LAZY_MEDIA, video_spec):
295
295
  logger.debug(f"Skipping deferred reference: {video_spec}")
296
296
  return video_spec
297
297
 
@@ -14,7 +14,7 @@ from .type_helpers import (
14
14
  load_constant_from_name,
15
15
  has_method,
16
16
  )
17
- from .prompts import PROMPT_PREFIX, fetch_prompt
17
+ from .prompts import fetch_prompt
18
18
  from .assets import fetch_asset, is_asset_reference
19
19
  from .runs import fetch_output, is_output_reference
20
20
  from .argument_media import (
@@ -286,7 +286,7 @@ def is_constant_reference(value):
286
286
 
287
287
  def is_prompt_reference(value):
288
288
  """Whether a value references a stored prompt in the prompt library."""
289
- return references.is_ref(PROMPT_PREFIX, value)
289
+ return references.is_ref(references.PROMPT, value)
290
290
 
291
291
 
292
292
  def fetch_constant(reference):
@@ -312,7 +312,12 @@ def fetch_constant(reference):
312
312
  ValueError: If the name resolves to nothing, or to something callable
313
313
  InvalidInputError: If the name is not a dotted python name
314
314
  """
315
- name = validate_constant_name(reference.removeprefix(references.CONSTANT).strip())
315
+ name = references.ref_name(references.CONSTANT, reference)
316
+ if name is None:
317
+ # A bare name reads as written: callers guard with is_constant_reference,
318
+ # a direct caller need not
319
+ name = reference
320
+ name = validate_constant_name(name.strip())
316
321
 
317
322
  try:
318
323
  value = load_constant_from_name(name)
@@ -325,7 +330,7 @@ def fetch_constant(reference):
325
330
  if callable(value):
326
331
  raise ValueError(
327
332
  f"'{name}' is a {type(value).__name__}, not a constant - "
328
- f"'{references.CONSTANT}' reads a value, and a type is named with a "
333
+ f"'constant:' reads a value, and a type is named with a "
329
334
  f"'_type' argument instead"
330
335
  )
331
336
 
@@ -931,9 +936,7 @@ def _realize_lazy_frame_arguments(arguments, base_dir):
931
936
  video = arguments["video"]
932
937
  if is_path_reference(video) or isinstance(video, (list, dict)):
933
938
  video = resolve_path_references(video, base_dir)
934
- deferred = references.is_ref(
935
- (references.PREVIOUS_RESULT, references.VARIABLE), video
936
- )
939
+ deferred = references.is_ref(references.LAZY_MEDIA, video)
937
940
  url = isinstance(video, str) and (
938
941
  video.startswith("http://") or video.startswith("https://")
939
942
  )
@@ -26,9 +26,6 @@ from .workspace import ASSETS_SUBDIR, discover_library
26
26
 
27
27
  logger = logging.getLogger("dw")
28
28
 
29
- # The prefix marking a value as a reference to a stored asset
30
- ASSET_PREFIX = references.ASSET
31
-
32
29
  # The asset library of the run in progress. A server holds several
33
30
  # workspaces and each has its own assets, so this cannot be a process-wide
34
31
  # environment variable there the way the prompt library can - there is one
@@ -110,7 +107,12 @@ def resolve_asset_reference(reference, asset_dir=None, base_dir=None, library=No
110
107
  ValueError: If no file exists under that name in any directory on
111
108
  the search path
112
109
  """
113
- name = validate_asset_reference(reference.removeprefix(ASSET_PREFIX).strip())
110
+ name = references.ref_name(references.ASSET, reference)
111
+ if name is None:
112
+ # A bare name resolves as written: callers guard with is_asset_reference,
113
+ # a direct caller need not
114
+ name = reference
115
+ name = validate_asset_reference(name.strip())
114
116
  library = library or asset_library(asset_dir, base_dir)
115
117
  # Confined to the library it was found in: the name is joined onto a
116
118
  # directory, so the containment check is what makes a name a name
@@ -67,11 +67,6 @@ LOSSY_AUDIO_CONTENT_TYPES = {
67
67
  # The only container encode_video writes - it always encodes h264 video
68
68
  MUXED_VIDEO_CONTENT_TYPE = "video/mp4"
69
69
 
70
- # Reference prefixes substitution resolves before this pass runs. One still
71
- # spelled out here is one nothing resolved, and that is the undeclared-
72
- # variable pass's complaint rather than a shape error
73
- _UNRESOLVED_PREFIXES = references.SUBSTITUTED
74
-
75
70
  # Result types a browser would run as a document on the UI origin
76
71
  REFUSED_ACTIVE_CONTENT_TYPES = frozenset({"text/html", "text/xml"})
77
72
 
@@ -143,7 +138,9 @@ def content_type_errors(workflow_definition, source_indices=None):
143
138
  if not isinstance(result, dict) or CONTENT_TYPE_KEY not in result:
144
139
  continue
145
140
  value = result[CONTENT_TYPE_KEY]
146
- if isinstance(value, str) and value.startswith(_UNRESOLVED_PREFIXES):
141
+ # A prefix substitution resolves before this pass: one still spelled
142
+ # out is the undeclared-variable pass's complaint, not a shape error
143
+ if references.is_ref(references.SUBSTITUTED, value):
147
144
  continue
148
145
  source = references.author_index(source_indices, index)
149
146
  name = step.get("name")
@@ -0,0 +1,150 @@
1
+ # Architecture: the seam map
2
+
3
+ This map says where each concept lives. Each row names a concept, the module that owns it, the
4
+ rule that holds across the seam (in one sentence), and what enforces that rule. The detail is in
5
+ the owning module's docstring. Read the docstring before editing; the map only tells you which
6
+ one to open.
7
+
8
+ - **Owner**: repo-relative paths. Function, class or constant names follow the path after a colon
9
+ (`dw/runs.py`: `run_versions`).
10
+ - **Enforced by**: one of four kinds.
11
+ - A test, written as a file, or as `file::Class::test_name`.
12
+ - A ratchet, named by its key in `docs/stabilization/baseline.json`.
13
+ - The CodeQL pack.
14
+ - The validation registry.
15
+
16
+ A `—` means nothing mechanical holds the rule, so a change there is caught only in review.
17
+ - `tests/test_architecture_map.py` checks three things: every path named here exists, every name
18
+ after a path is defined in that file, and every test named here is defined in its class.
19
+
20
+ ## Engine core
21
+
22
+ | Concept | Owner | Rule | Enforced by |
23
+ | --- | --- | --- | --- |
24
+ | Workflow | `dw/workflow.py`: `Workflow`, `workflow_from_file` | A workflow is loaded and schema-checked here (the hand-off of each run phase to `dw/workflow_run.py`: —). | `tests/test_workflow.py::test_workflow_validation_invalid` |
25
+ | One execution, in phases | `dw/workflow_run.py`: `prepare_definition`, `cache_lookup`, `cache_hits` | The cache probe shares `prepare_definition` and `cache_lookup` with the run, so the probe answers for the run that would happen. | `tests/test_workflow_step_cache.py::TestCacheHits::test_after_a_run_the_probe_names_what_the_next_run_reuses` |
26
+ | Step | `dw/step.py`: `Step`, `dw/workflow.py`: `Workflow.create_step_action` | A step is a pipeline, a task or a sub-workflow, `create_step_action` builds its action, and `dw/workflow_run.py` runs it. | — |
27
+ | Pipeline loading | `dw/pipeline_processors/pipeline.py`: `Pipeline`, `dw/pipeline_processors/components.py`: `load_component` | A quantization config is built from a `config_type` that the `_type` key convention loads by name, so a new backend needs no code. | `tests/test_config_objects.py::TestQuantizationConfiguration::test_the_config_type_is_constructed_with_its_arguments` |
28
+ | Device translation | `dw/pipeline_processors/placement.py`: `place_component` | A device is translated by `resolve_device()` before anything reads its backend, so the MPS accommodations also fire for a translated device. | `tests/test_device_portability.py::TestPlacement::test_a_translated_device_gets_its_backends_offload_downgrade` |
29
+ | On-demand wrappers | `dw/pipeline_processors/placement.py`: `apply_on_demand_placement` | The on-demand wrappers keep the wrapped signature, because H3's denoiser reads `signature(transformer.forward)`. | `tests/test_modular_pipeline.py::TestOnDemandResidency::test_the_wrapped_signature_survives` |
30
+ | On-demand and offload | `dw/pipeline_processors/placement.py`: `place_component`, `has_component_group_offload` | On-demand residency and `group_offload` cannot both be set on one component, and either one stops the whole pipeline from being moved to the device. | `tests/test_modular_pipeline.py::TestOnDemandResidency::test_group_offload_and_on_demand_together_are_rejected`, `tests/test_modular_pipeline.py::TestOffloadDevice::test_component_group_offload_is_not_moved_to_device` |
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
+ | 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
+ | Adding a task | `dw/tasks/task.py`: `register_command` | A task is a function registered with `@register_command`, and the signature of its implementation is its argument schema. | `tests/test_task_discovery.py::TestDescribeTask::test_signature_becomes_the_schema` |
34
+ | Task argument domains | `dw/task_domains.py`: `check_arguments` | A numeric domain that a signature cannot express is declared in this table, and it is checked at validation and again at run time. | `tests/test_task_domains.py::TestTheStaticPass::test_a_negative_frame_count_is_refused_at_its_path`, `tests/test_task_domains.py::TestAtRunTime::test_slice_audio_refuses_a_negative_count` |
35
+ | 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` |
36
+ | 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` |
37
+ | `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` |
38
+ | 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` |
39
+ | 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` |
40
+ | 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` |
41
+
42
+ ## References and libraries
43
+
44
+ | Concept | Owner | Rule | Enforced by |
45
+ | --- | --- | --- | --- |
46
+ | Reference prefixes | `dw/references.py` | Every reference prefix is spelled only in this module, and every other module goes through it. | `docs/stabilization/baseline.json`: `prefix_literals`, `prefix_handling`; `tests/test_references.py::test_references_imports_nothing_from_dw` |
47
+ | Explicit references resolve first | `dw/arguments.py`: `_realize_explicit_reference` | `asset:`, `output:`, `constant:` and `prompt:` resolve in `realize_args` before any key-name convention. | — |
48
+ | Reference confinement | `dw/assets.py`: `resolve_asset_reference`, `dw/runs.py`: `resolve_output_reference`, `dw/library.py`: `LibraryPath`, `dw/security.py`: `validate_asset_reference`, `validate_output_reference` | `dw/security.py` validators confine an `asset:` path to its library and an `output:` path to the output root. | `tests/test_assets.py::TestReferences::test_a_symlink_out_of_the_library_is_refused`, `tests/test_security_symlinks.py::TestOutputs::test_an_output_reference_does_not_follow_a_linked_run_directory` |
49
+ | Reference name shape | `dw/reference_names.py`: `reference_name_errors` | The shape of every `asset:`, `prompt:` and `output:` name is checked before the queue, and existence is checked later. | `tests/test_reference_names.py::TestTheValidationPass::test_a_malformed_reference_is_refused_before_the_queue` |
50
+ | Library reads | `dw/library.py`: `LibraryPath` | Reads go through the roots front to back, so an earlier name shadows a later one. | `tests/test_library_path.py::TestResolution::test_the_front_of_the_path_shadows_the_rest` |
51
+ | Library writes | `dw/library.py`: `LibraryPath` | Writes go only to the front root, so saving something opened from a read-only root writes a copy. | `tests/test_library_path.py::TestConstruction::test_the_writable_root_comes_first`, `tests/test_library_sources.py::TestServer::test_saving_an_example_prompt_writes_a_copy` |
52
+ | Packaged builtins | `dw/library.py`: `builtin_root`, `resolve_sub_workflow_reference` | `builtin:` names the packaged `dw/workflows/`, not the top-level `workflows/` examples. | `tests/test_sub_workflow_resolver.py::TestTheResolver::test_a_builtin_resolves_in_the_packaged_root` |
53
+ | Sub-workflow paths | `dw/library.py`: `resolve_sub_workflow_reference`, `resolve_sub_workflow` | A sub-workflow path is confined to the root it resolves in. The search order is in the docstring of `resolve_sub_workflow`. | `tests/test_sub_workflow_resolver.py::TestTheResolver::test_a_path_escaping_its_root_is_refused` |
54
+ | Workspace | `dw/workspace.py`: `resolve_workspace`, `set_workspace` | `--workspace` beats `DW_WORKSPACE`, which beats the setting, which beats a working directory that looks like a workspace, which beats `~/diffusers-workspace`. | `tests/test_workspace.py::TestResolution::test_a_flag_wins_over_everything`, `tests/test_workspace.py::TestResolution::test_a_bare_working_directory_falls_back_to_the_home_workspace` |
55
+ | Realized workflow | `dw/realize.py`: `realize_workflow`, `dw/runs.py`: `write_realized_workflow` | Each run directory holds `workflow.json`, with the run's arguments, seed and stored prompt text pinned. | `tests/test_realize.py::TestVariablesAndSeed::test_arguments_become_the_variable_defaults`, `tests/test_runs.py::TestRealizedWorkflow::test_the_run_directory_holds_a_realized_copy` |
56
+
57
+ ## Runs and outputs
58
+
59
+ | Concept | Owner | Rule | Enforced by |
60
+ | --- | --- | --- | --- |
61
+ | Run directories | `dw/runs.py`: `open_run`, `workflow_identity`, `new_run_id` | Each execution writes into `<output_dir>/<identity>/<run id>/` with a `manifest.json`, unless the flat layout is chosen (the test pins the flat-layout exception). | `tests/test_runs.py::TestRunDirectories::test_the_flat_layout_writes_where_it_always_did` |
62
+ | Run versions | `dw/runs.py`: `open_run`, `run_versions`, `record_run_versions` | A run takes its number once, when it opens, so deleting a middle run leaves a gap rather than renumbering. | `tests/test_runs.py::TestRunVersions::test_a_deleted_middle_run_leaves_a_gap_rather_than_renumbering`, `tests/test_runs.py::TestRunVersions::test_runs_started_in_the_same_second_still_number_upward` |
63
+ | Run-version surfaces | `dw/runs.py`: `run_versions`, `dw/server/routes/gallery.py`, `dw/server/outputs.py`, `dw_mcp/tools_catalog.py`: `list_gallery`, `ui/src/lib/pages/GalleryPage.svelte` | Only `dw/runs.py` computes the number, and every other module reads it back. | `tests/test_runs.py::TestRunVersions::test_an_output_reference_can_name_a_run_by_its_version` |
64
+ | Result subfolders | `dw/subfolders.py`: `subfolder_errors`, `dw/security.py`: `SUBFOLDER_PATTERN` | A step's `result.subfolder` is checked for shape at validation. | `tests/test_subfolders.py::TestValidationErrorsIntegration::test_validation_errors_reports_a_bad_subfolder` |
65
+ | Template subfolder roles | `workflows/templates/`, `dw/workflows/` | Every saving step of a template is marked `final` or `intermediate`, with at least one `final`, and packaged builtins stay unmarked. | `tests/test_template_subfolders.py::test_every_saving_step_of_a_template_names_its_role`, `tests/test_template_subfolders.py::test_the_packaged_builtins_stay_unmarked` |
66
+ | Shots in a joined video | `dw/shots.py` | Every `AudioVideo` constructor decides what to do with `shots`, and the sample spans are measured from the joined waveform. | `tests/test_shots.py::test_every_audio_video_constructor_site_is_decided`, `tests/test_shots.py::TestConcatVideosShots::test_an_overrun_track_is_measured_not_derived` |
67
+ | 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. | `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::TestTheWrittenLevel::test_a_file_that_decodes_above_full_scale_warns` |
68
+ | 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. | — |
69
+
70
+ ## Validation, plan and cost
71
+
72
+ | Concept | Owner | Rule | Enforced by |
73
+ | --- | --- | --- | --- |
74
+ | Validation registry | `dw/validation.py`: `ERROR_CHECKS`, `WARNING_CHECKS`, `run_checks` | A check is one `Check` in a registry, and a check that raises becomes one `internal` finding while the rest still run. | `tests/test_validation.py::TestExceptionPolicy::test_a_raising_check_is_one_internal_error_and_the_rest_still_run` |
75
+ | Step-value checks | `dw/step_value_checks.py`: `fps_errors`, `null_media_errors`, `select_errors` | The only caller of these checks is the error registry. | `dw/validation.py`: `ERROR_CHECKS` |
76
+ | Admission | `dw/server/admission.py`: `admit` | Validate, submit, rerun and enhance load and check a request once, and `JobManager.submit` does not check it again. | `tests/test_admission.py::test_a_submit_expands_once` |
77
+ | Variable constraints | `dw/variable_constraints.py`: `apply_constraints` | A model's rule about a value is declared in the workflow's `variable_constraints`, and it is checked at validation and again before anything loads. | `tests/test_variable_constraints.py::TestTheGrid::test_without_snap_an_off_grid_value_is_refused_not_rounded`, `tests/test_variable_constraints.py::TestTheRunTimePass::test_an_illegal_value_is_refused_before_anything_loads` |
78
+ | Bound acknowledgement | `dw/plan.py`: `fingerprint`, `dw/server/admission.py`: `check_bound_acknowledgement` | A bound `acknowledged_cost` is refused with 409 when the plan's fingerprint or its required downloads changed. | `tests/test_server.py::TestBoundRerun::test_a_rerun_bound_to_a_stale_plan_is_refused`, `tests/test_server.py::TestBoundAcknowledgement::test_a_matching_fingerprint_queues` |
79
+ | Per-repo gating | `dw/plan.py`: `build_plan` | Each gated repo, including a `loras` entry's repo, is probed and reported on its own. | `tests/test_plan.py::TestDownloadsRequired::test_a_gated_repo_this_token_lacks_access_to_is_blocked` |
80
+ | Observed cost | `dw/server/observed_cost.py`: `declared_drivers` | `observed` comes only from this box's finished jobs and never writes `cost`. Cold and warm runs are reported separately. | `tests/test_observed_cost.py::TestColdIsNotWarm::test_the_two_are_reported_separately_each_with_its_runs` |
81
+ | The estimate | `dw/plan.py`: `estimate`, `_tempered` | `plan.estimate` quotes the observed figure ahead of the curated one, and blends it toward the curated figure below three runs. | `tests/test_plan.py::TestObservedEstimate::test_history_beats_a_curated_figure`, `tests/test_plan.py::TestLowConfidenceObservedEstimate::test_a_single_run_blends_toward_the_curated_figure` |
82
+ | Cost drivers | `dw/server/observed_cost.py`: `declared_drivers` | A cost driver that names no declared variable is dropped. | `tests/test_observed_cost.py::TestComparability::test_a_driver_naming_no_variable_is_dropped`, `tests/test_observed_cost.py::TestTheCatalogsDriversAreReal::test_every_declared_driver_is_a_variable_of_its_workflow` |
83
+ | 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. | — |
84
+ | VRAM projection | `dw/vram_estimate.py` | A template's `vram_estimate` is projected per step after `for_each` expansion, and only the largest step over the ceiling is reported. | `tests/test_vram_estimate.py::test_only_the_largest_over_ceiling_step_is_reported_once_per_cost_entry` |
85
+ | 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` |
86
+ | 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` |
87
+ | 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` |
88
+ | 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` |
89
+ | 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` |
90
+ | 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` |
91
+
92
+ ## Execution and caching
93
+
94
+ | Concept | Owner | Rule | Enforced by |
95
+ | --- | --- | --- | --- |
96
+ | Step cache | `dw/step_cache.py`, `dw/workflow_run.py`: `cache_lookup` | A seeded rerun with unchanged inputs is served from the cache, marked `reused: true`, and writes nothing; `POST /api/memory/clear` (`dw/server/routes/system.py`: `clear_memory`) drops it. | `tests/test_workflow_step_cache.py::test_cache_hit_marks_its_manifest_entry_and_event_reused`, `tests/test_workflow_step_cache.py::test_second_run_with_unchanged_step_reuses_cached_result` |
97
+ | No seed, no cache | `dw/workflow_run.py`: `prepare_run` | A workflow that sets no `seed` skips the cache. | `tests/test_workflow_step_cache.py::TestCacheHits::test_an_unseeded_workflow_has_no_hits` |
98
+ | A different result | `dw/server/routes/jobs.py`, `dw_mcp/tools_jobs.py`: `rerun_job` | `rerun` with `new_seed` draws a fresh seed into the workflow's seed variable. | `tests/test_rerun_new_seed.py::test_a_rerun_with_a_new_seed_draws_one_into_that_variable` |
99
+ | Worker protocol | `dw/worker_protocol.py`: `parse_reply` | Every command and reply is a frozen dataclass that travels as a wire dict. | `tests/test_worker_messages.py::test_from_wire_inverts_to_wire`, `tests/test_worker_messages.py::test_an_unknown_reply_type_is_kept_whole_rather_than_raised` |
100
+ | Persistent worker | `dw/worker.py`, `dw/worker_manager.py`, `dw/serve.py` | Jobs run in one spawned worker that keeps models loaded, so a change to engine code needs a server restart. | — |
101
+ | Failed-run reporting | `dw/worker.py`, `dw/worker_protocol.py`: `Failed`, `Cancelled` | A failed or cancelled run's reply still carries the manifest of the steps that ran. | `tests/test_worker_execute.py::test_failure_carries_the_manifest_of_the_steps_that_ran`, `tests/test_worker_execute.py::test_cancellation_carries_the_manifest_too` |
102
+ | Run-time warnings | `dw/events.py`: `emit_warning` | A warning found at run time is emitted as an event, so it reaches the caller and not just the log. | `tests/test_concat_videos.py::TestWarningsReachTheCaller::test_the_level_spread_warning_is_emitted_as_an_event` |
103
+
104
+ ## Media and DSP
105
+
106
+ | Concept | Owner | Rule | Enforced by |
107
+ | --- | --- | --- | --- |
108
+ | 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: —) |
109
+ | 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` |
110
+ | 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` |
111
+
112
+ ## Security and architecture guardrails
113
+
114
+ | Concept | Owner | Rule | Enforced by |
115
+ | --- | --- | --- | --- |
116
+ | Path validators | `dw/security.py`: `validate_path`, `validate_workflow_path`, `validate_output_path` | Filesystem access goes through a path validator that is given a base directory. | `tests/test_security.py::test_path_validation`, `.github/codeql/dw-security/DwPathInjection.ql` |
117
+ | URL and argument validators | `dw/security.py`: `validate_url`, `sanitize_command_args` | A URL must be http or https, and a subprocess argument must not carry a shell metacharacter. | `tests/test_security.py::TestValidateUrl::test_dangerous_schemes_are_rejected`, `tests/test_security.py::TestSanitizeCommandArgs::test_every_shell_metacharacter_is_rejected` |
118
+ | Locations from a workflow | `dw/locations.py` | A local path in a workflow's media arguments is confined to a known root, and a URL must not name a host inside the deployment. | `tests/test_locations.py::TestMediaPathContainment::test_absolute_path_outside_every_root_is_refused`, `tests/test_security_ssrf.py::TestInternalAddressSpellings::test_a_name_that_resolves_inside` |
119
+ | 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` |
120
+ | 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` |
121
+ | 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` |
122
+ | 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) |
123
+ | 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` |
124
+
125
+ ## Server
126
+
127
+ | Concept | Owner | Rule | Enforced by |
128
+ | --- | --- | --- | --- |
129
+ | App factory | `dw/server/app.py`: `create_app` | `create_app` builds the JobManager and `app.state`, installs the middleware and registers the routes, and all state lives in the JobManager. | — |
130
+ | Routers | `dw/server/routes/*.py`, `dw/server/routes/__init__.py`: `ROUTERS`, `include_routers`, `include_file_routes` | Routers register in `ROUTERS` order, because a greedy `{name:path}` route must come after its specific siblings. The files router comes later, after `/mcp`. | `tests/test_server_downloads.py::test_download_workflow_sets_content_disposition_attachment` |
131
+ | Job queue | `dw/server/jobs.py`: `JobManager` | One runner thread runs jobs FIFO on the single worker. A job carries its own `output_dir`, `asset_dir` and `workflow_dir`, so it stays in its workspace. | `tests/test_server_workspaces.py::TestRunning::test_rerun_stays_in_the_workspace_it_ran_in` (FIFO: —) |
132
+ | Job-to-run link | `dw/server/job_record.py`, `dw/server/jobs.py`: `JobManager.realized` | A job records `run_id`, `run_dir` and `run_version`, and `JobManager.realized` reads that run's `workflow.json`, confined to the output root. | `tests/test_server_jobs.py::test_realized_reads_the_file_the_run_wrote`, `tests/test_server_jobs.py::test_realized_refuses_a_run_dir_that_escapes_the_output_root` |
133
+ | Job history | `dw/server/job_history.py`: `JobHistory` | Finished jobs persist in `jobs.sqlite`, in WAL mode, so the Jobs view survives a restart. | `tests/test_server.py::test_job_history_survives_restart_and_reruns`, `tests/test_job_history_wal.py::test_the_jobs_database_uses_wal_mode` |
134
+ | HTTP security | `dw/server/http_security.py`: `install_middleware`, `query_token_ok` | Every API route needs the token, and only a route marked `query_token_ok` takes it as `?token=`. | `tests/test_security_auth.py::TestTheTokenGate::test_every_api_spelling_needs_the_token`, `tests/test_security_auth.py::TestTheTokenGate::test_the_query_token_is_refused_where_it_is_not_allowed` |
135
+
136
+ ## MCP
137
+
138
+ | Concept | Owner | Rule | Enforced by |
139
+ | --- | --- | --- | --- |
140
+ | `dw_mcp` stays torch-free | `dw_mcp/` | `dw_mcp` reaches `dw.serve` over HTTP and imports no `dw` module, because `dw/__init__.py` pulls in torch. | `tests/test_mcp_server.py::TestStartupWeight::test_the_server_starts_without_importing_the_engine` |
141
+ | Tool surface | `dw_mcp/server.py`, `dw_mcp/tools_*.py` | Only these modules import the MCP SDK, and each tool body is a one-line call into a handler. | `tests/test_mcp_server.py::test_the_wiring_table_covers_every_registered_tool`, `tests/test_mcp_server.py::test_the_stated_tool_count_is_the_registered_one` |
142
+ | Surface text budget | the tool docstrings in `dw_mcp/tools_*.py`, the instructions in `dw_mcp/server.py` | The instructions and each tool description stay at or under 2,048 characters, and the whole surface stays within its token budget. | `tests/test_mcp_server.py`: `SURFACE_BUDGET`, `CLIENT_TEXT_LIMIT`; `tests/test_mcp_server.py::test_no_text_the_agent_reads_is_cut_off_by_the_client`, `tests/test_mcp_server.py::test_the_tool_surface_fits_the_budget` |
143
+ | Spending needs consent | `dw_mcp/diagnose.py` | `run_workflow` and `rerun_job` refuse until `acknowledged_cost` is set. | `tests/test_mcp_diagnose.py::test_run_refuses_without_an_acknowledged_cost`, `tests/test_mcp_diagnose.py::test_rerun_refuses_without_an_acknowledged_cost` |
144
+ | API errors | `dw_mcp/client.py` | An API failure becomes a message a person can act on, here and nowhere else. | `tests/test_mcp_client.py::test_a_400_surfaces_the_servers_detail_verbatim` |
145
+
146
+ ## UI
147
+
148
+ | Concept | Owner | Rule | Enforced by |
149
+ | --- | --- | --- | --- |
150
+ | The UI reads engine fields | `ui/src/lib/plan.ts`: `describePlan`, `ui/src/lib/results.ts`: `sectionBySubfolder` | The UI reads `plan`, `version` and `subfolder` as fields the server sends and derives nothing of its own, and it never sends `acknowledged_cost`. | `ui/src/lib/plan.test.ts`, `ui/src/lib/results.test.ts` |
@@ -7,6 +7,24 @@ notes from commits at tag time (see below). This section is a scratch pad
7
7
  for items a branch's author wants the next release note to name; clear it
8
8
  when a release ships.
9
9
 
10
+ ### 0.7.0
11
+
12
+ - A sub-workflow path is resolved by one function (`library.resolve_sub_workflow_reference`) at every site, so a path a run can open is one validation, the realized workflow's digest and the observed-cost lookup can open too.
13
+ - `builtin:builtin:x.json` no longer loads `x.json`: only the leading prefix is stripped, so the name `builtin:x.json` is looked up and reported as `SubWorkflowNotFound`.
14
+ - At run time a missing `builtin:` workflow now raises `SubWorkflowNotFound` (naming the packaged root) instead of `validate_workflow_path`'s missing-file error.
15
+ - The realized workflow's sub-workflow digest and a composed child's observed cost now fall back to the same catalog root, so a catalog sub-workflow a run could open is also digested and costed.
16
+ - A run that fails before it opens its run directory no longer rewrites the previous run's `manifest.json` when the same workflow instance is reused: `Workflow.run` resets the directory and version it carried.
17
+ - The per-variant lines of a kernels "Cannot find a build variant" error are sorted by dw (`kernel_availability.stable_message`), so the message no longer varies by process.
18
+ - The `argument_template` schema description now says what the code does: handed arguments are held on the child at run time, never written into the definition, and an authored value is the fallback.
19
+ - `gain_audio` rounds a frame-addressed region's end once, as `slice_audio` does, so a region's end can no longer be one sample off the matching slice's.
20
+ - `concat_videos` refuses a track with no sample rate (`concat_videos: '<name>' has audio with no sample rate`) instead of joining it unresampled at the wrong speed and pitch; `dissolve_videos` gives the same message in place of the resample error. Save that step with `audio_sample_rate` in its result and join the saved file through an `output:` reference. An unpinned `dissolve_videos` with such a track now raises this `ValueError` rather than a `TypeError`.
21
+ - For developers (Python paths only; nothing on the API or MCP reaches them):
22
+ - `Workflow`'s one-line check methods are gone: `validation_context`, `sub_workflow_warnings`, `adapter_warnings`, `inherited_vram_warnings`, `slice_past_end_warnings`, `shot_span_warnings`, `null_variable_argument_warnings` and `cache_hits`. Call `validation.workflow_context(workflow, ...)`, `validation.run_warning_check(workflow, "<name>", ...)` and `workflow_run.cache_hits(workflow, arguments)`.
23
+ - Reference prefixes (`variable:`, `asset:`, `output:`, ...) are read and built only through `dw.references`; a hand-written prefix check elsewhere fails the `prefix_handling` ratchet.
24
+ - `scripts/arch_metrics.py --check docs/stabilization/baseline.json` runs in CI and `scripts/preflight.sh`, so a PR that raises any architecture metric goes red. The module-size metric is `modules_over_size_ceiling` (fail over 1,100 lines, warn over 1,000), renamed from `modules_over_1000_lines`.
25
+ - Agent context: CLAUDE.md files went from 957 to 129 lines; `docs/ARCHITECTURE.md` is the seam map (concept, owning module, rule, enforced-by).
26
+ - The stabilization freeze is lifted (`stabilization-gate-4`).
27
+
10
28
  ### 0.6.0
11
29
 
12
30
  <!-- Drafted by the release agent, model claude-opus-5-5 via the anthropic provider, from v0.5.0..54f8a3c9 (stabilization/gate-3). -->
@@ -207,7 +207,7 @@ def overriding_variables(written, substituted_steps):
207
207
 
208
208
  def _reads_variable(tree, name):
209
209
  """Whether anything in `tree` references 'variable:<name>'."""
210
- reference = references.VARIABLE + name
210
+ reference = references.make_ref(references.VARIABLE, name)
211
211
  if isinstance(tree, str):
212
212
  return tree == reference
213
213
  if isinstance(tree, dict):
@@ -200,8 +200,9 @@ def _rewrite(value, path, groups, member):
200
200
  return _item(value, path, member)
201
201
  if references.is_ref(references.PREVIOUS_RESULT, value):
202
202
  reference = references.ref_name(references.PREVIOUS_RESULT, value)
203
- return references.PREVIOUS_RESULT + _rewrite_reference(
204
- reference, path, groups, member
203
+ return references.make_ref(
204
+ references.PREVIOUS_RESULT,
205
+ _rewrite_reference(reference, path, groups, member),
205
206
  )
206
207
  return value
207
208
  # A leaf is only copied where the copy is needed: inside a member, where
@@ -260,7 +261,7 @@ def _gather(value, path, groups):
260
261
  f"for_each steps available here: {sorted(groups)}",
261
262
  )
262
263
  return [
263
- references.PREVIOUS_RESULT + member_name(group, key)
264
+ references.make_ref(references.PREVIOUS_RESULT, member_name(group, key))
264
265
  for key in groups[group]["keys"]
265
266
  ]
266
267
 
@@ -289,7 +290,8 @@ def _rewrite_reference(reference, path, groups, member):
289
290
  raise ForEachError(
290
291
  render_path(path),
291
292
  f"'{reference}' names the for_each step '{group}' {where}. Use "
292
- f"'{references.GATHER}{group}' for every member's result, or a reference "
293
+ f"'{references.make_ref(references.GATHER, group)}' for every member's "
294
+ f"result, or a reference "
293
295
  f"from a for_each step over the same list for the same-keyed member",
294
296
  )
295
297
 
@@ -33,7 +33,6 @@ from .for_each import MEMBER_SEPARATOR, render_path
33
33
  from .type_helpers import load_type_from_name
34
34
 
35
35
  ATTN_PROCESSOR_KEY = "attn_processor_type"
36
- _UNRESOLVED_PREFIXES = references.SUBSTITUTED
37
36
  KERNEL_FAULT_MARKER = "cannot be used on this machine"
38
37
 
39
38
 
@@ -91,6 +90,21 @@ def _requires_remote_kernel(attn_processor_class):
91
90
  return "get_kernel(" in source
92
91
 
93
92
 
93
+ def stable_message(message):
94
+ """Sorts the per-variant lines of a kernels-hub "Cannot find a build
95
+ variant" error, which the hub library lists in set order (different on
96
+ every process). The lines are sorted in place, so their position against
97
+ the rest of the message still counts; any other message passes through
98
+ untouched."""
99
+ if "Cannot find a build variant" not in message:
100
+ return message
101
+ lines = message.split("\n")
102
+ slots = [i for i, line in enumerate(lines) if line.startswith("torch")]
103
+ for i, line in zip(slots, sorted(lines[i] for i in slots)):
104
+ lines[i] = line
105
+ return "\n".join(lines)
106
+
107
+
94
108
  class _KernelFault(Exception):
95
109
  """Carries a fault message out of `_fault_for_name` without letting
96
110
  `lru_cache` memoize it - see that function's docstring."""
@@ -123,7 +137,9 @@ def _fault_for_name(value):
123
137
  try:
124
138
  attn_processor_class()
125
139
  except Exception as e:
126
- raise _KernelFault(f"'{value}' {KERNEL_FAULT_MARKER}: {e}") from e
140
+ raise _KernelFault(
141
+ f"'{value}' {KERNEL_FAULT_MARKER}: {stable_message(str(e))}"
142
+ ) from e
127
143
  return None
128
144
 
129
145
 
@@ -142,7 +158,7 @@ def kernel_availability_fault(value):
142
158
  A fault is not memoized, and so is re-probed on every call - see
143
159
  `_fault_for_name`.
144
160
  """
145
- if not isinstance(value, str) or value.startswith(_UNRESOLVED_PREFIXES):
161
+ if not isinstance(value, str) or references.is_ref(references.SUBSTITUTED, value):
146
162
  return None
147
163
  try:
148
164
  return _fault_for_name(value)