tactus 0.30.0__tar.gz → 0.31.0__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 (606) hide show
  1. {tactus-0.30.0 → tactus-0.31.0}/CHANGELOG.md +13 -0
  2. {tactus-0.30.0 → tactus-0.31.0}/IMPLEMENTATION.md +0 -24
  3. {tactus-0.30.0 → tactus-0.31.0}/PKG-INFO +9 -11
  4. {tactus-0.30.0 → tactus-0.31.0}/README.md +8 -10
  5. {tactus-0.30.0 → tactus-0.31.0}/SPECIFICATION.md +28 -133
  6. tactus-0.31.0/TECHNICAL_DEBT.md +156 -0
  7. {tactus-0.30.0 → tactus-0.31.0}/docs/BDD_TESTING.md +28 -33
  8. {tactus-0.30.0 → tactus-0.31.0}/docs/DURABILITY.md +3 -3
  9. {tactus-0.30.0 → tactus-0.31.0}/docs/TOOLS.md +8 -7
  10. {tactus-0.30.0 → tactus-0.31.0}/docs/TOOL_ROADMAP.md +6 -6
  11. {tactus-0.30.0 → tactus-0.31.0}/examples/.tactus/config.yml +6 -6
  12. tactus-0.31.0/examples/01-basics-hello-world.tac +18 -0
  13. tactus-0.31.0/examples/02-basics-simple-logic.tac +56 -0
  14. {tactus-0.30.0 → tactus-0.31.0}/examples/03-basics-parameters.tac +2 -2
  15. {tactus-0.30.0 → tactus-0.31.0}/examples/04-basics-simple-agent.tac +3 -11
  16. {tactus-0.30.0 → tactus-0.31.0}/examples/05-basics-multi-model.tac +15 -19
  17. {tactus-0.30.0 → tactus-0.31.0}/examples/06-basics-streaming.tac +13 -8
  18. {tactus-0.30.0 → tactus-0.31.0}/examples/07-basics-bedrock.tac +6 -14
  19. {tactus-0.30.0 → tactus-0.31.0}/examples/08-basics-models.tac +26 -54
  20. {tactus-0.30.0 → tactus-0.31.0}/examples/09-basics-google-gemini.tac +9 -21
  21. {tactus-0.30.0 → tactus-0.31.0}/examples/10-feature-state.tac +2 -2
  22. {tactus-0.30.0 → tactus-0.31.0}/examples/11-feature-message-history.tac +2 -9
  23. {tactus-0.30.0 → tactus-0.31.0}/examples/12-feature-structured-output.tac +8 -15
  24. {tactus-0.30.0 → tactus-0.31.0}/examples/13-feature-session.tac +2 -9
  25. {tactus-0.30.0 → tactus-0.31.0}/examples/14-feature-per-turn-tools-simple.tac +18 -12
  26. {tactus-0.30.0 → tactus-0.31.0}/examples/14-feature-per-turn-tools.tac +10 -19
  27. {tactus-0.30.0 → tactus-0.31.0}/examples/15-feature-local-tools.tac +23 -16
  28. {tactus-0.30.0 → tactus-0.31.0}/examples/16-feature-toolsets-advanced.tac +30 -53
  29. {tactus-0.30.0 → tactus-0.31.0}/examples/17-feature-toolsets-dsl.tac +6 -15
  30. {tactus-0.30.0 → tactus-0.31.0}/examples/18-feature-lua-tools-individual.tac +8 -16
  31. {tactus-0.30.0 → tactus-0.31.0}/examples/18-feature-lua-tools-inline.tac +8 -18
  32. {tactus-0.30.0 → tactus-0.31.0}/examples/18-feature-lua-tools-toolset.tac +8 -15
  33. {tactus-0.30.0 → tactus-0.31.0}/examples/19-feature-direct-tool-calls.tac +3 -13
  34. {tactus-0.30.0 → tactus-0.31.0}/examples/20-bdd-complete.tac +33 -57
  35. tactus-0.30.0/examples/21-bdd-passing.tac.bak2 → tactus-0.31.0/examples/21-bdd-passing.tac +27 -39
  36. tactus-0.31.0/examples/22-bdd-fuzzy-matching.tac +32 -0
  37. {tactus-0.30.0 → tactus-0.31.0}/examples/30-eval-simple.tac +14 -3
  38. {tactus-0.30.0 → tactus-0.31.0}/examples/31-eval-demo.tac +4 -12
  39. {tactus-0.30.0 → tactus-0.31.0}/examples/32-eval-success-rate.tac +4 -12
  40. {tactus-0.30.0 → tactus-0.31.0}/examples/33-eval-thresholds.tac +4 -12
  41. {tactus-0.30.0 → tactus-0.31.0}/examples/34-eval-dataset.tac +5 -13
  42. {tactus-0.30.0 → tactus-0.31.0}/examples/35-eval-trace.tac +7 -19
  43. {tactus-0.30.0 → tactus-0.31.0}/examples/36-eval-advanced.tac +5 -13
  44. {tactus-0.30.0 → tactus-0.31.0}/examples/37-eval-comprehensive.tac +6 -14
  45. {tactus-0.30.0 → tactus-0.31.0}/examples/39-model-simple.tac +1 -1
  46. {tactus-0.30.0 → tactus-0.31.0}/examples/40-mcp-test.tac +22 -8
  47. {tactus-0.30.0 → tactus-0.31.0}/examples/40-model-text-classifier.tac +7 -17
  48. {tactus-0.30.0 → tactus-0.31.0}/examples/41-mcp-simple.tac +21 -7
  49. {tactus-0.30.0 → tactus-0.31.0}/examples/41-model-pytorch.tac +7 -17
  50. {tactus-0.30.0 → tactus-0.31.0}/examples/43-sub-procedure-simple.tac +1 -1
  51. {tactus-0.30.0 → tactus-0.31.0}/examples/44-sub-procedure-composition.tac +5 -13
  52. {tactus-0.30.0 → tactus-0.31.0}/examples/45-sub-procedure-recursive.tac +1 -1
  53. {tactus-0.30.0 → tactus-0.31.0}/examples/46-checkpoint-explicit.tac +1 -1
  54. {tactus-0.30.0 → tactus-0.31.0}/examples/47-checkpoint-expensive-ops.tac +1 -1
  55. {tactus-0.30.0 → tactus-0.31.0}/examples/48-script-mode-simple.tac +11 -1
  56. {tactus-0.30.0 → tactus-0.31.0}/examples/50-inputs-showcase.tac +12 -1
  57. {tactus-0.30.0 → tactus-0.31.0}/examples/51-inputs-calculator.tac +13 -1
  58. {tactus-0.30.0 → tactus-0.31.0}/examples/52-file-io-basics.tac +1 -1
  59. {tactus-0.30.0 → tactus-0.31.0}/examples/53-tsv-file-io.tac +1 -1
  60. {tactus-0.30.0 → tactus-0.31.0}/examples/54-json-file-io.tac +1 -1
  61. {tactus-0.30.0 → tactus-0.31.0}/examples/55-parquet-file-io.tac +1 -1
  62. {tactus-0.30.0 → tactus-0.31.0}/examples/56-hdf5-file-io.tac +1 -1
  63. {tactus-0.30.0 → tactus-0.31.0}/examples/57-excel-file-io.tac +1 -1
  64. {tactus-0.30.0 → tactus-0.31.0}/examples/58-text-file-io.tac +1 -1
  65. {tactus-0.30.0 → tactus-0.31.0}/examples/60-tool-sources.tac +6 -14
  66. {tactus-0.30.0 → tactus-0.31.0}/examples/61-inline-toolset-lua.tac +8 -16
  67. {tactus-0.30.0 → tactus-0.31.0}/examples/62-mcp-toolset-by-server.tac +20 -14
  68. {tactus-0.30.0 → tactus-0.31.0}/examples/63-toolset-import-from-file.tac +8 -16
  69. {tactus-0.30.0 → tactus-0.31.0}/examples/64-require-modules.tac +1 -1
  70. {tactus-0.30.0 → tactus-0.31.0}/examples/65-optional-state-demo.tac +4 -12
  71. {tactus-0.30.0 → tactus-0.31.0}/examples/66-host-tools-via-broker.tac +1 -1
  72. {tactus-0.30.0 → tactus-0.31.0}/examples/67-host-tool-source.tac +1 -1
  73. {tactus-0.30.0 → tactus-0.31.0}/examples/70-mocking-static.tac +2 -2
  74. {tactus-0.30.0 → tactus-0.31.0}/examples/71-mocking-temporal.tac +1 -1
  75. {tactus-0.30.0 → tactus-0.31.0}/examples/72-mocking-conditional.tac +2 -2
  76. tactus-0.31.0/examples/99-misc-test-loading.tac +30 -0
  77. {tactus-0.30.0 → tactus-0.31.0}/examples/README.md +11 -0
  78. tactus-0.31.0/examples/test-raw-module.tac +20 -0
  79. tactus-0.31.0/examples/test-raw-streaming.tac +20 -0
  80. {tactus-0.30.0 → tactus-0.31.0}/examples/with_dependencies/simple_http_test.tac +1 -1
  81. {tactus-0.30.0 → tactus-0.31.0}/examples/with_dependencies/time_lookup.tac +4 -4
  82. {tactus-0.30.0 → tactus-0.31.0}/features/17_lua_dsl_validation.feature +0 -1
  83. {tactus-0.30.0 → tactus-0.31.0}/features/20_parameters.feature +0 -1
  84. {tactus-0.30.0 → tactus-0.31.0}/features/21_outputs.feature +0 -1
  85. {tactus-0.30.0 → tactus-0.31.0}/features/23_prompts.feature +0 -1
  86. {tactus-0.30.0 → tactus-0.31.0}/features/24_bdd_specifications.feature +7 -16
  87. {tactus-0.30.0 → tactus-0.31.0}/features/25_bdd_custom_steps.feature +3 -3
  88. {tactus-0.30.0 → tactus-0.31.0}/features/26_bdd_evaluation.feature +4 -4
  89. {tactus-0.30.0 → tactus-0.31.0}/features/30_session_filters.feature +4 -4
  90. {tactus-0.30.0 → tactus-0.31.0}/features/documentation/Lua DSL/README.md +3 -13
  91. {tactus-0.30.0 → tactus-0.31.0}/features/steps/example_procedures_steps.py +4 -0
  92. {tactus-0.30.0 → tactus-0.31.0}/features/steps/support/__init__.py +0 -2
  93. {tactus-0.30.0 → tactus-0.31.0}/features/steps/support/harnesses.py +0 -100
  94. {tactus-0.30.0 → tactus-0.31.0}/pyproject.toml +1 -1
  95. tactus-0.31.0/scripts/run_precommit_suite.sh +60 -0
  96. tactus-0.31.0/scripts/timeout.py +49 -0
  97. {tactus-0.30.0 → tactus-0.31.0}/tactus/__init__.py +1 -1
  98. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/lua_tools.py +23 -1
  99. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/mcp_manager.py +62 -35
  100. {tactus-0.30.0 → tactus-0.31.0}/tactus/broker/server.py +314 -0
  101. {tactus-0.30.0 → tactus-0.31.0}/tactus/cli/app.py +11 -1
  102. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/dsl_stubs.py +138 -41
  103. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/output_validator.py +69 -15
  104. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/registry.py +13 -25
  105. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/runtime.py +208 -69
  106. {tactus-0.30.0 → tactus-0.31.0}/tactus/dspy/agent.py +87 -30
  107. {tactus-0.30.0 → tactus-0.31.0}/tactus/ide/server.py +0 -10
  108. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/__init__.py +0 -2
  109. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/handles.py +8 -3
  110. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/procedure_callable.py +36 -0
  111. {tactus-0.30.0 → tactus-0.31.0}/tactus/protocols/config.py +0 -5
  112. {tactus-0.30.0 → tactus-0.31.0}/tactus/protocols/result.py +3 -3
  113. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/tac/tactus/tools/done.tac +1 -1
  114. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/tac/tactus/tools/log.tac +1 -1
  115. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/README.md +1 -12
  116. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/behave_integration.py +12 -2
  117. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/context.py +156 -46
  118. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/mock_agent.py +43 -8
  119. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/steps/builtin.py +264 -54
  120. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/test_runner.py +6 -0
  121. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/semantic_visitor.py +19 -11
  122. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/BUILD_GUIDE.md +10 -1
  123. {tactus-0.30.0 → tactus-0.31.0}/tests/core/test_script_mode.py +6 -2
  124. {tactus-0.30.0 → tactus-0.31.0}/tests/dspy/test_mock_field_normalization.py +10 -31
  125. tactus-0.31.0/tests/fixtures/brave_search_mcp_server.py +36 -0
  126. tactus-0.31.0/tests/fixtures/filesystem_mcp_server.py +38 -0
  127. {tactus-0.30.0 → tactus-0.31.0}/tests/test_mcp_integration.py +1 -1
  128. {tactus-0.30.0 → tactus-0.31.0}/tests/testing/test_all_examples.py +55 -22
  129. {tactus-0.30.0 → tactus-0.31.0}/tests/testing/test_e2e.py +18 -22
  130. {tactus-0.30.0 → tactus-0.31.0}/tests/testing/test_integration.py +2 -3
  131. {tactus-0.30.0 → tactus-0.31.0}/tests/testing/test_runtime_integration.py +17 -23
  132. tactus-0.30.0/TECHNICAL_DEBT.md +0 -262
  133. tactus-0.30.0/examples/01-basics-hello-world.tac +0 -15
  134. tactus-0.30.0/examples/02-basics-simple-logic.tac +0 -69
  135. tactus-0.30.0/examples/20-bdd-complete.tac.bak2 +0 -122
  136. tactus-0.30.0/examples/21-bdd-passing.tac +0 -102
  137. tactus-0.30.0/examples/35-eval-trace.tac.bak2 +0 -132
  138. tactus-0.30.0/examples/37-eval-comprehensive.tac.bak2 +0 -129
  139. tactus-0.30.0/examples/99-misc-test-loading.tac +0 -20
  140. tactus-0.30.0/examples/test-raw-module.tac +0 -11
  141. tactus-0.30.0/examples/test-raw-streaming.tac +0 -11
  142. tactus-0.30.0/features/14_stage_and_step_tracking.feature +0 -73
  143. tactus-0.30.0/features/steps/stage_tracking_steps.py +0 -282
  144. tactus-0.30.0/tactus/primitives/stage.py +0 -202
  145. {tactus-0.30.0 → tactus-0.31.0}/.claude/agents.md +0 -0
  146. {tactus-0.30.0 → tactus-0.31.0}/.github/workflows/release.yml +0 -0
  147. {tactus-0.30.0 → tactus-0.31.0}/.gitignore +0 -0
  148. {tactus-0.30.0 → tactus-0.31.0}/.tactus/config.yml.example +0 -0
  149. {tactus-0.30.0 → tactus-0.31.0}/AGENTS.md +0 -0
  150. {tactus-0.30.0 → tactus-0.31.0}/LICENSE +0 -0
  151. {tactus-0.30.0 → tactus-0.31.0}/Makefile +0 -0
  152. {tactus-0.30.0 → tactus-0.31.0}/behave.ini +0 -0
  153. {tactus-0.30.0 → tactus-0.31.0}/docs/AGENTS.md +0 -0
  154. {tactus-0.30.0 → tactus-0.31.0}/docs/CONFIGURATION.md +0 -0
  155. {tactus-0.30.0 → tactus-0.31.0}/docs/FILE_IO.md +0 -0
  156. {tactus-0.30.0 → tactus-0.31.0}/docs/SANDBOXING.md +0 -0
  157. {tactus-0.30.0 → tactus-0.31.0}/docs/STREAMING.md +0 -0
  158. {tactus-0.30.0 → tactus-0.31.0}/docs/development-mode.md +0 -0
  159. {tactus-0.30.0 → tactus-0.31.0}/examples/34-eval-dataset.jsonl +0 -0
  160. {tactus-0.30.0 → tactus-0.31.0}/examples/app_config.ini +0 -0
  161. {tactus-0.30.0 → tactus-0.31.0}/examples/data/sample.csv +0 -0
  162. {tactus-0.30.0 → tactus-0.31.0}/examples/demo_output.json +0 -0
  163. {tactus-0.30.0 → tactus-0.31.0}/examples/helpers/math_module.tac +0 -0
  164. {tactus-0.30.0 → tactus-0.31.0}/examples/helpers/product.tac +0 -0
  165. {tactus-0.30.0 → tactus-0.31.0}/examples/helpers/string_module.tac +0 -0
  166. {tactus-0.30.0 → tactus-0.31.0}/examples/helpers/sum.tac +0 -0
  167. {tactus-0.30.0 → tactus-0.31.0}/examples/helpers/text_tools.tac +0 -0
  168. {tactus-0.30.0 → tactus-0.31.0}/examples/inventory_summary.tsv +0 -0
  169. {tactus-0.30.0 → tactus-0.31.0}/examples/mock-config.json +0 -0
  170. {tactus-0.30.0 → tactus-0.31.0}/examples/models/README.md +0 -0
  171. {tactus-0.30.0 → tactus-0.31.0}/examples/models/create_sentiment_model.py +0 -0
  172. {tactus-0.30.0 → tactus-0.31.0}/examples/output_summary.txt +0 -0
  173. {tactus-0.30.0 → tactus-0.31.0}/examples/tools/calculations.py +0 -0
  174. {tactus-0.30.0 → tactus-0.31.0}/examples/tools/data_analysis.py +0 -0
  175. {tactus-0.30.0 → tactus-0.31.0}/examples/tools/search.py +0 -0
  176. {tactus-0.30.0 → tactus-0.31.0}/examples/with_dependencies/README.md +0 -0
  177. {tactus-0.30.0 → tactus-0.31.0}/features/01_state_management.feature +0 -0
  178. {tactus-0.30.0 → tactus-0.31.0}/features/02_checkpointing.feature +0 -0
  179. {tactus-0.30.0 → tactus-0.31.0}/features/03_human_in_the_loop.feature +0 -0
  180. {tactus-0.30.0 → tactus-0.31.0}/features/04_control_flow.feature +0 -0
  181. {tactus-0.30.0 → tactus-0.31.0}/features/05_tool_integration.feature +0 -0
  182. {tactus-0.30.0 → tactus-0.31.0}/features/06_retry_logic.feature +0 -0
  183. {tactus-0.30.0 → tactus-0.31.0}/features/07_file_operations.feature +0 -0
  184. {tactus-0.30.0 → tactus-0.31.0}/features/08_agent_primitives.feature +0 -0
  185. {tactus-0.30.0 → tactus-0.31.0}/features/09_workflow_execution.feature +0 -0
  186. {tactus-0.30.0 → tactus-0.31.0}/features/10_lua_integration.feature +0 -0
  187. {tactus-0.30.0 → tactus-0.31.0}/features/11_storage_backends.feature +0 -0
  188. {tactus-0.30.0 → tactus-0.31.0}/features/12_json_operations.feature +0 -0
  189. {tactus-0.30.0 → tactus-0.31.0}/features/13_logging.feature +0 -0
  190. {tactus-0.30.0 → tactus-0.31.0}/features/15_procedure_calls.feature +0 -0
  191. {tactus-0.30.0 → tactus-0.31.0}/features/16_session_management.feature +0 -0
  192. {tactus-0.30.0 → tactus-0.31.0}/features/18_example_procedures.feature +0 -0
  193. {tactus-0.30.0 → tactus-0.31.0}/features/19_ide_server.feature +0 -0
  194. {tactus-0.30.0 → tactus-0.31.0}/features/27_default_settings.feature +0 -0
  195. {tactus-0.30.0 → tactus-0.31.0}/features/28_custom_prompts.feature +0 -0
  196. {tactus-0.30.0 → tactus-0.31.0}/features/29_execution_settings.feature +0 -0
  197. {tactus-0.30.0 → tactus-0.31.0}/features/31_matchers.feature +0 -0
  198. {tactus-0.30.0 → tactus-0.31.0}/features/32_result_object.feature +0 -0
  199. {tactus-0.30.0 → tactus-0.31.0}/features/33_output_type.feature +0 -0
  200. {tactus-0.30.0 → tactus-0.31.0}/features/42_model_primitive.feature +0 -0
  201. {tactus-0.30.0 → tactus-0.31.0}/features/43_sub_procedure_checkpointing.feature +0 -0
  202. {tactus-0.30.0 → tactus-0.31.0}/features/46_explicit_checkpoint.feature +0 -0
  203. {tactus-0.30.0 → tactus-0.31.0}/features/48_script_mode.feature +0 -0
  204. {tactus-0.30.0 → tactus-0.31.0}/features/51_dspy_lm_config.feature +0 -0
  205. {tactus-0.30.0 → tactus-0.31.0}/features/52_dspy_signature.feature +0 -0
  206. {tactus-0.30.0 → tactus-0.31.0}/features/53_dspy_module.feature +0 -0
  207. {tactus-0.30.0 → tactus-0.31.0}/features/54_dspy_history.feature +0 -0
  208. {tactus-0.30.0 → tactus-0.31.0}/features/55_dspy_prediction.feature +0 -0
  209. {tactus-0.30.0 → tactus-0.31.0}/features/56_dspy_agent.feature +0 -0
  210. {tactus-0.30.0 → tactus-0.31.0}/features/57_chat_assistant.feature +0 -0
  211. {tactus-0.30.0 → tactus-0.31.0}/features/60_formatting.feature +0 -0
  212. {tactus-0.30.0 → tactus-0.31.0}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
  213. {tactus-0.30.0 → tactus-0.31.0}/features/environment.py +0 -0
  214. {tactus-0.30.0 → tactus-0.31.0}/features/steps/agent_primitives_steps.py +0 -0
  215. {tactus-0.30.0 → tactus-0.31.0}/features/steps/chat_assistant_steps.py +0 -0
  216. {tactus-0.30.0 → tactus-0.31.0}/features/steps/checkpointing_steps.py +0 -0
  217. {tactus-0.30.0 → tactus-0.31.0}/features/steps/control_flow_steps.py +0 -0
  218. {tactus-0.30.0 → tactus-0.31.0}/features/steps/dspy_agent_steps.py +0 -0
  219. {tactus-0.30.0 → tactus-0.31.0}/features/steps/dspy_history_steps.py +0 -0
  220. {tactus-0.30.0 → tactus-0.31.0}/features/steps/dspy_lm_steps.py +0 -0
  221. {tactus-0.30.0 → tactus-0.31.0}/features/steps/dspy_module_steps.py +0 -0
  222. {tactus-0.30.0 → tactus-0.31.0}/features/steps/dspy_prediction_steps.py +0 -0
  223. {tactus-0.30.0 → tactus-0.31.0}/features/steps/dspy_signature_steps.py +0 -0
  224. {tactus-0.30.0 → tactus-0.31.0}/features/steps/file_operations_steps.py +0 -0
  225. {tactus-0.30.0 → tactus-0.31.0}/features/steps/formatting_steps.py +0 -0
  226. {tactus-0.30.0 → tactus-0.31.0}/features/steps/human_in_the_loop_steps.py +0 -0
  227. {tactus-0.30.0 → tactus-0.31.0}/features/steps/ide_server_steps.py +0 -0
  228. {tactus-0.30.0 → tactus-0.31.0}/features/steps/json_operations_steps.py +0 -0
  229. {tactus-0.30.0 → tactus-0.31.0}/features/steps/logging_steps.py +0 -0
  230. {tactus-0.30.0 → tactus-0.31.0}/features/steps/lua_dsl_validation_steps.py +0 -0
  231. {tactus-0.30.0 → tactus-0.31.0}/features/steps/lua_integration_steps.py +0 -0
  232. {tactus-0.30.0 → tactus-0.31.0}/features/steps/mocking_steps.py +0 -0
  233. {tactus-0.30.0 → tactus-0.31.0}/features/steps/procedure_calls_steps.py +0 -0
  234. {tactus-0.30.0 → tactus-0.31.0}/features/steps/result_and_output_steps.py +0 -0
  235. {tactus-0.30.0 → tactus-0.31.0}/features/steps/retry_logic_steps.py +0 -0
  236. {tactus-0.30.0 → tactus-0.31.0}/features/steps/session_management_steps.py +0 -0
  237. {tactus-0.30.0 → tactus-0.31.0}/features/steps/state_management_steps.py +0 -0
  238. {tactus-0.30.0 → tactus-0.31.0}/features/steps/storage_backend_steps.py +0 -0
  239. {tactus-0.30.0 → tactus-0.31.0}/features/steps/tool_integration_steps.py +0 -0
  240. {tactus-0.30.0 → tactus-0.31.0}/features/steps/workflow_execution_steps.py +0 -0
  241. {tactus-0.30.0 → tactus-0.31.0}/planning/BROKER_AND_TOOL_RUNNERS.md +0 -0
  242. {tactus-0.30.0 → tactus-0.31.0}/planning/FORMATTER.md +0 -0
  243. {tactus-0.30.0 → tactus-0.31.0}/scripts/audit_examples_mocking.py +0 -0
  244. {tactus-0.30.0 → tactus-0.31.0}/scripts/convert_examples.py +0 -0
  245. {tactus-0.30.0 → tactus-0.31.0}/start-web-ide.sh +0 -0
  246. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/__init__.py +0 -0
  247. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/broker_log.py +0 -0
  248. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/cli_hitl.py +0 -0
  249. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/cli_log.py +0 -0
  250. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/cost_collector_log.py +0 -0
  251. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/file_storage.py +0 -0
  252. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/http_callback_log.py +0 -0
  253. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/ide_log.py +0 -0
  254. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/mcp.py +0 -0
  255. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/memory.py +0 -0
  256. {tactus-0.30.0 → tactus-0.31.0}/tactus/adapters/plugins.py +0 -0
  257. {tactus-0.30.0 → tactus-0.31.0}/tactus/backends/http_backend.py +0 -0
  258. {tactus-0.30.0 → tactus-0.31.0}/tactus/backends/model_backend.py +0 -0
  259. {tactus-0.30.0 → tactus-0.31.0}/tactus/backends/pytorch_backend.py +0 -0
  260. {tactus-0.30.0 → tactus-0.31.0}/tactus/broker/__init__.py +0 -0
  261. {tactus-0.30.0 → tactus-0.31.0}/tactus/broker/client.py +0 -0
  262. {tactus-0.30.0 → tactus-0.31.0}/tactus/broker/protocol.py +0 -0
  263. {tactus-0.30.0 → tactus-0.31.0}/tactus/broker/stdio.py +0 -0
  264. {tactus-0.30.0 → tactus-0.31.0}/tactus/cli/__init__.py +0 -0
  265. {tactus-0.30.0 → tactus-0.31.0}/tactus/cli/commands/__init__.py +0 -0
  266. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/__init__.py +0 -0
  267. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/config_manager.py +0 -0
  268. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/dependencies/__init__.py +0 -0
  269. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/dependencies/registry.py +0 -0
  270. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/exceptions.py +0 -0
  271. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/execution_context.py +0 -0
  272. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/lua_sandbox.py +0 -0
  273. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/message_history_manager.py +0 -0
  274. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/mocking.py +0 -0
  275. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/template_resolver.py +0 -0
  276. {tactus-0.30.0 → tactus-0.31.0}/tactus/core/yaml_parser.py +0 -0
  277. {tactus-0.30.0 → tactus-0.31.0}/tactus/docker/Dockerfile +0 -0
  278. {tactus-0.30.0 → tactus-0.31.0}/tactus/docker/entrypoint.sh +0 -0
  279. {tactus-0.30.0 → tactus-0.31.0}/tactus/dspy/__init__.py +0 -0
  280. {tactus-0.30.0 → tactus-0.31.0}/tactus/dspy/broker_lm.py +0 -0
  281. {tactus-0.30.0 → tactus-0.31.0}/tactus/dspy/config.py +0 -0
  282. {tactus-0.30.0 → tactus-0.31.0}/tactus/dspy/history.py +0 -0
  283. {tactus-0.30.0 → tactus-0.31.0}/tactus/dspy/module.py +0 -0
  284. {tactus-0.30.0 → tactus-0.31.0}/tactus/dspy/prediction.py +0 -0
  285. {tactus-0.30.0 → tactus-0.31.0}/tactus/dspy/signature.py +0 -0
  286. {tactus-0.30.0 → tactus-0.31.0}/tactus/formatting/__init__.py +0 -0
  287. {tactus-0.30.0 → tactus-0.31.0}/tactus/formatting/formatter.py +0 -0
  288. {tactus-0.30.0 → tactus-0.31.0}/tactus/ide/__init__.py +0 -0
  289. {tactus-0.30.0 → tactus-0.31.0}/tactus/ide/coding_assistant.py +0 -0
  290. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/control.py +0 -0
  291. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/file.py +0 -0
  292. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/host.py +0 -0
  293. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/human.py +0 -0
  294. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/json.py +0 -0
  295. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/log.py +0 -0
  296. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/message_history.py +0 -0
  297. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/model.py +0 -0
  298. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/procedure.py +0 -0
  299. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/retry.py +0 -0
  300. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/session.py +0 -0
  301. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/state.py +0 -0
  302. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/step.py +0 -0
  303. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/system.py +0 -0
  304. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/tool.py +0 -0
  305. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/tool_handle.py +0 -0
  306. {tactus-0.30.0 → tactus-0.31.0}/tactus/primitives/toolset.py +0 -0
  307. {tactus-0.30.0 → tactus-0.31.0}/tactus/protocols/__init__.py +0 -0
  308. {tactus-0.30.0 → tactus-0.31.0}/tactus/protocols/chat_recorder.py +0 -0
  309. {tactus-0.30.0 → tactus-0.31.0}/tactus/protocols/cost.py +0 -0
  310. {tactus-0.30.0 → tactus-0.31.0}/tactus/protocols/hitl.py +0 -0
  311. {tactus-0.30.0 → tactus-0.31.0}/tactus/protocols/log_handler.py +0 -0
  312. {tactus-0.30.0 → tactus-0.31.0}/tactus/protocols/models.py +0 -0
  313. {tactus-0.30.0 → tactus-0.31.0}/tactus/protocols/storage.py +0 -0
  314. {tactus-0.30.0 → tactus-0.31.0}/tactus/providers/__init__.py +0 -0
  315. {tactus-0.30.0 → tactus-0.31.0}/tactus/providers/base.py +0 -0
  316. {tactus-0.30.0 → tactus-0.31.0}/tactus/providers/bedrock.py +0 -0
  317. {tactus-0.30.0 → tactus-0.31.0}/tactus/providers/google.py +0 -0
  318. {tactus-0.30.0 → tactus-0.31.0}/tactus/providers/openai.py +0 -0
  319. {tactus-0.30.0 → tactus-0.31.0}/tactus/sandbox/__init__.py +0 -0
  320. {tactus-0.30.0 → tactus-0.31.0}/tactus/sandbox/config.py +0 -0
  321. {tactus-0.30.0 → tactus-0.31.0}/tactus/sandbox/container_runner.py +0 -0
  322. {tactus-0.30.0 → tactus-0.31.0}/tactus/sandbox/docker_manager.py +0 -0
  323. {tactus-0.30.0 → tactus-0.31.0}/tactus/sandbox/entrypoint.py +0 -0
  324. {tactus-0.30.0 → tactus-0.31.0}/tactus/sandbox/protocol.py +0 -0
  325. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/__init__.py +0 -0
  326. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/io/__init__.py +0 -0
  327. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/io/csv.py +0 -0
  328. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/io/excel.py +0 -0
  329. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/io/file.py +0 -0
  330. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/io/fs.py +0 -0
  331. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/io/hdf5.py +0 -0
  332. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/io/json.py +0 -0
  333. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/io/parquet.py +0 -0
  334. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/io/tsv.py +0 -0
  335. {tactus-0.30.0 → tactus-0.31.0}/tactus/stdlib/loader.py +0 -0
  336. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/__init__.py +0 -0
  337. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/eval_models.py +0 -0
  338. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/evaluation_runner.py +0 -0
  339. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/evaluators.py +0 -0
  340. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/events.py +0 -0
  341. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/gherkin_parser.py +0 -0
  342. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/mock_dependencies.py +0 -0
  343. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/mock_hitl.py +0 -0
  344. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/mock_registry.py +0 -0
  345. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/mock_tools.py +0 -0
  346. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/models.py +0 -0
  347. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/pydantic_eval_runner.py +0 -0
  348. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/steps/__init__.py +0 -0
  349. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/steps/custom.py +0 -0
  350. {tactus-0.30.0 → tactus-0.31.0}/tactus/testing/steps/registry.py +0 -0
  351. {tactus-0.30.0 → tactus-0.31.0}/tactus/tracing/__init__.py +0 -0
  352. {tactus-0.30.0 → tactus-0.31.0}/tactus/tracing/trace_manager.py +0 -0
  353. {tactus-0.30.0 → tactus-0.31.0}/tactus/utils/__init__.py +0 -0
  354. {tactus-0.30.0 → tactus-0.31.0}/tactus/utils/cost_calculator.py +0 -0
  355. {tactus-0.30.0 → tactus-0.31.0}/tactus/utils/model_pricing.py +0 -0
  356. {tactus-0.30.0 → tactus-0.31.0}/tactus/utils/safe_file_library.py +0 -0
  357. {tactus-0.30.0 → tactus-0.31.0}/tactus/utils/safe_libraries.py +0 -0
  358. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/LuaLexerBase.py +0 -0
  359. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/LuaParserBase.py +0 -0
  360. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/README.md +0 -0
  361. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/__init__.py +0 -0
  362. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/error_listener.py +0 -0
  363. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/LuaLexer.interp +0 -0
  364. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/LuaLexer.py +0 -0
  365. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/LuaLexer.tokens +0 -0
  366. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/LuaLexerBase.py +0 -0
  367. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/LuaParser.interp +0 -0
  368. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/LuaParser.py +0 -0
  369. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/LuaParser.tokens +0 -0
  370. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/LuaParserBase.py +0 -0
  371. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/LuaParserVisitor.py +0 -0
  372. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/generated/__init__.py +0 -0
  373. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/grammar/LuaLexer.g4 +0 -0
  374. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/grammar/LuaParser.g4 +0 -0
  375. {tactus-0.30.0 → tactus-0.31.0}/tactus/validation/validator.py +0 -0
  376. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/.gitignore +0 -0
  377. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/ELECTRON_INTEGRATION.md +0 -0
  378. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/README.md +0 -0
  379. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/RUN_ELECTRON.md +0 -0
  380. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/SETUP_COMPLETE.md +0 -0
  381. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/backend/hook-lupa.py +0 -0
  382. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/backend/tactus_backend.spec +0 -0
  383. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/package-lock.json +0 -0
  384. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/package.json +0 -0
  385. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/preload/preload.ts +0 -0
  386. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/preload/tsconfig.json +0 -0
  387. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/rebuild-and-test.sh +0 -0
  388. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/resources/app-icon.icns +0 -0
  389. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/resources/app-icon.ico +0 -0
  390. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/resources/app-icon.png +0 -0
  391. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/scripts/build-backend.js +0 -0
  392. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/scripts/build-frontend.js +0 -0
  393. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/scripts/generate-icons.sh +0 -0
  394. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/src/backend-manager.ts +0 -0
  395. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/src/main.ts +0 -0
  396. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/src/menu.ts +0 -0
  397. {tactus-0.30.0 → tactus-0.31.0}/tactus-desktop/tsconfig.json +0 -0
  398. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/ARCHITECTURE.md +0 -0
  399. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/CHANGELOG.md +0 -0
  400. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/DEV_MODE.md +0 -0
  401. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/QUICK_START.md +0 -0
  402. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/README.md +0 -0
  403. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
  404. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/TROUBLESHOOTING.md +0 -0
  405. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/README.md +0 -0
  406. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/assistant_service.py +0 -0
  407. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/assistant_tools.py +0 -0
  408. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/chat_server.py +0 -0
  409. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/config_server.py +0 -0
  410. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/events.py +0 -0
  411. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/logging_capture.py +0 -0
  412. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/lsp_server.py +0 -0
  413. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/requirements.txt +0 -0
  414. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
  415. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/test_lsp_server.py +0 -0
  416. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/backend/text_editor_tool.py +0 -0
  417. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/dev.sh +0 -0
  418. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/.storybook/main.ts +0 -0
  419. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/.storybook/preview.ts +0 -0
  420. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
  421. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/README.md +0 -0
  422. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/demo.ts +0 -0
  423. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/index.html +0 -0
  424. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/jest.config.js +0 -0
  425. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/package-lock.json +0 -0
  426. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/package.json +0 -0
  427. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/postcss.config.js +0 -0
  428. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/App.tsx +0 -0
  429. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/Editor.tsx +0 -0
  430. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/LSPClient.ts +0 -0
  431. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
  432. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
  433. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/commands/registry.ts +0 -0
  434. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/AboutDialog.tsx +0 -0
  435. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ChatSidebar.tsx +0 -0
  436. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
  437. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
  438. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
  439. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
  440. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
  441. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
  442. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
  443. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/PreferencesView.tsx +0 -0
  444. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
  445. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
  446. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
  447. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
  448. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
  449. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
  450. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
  451. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
  452. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
  453. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
  454. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
  455. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
  456. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
  457. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/chat/ChatInterface.tsx +0 -0
  458. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/chat/MessageInput.tsx +0 -0
  459. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/chat/MessageList.tsx +0 -0
  460. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
  461. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
  462. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
  463. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
  464. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
  465. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
  466. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
  467. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
  468. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
  469. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
  470. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
  471. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
  472. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
  473. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
  474. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
  475. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
  476. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
  477. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
  478. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
  479. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
  480. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
  481. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
  482. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
  483. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
  484. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
  485. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
  486. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
  487. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
  488. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
  489. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
  490. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
  491. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
  492. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
  493. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
  494. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
  495. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
  496. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
  497. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
  498. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
  499. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
  500. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
  501. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
  502. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
  503. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
  504. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
  505. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/preferences/ConfigFieldView.tsx +0 -0
  506. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/preferences/SourceBadge.tsx +0 -0
  507. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/preferences/YamlCodeEditor.tsx +0 -0
  508. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
  509. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
  510. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
  511. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
  512. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
  513. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
  514. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
  515. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
  516. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/badge.tsx +0 -0
  517. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
  518. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
  519. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/dropdown-menu.tsx +0 -0
  520. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
  521. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/label.tsx +0 -0
  522. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
  523. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
  524. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
  525. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
  526. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/select.tsx +0 -0
  527. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
  528. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/switch.tsx +0 -0
  529. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
  530. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/components/ui/tooltip.tsx +0 -0
  531. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/hooks/useChatSSE.ts +0 -0
  532. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
  533. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
  534. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/index.css +0 -0
  535. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/lib/utils.ts +0 -0
  536. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/main.tsx +0 -0
  537. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/types/events.ts +0 -0
  538. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/types/metadata.ts +0 -0
  539. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/types/preferences.ts +0 -0
  540. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/types/results.ts +0 -0
  541. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/types/tracing.ts +0 -0
  542. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/utils/yamlSync.ts +0 -0
  543. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
  544. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
  545. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
  546. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/validation/types.ts +0 -0
  547. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
  548. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/tailwind.config.js +0 -0
  549. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/tsconfig.json +0 -0
  550. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/tsconfig.node.json +0 -0
  551. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/vite.config.ts +0 -0
  552. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
  553. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/package.json +0 -0
  554. {tactus-0.30.0 → tactus-0.31.0}/tactus-ide/start-dev.sh +0 -0
  555. {tactus-0.30.0 → tactus-0.31.0}/test-ci.sh +0 -0
  556. {tactus-0.30.0 → tactus-0.31.0}/tests/__init__.py +0 -0
  557. {tactus-0.30.0 → tactus-0.31.0}/tests/adapters/__init__.py +0 -0
  558. {tactus-0.30.0 → tactus-0.31.0}/tests/adapters/test_lua_tools_adapter.py +0 -0
  559. {tactus-0.30.0 → tactus-0.31.0}/tests/adapters/test_plugins.py +0 -0
  560. {tactus-0.30.0 → tactus-0.31.0}/tests/broker/test_broker_host_tool_source.py +0 -0
  561. {tactus-0.30.0 → tactus-0.31.0}/tests/broker/test_broker_integration.py +0 -0
  562. {tactus-0.30.0 → tactus-0.31.0}/tests/broker/test_broker_tcp_integration.py +0 -0
  563. {tactus-0.30.0 → tactus-0.31.0}/tests/broker/test_broker_tcp_unit.py +0 -0
  564. {tactus-0.30.0 → tactus-0.31.0}/tests/broker/test_brokered_lm_unit.py +0 -0
  565. {tactus-0.30.0 → tactus-0.31.0}/tests/cli/__init__.py +0 -0
  566. {tactus-0.30.0 → tactus-0.31.0}/tests/cli/test_cli.py +0 -0
  567. {tactus-0.30.0 → tactus-0.31.0}/tests/cli/test_cli_inputs.py +0 -0
  568. {tactus-0.30.0 → tactus-0.31.0}/tests/conftest.py +0 -0
  569. {tactus-0.30.0 → tactus-0.31.0}/tests/core/__init__.py +0 -0
  570. {tactus-0.30.0 → tactus-0.31.0}/tests/core/test_config_manager.py +0 -0
  571. {tactus-0.30.0 → tactus-0.31.0}/tests/core/test_determinism_safety.py +0 -0
  572. {tactus-0.30.0 → tactus-0.31.0}/tests/core/test_lua_sandbox_security.py +0 -0
  573. {tactus-0.30.0 → tactus-0.31.0}/tests/core/test_runtime_inputs.py +0 -0
  574. {tactus-0.30.0 → tactus-0.31.0}/tests/dspy/__init__.py +0 -0
  575. {tactus-0.30.0 → tactus-0.31.0}/tests/dspy/test_module_parameter.py +0 -0
  576. {tactus-0.30.0 → tactus-0.31.0}/tests/dspy/test_prediction_messages.py +0 -0
  577. {tactus-0.30.0 → tactus-0.31.0}/tests/dspy/test_streaming.py +0 -0
  578. {tactus-0.30.0 → tactus-0.31.0}/tests/fixtures/__init__.py +0 -0
  579. {tactus-0.30.0 → tactus-0.31.0}/tests/fixtures/test_mcp_server.py +0 -0
  580. {tactus-0.30.0 → tactus-0.31.0}/tests/integration/test_named_procedures.py +0 -0
  581. {tactus-0.30.0 → tactus-0.31.0}/tests/mocks/__init__.py +0 -0
  582. {tactus-0.30.0 → tactus-0.31.0}/tests/mocks/llm_mocks.py +0 -0
  583. {tactus-0.30.0 → tactus-0.31.0}/tests/primitives/test_checkpoint_primitive.py +0 -0
  584. {tactus-0.30.0 → tactus-0.31.0}/tests/primitives/test_host_primitive.py +0 -0
  585. {tactus-0.30.0 → tactus-0.31.0}/tests/primitives/test_retry_primitive.py +0 -0
  586. {tactus-0.30.0 → tactus-0.31.0}/tests/primitives/test_state_primitive.py +0 -0
  587. {tactus-0.30.0 → tactus-0.31.0}/tests/primitives/test_system_alert.py +0 -0
  588. {tactus-0.30.0 → tactus-0.31.0}/tests/primitives/test_tool_primitive.py +0 -0
  589. {tactus-0.30.0 → tactus-0.31.0}/tests/primitives/test_toolset_dsl.py +0 -0
  590. {tactus-0.30.0 → tactus-0.31.0}/tests/sandbox/test_container_runner.py +0 -0
  591. {tactus-0.30.0 → tactus-0.31.0}/tests/sandbox/test_docker_sandbox_smoke.py +0 -0
  592. {tactus-0.30.0 → tactus-0.31.0}/tests/stdlib/__init__.py +0 -0
  593. {tactus-0.30.0 → tactus-0.31.0}/tests/stdlib/test_loader.py +0 -0
  594. {tactus-0.30.0 → tactus-0.31.0}/tests/stdlib/test_require_python.py +0 -0
  595. {tactus-0.30.0 → tactus-0.31.0}/tests/test_checkpoints_integration.py +0 -0
  596. {tactus-0.30.0 → tactus-0.31.0}/tests/test_formatter.py +0 -0
  597. {tactus-0.30.0 → tactus-0.31.0}/tests/test_tracing.py +0 -0
  598. {tactus-0.30.0 → tactus-0.31.0}/tests/testing/__init__.py +0 -0
  599. {tactus-0.30.0 → tactus-0.31.0}/tests/testing/conftest.py +0 -0
  600. {tactus-0.30.0 → tactus-0.31.0}/tests/testing/test_gherkin_parser.py +0 -0
  601. {tactus-0.30.0 → tactus-0.31.0}/tests/testing/test_models.py +0 -0
  602. {tactus-0.30.0 → tactus-0.31.0}/tests/testing/test_step_registry.py +0 -0
  603. {tactus-0.30.0 → tactus-0.31.0}/tests/utils/__init__.py +0 -0
  604. {tactus-0.30.0 → tactus-0.31.0}/tests/utils/test_safe_file_library.py +0 -0
  605. {tactus-0.30.0 → tactus-0.31.0}/tests/validation/__init__.py +0 -0
  606. {tactus-0.30.0 → tactus-0.31.0}/tests/validation/test_tool_curried_syntax_disallowed.py +0 -0
@@ -2,6 +2,19 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.31.0 (2026-01-15)
6
+
7
+ ### Chores
8
+
9
+ - Merge origin/main
10
+ ([`dd8c4d4`](https://github.com/AnthusAI/Tactus/commit/dd8c4d4aa08cf4d7aaf8be69e76309a66be36ec8))
11
+
12
+ ### Documentation
13
+
14
+ - Add workaround for macOS Gatekeeper damaged app error
15
+ ([`cbf9b38`](https://github.com/AnthusAI/Tactus/commit/cbf9b38a25a99d8f0ff8949e3a646ed69d276713))
16
+
17
+
5
18
  ## v0.30.0 (2026-01-15)
6
19
 
7
20
 
@@ -993,24 +993,6 @@ On replay, completed sub-procedure calls return cached results without re-execut
993
993
  - DSL Stub: `tactus/core/dsl_stubs.py` (`_procedure` function)
994
994
  - Registry: `tactus/core/registry.py`
995
995
 
996
- ### Stages
997
-
998
- #### StagePrimitive (`tactus/primitives/stage.py`)
999
-
1000
- **Status**: ✅ **Fully Implemented**
1001
-
1002
- **Features:**
1003
- - ✅ `Stage.set(name)` - Set current stage
1004
- - ✅ `Stage.current()` - Get current stage
1005
- - ✅ `Stage.advance()` - Move to next stage in sequence
1006
- - ✅ `Stage.is(name)` - Check if in specific stage (mapped from Lua `is` keyword)
1007
- - ✅ `Stage.history()` - Get transition history
1008
-
1009
- **Implementation:**
1010
- - Validates stage names against `stages:` declaration in YAML
1011
- - Tracks stage transitions with timestamps
1012
- - Returns history as Lua table
1013
-
1014
996
  ### Exception Handling
1015
997
 
1016
998
  **Specification**: Supports `pcall()` for protected calls.
@@ -1300,10 +1282,6 @@ procedure "order_fulfillment" {
1300
1282
 
1301
1283
  **Location**: `tactus/primitives/state.py`
1302
1284
 
1303
- #### Stage Primitives
1304
-
1305
- **Status**: ✅ **Fully Implemented** (see Stages section above)
1306
-
1307
1285
  #### Control Primitives
1308
1286
 
1309
1287
  #### IterationsPrimitive (`tactus/primitives/control.py`)
@@ -1669,7 +1647,6 @@ Defines interface for persistence.
1669
1647
 
1670
1648
  **Built-in Steps:**
1671
1649
  - Tool steps: `the {tool} tool should be called`, `at least {n} times`, `with {param}={value}`
1672
- - Stage steps: `the stage should be {stage}`, `transition from {s1} to {s2}`
1673
1650
  - State steps: `the state {key} should be {value}`, `should exist`
1674
1651
  - Completion steps: `should complete successfully`, `stop reason should contain {text}`
1675
1652
  - Iteration steps: `iterations should be less than {n}`, `between {min} and {max}`
@@ -1816,7 +1793,6 @@ tactus/
1816
1793
  │ ├── tool.py # ToolPrimitive
1817
1794
  │ ├── human.py # HumanPrimitive (HITL)
1818
1795
  │ ├── step.py # StepPrimitive, checkpoint() function
1819
- │ ├── stage.py # StagePrimitive
1820
1796
  │ ├── control.py # IterationsPrimitive, StopPrimitive
1821
1797
  │ ├── log.py # LogPrimitive
1822
1798
  │ ├── json.py # JsonPrimitive
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tactus
3
- Version: 0.30.0
3
+ Version: 0.31.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
@@ -170,7 +170,7 @@ Procedure {
170
170
  end
171
171
  }
172
172
 
173
- Specifications([[
173
+ Specification([[
174
174
  Feature: Research
175
175
  Scenario: Completes research
176
176
  When the researcher agent takes turns
@@ -421,12 +421,12 @@ calculator = Agent {
421
421
  done = tactus.done
422
422
 
423
423
  text_processor = Agent {
424
- tools = {
425
- done,
424
+ inline_tools = {
426
425
  {name = "uppercase", input = {...}, handler = function(args)
427
426
  return string.upper(args.text)
428
427
  end}
429
- }
428
+ },
429
+ tools = {done}
430
430
  }
431
431
  ```
432
432
 
@@ -533,7 +533,7 @@ Procedure {
533
533
  end
534
534
  }
535
535
 
536
- Specifications([[
536
+ Specification([[
537
537
  Feature: Greeting
538
538
  Scenario: Agent greets and completes
539
539
  When the greeter agent takes turns
@@ -616,7 +616,7 @@ This creates a rhythm: **tool call → summarization → tool call → summariza
616
616
 
617
617
  **Why this matters:**
618
618
 
619
- Without per-call control, an agent might call another tool when you just want it to explain the previous result. By temporarily restricting tools to an empty set (`tools = {}`), you ensure the agent focuses on summarization.
619
+ Without per-call control, an agent might call another tool when you just want it to explain the previous result. By temporarily restricting toolsets to an empty set (`tools = {}`), you ensure the agent focuses on summarization.
620
620
 
621
621
  **Other per-call overrides:**
622
622
 
@@ -731,10 +731,9 @@ Then the search tool should be called exactly 2 times
731
731
  Then the search tool should be called with query=test
732
732
  ```
733
733
 
734
- **State & Stage Steps:**
734
+ **State Steps:**
735
735
  ```gherkin
736
736
  Given the procedure has started
737
- Then the stage should be processing
738
737
  Then the state count should be 5
739
738
  Then the state error should exist
740
739
  ```
@@ -866,10 +865,9 @@ Then the search tool should be called exactly 2 times
866
865
  Then the search tool should be called with query=test
867
866
  ```
868
867
 
869
- **State & Stage Steps:**
868
+ **State Steps:**
870
869
  ```gherkin
871
870
  Given the procedure has started
872
- Then the stage should be processing
873
871
  Then the state count should be 5
874
872
  Then the state error should exist
875
873
  ```
@@ -119,7 +119,7 @@ Procedure {
119
119
  end
120
120
  }
121
121
 
122
- Specifications([[
122
+ Specification([[
123
123
  Feature: Research
124
124
  Scenario: Completes research
125
125
  When the researcher agent takes turns
@@ -370,12 +370,12 @@ calculator = Agent {
370
370
  done = tactus.done
371
371
 
372
372
  text_processor = Agent {
373
- tools = {
374
- done,
373
+ inline_tools = {
375
374
  {name = "uppercase", input = {...}, handler = function(args)
376
375
  return string.upper(args.text)
377
376
  end}
378
- }
377
+ },
378
+ tools = {done}
379
379
  }
380
380
  ```
381
381
 
@@ -482,7 +482,7 @@ Procedure {
482
482
  end
483
483
  }
484
484
 
485
- Specifications([[
485
+ Specification([[
486
486
  Feature: Greeting
487
487
  Scenario: Agent greets and completes
488
488
  When the greeter agent takes turns
@@ -565,7 +565,7 @@ This creates a rhythm: **tool call → summarization → tool call → summariza
565
565
 
566
566
  **Why this matters:**
567
567
 
568
- Without per-call control, an agent might call another tool when you just want it to explain the previous result. By temporarily restricting tools to an empty set (`tools = {}`), you ensure the agent focuses on summarization.
568
+ Without per-call control, an agent might call another tool when you just want it to explain the previous result. By temporarily restricting toolsets to an empty set (`tools = {}`), you ensure the agent focuses on summarization.
569
569
 
570
570
  **Other per-call overrides:**
571
571
 
@@ -680,10 +680,9 @@ Then the search tool should be called exactly 2 times
680
680
  Then the search tool should be called with query=test
681
681
  ```
682
682
 
683
- **State & Stage Steps:**
683
+ **State Steps:**
684
684
  ```gherkin
685
685
  Given the procedure has started
686
- Then the stage should be processing
687
686
  Then the state count should be 5
688
687
  Then the state error should exist
689
688
  ```
@@ -815,10 +814,9 @@ Then the search tool should be called exactly 2 times
815
814
  Then the search tool should be called with query=test
816
815
  ```
817
816
 
818
- **State & Stage Steps:**
817
+ **State Steps:**
819
818
  ```gherkin
820
819
  Given the procedure has started
821
- Then the stage should be processing
822
820
  Then the state count should be 5
823
821
  Then the state error should exist
824
822
  ```
@@ -47,9 +47,6 @@ worker = Agent {
47
47
  tools = {done} -- Variable references, not strings
48
48
  }
49
49
 
50
- -- Stages (optional)
51
- Stages({"planning", "executing", "complete"})
52
-
53
50
  -- Procedure (unnamed, defaults to "main")
54
51
  Procedure {
55
52
  -- Input (using field builder syntax)
@@ -83,7 +80,7 @@ Procedure {
83
80
  }
84
81
 
85
82
  -- BDD Specifications (optional)
86
- Specifications([[
83
+ Specification([[
87
84
  Feature: Task Processing
88
85
  Scenario: Task completes successfully
89
86
  Given the procedure has started
@@ -95,12 +92,12 @@ Feature: Task Processing
95
92
 
96
93
  **Key structure:**
97
94
  - **Tools** defined as `name = Tool {...}` or imported via `require()` like `local done = require("tactus.tools.done")`
98
- - **Agents** defined as `name = Agent {...}` with `tools = {var1, var2}` or `toolsets = {"tool_name"}`
95
+ - **Agents** defined as `name = Agent {...}` with `tools = {...}`; `tools = {...}` is reserved for inline tool definitions only
99
96
  - **Procedure { }** unnamed, defaults to "main"
100
97
  - Config fields: `input`, `output`, `state` (state is optional)
101
98
  - Function as the last element containing the procedure logic
102
99
  - **Agent calls** use callable syntax: `worker()` or `worker({message = "..."})`
103
- - **Specifications()** at top level for BDD tests
100
+ - **Specification()** / **Specifications()** at top level for BDD tests
104
101
 
105
102
  ---
106
103
 
@@ -292,7 +289,7 @@ researcher = Agent {
292
289
  provider = "openai",
293
290
  model = "gpt-4o",
294
291
  system_prompt = "Research the topic",
295
- toolsets = {"brave_search", "done"}, -- MCP tools referenced by name
292
+ tools = {"brave_search", "done"}, -- MCP tools referenced by name
296
293
 
297
294
  message_history = {
298
295
  source = "shared", -- Use shared history
@@ -1122,34 +1119,6 @@ local result = Human.approve({
1122
1119
  -- If on_timeout = "error", throws exception on timeout
1123
1120
  ```
1124
1121
 
1125
- ### HITL Stage Integration
1126
-
1127
- When a procedure is waiting for human interaction, its stage reflects this:
1128
-
1129
- ```lua
1130
- Stage.set("processing")
1131
- do_work()
1132
-
1133
- -- Procedure status becomes "waiting_for_human" during this call
1134
- local approved = Human.approve({message = "Continue?"})
1135
-
1136
- Stage.set("finalizing")
1137
- ```
1138
-
1139
- Parent procedures can detect this:
1140
-
1141
- ```lua
1142
- local handle = Procedure.spawn("deployment", params)
1143
-
1144
- local status = Procedure.status(handle)
1145
- if status.waiting_for_human then
1146
- -- Maybe notify via Slack
1147
- notify_channel("Deployment waiting for approval")
1148
- end
1149
- ```
1150
-
1151
- ---
1152
-
1153
1122
  ## Human-AI Chat (Non-Procedural)
1154
1123
 
1155
1124
  The same `ChatSession` and `ChatMessage` infrastructure supports regular conversational AI assistants that aren't running procedure workflows.
@@ -1327,8 +1296,7 @@ The runtime detects script mode during execution and performs source transformat
1327
1296
  - `input {}`
1328
1297
  - `output {}`
1329
1298
  - `Mocks {}`
1330
- - `Stages()`
1331
- - `Specifications()`
1299
+ - `Specification()` / `Specifications()`
1332
1300
  - Agent definitions: `name = Agent {}`
1333
1301
  - Tool definitions: `name = Tool {}` or imported via `require()` like `local done = require("tactus.tools.done")`
1334
1302
  - Model definitions: `name = Model {}`
@@ -1460,7 +1428,7 @@ Context: {prepared.data}
1460
1428
 
1461
1429
  initial_message = "Begin working on the task.",
1462
1430
 
1463
- toolsets = {"brave_search_search", "done"}, -- MCP tools referenced by string name
1431
+ tools = {"brave_search_search", "done"}, -- MCP tools referenced by string name
1464
1432
 
1465
1433
  filter = {
1466
1434
  class = "ComposedFilter",
@@ -1995,8 +1963,7 @@ local done = require("tactus.tools.done")
1995
1963
  text_processor = Agent {
1996
1964
  provider = "openai",
1997
1965
  system_prompt = "You process text",
1998
- tools = {
1999
- done,
1966
+ inline_tools = {
2000
1967
  {
2001
1968
  name = "uppercase",
2002
1969
  description = "Convert text to uppercase",
@@ -2017,7 +1984,8 @@ text_processor = Agent {
2017
1984
  return string.reverse(args.text)
2018
1985
  end
2019
1986
  }
2020
- }
1987
+ },
1988
+ tools = {done}
2021
1989
  }
2022
1990
  ```
2023
1991
 
@@ -2025,10 +1993,9 @@ Inline tools are automatically prefixed with the agent name (e.g., `text_process
2025
1993
 
2026
1994
  **Tools in Agent Config**
2027
1995
 
2028
- In agent configuration, `tools` accepts:
2029
- - **Variable references** to tools: `done`, `calculate_tip`
2030
- - **Variable references** to toolsets: `math_tools`
2031
- - **Inline tool definitions** (objects with `name`, `handler`, `input`)
1996
+ In agent configuration:
1997
+ - `tools` accepts **tool/toolset references** and toolset expressions.
1998
+ - `inline_tools` is reserved for **inline tool definitions** (objects with `name`, `handler`, `input`).
2032
1999
 
2033
2000
  ```lua
2034
2001
  local done = require("tactus.tools.done")
@@ -2036,11 +2003,13 @@ calculate_tip = Tool {...}
2036
2003
  math_tools = Toolset {...}
2037
2004
 
2038
2005
  example = Agent {
2039
- tools = {
2040
- done, -- Variable reference to tool
2041
- calculate_tip, -- Variable reference to tool
2042
- math_tools, -- Variable reference to toolset
2006
+ inline_tools = {
2043
2007
  {name = "my_tool", handler = function(args) ... end, ...} -- Inline
2008
+ },
2009
+ tools = {
2010
+ done, -- Tool reference
2011
+ calculate_tip, -- Tool reference
2012
+ math_tools, -- Toolset reference
2044
2013
  }
2045
2014
  }
2046
2015
  ```
@@ -2156,35 +2125,6 @@ local status = handle.status()
2156
2125
  local result = handle.wait()
2157
2126
  ```
2158
2127
 
2159
- ---
2160
-
2161
- ## Stages
2162
-
2163
- Stages integrate with TaskStages monitoring:
2164
-
2165
- ```lua
2166
- -- Define stages at top level
2167
- Stages({"planning", "executing", "awaiting_human", "complete"})
2168
-
2169
- -- Use in procedure
2170
- Procedure {
2171
- function(input)
2172
- Stage.set("planning")
2173
- -- Do planning work...
2174
-
2175
- Stage.advance("executing")
2176
- -- Execute tasks...
2177
-
2178
- Stage.is("planning") -- false
2179
- Stage.current() -- "executing"
2180
-
2181
- -- Continue with rest of procedure...
2182
- end
2183
- }
2184
- ```
2185
-
2186
- ---
2187
-
2188
2128
  ## Exception Handling
2189
2129
 
2190
2130
  ```lua
@@ -2298,15 +2238,15 @@ response.tool_calls
2298
2238
  The callable agent accepts an optional table to override behavior for a single call:
2299
2239
 
2300
2240
  **Available overrides:**
2301
- - `message` (string) - Message to send to the agent (mapped to inject internally)
2241
+ - `message` (string) - Message to send to the agent
2302
2242
  - `context` (table) - Key-value pairs to pass as context to the agent (formatted as structured input)
2303
- - `tools` (list of variables) - Tool and toolset variables available for this call (empty list = no tools)
2243
+ - `tools` (list of toolset expressions) - Tools/toolsets available for this call (empty list = no tools)
2304
2244
  - `temperature` (number) - Override temperature for this call
2305
2245
  - `max_tokens` (number) - Override max_tokens for this call
2306
2246
  - `top_p` (number) - Override top_p for this call
2307
2247
 
2308
2248
  **Tool Override Behavior:**
2309
- - `tools` - List of tool/toolset variables to enable: `{search, done, math_tools}`
2249
+ - `tools` - List of tool/toolset references to enable: `{search, done, math_tools}`
2310
2250
  - Empty list `{}`: No tools available for this call
2311
2251
  - `nil`/omitted: Use agent's default configuration
2312
2252
 
@@ -2406,16 +2346,6 @@ State.append("list", item) -- Append to a list
2406
2346
  State.all() -- Get all state as table
2407
2347
  ```
2408
2348
 
2409
- ### Stage Primitives
2410
-
2411
- ```lua
2412
- Stage.current()
2413
- Stage.set(name)
2414
- Stage.advance(name)
2415
- Stage.is(name)
2416
- Stage.history()
2417
- ```
2418
-
2419
2349
  ### Control Primitives
2420
2350
 
2421
2351
  ```lua
@@ -2534,7 +2464,7 @@ end
2534
2464
  Matchers are primarily used in BDD specifications for testing:
2535
2465
 
2536
2466
  ```lua
2537
- Specifications([[
2467
+ Specification([[
2538
2468
  Feature: Data Processing
2539
2469
  Scenario: Process valid data
2540
2470
  Given the procedure has started
@@ -2556,9 +2486,9 @@ local error_matcher = contains("error")
2556
2486
 
2557
2487
  -- Use in conditional logic
2558
2488
  local result = worker()
2559
- if tostring(result.value):find("success") then
2489
+ if tostring(result.output):find("success") then
2560
2490
  -- Contains success
2561
- elseif tostring(result.value):find("error") then
2491
+ elseif tostring(result.output):find("error") then
2562
2492
  -- Contains error
2563
2493
  end
2564
2494
  ```
@@ -2586,9 +2516,6 @@ end
2586
2516
  ## Example: HITL Workflow
2587
2517
 
2588
2518
  ```lua
2589
- -- Define stages at top level
2590
- Stages({"researching", "writing", "review", "publishing", "complete"})
2591
-
2592
2519
  -- Define tools
2593
2520
  local done = require("tactus.tools.done")
2594
2521
  research = Tool {
@@ -2654,14 +2581,12 @@ Procedure {
2654
2581
  },
2655
2582
 
2656
2583
  function(input)
2657
- Stage.set("researching")
2658
2584
  Human.notify({
2659
2585
  message = "Starting content generation",
2660
2586
  level = "info",
2661
2587
  context = {topic = input.topic, target = input.target}
2662
2588
  })
2663
2589
 
2664
- Stage.set("writing")
2665
2590
  repeat
2666
2591
  writer()
2667
2592
  until done.called() or Iterations.exceeded(20)
@@ -2671,7 +2596,6 @@ Procedure {
2671
2596
  end
2672
2597
 
2673
2598
  -- Human review
2674
- Stage.set("review")
2675
2599
  local review = Human.review("review_content", {
2676
2600
  artifact = state.draft,
2677
2601
  artifact_type = "document"
@@ -2693,7 +2617,6 @@ Procedure {
2693
2617
  local final_content = review.edited_artifact or state.draft
2694
2618
 
2695
2619
  -- Approval to publish
2696
- Stage.set("publishing")
2697
2620
  local approved = Human.approve("confirm_publish")
2698
2621
 
2699
2622
  if not approved then
@@ -2710,7 +2633,6 @@ Procedure {
2710
2633
  context = {url = url}
2711
2634
  })
2712
2635
 
2713
- Stage.set("complete")
2714
2636
  return {published = true, url = url}
2715
2637
  end
2716
2638
  }
@@ -2721,9 +2643,6 @@ Procedure {
2721
2643
  ## Example: System Monitoring with Alerts
2722
2644
 
2723
2645
  ```lua
2724
- -- Define stages at top level
2725
- Stages({"processing", "complete"})
2726
-
2727
2646
  -- Main procedure
2728
2647
  Procedure {
2729
2648
  input = {
@@ -2741,8 +2660,6 @@ Procedure {
2741
2660
  local failed = 0
2742
2661
  local total = #input.items
2743
2662
 
2744
- Stage.set("processing")
2745
-
2746
2663
  for i, item in ipairs(input.items) do
2747
2664
  local ok, result = pcall(process_item, item)
2748
2665
 
@@ -2789,8 +2706,6 @@ Procedure {
2789
2706
  end
2790
2707
  end
2791
2708
 
2792
- Stage.set("complete")
2793
-
2794
2709
  -- Final status
2795
2710
  local level = failed > 0 and "warning" or "info"
2796
2711
  Human.notify({
@@ -2821,8 +2736,6 @@ A comprehensive example showing HITL with checkpointed tool calls, evaluation, a
2821
2736
  -- Note: This is a complex example showing multiple advanced features
2822
2737
 
2823
2738
  -- Define stages
2824
- Stages({"analyzing", "drafting", "evaluating", "awaiting_approval", "promoting", "complete"})
2825
-
2826
2739
  -- Import completion tool from standard library
2827
2740
  local done = require("tactus.tools.done")
2828
2741
 
@@ -2837,7 +2750,7 @@ Score ID: {input.score_id}
2837
2750
  Champion metrics: {state.champion_metrics}
2838
2751
  Error patterns: {state.error_analysis}
2839
2752
  ]],
2840
- toolsets = {"plexus_get_score", "plexus_get_evaluation_metrics", "plexus_analyze_errors", "done"},
2753
+ tools = {"plexus_get_score", "plexus_get_evaluation_metrics", "plexus_analyze_errors", "done"},
2841
2754
  max_turns = 20
2842
2755
  }
2843
2756
 
@@ -2851,7 +2764,7 @@ Human feedback (if any): {state.human_feedback}
2851
2764
 
2852
2765
  Be conservative - small targeted improvements are better than sweeping changes.
2853
2766
  ]],
2854
- toolsets = {"plexus_draft_score_config", "plexus_validate_config", "done"},
2767
+ tools = {"plexus_draft_score_config", "plexus_validate_config", "done"},
2855
2768
  max_turns = 15
2856
2769
  }
2857
2770
 
@@ -2889,7 +2802,6 @@ Procedure {
2889
2802
  local attempt = 1
2890
2803
 
2891
2804
  -- Evaluate champion FIRST (checkpointed, runs once)
2892
- Stage.set("analyzing")
2893
2805
 
2894
2806
  state.champion_config = Step.checkpoint(function()
2895
2807
  return plexus_get_score.run({score_id = input.score_id})
@@ -2922,7 +2834,6 @@ Procedure {
2922
2834
  state.analysis_findings = done.last_result()
2923
2835
 
2924
2836
  -- Draft improved configuration
2925
- Stage.set("drafting")
2926
2837
 
2927
2838
  repeat
2928
2839
  drafter()
@@ -2936,7 +2847,6 @@ Procedure {
2936
2847
  state.candidate_config = candidate_config
2937
2848
 
2938
2849
  -- Evaluate candidate (checkpointed per attempt)
2939
- Stage.set("evaluating")
2940
2850
 
2941
2851
  local eval_result = Step.checkpoint(function()
2942
2852
  return plexus_run_evaluation.run({
@@ -2972,7 +2882,6 @@ Procedure {
2972
2882
  end
2973
2883
  else
2974
2884
  -- Request human approval
2975
- Stage.set("awaiting_approval")
2976
2885
 
2977
2886
  local review = Human.review("approval_to_promote", {
2978
2887
  artifact = {
@@ -2985,8 +2894,6 @@ Procedure {
2985
2894
  })
2986
2895
 
2987
2896
  if review.decision == "Approve" then
2988
- Stage.set("promoting")
2989
-
2990
2897
  local result = Step.checkpoint(function()
2991
2898
  return plexus_promote_score_version.run({
2992
2899
  score_id = input.score_id,
@@ -3000,7 +2907,6 @@ Procedure {
3000
2907
  context = {version_id = result.version_id}
3001
2908
  })
3002
2909
 
3003
- Stage.set("complete")
3004
2910
  return {
3005
2911
  promoted = true,
3006
2912
  new_version_id = result.version_id,
@@ -3015,7 +2921,6 @@ Procedure {
3015
2921
  attempt = attempt + 1
3016
2922
 
3017
2923
  else -- "Reject"
3018
- Stage.set("complete")
3019
2924
  return {
3020
2925
  promoted = false,
3021
2926
  improvement = improvement,
@@ -3025,7 +2930,6 @@ Procedure {
3025
2930
  end
3026
2931
  end
3027
2932
 
3028
- Stage.set("complete")
3029
2933
  return {promoted = false, rejection_reason = "max_attempts_exhausted"}
3030
2934
  end
3031
2935
  }
@@ -3228,7 +3132,7 @@ Tactus includes first-class support for behavior-driven testing using Gherkin sy
3228
3132
  Write Gherkin specifications directly in procedure files:
3229
3133
 
3230
3134
  ```lua
3231
- Specifications([[
3135
+ Specification([[
3232
3136
  Feature: Research Task Completion
3233
3137
  As a user
3234
3138
  I want the agent to research topics effectively
@@ -3240,11 +3144,6 @@ Feature: Research Task Completion
3240
3144
  Then the search tool should be called at least once
3241
3145
  And the done tool should be called exactly once
3242
3146
  And the procedure should complete successfully
3243
-
3244
- Scenario: Agent progresses through stages correctly
3245
- Given the procedure has started
3246
- When the procedure runs
3247
- Then the stage should transition from researching to complete
3248
3147
  And the total iterations should be less than 20
3249
3148
  ]])
3250
3149
  ```
@@ -3258,16 +3157,12 @@ The framework provides comprehensive built-in steps for Tactus primitives:
3258
3157
  - `the {tool} tool should be called at least {n} times`
3259
3158
  - `the {tool} tool should be called with {param}={value}`
3260
3159
 
3261
- **Stage steps:**
3262
- - `the procedure has started`
3263
- - `the stage should be {stage}`
3264
- - `the stage should transition from {stage1} to {stage2}`
3265
-
3266
3160
  **State steps:**
3267
3161
  - `the state {key} should be {value}`
3268
3162
  - `the state {key} should exist`
3269
3163
 
3270
3164
  **Completion steps:**
3165
+ - `the procedure has started`
3271
3166
  - `the procedure should complete successfully`
3272
3167
  - `the stop reason should contain {text}`
3273
3168