tactus 0.29.4__tar.gz → 0.30.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 (595) hide show
  1. {tactus-0.29.4 → tactus-0.30.0}/AGENTS.md +4 -0
  2. {tactus-0.29.4 → tactus-0.30.0}/CHANGELOG.md +3 -0
  3. {tactus-0.29.4 → tactus-0.30.0}/PKG-INFO +9 -1
  4. {tactus-0.29.4 → tactus-0.30.0}/README.md +8 -0
  5. {tactus-0.29.4 → tactus-0.30.0}/examples/02-basics-simple-logic.tac +26 -26
  6. tactus-0.30.0/features/60_formatting.feature +37 -0
  7. tactus-0.30.0/features/steps/formatting_steps.py +153 -0
  8. tactus-0.30.0/planning/FORMATTER.md +48 -0
  9. {tactus-0.29.4 → tactus-0.30.0}/pyproject.toml +1 -1
  10. {tactus-0.29.4 → tactus-0.30.0}/tactus/__init__.py +1 -1
  11. {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/server.py +295 -3
  12. {tactus-0.29.4 → tactus-0.30.0}/tactus/cli/app.py +51 -0
  13. tactus-0.30.0/tactus/formatting/__init__.py +7 -0
  14. tactus-0.30.0/tactus/formatting/formatter.py +437 -0
  15. tactus-0.30.0/tests/test_formatter.py +77 -0
  16. {tactus-0.29.4 → tactus-0.30.0}/.claude/agents.md +0 -0
  17. {tactus-0.29.4 → tactus-0.30.0}/.github/workflows/release.yml +0 -0
  18. {tactus-0.29.4 → tactus-0.30.0}/.gitignore +0 -0
  19. {tactus-0.29.4 → tactus-0.30.0}/.tactus/config.yml.example +0 -0
  20. {tactus-0.29.4 → tactus-0.30.0}/IMPLEMENTATION.md +0 -0
  21. {tactus-0.29.4 → tactus-0.30.0}/LICENSE +0 -0
  22. {tactus-0.29.4 → tactus-0.30.0}/Makefile +0 -0
  23. {tactus-0.29.4 → tactus-0.30.0}/SPECIFICATION.md +0 -0
  24. {tactus-0.29.4 → tactus-0.30.0}/TECHNICAL_DEBT.md +0 -0
  25. {tactus-0.29.4 → tactus-0.30.0}/behave.ini +0 -0
  26. {tactus-0.29.4 → tactus-0.30.0}/docs/AGENTS.md +0 -0
  27. {tactus-0.29.4 → tactus-0.30.0}/docs/BDD_TESTING.md +0 -0
  28. {tactus-0.29.4 → tactus-0.30.0}/docs/CONFIGURATION.md +0 -0
  29. {tactus-0.29.4 → tactus-0.30.0}/docs/DURABILITY.md +0 -0
  30. {tactus-0.29.4 → tactus-0.30.0}/docs/FILE_IO.md +0 -0
  31. {tactus-0.29.4 → tactus-0.30.0}/docs/SANDBOXING.md +0 -0
  32. {tactus-0.29.4 → tactus-0.30.0}/docs/STREAMING.md +0 -0
  33. {tactus-0.29.4 → tactus-0.30.0}/docs/TOOLS.md +0 -0
  34. {tactus-0.29.4 → tactus-0.30.0}/docs/TOOL_ROADMAP.md +0 -0
  35. {tactus-0.29.4 → tactus-0.30.0}/docs/development-mode.md +0 -0
  36. {tactus-0.29.4 → tactus-0.30.0}/examples/.tactus/config.yml +0 -0
  37. {tactus-0.29.4 → tactus-0.30.0}/examples/01-basics-hello-world.tac +0 -0
  38. {tactus-0.29.4 → tactus-0.30.0}/examples/03-basics-parameters.tac +0 -0
  39. {tactus-0.29.4 → tactus-0.30.0}/examples/04-basics-simple-agent.tac +0 -0
  40. {tactus-0.29.4 → tactus-0.30.0}/examples/05-basics-multi-model.tac +0 -0
  41. {tactus-0.29.4 → tactus-0.30.0}/examples/06-basics-streaming.tac +0 -0
  42. {tactus-0.29.4 → tactus-0.30.0}/examples/07-basics-bedrock.tac +0 -0
  43. {tactus-0.29.4 → tactus-0.30.0}/examples/08-basics-models.tac +0 -0
  44. {tactus-0.29.4 → tactus-0.30.0}/examples/09-basics-google-gemini.tac +0 -0
  45. {tactus-0.29.4 → tactus-0.30.0}/examples/10-feature-state.tac +0 -0
  46. {tactus-0.29.4 → tactus-0.30.0}/examples/11-feature-message-history.tac +0 -0
  47. {tactus-0.29.4 → tactus-0.30.0}/examples/12-feature-structured-output.tac +0 -0
  48. {tactus-0.29.4 → tactus-0.30.0}/examples/13-feature-session.tac +0 -0
  49. {tactus-0.29.4 → tactus-0.30.0}/examples/14-feature-per-turn-tools-simple.tac +0 -0
  50. {tactus-0.29.4 → tactus-0.30.0}/examples/14-feature-per-turn-tools.tac +0 -0
  51. {tactus-0.29.4 → tactus-0.30.0}/examples/15-feature-local-tools.tac +0 -0
  52. {tactus-0.29.4 → tactus-0.30.0}/examples/16-feature-toolsets-advanced.tac +0 -0
  53. {tactus-0.29.4 → tactus-0.30.0}/examples/17-feature-toolsets-dsl.tac +0 -0
  54. {tactus-0.29.4 → tactus-0.30.0}/examples/18-feature-lua-tools-individual.tac +0 -0
  55. {tactus-0.29.4 → tactus-0.30.0}/examples/18-feature-lua-tools-inline.tac +0 -0
  56. {tactus-0.29.4 → tactus-0.30.0}/examples/18-feature-lua-tools-toolset.tac +0 -0
  57. {tactus-0.29.4 → tactus-0.30.0}/examples/19-feature-direct-tool-calls.tac +0 -0
  58. {tactus-0.29.4 → tactus-0.30.0}/examples/20-bdd-complete.tac +0 -0
  59. {tactus-0.29.4 → tactus-0.30.0}/examples/20-bdd-complete.tac.bak2 +0 -0
  60. {tactus-0.29.4 → tactus-0.30.0}/examples/21-bdd-passing.tac +0 -0
  61. {tactus-0.29.4 → tactus-0.30.0}/examples/21-bdd-passing.tac.bak2 +0 -0
  62. {tactus-0.29.4 → tactus-0.30.0}/examples/30-eval-simple.tac +0 -0
  63. {tactus-0.29.4 → tactus-0.30.0}/examples/31-eval-demo.tac +0 -0
  64. {tactus-0.29.4 → tactus-0.30.0}/examples/32-eval-success-rate.tac +0 -0
  65. {tactus-0.29.4 → tactus-0.30.0}/examples/33-eval-thresholds.tac +0 -0
  66. {tactus-0.29.4 → tactus-0.30.0}/examples/34-eval-dataset.jsonl +0 -0
  67. {tactus-0.29.4 → tactus-0.30.0}/examples/34-eval-dataset.tac +0 -0
  68. {tactus-0.29.4 → tactus-0.30.0}/examples/35-eval-trace.tac +0 -0
  69. {tactus-0.29.4 → tactus-0.30.0}/examples/35-eval-trace.tac.bak2 +0 -0
  70. {tactus-0.29.4 → tactus-0.30.0}/examples/36-eval-advanced.tac +0 -0
  71. {tactus-0.29.4 → tactus-0.30.0}/examples/37-eval-comprehensive.tac +0 -0
  72. {tactus-0.29.4 → tactus-0.30.0}/examples/37-eval-comprehensive.tac.bak2 +0 -0
  73. {tactus-0.29.4 → tactus-0.30.0}/examples/39-model-simple.tac +0 -0
  74. {tactus-0.29.4 → tactus-0.30.0}/examples/40-mcp-test.tac +0 -0
  75. {tactus-0.29.4 → tactus-0.30.0}/examples/40-model-text-classifier.tac +0 -0
  76. {tactus-0.29.4 → tactus-0.30.0}/examples/41-mcp-simple.tac +0 -0
  77. {tactus-0.29.4 → tactus-0.30.0}/examples/41-model-pytorch.tac +0 -0
  78. {tactus-0.29.4 → tactus-0.30.0}/examples/43-sub-procedure-simple.tac +0 -0
  79. {tactus-0.29.4 → tactus-0.30.0}/examples/44-sub-procedure-composition.tac +0 -0
  80. {tactus-0.29.4 → tactus-0.30.0}/examples/45-sub-procedure-recursive.tac +0 -0
  81. {tactus-0.29.4 → tactus-0.30.0}/examples/46-checkpoint-explicit.tac +0 -0
  82. {tactus-0.29.4 → tactus-0.30.0}/examples/47-checkpoint-expensive-ops.tac +0 -0
  83. {tactus-0.29.4 → tactus-0.30.0}/examples/48-script-mode-simple.tac +0 -0
  84. {tactus-0.29.4 → tactus-0.30.0}/examples/50-inputs-showcase.tac +0 -0
  85. {tactus-0.29.4 → tactus-0.30.0}/examples/51-inputs-calculator.tac +0 -0
  86. {tactus-0.29.4 → tactus-0.30.0}/examples/52-file-io-basics.tac +0 -0
  87. {tactus-0.29.4 → tactus-0.30.0}/examples/53-tsv-file-io.tac +0 -0
  88. {tactus-0.29.4 → tactus-0.30.0}/examples/54-json-file-io.tac +0 -0
  89. {tactus-0.29.4 → tactus-0.30.0}/examples/55-parquet-file-io.tac +0 -0
  90. {tactus-0.29.4 → tactus-0.30.0}/examples/56-hdf5-file-io.tac +0 -0
  91. {tactus-0.29.4 → tactus-0.30.0}/examples/57-excel-file-io.tac +0 -0
  92. {tactus-0.29.4 → tactus-0.30.0}/examples/58-text-file-io.tac +0 -0
  93. {tactus-0.29.4 → tactus-0.30.0}/examples/60-tool-sources.tac +0 -0
  94. {tactus-0.29.4 → tactus-0.30.0}/examples/61-inline-toolset-lua.tac +0 -0
  95. {tactus-0.29.4 → tactus-0.30.0}/examples/62-mcp-toolset-by-server.tac +0 -0
  96. {tactus-0.29.4 → tactus-0.30.0}/examples/63-toolset-import-from-file.tac +0 -0
  97. {tactus-0.29.4 → tactus-0.30.0}/examples/64-require-modules.tac +0 -0
  98. {tactus-0.29.4 → tactus-0.30.0}/examples/65-optional-state-demo.tac +0 -0
  99. {tactus-0.29.4 → tactus-0.30.0}/examples/66-host-tools-via-broker.tac +0 -0
  100. {tactus-0.29.4 → tactus-0.30.0}/examples/67-host-tool-source.tac +0 -0
  101. {tactus-0.29.4 → tactus-0.30.0}/examples/70-mocking-static.tac +0 -0
  102. {tactus-0.29.4 → tactus-0.30.0}/examples/71-mocking-temporal.tac +0 -0
  103. {tactus-0.29.4 → tactus-0.30.0}/examples/72-mocking-conditional.tac +0 -0
  104. {tactus-0.29.4 → tactus-0.30.0}/examples/99-misc-test-loading.tac +0 -0
  105. {tactus-0.29.4 → tactus-0.30.0}/examples/README.md +0 -0
  106. {tactus-0.29.4 → tactus-0.30.0}/examples/app_config.ini +0 -0
  107. {tactus-0.29.4 → tactus-0.30.0}/examples/data/sample.csv +0 -0
  108. {tactus-0.29.4 → tactus-0.30.0}/examples/demo_output.json +0 -0
  109. {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/math_module.tac +0 -0
  110. {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/product.tac +0 -0
  111. {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/string_module.tac +0 -0
  112. {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/sum.tac +0 -0
  113. {tactus-0.29.4 → tactus-0.30.0}/examples/helpers/text_tools.tac +0 -0
  114. {tactus-0.29.4 → tactus-0.30.0}/examples/inventory_summary.tsv +0 -0
  115. {tactus-0.29.4 → tactus-0.30.0}/examples/mock-config.json +0 -0
  116. {tactus-0.29.4 → tactus-0.30.0}/examples/models/README.md +0 -0
  117. {tactus-0.29.4 → tactus-0.30.0}/examples/models/create_sentiment_model.py +0 -0
  118. {tactus-0.29.4 → tactus-0.30.0}/examples/output_summary.txt +0 -0
  119. {tactus-0.29.4 → tactus-0.30.0}/examples/test-raw-module.tac +0 -0
  120. {tactus-0.29.4 → tactus-0.30.0}/examples/test-raw-streaming.tac +0 -0
  121. {tactus-0.29.4 → tactus-0.30.0}/examples/tools/calculations.py +0 -0
  122. {tactus-0.29.4 → tactus-0.30.0}/examples/tools/data_analysis.py +0 -0
  123. {tactus-0.29.4 → tactus-0.30.0}/examples/tools/search.py +0 -0
  124. {tactus-0.29.4 → tactus-0.30.0}/examples/with_dependencies/README.md +0 -0
  125. {tactus-0.29.4 → tactus-0.30.0}/examples/with_dependencies/simple_http_test.tac +0 -0
  126. {tactus-0.29.4 → tactus-0.30.0}/examples/with_dependencies/time_lookup.tac +0 -0
  127. {tactus-0.29.4 → tactus-0.30.0}/features/01_state_management.feature +0 -0
  128. {tactus-0.29.4 → tactus-0.30.0}/features/02_checkpointing.feature +0 -0
  129. {tactus-0.29.4 → tactus-0.30.0}/features/03_human_in_the_loop.feature +0 -0
  130. {tactus-0.29.4 → tactus-0.30.0}/features/04_control_flow.feature +0 -0
  131. {tactus-0.29.4 → tactus-0.30.0}/features/05_tool_integration.feature +0 -0
  132. {tactus-0.29.4 → tactus-0.30.0}/features/06_retry_logic.feature +0 -0
  133. {tactus-0.29.4 → tactus-0.30.0}/features/07_file_operations.feature +0 -0
  134. {tactus-0.29.4 → tactus-0.30.0}/features/08_agent_primitives.feature +0 -0
  135. {tactus-0.29.4 → tactus-0.30.0}/features/09_workflow_execution.feature +0 -0
  136. {tactus-0.29.4 → tactus-0.30.0}/features/10_lua_integration.feature +0 -0
  137. {tactus-0.29.4 → tactus-0.30.0}/features/11_storage_backends.feature +0 -0
  138. {tactus-0.29.4 → tactus-0.30.0}/features/12_json_operations.feature +0 -0
  139. {tactus-0.29.4 → tactus-0.30.0}/features/13_logging.feature +0 -0
  140. {tactus-0.29.4 → tactus-0.30.0}/features/14_stage_and_step_tracking.feature +0 -0
  141. {tactus-0.29.4 → tactus-0.30.0}/features/15_procedure_calls.feature +0 -0
  142. {tactus-0.29.4 → tactus-0.30.0}/features/16_session_management.feature +0 -0
  143. {tactus-0.29.4 → tactus-0.30.0}/features/17_lua_dsl_validation.feature +0 -0
  144. {tactus-0.29.4 → tactus-0.30.0}/features/18_example_procedures.feature +0 -0
  145. {tactus-0.29.4 → tactus-0.30.0}/features/19_ide_server.feature +0 -0
  146. {tactus-0.29.4 → tactus-0.30.0}/features/20_parameters.feature +0 -0
  147. {tactus-0.29.4 → tactus-0.30.0}/features/21_outputs.feature +0 -0
  148. {tactus-0.29.4 → tactus-0.30.0}/features/23_prompts.feature +0 -0
  149. {tactus-0.29.4 → tactus-0.30.0}/features/24_bdd_specifications.feature +0 -0
  150. {tactus-0.29.4 → tactus-0.30.0}/features/25_bdd_custom_steps.feature +0 -0
  151. {tactus-0.29.4 → tactus-0.30.0}/features/26_bdd_evaluation.feature +0 -0
  152. {tactus-0.29.4 → tactus-0.30.0}/features/27_default_settings.feature +0 -0
  153. {tactus-0.29.4 → tactus-0.30.0}/features/28_custom_prompts.feature +0 -0
  154. {tactus-0.29.4 → tactus-0.30.0}/features/29_execution_settings.feature +0 -0
  155. {tactus-0.29.4 → tactus-0.30.0}/features/30_session_filters.feature +0 -0
  156. {tactus-0.29.4 → tactus-0.30.0}/features/31_matchers.feature +0 -0
  157. {tactus-0.29.4 → tactus-0.30.0}/features/32_result_object.feature +0 -0
  158. {tactus-0.29.4 → tactus-0.30.0}/features/33_output_type.feature +0 -0
  159. {tactus-0.29.4 → tactus-0.30.0}/features/42_model_primitive.feature +0 -0
  160. {tactus-0.29.4 → tactus-0.30.0}/features/43_sub_procedure_checkpointing.feature +0 -0
  161. {tactus-0.29.4 → tactus-0.30.0}/features/46_explicit_checkpoint.feature +0 -0
  162. {tactus-0.29.4 → tactus-0.30.0}/features/48_script_mode.feature +0 -0
  163. {tactus-0.29.4 → tactus-0.30.0}/features/51_dspy_lm_config.feature +0 -0
  164. {tactus-0.29.4 → tactus-0.30.0}/features/52_dspy_signature.feature +0 -0
  165. {tactus-0.29.4 → tactus-0.30.0}/features/53_dspy_module.feature +0 -0
  166. {tactus-0.29.4 → tactus-0.30.0}/features/54_dspy_history.feature +0 -0
  167. {tactus-0.29.4 → tactus-0.30.0}/features/55_dspy_prediction.feature +0 -0
  168. {tactus-0.29.4 → tactus-0.30.0}/features/56_dspy_agent.feature +0 -0
  169. {tactus-0.29.4 → tactus-0.30.0}/features/57_chat_assistant.feature +0 -0
  170. {tactus-0.29.4 → tactus-0.30.0}/features/documentation/IDE_SERVER_BEHAVIOR.md +0 -0
  171. {tactus-0.29.4 → tactus-0.30.0}/features/documentation/Lua DSL/README.md +0 -0
  172. {tactus-0.29.4 → tactus-0.30.0}/features/environment.py +0 -0
  173. {tactus-0.29.4 → tactus-0.30.0}/features/steps/agent_primitives_steps.py +0 -0
  174. {tactus-0.29.4 → tactus-0.30.0}/features/steps/chat_assistant_steps.py +0 -0
  175. {tactus-0.29.4 → tactus-0.30.0}/features/steps/checkpointing_steps.py +0 -0
  176. {tactus-0.29.4 → tactus-0.30.0}/features/steps/control_flow_steps.py +0 -0
  177. {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_agent_steps.py +0 -0
  178. {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_history_steps.py +0 -0
  179. {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_lm_steps.py +0 -0
  180. {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_module_steps.py +0 -0
  181. {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_prediction_steps.py +0 -0
  182. {tactus-0.29.4 → tactus-0.30.0}/features/steps/dspy_signature_steps.py +0 -0
  183. {tactus-0.29.4 → tactus-0.30.0}/features/steps/example_procedures_steps.py +0 -0
  184. {tactus-0.29.4 → tactus-0.30.0}/features/steps/file_operations_steps.py +0 -0
  185. {tactus-0.29.4 → tactus-0.30.0}/features/steps/human_in_the_loop_steps.py +0 -0
  186. {tactus-0.29.4 → tactus-0.30.0}/features/steps/ide_server_steps.py +0 -0
  187. {tactus-0.29.4 → tactus-0.30.0}/features/steps/json_operations_steps.py +0 -0
  188. {tactus-0.29.4 → tactus-0.30.0}/features/steps/logging_steps.py +0 -0
  189. {tactus-0.29.4 → tactus-0.30.0}/features/steps/lua_dsl_validation_steps.py +0 -0
  190. {tactus-0.29.4 → tactus-0.30.0}/features/steps/lua_integration_steps.py +0 -0
  191. {tactus-0.29.4 → tactus-0.30.0}/features/steps/mocking_steps.py +0 -0
  192. {tactus-0.29.4 → tactus-0.30.0}/features/steps/procedure_calls_steps.py +0 -0
  193. {tactus-0.29.4 → tactus-0.30.0}/features/steps/result_and_output_steps.py +0 -0
  194. {tactus-0.29.4 → tactus-0.30.0}/features/steps/retry_logic_steps.py +0 -0
  195. {tactus-0.29.4 → tactus-0.30.0}/features/steps/session_management_steps.py +0 -0
  196. {tactus-0.29.4 → tactus-0.30.0}/features/steps/stage_tracking_steps.py +0 -0
  197. {tactus-0.29.4 → tactus-0.30.0}/features/steps/state_management_steps.py +0 -0
  198. {tactus-0.29.4 → tactus-0.30.0}/features/steps/storage_backend_steps.py +0 -0
  199. {tactus-0.29.4 → tactus-0.30.0}/features/steps/support/__init__.py +0 -0
  200. {tactus-0.29.4 → tactus-0.30.0}/features/steps/support/harnesses.py +0 -0
  201. {tactus-0.29.4 → tactus-0.30.0}/features/steps/tool_integration_steps.py +0 -0
  202. {tactus-0.29.4 → tactus-0.30.0}/features/steps/workflow_execution_steps.py +0 -0
  203. {tactus-0.29.4 → tactus-0.30.0}/planning/BROKER_AND_TOOL_RUNNERS.md +0 -0
  204. {tactus-0.29.4 → tactus-0.30.0}/scripts/audit_examples_mocking.py +0 -0
  205. {tactus-0.29.4 → tactus-0.30.0}/scripts/convert_examples.py +0 -0
  206. {tactus-0.29.4 → tactus-0.30.0}/start-web-ide.sh +0 -0
  207. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/__init__.py +0 -0
  208. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/broker_log.py +0 -0
  209. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/cli_hitl.py +0 -0
  210. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/cli_log.py +0 -0
  211. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/cost_collector_log.py +0 -0
  212. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/file_storage.py +0 -0
  213. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/http_callback_log.py +0 -0
  214. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/ide_log.py +0 -0
  215. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/lua_tools.py +0 -0
  216. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/mcp.py +0 -0
  217. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/mcp_manager.py +0 -0
  218. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/memory.py +0 -0
  219. {tactus-0.29.4 → tactus-0.30.0}/tactus/adapters/plugins.py +0 -0
  220. {tactus-0.29.4 → tactus-0.30.0}/tactus/backends/http_backend.py +0 -0
  221. {tactus-0.29.4 → tactus-0.30.0}/tactus/backends/model_backend.py +0 -0
  222. {tactus-0.29.4 → tactus-0.30.0}/tactus/backends/pytorch_backend.py +0 -0
  223. {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/__init__.py +0 -0
  224. {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/client.py +0 -0
  225. {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/protocol.py +0 -0
  226. {tactus-0.29.4 → tactus-0.30.0}/tactus/broker/stdio.py +0 -0
  227. {tactus-0.29.4 → tactus-0.30.0}/tactus/cli/__init__.py +0 -0
  228. {tactus-0.29.4 → tactus-0.30.0}/tactus/cli/commands/__init__.py +0 -0
  229. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/__init__.py +0 -0
  230. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/config_manager.py +0 -0
  231. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/dependencies/__init__.py +0 -0
  232. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/dependencies/registry.py +0 -0
  233. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/dsl_stubs.py +0 -0
  234. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/exceptions.py +0 -0
  235. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/execution_context.py +0 -0
  236. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/lua_sandbox.py +0 -0
  237. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/message_history_manager.py +0 -0
  238. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/mocking.py +0 -0
  239. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/output_validator.py +0 -0
  240. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/registry.py +0 -0
  241. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/runtime.py +0 -0
  242. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/template_resolver.py +0 -0
  243. {tactus-0.29.4 → tactus-0.30.0}/tactus/core/yaml_parser.py +0 -0
  244. {tactus-0.29.4 → tactus-0.30.0}/tactus/docker/Dockerfile +0 -0
  245. {tactus-0.29.4 → tactus-0.30.0}/tactus/docker/entrypoint.sh +0 -0
  246. {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/__init__.py +0 -0
  247. {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/agent.py +0 -0
  248. {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/broker_lm.py +0 -0
  249. {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/config.py +0 -0
  250. {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/history.py +0 -0
  251. {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/module.py +0 -0
  252. {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/prediction.py +0 -0
  253. {tactus-0.29.4 → tactus-0.30.0}/tactus/dspy/signature.py +0 -0
  254. {tactus-0.29.4 → tactus-0.30.0}/tactus/ide/__init__.py +0 -0
  255. {tactus-0.29.4 → tactus-0.30.0}/tactus/ide/coding_assistant.py +0 -0
  256. {tactus-0.29.4 → tactus-0.30.0}/tactus/ide/server.py +0 -0
  257. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/__init__.py +0 -0
  258. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/control.py +0 -0
  259. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/file.py +0 -0
  260. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/handles.py +0 -0
  261. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/host.py +0 -0
  262. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/human.py +0 -0
  263. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/json.py +0 -0
  264. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/log.py +0 -0
  265. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/message_history.py +0 -0
  266. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/model.py +0 -0
  267. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/procedure.py +0 -0
  268. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/procedure_callable.py +0 -0
  269. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/retry.py +0 -0
  270. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/session.py +0 -0
  271. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/stage.py +0 -0
  272. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/state.py +0 -0
  273. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/step.py +0 -0
  274. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/system.py +0 -0
  275. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/tool.py +0 -0
  276. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/tool_handle.py +0 -0
  277. {tactus-0.29.4 → tactus-0.30.0}/tactus/primitives/toolset.py +0 -0
  278. {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/__init__.py +0 -0
  279. {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/chat_recorder.py +0 -0
  280. {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/config.py +0 -0
  281. {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/cost.py +0 -0
  282. {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/hitl.py +0 -0
  283. {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/log_handler.py +0 -0
  284. {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/models.py +0 -0
  285. {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/result.py +0 -0
  286. {tactus-0.29.4 → tactus-0.30.0}/tactus/protocols/storage.py +0 -0
  287. {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/__init__.py +0 -0
  288. {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/base.py +0 -0
  289. {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/bedrock.py +0 -0
  290. {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/google.py +0 -0
  291. {tactus-0.29.4 → tactus-0.30.0}/tactus/providers/openai.py +0 -0
  292. {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/__init__.py +0 -0
  293. {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/config.py +0 -0
  294. {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/container_runner.py +0 -0
  295. {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/docker_manager.py +0 -0
  296. {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/entrypoint.py +0 -0
  297. {tactus-0.29.4 → tactus-0.30.0}/tactus/sandbox/protocol.py +0 -0
  298. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/__init__.py +0 -0
  299. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/__init__.py +0 -0
  300. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/csv.py +0 -0
  301. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/excel.py +0 -0
  302. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/file.py +0 -0
  303. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/fs.py +0 -0
  304. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/hdf5.py +0 -0
  305. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/json.py +0 -0
  306. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/parquet.py +0 -0
  307. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/io/tsv.py +0 -0
  308. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/loader.py +0 -0
  309. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/tac/tactus/tools/done.tac +0 -0
  310. {tactus-0.29.4 → tactus-0.30.0}/tactus/stdlib/tac/tactus/tools/log.tac +0 -0
  311. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/README.md +0 -0
  312. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/__init__.py +0 -0
  313. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/behave_integration.py +0 -0
  314. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/context.py +0 -0
  315. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/eval_models.py +0 -0
  316. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/evaluation_runner.py +0 -0
  317. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/evaluators.py +0 -0
  318. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/events.py +0 -0
  319. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/gherkin_parser.py +0 -0
  320. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_agent.py +0 -0
  321. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_dependencies.py +0 -0
  322. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_hitl.py +0 -0
  323. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_registry.py +0 -0
  324. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/mock_tools.py +0 -0
  325. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/models.py +0 -0
  326. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/pydantic_eval_runner.py +0 -0
  327. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/steps/__init__.py +0 -0
  328. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/steps/builtin.py +0 -0
  329. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/steps/custom.py +0 -0
  330. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/steps/registry.py +0 -0
  331. {tactus-0.29.4 → tactus-0.30.0}/tactus/testing/test_runner.py +0 -0
  332. {tactus-0.29.4 → tactus-0.30.0}/tactus/tracing/__init__.py +0 -0
  333. {tactus-0.29.4 → tactus-0.30.0}/tactus/tracing/trace_manager.py +0 -0
  334. {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/__init__.py +0 -0
  335. {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/cost_calculator.py +0 -0
  336. {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/model_pricing.py +0 -0
  337. {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/safe_file_library.py +0 -0
  338. {tactus-0.29.4 → tactus-0.30.0}/tactus/utils/safe_libraries.py +0 -0
  339. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/LuaLexerBase.py +0 -0
  340. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/LuaParserBase.py +0 -0
  341. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/README.md +0 -0
  342. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/__init__.py +0 -0
  343. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/error_listener.py +0 -0
  344. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaLexer.interp +0 -0
  345. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaLexer.py +0 -0
  346. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaLexer.tokens +0 -0
  347. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaLexerBase.py +0 -0
  348. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParser.interp +0 -0
  349. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParser.py +0 -0
  350. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParser.tokens +0 -0
  351. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParserBase.py +0 -0
  352. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/LuaParserVisitor.py +0 -0
  353. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/generated/__init__.py +0 -0
  354. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/grammar/LuaLexer.g4 +0 -0
  355. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/grammar/LuaParser.g4 +0 -0
  356. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/semantic_visitor.py +0 -0
  357. {tactus-0.29.4 → tactus-0.30.0}/tactus/validation/validator.py +0 -0
  358. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/.gitignore +0 -0
  359. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/BUILD_GUIDE.md +0 -0
  360. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/ELECTRON_INTEGRATION.md +0 -0
  361. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/README.md +0 -0
  362. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/RUN_ELECTRON.md +0 -0
  363. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/SETUP_COMPLETE.md +0 -0
  364. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/backend/hook-lupa.py +0 -0
  365. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/backend/tactus_backend.spec +0 -0
  366. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/package-lock.json +0 -0
  367. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/package.json +0 -0
  368. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/preload/preload.ts +0 -0
  369. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/preload/tsconfig.json +0 -0
  370. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/rebuild-and-test.sh +0 -0
  371. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/resources/app-icon.icns +0 -0
  372. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/resources/app-icon.ico +0 -0
  373. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/resources/app-icon.png +0 -0
  374. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/scripts/build-backend.js +0 -0
  375. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/scripts/build-frontend.js +0 -0
  376. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/scripts/generate-icons.sh +0 -0
  377. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/src/backend-manager.ts +0 -0
  378. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/src/main.ts +0 -0
  379. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/src/menu.ts +0 -0
  380. {tactus-0.29.4 → tactus-0.30.0}/tactus-desktop/tsconfig.json +0 -0
  381. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/ARCHITECTURE.md +0 -0
  382. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/CHANGELOG.md +0 -0
  383. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/DEV_MODE.md +0 -0
  384. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/QUICK_START.md +0 -0
  385. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/README.md +0 -0
  386. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/RESTART_INSTRUCTIONS.md +0 -0
  387. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/TROUBLESHOOTING.md +0 -0
  388. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/README.md +0 -0
  389. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/assistant_service.py +0 -0
  390. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/assistant_tools.py +0 -0
  391. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/chat_server.py +0 -0
  392. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/config_server.py +0 -0
  393. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/events.py +0 -0
  394. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/logging_capture.py +0 -0
  395. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/lsp_server.py +0 -0
  396. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/requirements.txt +0 -0
  397. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/tactus_lsp_handler.py +0 -0
  398. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/test_lsp_server.py +0 -0
  399. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/backend/text_editor_tool.py +0 -0
  400. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/dev.sh +0 -0
  401. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/.storybook/main.ts +0 -0
  402. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/.storybook/preview.ts +0 -0
  403. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/.storybook/vitest.setup.ts +0 -0
  404. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/README.md +0 -0
  405. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/demo.ts +0 -0
  406. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/index.html +0 -0
  407. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/jest.config.js +0 -0
  408. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/package-lock.json +0 -0
  409. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/package.json +0 -0
  410. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/postcss.config.js +0 -0
  411. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/App.tsx +0 -0
  412. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/Editor.tsx +0 -0
  413. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/LSPClient.ts +0 -0
  414. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/LSPClientHTTP.ts +0 -0
  415. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/TactusLanguage.ts +0 -0
  416. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/commands/registry.ts +0 -0
  417. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/AboutDialog.tsx +0 -0
  418. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ChatSidebar.tsx +0 -0
  419. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/CheckpointSummary.tsx +0 -0
  420. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/CollapsibleRun.tsx +0 -0
  421. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/Duration.stories.tsx +0 -0
  422. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/Duration.tsx +0 -0
  423. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/FileTree.stories.tsx +0 -0
  424. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/FileTree.tsx +0 -0
  425. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/MessageFeed.tsx +0 -0
  426. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/PreferencesView.tsx +0 -0
  427. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.stories.tsx +0 -0
  428. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsDisplay.tsx +0 -0
  429. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.stories.tsx +0 -0
  430. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureInputsModal.tsx +0 -0
  431. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureTab.stories.tsx +0 -0
  432. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ProcedureTab.tsx +0 -0
  433. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ResizeHandle.tsx +0 -0
  434. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ResultsSidebar.stories.tsx +0 -0
  435. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ResultsSidebar.tsx +0 -0
  436. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/TestOptionsModal.tsx +0 -0
  437. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/Timestamp.stories.tsx +0 -0
  438. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/Timestamp.tsx +0 -0
  439. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/TopMenuBar.stories.tsx +0 -0
  440. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/chat/ChatInterface.tsx +0 -0
  441. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/chat/MessageInput.tsx +0 -0
  442. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/chat/MessageList.tsx +0 -0
  443. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.stories.tsx +0 -0
  444. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointDetails.tsx +0 -0
  445. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.stories.tsx +0 -0
  446. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/CheckpointList.tsx +0 -0
  447. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.stories.tsx +0 -0
  448. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/DebuggerPanel.tsx +0 -0
  449. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/RunSelector.stories.tsx +0 -0
  450. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/RunSelector.tsx +0 -0
  451. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.stories.tsx +0 -0
  452. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/debugger/StatisticsPanel.tsx +0 -0
  453. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/AgentStreamingComponent.tsx +0 -0
  454. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/BaseEventComponent.tsx +0 -0
  455. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CheckpointEventComponent.tsx +0 -0
  456. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CollapsibleTestScenario.tsx +0 -0
  457. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ContainerStatusEventComponent.tsx +0 -0
  458. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CostEventComponent.stories.tsx +0 -0
  459. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/CostEventComponent.tsx +0 -0
  460. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.stories.tsx +0 -0
  461. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/EvaluationEventComponent.tsx +0 -0
  462. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/EventRenderer.tsx +0 -0
  463. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.stories.tsx +0 -0
  464. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionEventComponent.tsx +0 -0
  465. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.stories.tsx +0 -0
  466. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ExecutionSummaryEventComponent.tsx +0 -0
  467. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.stories.tsx +0 -0
  468. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LoadingEventComponent.tsx +0 -0
  469. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LogCluster.tsx +0 -0
  470. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LogEventComponent.stories.tsx +0 -0
  471. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/LogEventComponent.tsx +0 -0
  472. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.stories.tsx +0 -0
  473. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/OutputEventComponent.tsx +0 -0
  474. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/TestEventComponent.stories.tsx +0 -0
  475. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/TestEventComponent.tsx +0 -0
  476. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/TestProgressContainer.tsx +0 -0
  477. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ToolCallEventComponent.tsx +0 -0
  478. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.stories.tsx +0 -0
  479. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/events/ValidationEventComponent.tsx +0 -0
  480. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/AgentsSection.tsx +0 -0
  481. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/EvaluationsSection.tsx +0 -0
  482. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/MetadataSections.stories.tsx +0 -0
  483. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/OutputsSection.tsx +0 -0
  484. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/ParametersSection.tsx +0 -0
  485. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/SpecificationsSection.tsx +0 -0
  486. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/StagesSection.tsx +0 -0
  487. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/metadata/ToolsSection.tsx +0 -0
  488. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/preferences/ConfigFieldView.tsx +0 -0
  489. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/preferences/SourceBadge.tsx +0 -0
  490. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/preferences/YamlCodeEditor.tsx +0 -0
  491. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/EvaluateScenarios.stories.tsx +0 -0
  492. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/RunScenarios.stories.tsx +0 -0
  493. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/TestScenarios.stories.tsx +0 -0
  494. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/scenarios/ValidationScenarios.stories.tsx +0 -0
  495. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/theme-provider.tsx +0 -0
  496. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/ai/conversation.tsx +0 -0
  497. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/ai/message.tsx +0 -0
  498. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/ai/prompt-input.tsx +0 -0
  499. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/badge.tsx +0 -0
  500. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/button.tsx +0 -0
  501. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/dialog.tsx +0 -0
  502. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/dropdown-menu.tsx +0 -0
  503. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/input.tsx +0 -0
  504. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/label.tsx +0 -0
  505. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/logo.stories.tsx +0 -0
  506. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/logo.tsx +0 -0
  507. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/menubar.tsx +0 -0
  508. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/scroll-area.tsx +0 -0
  509. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/select.tsx +0 -0
  510. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/separator.tsx +0 -0
  511. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/switch.tsx +0 -0
  512. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/tabs.tsx +0 -0
  513. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/components/ui/tooltip.tsx +0 -0
  514. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/hooks/useChatSSE.ts +0 -0
  515. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/hooks/useEventStream.ts +0 -0
  516. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/hooks/useTracing.ts +0 -0
  517. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/index.css +0 -0
  518. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/lib/utils.ts +0 -0
  519. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/main.tsx +0 -0
  520. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/events.ts +0 -0
  521. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/metadata.ts +0 -0
  522. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/preferences.ts +0 -0
  523. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/results.ts +0 -0
  524. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/types/tracing.ts +0 -0
  525. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/utils/yamlSync.ts +0 -0
  526. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/validation/TactusValidator.ts +0 -0
  527. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/validation/generated/LuaParser.interp +0 -0
  528. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/validation/generated/LuaParser.tokens +0 -0
  529. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/validation/types.ts +0 -0
  530. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/src/vite-env.d.ts +0 -0
  531. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/tailwind.config.js +0 -0
  532. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/tsconfig.json +0 -0
  533. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/tsconfig.node.json +0 -0
  534. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/vite.config.ts +0 -0
  535. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/frontend/vitest.shims.d.ts +0 -0
  536. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/package.json +0 -0
  537. {tactus-0.29.4 → tactus-0.30.0}/tactus-ide/start-dev.sh +0 -0
  538. {tactus-0.29.4 → tactus-0.30.0}/test-ci.sh +0 -0
  539. {tactus-0.29.4 → tactus-0.30.0}/tests/__init__.py +0 -0
  540. {tactus-0.29.4 → tactus-0.30.0}/tests/adapters/__init__.py +0 -0
  541. {tactus-0.29.4 → tactus-0.30.0}/tests/adapters/test_lua_tools_adapter.py +0 -0
  542. {tactus-0.29.4 → tactus-0.30.0}/tests/adapters/test_plugins.py +0 -0
  543. {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_broker_host_tool_source.py +0 -0
  544. {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_broker_integration.py +0 -0
  545. {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_broker_tcp_integration.py +0 -0
  546. {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_broker_tcp_unit.py +0 -0
  547. {tactus-0.29.4 → tactus-0.30.0}/tests/broker/test_brokered_lm_unit.py +0 -0
  548. {tactus-0.29.4 → tactus-0.30.0}/tests/cli/__init__.py +0 -0
  549. {tactus-0.29.4 → tactus-0.30.0}/tests/cli/test_cli.py +0 -0
  550. {tactus-0.29.4 → tactus-0.30.0}/tests/cli/test_cli_inputs.py +0 -0
  551. {tactus-0.29.4 → tactus-0.30.0}/tests/conftest.py +0 -0
  552. {tactus-0.29.4 → tactus-0.30.0}/tests/core/__init__.py +0 -0
  553. {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_config_manager.py +0 -0
  554. {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_determinism_safety.py +0 -0
  555. {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_lua_sandbox_security.py +0 -0
  556. {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_runtime_inputs.py +0 -0
  557. {tactus-0.29.4 → tactus-0.30.0}/tests/core/test_script_mode.py +0 -0
  558. {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/__init__.py +0 -0
  559. {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/test_mock_field_normalization.py +0 -0
  560. {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/test_module_parameter.py +0 -0
  561. {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/test_prediction_messages.py +0 -0
  562. {tactus-0.29.4 → tactus-0.30.0}/tests/dspy/test_streaming.py +0 -0
  563. {tactus-0.29.4 → tactus-0.30.0}/tests/fixtures/__init__.py +0 -0
  564. {tactus-0.29.4 → tactus-0.30.0}/tests/fixtures/test_mcp_server.py +0 -0
  565. {tactus-0.29.4 → tactus-0.30.0}/tests/integration/test_named_procedures.py +0 -0
  566. {tactus-0.29.4 → tactus-0.30.0}/tests/mocks/__init__.py +0 -0
  567. {tactus-0.29.4 → tactus-0.30.0}/tests/mocks/llm_mocks.py +0 -0
  568. {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_checkpoint_primitive.py +0 -0
  569. {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_host_primitive.py +0 -0
  570. {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_retry_primitive.py +0 -0
  571. {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_state_primitive.py +0 -0
  572. {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_system_alert.py +0 -0
  573. {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_tool_primitive.py +0 -0
  574. {tactus-0.29.4 → tactus-0.30.0}/tests/primitives/test_toolset_dsl.py +0 -0
  575. {tactus-0.29.4 → tactus-0.30.0}/tests/sandbox/test_container_runner.py +0 -0
  576. {tactus-0.29.4 → tactus-0.30.0}/tests/sandbox/test_docker_sandbox_smoke.py +0 -0
  577. {tactus-0.29.4 → tactus-0.30.0}/tests/stdlib/__init__.py +0 -0
  578. {tactus-0.29.4 → tactus-0.30.0}/tests/stdlib/test_loader.py +0 -0
  579. {tactus-0.29.4 → tactus-0.30.0}/tests/stdlib/test_require_python.py +0 -0
  580. {tactus-0.29.4 → tactus-0.30.0}/tests/test_checkpoints_integration.py +0 -0
  581. {tactus-0.29.4 → tactus-0.30.0}/tests/test_mcp_integration.py +0 -0
  582. {tactus-0.29.4 → tactus-0.30.0}/tests/test_tracing.py +0 -0
  583. {tactus-0.29.4 → tactus-0.30.0}/tests/testing/__init__.py +0 -0
  584. {tactus-0.29.4 → tactus-0.30.0}/tests/testing/conftest.py +0 -0
  585. {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_all_examples.py +0 -0
  586. {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_e2e.py +0 -0
  587. {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_gherkin_parser.py +0 -0
  588. {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_integration.py +0 -0
  589. {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_models.py +0 -0
  590. {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_runtime_integration.py +0 -0
  591. {tactus-0.29.4 → tactus-0.30.0}/tests/testing/test_step_registry.py +0 -0
  592. {tactus-0.29.4 → tactus-0.30.0}/tests/utils/__init__.py +0 -0
  593. {tactus-0.29.4 → tactus-0.30.0}/tests/utils/test_safe_file_library.py +0 -0
  594. {tactus-0.29.4 → tactus-0.30.0}/tests/validation/__init__.py +0 -0
  595. {tactus-0.29.4 → tactus-0.30.0}/tests/validation/test_tool_curried_syntax_disallowed.py +0 -0
@@ -376,6 +376,10 @@ Tactus has two distinct testing mechanisms that serve different purposes:
376
376
 
377
377
  The Tactus CLI provides powerful tools for developing and debugging agents.
378
378
 
379
+ ### Formatting `.tac` Files
380
+
381
+ Use `tactus format` to automatically reindent and normalize whitespace in `.tac` files.
382
+
379
383
  ### Running and Debugging Procedures
380
384
 
381
385
  When you run a procedure with `tactus run`, you get real-time visibility into what's happening:
@@ -2,6 +2,9 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.30.0 (2026-01-15)
6
+
7
+
5
8
  ## v0.29.4 (2026-01-15)
6
9
 
7
10
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tactus
3
- Version: 0.29.4
3
+ Version: 0.30.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
@@ -1665,6 +1665,12 @@ Agents:
1665
1665
  # Validate syntax and structure
1666
1666
  tactus validate workflow.tac
1667
1667
 
1668
+ # Format a workflow file (2-space indentation + normalized spacing)
1669
+ tactus format workflow.tac
1670
+
1671
+ # Check formatting without rewriting (exit 1 if changes needed)
1672
+ tactus format workflow.tac --check
1673
+
1668
1674
  # Run BDD specifications
1669
1675
  tactus test workflow.tac
1670
1676
 
@@ -1675,6 +1681,8 @@ tactus test workflow.tac --runs 10
1675
1681
  tactus eval workflow.tac --runs 10
1676
1682
  ```
1677
1683
 
1684
+ The `format` command uses Tactus's Lua parser to reindent and normalize whitespace while preserving the structure of the code.
1685
+
1678
1686
  ### Understanding Output
1679
1687
 
1680
1688
  The CLI displays several types of events:
@@ -1614,6 +1614,12 @@ Agents:
1614
1614
  # Validate syntax and structure
1615
1615
  tactus validate workflow.tac
1616
1616
 
1617
+ # Format a workflow file (2-space indentation + normalized spacing)
1618
+ tactus format workflow.tac
1619
+
1620
+ # Check formatting without rewriting (exit 1 if changes needed)
1621
+ tactus format workflow.tac --check
1622
+
1617
1623
  # Run BDD specifications
1618
1624
  tactus test workflow.tac
1619
1625
 
@@ -1624,6 +1630,8 @@ tactus test workflow.tac --runs 10
1624
1630
  tactus eval workflow.tac --runs 10
1625
1631
  ```
1626
1632
 
1633
+ The `format` command uses Tactus's Lua parser to reindent and normalize whitespace while preserving the structure of the code.
1634
+
1627
1635
  ### Understanding Output
1628
1636
 
1629
1637
  The CLI displays several types of events:
@@ -6,36 +6,36 @@ Stages({"start", "middle", "end"})
6
6
 
7
7
  -- Procedure with input, output, and state defined inline
8
8
  Procedure {
9
- input = {
10
- target_count = field.number{required = false, description = "Target counter value", default = 5},
11
- },
12
- output = {
13
- final_count = field.number{required = true, description = "Final counter value"},
14
- message = field.string{required = true, description = "Status message"},
15
- },
16
- function(input)
17
- -- Initialize
18
- Stage.set("start")
9
+ input = {
10
+ target_count = field.number{required = false, description = "Target counter value", default = 5},
11
+ },
12
+ output = {
13
+ final_count = field.number{required = true, description = "Final counter value"},
14
+ message = field.string{required = true, description = "Status message"},
15
+ },
16
+ function(input)
17
+ -- Initialize
18
+ Stage.set("start")
19
19
 
20
- -- Do work
21
- local target = input.target_count or 5
22
- for i = 1, target do
23
- state.counter = i
24
- end
20
+ -- Do work
21
+ local target = input.target_count or 5
22
+ for i = 1, target do
23
+ state.counter = i
24
+ end
25
25
 
26
- -- Transition to middle
27
- Stage.set("middle")
28
- state.message = "halfway"
26
+ -- Transition to middle
27
+ Stage.set("middle")
28
+ state.message = "halfway"
29
29
 
30
- -- Complete
31
- Stage.set("end")
32
- state.message = "complete"
30
+ -- Complete
31
+ Stage.set("end")
32
+ state.message = "complete"
33
33
 
34
- return {
35
- final_count = state.counter,
36
- message = state.message
37
- }
38
- end
34
+ return {
35
+ final_count = state.counter,
36
+ message = state.message
37
+ }
38
+ end
39
39
  }
40
40
 
41
41
  -- BDD Specifications
@@ -0,0 +1,37 @@
1
+ Feature: Formatting
2
+ Formatting produces stable, canonical Lua DSL text.
3
+
4
+ Scenario: Formatting enforces 2-space semantic indentation
5
+ Given a formatting environment
6
+ And a Lua DSL file with formatting issues
7
+ When I run "tactus format" on the file
8
+ Then the format command should succeed
9
+ And the file should be formatted with 2-space indentation
10
+
11
+ Scenario: Formatting is idempotent
12
+ Given a formatting environment
13
+ And a Lua DSL file with formatting issues
14
+ When I run "tactus format" on the file
15
+ And I run "tactus format" on the file
16
+ Then the format command should succeed
17
+ And the file should be unchanged by the second run
18
+
19
+ Scenario: Check mode detects required changes
20
+ Given a formatting environment
21
+ And a Lua DSL file with formatting issues
22
+ When I run "tactus format --check" on the file
23
+ Then the format command should fail
24
+
25
+ Scenario: Check mode passes when formatted
26
+ Given a formatting environment
27
+ And a Lua DSL file with formatting issues
28
+ When I run "tactus format" on the file
29
+ And I run "tactus format --check" on the file
30
+ Then the format command should succeed
31
+
32
+ Scenario: Formatting indents Specifications content
33
+ Given a formatting environment
34
+ And a Lua DSL file with Specifications content needing indentation
35
+ When I run "tactus format" on the file
36
+ Then the format command should succeed
37
+ And the Specifications content should be indented by 2 spaces
@@ -0,0 +1,153 @@
1
+ """
2
+ Step definitions for formatting feature.
3
+ """
4
+
5
+ import subprocess
6
+ import tempfile
7
+ from pathlib import Path
8
+
9
+ from behave import given, then, when
10
+
11
+
12
+ @given("a formatting environment")
13
+ def step_impl(context):
14
+ context.last_cli = None
15
+ context.last_formatted_content = None
16
+
17
+
18
+ @given("a Lua DSL file with formatting issues")
19
+ def step_impl(context):
20
+ # Intentionally inconsistent indentation (tabs + wrong nesting).
21
+ context.lua_content = """-- formatting test
22
+
23
+ Procedure {
24
+ \toutput = {
25
+ \tgreeting=field.string{required=true},
26
+ \tcompleted=field.boolean{required=true},
27
+ \t},
28
+ \tfunction(input)
29
+ \tif 1<2 and 3>4 then
30
+ \treturn {greeting="hi",completed=true}
31
+ \tend
32
+ \tend
33
+ }
34
+ """
35
+
36
+ context.temp_file = tempfile.NamedTemporaryFile(mode="w", suffix=".tac", delete=False)
37
+ context.temp_file.write(context.lua_content)
38
+ context.temp_file.close()
39
+ context.lua_file = Path(context.temp_file.name)
40
+ context.expected_formatted = """-- formatting test
41
+
42
+ Procedure {
43
+ output = {
44
+ greeting = field.string{required = true},
45
+ completed = field.boolean{required = true}
46
+ },
47
+ function(input)
48
+ if 1 < 2 and 3 > 4 then
49
+ return {greeting = "hi", completed = true}
50
+ end
51
+ end
52
+ }
53
+ """
54
+
55
+
56
+ @given("a Lua DSL file with Specifications content needing indentation")
57
+ def step_impl(context):
58
+ context.lua_content = """Specifications([[
59
+ Feature: Simple State Management
60
+ Test basic state and stage functionality without agents
61
+ ]])\n"""
62
+
63
+ context.temp_file = tempfile.NamedTemporaryFile(mode="w", suffix=".tac", delete=False)
64
+ context.temp_file.write(context.lua_content)
65
+ context.temp_file.close()
66
+ context.lua_file = Path(context.temp_file.name)
67
+
68
+ context.expected_specifications_formatted = """Specifications([[
69
+ Feature: Simple State Management
70
+ Test basic state and stage functionality without agents
71
+ ]])\n"""
72
+
73
+
74
+ @when('I run "tactus format" on the file')
75
+ def step_impl(context):
76
+ import sys
77
+
78
+ before = context.lua_file.read_text()
79
+ result = subprocess.run(
80
+ [sys.executable, "-m", "tactus.cli.app", "format", str(context.lua_file)],
81
+ capture_output=True,
82
+ text=True,
83
+ )
84
+ after = context.lua_file.read_text()
85
+
86
+ context.last_cli = result
87
+ context.last_formatted_content = after
88
+ context._before_after = (before, after)
89
+
90
+
91
+ @when('I run "tactus format --check" on the file')
92
+ def step_impl(context):
93
+ import sys
94
+
95
+ result = subprocess.run(
96
+ [
97
+ sys.executable,
98
+ "-m",
99
+ "tactus.cli.app",
100
+ "format",
101
+ "--check",
102
+ str(context.lua_file),
103
+ ],
104
+ capture_output=True,
105
+ text=True,
106
+ )
107
+ context.last_cli = result
108
+
109
+
110
+ @then("the format command should succeed")
111
+ def step_impl(context):
112
+ assert context.last_cli is not None, "No command was run"
113
+ assert (
114
+ context.last_cli.returncode == 0
115
+ ), f"Command failed: {context.last_cli.returncode}\nSTDOUT:\n{context.last_cli.stdout}\nSTDERR:\n{context.last_cli.stderr}"
116
+
117
+
118
+ @then("the format command should fail")
119
+ def step_impl(context):
120
+ assert context.last_cli is not None, "No command was run"
121
+ assert context.last_cli.returncode != 0, "Command unexpectedly succeeded"
122
+
123
+
124
+ @then("the file should be formatted with 2-space indentation")
125
+ def step_impl(context):
126
+ content = context.lua_file.read_text().splitlines()
127
+ # Ensure no tabs remain at line starts and indentation uses multiples of 2.
128
+ for line in content:
129
+ stripped = line.lstrip(" \t")
130
+ if stripped == "":
131
+ continue
132
+ leading = line[: len(line) - len(stripped)]
133
+ assert "\t" not in leading, f"Found tab indentation: {line!r}"
134
+ assert len(leading) % 2 == 0, f"Indentation is not a multiple of 2 spaces: {line!r}"
135
+
136
+ assert (
137
+ context.lua_file.read_text() == context.expected_formatted
138
+ ), "Formatted output did not match expected canonical indentation"
139
+
140
+
141
+ @then("the file should be unchanged by the second run")
142
+ def step_impl(context):
143
+ before, after = context._before_after
144
+ assert (
145
+ before == after
146
+ ), "Second formatting run changed file content (formatter is not idempotent)"
147
+
148
+
149
+ @then("the Specifications content should be indented by 2 spaces")
150
+ def step_impl(context):
151
+ assert (
152
+ context.lua_file.read_text() == context.expected_specifications_formatted
153
+ ), "Specifications content did not match expected indentation"
@@ -0,0 +1,48 @@
1
+ # Formatter Roadmap (Lua DSL)
2
+
3
+ ## Goal
4
+
5
+ Provide a stable formatter for `.tac` / `.lua` that preserves meaning, keeps comments, and converges to a single canonical style. This should be developed BDD-first with idempotence guarantees from the start.
6
+
7
+ ## Milestones
8
+
9
+ ### Milestone A: Semantic Indentation Formatter
10
+
11
+ Primary requirement:
12
+ - Enforce 2-space indentation based on syntactic structure (not lexical heuristics).
13
+
14
+ Scope:
15
+ - Reindent lines using the ANTLR token stream / parse result.
16
+ - Preserve existing line breaks and token spelling.
17
+ - Preserve comments and avoid rewriting inside multi-line comments/strings.
18
+ - Idempotent output (formatting twice yields the same file).
19
+
20
+ Non-goals:
21
+ - Line wrapping, alignment, or spacing normalization beyond indentation.
22
+
23
+ ### Milestone B: Canonical Pretty Printer
24
+
25
+ Primary requirement:
26
+ - Black-like canonical formatting beyond indentation.
27
+
28
+ Scope (incremental):
29
+ - Normalize spaces around operators, commas, braces/parens.
30
+ - Canonical table formatting (inline vs multiline decisions).
31
+ - Stable line breaking within a configured line length.
32
+ - Robust comment attachment and placement.
33
+ - Preserve (or consistently normalize) string literal forms where safe.
34
+
35
+ Non-goals:
36
+ - Formatting arbitrary Lua “perfectly” in the first iteration; prioritize the Tactus DSL subset and expand.
37
+
38
+ ## Test Strategy (BDD + Pytest)
39
+
40
+ - Behave scenarios:
41
+ - `tactus format` rewrites indentation to 2 spaces.
42
+ - `tactus format --check` fails when changes are needed.
43
+ - Idempotence: running `tactus format` twice does not change output.
44
+ - Pytest unit tests:
45
+ - Idempotence at the formatter API level.
46
+ - Representative fixtures for nested blocks and tables.
47
+ - Negative tests (invalid input should not be formatted).
48
+
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "tactus"
7
- version = "0.29.4"
7
+ version = "0.30.0"
8
8
  description = "Tactus: Lua-based DSL for agentic workflows"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -5,7 +5,7 @@ Tactus provides a declarative workflow engine for AI agents with pluggable
5
5
  backends for storage, HITL, and chat recording.
6
6
  """
7
7
 
8
- __version__ = "0.29.4"
8
+ __version__ = "0.30.0"
9
9
 
10
10
  # Core exports
11
11
  from tactus.core.runtime import TactusRuntime