isolate 0.26.1__tar.gz → 0.26.2__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 (95) hide show
  1. {isolate-0.26.1/src/isolate.egg-info → isolate-0.26.2}/PKG-INFO +1 -1
  2. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/_isolate_version.py +3 -3
  3. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/_base.py +5 -10
  4. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/remote.py +4 -3
  5. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/_base.py +6 -8
  6. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/agent.py +40 -10
  7. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/definitions/agent.proto +1 -1
  8. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/definitions/agent_pb2.py +7 -7
  9. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/definitions/agent_pb2.pyi +5 -3
  10. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/definitions/agent_pb2_grpc.py +0 -1
  11. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/definitions/server.proto +1 -1
  12. isolate-0.26.2/src/isolate/server/definitions/server_pb2.py +56 -0
  13. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/definitions/server_pb2.pyi +5 -3
  14. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/definitions/server_pb2_grpc.py +0 -1
  15. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/server.py +2 -2
  16. {isolate-0.26.1 → isolate-0.26.2/src/isolate.egg-info}/PKG-INFO +1 -1
  17. {isolate-0.26.1 → isolate-0.26.2}/tests/test_server.py +140 -2
  18. isolate-0.26.1/src/isolate/server/definitions/server_pb2.py +0 -56
  19. {isolate-0.26.1 → isolate-0.26.2}/.github/workflows/claude-code-review.yml +0 -0
  20. {isolate-0.26.1 → isolate-0.26.2}/.github/workflows/claude.yml +0 -0
  21. {isolate-0.26.1 → isolate-0.26.2}/.github/workflows/lint.yml +0 -0
  22. {isolate-0.26.1 → isolate-0.26.2}/.github/workflows/release.yml +0 -0
  23. {isolate-0.26.1 → isolate-0.26.2}/.github/workflows/test.yml +0 -0
  24. {isolate-0.26.1 → isolate-0.26.2}/.gitignore +0 -0
  25. {isolate-0.26.1 → isolate-0.26.2}/.pre-commit-config.yaml +0 -0
  26. {isolate-0.26.1 → isolate-0.26.2}/LICENSE +0 -0
  27. {isolate-0.26.1 → isolate-0.26.2}/README.md +0 -0
  28. {isolate-0.26.1 → isolate-0.26.2}/pyproject.toml +0 -0
  29. {isolate-0.26.1 → isolate-0.26.2}/setup.cfg +0 -0
  30. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/__init__.py +0 -0
  31. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/_version.py +0 -0
  32. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/__init__.py +0 -0
  33. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/common.py +0 -0
  34. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/conda.py +0 -0
  35. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/container.py +0 -0
  36. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/local.py +0 -0
  37. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/pyenv.py +0 -0
  38. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/settings.py +0 -0
  39. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/backends/virtualenv.py +0 -0
  40. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/common/__init__.py +0 -0
  41. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/common/timestamp.py +0 -0
  42. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/__init__.py +0 -0
  43. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/_local/__init__.py +0 -0
  44. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/_local/_base.py +0 -0
  45. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/_local/agent_startup.py +0 -0
  46. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/common.py +0 -0
  47. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/__init__.py +0 -0
  48. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/configuration.py +0 -0
  49. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/definitions/__init__.py +0 -0
  50. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/definitions/common.proto +0 -0
  51. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/definitions/common_pb2.py +0 -0
  52. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/definitions/common_pb2.pyi +0 -0
  53. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/definitions/common_pb2_grpc.py +0 -0
  54. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/grpc/interface.py +0 -0
  55. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/ipc/__init__.py +0 -0
  56. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/ipc/_base.py +0 -0
  57. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/connections/ipc/agent.py +0 -0
  58. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/logger.py +0 -0
  59. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/logs.py +0 -0
  60. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/py.typed +0 -0
  61. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/registry.py +0 -0
  62. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/__init__.py +0 -0
  63. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/definitions/__init__.py +0 -0
  64. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/health/__init__.py +0 -0
  65. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/health/health.proto +0 -0
  66. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/health/health_pb2.py +0 -0
  67. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/health/health_pb2.pyi +0 -0
  68. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/health/health_pb2_grpc.py +0 -0
  69. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/health_server.py +0 -0
  70. {isolate-0.26.1 → isolate-0.26.2}/src/isolate/server/interface.py +0 -0
  71. {isolate-0.26.1 → isolate-0.26.2}/src/isolate.egg-info/SOURCES.txt +0 -0
  72. {isolate-0.26.1 → isolate-0.26.2}/src/isolate.egg-info/dependency_links.txt +0 -0
  73. {isolate-0.26.1 → isolate-0.26.2}/src/isolate.egg-info/entry_points.txt +0 -0
  74. {isolate-0.26.1 → isolate-0.26.2}/src/isolate.egg-info/requires.txt +0 -0
  75. {isolate-0.26.1 → isolate-0.26.2}/src/isolate.egg-info/top_level.txt +0 -0
  76. {isolate-0.26.1 → isolate-0.26.2}/tests/__init__.py +0 -0
  77. {isolate-0.26.1 → isolate-0.26.2}/tests/conftest.py +0 -0
  78. {isolate-0.26.1 → isolate-0.26.2}/tests/test_agent_backward_compatibility.py +0 -0
  79. {isolate-0.26.1 → isolate-0.26.2}/tests/test_backends.py +0 -0
  80. {isolate-0.26.1 → isolate-0.26.2}/tests/test_concurrency.py +0 -0
  81. {isolate-0.26.1 → isolate-0.26.2}/tests/test_connections.py +0 -0
  82. {isolate-0.26.1 → isolate-0.26.2}/tests/test_connections_grpc_base.py +0 -0
  83. {isolate-0.26.1 → isolate-0.26.2}/tests/test_isolate.py +0 -0
  84. {isolate-0.26.1 → isolate-0.26.2}/tests/test_log.py +0 -0
  85. {isolate-0.26.1 → isolate-0.26.2}/tests/test_log_masking.py +0 -0
  86. {isolate-0.26.1 → isolate-0.26.2}/tests/test_logger.py +0 -0
  87. {isolate-0.26.1 → isolate-0.26.2}/tests/test_serialization.py +0 -0
  88. {isolate-0.26.1 → isolate-0.26.2}/tests/test_shutdown.py +0 -0
  89. {isolate-0.26.1 → isolate-0.26.2}/tools/Dockerfile +0 -0
  90. {isolate-0.26.1 → isolate-0.26.2}/tools/agent_requirements.txt +0 -0
  91. {isolate-0.26.1 → isolate-0.26.2}/tools/isolate_client.py +0 -0
  92. {isolate-0.26.1 → isolate-0.26.2}/tools/protobuf-requirements.txt +0 -0
  93. {isolate-0.26.1 → isolate-0.26.2}/tools/regen_grpc.py +0 -0
  94. {isolate-0.26.1 → isolate-0.26.2}/tools/requirements.txt +0 -0
  95. {isolate-0.26.1 → isolate-0.26.2}/tools/test_agent_requirements.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isolate
3
- Version: 0.26.1
3
+ Version: 0.26.2
4
4
  Summary: Managed isolated environments for Python
5
5
  Author-email: Features & Labels <hello@fal.ai>
6
6
  Project-URL: Issues, https://github.com/fal-ai/isolate/issues
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.26.1'
32
- __version_tuple__ = version_tuple = (0, 26, 1)
31
+ __version__ = version = '0.26.2'
32
+ __version_tuple__ = version_tuple = (0, 26, 2)
33
33
 
34
- __commit_id__ = commit_id = 'g68dc2e6e9'
34
+ __commit_id__ = commit_id = 'g7e1de0bc2'
@@ -2,14 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from contextlib import contextmanager
4
4
  from dataclasses import dataclass
5
- from typing import (
6
- Any,
7
- Callable,
8
- ClassVar,
9
- Generic,
10
- Iterator,
11
- TypeVar,
12
- )
5
+ from typing import Any, Callable, ClassVar, Generic, Iterator, Optional, TypeVar
13
6
 
14
7
  from isolate.backends.settings import DEFAULT_SETTINGS, IsolateSettings
15
8
  from isolate.logs import Log, LogLevel, LogSource
@@ -131,7 +124,7 @@ class EnvironmentConnection:
131
124
  self,
132
125
  entrypoint: str,
133
126
  *,
134
- run_on_main_thread: bool = False,
127
+ run_on_main_thread: Optional[bool] = None,
135
128
  ) -> CallResultType: # type: ignore[type-var]
136
129
  """Run a ``"module:attr"`` Python entrypoint inside the environment,
137
130
  and return the result. If the entrypoint raises an exception, then it
@@ -139,7 +132,9 @@ class EnvironmentConnection:
139
132
 
140
133
  If ``run_on_main_thread`` is True, the resolved callable is invoked on
141
134
  the agent's main thread (and coroutines it returns are awaited on that
142
- loop); otherwise it runs on a thread pool."""
135
+ loop). If False, it runs on a thread pool. If None, the backend may
136
+ fall back to legacy callable-level hints such as
137
+ ``_run_on_main_thread``."""
143
138
  raise NotImplementedError
144
139
 
145
140
  def log(
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import copy
4
4
  import json
5
5
  from dataclasses import dataclass
6
- from typing import Any, ClassVar, List
6
+ from typing import Any, ClassVar, List, Optional
7
7
 
8
8
  import grpc
9
9
 
@@ -120,15 +120,16 @@ class IsolateServerConnection(EnvironmentConnection):
120
120
  self,
121
121
  entrypoint: str,
122
122
  *,
123
- run_on_main_thread: bool = False,
123
+ run_on_main_thread: Optional[bool] = None,
124
124
  ) -> CallResultType: # type: ignore[type-var]
125
125
  validate_entrypoint(entrypoint)
126
126
  request = BoundFunction(
127
127
  entrypoint=entrypoint,
128
128
  environments=self.definitions,
129
129
  stream_logs=True,
130
- run_on_main_thread=run_on_main_thread,
131
130
  )
131
+ if run_on_main_thread is not None:
132
+ request.run_on_main_thread = run_on_main_thread
132
133
  return self._run_request(request)
133
134
 
134
135
  def _run_request(self, request: BoundFunction) -> CallResultType: # type: ignore[type-var]
@@ -6,7 +6,7 @@ import time
6
6
  from contextlib import contextmanager
7
7
  from dataclasses import dataclass
8
8
  from pathlib import Path
9
- from typing import Any, ContextManager, Iterator, List, Tuple, Union, cast
9
+ from typing import Any, ContextManager, Iterator, List, Optional, Tuple, Union, cast
10
10
 
11
11
  import grpc
12
12
 
@@ -125,15 +125,13 @@ class GRPCExecutionBase(EnvironmentConnection):
125
125
  self,
126
126
  entrypoint: str,
127
127
  *,
128
- run_on_main_thread: bool = False,
128
+ run_on_main_thread: Optional[bool] = None,
129
129
  ) -> CallResultType: # type: ignore[type-var]
130
130
  validate_entrypoint(entrypoint)
131
- return self._run_function_call(
132
- definitions.FunctionCall(
133
- entrypoint=entrypoint,
134
- run_on_main_thread=run_on_main_thread,
135
- ),
136
- )
131
+ function_call = definitions.FunctionCall(entrypoint=entrypoint)
132
+ if run_on_main_thread is not None:
133
+ function_call.run_on_main_thread = run_on_main_thread
134
+ return self._run_function_call(function_call)
137
135
 
138
136
  def _run_function_call(
139
137
  self, function_call: definitions.FunctionCall
@@ -26,6 +26,7 @@ from typing import (
26
26
  Any,
27
27
  AsyncIterator,
28
28
  Iterable,
29
+ Optional,
29
30
  TextIO,
30
31
  )
31
32
 
@@ -328,18 +329,23 @@ class AgentServicer(definitions.AgentServicer):
328
329
  extra_args.append(self._run_cache[cache_key])
329
330
 
330
331
  try:
332
+ run_on_main_thread = (
333
+ request.run_on_main_thread
334
+ if request.HasField("run_on_main_thread")
335
+ else None
336
+ )
331
337
  if has_entrypoint:
332
338
  invocation = await self.execute_entrypoint(
333
339
  request.entrypoint,
334
340
  "function",
335
- run_on_main_thread=request.run_on_main_thread,
341
+ run_on_main_thread=run_on_main_thread,
336
342
  )
337
343
  else:
338
344
  invocation = await self.execute_function(
339
345
  request.function,
340
346
  "function",
341
347
  extra_args=extra_args,
342
- run_on_main_thread=request.run_on_main_thread,
348
+ run_on_main_thread=run_on_main_thread,
343
349
  )
344
350
  result, was_it_raised, stringized_tb = invocation
345
351
  yield self.send_object(
@@ -358,7 +364,7 @@ class AgentServicer(definitions.AgentServicer):
358
364
  function_kind: str,
359
365
  *,
360
366
  extra_args: Iterable[Any] = (),
361
- run_on_main_thread: bool = False,
367
+ run_on_main_thread: Optional[bool] = None,
362
368
  ) -> tuple[Any, bool, str | None]:
363
369
  if function.was_it_raised:
364
370
  raise AbortException(
@@ -388,16 +394,37 @@ class AgentServicer(definitions.AgentServicer):
388
394
  entrypoint: str,
389
395
  function_kind: str,
390
396
  *,
391
- run_on_main_thread: bool = False,
397
+ run_on_main_thread: Optional[bool] = None,
392
398
  ) -> tuple[Any, bool, str | None]:
393
399
  # Resolve lazily so import / attribute errors surface through the
394
400
  # regular exception capture in _invoke_callable and reach the client
395
- # as a raised result, matching the pickle error path.
396
- def function() -> Any:
397
- return _resolve_entrypoint(entrypoint)()
401
+ # as a raised result, matching the pickle error path. The wrapper also
402
+ # mirrors the resolved callable's legacy `_run_on_main_thread` flag so
403
+ # absent RPC fields keep the old fallback behavior for entrypoints.
404
+ unresolved = object()
405
+
406
+ class ResolvedEntrypoint:
407
+ def __init__(self, value: str):
408
+ self._entrypoint = value
409
+ self._resolved: Any = unresolved
410
+
411
+ def _resolve(self) -> Any:
412
+ if self._resolved is unresolved:
413
+ self._resolved = _resolve_entrypoint(self._entrypoint)
414
+ return self._resolved
415
+
416
+ @property
417
+ def _run_on_main_thread(self) -> bool:
418
+ try:
419
+ return getattr(self._resolve(), "_run_on_main_thread", False)
420
+ except Exception:
421
+ return False
422
+
423
+ def __call__(self) -> Any:
424
+ return self._resolve()()
398
425
 
399
426
  return await self._invoke_callable(
400
- function,
427
+ ResolvedEntrypoint(entrypoint),
401
428
  function_kind,
402
429
  run_on_main_thread=run_on_main_thread,
403
430
  )
@@ -408,7 +435,7 @@ class AgentServicer(definitions.AgentServicer):
408
435
  function_kind: str,
409
436
  extra_args: Iterable[Any] = (),
410
437
  *,
411
- run_on_main_thread: bool = False,
438
+ run_on_main_thread: Optional[bool] = None,
412
439
  ) -> tuple[Any, bool, str | None]:
413
440
  if not callable(function):
414
441
  raise AbortException(
@@ -429,7 +456,10 @@ class AgentServicer(definitions.AgentServicer):
429
456
  # called from a running event loop" error and stay backward
430
457
  # compatible, we offload those unflagged functions to a thread pool.
431
458
 
432
- if run_on_main_thread or getattr(function, "_run_on_main_thread", False):
459
+ if run_on_main_thread is None:
460
+ run_on_main_thread = getattr(function, "_run_on_main_thread", False)
461
+
462
+ if run_on_main_thread:
433
463
  result = function(*extra_args)
434
464
  else:
435
465
  result = self._thread_pool.submit(function, *extra_args).result()
@@ -17,7 +17,7 @@ message FunctionCall {
17
17
  // event loop, useful for async callables) instead of a thread pool. The
18
18
  // agent also honors `_run_on_main_thread` set on the callable itself,
19
19
  // for backward compatibility with older clients.
20
- bool run_on_main_thread = 4;
20
+ optional bool run_on_main_thread = 4;
21
21
  // Exactly one of the following must be set.
22
22
  oneof callable {
23
23
  // A serialized callable to execute.
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Generated by the protocol buffer compiler. DO NOT EDIT!
3
3
  # source: agent.proto
4
- # Protobuf Python Version: 4.25.1
4
+ # Protobuf Python Version: 5.26.1
5
5
  """Generated protocol buffer code."""
6
6
  from google.protobuf import descriptor as _descriptor
7
7
  from google.protobuf import descriptor_pool as _descriptor_pool
@@ -15,15 +15,15 @@ _sym_db = _symbol_database.Default()
15
15
  from isolate.connections.grpc.definitions import common_pb2 as common__pb2
16
16
 
17
17
 
18
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0b\x61gent.proto\x1a\x0c\x63ommon.proto\"\xae\x01\n\x0c\x46unctionCall\x12*\n\nsetup_func\x18\x02 \x01(\x0b\x32\x11.SerializedObjectH\x01\x88\x01\x01\x12\x1a\n\x12run_on_main_thread\x18\x04 \x01(\x08\x12%\n\x08\x66unction\x18\x01 \x01(\x0b\x32\x11.SerializedObjectH\x00\x12\x14\n\nentrypoint\x18\x03 \x01(\tH\x00\x42\n\n\x08\x63\x61llableB\r\n\x0b_setup_func24\n\x05\x41gent\x12+\n\x03Run\x12\r.FunctionCall\x1a\x11.PartialRunResult\"\x00\x30\x01\x62\x06proto3')
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0b\x61gent.proto\x1a\x0c\x63ommon.proto\"\xca\x01\n\x0c\x46unctionCall\x12*\n\nsetup_func\x18\x02 \x01(\x0b\x32\x11.SerializedObjectH\x01\x88\x01\x01\x12\x1f\n\x12run_on_main_thread\x18\x04 \x01(\x08H\x02\x88\x01\x01\x12%\n\x08\x66unction\x18\x01 \x01(\x0b\x32\x11.SerializedObjectH\x00\x12\x14\n\nentrypoint\x18\x03 \x01(\tH\x00\x42\n\n\x08\x63\x61llableB\r\n\x0b_setup_funcB\x15\n\x13_run_on_main_thread24\n\x05\x41gent\x12+\n\x03Run\x12\r.FunctionCall\x1a\x11.PartialRunResult\"\x00\x30\x01\x62\x06proto3')
19
19
 
20
20
  _globals = globals()
21
21
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
22
22
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'agent_pb2', _globals)
23
- if _descriptor._USE_C_DESCRIPTORS == False:
24
- DESCRIPTOR._options = None
23
+ if not _descriptor._USE_C_DESCRIPTORS:
24
+ DESCRIPTOR._loaded_options = None
25
25
  _globals['_FUNCTIONCALL']._serialized_start=30
26
- _globals['_FUNCTIONCALL']._serialized_end=204
27
- _globals['_AGENT']._serialized_start=206
28
- _globals['_AGENT']._serialized_end=258
26
+ _globals['_FUNCTIONCALL']._serialized_end=232
27
+ _globals['_AGENT']._serialized_start=234
28
+ _globals['_AGENT']._serialized_end=286
29
29
  # @@protoc_insertion_point(module_scope)
@@ -49,12 +49,14 @@ class FunctionCall(google.protobuf.message.Message):
49
49
  self,
50
50
  *,
51
51
  setup_func: common_pb2.SerializedObject | None = ...,
52
- run_on_main_thread: builtins.bool = ...,
52
+ run_on_main_thread: builtins.bool | None = ...,
53
53
  function: common_pb2.SerializedObject | None = ...,
54
54
  entrypoint: builtins.str = ...,
55
55
  ) -> None: ...
56
- def HasField(self, field_name: typing_extensions.Literal["_setup_func", b"_setup_func", "callable", b"callable", "entrypoint", b"entrypoint", "function", b"function", "setup_func", b"setup_func"]) -> builtins.bool: ...
57
- def ClearField(self, field_name: typing_extensions.Literal["_setup_func", b"_setup_func", "callable", b"callable", "entrypoint", b"entrypoint", "function", b"function", "run_on_main_thread", b"run_on_main_thread", "setup_func", b"setup_func"]) -> None: ...
56
+ def HasField(self, field_name: typing_extensions.Literal["_run_on_main_thread", b"_run_on_main_thread", "_setup_func", b"_setup_func", "callable", b"callable", "entrypoint", b"entrypoint", "function", b"function", "run_on_main_thread", b"run_on_main_thread", "setup_func", b"setup_func"]) -> builtins.bool: ...
57
+ def ClearField(self, field_name: typing_extensions.Literal["_run_on_main_thread", b"_run_on_main_thread", "_setup_func", b"_setup_func", "callable", b"callable", "entrypoint", b"entrypoint", "function", b"function", "run_on_main_thread", b"run_on_main_thread", "setup_func", b"setup_func"]) -> None: ...
58
+ @typing.overload
59
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_run_on_main_thread", b"_run_on_main_thread"]) -> typing_extensions.Literal["run_on_main_thread"] | None: ...
58
60
  @typing.overload
59
61
  def WhichOneof(self, oneof_group: typing_extensions.Literal["_setup_func", b"_setup_func"]) -> typing_extensions.Literal["setup_func"] | None: ...
60
62
  @typing.overload
@@ -5,7 +5,6 @@ import grpc
5
5
  from isolate.connections.grpc.definitions import agent_pb2 as agent__pb2
6
6
  from isolate.connections.grpc.definitions import common_pb2 as common__pb2
7
7
 
8
-
9
8
  class AgentStub(object):
10
9
  """Missing associated documentation comment in .proto file."""
11
10
 
@@ -29,7 +29,7 @@ message BoundFunction {
29
29
  // event loop, useful for async callables) instead of a thread pool. The
30
30
  // agent also honors `_run_on_main_thread` set on the callable itself,
31
31
  // for backward compatibility with older clients.
32
- bool run_on_main_thread = 6;
32
+ optional bool run_on_main_thread = 6;
33
33
  // Exactly one of the following must be set.
34
34
  oneof callable {
35
35
  // A serialized callable to run.
@@ -0,0 +1,56 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: server.proto
4
+ # Protobuf Python Version: 5.26.1
5
+ """Generated protocol buffer code."""
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ from google.protobuf.internal import builder as _builder
10
+ # @@protoc_insertion_point(imports)
11
+
12
+ _sym_db = _symbol_database.Default()
13
+
14
+
15
+ from isolate.connections.grpc.definitions import common_pb2 as common__pb2
16
+ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
17
+
18
+
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cserver.proto\x1a\x0c\x63ommon.proto\x1a\x1cgoogle/protobuf/struct.proto\"\x8e\x02\n\rBoundFunction\x12,\n\x0c\x65nvironments\x18\x01 \x03(\x0b\x32\x16.EnvironmentDefinition\x12*\n\nsetup_func\x18\x03 \x01(\x0b\x32\x11.SerializedObjectH\x01\x88\x01\x01\x12\x13\n\x0bstream_logs\x18\x04 \x01(\x08\x12\x1f\n\x12run_on_main_thread\x18\x06 \x01(\x08H\x02\x88\x01\x01\x12%\n\x08\x66unction\x18\x02 \x01(\x0b\x32\x11.SerializedObjectH\x00\x12\x14\n\nentrypoint\x18\x05 \x01(\tH\x00\x42\n\n\x08\x63\x61llableB\r\n\x0b_setup_funcB\x15\n\x13_run_on_main_thread\"d\n\x15\x45nvironmentDefinition\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12.\n\rconfiguration\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\"R\n\rSubmitRequest\x12 \n\x08\x66unction\x18\x01 \x01(\x0b\x32\x0e.BoundFunction\x12\x1f\n\x08metadata\x18\x02 \x01(\x0b\x32\r.TaskMetadata\"{\n\x0cTaskMetadata\x12\x36\n\rlogger_labels\x18\x01 \x03(\x0b\x32\x1f.TaskMetadata.LoggerLabelsEntry\x1a\x33\n\x11LoggerLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"!\n\x0eSubmitResponse\x12\x0f\n\x07task_id\x18\x01 \x01(\t\"F\n\x12SetMetadataRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x1f\n\x08metadata\x18\x02 \x01(\x0b\x32\r.TaskMetadata\"\x15\n\x13SetMetadataResponse\"\r\n\x0bListRequest\"\x1b\n\x08TaskInfo\x12\x0f\n\x07task_id\x18\x01 \x01(\t\"(\n\x0cListResponse\x12\x18\n\x05tasks\x18\x01 \x03(\x0b\x32\t.TaskInfo\" \n\rCancelRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\"\x10\n\x0e\x43\x61ncelResponse2\xf4\x01\n\x07Isolate\x12,\n\x03Run\x12\x0e.BoundFunction\x1a\x11.PartialRunResult\"\x00\x30\x01\x12+\n\x06Submit\x12\x0e.SubmitRequest\x1a\x0f.SubmitResponse\"\x00\x12:\n\x0bSetMetadata\x12\x13.SetMetadataRequest\x1a\x14.SetMetadataResponse\"\x00\x12%\n\x04List\x12\x0c.ListRequest\x1a\r.ListResponse\"\x00\x12+\n\x06\x43\x61ncel\x12\x0e.CancelRequest\x1a\x0f.CancelResponse\"\x00\x62\x06proto3')
20
+
21
+ _globals = globals()
22
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
23
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'server_pb2', _globals)
24
+ if not _descriptor._USE_C_DESCRIPTORS:
25
+ DESCRIPTOR._loaded_options = None
26
+ _globals['_TASKMETADATA_LOGGERLABELSENTRY']._loaded_options = None
27
+ _globals['_TASKMETADATA_LOGGERLABELSENTRY']._serialized_options = b'8\001'
28
+ _globals['_BOUNDFUNCTION']._serialized_start=61
29
+ _globals['_BOUNDFUNCTION']._serialized_end=331
30
+ _globals['_ENVIRONMENTDEFINITION']._serialized_start=333
31
+ _globals['_ENVIRONMENTDEFINITION']._serialized_end=433
32
+ _globals['_SUBMITREQUEST']._serialized_start=435
33
+ _globals['_SUBMITREQUEST']._serialized_end=517
34
+ _globals['_TASKMETADATA']._serialized_start=519
35
+ _globals['_TASKMETADATA']._serialized_end=642
36
+ _globals['_TASKMETADATA_LOGGERLABELSENTRY']._serialized_start=591
37
+ _globals['_TASKMETADATA_LOGGERLABELSENTRY']._serialized_end=642
38
+ _globals['_SUBMITRESPONSE']._serialized_start=644
39
+ _globals['_SUBMITRESPONSE']._serialized_end=677
40
+ _globals['_SETMETADATAREQUEST']._serialized_start=679
41
+ _globals['_SETMETADATAREQUEST']._serialized_end=749
42
+ _globals['_SETMETADATARESPONSE']._serialized_start=751
43
+ _globals['_SETMETADATARESPONSE']._serialized_end=772
44
+ _globals['_LISTREQUEST']._serialized_start=774
45
+ _globals['_LISTREQUEST']._serialized_end=787
46
+ _globals['_TASKINFO']._serialized_start=789
47
+ _globals['_TASKINFO']._serialized_end=816
48
+ _globals['_LISTRESPONSE']._serialized_start=818
49
+ _globals['_LISTRESPONSE']._serialized_end=858
50
+ _globals['_CANCELREQUEST']._serialized_start=860
51
+ _globals['_CANCELREQUEST']._serialized_end=892
52
+ _globals['_CANCELRESPONSE']._serialized_start=894
53
+ _globals['_CANCELRESPONSE']._serialized_end=910
54
+ _globals['_ISOLATE']._serialized_start=913
55
+ _globals['_ISOLATE']._serialized_end=1157
56
+ # @@protoc_insertion_point(module_scope)
@@ -54,12 +54,14 @@ class BoundFunction(google.protobuf.message.Message):
54
54
  environments: collections.abc.Iterable[global___EnvironmentDefinition] | None = ...,
55
55
  setup_func: common_pb2.SerializedObject | None = ...,
56
56
  stream_logs: builtins.bool = ...,
57
- run_on_main_thread: builtins.bool = ...,
57
+ run_on_main_thread: builtins.bool | None = ...,
58
58
  function: common_pb2.SerializedObject | None = ...,
59
59
  entrypoint: builtins.str = ...,
60
60
  ) -> None: ...
61
- def HasField(self, field_name: typing_extensions.Literal["_setup_func", b"_setup_func", "callable", b"callable", "entrypoint", b"entrypoint", "function", b"function", "setup_func", b"setup_func"]) -> builtins.bool: ...
62
- def ClearField(self, field_name: typing_extensions.Literal["_setup_func", b"_setup_func", "callable", b"callable", "entrypoint", b"entrypoint", "environments", b"environments", "function", b"function", "run_on_main_thread", b"run_on_main_thread", "setup_func", b"setup_func", "stream_logs", b"stream_logs"]) -> None: ...
61
+ def HasField(self, field_name: typing_extensions.Literal["_run_on_main_thread", b"_run_on_main_thread", "_setup_func", b"_setup_func", "callable", b"callable", "entrypoint", b"entrypoint", "function", b"function", "run_on_main_thread", b"run_on_main_thread", "setup_func", b"setup_func"]) -> builtins.bool: ...
62
+ def ClearField(self, field_name: typing_extensions.Literal["_run_on_main_thread", b"_run_on_main_thread", "_setup_func", b"_setup_func", "callable", b"callable", "entrypoint", b"entrypoint", "environments", b"environments", "function", b"function", "run_on_main_thread", b"run_on_main_thread", "setup_func", b"setup_func", "stream_logs", b"stream_logs"]) -> None: ...
63
+ @typing.overload
64
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_run_on_main_thread", b"_run_on_main_thread"]) -> typing_extensions.Literal["run_on_main_thread"] | None: ...
63
65
  @typing.overload
64
66
  def WhichOneof(self, oneof_group: typing_extensions.Literal["_setup_func", b"_setup_func"]) -> typing_extensions.Literal["setup_func"] | None: ...
65
67
  @typing.overload
@@ -5,7 +5,6 @@ import grpc
5
5
  from isolate.connections.grpc.definitions import common_pb2 as common__pb2
6
6
  from isolate.server.definitions import server_pb2 as server__pb2
7
7
 
8
-
9
8
  class IsolateStub(object):
10
9
  """Missing associated documentation comment in .proto file."""
11
10
 
@@ -330,16 +330,16 @@ class IsolateServicer(definitions.IsolateServicer):
330
330
  if has_entrypoint:
331
331
  function_call = definitions.FunctionCall(
332
332
  entrypoint=task.request.entrypoint,
333
- run_on_main_thread=task.request.run_on_main_thread,
334
333
  )
335
334
  else:
336
335
  function_call = definitions.FunctionCall(
337
336
  function=task.request.function,
338
337
  setup_func=task.request.setup_func,
339
- run_on_main_thread=task.request.run_on_main_thread,
340
338
  )
341
339
  if not task.request.HasField("setup_func"):
342
340
  function_call.ClearField("setup_func")
341
+ if task.request.HasField("run_on_main_thread"):
342
+ function_call.run_on_main_thread = task.request.run_on_main_thread
343
343
 
344
344
  future = local_pool.submit(
345
345
  _proxy_to_queue,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: isolate
3
- Version: 0.26.1
3
+ Version: 0.26.2
4
4
  Summary: Managed isolated environments for Python
5
5
  Author-email: Features & Labels <hello@fal.ai>
6
6
  Project-URL: Issues, https://github.com/fal-ai/isolate/issues
@@ -174,7 +174,12 @@ def run_request(
174
174
  return cast(definitions.SerializedObject, return_value)
175
175
 
176
176
 
177
- def prepare_request(function, *args, **kwargs):
177
+ def prepare_request(
178
+ function: Any,
179
+ *args: Any,
180
+ run_on_main_thread: Optional[bool] = None,
181
+ **kwargs: Any,
182
+ ) -> definitions.BoundFunction:
178
183
  import dill
179
184
 
180
185
  import __main__
@@ -190,10 +195,13 @@ def prepare_request(function, *args, **kwargs):
190
195
  if getattr(function, "_run_on_main_thread", False):
191
196
  setattr(basic_function, "_run_on_main_thread", True)
192
197
  environment = define_environment("virtualenv", requirements=[])
193
- return definitions.BoundFunction(
198
+ request = definitions.BoundFunction(
194
199
  function=to_serialized_object(basic_function, method="dill"),
195
200
  environments=[environment],
196
201
  )
202
+ if run_on_main_thread is not None:
203
+ request.run_on_main_thread = run_on_main_thread
204
+ return request
197
205
 
198
206
 
199
207
  def run_function(stub, function, *args, log_handler=None, **kwargs):
@@ -261,6 +269,108 @@ def test_server_entrypoint(stub: definitions.IsolateStub, monkeypatch: Any) -> N
261
269
  assert result != os.getpid()
262
270
 
263
271
 
272
+ def test_server_entrypoint_honors_legacy_main_thread_flag(
273
+ stub: definitions.IsolateStub,
274
+ monkeypatch: Any,
275
+ tmp_path: Path,
276
+ ) -> None:
277
+ inherit_from_local(monkeypatch)
278
+
279
+ package_dir = tmp_path / "entrypoint_main_thread_test_pkg"
280
+ package_dir.mkdir()
281
+
282
+ (package_dir / "setup.py").write_text(
283
+ textwrap.dedent(
284
+ """
285
+ from setuptools import setup
286
+
287
+
288
+ setup(py_modules=["entrypoint_main_thread_test"])
289
+ """
290
+ )
291
+ )
292
+ (package_dir / "entrypoint_main_thread_test.py").write_text(
293
+ textwrap.dedent(
294
+ """
295
+ import threading
296
+
297
+
298
+ def should_fail_on_main_thread():
299
+ if threading.current_thread() == threading.main_thread():
300
+ raise RuntimeError("should fail on main thread")
301
+ return "should succeed on non-main thread"
302
+
303
+
304
+ should_fail_on_main_thread._run_on_main_thread = True
305
+ """
306
+ )
307
+ )
308
+
309
+ env_definition = define_environment(
310
+ "virtualenv",
311
+ requirements=[str(package_dir)],
312
+ )
313
+ request = definitions.BoundFunction(
314
+ entrypoint="entrypoint_main_thread_test:should_fail_on_main_thread",
315
+ environments=[env_definition],
316
+ )
317
+
318
+ raw_result = run_request(stub, request)
319
+ with pytest.raises(RuntimeError, match="should fail on main thread"):
320
+ from_grpc(raw_result)
321
+
322
+
323
+ def test_server_entrypoint_explicit_false_overrides_legacy_main_thread_flag(
324
+ stub: definitions.IsolateStub,
325
+ monkeypatch: Any,
326
+ tmp_path: Path,
327
+ ) -> None:
328
+ inherit_from_local(monkeypatch)
329
+
330
+ package_dir = tmp_path / "entrypoint_main_thread_override_test_pkg"
331
+ package_dir.mkdir()
332
+
333
+ (package_dir / "setup.py").write_text(
334
+ textwrap.dedent(
335
+ """
336
+ from setuptools import setup
337
+
338
+
339
+ setup(py_modules=["entrypoint_main_thread_override_test"])
340
+ """
341
+ )
342
+ )
343
+ (package_dir / "entrypoint_main_thread_override_test.py").write_text(
344
+ textwrap.dedent(
345
+ """
346
+ import threading
347
+
348
+
349
+ def should_fail_on_main_thread():
350
+ if threading.current_thread() == threading.main_thread():
351
+ raise RuntimeError("should fail on main thread")
352
+ return "should succeed on non-main thread"
353
+
354
+
355
+ should_fail_on_main_thread._run_on_main_thread = True
356
+ """
357
+ )
358
+ )
359
+
360
+ env_definition = define_environment(
361
+ "virtualenv",
362
+ requirements=[str(package_dir)],
363
+ )
364
+ request = definitions.BoundFunction(
365
+ entrypoint="entrypoint_main_thread_override_test:should_fail_on_main_thread",
366
+ environments=[env_definition],
367
+ run_on_main_thread=False,
368
+ )
369
+
370
+ raw_result = run_request(stub, request)
371
+ assert from_grpc(raw_result) == "should succeed on non-main thread"
372
+
373
+
264
374
  def test_agent_import_falls_back_when_settings_constant_missing(
265
375
  monkeypatch: Any,
266
376
  ) -> None:
@@ -1072,6 +1182,12 @@ def test_server_run_on_main_thread(
1072
1182
  else:
1073
1183
  return "should succeed on non-main thread"
1074
1184
 
1185
+ def func_should_fail_off_main_thread():
1186
+ if threading.current_thread() != threading.main_thread():
1187
+ raise RuntimeError("should fail on non-main thread")
1188
+ else:
1189
+ return "should succeed on main thread"
1190
+
1075
1191
  result = from_grpc(
1076
1192
  run_request(stub, prepare_request(func_should_fail_on_main_thread))
1077
1193
  )
@@ -1081,6 +1197,28 @@ def test_server_run_on_main_thread(
1081
1197
  with pytest.raises(RuntimeError):
1082
1198
  from_grpc(run_request(stub, prepare_request(func_should_fail_on_main_thread)))
1083
1199
 
1200
+ result = from_grpc(
1201
+ run_request(
1202
+ stub,
1203
+ prepare_request(
1204
+ func_should_fail_on_main_thread,
1205
+ run_on_main_thread=False,
1206
+ ),
1207
+ )
1208
+ )
1209
+ assert result == "should succeed on non-main thread"
1210
+
1211
+ result = from_grpc(
1212
+ run_request(
1213
+ stub,
1214
+ prepare_request(
1215
+ func_should_fail_off_main_thread,
1216
+ run_on_main_thread=True,
1217
+ ),
1218
+ )
1219
+ )
1220
+ assert result == "should succeed on main thread"
1221
+
1084
1222
 
1085
1223
  def test_server_async_function(
1086
1224
  stub: definitions.IsolateStub,
@@ -1,56 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- # Generated by the protocol buffer compiler. DO NOT EDIT!
3
- # source: server.proto
4
- # Protobuf Python Version: 4.25.1
5
- """Generated protocol buffer code."""
6
- from google.protobuf import descriptor as _descriptor
7
- from google.protobuf import descriptor_pool as _descriptor_pool
8
- from google.protobuf import symbol_database as _symbol_database
9
- from google.protobuf.internal import builder as _builder
10
- # @@protoc_insertion_point(imports)
11
-
12
- _sym_db = _symbol_database.Default()
13
-
14
-
15
- from isolate.connections.grpc.definitions import common_pb2 as common__pb2
16
- from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
17
-
18
-
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0cserver.proto\x1a\x0c\x63ommon.proto\x1a\x1cgoogle/protobuf/struct.proto\"\xf2\x01\n\rBoundFunction\x12,\n\x0c\x65nvironments\x18\x01 \x03(\x0b\x32\x16.EnvironmentDefinition\x12*\n\nsetup_func\x18\x03 \x01(\x0b\x32\x11.SerializedObjectH\x01\x88\x01\x01\x12\x13\n\x0bstream_logs\x18\x04 \x01(\x08\x12\x1a\n\x12run_on_main_thread\x18\x06 \x01(\x08\x12%\n\x08\x66unction\x18\x02 \x01(\x0b\x32\x11.SerializedObjectH\x00\x12\x14\n\nentrypoint\x18\x05 \x01(\tH\x00\x42\n\n\x08\x63\x61llableB\r\n\x0b_setup_func\"d\n\x15\x45nvironmentDefinition\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12.\n\rconfiguration\x18\x02 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\r\n\x05\x66orce\x18\x03 \x01(\x08\"R\n\rSubmitRequest\x12 \n\x08\x66unction\x18\x01 \x01(\x0b\x32\x0e.BoundFunction\x12\x1f\n\x08metadata\x18\x02 \x01(\x0b\x32\r.TaskMetadata\"{\n\x0cTaskMetadata\x12\x36\n\rlogger_labels\x18\x01 \x03(\x0b\x32\x1f.TaskMetadata.LoggerLabelsEntry\x1a\x33\n\x11LoggerLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"!\n\x0eSubmitResponse\x12\x0f\n\x07task_id\x18\x01 \x01(\t\"F\n\x12SetMetadataRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\x12\x1f\n\x08metadata\x18\x02 \x01(\x0b\x32\r.TaskMetadata\"\x15\n\x13SetMetadataResponse\"\r\n\x0bListRequest\"\x1b\n\x08TaskInfo\x12\x0f\n\x07task_id\x18\x01 \x01(\t\"(\n\x0cListResponse\x12\x18\n\x05tasks\x18\x01 \x03(\x0b\x32\t.TaskInfo\" \n\rCancelRequest\x12\x0f\n\x07task_id\x18\x01 \x01(\t\"\x10\n\x0e\x43\x61ncelResponse2\xf4\x01\n\x07Isolate\x12,\n\x03Run\x12\x0e.BoundFunction\x1a\x11.PartialRunResult\"\x00\x30\x01\x12+\n\x06Submit\x12\x0e.SubmitRequest\x1a\x0f.SubmitResponse\"\x00\x12:\n\x0bSetMetadata\x12\x13.SetMetadataRequest\x1a\x14.SetMetadataResponse\"\x00\x12%\n\x04List\x12\x0c.ListRequest\x1a\r.ListResponse\"\x00\x12+\n\x06\x43\x61ncel\x12\x0e.CancelRequest\x1a\x0f.CancelResponse\"\x00\x62\x06proto3')
20
-
21
- _globals = globals()
22
- _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
23
- _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'server_pb2', _globals)
24
- if _descriptor._USE_C_DESCRIPTORS == False:
25
- DESCRIPTOR._options = None
26
- _globals['_TASKMETADATA_LOGGERLABELSENTRY']._options = None
27
- _globals['_TASKMETADATA_LOGGERLABELSENTRY']._serialized_options = b'8\001'
28
- _globals['_BOUNDFUNCTION']._serialized_start=61
29
- _globals['_BOUNDFUNCTION']._serialized_end=303
30
- _globals['_ENVIRONMENTDEFINITION']._serialized_start=305
31
- _globals['_ENVIRONMENTDEFINITION']._serialized_end=405
32
- _globals['_SUBMITREQUEST']._serialized_start=407
33
- _globals['_SUBMITREQUEST']._serialized_end=489
34
- _globals['_TASKMETADATA']._serialized_start=491
35
- _globals['_TASKMETADATA']._serialized_end=614
36
- _globals['_TASKMETADATA_LOGGERLABELSENTRY']._serialized_start=563
37
- _globals['_TASKMETADATA_LOGGERLABELSENTRY']._serialized_end=614
38
- _globals['_SUBMITRESPONSE']._serialized_start=616
39
- _globals['_SUBMITRESPONSE']._serialized_end=649
40
- _globals['_SETMETADATAREQUEST']._serialized_start=651
41
- _globals['_SETMETADATAREQUEST']._serialized_end=721
42
- _globals['_SETMETADATARESPONSE']._serialized_start=723
43
- _globals['_SETMETADATARESPONSE']._serialized_end=744
44
- _globals['_LISTREQUEST']._serialized_start=746
45
- _globals['_LISTREQUEST']._serialized_end=759
46
- _globals['_TASKINFO']._serialized_start=761
47
- _globals['_TASKINFO']._serialized_end=788
48
- _globals['_LISTRESPONSE']._serialized_start=790
49
- _globals['_LISTRESPONSE']._serialized_end=830
50
- _globals['_CANCELREQUEST']._serialized_start=832
51
- _globals['_CANCELREQUEST']._serialized_end=864
52
- _globals['_CANCELRESPONSE']._serialized_start=866
53
- _globals['_CANCELRESPONSE']._serialized_end=882
54
- _globals['_ISOLATE']._serialized_start=885
55
- _globals['_ISOLATE']._serialized_end=1129
56
- # @@protoc_insertion_point(module_scope)
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