modal 1.1.5.dev56__tar.gz → 1.1.5.dev58__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.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

Files changed (196) hide show
  1. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/PKG-INFO +1 -1
  2. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_output.py +14 -4
  3. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_runtime/container_io_manager.py +4 -1
  4. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/client.pyi +2 -2
  5. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_version/__init__.py +1 -1
  7. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/pyproject.toml +7 -1
  8. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/LICENSE +0 -0
  9. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/README.md +0 -0
  10. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/__init__.py +0 -0
  11. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/__main__.py +0 -0
  12. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_clustered_functions.py +0 -0
  13. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_clustered_functions.pyi +0 -0
  14. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_container_entrypoint.py +0 -0
  15. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_functions.py +0 -0
  16. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_ipython.py +0 -0
  17. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_location.py +0 -0
  18. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_object.py +0 -0
  19. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_partial_function.py +0 -0
  20. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_pty.py +0 -0
  21. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_resolver.py +0 -0
  22. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_resources.py +0 -0
  23. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_runtime/__init__.py +0 -0
  24. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_runtime/asgi.py +0 -0
  25. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_runtime/container_io_manager.pyi +0 -0
  26. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_runtime/execution_context.py +0 -0
  27. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_runtime/execution_context.pyi +0 -0
  28. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  29. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_runtime/telemetry.py +0 -0
  30. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_runtime/user_code_imports.py +0 -0
  31. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_serialization.py +0 -0
  32. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_traceback.py +0 -0
  33. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_tunnel.py +0 -0
  34. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_tunnel.pyi +0 -0
  35. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_type_manager.py +0 -0
  36. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/__init__.py +0 -0
  37. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/app_utils.py +0 -0
  38. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/async_utils.py +0 -0
  39. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/auth_token_manager.py +0 -0
  40. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/blob_utils.py +0 -0
  41. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/bytes_io_segment_payload.py +0 -0
  42. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/deprecation.py +0 -0
  43. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/docker_utils.py +0 -0
  44. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/function_utils.py +0 -0
  45. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/git_utils.py +0 -0
  46. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/grpc_testing.py +0 -0
  47. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/grpc_utils.py +0 -0
  48. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/hash_utils.py +0 -0
  49. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/http_utils.py +0 -0
  50. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/jwt_utils.py +0 -0
  51. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/logger.py +0 -0
  52. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/mount_utils.py +0 -0
  53. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/name_utils.py +0 -0
  54. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/package_utils.py +0 -0
  55. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/pattern_utils.py +0 -0
  56. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/rand_pb_testing.py +0 -0
  57. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/shell_utils.py +0 -0
  58. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_utils/time_utils.py +0 -0
  59. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_vendor/__init__.py +0 -0
  60. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  61. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_vendor/cloudpickle.py +0 -0
  62. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_vendor/tblib.py +0 -0
  63. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/_watcher.py +0 -0
  64. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/app.py +0 -0
  65. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/app.pyi +0 -0
  66. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/builder/2023.12.312.txt +0 -0
  67. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/builder/2023.12.txt +0 -0
  68. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/builder/2024.04.txt +0 -0
  69. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/builder/2024.10.txt +0 -0
  70. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/builder/2025.06.txt +0 -0
  71. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/builder/PREVIEW.txt +0 -0
  72. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/builder/README.md +0 -0
  73. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/builder/base-images.json +0 -0
  74. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/call_graph.py +0 -0
  75. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/__init__.py +0 -0
  76. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/_download.py +0 -0
  77. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/_traceback.py +0 -0
  78. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/app.py +0 -0
  79. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/cluster.py +0 -0
  80. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/config.py +0 -0
  81. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/container.py +0 -0
  82. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/dict.py +0 -0
  83. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/entry_point.py +0 -0
  84. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/environment.py +0 -0
  85. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/import_refs.py +0 -0
  86. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/launch.py +0 -0
  87. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/network_file_system.py +0 -0
  88. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/profile.py +0 -0
  89. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/programs/__init__.py +0 -0
  90. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/programs/launch_instance_ssh.py +0 -0
  91. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/programs/run_jupyter.py +0 -0
  92. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/programs/run_marimo.py +0 -0
  93. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/programs/vscode.py +0 -0
  94. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/queues.py +0 -0
  95. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/run.py +0 -0
  96. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/secret.py +0 -0
  97. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/token.py +0 -0
  98. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/utils.py +0 -0
  99. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cli/volume.py +0 -0
  100. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/client.py +0 -0
  101. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cloud_bucket_mount.py +0 -0
  102. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cloud_bucket_mount.pyi +0 -0
  103. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cls.py +0 -0
  104. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/cls.pyi +0 -0
  105. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/config.py +0 -0
  106. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/container_process.py +0 -0
  107. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/container_process.pyi +0 -0
  108. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/dict.py +0 -0
  109. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/dict.pyi +0 -0
  110. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/environments.py +0 -0
  111. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/environments.pyi +0 -0
  112. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/exception.py +0 -0
  113. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/experimental/__init__.py +0 -0
  114. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/experimental/flash.py +0 -0
  115. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/experimental/flash.pyi +0 -0
  116. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/experimental/ipython.py +0 -0
  117. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/file_io.py +0 -0
  118. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/file_io.pyi +0 -0
  119. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/file_pattern_matcher.py +0 -0
  120. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/functions.py +0 -0
  121. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/functions.pyi +0 -0
  122. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/gpu.py +0 -0
  123. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/image.py +0 -0
  124. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/image.pyi +0 -0
  125. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/io_streams.py +0 -0
  126. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/io_streams.pyi +0 -0
  127. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/mount.py +0 -0
  128. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/mount.pyi +0 -0
  129. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/network_file_system.py +0 -0
  130. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/network_file_system.pyi +0 -0
  131. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/object.py +0 -0
  132. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/object.pyi +0 -0
  133. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/output.py +0 -0
  134. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/parallel_map.py +0 -0
  135. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/parallel_map.pyi +0 -0
  136. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/partial_function.py +0 -0
  137. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/partial_function.pyi +0 -0
  138. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/proxy.py +0 -0
  139. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/proxy.pyi +0 -0
  140. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/py.typed +0 -0
  141. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/queue.py +0 -0
  142. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/queue.pyi +0 -0
  143. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/retries.py +0 -0
  144. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/runner.py +0 -0
  145. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/runner.pyi +0 -0
  146. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/running_app.py +0 -0
  147. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/sandbox.py +0 -0
  148. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/sandbox.pyi +0 -0
  149. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/schedule.py +0 -0
  150. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/scheduler_placement.py +0 -0
  151. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/secret.py +0 -0
  152. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/secret.pyi +0 -0
  153. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/serving.py +0 -0
  154. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/serving.pyi +0 -0
  155. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/snapshot.py +0 -0
  156. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/snapshot.pyi +0 -0
  157. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/stream_type.py +0 -0
  158. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/token_flow.py +0 -0
  159. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/token_flow.pyi +0 -0
  160. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/volume.py +0 -0
  161. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal/volume.pyi +0 -0
  162. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal.egg-info/SOURCES.txt +0 -0
  163. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal.egg-info/dependency_links.txt +0 -0
  164. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal.egg-info/entry_points.txt +0 -0
  165. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal.egg-info/requires.txt +0 -0
  166. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal.egg-info/top_level.txt +0 -0
  167. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_docs/__init__.py +0 -0
  168. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_docs/gen_cli_docs.py +0 -0
  169. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_docs/gen_reference_docs.py +0 -0
  170. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_docs/mdmd/__init__.py +0 -0
  171. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_docs/mdmd/mdmd.py +0 -0
  172. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_docs/mdmd/signatures.py +0 -0
  173. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/__init__.py +0 -0
  174. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/api.proto +0 -0
  175. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/api_grpc.py +0 -0
  176. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/api_pb2.py +0 -0
  177. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/api_pb2.pyi +0 -0
  178. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/api_pb2_grpc.py +0 -0
  179. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/api_pb2_grpc.pyi +0 -0
  180. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/modal_api_grpc.py +0 -0
  181. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/modal_options_grpc.py +0 -0
  182. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/options.proto +0 -0
  183. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/options_grpc.py +0 -0
  184. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/options_pb2.py +0 -0
  185. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/options_pb2.pyi +0 -0
  186. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/options_pb2_grpc.py +0 -0
  187. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/options_pb2_grpc.pyi +0 -0
  188. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/py.typed +0 -0
  189. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/sandbox_router.proto +0 -0
  190. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/sandbox_router_grpc.py +0 -0
  191. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/sandbox_router_pb2.py +0 -0
  192. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/sandbox_router_pb2.pyi +0 -0
  193. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
  194. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
  195. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/modal_version/__main__.py +0 -0
  196. {modal-1.1.5.dev56 → modal-1.1.5.dev58}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev56
3
+ Version: 1.1.5.dev58
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -552,14 +552,22 @@ async def get_app_logs_loop(
552
552
  pty_shell_stdout = None
553
553
  pty_shell_finish_event: asyncio.Event | None = None
554
554
  pty_shell_task_id: str | None = None
555
+ pty_shell_input_task: asyncio.Task | None = None
555
556
 
556
557
  async def stop_pty_shell():
557
- nonlocal pty_shell_finish_event
558
+ nonlocal pty_shell_finish_event, pty_shell_input_task
558
559
  if pty_shell_finish_event:
559
560
  print("\r", end="") # move cursor to beginning of line
560
561
  pty_shell_finish_event.set()
561
562
  pty_shell_finish_event = None
562
- await asyncio.sleep(0) # yield to handle_exec_input() so it can disable raw terminal
563
+
564
+ if pty_shell_input_task:
565
+ try:
566
+ await pty_shell_input_task
567
+ except Exception as exc:
568
+ logger.exception(f"Exception in PTY shell input task: {exc}")
569
+ finally:
570
+ pty_shell_input_task = None
563
571
 
564
572
  async def _put_log(log_batch: api_pb2.TaskLogsBatch, log: api_pb2.TaskLogs):
565
573
  if log.task_state:
@@ -587,7 +595,7 @@ async def get_app_logs_loop(
587
595
 
588
596
  async def _get_logs():
589
597
  nonlocal last_log_batch_entry_id
590
- nonlocal pty_shell_stdout, pty_shell_finish_event, pty_shell_task_id
598
+ nonlocal pty_shell_stdout, pty_shell_finish_event, pty_shell_task_id, pty_shell_input_task
591
599
 
592
600
  request = api_pb2.AppGetLogsRequest(
593
601
  app_id=app_id or "",
@@ -622,7 +630,9 @@ async def get_app_logs_loop(
622
630
  pty_shell_finish_event = asyncio.Event()
623
631
  pty_shell_task_id = log_batch.task_id
624
632
  output_mgr.disable()
625
- asyncio.create_task(stream_pty_shell_input(client, log_batch.pty_exec_id, pty_shell_finish_event))
633
+ pty_shell_input_task = asyncio.create_task(
634
+ stream_pty_shell_input(client, log_batch.pty_exec_id, pty_shell_finish_event)
635
+ )
626
636
  else:
627
637
  for log in log_batch.items:
628
638
  await _put_log(log_batch, log)
@@ -915,9 +915,12 @@ class _ContainerIOManager:
915
915
 
916
916
  serialized_tb, tb_line_cache = pickle_traceback(exc, self.task_id)
917
917
 
918
+ data_or_blob = await format_blob_data(pickle_exception(exc), self._client.stub)
918
919
  result = api_pb2.GenericResult(
919
920
  status=api_pb2.GenericResult.GENERIC_STATUS_FAILURE,
920
- data=pickle_exception(exc),
921
+ **data_or_blob,
922
+ # TODO: there is no way to communicate the data format here
923
+ # since it usually goes on the envelope outside of GenericResult
921
924
  exception=repr(exc),
922
925
  traceback="".join(traceback.format_exception(type(exc), exc, exc.__traceback__)),
923
926
  serialized_tb=serialized_tb or b"",
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.1.5.dev56",
36
+ version: str = "1.1.5.dev58",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.1.5.dev56",
167
+ version: str = "1.1.5.dev58",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev56
3
+ Version: 1.1.5.dev58
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.1.5.dev56"
4
+ __version__ = "1.1.5.dev58"
@@ -99,7 +99,13 @@ exclude = [
99
99
  ]
100
100
  line-length = 120
101
101
  lint.ignore = ['E741']
102
- lint.select = ['E', 'F', 'W', 'I']
102
+ lint.select = [
103
+ 'E',
104
+ 'F',
105
+ 'W',
106
+ 'I',
107
+ 'RUF006', # asyncio-dangling-task
108
+ ]
103
109
 
104
110
  [tool.ruff.lint.per-file-ignores]
105
111
  "*_test.py" = ['E712']
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes