tactus 0.35.1__py3-none-any.whl → 0.37.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.
Files changed (43) hide show
  1. tactus/__init__.py +1 -1
  2. tactus/adapters/channels/base.py +20 -2
  3. tactus/adapters/channels/broker.py +1 -0
  4. tactus/adapters/channels/host.py +3 -1
  5. tactus/adapters/channels/ipc.py +18 -3
  6. tactus/adapters/channels/sse.py +13 -5
  7. tactus/adapters/control_loop.py +44 -30
  8. tactus/adapters/mcp_manager.py +24 -7
  9. tactus/backends/http_backend.py +2 -2
  10. tactus/backends/pytorch_backend.py +2 -2
  11. tactus/broker/client.py +3 -3
  12. tactus/broker/server.py +17 -5
  13. tactus/core/dsl_stubs.py +3 -3
  14. tactus/core/execution_context.py +32 -27
  15. tactus/core/lua_sandbox.py +42 -34
  16. tactus/core/message_history_manager.py +51 -28
  17. tactus/core/output_validator.py +65 -51
  18. tactus/core/registry.py +29 -29
  19. tactus/core/runtime.py +69 -61
  20. tactus/dspy/broker_lm.py +13 -7
  21. tactus/dspy/config.py +7 -4
  22. tactus/ide/server.py +63 -33
  23. tactus/primitives/host.py +19 -16
  24. tactus/primitives/message_history.py +11 -14
  25. tactus/primitives/model.py +1 -1
  26. tactus/primitives/procedure.py +11 -8
  27. tactus/primitives/session.py +9 -9
  28. tactus/primitives/state.py +2 -2
  29. tactus/primitives/tool_handle.py +27 -24
  30. tactus/sandbox/container_runner.py +11 -6
  31. tactus/testing/context.py +6 -6
  32. tactus/testing/evaluation_runner.py +5 -5
  33. tactus/testing/mock_hitl.py +2 -2
  34. tactus/testing/models.py +2 -0
  35. tactus/testing/steps/builtin.py +2 -2
  36. tactus/testing/test_runner.py +6 -4
  37. tactus/utils/asyncio_helpers.py +2 -1
  38. tactus/utils/safe_libraries.py +2 -2
  39. {tactus-0.35.1.dist-info → tactus-0.37.0.dist-info}/METADATA +11 -5
  40. {tactus-0.35.1.dist-info → tactus-0.37.0.dist-info}/RECORD +43 -43
  41. {tactus-0.35.1.dist-info → tactus-0.37.0.dist-info}/WHEEL +0 -0
  42. {tactus-0.35.1.dist-info → tactus-0.37.0.dist-info}/entry_points.txt +0 -0
  43. {tactus-0.35.1.dist-info → tactus-0.37.0.dist-info}/licenses/LICENSE +0 -0
tactus/testing/context.py CHANGED
@@ -45,18 +45,18 @@ class TactusTestContext:
45
45
  self.total_tokens: int = 0 # Track total tokens
46
46
  self.cost_breakdown: List[Any] = [] # Track per-call costs
47
47
  self._agent_mock_turns: Dict[str, List[Dict[str, Any]]] = {}
48
- self._scenario_message: str | None = None
48
+ self._scenario_message: Optional[str] = None
49
49
 
50
50
  def set_scenario_message(self, message: str) -> None:
51
51
  """Set the scenario's primary injected message (for in-spec mocking coordination)."""
52
52
  self._scenario_message = message
53
53
 
54
- def get_scenario_message(self) -> str | None:
54
+ def get_scenario_message(self) -> Optional[str]:
55
55
  """Get the scenario's primary injected message, if set."""
56
56
  return self._scenario_message
57
57
 
58
58
  def mock_agent_response(
59
- self, agent: str, message: str, when_message: str | None = None
59
+ self, agent: str, message: str, when_message: Optional[str] = None
60
60
  ) -> None:
61
61
  """Add a mocked agent response for this scenario (temporal; 1 per agent turn).
62
62
 
@@ -79,8 +79,8 @@ class TactusTestContext:
79
79
  self,
80
80
  agent: str,
81
81
  tool: str,
82
- args: Dict[str, Any] | None = None,
83
- when_message: str | None = None,
82
+ args: Optional[Dict[str, Any]] = None,
83
+ when_message: Optional[str] = None,
84
84
  ) -> None:
85
85
  """Add a mocked tool call to an agent's next mocked turn for this scenario."""
86
86
  args = args or {}
@@ -114,7 +114,7 @@ class TactusTestContext:
114
114
  self.runtime.external_agent_mocks = self._agent_mock_turns
115
115
 
116
116
  def mock_agent_data(
117
- self, agent: str, data: Dict[str, Any], when_message: str | None = None
117
+ self, agent: str, data: Dict[str, Any], when_message: Optional[str] = None
118
118
  ) -> None:
119
119
  """Set structured output mock data for an agent's next mocked turn.
120
120
 
@@ -94,6 +94,9 @@ class TactusEvaluationRunner(TactusTestRunner):
94
94
  EvaluationResult with all metrics
95
95
  """
96
96
  logger.info(f"Evaluating scenario '{scenario_name}' with {runs} runs")
97
+ run_iteration = self._run_single_iteration
98
+ if isinstance(run_iteration, staticmethod):
99
+ run_iteration = run_iteration.__func__
97
100
 
98
101
  # Run scenario N times
99
102
  if parallel:
@@ -102,12 +105,9 @@ class TactusEvaluationRunner(TactusTestRunner):
102
105
  ctx = multiprocessing.get_context("spawn")
103
106
  with ctx.Pool(processes=workers) as pool:
104
107
  iteration_args = [(scenario_name, str(self.work_dir), i) for i in range(runs)]
105
- results = pool.starmap(self._run_single_iteration, iteration_args)
108
+ results = pool.starmap(run_iteration, iteration_args)
106
109
  else:
107
- results = [
108
- self._run_single_iteration(scenario_name, str(self.work_dir), i)
109
- for i in range(runs)
110
- ]
110
+ results = [run_iteration(scenario_name, str(self.work_dir), i) for i in range(runs)]
111
111
 
112
112
  # Calculate metrics
113
113
  return self._calculate_metrics(scenario_name, results)
@@ -6,7 +6,7 @@ allowing tests to run without human intervention.
6
6
  """
7
7
 
8
8
  import logging
9
- from datetime import datetime
9
+ from datetime import datetime, timezone
10
10
  from typing import Any, Dict, Optional
11
11
 
12
12
  from tactus.protocols.models import HITLRequest, HITLResponse
@@ -71,7 +71,7 @@ class MockHITLHandler:
71
71
 
72
72
  return HITLResponse(
73
73
  value=value,
74
- responded_at=datetime.utcnow(),
74
+ responded_at=datetime.now(timezone.utc),
75
75
  timed_out=False,
76
76
  )
77
77
 
tactus/testing/models.py CHANGED
@@ -82,6 +82,8 @@ class FeatureResult(BaseModel):
82
82
  class TestResult(BaseModel):
83
83
  """Result from 'tactus test' command."""
84
84
 
85
+ __test__ = False
86
+
85
87
  features: List[FeatureResult] = Field(default_factory=list)
86
88
  total_scenarios: int
87
89
  passed_scenarios: int
@@ -14,7 +14,7 @@ Provides a comprehensive library of steps for testing:
14
14
  import logging
15
15
  import re
16
16
  import ast
17
- from typing import Any
17
+ from typing import Any, Optional
18
18
 
19
19
  from .registry import StepRegistry
20
20
 
@@ -645,7 +645,7 @@ def step_agent_takes_turn(context: Any, agent: str) -> None:
645
645
 
646
646
 
647
647
  def step_mock_agent_responds_with(
648
- context: Any, agent: str, message: str, when_message: str | None = None
648
+ context: Any, agent: str, message: str, when_message: Optional[str] = None
649
649
  ) -> None:
650
650
  """Configure a per-scenario mock agent response (temporal)."""
651
651
  message, _ = _parse_step_string_literal(message)
@@ -128,6 +128,10 @@ class TactusTestRunner:
128
128
  if not scenarios:
129
129
  raise ValueError(f"Scenario not found: {scenario_filter}")
130
130
 
131
+ run_scenario = self._run_single_scenario
132
+ if isinstance(run_scenario, staticmethod):
133
+ run_scenario = run_scenario.__func__
134
+
131
135
  # Run scenarios
132
136
  if parallel and len(scenarios) > 1:
133
137
  # Run in parallel using 'spawn' to avoid Behave global state conflicts
@@ -135,13 +139,11 @@ class TactusTestRunner:
135
139
  ctx = multiprocessing.get_context("spawn")
136
140
  with ctx.Pool(processes=min(len(scenarios), os.cpu_count() or 1)) as pool:
137
141
  scenario_results = pool.starmap(
138
- self._run_single_scenario, [(s.name, str(self.work_dir)) for s in scenarios]
142
+ run_scenario, [(s.name, str(self.work_dir)) for s in scenarios]
139
143
  )
140
144
  else:
141
145
  # Run sequentially
142
- scenario_results = [
143
- self._run_single_scenario(s.name, str(self.work_dir)) for s in scenarios
144
- ]
146
+ scenario_results = [run_scenario(s.name, str(self.work_dir)) for s in scenarios]
145
147
 
146
148
  # Build feature result
147
149
  feature_result = self._build_feature_result(scenario_results)
@@ -24,4 +24,5 @@ def clear_closed_event_loop() -> None:
24
24
  return
25
25
 
26
26
  if getattr(current_loop, "is_closed", lambda: False)():
27
- asyncio.set_event_loop(None)
27
+ replacement_loop = asyncio.new_event_loop()
28
+ asyncio.set_event_loop(replacement_loop)
@@ -10,7 +10,7 @@ import math
10
10
  import random
11
11
  import time
12
12
  import warnings
13
- from datetime import datetime
13
+ from datetime import datetime, timezone
14
14
  from typing import Any, Callable, Optional
15
15
  from functools import wraps
16
16
 
@@ -191,7 +191,7 @@ def create_safe_os_library(get_context: Callable, strict_mode: bool = False):
191
191
  @warn_if_unsafe("os.date()", get_context)
192
192
  def safe_date(format_string=None):
193
193
  """Safe os.date() with checkpoint warning."""
194
- now = datetime.utcnow()
194
+ now = datetime.now(timezone.utc)
195
195
 
196
196
  if format_string is None:
197
197
  # Default format like Lua's os.date()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tactus
3
- Version: 0.35.1
3
+ Version: 0.37.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
@@ -14,26 +14,32 @@ Classifier: Development Status :: 3 - Alpha
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: License :: OSI Approved :: MIT License
16
16
  Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.9
18
+ Classifier: Programming Language :: Python :: 3.10
17
19
  Classifier: Programming Language :: Python :: 3.11
18
20
  Classifier: Programming Language :: Python :: 3.12
19
21
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
- Requires-Python: >=3.11
23
+ Requires-Python: >=3.9
22
24
  Requires-Dist: antlr4-python3-runtime==4.13.1
23
25
  Requires-Dist: behave>=1.2.6
24
26
  Requires-Dist: boto3>=1.28.0
25
- Requires-Dist: dotyaml>=0.1.0
27
+ Requires-Dist: dotyaml>=0.1.4
26
28
  Requires-Dist: dspy>=2.5
27
29
  Requires-Dist: flask-cors>=4.0.0
28
30
  Requires-Dist: flask>=3.0.0
29
31
  Requires-Dist: gherkin-official>=28.0.0
30
32
  Requires-Dist: h5py>=3.10
31
33
  Requires-Dist: jinja2>=3.0
34
+ Requires-Dist: litellm>=1.81.5
35
+ Requires-Dist: logfire>=4.20.0
32
36
  Requires-Dist: lupa>=2.6
33
37
  Requires-Dist: markdown>=3.0
34
38
  Requires-Dist: nanoid>=2.0.0
35
39
  Requires-Dist: nest-asyncio>=1.5.0
36
40
  Requires-Dist: openpyxl>=3.1
41
+ Requires-Dist: opentelemetry-api>=1.39.1
42
+ Requires-Dist: opentelemetry-sdk>=1.39.1
37
43
  Requires-Dist: pyarrow>=14.0
38
44
  Requires-Dist: pydantic-ai-slim[bedrock,evals]
39
45
  Requires-Dist: pydantic>=2.0
@@ -44,9 +50,9 @@ Requires-Dist: typer
44
50
  Provides-Extra: dev
45
51
  Requires-Dist: antlr4-tools>=0.2.1; extra == 'dev'
46
52
  Requires-Dist: behave>=1.2.6; extra == 'dev'
47
- Requires-Dist: black==25.12.0; extra == 'dev'
53
+ Requires-Dist: black==24.10.0; extra == 'dev'
48
54
  Requires-Dist: coverage>=7.4; extra == 'dev'
49
- Requires-Dist: fastmcp>=2.3.5; extra == 'dev'
55
+ Requires-Dist: fastmcp>=2.3.5; (python_version >= '3.10') and extra == 'dev'
50
56
  Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
51
57
  Requires-Dist: pytest-xdist>=3.0; extra == 'dev'
52
58
  Requires-Dist: pytest>=8.0; extra == 'dev'
@@ -1,32 +1,32 @@
1
- tactus/__init__.py,sha256=Y-1dJ93uEEgT5ANpQX755nyr6_Rdo1eup46JRhORocE,1245
1
+ tactus/__init__.py,sha256=Yj_oWwkl1LwtT-IEYuMZ5P1sAhaYAcNH3QiqziIgjU8,1245
2
2
  tactus/adapters/__init__.py,sha256=47Y8kGBR4QGxqEGvjA1mneOSACb2L7oELnj6P2uI7uk,759
3
3
  tactus/adapters/broker_log.py,sha256=9ZR-rJdyW6bMNZx3OfXoQEnDxcAzNsiJ8aPxZGqJYrM,6019
4
4
  tactus/adapters/cli_hitl.py,sha256=Nrfoi35Ei9fTMReLG2QxKkhKyIvl3pYcAUdQCAUOZDk,17361
5
5
  tactus/adapters/cli_log.py,sha256=w2orj3bDAcuK8QEQxLMM9yVarAMJDyTQjemQwbgJDWw,8890
6
- tactus/adapters/control_loop.py,sha256=6n48j1qR0yVeX6_7jIufp0bs2gNGdIynQELRYCnT2PA,35578
6
+ tactus/adapters/control_loop.py,sha256=4I9uEK2FG535785tdl79EnYXy3EVC8ZZk0h_1NDB3gE,35996
7
7
  tactus/adapters/cost_collector_log.py,sha256=O8w03qikrVqq5oltoEmBHIxwydTlODNrHYgfdWZP-a4,1784
8
8
  tactus/adapters/file_storage.py,sha256=CslJoOh2yatwTleNllmiXY6apdyqc3OMSxB3Fj5Kz9I,14684
9
9
  tactus/adapters/http_callback_log.py,sha256=J3K47zDUFj1SDka1CGwzLHhKw7ffKNNZhY5x8tJdnXY,3907
10
10
  tactus/adapters/ide_log.py,sha256=lJsstRlK1iKpO72T3oQL7WmiGBtpLf9YeK0rQ8zT7HU,2435
11
11
  tactus/adapters/lua_tools.py,sha256=eEQueiEI1e50ElqDD39cGsFlVDW7cPUcsGT9TkUiiJU,12988
12
12
  tactus/adapters/mcp.py,sha256=EiwmFYp8JJKiDP18cp-DlwzV8HNOBwz7vVDFlltF6iI,10836
13
- tactus/adapters/mcp_manager.py,sha256=5EM3O8wGu5GQNpgaX7PHsjwjQKKisy_gSR-inRLW-xo,7918
13
+ tactus/adapters/mcp_manager.py,sha256=mDfU6dcQSpgV6fsgsFJqXM4Ayi-LDCGinWVki1_bCKU,8456
14
14
  tactus/adapters/memory.py,sha256=fCBNMIQQMVOUgFM39_Kky2idffP1sCifSjRafZsBbkg,2060
15
15
  tactus/adapters/plugins.py,sha256=DRLvQT7GIy1q-PGhs80p6wswEs_arhYmhfe4O6sb5WU,14513
16
16
  tactus/adapters/channels/__init__.py,sha256=oh1ymJmP8Lalq6JSDnXEnPdKMiPosAuqiUYF_HxEO64,4925
17
- tactus/adapters/channels/base.py,sha256=zKzGMkmL465RjWvc27aYDsgdkNA9CThgh_hd5mEJgvg,5584
18
- tactus/adapters/channels/broker.py,sha256=jXoTvjlOhCS96nHacoK5K7HbytZCXleZl_f-SvG3q5c,7431
17
+ tactus/adapters/channels/base.py,sha256=n1gNIpsKlxAKsyqF72SQRwLNl8H5lkXoq7xQFbMwB8w,6382
18
+ tactus/adapters/channels/broker.py,sha256=agJKxWbYw0gas7rLBmd9QM6_B3Qa6nSalOE_i1emzwk,7477
19
19
  tactus/adapters/channels/cli.py,sha256=lC4WcUuVZD7ik5DkKDmaHTzA2axfnH7yKhWvAH55MuQ,16847
20
- tactus/adapters/channels/host.py,sha256=3sTvseD9UZ30D8_5RE8Bbj26iZYKK2CdavJDu-Rse9A,7862
21
- tactus/adapters/channels/ipc.py,sha256=xKcYERNA_UNoVHDktmOELpgRSQ7c6omZ6z177AstvVU,11749
22
- tactus/adapters/channels/sse.py,sha256=d7ztbZXchX-G9nYmGgqGVkX4nfkXgPbFZ1cAK0AG8oM,11318
23
- tactus/backends/http_backend.py,sha256=QZEAGdaKhdjmrLbT2kR5O_hgkER5_fhA2Wax9I6S3yA,1652
20
+ tactus/adapters/channels/host.py,sha256=t3Rf5f5_mnaAvtuKgt_YB1_t0z7CbYrqBgHAJCyLGPw,7907
21
+ tactus/adapters/channels/ipc.py,sha256=bSObEB4nP0Ebwu4zo33TW3rHR3APWaO0JUkZeZza3nA,12405
22
+ tactus/adapters/channels/sse.py,sha256=2PGlzzRhQ1SG5vGVtKsjQevFKjsaGLGvhpFulGZNt5U,11594
23
+ tactus/backends/http_backend.py,sha256=vnTXPOY5GsEaZuEu7bQ8zt_YcDHqedpHDyAhSgYUG-A,1671
24
24
  tactus/backends/model_backend.py,sha256=P8dCUpDxJmA8_EO1snZuXyIyUZ_BlqReeC6zenO7Kv0,763
25
- tactus/backends/pytorch_backend.py,sha256=I7H7UTa_Scx9_FtmPWn-G4noadaNVEQj-9Kjtjpgl6E,3305
25
+ tactus/backends/pytorch_backend.py,sha256=8rSNYtfTcOvk06--GX1s8fu3C2FxrsbY7ToI4z7frkA,3324
26
26
  tactus/broker/__init__.py,sha256=UTvqLofrgE3c4m6u2iNOg5R7BrS4dmfzMRO4Oq_0A9U,396
27
- tactus/broker/client.py,sha256=Af6oZRrbaMWp6EBVowebmZRK1FXZ_a7OE-ATrdqgV3s,10377
27
+ tactus/broker/client.py,sha256=pB7xzJqObFZYHpxhgoosiU4YmSt196XnvrJrHB-lU8A,10393
28
28
  tactus/broker/protocol.py,sha256=v4DFSVoecerqxbqK-vbRfYEAD10tk-QXNH_d9PFgkWg,5342
29
- tactus/broker/server.py,sha256=mEFB1p9HbTUSHb6Jg1ETdA_baSVDRsGUFIw5hOEVxUc,55817
29
+ tactus/broker/server.py,sha256=s0_Uokovf5s-IR8Ieb3r1h9dnt4eO_PT0aycwuHwhks,56236
30
30
  tactus/broker/stdio.py,sha256=JXkEz-PCU3IQXNkt16YJtYmwkR43eS6CfjxAHc-YCfQ,439
31
31
  tactus/cli/__init__.py,sha256=kVhdCkwWEPdt3vn9si-iKvh6M9817aOH6rLSsNzRuyg,80
32
32
  tactus/cli/app.py,sha256=t-0WzquFq9BH3tw41ruARLQVVxZZYpTaqyB3b1NDy3E,96374
@@ -34,15 +34,15 @@ tactus/cli/control.py,sha256=jCKKy8f6x8wV5im-MwxOtgz85oYLTHhPKXx-3FtRwoU,13364
34
34
  tactus/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  tactus/core/__init__.py,sha256=TK5rWr3HmOO_igFa5ESGp6teWwS58vnvQhIWqkcgqwk,880
36
36
  tactus/core/config_manager.py,sha256=kxz853j4Nx97SBh8-fAar_OfmfWZvvcfafLyxjTQG1A,35131
37
- tactus/core/dsl_stubs.py,sha256=5ioc98euqdVaC2M1WczKa9m9llPavEkWxox9sAM3uus,87523
37
+ tactus/core/dsl_stubs.py,sha256=odWaRl78NFixnzi4DSZ_xrNVGPwe4tTO7KxcAITJKV0,87545
38
38
  tactus/core/exceptions.py,sha256=Mjg7J5_zs528wcoHn-4vGROFFhk1DGbjMmwjII4-uZI,1683
39
- tactus/core/execution_context.py,sha256=JJoZp4nNtdbR9rg5yI0Px8ciRohBfoSZCD6nYrE9kI4,29138
40
- tactus/core/lua_sandbox.py,sha256=gCAfWceZtZRbqX2vnRJHx9vcdV-Bxoxbfl3Botgjihg,18769
41
- tactus/core/message_history_manager.py,sha256=W4FbwBWFm1VBtSprVY-tiJFMsHCq4DR-t7Ws5aX5rkk,11346
39
+ tactus/core/execution_context.py,sha256=vHdhk8TZXr9txu93VpxOHgq1YCtauCznRWZs_O7GMwE,29404
40
+ tactus/core/lua_sandbox.py,sha256=Ln2P1gdxVl396HLvEw7FmDKV3eVdVdbDzYHMbDSEciY,19106
41
+ tactus/core/message_history_manager.py,sha256=zBzZeymwg5Z_JvYznxwQPrzrgDNM4iyFQjn402OB4LE,11823
42
42
  tactus/core/mocking.py,sha256=ew0rv-kzMCiObk5bKOtZOeIohfu6KVfnlkIG-aJOo3A,9521
43
- tactus/core/output_validator.py,sha256=Y9Eb2fRa-8pDqHEj8C-CJ-2t1pIuPzEi-MzM8z0xzJA,10522
44
- tactus/core/registry.py,sha256=eLOWdqbLn_1kbU33G3kl0bsoX4Ab8fdbldOEBPleP_E,20970
45
- tactus/core/runtime.py,sha256=QBb3eK4TsjZqnHAhS52An18XHgQjNI9n7mn6jken8V8,141407
43
+ tactus/core/output_validator.py,sha256=LcSjgAiDRvzsj2uWasQihengQRt7R-ZYaPiLQPbZyQE,10732
44
+ tactus/core/registry.py,sha256=oosYnYQ1BOut9760GjO_LOcgnFjo9FTLVnCWsTk_j78,21085
45
+ tactus/core/runtime.py,sha256=-bkGaK_44CU8gznJlFBz4bhoERp882beUb7aTWA5Gkc,141782
46
46
  tactus/core/template_resolver.py,sha256=r97KzFNaK4nFSoWtIFZeSKyuUWgbp-ay1_BGrb-BgUY,4179
47
47
  tactus/core/yaml_parser.py,sha256=JD7Nehaxw3uP1KV_uTU_xiXTbEWqoKOceU5tAJ4lcH8,13985
48
48
  tactus/core/dependencies/__init__.py,sha256=28-TM7_i-JqTD3hvkq1kMzr__A8VjfIKXymdW9mn5NM,362
@@ -59,8 +59,8 @@ tactus/docs/templates/index.html,sha256=6yMzjeajTvPexzKaLrKBetTrup5_fMs1vfGZIz11
59
59
  tactus/docs/templates/module.html,sha256=0Tp7NETi7g77xpuqaaR0VpLVeVuz4SI544873yHpOdg,2772
60
60
  tactus/dspy/__init__.py,sha256=beUkvMUFdPvZE9-bEOfRo2TH-FoCvPT_L9_dpJPW324,1226
61
61
  tactus/dspy/agent.py,sha256=wUFAjrWjM8g7pI79RKNOv0EoiSwx9NQAgf-uLYRTXKQ,64200
62
- tactus/dspy/broker_lm.py,sha256=rTLsoNMbmMUpx5FfS3bG5EJfUPwZ0UA3QwGZkp7mGvQ,8540
63
- tactus/dspy/config.py,sha256=5i4bOsNn9T68sGd0xQRIXkBzzpttuFuNZhPXCXCH9cg,7037
62
+ tactus/dspy/broker_lm.py,sha256=3uIhgHjRl4MdLIEEqPwmnuXaTQZHrVVxrgbhNG8dCLo,8636
63
+ tactus/dspy/config.py,sha256=gVJIQ0IUPe2_1YP2PZnC6rgOJp12BHW2MjKKx77HpHE,7137
64
64
  tactus/dspy/history.py,sha256=rnynY_xHQv5zQ0Ys8Pf6p3v8HrrKrX2sgyyOxyqx6FU,6066
65
65
  tactus/dspy/module.py,sha256=sgXvtrDQNCnY0xCesZlsidsBiPkzud1XdmQ-GQHEhcM,21701
66
66
  tactus/dspy/prediction.py,sha256=nnofvBPGFX7bvYdTVcEMVcIXC5EVrRQ21QsnC1PRHeU,9758
@@ -70,26 +70,26 @@ tactus/formatting/formatter.py,sha256=DfHp977t5reMPIWZwRChRE5Yflw7xGgTNUM0AOcS8L
70
70
  tactus/ide/__init__.py,sha256=1fSC0xWP-Lq5wl4FgDq7SMnkvZ0DxXupreTl3ZRX1zw,143
71
71
  tactus/ide/coding_assistant.py,sha256=GgmspWIn9IPgBK0ZYapeISIOrcDfRyK7yyPDPV85r8g,12184
72
72
  tactus/ide/config_server.py,sha256=U8OWxi5l24GH1lUHIAQ8WB8j0cJ5ofLX9iVecW1O2vc,18862
73
- tactus/ide/server.py,sha256=Mp52RhXt351k56a3XreMP6bWxYZR3RP6MA-KXYh2eX4,110205
73
+ tactus/ide/server.py,sha256=nE_UDiXJZN7G-RzPD-guZ_4qPxPl722qcrv4UY6bjII,111151
74
74
  tactus/primitives/__init__.py,sha256=x6bGwoa9DizKUwqsg7SqURfJxisEdctTCv1XnSAZxIk,1709
75
75
  tactus/primitives/control.py,sha256=jw-7ggHtNLfFL5aTUUs6Fo5y4xsxEG8OIRe0RyIjVnc,4783
76
76
  tactus/primitives/file.py,sha256=GFHmXOADRllfJw6gHpIdVMmZ_ZS7DVgresQ0F71nqJE,7458
77
77
  tactus/primitives/handles.py,sha256=su7w61BO8cgNl-z-a7By-J6P8PxEuu4-db7fu8fMoiQ,13260
78
- tactus/primitives/host.py,sha256=NLgzAicqnfvZ7a2s2jBeM6iW4PJhM-QDmnYrM2RMAjI,3456
78
+ tactus/primitives/host.py,sha256=yjNc5nKLfGCBNu8nR0c49N50hhQ7MxfDsHbjKvMH010,3557
79
79
  tactus/primitives/human.py,sha256=YTxw0LXtTL_hxm2G1fhNxR9Qa7n9MJGG9OD9WGRTnp0,36507
80
80
  tactus/primitives/json.py,sha256=-uFwrr9y2kfFLy3D7q8oLAgM1p3mUmfIL-DX36TA6sQ,5771
81
81
  tactus/primitives/log.py,sha256=LFHIFv8157wtEJF-qEqhLDKwh914oF0jiI257JUUyd0,6491
82
- tactus/primitives/message_history.py,sha256=2EnWPBLxzA8ufL37jMNfRzxoYANlpZNZ7hUY3YDzpfI,14857
83
- tactus/primitives/model.py,sha256=KBdxJ72AwRWGBUAt3ToA-ooAS7L7whINTXuywmXbQXM,5266
84
- tactus/primitives/procedure.py,sha256=_C5eNlx_sowyuz4LtP9o-9vba4LoS--j7pagYdLv_Bg,20012
82
+ tactus/primitives/message_history.py,sha256=xPL5PKfkC-UFjNK8-0iZTWEnVzriVIUFvEjTknZecFc,14782
83
+ tactus/primitives/model.py,sha256=9b5RTE_NvrR-rHf7SFdFac8zsL77OjW4Sv8o0bed5zo,5269
84
+ tactus/primitives/procedure.py,sha256=Rp57JRdfzsv24Jr85Vpd9wlguwbAeFP6ooWE8IsDpTM,20178
85
85
  tactus/primitives/procedure_callable.py,sha256=vGNFaATxkJqusFPJ6KekCiXWiU5pKvPaoxuAvIjeqKw,14167
86
86
  tactus/primitives/retry.py,sha256=zhGSZX3VPWcWdGjhf_-uFAksq_APf50wtO9AVelXKKc,5428
87
- tactus/primitives/session.py,sha256=g72vfxYXsAeGjVSXoDS2AHQyDD0paj7GrucjeHxpwWs,4883
88
- tactus/primitives/state.py,sha256=l6uKexHsnkI_agzSnw0zYm_Cuh-9sMd4vimNsVCzofM,6205
87
+ tactus/primitives/session.py,sha256=w7sV6atIZVPuw94uK1-0DSFwaMaesLywrB8HAXfzHxE,5025
88
+ tactus/primitives/state.py,sha256=LabH4VMElBwnxOrRNW71Fkuay1ugU0GVqT3PaGxoqos,6224
89
89
  tactus/primitives/step.py,sha256=edSKLFLAHyJuJV894K0frPOUefd1R7vXoI8-BTrNUOI,7065
90
90
  tactus/primitives/system.py,sha256=gDMvxYDmPrn9dMCYBLfOTNMWIOscX_CVHkPkcT2iCTw,3630
91
91
  tactus/primitives/tool.py,sha256=2nv8torlSv_cLxM402HmFxOLGXjM1ZQjbmjrZl72Z5w,12829
92
- tactus/primitives/tool_handle.py,sha256=sHgcxwi5UNql2Cf_zI6xn2vM4olS-kZZN09ZDBOFCtA,10044
92
+ tactus/primitives/tool_handle.py,sha256=sSrUP5SGXmTy65_bTuEnD8Ok3FZbduszHSdns8bEU9k,10011
93
93
  tactus/primitives/toolset.py,sha256=omlU2RQrdWCzXvjFnM_LAQJ7Bgw1YiHL1litk9ly9eQ,7868
94
94
  tactus/protocols/__init__.py,sha256=exFwWenyU0LXjqK5Ong3abY00xVYIHPu80-zLReCfxQ,1341
95
95
  tactus/protocols/chat_recorder.py,sha256=dswAHpwlxq30GTGKT-ktCIKCaixn5izEMSb7sbiZARE,2074
@@ -109,7 +109,7 @@ tactus/providers/google.py,sha256=wgZ3eiQif1rq1T8BK5V2kL_QVCmqBQZuWLz37y9cxOQ,31
109
109
  tactus/providers/openai.py,sha256=3qSXfdELTHdU7vuRSxQrtnfNctt0HhrePOLFj3YlViA,2692
110
110
  tactus/sandbox/__init__.py,sha256=UCBvPD63szvSdwSzpznLW-cnJOgGkVHiKcmJtsAmnuA,1424
111
111
  tactus/sandbox/config.py,sha256=43FINPDE0k1nL56IKxI29dEw7pi-Arp8qtZYtdkLvec,5813
112
- tactus/sandbox/container_runner.py,sha256=-0iac9qwjZKsj1ID8wGYf2R27_OByiuraG4cysyyZfw,47267
112
+ tactus/sandbox/container_runner.py,sha256=e82dMnBbIDh02eU2JIMAa7IGgcmTjR5E3-vx3LVskJk,47544
113
113
  tactus/sandbox/docker_manager.py,sha256=2oWu7_E6l4KNhGFt9gPAjiKrIqjhY9_YM71U72_OI3c,14793
114
114
  tactus/sandbox/entrypoint.py,sha256=AYwqPB19vn9pzHMa8eQ7PN7U71z4kHIhzoa3NAyNCCE,8121
115
115
  tactus/sandbox/protocol.py,sha256=8EOSxB7qASYMalnI_L-0Co_o9Te7Y_SHYcHtTAYkmXc,6210
@@ -161,32 +161,32 @@ tactus/stdlib/tac/tactus/tools/log.tac,sha256=sNGYUSkehvKmrgag1b8rHpDME09MQbL4qk
161
161
  tactus/testing/README.md,sha256=fUumwbVC56d7ZB2srAKSb7XxQ0vHFKPbZz70Zv59KRY,6840
162
162
  tactus/testing/__init__.py,sha256=M5b3r9E0vkltfhqfIOSASk-qp6fDnm3FBxc9dDBPUhU,1540
163
163
  tactus/testing/behave_integration.py,sha256=RuHKC5V5-wfbVq43ksZVGyyIjzxMBR7VveJo-JSAY_o,22025
164
- tactus/testing/context.py,sha256=YNCSUnBYYn2f4z4PyKKaIAYqturKJGhllu2ivVm0L48,18552
164
+ tactus/testing/context.py,sha256=dpAm19mmbEp1lke471xHRCsTIwc1mCRehneyklnUW2I,18570
165
165
  tactus/testing/eval_models.py,sha256=UI3geZp4vilbn3Jt4Mjy95luRVON3T4sGnAwlpb7jLo,3540
166
- tactus/testing/evaluation_runner.py,sha256=CFQUZxMJf1BOcIOX6fkLdV6S7WLTlFVc-FuPxkpiHkI,6907
166
+ tactus/testing/evaluation_runner.py,sha256=Mu-wVDlF9BwA8aOxAdMer8E7-VfZPBgyI09R6HMHmRg,6989
167
167
  tactus/testing/evaluators.py,sha256=NW_LHhssdMRYCCoYmtJIsst-DEsk8iBVebsxRyHx7I0,20751
168
168
  tactus/testing/events.py,sha256=7YNLoOKF1QT_0ZWVC0H7yjS-yIIkUdqDj54JjP8Ldy4,2694
169
169
  tactus/testing/gherkin_parser.py,sha256=nqCwqynzWCISqckPbcqteyrukYKSFq7ZkBb5qn9p9Sg,4093
170
170
  tactus/testing/mock_agent.py,sha256=z8AAZkD_lj59fBW7wRD0ahmw7aHytH43nqxH-9DGwcs,10801
171
171
  tactus/testing/mock_dependencies.py,sha256=saGukLaq46uzz995TYcNDgz7LONxUgMJNkd8DXGUNP0,6970
172
- tactus/testing/mock_hitl.py,sha256=c5pe7j7ldiyC4nT19Moe_mJLLJT1nHMBMSDZQYgB8HE,5585
172
+ tactus/testing/mock_hitl.py,sha256=EM9qlLtryVCMUSfv9Ur7uALqeCmE1V7kE4MBzpLJrNE,5604
173
173
  tactus/testing/mock_registry.py,sha256=9PFlUuUxjCgZUR1a7wnxqwLiC_gpyO0vuUl1H5dDieI,5699
174
174
  tactus/testing/mock_tools.py,sha256=huPkE5zJXPyZqpRwNisoXPS6XklZFY0_ut2jvviyEbY,4008
175
- tactus/testing/models.py,sha256=8BG1XNUD5WXR6urUhicZBMy0aLQfvva9CEsuZu8LN6c,3257
175
+ tactus/testing/models.py,sha256=rQnx3Z4xSeTQYzAhuYAqUTCm2elles4nx0EllpoMSBA,3279
176
176
  tactus/testing/pydantic_eval_runner.py,sha256=dGN3ix4U6TwAMdWjDmycc3kq3fyEZImSTor5WrXK8wQ,17842
177
- tactus/testing/test_runner.py,sha256=w6is1xDXIGr3yrvaeJ-jbPIk2ClItHuVx9Rmh2Vskck,19171
177
+ tactus/testing/test_runner.py,sha256=VfoKN9_3YBJfZ-CY5V1d2JdaO_z3rNGPp3Q85BuWYp4,19265
178
178
  tactus/testing/steps/__init__.py,sha256=oitGDW-M3uckHk8ySLnjCHi6VjCr6L4MDT2_uPYgR-8,257
179
- tactus/testing/steps/builtin.py,sha256=O3xUkIcbQsEC2sZxchd6nJob1JjKUNoD7MjjxkdfY5s,31662
179
+ tactus/testing/steps/builtin.py,sha256=wPNZOCOmz6eIb2DNFGOa-GaSLCK5Rr9ulO6_BxHepNA,31675
180
180
  tactus/testing/steps/custom.py,sha256=00RvNlyIGz4ABv2AbkdrkjnfPjPCBO18DOZ89sMxkZY,4410
181
181
  tactus/testing/steps/registry.py,sha256=71xN-4B9nyBjeYNFZlOyKCjBBl1Ad9Oj6jdLxHA8baM,2102
182
182
  tactus/tracing/__init__.py,sha256=32Uc7ACuxBfstNh7t2A4q2mub-PGR_zB-02mNH5f_0s,142
183
183
  tactus/tracing/trace_manager.py,sha256=PNCEztpza-P6-L2a4gWZS_0Z7yOvaV9V2BEsK9csZWk,12922
184
184
  tactus/utils/__init__.py,sha256=8TN2bqJybOVlf1Wx5fsV0cLjue5UC4EhL0K1TVzBzIQ,34
185
- tactus/utils/asyncio_helpers.py,sha256=kYt0Go3_0OfipsFdjLha8I2rLZL1hNhPaLrEF4jnnzY,792
185
+ tactus/utils/asyncio_helpers.py,sha256=kfjY_wagWDhjqL6DK2vbi81TD8ezGx47LLcL8frj0ak,856
186
186
  tactus/utils/cost_calculator.py,sha256=cZFKlapBxeIDyMDjd0Zjqczrnx_eggf0B24h0bVmOYo,2524
187
187
  tactus/utils/model_pricing.py,sha256=ggfPJK6RSq8j8YcBXWrnNoujrhP-MkPhexOUsCMwiPY,5051
188
188
  tactus/utils/safe_file_library.py,sha256=_SfbdyoVy6rm-DMhQg3Iau7M4QJLr7UtlcsKUZE4Rns,17855
189
- tactus/utils/safe_libraries.py,sha256=3wg88N7HGLTuYvi4OtQRRlDzGX49_PDRJmfOJHhv0cI,7992
189
+ tactus/utils/safe_libraries.py,sha256=5PGfrkCoj4QJQQrAiR9KGFTH9kyoNZJRc5WEUFDwgbU,8011
190
190
  tactus/validation/LuaLexerBase.py,sha256=b2Q3kiWFAle-MY4GaUCsewJh6L9oGKYcjGkNCbkRPmk,1683
191
191
  tactus/validation/LuaParserBase.py,sha256=o3klCIY0ANkVCU0VHml0IOYE4CdEledeoyoIAPxV58k,528
192
192
  tactus/validation/README.md,sha256=AS6vr4blY7IKWRsj4wuvWBHVMTc5fto7IgNmv-Rjkdo,5366
@@ -206,8 +206,8 @@ tactus/validation/generated/LuaParserVisitor.py,sha256=ageKSmHPxnO3jBS2fBtkmYBOd
206
206
  tactus/validation/generated/__init__.py,sha256=5gWlwRI0UvmHw2fnBpj_IG6N8oZeabr5tbj1AODDvjc,196
207
207
  tactus/validation/grammar/LuaLexer.g4,sha256=t2MXiTCr127RWAyQGvamkcU_m4veqPzSuHUtAKwalw4,2771
208
208
  tactus/validation/grammar/LuaParser.g4,sha256=ceZenb90BdiZmVdOxMGj9qJk3QbbWVZe5HUqPgoePfY,3202
209
- tactus-0.35.1.dist-info/METADATA,sha256=F7RHcNpRlPNCIu6CNRtE0JFjIhfEcLrDFwRx-WcikNg,60097
210
- tactus-0.35.1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
211
- tactus-0.35.1.dist-info/entry_points.txt,sha256=vWseqty8m3z-Worje0IYxlioMjPDCoSsm0AtY4GghBY,47
212
- tactus-0.35.1.dist-info/licenses/LICENSE,sha256=ivohBcAIYnaLPQ-lKEeCXSMvQUVISpQfKyxHBHoa4GA,1066
213
- tactus-0.35.1.dist-info/RECORD,,
209
+ tactus-0.37.0.dist-info/METADATA,sha256=xBYDiQisGYIIxml5-L7XwtvVQ1fN_07OaFQ24tmYWQI,60372
210
+ tactus-0.37.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
211
+ tactus-0.37.0.dist-info/entry_points.txt,sha256=vWseqty8m3z-Worje0IYxlioMjPDCoSsm0AtY4GghBY,47
212
+ tactus-0.37.0.dist-info/licenses/LICENSE,sha256=ivohBcAIYnaLPQ-lKEeCXSMvQUVISpQfKyxHBHoa4GA,1066
213
+ tactus-0.37.0.dist-info/RECORD,,