EvoScientist 0.0.1.dev3__tar.gz → 0.1.0rc1__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 (135) hide show
  1. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/EvoScientist.py +17 -49
  2. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/backends.py +0 -26
  3. evoscientist-0.1.0rc1/EvoScientist/cli.py +1281 -0
  4. evoscientist-0.1.0rc1/EvoScientist/middleware.py +27 -0
  5. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/stream/__init__.py +0 -25
  6. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/stream/utils.py +16 -23
  7. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/tools.py +0 -64
  8. evoscientist-0.1.0rc1/EvoScientist.egg-info/PKG-INFO +199 -0
  9. evoscientist-0.1.0rc1/EvoScientist.egg-info/SOURCES.txt +32 -0
  10. evoscientist-0.1.0rc1/EvoScientist.egg-info/entry_points.txt +2 -0
  11. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist.egg-info/requires.txt +0 -1
  12. evoscientist-0.1.0rc1/PKG-INFO +199 -0
  13. evoscientist-0.1.0rc1/README.md +167 -0
  14. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/pyproject.toml +2 -9
  15. evoscientist-0.1.0rc1/tests/test_stream_state.py +285 -0
  16. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/tests/test_stream_utils.py +2 -19
  17. evoscientist-0.0.1.dev3/EvoScientist/cli.py +0 -427
  18. evoscientist-0.0.1.dev3/EvoScientist/memory.py +0 -715
  19. evoscientist-0.0.1.dev3/EvoScientist/middleware.py +0 -80
  20. evoscientist-0.0.1.dev3/EvoScientist/paths.py +0 -45
  21. evoscientist-0.0.1.dev3/EvoScientist/skills/accelerate/SKILL.md +0 -332
  22. evoscientist-0.0.1.dev3/EvoScientist/skills/accelerate/references/custom-plugins.md +0 -453
  23. evoscientist-0.0.1.dev3/EvoScientist/skills/accelerate/references/megatron-integration.md +0 -489
  24. evoscientist-0.0.1.dev3/EvoScientist/skills/accelerate/references/performance.md +0 -525
  25. evoscientist-0.0.1.dev3/EvoScientist/skills/bitsandbytes/SKILL.md +0 -411
  26. evoscientist-0.0.1.dev3/EvoScientist/skills/bitsandbytes/references/memory-optimization.md +0 -521
  27. evoscientist-0.0.1.dev3/EvoScientist/skills/bitsandbytes/references/qlora-training.md +0 -521
  28. evoscientist-0.0.1.dev3/EvoScientist/skills/bitsandbytes/references/quantization-formats.md +0 -447
  29. evoscientist-0.0.1.dev3/EvoScientist/skills/find-skills/SKILL.md +0 -133
  30. evoscientist-0.0.1.dev3/EvoScientist/skills/find-skills/scripts/install_skill.py +0 -211
  31. evoscientist-0.0.1.dev3/EvoScientist/skills/flash-attention/SKILL.md +0 -367
  32. evoscientist-0.0.1.dev3/EvoScientist/skills/flash-attention/references/benchmarks.md +0 -215
  33. evoscientist-0.0.1.dev3/EvoScientist/skills/flash-attention/references/transformers-integration.md +0 -293
  34. evoscientist-0.0.1.dev3/EvoScientist/skills/llama-cpp/SKILL.md +0 -258
  35. evoscientist-0.0.1.dev3/EvoScientist/skills/llama-cpp/references/optimization.md +0 -89
  36. evoscientist-0.0.1.dev3/EvoScientist/skills/llama-cpp/references/quantization.md +0 -213
  37. evoscientist-0.0.1.dev3/EvoScientist/skills/llama-cpp/references/server.md +0 -125
  38. evoscientist-0.0.1.dev3/EvoScientist/skills/lm-evaluation-harness/SKILL.md +0 -490
  39. evoscientist-0.0.1.dev3/EvoScientist/skills/lm-evaluation-harness/references/api-evaluation.md +0 -490
  40. evoscientist-0.0.1.dev3/EvoScientist/skills/lm-evaluation-harness/references/benchmark-guide.md +0 -488
  41. evoscientist-0.0.1.dev3/EvoScientist/skills/lm-evaluation-harness/references/custom-tasks.md +0 -602
  42. evoscientist-0.0.1.dev3/EvoScientist/skills/lm-evaluation-harness/references/distributed-eval.md +0 -519
  43. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/SKILL.md +0 -937
  44. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/references/checklists.md +0 -361
  45. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/references/citation-workflow.md +0 -562
  46. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/references/reviewer-guidelines.md +0 -367
  47. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/references/sources.md +0 -159
  48. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/references/writing-guide.md +0 -476
  49. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/README.md +0 -251
  50. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/aaai2026/README.md +0 -534
  51. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +0 -144
  52. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +0 -952
  53. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bib +0 -111
  54. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bst +0 -1493
  55. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.sty +0 -315
  56. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/acl/README.md +0 -50
  57. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/acl/acl.sty +0 -312
  58. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/acl/acl_latex.tex +0 -377
  59. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/acl/acl_lualatex.tex +0 -101
  60. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/acl/acl_natbib.bst +0 -1940
  61. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/acl/anthology.bib.txt +0 -26
  62. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/acl/custom.bib +0 -70
  63. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/acl/formatting.md +0 -326
  64. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/colm2025/README.md +0 -3
  65. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bib +0 -11
  66. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bst +0 -1440
  67. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
  68. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.sty +0 -218
  69. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.tex +0 -305
  70. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/colm2025/fancyhdr.sty +0 -485
  71. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/colm2025/math_commands.tex +0 -508
  72. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/colm2025/natbib.sty +0 -1246
  73. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/iclr2026/fancyhdr.sty +0 -485
  74. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bib +0 -24
  75. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bst +0 -1440
  76. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
  77. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.sty +0 -246
  78. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.tex +0 -414
  79. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/iclr2026/math_commands.tex +0 -508
  80. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/iclr2026/natbib.sty +0 -1246
  81. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithm.sty +0 -79
  82. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithmic.sty +0 -201
  83. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.bib +0 -75
  84. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.pdf +0 -0
  85. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.tex +0 -662
  86. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/icml2026/fancyhdr.sty +0 -864
  87. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.bst +0 -1443
  88. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.sty +0 -767
  89. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
  90. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/neurips2025/Makefile +0 -36
  91. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/neurips2025/extra_pkgs.tex +0 -53
  92. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/neurips2025/main.tex +0 -38
  93. evoscientist-0.0.1.dev3/EvoScientist/skills/ml-paper-writing/templates/neurips2025/neurips.sty +0 -382
  94. evoscientist-0.0.1.dev3/EvoScientist/skills/peft/SKILL.md +0 -431
  95. evoscientist-0.0.1.dev3/EvoScientist/skills/peft/references/advanced-usage.md +0 -514
  96. evoscientist-0.0.1.dev3/EvoScientist/skills/peft/references/troubleshooting.md +0 -480
  97. evoscientist-0.0.1.dev3/EvoScientist/skills/ray-data/SKILL.md +0 -326
  98. evoscientist-0.0.1.dev3/EvoScientist/skills/ray-data/references/integration.md +0 -82
  99. evoscientist-0.0.1.dev3/EvoScientist/skills/ray-data/references/transformations.md +0 -83
  100. evoscientist-0.0.1.dev3/EvoScientist/skills/skill-creator/LICENSE.txt +0 -202
  101. evoscientist-0.0.1.dev3/EvoScientist/skills/skill-creator/SKILL.md +0 -356
  102. evoscientist-0.0.1.dev3/EvoScientist/skills/skill-creator/references/output-patterns.md +0 -82
  103. evoscientist-0.0.1.dev3/EvoScientist/skills/skill-creator/references/workflows.md +0 -28
  104. evoscientist-0.0.1.dev3/EvoScientist/skills/skill-creator/scripts/init_skill.py +0 -303
  105. evoscientist-0.0.1.dev3/EvoScientist/skills/skill-creator/scripts/package_skill.py +0 -110
  106. evoscientist-0.0.1.dev3/EvoScientist/skills/skill-creator/scripts/quick_validate.py +0 -95
  107. evoscientist-0.0.1.dev3/EvoScientist/skills_manager.py +0 -392
  108. evoscientist-0.0.1.dev3/EvoScientist/stream/display.py +0 -604
  109. evoscientist-0.0.1.dev3/EvoScientist/stream/events.py +0 -415
  110. evoscientist-0.0.1.dev3/EvoScientist/stream/state.py +0 -343
  111. evoscientist-0.0.1.dev3/EvoScientist.egg-info/PKG-INFO +0 -321
  112. evoscientist-0.0.1.dev3/EvoScientist.egg-info/SOURCES.txt +0 -125
  113. evoscientist-0.0.1.dev3/EvoScientist.egg-info/entry_points.txt +0 -5
  114. evoscientist-0.0.1.dev3/PKG-INFO +0 -321
  115. evoscientist-0.0.1.dev3/README.md +0 -288
  116. evoscientist-0.0.1.dev3/tests/test_skills_manager.py +0 -345
  117. evoscientist-0.0.1.dev3/tests/test_stream_state.py +0 -541
  118. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/__init__.py +0 -0
  119. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/__main__.py +0 -0
  120. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/prompts.py +0 -0
  121. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/stream/emitter.py +0 -0
  122. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/stream/formatter.py +0 -0
  123. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/stream/tracker.py +0 -0
  124. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/subagent.yaml +0 -0
  125. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist/utils.py +0 -0
  126. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist.egg-info/dependency_links.txt +0 -0
  127. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/EvoScientist.egg-info/top_level.txt +0 -0
  128. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/LICENSE +0 -0
  129. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/setup.cfg +0 -0
  130. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/tests/test_backends.py +0 -0
  131. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/tests/test_imports.py +0 -0
  132. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/tests/test_prompts.py +0 -0
  133. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/tests/test_stream_emitter.py +0 -0
  134. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/tests/test_stream_tracker.py +0 -0
  135. {evoscientist-0.0.1.dev3 → evoscientist-0.1.0rc1}/tests/test_tools.py +0 -0
@@ -21,17 +21,11 @@ from deepagents import create_deep_agent
21
21
  from deepagents.backends import FilesystemBackend, CompositeBackend
22
22
  from langchain.chat_models import init_chat_model
23
23
 
24
- from .backends import CustomSandboxBackend, MergedReadOnlyBackend
25
- from .middleware import create_skills_middleware, create_memory_middleware
24
+ from .backends import CustomSandboxBackend, ReadOnlyFilesystemBackend
25
+ from .middleware import create_skills_middleware
26
26
  from .prompts import RESEARCHER_INSTRUCTIONS, get_system_prompt
27
27
  from .utils import load_subagents
28
- from .tools import tavily_search, think_tool, skill_manager
29
- from .paths import (
30
- ensure_dirs,
31
- default_workspace_dir,
32
- MEMORY_DIR as _MEMORY_DIR_PATH,
33
- USER_SKILLS_DIR as _USER_SKILLS_DIR_PATH,
34
- )
28
+ from .tools import tavily_search, think_tool
35
29
 
36
30
  # =============================================================================
37
31
  # Configuration
@@ -45,11 +39,8 @@ MAX_CONCURRENT = 3 # Max parallel sub-agents
45
39
  MAX_ITERATIONS = 3 # Max delegation rounds
46
40
 
47
41
  # Workspace settings
48
- ensure_dirs()
49
- WORKSPACE_DIR = str(default_workspace_dir())
50
- MEMORY_DIR = str(_MEMORY_DIR_PATH) # Shared across sessions (not per-session)
51
- SKILLS_DIR = str(Path(__file__).parent / "skills")
52
- USER_SKILLS_DIR = str(_USER_SKILLS_DIR_PATH)
42
+ WORKSPACE_DIR = "./workspace/"
43
+ SKILLS_DIR = "./skills/"
53
44
  SUBAGENTS_CONFIG = Path(__file__).parent / "subagent.yaml"
54
45
 
55
46
  # =============================================================================
@@ -85,25 +76,16 @@ else:
85
76
  virtual_mode=True,
86
77
  )
87
78
 
88
- # Skills backend: merge user-installed (./skills/) and system (package) skills
89
- _skills_backend = MergedReadOnlyBackend(
90
- primary_dir=USER_SKILLS_DIR, # user-installed, takes priority
91
- secondary_dir=SKILLS_DIR, # package built-in, fallback
92
- )
93
-
94
- # Memory backend: persistent filesystem for long-term memory (shared across sessions)
95
- _memory_backend = FilesystemBackend(
96
- root_dir=MEMORY_DIR,
79
+ # Skills backend: read-only access to ./skills/
80
+ _skills_backend = ReadOnlyFilesystemBackend(
81
+ root_dir=SKILLS_DIR,
97
82
  virtual_mode=True,
98
83
  )
99
84
 
100
- # Composite backend: workspace as default, skills and memory mounted
85
+ # Composite backend: workspace as default, skills mounted at /skills/
101
86
  backend = CompositeBackend(
102
87
  default=_workspace_backend,
103
- routes={
104
- "/skills/": _skills_backend,
105
- "/memory/": _memory_backend,
106
- },
88
+ routes={"/skills/": _skills_backend},
107
89
  )
108
90
 
109
91
  tool_registry = {
@@ -125,13 +107,10 @@ subagents = load_subagents(
125
107
  _AGENT_KWARGS = dict(
126
108
  name="EvoScientist",
127
109
  model=chat_model,
128
- tools=[think_tool, skill_manager],
110
+ tools=[think_tool],
129
111
  backend=backend,
130
112
  subagents=subagents,
131
- middleware=[
132
- create_memory_middleware(MEMORY_DIR, extraction_model=chat_model),
133
- create_skills_middleware(SKILLS_DIR, user_skills_dir=USER_SKILLS_DIR),
134
- ],
113
+ middleware=[create_skills_middleware(SKILLS_DIR, WORKSPACE_DIR)],
135
114
  system_prompt=SYSTEM_PROMPT,
136
115
  )
137
116
 
@@ -145,7 +124,7 @@ def create_cli_agent(workspace_dir: str | None = None):
145
124
  Args:
146
125
  workspace_dir: Optional per-session workspace directory. If provided,
147
126
  creates a fresh backend rooted at this path. If None, uses the
148
- module-level default backend (./workspace).
127
+ module-level default backend (./workspace/).
149
128
  """
150
129
  from langgraph.checkpoint.memory import InMemorySaver # type: ignore[import-untyped]
151
130
 
@@ -155,26 +134,15 @@ def create_cli_agent(workspace_dir: str | None = None):
155
134
  virtual_mode=True,
156
135
  timeout=300,
157
136
  )
158
- sk_backend = MergedReadOnlyBackend(
159
- primary_dir=USER_SKILLS_DIR,
160
- secondary_dir=SKILLS_DIR,
161
- )
162
- # Memory always uses SHARED directory (not per-session) for cross-session persistence
163
- mem_backend = FilesystemBackend(
164
- root_dir=MEMORY_DIR,
137
+ sk_backend = ReadOnlyFilesystemBackend(
138
+ root_dir=SKILLS_DIR,
165
139
  virtual_mode=True,
166
140
  )
167
141
  be = CompositeBackend(
168
142
  default=ws_backend,
169
- routes={
170
- "/skills/": sk_backend,
171
- "/memory/": mem_backend,
172
- },
143
+ routes={"/skills/": sk_backend},
173
144
  )
174
- mw = [
175
- create_memory_middleware(MEMORY_DIR, extraction_model=chat_model),
176
- create_skills_middleware(SKILLS_DIR, user_skills_dir=USER_SKILLS_DIR),
177
- ]
145
+ mw = [create_skills_middleware(SKILLS_DIR, workspace_dir)]
178
146
  kwargs = dict(
179
147
  _AGENT_KWARGS,
180
148
  backend=be,
@@ -9,8 +9,6 @@ from deepagents.backends import FilesystemBackend
9
9
  from deepagents.backends.filesystem import WriteResult, EditResult
10
10
  from deepagents.backends.protocol import (
11
11
  ExecuteResponse,
12
- FileDownloadResponse,
13
- FileUploadResponse,
14
12
  SandboxBackendProtocol,
15
13
  )
16
14
 
@@ -225,30 +223,6 @@ class MergedReadOnlyBackend:
225
223
  async def aedit(self, file_path: str, old_string: str, new_string: str, replace_all: bool = False) -> EditResult:
226
224
  return self.edit(file_path, old_string, new_string, replace_all)
227
225
 
228
- # -- download / upload (required by BackendProtocol) --
229
-
230
- def download_files(self, paths: list[str]) -> list[FileDownloadResponse]:
231
- """Download files, trying primary then secondary."""
232
- responses: list[FileDownloadResponse] = []
233
- for path in paths:
234
- resp = self._primary.download_files([path])[0]
235
- if resp.error is not None:
236
- resp = self._secondary.download_files([path])[0]
237
- responses.append(resp)
238
- return responses
239
-
240
- async def adownload_files(self, paths: list[str]) -> list[FileDownloadResponse]:
241
- return self.download_files(paths)
242
-
243
- def upload_files(self, files: list[tuple[str, bytes]]) -> list[FileUploadResponse]:
244
- return [
245
- FileUploadResponse(path=path, error="permission_denied")
246
- for path, _ in files
247
- ]
248
-
249
- async def aupload_files(self, files: list[tuple[str, bytes]]) -> list[FileUploadResponse]:
250
- return self.upload_files(files)
251
-
252
226
 
253
227
  class CustomSandboxBackend(FilesystemBackend, SandboxBackendProtocol):
254
228
  """