diffusers-workflow 0.4.0a8__tar.gz → 0.4.0a10__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 (267) hide show
  1. {diffusers_workflow-0.4.0a8/diffusers_workflow.egg-info → diffusers_workflow-0.4.0a10}/PKG-INFO +7 -1
  2. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/README.md +2 -0
  3. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10/diffusers_workflow.egg-info}/PKG-INFO +7 -1
  4. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/SOURCES.txt +44 -21
  5. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/entry_points.txt +1 -0
  6. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/requires.txt +5 -0
  7. diffusers_workflow-0.4.0a10/diffusers_workflow.egg-info/top_level.txt +2 -0
  8. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/__init__.py +75 -0
  9. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/events.py +17 -0
  10. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/hub_cache.py +5 -2
  11. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/introspection.py +76 -15
  12. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/chain.py +5 -0
  13. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/config_objects.py +4 -2
  14. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/pipeline.py +75 -11
  15. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/previous_results.py +13 -8
  16. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/result.py +20 -2
  17. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/run.py +5 -1
  18. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/security.py +6 -4
  19. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/app.py +144 -18
  20. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/jobs.py +53 -4
  21. diffusers_workflow-0.4.0a8/dw/server/ui/assets/cssMode-4JQhrTTm.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/cssMode-DBf-T_da.js +1 -1
  22. diffusers_workflow-0.4.0a8/dw/server/ui/assets/editor.api-B_68laXH.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/editor.api-B0D5Ygq7.js +1 -1
  23. diffusers_workflow-0.4.0a8/dw/server/ui/assets/freemarker2-C4IxK8gs.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/freemarker2-Br8g4G1T.js +1 -1
  24. diffusers_workflow-0.4.0a8/dw/server/ui/assets/handlebars-BArDGhF4.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/handlebars-BKo1TaOF.js +1 -1
  25. diffusers_workflow-0.4.0a8/dw/server/ui/assets/html-8yKFx0-x.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/html-Bis1seyM.js +1 -1
  26. diffusers_workflow-0.4.0a8/dw/server/ui/assets/htmlMode-BwXG6XFP.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/htmlMode-D2SOD2MF.js +1 -1
  27. diffusers_workflow-0.4.0a10/dw/server/ui/assets/index-D7eWnTCB.css +1 -0
  28. diffusers_workflow-0.4.0a10/dw/server/ui/assets/index-JyFxgIR9.js +20 -0
  29. diffusers_workflow-0.4.0a8/dw/server/ui/assets/javascript-B3mqpFQQ.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/javascript-CkEbVb78.js +1 -1
  30. diffusers_workflow-0.4.0a8/dw/server/ui/assets/jsonMode-C1m5Z8Ha.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/jsonMode-dVJbYwxg.js +1 -1
  31. diffusers_workflow-0.4.0a8/dw/server/ui/assets/liquid-Cs5oVPJ1.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/liquid-Btak-6uF.js +1 -1
  32. diffusers_workflow-0.4.0a8/dw/server/ui/assets/lspLanguageFeatures-CnroSKaf.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/lspLanguageFeatures-BfeZZQbb.js +1 -1
  33. diffusers_workflow-0.4.0a8/dw/server/ui/assets/mdx-BGAIyUWE.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/mdx-D9KXK7-s.js +1 -1
  34. diffusers_workflow-0.4.0a8/dw/server/ui/assets/monaco-ab9gu2Wi.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/monaco-ZMCk_MWf.js +4 -4
  35. diffusers_workflow-0.4.0a8/dw/server/ui/assets/python-XsfASqaE.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/python-0FnO4xGM.js +1 -1
  36. diffusers_workflow-0.4.0a8/dw/server/ui/assets/razor-C-1xVmcy.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/razor-B6PMzeY4.js +1 -1
  37. diffusers_workflow-0.4.0a8/dw/server/ui/assets/tsMode-BDa9GeVq.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/tsMode-nxyvZH1t.js +1 -1
  38. diffusers_workflow-0.4.0a8/dw/server/ui/assets/typescript-VE9GZNZf.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/typescript-BhBe8aGf.js +1 -1
  39. diffusers_workflow-0.4.0a8/dw/server/ui/assets/workers-C_2pIPh_.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/workers-ChAf-t8A.js +1 -1
  40. diffusers_workflow-0.4.0a8/dw/server/ui/assets/xml-BJp06vju.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/xml-z2r9dHSO.js +1 -1
  41. diffusers_workflow-0.4.0a8/dw/server/ui/assets/yaml-EI9SS79i.js → diffusers_workflow-0.4.0a10/dw/server/ui/assets/yaml-DrcHrz7f.js +1 -1
  42. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/index.html +2 -2
  43. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/step.py +41 -0
  44. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/task.py +7 -2
  45. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/text_generation.py +15 -2
  46. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/workflow.py +7 -0
  47. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/workflow_schema.json +2 -2
  48. diffusers_workflow-0.4.0a10/dw_mcp/__init__.py +6 -0
  49. diffusers_workflow-0.4.0a10/dw_mcp/__main__.py +39 -0
  50. diffusers_workflow-0.4.0a10/dw_mcp/authoring.py +37 -0
  51. diffusers_workflow-0.4.0a10/dw_mcp/catalog.py +83 -0
  52. diffusers_workflow-0.4.0a10/dw_mcp/client.py +201 -0
  53. diffusers_workflow-0.4.0a10/dw_mcp/diagnose.py +89 -0
  54. diffusers_workflow-0.4.0a10/dw_mcp/media.py +133 -0
  55. diffusers_workflow-0.4.0a10/dw_mcp/models.py +97 -0
  56. diffusers_workflow-0.4.0a10/dw_mcp/prompts.py +91 -0
  57. diffusers_workflow-0.4.0a10/dw_mcp/server.py +392 -0
  58. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/pyproject.toml +4 -1
  59. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_arguments.py +3 -2
  60. diffusers_workflow-0.4.0a10/tests/test_cli.py +181 -0
  61. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_config_objects.py +10 -2
  62. diffusers_workflow-0.4.0a10/tests/test_device.py +150 -0
  63. diffusers_workflow-0.4.0a10/tests/test_device_portability.py +116 -0
  64. diffusers_workflow-0.4.0a10/tests/test_mcp_authoring.py +156 -0
  65. diffusers_workflow-0.4.0a10/tests/test_mcp_catalog.py +118 -0
  66. diffusers_workflow-0.4.0a10/tests/test_mcp_client.py +370 -0
  67. diffusers_workflow-0.4.0a10/tests/test_mcp_diagnose.py +252 -0
  68. diffusers_workflow-0.4.0a10/tests/test_mcp_media.py +377 -0
  69. diffusers_workflow-0.4.0a10/tests/test_mcp_models.py +187 -0
  70. diffusers_workflow-0.4.0a10/tests/test_mcp_prompts.py +267 -0
  71. diffusers_workflow-0.4.0a10/tests/test_mcp_server.py +727 -0
  72. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_modular_pipeline.py +9 -2
  73. diffusers_workflow-0.4.0a10/tests/test_offload_placement.py +105 -0
  74. diffusers_workflow-0.4.0a10/tests/test_phase_events.py +227 -0
  75. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_pipeline_components.py +33 -1
  76. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_previous_results.py +48 -0
  77. diffusers_workflow-0.4.0a10/tests/test_repl_worker.py +77 -0
  78. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_result.py +35 -0
  79. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_security.py +17 -0
  80. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_server.py +645 -1
  81. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_step.py +82 -0
  82. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_task.py +1 -1
  83. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_task_discovery.py +43 -0
  84. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_text_generation.py +38 -0
  85. diffusers_workflow-0.4.0a8/diffusers_workflow.egg-info/top_level.txt +0 -1
  86. diffusers_workflow-0.4.0a8/dw/server/ui/assets/index-BY3Mtj4M.js +0 -17
  87. diffusers_workflow-0.4.0a8/dw/server/ui/assets/index-Bug26k2P.css +0 -1
  88. diffusers_workflow-0.4.0a8/tests/test_device.py +0 -59
  89. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/LICENSE +0 -0
  90. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/MANIFEST.in +0 -0
  91. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/diffusers_workflow.egg-info/dependency_links.txt +0 -0
  92. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/arguments.py +0 -0
  93. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/cache_blocks.json +0 -0
  94. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/cache_blocks.py +0 -0
  95. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/community_pipelines/pipeline_flux_rf_inversion.py +0 -0
  96. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/log_setup.py +0 -0
  97. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/pipeline_processors/remote.py +0 -0
  98. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/prompt_schema.json +0 -0
  99. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/prompt_weighting.py +0 -0
  100. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/prompts.py +0 -0
  101. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/repl.py +0 -0
  102. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/repl_commands.py +0 -0
  103. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/repl_worker.py +0 -0
  104. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/schema.py +0 -0
  105. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/serve.py +0 -0
  106. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/__init__.py +0 -0
  107. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/enhancers.py +0 -0
  108. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/abap-08VXUWAP.js +0 -0
  109. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/apex-BWPQTe0t.js +0 -0
  110. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/azcli-Bc_sGQ0U.js +0 -0
  111. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/bat-i0X4ZdIN.js +0 -0
  112. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/bicep-B5-_aFwp.js +0 -0
  113. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/cameligo-DMUM7wLl.js +0 -0
  114. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/clojure-Cm7r79vr.js +0 -0
  115. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/codicon-Brq4_Ui5.ttf +0 -0
  116. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/coffee-Ba7i2nA0.js +0 -0
  117. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/cpp-C7h46wYY.js +0 -0
  118. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/csharp-BKxtCVv1.js +0 -0
  119. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/csp-bTuwJoIa.js +0 -0
  120. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/css-DIMkf-bt.js +0 -0
  121. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/css.worker-B3ciXF_0.js +0 -0
  122. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/cypher-CVaqCwHa.js +0 -0
  123. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/dart-onAF5SnQ.js +0 -0
  124. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/dockerfile-DZFCIeNp.js +0 -0
  125. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ecl-D05T4iGw.js +0 -0
  126. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/editor-jjEx9u7D.css +0 -0
  127. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/editor.worker-q-txB4vs.js +0 -0
  128. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/elixir-6RTg0lbw.js +0 -0
  129. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/flow9-C5_-GSwl.js +0 -0
  130. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/fsharp-C8Ef5oNN.js +0 -0
  131. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/go-C-y9NEjX.js +0 -0
  132. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/graphql-fmXr3nnJ.js +0 -0
  133. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/hcl-CpzslTdj.js +0 -0
  134. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/html.worker-C93Ht9o9.js +0 -0
  135. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ini-sBoK_t0W.js +0 -0
  136. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/java-BEtHBSE6.js +0 -0
  137. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/json.worker-B2V3pomh.js +0 -0
  138. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/julia-Bri6UV-V.js +0 -0
  139. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/kotlin-BOotOW0E.js +0 -0
  140. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/less-B9JPFI3C.js +0 -0
  141. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/lexon-CfSJPG6W.js +0 -0
  142. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/lua-CsQS60Ue.js +0 -0
  143. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/m3-D-oSqn_W.js +0 -0
  144. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/markdown-Cimd5fb3.js +0 -0
  145. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/mips-CIPQ_RoX.js +0 -0
  146. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/monaco--ixms01u.css +0 -0
  147. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/msdax-DauUninz.js +0 -0
  148. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/mysql-SOo6toE5.js +0 -0
  149. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/objective-c-FvmIjYaQ.js +0 -0
  150. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pascal-DrH0SRf2.js +0 -0
  151. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pascaligo-D-ptJ9y-.js +0 -0
  152. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/perl-oz_6vUea.js +0 -0
  153. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pgsql-DTj74zXo.js +0 -0
  154. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/php-nr791fC2.js +0 -0
  155. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pla-CopQ2nXW.js +0 -0
  156. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/postiats-43DmfD33.js +0 -0
  157. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/powerquery-D3hlyOfw.js +0 -0
  158. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/powershell-DmHpPYUd.js +0 -0
  159. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/protobuf-C531GsRP.js +0 -0
  160. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/pug-Z5eAx3Zn.js +0 -0
  161. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/qsharp-DkqhCAOL.js +0 -0
  162. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/r-BwWrilGY.js +0 -0
  163. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/redis-ClamHrr6.js +0 -0
  164. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/redshift-DT7zqm-g.js +0 -0
  165. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/restructuredtext-BYgofb2h.js +0 -0
  166. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ruby-DezsRK8O.js +0 -0
  167. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/rust-DdL9SqIa.js +0 -0
  168. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sb-CcwsVR0C.js +0 -0
  169. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/scala-DHpiXF5c.js +0 -0
  170. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/scheme-BeGwcela.js +0 -0
  171. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/scss-gp-XZpBa.js +0 -0
  172. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/shell-CC2rA5mh.js +0 -0
  173. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/solidity-BEEn4gHE.js +0 -0
  174. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sophia-CRfGWb83.js +0 -0
  175. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sparql-D_Lu-MrJ.js +0 -0
  176. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/sql-NEE52Syq.js +0 -0
  177. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/st-DbInun42.js +0 -0
  178. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/swift-Bxkupp3x.js +0 -0
  179. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/systemverilog-Bz4Y3fRF.js +0 -0
  180. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/tcl-DISqw1ZD.js +0 -0
  181. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/ts.worker-D7T1-Ig5.js +0 -0
  182. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/twig-De2hgUGE.js +0 -0
  183. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/typespec-B8J7ngcE.js +0 -0
  184. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/vb-DV3o63ZY.js +0 -0
  185. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/ui/assets/wgsl-DpFanUEy.js +0 -0
  186. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/server/updater.py +0 -0
  187. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/settings.py +0 -0
  188. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/audio_utils.py +0 -0
  189. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/background_remover.py +0 -0
  190. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/borders.py +0 -0
  191. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/concat_videos.py +0 -0
  192. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/depth_estimator.py +0 -0
  193. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/diffusion_upscale.py +0 -0
  194. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/format_messages.py +0 -0
  195. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/gather.py +0 -0
  196. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/image_to_text.py +0 -0
  197. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/image_utils.py +0 -0
  198. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/interpolate_frames.py +0 -0
  199. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/model_cache.py +0 -0
  200. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/pair_audio.py +0 -0
  201. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/qr_code.py +0 -0
  202. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/restore_faces.py +0 -0
  203. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/rife_model.py +0 -0
  204. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/segment.py +0 -0
  205. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/tensor_image.py +0 -0
  206. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/text_sections.py +0 -0
  207. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/upscale.py +0 -0
  208. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/video_utils.py +0 -0
  209. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/tasks/zoe_depth.py +0 -0
  210. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/teacache.py +0 -0
  211. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/teacache_models.json +0 -0
  212. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/test.py +0 -0
  213. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/type_helpers.py +0 -0
  214. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/validate.py +0 -0
  215. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/variables.py +0 -0
  216. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/worker.py +0 -0
  217. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/workflows/augment_prompt.json +0 -0
  218. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/workflows/describe_image.json +0 -0
  219. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/workflows/h3_context_ir.json +0 -0
  220. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/dw/workflows/test.json +0 -0
  221. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/setup.cfg +0 -0
  222. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_argument_updates.py +0 -0
  223. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_audio_utils.py +0 -0
  224. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_borders.py +0 -0
  225. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_cache_blocks.py +0 -0
  226. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_chain.py +0 -0
  227. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_component_pruning.py +0 -0
  228. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_concat_videos.py +0 -0
  229. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_configuration_schema.py +0 -0
  230. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_depth_estimator.py +0 -0
  231. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_device_helpers.py +0 -0
  232. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_diffusion_upscale.py +0 -0
  233. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_docs_links.py +0 -0
  234. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_events.py +0 -0
  235. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_examples.py +0 -0
  236. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_gather.py +0 -0
  237. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_hub_cache.py +0 -0
  238. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_image_to_text.py +0 -0
  239. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_image_utils.py +0 -0
  240. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_integration.py +0 -0
  241. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_interpolate_frames.py +0 -0
  242. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_introspection.py +0 -0
  243. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_list_images.py +0 -0
  244. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_model_cache.py +0 -0
  245. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_pair_audio.py +0 -0
  246. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_pipeline_caching.py +0 -0
  247. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_prompt_parser.py +0 -0
  248. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_prompt_weighting.py +0 -0
  249. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_prompts.py +0 -0
  250. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_repl_commands.py +0 -0
  251. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_repl_ergonomics.py +0 -0
  252. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_repl_hierarchical.py +0 -0
  253. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_repl_reorganization.py +0 -0
  254. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_resize_bucket.py +0 -0
  255. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_scheduler_config.py +0 -0
  256. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_schema.py +0 -0
  257. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_segment.py +0 -0
  258. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_strip_exif_and_watermark.py +0 -0
  259. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_teacache.py +0 -0
  260. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_tensor_image.py +0 -0
  261. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_text_sections.py +0 -0
  262. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_type_helpers.py +0 -0
  263. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_variables.py +0 -0
  264. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_video_utils.py +0 -0
  265. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_worker.py +0 -0
  266. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_worker_execute.py +0 -0
  267. {diffusers_workflow-0.4.0a8 → diffusers_workflow-0.4.0a10}/tests/test_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusers-workflow
3
- Version: 0.4.0a8
3
+ Version: 0.4.0a10
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -57,6 +57,9 @@ Requires-Dist: packaging>=26.3
57
57
  Provides-Extra: server
58
58
  Requires-Dist: fastapi>=0.141.1; extra == "server"
59
59
  Requires-Dist: uvicorn[standard]>=0.52.4; extra == "server"
60
+ Provides-Extra: mcp
61
+ Requires-Dist: mcp>=2.1.1; extra == "mcp"
62
+ Requires-Dist: httpx>=0.28.1; extra == "mcp"
60
63
  Provides-Extra: dev
61
64
  Requires-Dist: pytest>=9.1.1; extra == "dev"
62
65
  Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
@@ -67,6 +70,7 @@ Requires-Dist: pytest-asyncio>=1.4.0; extra == "dev"
67
70
  Requires-Dist: httpx>=0.28.1; extra == "dev"
68
71
  Requires-Dist: black>=26.5.1; extra == "dev"
69
72
  Requires-Dist: build; extra == "dev"
73
+ Requires-Dist: mcp>=2.1.1; extra == "dev"
70
74
  Dynamic: license-file
71
75
 
72
76
  [![CodeQL](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql)
@@ -85,6 +89,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
85
89
  ## Features
86
90
 
87
91
  - **Web UI** — browse and run workflows, edit them in introspection-driven forms, watch jobs stream live progress, manage generated output and the models on disk. `python -m dw.serve` and open a browser. See [Server & Web UI](docs/SERVER.md).
92
+ - **MCP server** — a stdio server that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`. `dw-mcp`. See [MCP Server](docs/MCP.md).
88
93
  - **Declarative JSON workflows** with variable substitution and cross-step data flow
89
94
  - **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
90
95
  - **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it
@@ -323,6 +328,7 @@ See [workflows/](workflows/) for more workflow files.
323
328
  ### Guides
324
329
 
325
330
  - [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
331
+ - [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
326
332
  - [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
327
333
  - [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
328
334
  - [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
@@ -14,6 +14,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
14
14
  ## Features
15
15
 
16
16
  - **Web UI** — browse and run workflows, edit them in introspection-driven forms, watch jobs stream live progress, manage generated output and the models on disk. `python -m dw.serve` and open a browser. See [Server & Web UI](docs/SERVER.md).
17
+ - **MCP server** — a stdio server that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`. `dw-mcp`. See [MCP Server](docs/MCP.md).
17
18
  - **Declarative JSON workflows** with variable substitution and cross-step data flow
18
19
  - **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
19
20
  - **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it
@@ -252,6 +253,7 @@ See [workflows/](workflows/) for more workflow files.
252
253
  ### Guides
253
254
 
254
255
  - [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
256
+ - [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
255
257
  - [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
256
258
  - [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
257
259
  - [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diffusers-workflow
3
- Version: 0.4.0a8
3
+ Version: 0.4.0a10
4
4
  Summary: Declarative workflow engine and web UI for Hugging Face Diffusers
5
5
  Author: dkackman
6
6
  License: Apache-2.0
@@ -57,6 +57,9 @@ Requires-Dist: packaging>=26.3
57
57
  Provides-Extra: server
58
58
  Requires-Dist: fastapi>=0.141.1; extra == "server"
59
59
  Requires-Dist: uvicorn[standard]>=0.52.4; extra == "server"
60
+ Provides-Extra: mcp
61
+ Requires-Dist: mcp>=2.1.1; extra == "mcp"
62
+ Requires-Dist: httpx>=0.28.1; extra == "mcp"
60
63
  Provides-Extra: dev
61
64
  Requires-Dist: pytest>=9.1.1; extra == "dev"
62
65
  Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
@@ -67,6 +70,7 @@ Requires-Dist: pytest-asyncio>=1.4.0; extra == "dev"
67
70
  Requires-Dist: httpx>=0.28.1; extra == "dev"
68
71
  Requires-Dist: black>=26.5.1; extra == "dev"
69
72
  Requires-Dist: build; extra == "dev"
73
+ Requires-Dist: mcp>=2.1.1; extra == "dev"
70
74
  Dynamic: license-file
71
75
 
72
76
  [![CodeQL](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/dkackman/diffusers-workflow/actions/workflows/github-code-scanning/codeql)
@@ -85,6 +89,7 @@ A declarative workflow engine and web UI for the [Hugging Face Diffusers library
85
89
  ## Features
86
90
 
87
91
  - **Web UI** — browse and run workflows, edit them in introspection-driven forms, watch jobs stream live progress, manage generated output and the models on disk. `python -m dw.serve` and open a browser. See [Server & Web UI](docs/SERVER.md).
92
+ - **MCP server** — a stdio server that lets an MCP client (Claude Code first) author, validate, save, run and diagnose workflows against a running `dw.serve`. `dw-mcp`. See [MCP Server](docs/MCP.md).
88
93
  - **Declarative JSON workflows** with variable substitution and cross-step data flow
89
94
  - **Multi-step pipelines** — chain text-to-image, image-to-video, inpainting, ControlNet
90
95
  - **Reproducible by construction** — outputs embed their full workflow definition and seed; any image in the gallery reopens as the exact workflow that made it
@@ -323,6 +328,7 @@ See [workflows/](workflows/) for more workflow files.
323
328
  ### Guides
324
329
 
325
330
  - [Server & Web UI](docs/SERVER.md) — The web UI, jobs API, and introspection service
331
+ - [MCP Server](docs/MCP.md) — Tool surface for MCP clients (Claude Code, Claude Desktop)
326
332
  - [Workflow Guide](docs/WORKFLOW_GUIDE.md) — JSON structure, variables, steps, data flow
327
333
  - [Quantization](docs/QUANTIZATION.md) — BitsAndBytes, TorchAO, GGUF, SDNQ
328
334
  - [Inference Acceleration](docs/ACCELERATION.md) — torch.compile, FirstBlockCache, MagCache, TaylorSeer, TeaCache
@@ -64,45 +64,45 @@ dw/server/ui/assets/csharp-BKxtCVv1.js
64
64
  dw/server/ui/assets/csp-bTuwJoIa.js
65
65
  dw/server/ui/assets/css-DIMkf-bt.js
66
66
  dw/server/ui/assets/css.worker-B3ciXF_0.js
67
- dw/server/ui/assets/cssMode-4JQhrTTm.js
67
+ dw/server/ui/assets/cssMode-DBf-T_da.js
68
68
  dw/server/ui/assets/cypher-CVaqCwHa.js
69
69
  dw/server/ui/assets/dart-onAF5SnQ.js
70
70
  dw/server/ui/assets/dockerfile-DZFCIeNp.js
71
71
  dw/server/ui/assets/ecl-D05T4iGw.js
72
72
  dw/server/ui/assets/editor-jjEx9u7D.css
73
- dw/server/ui/assets/editor.api-B_68laXH.js
73
+ dw/server/ui/assets/editor.api-B0D5Ygq7.js
74
74
  dw/server/ui/assets/editor.worker-q-txB4vs.js
75
75
  dw/server/ui/assets/elixir-6RTg0lbw.js
76
76
  dw/server/ui/assets/flow9-C5_-GSwl.js
77
- dw/server/ui/assets/freemarker2-C4IxK8gs.js
77
+ dw/server/ui/assets/freemarker2-Br8g4G1T.js
78
78
  dw/server/ui/assets/fsharp-C8Ef5oNN.js
79
79
  dw/server/ui/assets/go-C-y9NEjX.js
80
80
  dw/server/ui/assets/graphql-fmXr3nnJ.js
81
- dw/server/ui/assets/handlebars-BArDGhF4.js
81
+ dw/server/ui/assets/handlebars-BKo1TaOF.js
82
82
  dw/server/ui/assets/hcl-CpzslTdj.js
83
- dw/server/ui/assets/html-8yKFx0-x.js
83
+ dw/server/ui/assets/html-Bis1seyM.js
84
84
  dw/server/ui/assets/html.worker-C93Ht9o9.js
85
- dw/server/ui/assets/htmlMode-BwXG6XFP.js
86
- dw/server/ui/assets/index-BY3Mtj4M.js
87
- dw/server/ui/assets/index-Bug26k2P.css
85
+ dw/server/ui/assets/htmlMode-D2SOD2MF.js
86
+ dw/server/ui/assets/index-D7eWnTCB.css
87
+ dw/server/ui/assets/index-JyFxgIR9.js
88
88
  dw/server/ui/assets/ini-sBoK_t0W.js
89
89
  dw/server/ui/assets/java-BEtHBSE6.js
90
- dw/server/ui/assets/javascript-B3mqpFQQ.js
90
+ dw/server/ui/assets/javascript-CkEbVb78.js
91
91
  dw/server/ui/assets/json.worker-B2V3pomh.js
92
- dw/server/ui/assets/jsonMode-C1m5Z8Ha.js
92
+ dw/server/ui/assets/jsonMode-dVJbYwxg.js
93
93
  dw/server/ui/assets/julia-Bri6UV-V.js
94
94
  dw/server/ui/assets/kotlin-BOotOW0E.js
95
95
  dw/server/ui/assets/less-B9JPFI3C.js
96
96
  dw/server/ui/assets/lexon-CfSJPG6W.js
97
- dw/server/ui/assets/liquid-Cs5oVPJ1.js
98
- dw/server/ui/assets/lspLanguageFeatures-CnroSKaf.js
97
+ dw/server/ui/assets/liquid-Btak-6uF.js
98
+ dw/server/ui/assets/lspLanguageFeatures-BfeZZQbb.js
99
99
  dw/server/ui/assets/lua-CsQS60Ue.js
100
100
  dw/server/ui/assets/m3-D-oSqn_W.js
101
101
  dw/server/ui/assets/markdown-Cimd5fb3.js
102
- dw/server/ui/assets/mdx-BGAIyUWE.js
102
+ dw/server/ui/assets/mdx-D9KXK7-s.js
103
103
  dw/server/ui/assets/mips-CIPQ_RoX.js
104
104
  dw/server/ui/assets/monaco--ixms01u.css
105
- dw/server/ui/assets/monaco-ab9gu2Wi.js
105
+ dw/server/ui/assets/monaco-ZMCk_MWf.js
106
106
  dw/server/ui/assets/msdax-DauUninz.js
107
107
  dw/server/ui/assets/mysql-SOo6toE5.js
108
108
  dw/server/ui/assets/objective-c-FvmIjYaQ.js
@@ -117,10 +117,10 @@ dw/server/ui/assets/powerquery-D3hlyOfw.js
117
117
  dw/server/ui/assets/powershell-DmHpPYUd.js
118
118
  dw/server/ui/assets/protobuf-C531GsRP.js
119
119
  dw/server/ui/assets/pug-Z5eAx3Zn.js
120
- dw/server/ui/assets/python-XsfASqaE.js
120
+ dw/server/ui/assets/python-0FnO4xGM.js
121
121
  dw/server/ui/assets/qsharp-DkqhCAOL.js
122
122
  dw/server/ui/assets/r-BwWrilGY.js
123
- dw/server/ui/assets/razor-C-1xVmcy.js
123
+ dw/server/ui/assets/razor-B6PMzeY4.js
124
124
  dw/server/ui/assets/redis-ClamHrr6.js
125
125
  dw/server/ui/assets/redshift-DT7zqm-g.js
126
126
  dw/server/ui/assets/restructuredtext-BYgofb2h.js
@@ -140,15 +140,15 @@ dw/server/ui/assets/swift-Bxkupp3x.js
140
140
  dw/server/ui/assets/systemverilog-Bz4Y3fRF.js
141
141
  dw/server/ui/assets/tcl-DISqw1ZD.js
142
142
  dw/server/ui/assets/ts.worker-D7T1-Ig5.js
143
- dw/server/ui/assets/tsMode-BDa9GeVq.js
143
+ dw/server/ui/assets/tsMode-nxyvZH1t.js
144
144
  dw/server/ui/assets/twig-De2hgUGE.js
145
- dw/server/ui/assets/typescript-VE9GZNZf.js
145
+ dw/server/ui/assets/typescript-BhBe8aGf.js
146
146
  dw/server/ui/assets/typespec-B8J7ngcE.js
147
147
  dw/server/ui/assets/vb-DV3o63ZY.js
148
148
  dw/server/ui/assets/wgsl-DpFanUEy.js
149
- dw/server/ui/assets/workers-C_2pIPh_.js
150
- dw/server/ui/assets/xml-BJp06vju.js
151
- dw/server/ui/assets/yaml-EI9SS79i.js
149
+ dw/server/ui/assets/workers-ChAf-t8A.js
150
+ dw/server/ui/assets/xml-z2r9dHSO.js
151
+ dw/server/ui/assets/yaml-DrcHrz7f.js
152
152
  dw/tasks/audio_utils.py
153
153
  dw/tasks/background_remover.py
154
154
  dw/tasks/borders.py
@@ -177,12 +177,23 @@ dw/workflows/augment_prompt.json
177
177
  dw/workflows/describe_image.json
178
178
  dw/workflows/h3_context_ir.json
179
179
  dw/workflows/test.json
180
+ dw_mcp/__init__.py
181
+ dw_mcp/__main__.py
182
+ dw_mcp/authoring.py
183
+ dw_mcp/catalog.py
184
+ dw_mcp/client.py
185
+ dw_mcp/diagnose.py
186
+ dw_mcp/media.py
187
+ dw_mcp/models.py
188
+ dw_mcp/prompts.py
189
+ dw_mcp/server.py
180
190
  tests/test_argument_updates.py
181
191
  tests/test_arguments.py
182
192
  tests/test_audio_utils.py
183
193
  tests/test_borders.py
184
194
  tests/test_cache_blocks.py
185
195
  tests/test_chain.py
196
+ tests/test_cli.py
186
197
  tests/test_component_pruning.py
187
198
  tests/test_concat_videos.py
188
199
  tests/test_config_objects.py
@@ -190,6 +201,7 @@ tests/test_configuration_schema.py
190
201
  tests/test_depth_estimator.py
191
202
  tests/test_device.py
192
203
  tests/test_device_helpers.py
204
+ tests/test_device_portability.py
193
205
  tests/test_diffusion_upscale.py
194
206
  tests/test_docs_links.py
195
207
  tests/test_events.py
@@ -202,9 +214,19 @@ tests/test_integration.py
202
214
  tests/test_interpolate_frames.py
203
215
  tests/test_introspection.py
204
216
  tests/test_list_images.py
217
+ tests/test_mcp_authoring.py
218
+ tests/test_mcp_catalog.py
219
+ tests/test_mcp_client.py
220
+ tests/test_mcp_diagnose.py
221
+ tests/test_mcp_media.py
222
+ tests/test_mcp_models.py
223
+ tests/test_mcp_prompts.py
224
+ tests/test_mcp_server.py
205
225
  tests/test_model_cache.py
206
226
  tests/test_modular_pipeline.py
227
+ tests/test_offload_placement.py
207
228
  tests/test_pair_audio.py
229
+ tests/test_phase_events.py
208
230
  tests/test_pipeline_caching.py
209
231
  tests/test_pipeline_components.py
210
232
  tests/test_previous_results.py
@@ -215,6 +237,7 @@ tests/test_repl_commands.py
215
237
  tests/test_repl_ergonomics.py
216
238
  tests/test_repl_hierarchical.py
217
239
  tests/test_repl_reorganization.py
240
+ tests/test_repl_worker.py
218
241
  tests/test_resize_bucket.py
219
242
  tests/test_result.py
220
243
  tests/test_scheduler_config.py
@@ -1,4 +1,5 @@
1
1
  [console_scripts]
2
+ dw-mcp = dw_mcp.__main__:main
2
3
  dw-repl = dw.repl:main
3
4
  dw-run = dw.run:main
4
5
  dw-serve = dw.serve:main
@@ -49,6 +49,11 @@ pytest-asyncio>=1.4.0
49
49
  httpx>=0.28.1
50
50
  black>=26.5.1
51
51
  build
52
+ mcp>=2.1.1
53
+
54
+ [mcp]
55
+ mcp>=2.1.1
56
+ httpx>=0.28.1
52
57
 
53
58
  [server]
54
59
  fastapi>=0.141.1
@@ -138,6 +138,81 @@ def get_device_type(device=None):
138
138
  return torch.device(device if device is not None else get_device()).type
139
139
 
140
140
 
141
+ def backend_available(device_type):
142
+ """
143
+ Whether this machine can actually run on a backend.
144
+
145
+ Only the backends dw knows how to probe get an answer. An unrecognized one is
146
+ reported available rather than guessed at, so a device torch understands and dw
147
+ does not is left alone instead of being rewritten.
148
+
149
+ Args:
150
+ device_type: Backend name ('cuda', 'mps', 'cpu', ...)
151
+
152
+ Returns:
153
+ bool: Whether the backend is usable here
154
+ """
155
+ if not _TORCH_AVAILABLE:
156
+ return device_type == "cpu"
157
+
158
+ if device_type == "cpu":
159
+ return True
160
+
161
+ if device_type == "cuda":
162
+ return torch.cuda.is_available()
163
+
164
+ if device_type == "mps":
165
+ return hasattr(torch.backends, "mps") and torch.backends.mps.is_available()
166
+
167
+ is_available = getattr(getattr(torch, device_type, None), "is_available", None)
168
+ return bool(is_available()) if callable(is_available) else True
169
+
170
+
171
+ def resolve_device(requested):
172
+ """
173
+ Translate a device a workflow asked for into one this machine has.
174
+
175
+ A device named in a workflow is nearly always the author saying 'the accelerator'
176
+ rather than 'specifically NVIDIA', so a workflow written on a CUDA box runs on a
177
+ Mac and back again. The backend is what gets translated - an index is left alone
178
+ when the backend matches, since 'cuda:1' on a single-GPU CUDA box is a genuine
179
+ mistake and not a portability problem. A CPU device is never rewritten: pinning a
180
+ step to the CPU is how a GPU-specific problem gets ruled out.
181
+
182
+ Args:
183
+ requested: Device identifier from a workflow, or None for no override
184
+
185
+ Returns:
186
+ The device to use, or None if None was passed
187
+ """
188
+ if requested is None or not _TORCH_AVAILABLE:
189
+ return requested
190
+
191
+ try:
192
+ device = torch.device(requested)
193
+ except (RuntimeError, TypeError, ValueError):
194
+ # Not a device torch understands - let the failure surface where it is used
195
+ return requested
196
+
197
+ if device.type == "cpu" or backend_available(device.type):
198
+ return requested
199
+
200
+ target = get_device()
201
+ if device.index is not None:
202
+ logging.warning(
203
+ f"Workflow asks for '{requested}', which this machine has no {device.type} "
204
+ f"backend for - running on {target}. The device index is dropped, so a "
205
+ "workflow that meant to spread work across accelerators will not."
206
+ )
207
+ else:
208
+ logging.warning(
209
+ f"Workflow asks for '{requested}', which this machine has no {device.type} "
210
+ f"backend for - running on {target}"
211
+ )
212
+
213
+ return target
214
+
215
+
141
216
  def get_autocast_device_type():
142
217
  """
143
218
  Get the device type to use for torch.autocast.
@@ -76,3 +76,20 @@ def activate_context(context):
76
76
 
77
77
  def deactivate_context(token):
78
78
  _active_context.reset(token)
79
+
80
+
81
+ # The coarse states a run passes through. Small on purpose: a phase says what
82
+ # the run is waiting on, not what any one library is doing internally
83
+ PHASES = ("loading", "cached", "generating", "decoding", "saving", "task")
84
+
85
+
86
+ def emit_phase(phase, detail=None):
87
+ """Report a coarse phase change on the active run.
88
+
89
+ A step spends most of its wall clock outside the denoise loop - pulling
90
+ weights, decoding latents, encoding video - and a step counter says
91
+ nothing about any of that. These are the rest of the story. They are rare
92
+ enough (a handful per step) to carry a free-text detail alongside, which
93
+ is what makes 'loading' readable as 'which model'.
94
+ """
95
+ get_context().emit("phase", phase=phase, detail=detail)
@@ -150,6 +150,7 @@ class DownloadManager:
150
150
  except HFValidationError as e:
151
151
  raise ValueError(str(e))
152
152
 
153
+ cancel_event = threading.Event()
153
154
  with self._lock:
154
155
  for entry in self._downloads.values():
155
156
  if entry["repo_id"] == repo_id and entry["status"] == "downloading":
@@ -163,12 +164,14 @@ class DownloadManager:
163
164
  "error": None,
164
165
  "started_at": time.time(),
165
166
  "finished_at": None,
167
+ # Set before the entry is published: cancel() reaches for this
168
+ # the moment the id is visible, and assigning it after the
169
+ # lock left a window where cancelling raised KeyError
170
+ "_cancel": cancel_event,
166
171
  }
167
172
  self._downloads[entry["id"]] = entry
168
173
  self._prune()
169
174
 
170
- cancel_event = threading.Event()
171
- entry["_cancel"] = cancel_event
172
175
  thread = threading.Thread(
173
176
  target=self._run, args=(entry, cancel_event), daemon=True
174
177
  )
@@ -19,9 +19,12 @@ logger = logging.getLogger("dw")
19
19
 
20
20
  _NAME_PATTERN = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$")
21
21
 
22
- # Matches a diffusers-style docstring parameter header:
22
+ # Matches a docstring parameter header, with or without a declared type:
23
23
  # prompt (`str` or `List[str]`, *optional*):
24
- _DOC_PARAM_PATTERN = re.compile(r"^(\w+) \((.+?)\):\s*(.*)$")
24
+ # prompt: The user message
25
+ # The leading stars let a '**kwargs:' block be recognized as a header of its
26
+ # own, so what it documents can be read as parameters too.
27
+ _DOC_PARAM_PATTERN = re.compile(r"^(\*{0,2}[A-Za-z_]\w*)(?: \((.+?)\))?:\s*(.*)$")
25
28
 
26
29
 
27
30
  # Companion packages whose classes workflows commonly name. Extending this
@@ -150,14 +153,21 @@ def _json_safe_default(value):
150
153
 
151
154
 
152
155
  def _parse_docstring_args(docstring):
153
- """Parameter descriptions from a diffusers-style 'Args:' docstring block.
156
+ """Parameter descriptions from a docstring's 'Args:' block.
154
157
 
155
- Best effort by design: a pipeline with an unusual docstring simply
156
- yields fewer descriptions, never an error.
158
+ Returns (documented, documented_kwargs): the entries at the block's own
159
+ indent, and those nested one level under a '**kwargs:' entry. The nested
160
+ ones are the only declaration a task that funnels its real arguments
161
+ through **kwargs ever makes, so discovery needs them as much as the
162
+ signature.
163
+
164
+ Best effort by design: a docstring with an unusual shape simply yields
165
+ fewer descriptions, never an error.
157
166
  """
158
- descriptions = {}
167
+ documented = {}
168
+ documented_kwargs = {}
159
169
  if not docstring:
160
- return descriptions
170
+ return documented, documented_kwargs
161
171
 
162
172
  lines = docstring.splitlines()
163
173
  try:
@@ -167,11 +177,15 @@ def _parse_docstring_args(docstring):
167
177
  if line.strip() in ("Args:", "Parameters:")
168
178
  )
169
179
  except StopIteration:
170
- return descriptions
180
+ return documented, documented_kwargs
171
181
 
182
+ # The entry being described, and where its description is accumulating:
183
+ # a top-level entry, or one nested inside the **kwargs block
172
184
  current = None
185
+ target = documented
173
186
  parts = []
174
187
  base_indent = None
188
+ kwargs_indent = None
175
189
  for line in lines[start + 1 :]:
176
190
  stripped = line.strip()
177
191
  if not stripped:
@@ -182,25 +196,56 @@ def _parse_docstring_args(docstring):
182
196
  if indent < base_indent:
183
197
  break # left the Args block (Returns:, Examples:, ...)
184
198
 
185
- header = _DOC_PARAM_PATTERN.match(stripped) if indent == base_indent else None
199
+ nested = kwargs_indent is not None and indent == kwargs_indent
200
+ header = (
201
+ _DOC_PARAM_PATTERN.match(stripped)
202
+ if indent == base_indent or nested
203
+ else None
204
+ )
186
205
  if header:
187
206
  if current:
188
- descriptions[current]["description"] = " ".join(parts).strip()
189
- current = header.group(1)
190
- descriptions[current] = {"doc_type": header.group(2)}
207
+ target[current]["description"] = " ".join(parts).strip()
208
+ name = header.group(1)
209
+ if name.startswith("*"):
210
+ # The kwargs entry itself is not a parameter; what it
211
+ # indents is. Its own indent is unknown until the first
212
+ # nested line arrives
213
+ current = None
214
+ target = documented_kwargs
215
+ kwargs_indent = None
216
+ parts = []
217
+ continue
218
+ if indent == base_indent:
219
+ target = documented
220
+ kwargs_indent = None
221
+ elif kwargs_indent is None:
222
+ kwargs_indent = indent
223
+ current = name
224
+ target[current] = {"doc_type": header.group(2)}
191
225
  parts = [header.group(3)] if header.group(3) else []
192
226
  elif current:
193
227
  parts.append(stripped)
228
+ elif target is documented_kwargs and kwargs_indent is None:
229
+ # First line under '**kwargs:' - it sets the nested indent, and
230
+ # is a header if it reads like one
231
+ kwargs_indent = indent
232
+ header = _DOC_PARAM_PATTERN.match(stripped)
233
+ if header and not header.group(1).startswith("*"):
234
+ current = header.group(1)
235
+ target[current] = {"doc_type": header.group(2)}
236
+ parts = [header.group(3)] if header.group(3) else []
194
237
  if current:
195
- descriptions[current]["description"] = " ".join(parts).strip()
196
- return descriptions
238
+ target[current]["description"] = " ".join(parts).strip()
239
+ return documented, documented_kwargs
197
240
 
198
241
 
199
242
  def _callable_parameters(target_callable):
200
243
  """A callable's parameters as form-ready entries, merged with its
201
244
  docstring's Args descriptions. Returns (parameters, accepts_kwargs)."""
202
245
  signature = inspect.signature(target_callable)
203
- documented = _parse_docstring_args(inspect.getdoc(target_callable))
246
+ documented, documented_kwargs = _parse_docstring_args(
247
+ inspect.getdoc(target_callable)
248
+ )
204
249
 
205
250
  parameters = []
206
251
  accepts_kwargs = False
@@ -223,7 +268,23 @@ def _callable_parameters(target_callable):
223
268
  ),
224
269
  }
225
270
  entry.update(documented.get(parameter.name, {}))
271
+ documented_kwargs.pop(parameter.name, None)
226
272
  parameters.append(entry)
273
+
274
+ if accepts_kwargs:
275
+ # Whatever the **kwargs block names is a real argument the callable
276
+ # takes; the signature just never says so. There is no default to
277
+ # read, and anything funnelled through kwargs is optional
278
+ for name, entry in documented_kwargs.items():
279
+ parameters.append(
280
+ {
281
+ "name": name,
282
+ "required": False,
283
+ "default": None,
284
+ "annotation": None,
285
+ **entry,
286
+ }
287
+ )
227
288
  return parameters, accepts_kwargs
228
289
 
229
290
 
@@ -326,6 +326,9 @@ def run_chain(pipeline, chain_definition, arguments):
326
326
  + (f": {segment.num_frames} frames" if segment.num_frames else "")
327
327
  )
328
328
 
329
+ # The denoise counter restarts for every segment - without this the
330
+ # bar rewinds to zero with nothing saying why
331
+ pipeline.segment_label = f"segment {segment.index + 1}/{len(config.plan)}"
329
332
  output = pipeline._run_once(segment_arguments)
330
333
  artifact = _single_artifact(output)
331
334
 
@@ -355,6 +358,8 @@ def run_chain(pipeline, chain_definition, arguments):
355
358
  gc.collect()
356
359
  empty_device_cache()
357
360
 
361
+ pipeline.segment_label = None
362
+
358
363
  if spill is not None:
359
364
  # match_audio overshoots by design - the tail trim happens as the
360
365
  # lazy frames replay, so the files themselves stay whole
@@ -1,6 +1,8 @@
1
1
  import logging
2
2
  import torch
3
3
 
4
+ from .. import resolve_device
5
+
4
6
  logger = logging.getLogger("dw")
5
7
 
6
8
 
@@ -105,10 +107,10 @@ def get_group_offload_configuration(configuration, default_device):
105
107
  logger.debug(f"Group offload parameters: {group_offload_config}")
106
108
  # replace device references with device objects
107
109
  group_offload_config["onload_device"] = torch.device(
108
- group_offload_config.get("onload_device", default_device)
110
+ resolve_device(group_offload_config.get("onload_device", default_device))
109
111
  )
110
112
  group_offload_config["offload_device"] = torch.device(
111
- group_offload_config.get("offload_device", "cpu")
113
+ resolve_device(group_offload_config.get("offload_device", "cpu"))
112
114
  )
113
115
 
114
116
  return group_offload_config