tactus 0.28.0__py3-none-any.whl → 0.29.0__py3-none-any.whl
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.
- tactus/__init__.py +1 -1
- tactus/ide/server.py +2 -1
- tactus/sandbox/config.py +6 -0
- tactus/sandbox/container_runner.py +49 -0
- {tactus-0.28.0.dist-info → tactus-0.29.0.dist-info}/METADATA +1 -1
- {tactus-0.28.0.dist-info → tactus-0.29.0.dist-info}/RECORD +9 -9
- {tactus-0.28.0.dist-info → tactus-0.29.0.dist-info}/WHEEL +0 -0
- {tactus-0.28.0.dist-info → tactus-0.29.0.dist-info}/entry_points.txt +0 -0
- {tactus-0.28.0.dist-info → tactus-0.29.0.dist-info}/licenses/LICENSE +0 -0
tactus/__init__.py
CHANGED
tactus/ide/server.py
CHANGED
|
@@ -770,7 +770,8 @@ def create_app(initial_workspace: Optional[str] = None, frontend_dist_dir: Optio
|
|
|
770
770
|
from tactus.sandbox import is_docker_available, SandboxConfig, ContainerRunner
|
|
771
771
|
|
|
772
772
|
docker_available, docker_reason = is_docker_available()
|
|
773
|
-
|
|
773
|
+
# Enable dev_mode by default in IDE for live code mounting
|
|
774
|
+
sandbox_config = SandboxConfig(dev_mode=True)
|
|
774
775
|
use_sandbox = docker_available and not sandbox_config.is_explicitly_disabled()
|
|
775
776
|
|
|
776
777
|
if use_sandbox:
|
tactus/sandbox/config.py
CHANGED
|
@@ -111,6 +111,12 @@ class SandboxConfig(BaseModel):
|
|
|
111
111
|
description="Maximum execution time in seconds before container is killed",
|
|
112
112
|
)
|
|
113
113
|
|
|
114
|
+
# Development mode: mount live Tactus source code
|
|
115
|
+
dev_mode: bool = Field(
|
|
116
|
+
default=False,
|
|
117
|
+
description="Enable development mode: mount live Tactus source code instead of using baked-in version",
|
|
118
|
+
)
|
|
119
|
+
|
|
114
120
|
def get_mcp_servers_path(self) -> Path:
|
|
115
121
|
"""Get the expanded MCP servers path."""
|
|
116
122
|
return Path(self.mcp_servers_path).expanduser()
|
|
@@ -171,6 +171,44 @@ class ContainerRunner:
|
|
|
171
171
|
else:
|
|
172
172
|
logger.debug("Sandbox is up to date")
|
|
173
173
|
|
|
174
|
+
def _find_tactus_source_dir(self) -> Optional[Path]:
|
|
175
|
+
"""
|
|
176
|
+
Find the Tactus source directory for development mode.
|
|
177
|
+
|
|
178
|
+
Searches in order:
|
|
179
|
+
1. TACTUS_DEV_PATH environment variable
|
|
180
|
+
2. Directory containing the tactus module (via __file__)
|
|
181
|
+
3. Current working directory if it contains tactus/ subdirectory
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Path to Tactus repository root, or None if not found.
|
|
185
|
+
"""
|
|
186
|
+
# Option 1: Explicit environment variable
|
|
187
|
+
env_path = os.environ.get("TACTUS_DEV_PATH")
|
|
188
|
+
if env_path:
|
|
189
|
+
path = Path(env_path).resolve()
|
|
190
|
+
if path.exists() and (path / "tactus").is_dir():
|
|
191
|
+
return path
|
|
192
|
+
|
|
193
|
+
# Option 2: Find via the tactus module location
|
|
194
|
+
try:
|
|
195
|
+
import tactus
|
|
196
|
+
|
|
197
|
+
tactus_module_path = Path(tactus.__file__).resolve()
|
|
198
|
+
# Go up from tactus/__init__.py to the repo root
|
|
199
|
+
repo_root = tactus_module_path.parent.parent
|
|
200
|
+
if (repo_root / "tactus").is_dir() and (repo_root / "pyproject.toml").exists():
|
|
201
|
+
return repo_root
|
|
202
|
+
except Exception:
|
|
203
|
+
pass
|
|
204
|
+
|
|
205
|
+
# Option 3: Check current working directory
|
|
206
|
+
cwd = Path.cwd()
|
|
207
|
+
if (cwd / "tactus").is_dir() and (cwd / "pyproject.toml").exists():
|
|
208
|
+
return cwd
|
|
209
|
+
|
|
210
|
+
return None
|
|
211
|
+
|
|
174
212
|
def _build_docker_command(
|
|
175
213
|
self,
|
|
176
214
|
working_dir: Path,
|
|
@@ -222,6 +260,17 @@ class ContainerRunner:
|
|
|
222
260
|
if mcp_servers_path and mcp_servers_path.exists():
|
|
223
261
|
cmd.extend(["-v", f"{mcp_servers_path}:/mcp-servers:ro"])
|
|
224
262
|
|
|
263
|
+
# Development mode: mount live Tactus source code
|
|
264
|
+
if self.config.dev_mode:
|
|
265
|
+
tactus_src_dir = self._find_tactus_source_dir()
|
|
266
|
+
if tactus_src_dir:
|
|
267
|
+
logger.info(f"[DEV MODE] Mounting live Tactus source from: {tactus_src_dir}")
|
|
268
|
+
cmd.extend(["-v", f"{tactus_src_dir}/tactus:/app/tactus:ro"])
|
|
269
|
+
else:
|
|
270
|
+
logger.warning(
|
|
271
|
+
"[DEV MODE] Could not locate Tactus source directory, using baked-in version"
|
|
272
|
+
)
|
|
273
|
+
|
|
225
274
|
# Additional user-configured volumes
|
|
226
275
|
for volume in self.config.volumes:
|
|
227
276
|
cmd.extend(["-v", self._normalize_volume_spec(volume, base_dir=volume_base_dir)])
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
tactus/__init__.py,sha256=
|
|
1
|
+
tactus/__init__.py,sha256=4FcmN3wtVlpdkiNSuyvyIU0KPGPe0JBqhin3i72FAw0,1245
|
|
2
2
|
tactus/adapters/__init__.py,sha256=lU8uUxuryFRIpVrn_KeVK7aUhsvOT1tYsuE3FOOIFpI,289
|
|
3
3
|
tactus/adapters/broker_log.py,sha256=mIjARt1Q6ouWVbVri6zep1e8tzm9y28l4WOEdqiK39Q,2849
|
|
4
4
|
tactus/adapters/cli_hitl.py,sha256=3dH58du0lN4k-OvQrAHrAqHFqBjolqNKFb94JaNHtn8,6964
|
|
@@ -50,7 +50,7 @@ tactus/dspy/prediction.py,sha256=nnofvBPGFX7bvYdTVcEMVcIXC5EVrRQ21QsnC1PRHeU,975
|
|
|
50
50
|
tactus/dspy/signature.py,sha256=jdLHBa5BOEBwXTfmLui6fjViEDQDhdUzQm2__STHquU,6053
|
|
51
51
|
tactus/ide/__init__.py,sha256=1fSC0xWP-Lq5wl4FgDq7SMnkvZ0DxXupreTl3ZRX1zw,143
|
|
52
52
|
tactus/ide/coding_assistant.py,sha256=GgmspWIn9IPgBK0ZYapeISIOrcDfRyK7yyPDPV85r8g,12184
|
|
53
|
-
tactus/ide/server.py,sha256=
|
|
53
|
+
tactus/ide/server.py,sha256=TSCnx0Sc9EhRnX5Kl3dUZk-REzxUWmkDoPeHHZ4-AHg,94459
|
|
54
54
|
tactus/primitives/__init__.py,sha256=Y8OD5irmNbpe2NrMoXCaeR3FBfPpmBcI4UCZ6NTgSz0,1782
|
|
55
55
|
tactus/primitives/control.py,sha256=PjRt_Pegcj2L1Uy-IUBQKTYFRMXy7b9q1z2kzJNH8qw,4683
|
|
56
56
|
tactus/primitives/file.py,sha256=-kz0RCst_i_3V860-LtGntYpE0Mm371U_KGHqELbMx0,7186
|
|
@@ -87,8 +87,8 @@ tactus/providers/bedrock.py,sha256=cVNDV7uHhCnnL6BNl7DFF8OwkD9ZYqa9CP2wXMcCJGY,3
|
|
|
87
87
|
tactus/providers/google.py,sha256=wgZ3eiQif1rq1T8BK5V2kL_QVCmqBQZuWLz37y9cxOQ,3123
|
|
88
88
|
tactus/providers/openai.py,sha256=3qSXfdELTHdU7vuRSxQrtnfNctt0HhrePOLFj3YlViA,2692
|
|
89
89
|
tactus/sandbox/__init__.py,sha256=UCBvPD63szvSdwSzpznLW-cnJOgGkVHiKcmJtsAmnuA,1424
|
|
90
|
-
tactus/sandbox/config.py,sha256=
|
|
91
|
-
tactus/sandbox/container_runner.py,sha256=
|
|
90
|
+
tactus/sandbox/config.py,sha256=iu0XRWg6I39vstxFoL7F_Q_Ati6Ps6FkVqKlXaAECdE,5806
|
|
91
|
+
tactus/sandbox/container_runner.py,sha256=ui-15W30pxDaKmXZNgz3pE5yej7YV-cEXCtPrjkSNWs,41428
|
|
92
92
|
tactus/sandbox/docker_manager.py,sha256=SGv0IEN9usgyQRvbonrgOLm6GICel8ifzBAopAwOyt0,13949
|
|
93
93
|
tactus/sandbox/entrypoint.py,sha256=Jbw7ZIOhBygiZa-LHoQAbQg4VJBzK_XrN8wnf1xD5xg,6803
|
|
94
94
|
tactus/sandbox/protocol.py,sha256=1h36423pOFAwwZBgzMkeAIIjan1asgmBiIjN234YlpQ,6060
|
|
@@ -152,8 +152,8 @@ tactus/validation/generated/LuaParserVisitor.py,sha256=ageKSmHPxnO3jBS2fBtkmYBOd
|
|
|
152
152
|
tactus/validation/generated/__init__.py,sha256=5gWlwRI0UvmHw2fnBpj_IG6N8oZeabr5tbj1AODDvjc,196
|
|
153
153
|
tactus/validation/grammar/LuaLexer.g4,sha256=t2MXiTCr127RWAyQGvamkcU_m4veqPzSuHUtAKwalw4,2771
|
|
154
154
|
tactus/validation/grammar/LuaParser.g4,sha256=ceZenb90BdiZmVdOxMGj9qJk3QbbWVZe5HUqPgoePfY,3202
|
|
155
|
-
tactus-0.
|
|
156
|
-
tactus-0.
|
|
157
|
-
tactus-0.
|
|
158
|
-
tactus-0.
|
|
159
|
-
tactus-0.
|
|
155
|
+
tactus-0.29.0.dist-info/METADATA,sha256=nZxJTgrJBWIW1_DQGsCi9t2splJt6h2xJDVsCtulNN8,58441
|
|
156
|
+
tactus-0.29.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
157
|
+
tactus-0.29.0.dist-info/entry_points.txt,sha256=vWseqty8m3z-Worje0IYxlioMjPDCoSsm0AtY4GghBY,47
|
|
158
|
+
tactus-0.29.0.dist-info/licenses/LICENSE,sha256=ivohBcAIYnaLPQ-lKEeCXSMvQUVISpQfKyxHBHoa4GA,1066
|
|
159
|
+
tactus-0.29.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|