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 CHANGED
@@ -5,7 +5,7 @@ Tactus provides a declarative workflow engine for AI agents with pluggable
5
5
  backends for storage, HITL, and chat recording.
6
6
  """
7
7
 
8
- __version__ = "0.28.0"
8
+ __version__ = "0.29.0"
9
9
 
10
10
  # Core exports
11
11
  from tactus.core.runtime import TactusRuntime
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
- sandbox_config = SandboxConfig()
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tactus
3
- Version: 0.28.0
3
+ Version: 0.29.0
4
4
  Summary: Tactus: Lua-based DSL for agentic workflows
5
5
  Project-URL: Homepage, https://github.com/AnthusAI/Tactus
6
6
  Project-URL: Documentation, https://github.com/AnthusAI/Tactus/tree/main/docs
@@ -1,4 +1,4 @@
1
- tactus/__init__.py,sha256=8Tz1eNKHHz9MXIcRw6cUoT1NdeOpUm4R4JjXnudVXZE,1245
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=3TcSGOIQ6Xo--yqLC73Zo11gwJI2YC8ZR74NINdjEcw,94367
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=KuWtQwxHGVz3P_My5bOvMor3cxZMW8Y-wTLQszXP4Cg,5582
91
- tactus/sandbox/container_runner.py,sha256=eefK37PoV7hclJdw5uodC32rzuFvNLNDavnob1Wymtk,39561
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.28.0.dist-info/METADATA,sha256=hvZRdVInGcwogSbsULPG4vXf4hNUCAQrT6ByzL6f0VM,58441
156
- tactus-0.28.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
157
- tactus-0.28.0.dist-info/entry_points.txt,sha256=vWseqty8m3z-Worje0IYxlioMjPDCoSsm0AtY4GghBY,47
158
- tactus-0.28.0.dist-info/licenses/LICENSE,sha256=ivohBcAIYnaLPQ-lKEeCXSMvQUVISpQfKyxHBHoa4GA,1066
159
- tactus-0.28.0.dist-info/RECORD,,
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,,